Previous 15994 Revisions Next

r14085 Wednesday 18th January, 2012 at 22:10:11 UTC by Angelo Salese
Fixed a possible bug with line compare
[src/emu/video]pc_vga.c

src/emu/video/pc_vga.c
r14084r14085
6464
6565   UINT8 miscellaneous_output;
6666   UINT8 feature_control;
67   UINT16 line_compare;  // for split-screen use.
6867
6968   struct
7069   {
r14084r14085
8180/**/   UINT16 horz_disp_end;
8281/**/   UINT8 horz_blank_start;
8382/**/   UINT8 horz_blank_end;
83/**/   UINT8 horz_retrace_start;
84/**/   UINT8 horz_retrace_skew;
85/**/   UINT8 horz_retrace_end;
8486/**/   UINT8 disp_enable_skew;
8587/**/   UINT8 evra;
8688/**/   UINT16 vert_total;
8789/**/   UINT16 vert_retrace_start;
8890/**/   UINT8 vert_retrace_end;
8991/**/   UINT16 vert_disp_end;
90/**/   UINT16 line_compare;
9192/**/   UINT16 vert_blank_start;
92/**/   UINT8 horz_retrace_start;
93/**/   UINT8 horz_retrace_skew;
94/**/   UINT8 horz_retrace_end;
93      UINT16 line_compare;
9594/**/   UINT16 cursor_addr;
9695/**/   UINT8 byte_panning;
9796/**/   UINT8 preset_row_scan;
98/**/   UINT8 scan_doubling;
97      UINT8 scan_doubling;
9998/**/   UINT8 maximum_scan_line;
10099/**/   UINT8 cursor_enable;
101100/**/   UINT8 cursor_scan_start;
r14084r14085
170169#define CRTC_CURSOR_TOP   (REG(0xa)&0x1f)
171170#define CRTC_CURSOR_BOTTOM REG(0xb)
172171
173#define DOUBLESCAN ((vga.crtc.data[9]&0x80)>>7)
174#define MAX_SCAN_LINES ((vga.crtc.data[9]&0x1f)+1)
175172#define CRTC_PORT_ADDR ((vga.miscellaneous_output&1)?0x3d0:0x3b0)
176173
177174#define LINES_HELPER ( (vga.crtc.data[0x12] \
r14084r14085
301298static void vga_vh_ega(running_machine &machine, bitmap_rgb32 &bitmap,  const rectangle &cliprect)
302299{
303300   int pos, line, column, c, addr, i, yi;
304   int height = MAX_SCAN_LINES * (DOUBLESCAN + 1);
301   int height = vga.crtc.maximum_scan_line * (vga.crtc.scan_doubling + 1);
305302   UINT32 *bitmapline;
306303   pen_t pen;
307304
r14084r14085
344341   int pos, line, column, c, addr, curr_addr;
345342   UINT32 *bitmapline;
346343   UINT16 mask_comp;
347   int height = MAX_SCAN_LINES * (DOUBLESCAN + 1);
344   int height = vga.crtc.maximum_scan_line * (vga.crtc.scan_doubling + 1);
348345   int yi;
349346
350347   /* line compare is screen sensitive */
r14084r14085
357354      {
358355         for(yi = 0;yi < height; yi++)
359356         {
360            if((line + yi) < (vga.line_compare & mask_comp))
357            if((line + yi) < (vga.crtc.line_compare & mask_comp))
361358               curr_addr = addr;
362            if((line + yi) == (vga.line_compare & mask_comp))
359            if((line + yi) == (vga.crtc.line_compare & mask_comp))
363360               curr_addr = 0;
364361            bitmapline = &bitmap.pix32(line + yi);
365362            addr %= vga.svga_intf.vram_size;
r14084r14085
385382      {
386383         for(yi = 0;yi < height; yi++)
387384         {
388            if((line + yi) < (vga.line_compare & mask_comp))
385            if((line + yi) < (vga.crtc.line_compare & mask_comp))
389386               curr_addr = addr;
390            if((line + yi) == (vga.line_compare & mask_comp))
387            if((line + yi) == (vga.crtc.line_compare & mask_comp))
391388               curr_addr = 0;
392389            bitmapline = &bitmap.pix32(line + yi);
393390            addr %= vga.svga_intf.vram_size;
r14084r14085
847844      case 0x09: // Maximum Scan Line Register
848845         vga.crtc.line_compare      &= ~0x200;
849846         vga.crtc.vert_blank_start  &= ~0x200;
850         vga.crtc.scan_doubling      = ((data & 0x80) >> 7) + 1;
847         vga.crtc.scan_doubling      = ((data & 0x80) >> 7);
851848         vga.crtc.line_compare      |= ((data & 0x40) << (9-6));
852849         vga.crtc.vert_blank_start  |= ((data & 0x20) << (9-5));
853850         vga.crtc.maximum_scan_line  = (data & 0x1f) + 1;
r14084r14085
912909         vga.crtc.line_compare |= data & 0xff;
913910         break;
914911      default:
915         printf("Unhandled CRTC reg w %02x %02x\n",index,data);
912         //printf("Unhandled CRTC reg w %02x %02x\n",index,data);
913         break;
916914   }
917915}
918916
r14084r14085
931929   case 0xa:
932930      UINT8 hsync,vsync;
933931      vga.attribute.state = 0;
934      data = 0;/*4; */
932      data = 0;
935933
936934      hsync = space->machine().primary_screen->hblank() & 1;
937935      vsync = space->machine().primary_screen->vblank() & 1;
r14084r14085
987985               (vga.crtc.index < vga.svga_intf.crtc_regcount) ? "" : "?",
988986               data);
989987         }
990         if(vga.crtc.index == 0x18 || vga.crtc.index == 0x07 || vga.crtc.index == 0x19 ) // Line compare
991            vga.line_compare = (((vga.crtc.data[0x09] & 0x40) << 3) | ((vga.crtc.data[0x07] & 0x10) << 4) | vga.crtc.data[0x18]);
988
992989         if (vga.crtc.index < vga.svga_intf.crtc_regcount)
993990            vga.crtc.data[vga.crtc.index] = data;
994991
r14084r14085
12911288   vga.sequencer.data[4] = 0;
12921289   vga_cpu_interface(machine);
12931290
1294   vga.line_compare = 0x3ff;
1295   // set CRTC register to match the line compare value
1296   vga.crtc.data[0x18] = vga.line_compare & 0xff;
1297   if(vga.line_compare & 0x100)
1298      vga.crtc.data[0x07] |= 0x10;
1299   if(vga.line_compare & 0x200)
1300      vga.crtc.data[0x09] |= 0x40;
1291   vga.crtc.line_compare = 0x3ff;
13011292}
13021293
13031294void pc_vga_init(running_machine &machine, const struct pc_vga_interface *vga_intf, const struct pc_svga_interface *svga_intf)

Previous 15994 Revisions Next


© 1998-2018 The MESS Team