Previous 199869 Revisions Next

r32836 Monday 20th October, 2014 at 18:24:17 UTC by Carl
upd7220: better output for the compis and dmv [Carl]
[src/emu/video]upd7220.c upd7220.h
[src/mess/drivers]compis.c
[src/mess/includes]compis.h

trunk/src/emu/video/upd7220.c
r241347r241348
3333    - honor visible area
3434    - wide mode (32-bit access)
3535    - light pen
36    - dad and mask are the same, in figd dad is shifted every step and when msb or lsb are 1 ead is advanced in x dir
3637
3738*/
3839
r241347r241348
120121#define UPD7220_SR_HBLANK_ACTIVE        0x40
121122#define UPD7220_SR_LIGHT_PEN_DETECT     0x80
122123
123#define UPD7220_MODE_S                  0x01
124124#define UPD7220_MODE_REFRESH_RAM        0x04
125#define UPD7220_MODE_I                  0x08
126125#define UPD7220_MODE_DRAW_ON_RETRACE    0x10
127126#define UPD7220_MODE_DISPLAY_MASK       0x22
128127#define UPD7220_MODE_DISPLAY_MIXED      0x00
129128#define UPD7220_MODE_DISPLAY_GRAPHICS   0x02
130129#define UPD7220_MODE_DISPLAY_CHARACTER  0x20
131130#define UPD7220_MODE_DISPLAY_INVALID    0x22
131#define UPD7220_MODE_INTERLACE_MASK     0x09
132#define UPD7220_MODE_INTERLACE_NONE     0x00
133#define UPD7220_MODE_INTERLACE_INVALID  0x01
134#define UPD7220_MODE_INTERLACE_REPEAT   0x08
135#define UPD7220_MODE_INTERLACE_ON       0x09
132136
137
133138static const int x_dir[8] = { 0, 1, 1, 1, 0,-1,-1,-1};
134139static const int y_dir[8] = { 1, 1, 0,-1,-1,-1, 0, 1};
135140
r241347r241348
366371
367372inline void upd7220_device::recompute_parameters()
368373{
374   int horiz_mult;
369375   /* TODO: assume that the pitch also controls number of horizontal pixels in a single cell */
370   int horiz_mult = ((m_pitch == 40) ? 16 : 8);
371   int horiz_pix_total = (m_hs + m_hbp + m_aw + m_hfp) * horiz_mult;
376   // horiz_mult = 4 if both mixed and interlace?
377   if(((m_mode & UPD7220_MODE_DISPLAY_MASK) == UPD7220_MODE_DISPLAY_MIXED) ||
378            ((m_mode & UPD7220_MODE_INTERLACE_MASK) == UPD7220_MODE_INTERLACE_ON))
379      horiz_mult = 8;
380   else
381      horiz_mult = 16;
382
383   int horiz_pix_total = (m_hs + m_hbp + m_hfp + m_aw) * horiz_mult;
372384   int vert_pix_total = m_vs + m_vbp + m_al + m_vfp;
373385
374386   //printf("%d %d %d %d\n",m_hs,m_hbp,m_aw,m_hfp);
r241347r241348
377389   if (horiz_pix_total == 0 || vert_pix_total == 0) //bail out if screen params aren't valid
378390      return;
379391
380   attoseconds_t refresh = HZ_TO_ATTOSECONDS(clock() * horiz_mult) * horiz_pix_total * vert_pix_total;
392   attoseconds_t refresh = HZ_TO_ATTOSECONDS(clock() * 8) * horiz_pix_total * vert_pix_total;
381393
382394   rectangle visarea;
383395
r241347r241348
419431   m_figs.m_d1 = 0x0008;
420432   m_figs.m_d2 = 0x0000;
421433   m_figs.m_dm = 0x0000;
434   m_figs.m_gd = 0;
422435}
423436
424437
r241347r241348
479492
480493   result = 0;
481494
495   if(((m_mode & UPD7220_MODE_DISPLAY_MASK) == UPD7220_MODE_DISPLAY_GRAPHICS) || m_figs.m_gd)
496      result = BITSWAP8(m_pr[1],0,1,2,3,4,5,6,7) | (BITSWAP8(m_pr[2],0,1,2,3,4,5,6,7) << 8);
497   else
498      result = m_pr[1] | (m_pr[2] << 8);
499
482500   switch(type)
483501   {
484502      case 0:
485         result = (m_pr[1] & 0xff);
486         result |= (m_pr[2] << 8);
487503         result &= m_mask;
488504         break;
489505      case 2:
490         result = (m_pr[1] & 0xff);
491506         result &= (m_mask & 0xff);
492507         break;
493508      case 3:
494         result = (m_pr[1] << 8);
509         result <<= 8;
495510         result &= (m_mask & 0xff00);
496511         break;
497512   }
r241347r241348
760775
761776void upd7220_device::draw_pixel(int x, int y, int xi, UINT16 tile_data)
762777{
763   UINT32 addr = (y * m_pitch * 2 + (x >> 3)) & 0x3ffff;
778   UINT32 addr = ((y * m_pitch * 2) + (x >> 3)) & 0x3ffff;
764779   UINT8 data = readbyte(addr);
765780   UINT8 new_pixel = (xi & 8 ? tile_data >> 8 : tile_data & 0xff) & (0x80 >> (xi & 7));
766781   new_pixel = new_pixel ? (0xff & (0x80 >> (x & 7))) : 0;
r241347r241348
797812   UINT16 pattern = (m_ra[8]) | (m_ra[9]<<8);
798813   int line_step = 0;
799814
800   LOG(("uPD7220 line check: %d %d %02x %08x %d %d\n",x,y,m_figs.m_dir,m_ead,m_figs.m_d1,m_figs.m_dc));
815   LOG(("uPD7220 line check: %d %d %02x %08x %d %d %d\n",x,y,m_figs.m_dir,m_ead,m_figs.m_d1,m_figs.m_dc,m_bitmap_mod));
801816
802817   line_size = m_figs.m_dc;
803818
r241347r241348
815830   x += (line_step*line_x_step[m_figs.m_dir]);
816831   y += (line_step*line_y_step[m_figs.m_dir]);
817832
818   m_ead = (x >> 4) + (y * m_pitch);
833   m_ead = (x >> 4) + (y * (m_pitch >> m_figs.m_gd));
819834   m_dad = x & 0x0f;
820835}
821836
r241347r241348
880895         break;
881896   }
882897
883   m_ead = (x >> 4) + (y * m_pitch);
898   m_ead = (x >> 4) + (y * (m_pitch >> m_figs.m_gd));
884899   m_dad = x & 0x0f;
885900}
886901
r241347r241348
935950      y+=rect_y_dir[rect_dir];
936951   }
937952
938   m_ead = (x >> 4) + (y * m_pitch);
953   m_ead = (x >> 4) + (y * (m_pitch >> m_figs.m_gd));
939954   m_dad = x & 0x0f;
940955
941956}
r241347r241348
975990      }
976991   }
977992
978   m_ead = (x >> 4) + (y * m_pitch);
993   m_ead = (x >> 4) + (y * (m_pitch >> m_figs.m_gd));
979994   m_dad = (x & 0xf);
980995}
981996
r241347r241348
10371052{
10381053   UINT8 data;
10391054   int flag;
1055   UINT16 eff_pitch = m_pitch >> m_figs.m_gd;
10401056
10411057   dequeue(&data, &flag);
10421058
r241347r241348
12031219
12041220         m_ead = (upper_addr << 16) | (m_pr[2] << 8) | m_pr[1];
12051221
1206         //LOG(("uPD7220 '%s' EAD: %06x\n", tag(), m_ead));
1222         LOG(("uPD7220 '%s' EAD: %06x\n", tag(), m_ead));
12071223
12081224         if(m_param_ptr == 4)
12091225         {
12101226            m_dad = m_pr[3] >> 4;
1211            //LOG(("uPD7220 '%s' DAD: %01x\n", tag(), m_dad));
1227            LOG(("uPD7220 '%s' DAD: %01x\n", tag(), m_dad));
12121228         }
12131229      }
12141230      break;
r241347r241348
12461262
12471263      if (m_param_ptr == 3 || (m_param_ptr == 2 && m_cr & 0x10))
12481264      {
1249         //printf("%02x = %02x %02x (%c) %04x\n",m_cr,m_pr[2],m_pr[1],m_pr[1],EAD);
1265         LOG(("%02x = %02x %02x (%c) %06x %04x\n",m_cr,m_pr[2],m_pr[1],m_pr[1]?m_pr[1]:' ',m_ead,m_figs.m_dc));
12501266         fifo_set_direction(FIFO_WRITE);
12511267
12521268         write_vram((m_cr & 0x18) >> 3,m_cr & 3);
r241347r241348
12801296         m_figs.m_dc = (m_pr[2]) | (m_figs.m_dc & 0x3f00);
12811297
12821298      if (m_param_ptr == 4)
1299      {
12831300         m_figs.m_dc = (m_pr[2]) | ((m_pr[3] & 0x3f) << 8);
1301         m_figs.m_gd = (m_pr[3] & 0x40) && ((m_mode & UPD7220_MODE_DISPLAY_MASK) == UPD7220_MODE_DISPLAY_MIXED);
1302      }
12841303
12851304      if (m_param_ptr == 6)
12861305         m_figs.m_d = (m_pr[4]) | ((m_pr[5] & 0x3f) << 8);
r241347r241348
12981317
12991318   case COMMAND_FIGD: /* figure draw start */
13001319      if(m_figs.m_figure_type == 0)
1301         draw_pixel(((m_ead % m_pitch) << 4) | (m_dad & 0xf),(m_ead / m_pitch),m_dad,(m_ra[8]) | (m_ra[9]<<8));
1320         draw_pixel(((m_ead % eff_pitch) << 4) | (m_dad & 0xf),(m_ead / eff_pitch),m_dad,(m_ra[8]) | (m_ra[9]<<8));
13021321      else if(m_figs.m_figure_type == 1)
1303         draw_line(((m_ead % m_pitch) << 4) | (m_dad & 0xf),(m_ead / m_pitch));
1322         draw_line(((m_ead % eff_pitch) << 4) | (m_dad & 0xf),(m_ead / eff_pitch));
13041323      else if(m_figs.m_figure_type == 4)
1305         draw_arc(((m_ead % m_pitch) << 4) | (m_dad & 0xf),(m_ead / m_pitch));
1324         draw_arc(((m_ead % eff_pitch) << 4) | (m_dad & 0xf),(m_ead / eff_pitch));
13061325      else if(m_figs.m_figure_type == 8)
1307         draw_rectangle(((m_ead % m_pitch) << 4) | (m_dad & 0xf),(m_ead / m_pitch));
1326         draw_rectangle(((m_ead % eff_pitch) << 4) | (m_dad & 0xf),(m_ead / eff_pitch));
13081327      else
13091328         logerror("uPD7220 '%s' Unimplemented command FIGD %02x\n", tag(),m_figs.m_figure_type);
13101329
r241347r241348
13141333
13151334   case COMMAND_GCHRD: /* graphics character draw and area filling start */
13161335      if(m_figs.m_figure_type == 2)
1317         draw_char(((m_ead % m_pitch) << 4) | (m_dad & 0xf),(m_ead / m_pitch));
1336         draw_char(((m_ead % eff_pitch) << 4) | (m_dad & 0xf),(m_ead / eff_pitch));
13181337      else
13191338         logerror("uPD7220 '%s' Unimplemented command GCHRD %02x\n", tag(),m_figs.m_figure_type);
13201339
r241347r241348
15681587            addr = ((sad << 1) & 0x3ffff) + (y * m_pitch * 2);
15691588
15701589            if (!m_display_cb.isnull())
1571               draw_graphics_line(bitmap, addr, y + bsy/((m_pitch == 40)+1), wd);
1590               draw_graphics_line(bitmap, addr, y + (bsy >> !im), wd);
15721591         }
15731592      }
15741593      else
trunk/src/emu/video/upd7220.h
r241347r241348
209209      UINT8 m_dir;                // figs param 0: drawing direction
210210      UINT8 m_figure_type;        // figs param 1: figure type
211211      UINT16 m_dc;                // figs param 2:
212      UINT8  m_gd;                // mixed mode only
212213      UINT16 m_d;                 // figs param 3:
213214      UINT16 m_d1;                // figs param 4:
214215      UINT16 m_d2;                // figs param 5:
trunk/src/mess/drivers/compis.c
r241347r241348
100100      if (offset < 2)
101101         return m_crtc->read(space, offset & 0x01);
102102      else
103         // monochrome only, hblank? vblank?
104         if(offset == 2)
105         {
106            switch(m_unk_video)
107            {
108               case 0x04:
109                  m_unk_video = 0x44;
110                  break;
111               case 0x44:
112                  m_unk_video = 0x64;
113                  break;
114               default:
115                  m_unk_video = 0x04;
116                  break;
117            }
118            return m_unk_video;
119         }
120      else
103121         return 0;
104122   }
105123   else
r241347r241348
115133{
116134   if (ACCESSING_BITS_0_7)
117135   {
136      // 0x336 is likely the color plane register
118137      if (offset < 2) m_crtc->write(space, offset & 0x01, data);
138
119139   }
120140   else
121141   {
r241347r241348
221241}
222242
223243
224//-------------------------------------------------
225//  vram_r -
226//-------------------------------------------------
227
228READ8_MEMBER( compis_state::vram_r )
229{
230   return m_video_ram[offset];
231}
232
233
234//-------------------------------------------------
235//  vram_w -
236//-------------------------------------------------
237
238WRITE8_MEMBER( compis_state::vram_w )
239{
240   m_video_ram[offset] = data;
241}
242
243
244
245244//**************************************************************************
246245//  ADDRESS MAPS
247246//**************************************************************************
r241347r241348
253252static ADDRESS_MAP_START( compis_mem, AS_PROGRAM, 16, compis_state )
254253   ADDRESS_MAP_UNMAP_HIGH
255254   AM_RANGE(0x00000, 0x1ffff) AM_RAM
256   AM_RANGE(0x40000, 0x5ffff) AM_READWRITE8(vram_r, vram_w, 0xffff)
257255   AM_RANGE(0x60000, 0x63fff) AM_MIRROR(0x1c000) AM_DEVICE(I80130_TAG, i80130_device, rom_map)
258256   AM_RANGE(0xe0000, 0xeffff) AM_MIRROR(0x10000) AM_ROM AM_REGION(I80186_TAG, 0)
259257ADDRESS_MAP_END
r241347r241348
265263
266264static ADDRESS_MAP_START( compis2_mem, AS_PROGRAM, 16, compis_state )
267265   ADDRESS_MAP_UNMAP_HIGH
268   AM_RANGE(0x00000, 0x3ffff) AM_RAM
269   AM_RANGE(0x40000, 0x5ffff) AM_READWRITE8(vram_r, vram_w, 0xffff)
270   AM_RANGE(0x60000, 0xbffff) AM_RAM
266   AM_RANGE(0x00000, 0xbffff) AM_RAM
271267   AM_RANGE(0xe0000, 0xeffff) AM_MIRROR(0x10000) AM_ROM AM_REGION(I80186_TAG, 0)
272268ADDRESS_MAP_END
273269
r241347r241348
317313//-------------------------------------------------
318314
319315static ADDRESS_MAP_START( upd7220_map, AS_0, 8, compis_state )
320   ADDRESS_MAP_GLOBAL_MASK(0x1ffff)
321   AM_RANGE(0x00000, 0x1ffff) AM_RAM AM_SHARE("video_ram")
316   ADDRESS_MAP_GLOBAL_MASK(0x7fff)
317   AM_RANGE(0x00000, 0x7fff) AM_RAM AM_SHARE("video_ram")
322318ADDRESS_MAP_END
323319
324320
r241347r241348
455451
456452UPD7220_DISPLAY_PIXELS_MEMBER( compis_state::hgdc_display_pixels )
457453{
458   UINT8 i,gfx = m_video_ram[address];
454   UINT8 i,gfx = m_video_ram[(address & 0x7fff)];
459455   const pen_t *pen = m_palette->pens();
460456
461457   for(i=0; i<8; i++)
462      bitmap.pix32(y, x + i) = pen[BIT(gfx, i)];
458      bitmap.pix32(y, x + i) = pen[BIT(gfx, 7 - i)];
463459}
464460
465461
trunk/src/mess/includes/compis.h
r241347r241348
103103   DECLARE_WRITE16_MEMBER( isbx1_cs_w );
104104   DECLARE_READ16_MEMBER( isbx1_dack_r );
105105   DECLARE_WRITE16_MEMBER( isbx1_dack_w );
106   DECLARE_READ8_MEMBER( vram_r );
107   DECLARE_WRITE8_MEMBER( vram_w );
108106
109107   DECLARE_READ8_MEMBER( compis_irq_callback );
110108
r241347r241348
125123   DECLARE_WRITE_LINE_MEMBER(write_centronics_select);
126124
127125   int m_tmr0;
126   int m_unk_video;
128127
129128   UPD7220_DISPLAY_PIXELS_MEMBER( hgdc_display_pixels );
130129};


Previous 199869 Revisions Next


© 1997-2024 The MAME Team