src/emu/video/pc_vga.c
| r14084 | r14085 | |
| 64 | 64 | |
| 65 | 65 | UINT8 miscellaneous_output; |
| 66 | 66 | UINT8 feature_control; |
| 67 | | UINT16 line_compare; // for split-screen use. |
| 68 | 67 | |
| 69 | 68 | struct |
| 70 | 69 | { |
| r14084 | r14085 | |
| 81 | 80 | /**/ UINT16 horz_disp_end; |
| 82 | 81 | /**/ UINT8 horz_blank_start; |
| 83 | 82 | /**/ UINT8 horz_blank_end; |
| 83 | /**/ UINT8 horz_retrace_start; |
| 84 | /**/ UINT8 horz_retrace_skew; |
| 85 | /**/ UINT8 horz_retrace_end; |
| 84 | 86 | /**/ UINT8 disp_enable_skew; |
| 85 | 87 | /**/ UINT8 evra; |
| 86 | 88 | /**/ UINT16 vert_total; |
| 87 | 89 | /**/ UINT16 vert_retrace_start; |
| 88 | 90 | /**/ UINT8 vert_retrace_end; |
| 89 | 91 | /**/ UINT16 vert_disp_end; |
| 90 | | /**/ UINT16 line_compare; |
| 91 | 92 | /**/ UINT16 vert_blank_start; |
| 92 | | /**/ UINT8 horz_retrace_start; |
| 93 | | /**/ UINT8 horz_retrace_skew; |
| 94 | | /**/ UINT8 horz_retrace_end; |
| 93 | UINT16 line_compare; |
| 95 | 94 | /**/ UINT16 cursor_addr; |
| 96 | 95 | /**/ UINT8 byte_panning; |
| 97 | 96 | /**/ UINT8 preset_row_scan; |
| 98 | | /**/ UINT8 scan_doubling; |
| 97 | UINT8 scan_doubling; |
| 99 | 98 | /**/ UINT8 maximum_scan_line; |
| 100 | 99 | /**/ UINT8 cursor_enable; |
| 101 | 100 | /**/ UINT8 cursor_scan_start; |
| r14084 | r14085 | |
| 170 | 169 | #define CRTC_CURSOR_TOP (REG(0xa)&0x1f) |
| 171 | 170 | #define CRTC_CURSOR_BOTTOM REG(0xb) |
| 172 | 171 | |
| 173 | | #define DOUBLESCAN ((vga.crtc.data[9]&0x80)>>7) |
| 174 | | #define MAX_SCAN_LINES ((vga.crtc.data[9]&0x1f)+1) |
| 175 | 172 | #define CRTC_PORT_ADDR ((vga.miscellaneous_output&1)?0x3d0:0x3b0) |
| 176 | 173 | |
| 177 | 174 | #define LINES_HELPER ( (vga.crtc.data[0x12] \ |
| r14084 | r14085 | |
| 301 | 298 | static void vga_vh_ega(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect) |
| 302 | 299 | { |
| 303 | 300 | 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); |
| 305 | 302 | UINT32 *bitmapline; |
| 306 | 303 | pen_t pen; |
| 307 | 304 | |
| r14084 | r14085 | |
| 344 | 341 | int pos, line, column, c, addr, curr_addr; |
| 345 | 342 | UINT32 *bitmapline; |
| 346 | 343 | UINT16 mask_comp; |
| 347 | | int height = MAX_SCAN_LINES * (DOUBLESCAN + 1); |
| 344 | int height = vga.crtc.maximum_scan_line * (vga.crtc.scan_doubling + 1); |
| 348 | 345 | int yi; |
| 349 | 346 | |
| 350 | 347 | /* line compare is screen sensitive */ |
| r14084 | r14085 | |
| 357 | 354 | { |
| 358 | 355 | for(yi = 0;yi < height; yi++) |
| 359 | 356 | { |
| 360 | | if((line + yi) < (vga.line_compare & mask_comp)) |
| 357 | if((line + yi) < (vga.crtc.line_compare & mask_comp)) |
| 361 | 358 | curr_addr = addr; |
| 362 | | if((line + yi) == (vga.line_compare & mask_comp)) |
| 359 | if((line + yi) == (vga.crtc.line_compare & mask_comp)) |
| 363 | 360 | curr_addr = 0; |
| 364 | 361 | bitmapline = &bitmap.pix32(line + yi); |
| 365 | 362 | addr %= vga.svga_intf.vram_size; |
| r14084 | r14085 | |
| 385 | 382 | { |
| 386 | 383 | for(yi = 0;yi < height; yi++) |
| 387 | 384 | { |
| 388 | | if((line + yi) < (vga.line_compare & mask_comp)) |
| 385 | if((line + yi) < (vga.crtc.line_compare & mask_comp)) |
| 389 | 386 | curr_addr = addr; |
| 390 | | if((line + yi) == (vga.line_compare & mask_comp)) |
| 387 | if((line + yi) == (vga.crtc.line_compare & mask_comp)) |
| 391 | 388 | curr_addr = 0; |
| 392 | 389 | bitmapline = &bitmap.pix32(line + yi); |
| 393 | 390 | addr %= vga.svga_intf.vram_size; |
| r14084 | r14085 | |
| 847 | 844 | case 0x09: // Maximum Scan Line Register |
| 848 | 845 | vga.crtc.line_compare &= ~0x200; |
| 849 | 846 | vga.crtc.vert_blank_start &= ~0x200; |
| 850 | | vga.crtc.scan_doubling = ((data & 0x80) >> 7) + 1; |
| 847 | vga.crtc.scan_doubling = ((data & 0x80) >> 7); |
| 851 | 848 | vga.crtc.line_compare |= ((data & 0x40) << (9-6)); |
| 852 | 849 | vga.crtc.vert_blank_start |= ((data & 0x20) << (9-5)); |
| 853 | 850 | vga.crtc.maximum_scan_line = (data & 0x1f) + 1; |
| r14084 | r14085 | |
| 912 | 909 | vga.crtc.line_compare |= data & 0xff; |
| 913 | 910 | break; |
| 914 | 911 | 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; |
| 916 | 914 | } |
| 917 | 915 | } |
| 918 | 916 | |
| r14084 | r14085 | |
| 931 | 929 | case 0xa: |
| 932 | 930 | UINT8 hsync,vsync; |
| 933 | 931 | vga.attribute.state = 0; |
| 934 | | data = 0;/*4; */ |
| 932 | data = 0; |
| 935 | 933 | |
| 936 | 934 | hsync = space->machine().primary_screen->hblank() & 1; |
| 937 | 935 | vsync = space->machine().primary_screen->vblank() & 1; |
| r14084 | r14085 | |
| 987 | 985 | (vga.crtc.index < vga.svga_intf.crtc_regcount) ? "" : "?", |
| 988 | 986 | data); |
| 989 | 987 | } |
| 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 | |
| 992 | 989 | if (vga.crtc.index < vga.svga_intf.crtc_regcount) |
| 993 | 990 | vga.crtc.data[vga.crtc.index] = data; |
| 994 | 991 | |
| r14084 | r14085 | |
| 1291 | 1288 | vga.sequencer.data[4] = 0; |
| 1292 | 1289 | vga_cpu_interface(machine); |
| 1293 | 1290 | |
| 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; |
| 1301 | 1292 | } |
| 1302 | 1293 | |
| 1303 | 1294 | void pc_vga_init(running_machine &machine, const struct pc_vga_interface *vga_intf, const struct pc_svga_interface *svga_intf) |