diff options
author | cracyc <cracyc@users.noreply.github.com> | 2016-12-22 22:46:44 -0600 |
---|---|---|
committer | cracyc <cracyc@users.noreply.github.com> | 2016-12-22 22:46:44 -0600 |
commit | 6a9fd31e34a0e2e299c569378026b901955d358b (patch) | |
tree | 7593d800b11980d326210393a52419456bb1960a | |
parent | 386eb6b7b83a956c05d91e8d0a8649aeb19a9019 (diff) |
genpc: fix keyboard and move laser to pc.c with other nongeneric clones (nw)
vis: video improvement (nw)
-rw-r--r-- | src/devices/machine/genpc.cpp | 4 | ||||
-rw-r--r-- | src/mame/drivers/genpc.cpp | 81 | ||||
-rw-r--r-- | src/mame/drivers/pc.cpp | 68 | ||||
-rw-r--r-- | src/mame/drivers/vis.cpp | 186 |
4 files changed, 235 insertions, 104 deletions
diff --git a/src/devices/machine/genpc.cpp b/src/devices/machine/genpc.cpp index 9a44c04e1d0..af575f674ab 100644 --- a/src/devices/machine/genpc.cpp +++ b/src/devices/machine/genpc.cpp @@ -281,7 +281,7 @@ WRITE_LINE_MEMBER( ibm5160_mb_device::keyboard_clock_w ) m_ppi_shift_register |= m_ppi_data_signal << 7; m_pic8259->ir1_w(m_ppi_shift_enable); - m_pc_kbdc->data_write_from_mb(!BIT(m_ppi_portb, 2) && !m_ppi_shift_enable); + m_pc_kbdc->data_write_from_mb(!m_ppi_shift_enable); } } @@ -365,7 +365,7 @@ WRITE8_MEMBER( ibm5160_mb_device::pc_ppi_portb_w ) m_pic8259->ir1_w(m_ppi_shift_enable); } - m_pc_kbdc->data_write_from_mb(!BIT(m_ppi_portb, 2) && !m_ppi_shift_enable); + m_pc_kbdc->data_write_from_mb(!m_ppi_shift_enable); m_ppi_clock_signal = ( m_ppi_keyb_clock ) ? 1 : 0; m_pc_kbdc->clock_write_from_mb(m_ppi_clock_signal); } diff --git a/src/mame/drivers/genpc.cpp b/src/mame/drivers/genpc.cpp index 5e1c7418b7b..af1adf7be39 100644 --- a/src/mame/drivers/genpc.cpp +++ b/src/mame/drivers/genpc.cpp @@ -60,7 +60,7 @@ static MACHINE_CONFIG_START( pcmda, genpc_state ) MCFG_ISA8_SLOT_ADD("mb:isa", "isa6", pc_isa8_cards, nullptr, false) /* keyboard */ - MCFG_PC_KBDC_SLOT_ADD("mb:pc_kbdc", "kbd", pc_xt_keyboards, STR_KBD_KEYTRONIC_PC3270) + MCFG_PC_KBDC_SLOT_ADD("mb:pc_kbdc", "kbd", pc_xt_keyboards, STR_KBD_IBM_PC_XT_83) /* internal ram */ MCFG_RAM_ADD(RAM_TAG) @@ -96,69 +96,7 @@ MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( pcvga, pcega ) MCFG_DEVICE_MODIFY("isa1") - MCFG_DEVICE_SLOT_INTERFACE(pc_isa8_cards, "svga_et4k", false) -MACHINE_CONFIG_END - -static MACHINE_CONFIG_START( laser_turbo_xt, genpc_state ) - /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", I8088, 4772720) - MCFG_CPU_PROGRAM_MAP(pc8_map) - MCFG_CPU_IO_MAP(pc8_io) - MCFG_CPU_IRQ_ACKNOWLEDGE_DEVICE("mb:pic8259", pic8259_device, inta_cb) - - MCFG_IBM5160_MOTHERBOARD_ADD("mb","maincpu") - MCFG_DEVICE_INPUT_DEFAULTS(cga) - - MCFG_ISA8_SLOT_ADD("mb:isa", "isa1", pc_isa8_cards, "cga", false) - MCFG_ISA8_SLOT_ADD("mb:isa", "isa2", pc_isa8_cards, "com", false) // Multi I/O card (includes FDC) - MCFG_ISA8_SLOT_ADD("mb:isa", "isa3", pc_isa8_cards, "fdc_xt", false) - MCFG_ISA8_SLOT_ADD("mb:isa", "isa4", pc_isa8_cards, nullptr, false) - MCFG_ISA8_SLOT_ADD("mb:isa", "isa5", pc_isa8_cards, nullptr, false) - MCFG_ISA8_SLOT_ADD("mb:isa", "isa6", pc_isa8_cards, nullptr, false) - MCFG_ISA8_SLOT_ADD("mb:isa", "isa7", pc_isa8_cards, nullptr, false) - MCFG_ISA8_SLOT_ADD("mb:isa", "isa8", pc_isa8_cards, nullptr, false) - - /* keyboard */ - MCFG_PC_KBDC_SLOT_ADD("mb:pc_kbdc", "kbd", pc_xt_keyboards, STR_KBD_IBM_PC_XT_83) - - /* internal ram */ - MCFG_RAM_ADD(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("640K") - MCFG_RAM_EXTRA_OPTIONS("512K,768K,896K,1024K,1408K,1536K,1664K") - - /* software lists */ - MCFG_SOFTWARE_LIST_ADD("disk_list","ibm5150") -MACHINE_CONFIG_END - -static MACHINE_CONFIG_START( laser_xt3, genpc_state ) - /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", I8088, 4772720) - MCFG_CPU_PROGRAM_MAP(pc8_map) - MCFG_CPU_IO_MAP(pc8_io) - MCFG_CPU_IRQ_ACKNOWLEDGE_DEVICE("mb:pic8259", pic8259_device, inta_cb) - - MCFG_IBM5160_MOTHERBOARD_ADD("mb","maincpu") - MCFG_DEVICE_INPUT_DEFAULTS(cga) - - MCFG_ISA8_SLOT_ADD("mb:isa", "isa1", pc_isa8_cards, "cga", false) - MCFG_ISA8_SLOT_ADD("mb:isa", "isa2", pc_isa8_cards, "com", false) // Multi I/O card (includes FDC) - MCFG_ISA8_SLOT_ADD("mb:isa", "isa3", pc_isa8_cards, "fdc_xt", false) // floppy drive A is 5.25" 360K and B is 3.5" 720K - MCFG_ISA8_SLOT_ADD("mb:isa", "isa4", pc_isa8_cards, nullptr, false) - MCFG_ISA8_SLOT_ADD("mb:isa", "isa5", pc_isa8_cards, nullptr, false) - MCFG_ISA8_SLOT_ADD("mb:isa", "isa6", pc_isa8_cards, nullptr, false) - MCFG_ISA8_SLOT_ADD("mb:isa", "isa7", pc_isa8_cards, nullptr, false) - MCFG_ISA8_SLOT_ADD("mb:isa", "isa8", pc_isa8_cards, nullptr, false) - - /* keyboard */ - MCFG_PC_KBDC_SLOT_ADD("mb:pc_kbdc", "kbd", pc_xt_keyboards, STR_KBD_IBM_PC_XT_83) - - /* internal ram */ - MCFG_RAM_ADD(RAM_TAG) - MCFG_RAM_DEFAULT_SIZE("640K") - MCFG_RAM_EXTRA_OPTIONS("512K,1024K,1536K,1664K") - - /* software lists */ - MCFG_SOFTWARE_LIST_ADD("disk_list","ibm5150") + MCFG_DEVICE_SLOT_INTERFACE(pc_isa8_cards, "vga", false) MACHINE_CONFIG_END ROM_START(pc) @@ -207,18 +145,6 @@ ROM_END #define rom_pcvga rom_pc -ROM_START(laser_turbo_xt) - ROM_REGION(0x02000, "bios", 0) - ROM_LOAD("laser_turbo_xt.bin", 0x00000, 0x02000, CRC(0a6121d3) SHA1(59b1f8dd6fe981ef9a7700adebf6e1adda7cee90)) // version 1.11 - 27c64d -ROM_END - -ROM_START(laser_xt3) - ROM_REGION(0x02000, "bios", 0) - ROM_LOAD("laser_xt3.bin", 0x00000, 0x02000, CRC(b45a7dd3) SHA1(62f17c408be0036d00a182e94c5c88b83d46b625)) // version 1.26 - 27c64 -ROM_END - - - /*************************************************************************** Game driver(s) @@ -231,6 +157,3 @@ COMP( 1987, pcega, ibm5150, 0, pcega, 0, driver_device COMP ( 1987, pcmda, ibm5150, 0, pcmda, 0, driver_device, 0, "<generic>", "PC (MDA)" , 0) COMP ( 1987, pcherc, ibm5150, 0, pcherc, 0, driver_device, 0, "<generic>", "PC (Hercules)" , 0) COMP ( 1987, pcvga, ibm5150, 0, pcvga, 0, driver_device, 0, "<generic>", "PC (VGA)" , 0) - -COMP ( 1988, laser_turbo_xt, ibm5150, 0, laser_turbo_xt, 0, driver_device, 0, "VTech", "Laser Turbo XT" , 0) -COMP ( 1989, laser_xt3, ibm5150, 0, laser_xt3, 0, driver_device, 0, "VTech", "Laser XT/3" , 0) diff --git a/src/mame/drivers/pc.cpp b/src/mame/drivers/pc.cpp index a6d5d3b29fe..b0e4fcfa2c9 100644 --- a/src/mame/drivers/pc.cpp +++ b/src/mame/drivers/pc.cpp @@ -330,6 +330,60 @@ static MACHINE_CONFIG_DERIVED(m15, pccga) MCFG_RAM_EXTRA_OPTIONS("16K, 160K, 304K") MACHINE_CONFIG_END +static MACHINE_CONFIG_START( laser_turbo_xt, pc_state ) + MCFG_CPU_PC(pc8, pc8, I8088, XTAL_14_31818MHz/3) /* 4,77 MHz */ + + MCFG_IBM5160_MOTHERBOARD_ADD("mb","maincpu") + MCFG_DEVICE_INPUT_DEFAULTS(pccga) + + MCFG_ISA8_SLOT_ADD("mb:isa", "isa1", pc_isa8_cards, "cga", false) + MCFG_ISA8_SLOT_ADD("mb:isa", "isa2", pc_isa8_cards, "com", false) // Multi I/O card (includes FDC) + MCFG_ISA8_SLOT_ADD("mb:isa", "isa3", pc_isa8_cards, "fdc_xt", false) + MCFG_ISA8_SLOT_ADD("mb:isa", "isa4", pc_isa8_cards, nullptr, false) + MCFG_ISA8_SLOT_ADD("mb:isa", "isa5", pc_isa8_cards, nullptr, false) + MCFG_ISA8_SLOT_ADD("mb:isa", "isa6", pc_isa8_cards, nullptr, false) + MCFG_ISA8_SLOT_ADD("mb:isa", "isa7", pc_isa8_cards, nullptr, false) + MCFG_ISA8_SLOT_ADD("mb:isa", "isa8", pc_isa8_cards, nullptr, false) + + /* keyboard */ + MCFG_PC_KBDC_SLOT_ADD("mb:pc_kbdc", "kbd", pc_xt_keyboards, STR_KBD_IBM_PC_XT_83) + + /* internal ram */ + MCFG_RAM_ADD(RAM_TAG) + MCFG_RAM_DEFAULT_SIZE("640K") + MCFG_RAM_EXTRA_OPTIONS("512K,768K,896K,1024K,1408K,1536K,1664K") + + /* software lists */ + MCFG_SOFTWARE_LIST_ADD("disk_list","ibm5150") +MACHINE_CONFIG_END + +static MACHINE_CONFIG_START( laser_xt3, pc_state ) + MCFG_CPU_PC(pc8, pc8, I8088, XTAL_14_31818MHz/3) /* 4,77 MHz */ + + MCFG_IBM5160_MOTHERBOARD_ADD("mb","maincpu") + MCFG_DEVICE_INPUT_DEFAULTS(pccga) + + MCFG_ISA8_SLOT_ADD("mb:isa", "isa1", pc_isa8_cards, "cga", false) + MCFG_ISA8_SLOT_ADD("mb:isa", "isa2", pc_isa8_cards, "com", false) // Multi I/O card (includes FDC) + MCFG_ISA8_SLOT_ADD("mb:isa", "isa3", pc_isa8_cards, "fdc_xt", false) // floppy drive A is 5.25" 360K and B is 3.5" 720K + MCFG_ISA8_SLOT_ADD("mb:isa", "isa4", pc_isa8_cards, nullptr, false) + MCFG_ISA8_SLOT_ADD("mb:isa", "isa5", pc_isa8_cards, nullptr, false) + MCFG_ISA8_SLOT_ADD("mb:isa", "isa6", pc_isa8_cards, nullptr, false) + MCFG_ISA8_SLOT_ADD("mb:isa", "isa7", pc_isa8_cards, nullptr, false) + MCFG_ISA8_SLOT_ADD("mb:isa", "isa8", pc_isa8_cards, nullptr, false) + + /* keyboard */ + MCFG_PC_KBDC_SLOT_ADD("mb:pc_kbdc", "kbd", pc_xt_keyboards, STR_KBD_IBM_PC_XT_83) + + /* internal ram */ + MCFG_RAM_ADD(RAM_TAG) + MCFG_RAM_DEFAULT_SIZE("640K") + MCFG_RAM_EXTRA_OPTIONS("512K,1024K,1536K,1664K") + + /* software lists */ + MCFG_SOFTWARE_LIST_ADD("disk_list","ibm5150") +MACHINE_CONFIG_END + ROM_START( bw230 ) ROM_REGION(0x10000,"bios", 0) ROM_LOAD("bondwell.bin", 0xe000, 0x2000, CRC(d435a405) SHA1(a57c705d1144c7b61940b6f5c05d785c272fc9bb)) @@ -496,6 +550,17 @@ ROM_START( eagle1600 ) ROM_LOAD("eagle 1600 video char gen u301.bin", 0x00000, 0x1000, CRC(1a7e552f) SHA1(749058783eec9d96a70dc5fdbfccb56196f889dc)) ROM_END +ROM_START(laser_turbo_xt) + ROM_REGION(0x10000, "bios", 0) + ROM_LOAD("laser_turbo_xt.bin", 0x0e000, 0x02000, CRC(0a6121d3) SHA1(59b1f8dd6fe981ef9a7700adebf6e1adda7cee90)) // version 1.11 - 27c64d +ROM_END + +ROM_START(laser_xt3) + ROM_REGION(0x10000, "bios", 0) + ROM_LOAD("laser_xt3.bin", 0x0e000, 0x02000, CRC(b45a7dd3) SHA1(62f17c408be0036d00a182e94c5c88b83d46b625)) // version 1.26 - 27c64 +ROM_END + + /*************************************************************************** Game driver(s) @@ -530,3 +595,6 @@ COMP( 198?, mbc16, ibm5150, 0, pccga, pccga, driver_device COMP( 198?, ataripc3, ibm5150, 0, pccga, pccga, driver_device, 0, "Atari", "PC-3" , 0) COMP( 1989, ssam88s, ibm5150, 0, pccga, pccga, driver_device, 0, "Samsung", "Samtron 88S" , MACHINE_NOT_WORKING) COMP( 1983, eagle1600, ibm5150, 0, eagle1600, pccga, driver_device, 0, "Eagle", "1600" , MACHINE_NOT_WORKING) + +COMP ( 1988, laser_turbo_xt, ibm5150, 0, laser_turbo_xt, 0, driver_device, 0, "VTech", "Laser Turbo XT" , 0) +COMP ( 1989, laser_xt3, ibm5150, 0, laser_xt3, 0, driver_device, 0, "VTech", "Laser XT/3" , 0) diff --git a/src/mame/drivers/vis.cpp b/src/mame/drivers/vis.cpp index 27c4f73d1be..23d9d2b3b70 100644 --- a/src/mame/drivers/vis.cpp +++ b/src/mame/drivers/vis.cpp @@ -246,7 +246,8 @@ private: uint8_t m_extreg; uint8_t m_interlace; uint16_t m_wina, m_winb; - uint8_t m_shift256, m_dw; + uint8_t m_shift256, m_dw, m_8bit_640; + uint8_t m_crtc_regs[0x31]; }; const device_type VIS_VGA = &device_creator<vis_vga_device>; @@ -277,16 +278,15 @@ void vis_vga_device::recompute_params() int pixel_clock; int xtal = (vga.miscellaneous_output & 0xc) ? XTAL_28_63636MHz : XTAL_25_1748MHz; int divisor = 1; // divisor is 2 for 15/16 bit rgb/yuv modes and 3 for 24bit - int interlace = m_interlace ? 2 : 1; /* safety check */ if(!vga.crtc.horz_disp_end || !vga.crtc.vert_disp_end || !vga.crtc.horz_total || !vga.crtc.vert_total) return; - rectangle visarea(0, ((vga.crtc.horz_disp_end + 1) / interlace * ((float)(hclock_m)/divisor))-1, 0, vga.crtc.vert_disp_end * interlace); + rectangle visarea(0, ((vga.crtc.horz_disp_end + 1) * ((float)(hclock_m)/divisor))-1, 0, vga.crtc.vert_disp_end); - vblank_period = (vga.crtc.vert_total * interlace + 2); - hblank_period = ((vga.crtc.horz_total + 5) / interlace * ((float)(hclock_m)/divisor)); + vblank_period = (vga.crtc.vert_total + 2); + hblank_period = ((vga.crtc.horz_total + 5) * ((float)(hclock_m)/divisor)); /* TODO: 10b and 11b settings aren't known */ pixel_clock = xtal / (((vga.sequencer.data[1]&8) >> 3) + 1); @@ -294,7 +294,7 @@ void vis_vga_device::recompute_params() refresh = HZ_TO_ATTOSECONDS(pixel_clock) * (hblank_period) * vblank_period; machine().first_screen()->configure((hblank_period), (vblank_period), visarea, refresh ); //popmessage("%d %d\n",vga.crtc.horz_total * 8,vga.crtc.vert_total); - m_vblank_timer->adjust( machine().first_screen()->time_until_pos((vga.crtc.vert_blank_start + vga.crtc.vert_blank_end) * interlace) ); + m_vblank_timer->adjust( machine().first_screen()->time_until_pos((vga.crtc.vert_blank_start + vga.crtc.vert_blank_end)) ); } rgb_t vis_vga_device::yuv_to_rgb(int y, int u, int v) const @@ -315,9 +315,8 @@ void vis_vga_device::vga_vh_yuv8(bitmap_rgb32 &bitmap, const rectangle &cliprect int pos, line, column, col, addr, curr_addr = 0; const uint8_t decode_tbl[] = {0, 1, 2, 3, 4, 5, 6, 9, 12, 17, 22, 29, 38, 50, 66, 91, 128, 165, 190, 206, 218, 227, 234, 239, 244, 247, 250, 251, 252, 253, 254, 255}; - int interlace = m_interlace ? 2 : 1; - for (addr = vga.crtc.start_addr, line=0; line<(vga.crtc.vert_disp_end+1) * interlace; line+=height, addr+=offset(), curr_addr+=offset()) + for (addr = vga.crtc.start_addr, line=0; line<(vga.crtc.vert_disp_end+1); line+=height, addr+=offset(), curr_addr+=offset()) { for(int yi = 0;yi < height; yi++) { @@ -326,7 +325,7 @@ void vis_vga_device::vga_vh_yuv8(bitmap_rgb32 &bitmap, const rectangle &cliprect curr_addr = addr; if((line + yi) == (vga.crtc.line_compare & 0x3ff)) curr_addr = 0; - for (pos=curr_addr, col=0, column=0; column<(vga.crtc.horz_disp_end+1) / interlace; column++, col+=8, pos+=8) + for (pos=curr_addr, col=0, column=0; column<(vga.crtc.horz_disp_end+1); column++, col+=8, pos+=8) { if(pos + 0x08 > 0x80000) return; @@ -388,6 +387,7 @@ void vis_vga_device::device_start() m_isa->install_device(0x03b0, 0x03df, read8_delegate(FUNC(vis_vga_device::vga_r), this), write8_delegate(FUNC(vis_vga_device::vga_w), this)); m_isa->install_memory(0x0a0000, 0x0bffff, read8_delegate(FUNC(vis_vga_device::visvgamem_r), this), write8_delegate(FUNC(vis_vga_device::visvgamem_w), this)); svga_device::device_start(); + vga.svga_intf.seq_regcount = 0x2d; } void vis_vga_device::device_reset() @@ -399,6 +399,7 @@ void vis_vga_device::device_reset() m_interlace = 0; m_shift256 = 0; m_dw = 0; + m_8bit_640 = 0; } uint32_t vis_vga_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) @@ -439,9 +440,9 @@ uint32_t vis_vga_device::screen_update(screen_device &screen, bitmap_rgb32 &bitm READ8_MEMBER(vis_vga_device::visvgamem_r) { - if(!m_winb) + if(!m_wina) return mem_r(space, offset, mem_mask); - return mem_linear_r(space, (offset + (m_winb * 64)) & 0x3ffff, mem_mask); + return mem_linear_r(space, (offset + (m_wina * 64)) & 0x3ffff, mem_mask); } WRITE8_MEMBER(vis_vga_device::visvgamem_w) @@ -453,14 +454,19 @@ WRITE8_MEMBER(vis_vga_device::visvgamem_w) READ8_MEMBER(vis_vga_device::vga_r) { - if(offset == 0x16) + switch(offset) { - if(m_extcnt == 4) - { - m_extcnt = 0; - return m_extreg; - } - m_extcnt++; + case 0x16: + if(m_extcnt == 4) + { + m_extcnt = 0; + return m_extreg; + } + m_extcnt++; + break; + case 0x05: + case 0x25: + return m_crtc_regs[vga.crtc.index]; } if(offset < 0x10) return port_03b0_r(space, offset, mem_mask); @@ -477,6 +483,13 @@ WRITE8_MEMBER(vis_vga_device::vga_w) case 0x15: switch(vga.sequencer.index) { + case 0x01: + m_8bit_640 = (data & 8) ? 0 : 1; + if(m_8bit_640 && (vga.sequencer.data[0x1f] & 0x10)) + svga.rgb8_en = 1; + else + svga.rgb8_en = 0; + break; case 0x19: m_wina = (m_wina & 0xff00) | data; break; @@ -494,11 +507,16 @@ WRITE8_MEMBER(vis_vga_device::vga_w) { vga.gc.shift256 = 1; vga.crtc.dw = 1; + if(m_8bit_640) + svga.rgb8_en = 1; + else + svga.rgb8_en = 0; } else { vga.gc.shift256 = m_shift256; vga.crtc.dw = m_dw; + svga.rgb8_en = 0; } break; } @@ -516,22 +534,144 @@ WRITE8_MEMBER(vis_vga_device::vga_w) if(vga.gc.index == 0x05) { m_shift256 = data & 0x40 ? 1 : 0; - // remove this if it is shown to be unneeded - //if(vga.sequencer.data[0x1f] | 0x10) - //data |= 0x40; + if(vga.sequencer.data[0x1f] & 0x10) + data |= 0x40; } break; case 0x05: case 0x25: + m_crtc_regs[vga.crtc.index] = data; switch(vga.crtc.index) { + case 0x00: + if(vga.crtc.protect_enable) + return; + vga.crtc.horz_total = data / (m_interlace ? 2 : 1); + recompute_params(); + return; + case 0x01: + if(vga.crtc.protect_enable) + return; + vga.crtc.horz_disp_end = data / (m_interlace ? 2 : 1); + recompute_params(); + return; + case 0x02: + if(vga.crtc.protect_enable) + return; + vga.crtc.horz_blank_start = data / (m_interlace ? 2 : 1); + return; + case 0x03: + if(vga.crtc.protect_enable) + return; + vga.crtc.horz_blank_end = (m_crtc_regs[0x05] & 0x80) >> 2; + vga.crtc.horz_blank_end |= data & 0x1f; + vga.crtc.horz_blank_end /= (m_interlace ? 2 : 1); + vga.crtc.disp_enable_skew = (data & 0x60) >> 5; + vga.crtc.evra = (data & 0x80) >> 7; + return; + case 0x04: + if(vga.crtc.protect_enable) + return; + vga.crtc.horz_retrace_start = data / (m_interlace ? 2 : 1); + return; + case 0x05: + if(vga.crtc.protect_enable) + return; + vga.crtc.horz_blank_end = m_crtc_regs[0x05] & 0x1f; + vga.crtc.horz_blank_end |= ((data & 0x80) >> 2); + vga.crtc.horz_blank_end /= (m_interlace ? 2 : 1); + vga.crtc.horz_retrace_skew = ((data & 0x60) >> 5); + vga.crtc.horz_retrace_end = data & 0x1f; + return; + case 0x06: + if(vga.crtc.protect_enable) + return; + vga.crtc.vert_total = ((m_crtc_regs[0x07] & 0x20) << (9-6)) | ((m_crtc_regs[0x07] & 0x01) << (8-0)); + vga.crtc.vert_total |= data; + vga.crtc.vert_total *= (m_interlace ? 2 : 1); + recompute_params(); + return; + case 0x07: // Overflow Register + vga.crtc.line_compare &= ~0x100; + vga.crtc.line_compare |= ((data & 0x10) << (8-4)); + if(vga.crtc.protect_enable) + return; + vga.crtc.vert_total = m_crtc_regs[0x05]; + vga.crtc.vert_retrace_start = m_crtc_regs[0x10]; + vga.crtc.vert_disp_end = m_crtc_regs[0x12]; + vga.crtc.vert_blank_start = m_crtc_regs[0x15] | ((m_crtc_regs[0x09] & 0x20) << (9-5)); + vga.crtc.vert_retrace_start |= ((data & 0x80) << (9-7)); + vga.crtc.vert_disp_end |= ((data & 0x40) << (9-6)); + vga.crtc.vert_total |= ((data & 0x20) << (9-5)); + vga.crtc.vert_blank_start |= ((data & 0x08) << (8-3)); + vga.crtc.vert_retrace_start |= ((data & 0x04) << (8-2)); + vga.crtc.vert_disp_end |= ((data & 0x02) << (8-1)); + vga.crtc.vert_total |= ((data & 0x01) << (8-0)); + vga.crtc.vert_total *= (m_interlace ? 2 : 1); + vga.crtc.vert_blank_start *= (m_interlace ? 2 : 1); + vga.crtc.vert_retrace_start *= (m_interlace ? 2 : 1); + vga.crtc.vert_disp_end *= (m_interlace ? 2 : 1); + recompute_params(); + return; + case 0x09: // Maximum Scan Line Register + vga.crtc.line_compare &= ~0x200; + vga.crtc.vert_blank_start = m_crtc_regs[0x15] | ((m_crtc_regs[0x07] & 0x02) << (8-3)); + vga.crtc.scan_doubling = ((data & 0x80) >> 7); + vga.crtc.line_compare |= ((data & 0x40) << (9-6)); + vga.crtc.vert_blank_start |= ((data & 0x20) << (9-5)); + vga.crtc.maximum_scan_line = (data & 0x1f) + 1; + vga.crtc.vert_blank_start *= (m_interlace ? 2 : 1); + return; + case 0x10: + vga.crtc.vert_retrace_start = ((m_crtc_regs[0x07] & 0x80) << (9-7)) | ((m_crtc_regs[0x07] & 0x40) << (8-2)); + vga.crtc.vert_retrace_start |= data; + vga.crtc.vert_retrace_start *= (m_interlace ? 2 : 1); + return; + case 0x12: + vga.crtc.vert_disp_end = ((m_crtc_regs[0x07] & 0x40) << (9-6)) | ((m_crtc_regs[0x07] & 0x02) << (8-1)); + vga.crtc.vert_disp_end |= data; + vga.crtc.vert_disp_end *= (m_interlace ? 2 : 1); + recompute_params(); + return; + case 0x15: + vga.crtc.vert_blank_start = ((m_crtc_regs[0x09] & 0x20) << (9-5)) | ((m_crtc_regs[0x07] & 0x02) << (8-3)); + vga.crtc.vert_blank_start |= data; + vga.crtc.vert_blank_start *= (m_interlace ? 2 : 1); + return; + case 0x16: + vga.crtc.vert_blank_end = (data & 0x7f) * (m_interlace ? 2 : 1); + return; case 0x14: m_dw = data & 0x40 ? 1 : 0; - if(vga.sequencer.data[0x1f] | 0x10) + if(vga.sequencer.data[0x1f] & 0x10) data |= 0x40; break; case 0x30: - m_interlace = data; // XXX: verify? + if(data && !m_interlace) + { + vga.crtc.horz_total /= 2; + vga.crtc.horz_disp_end /= 2; + vga.crtc.horz_blank_end /= 2; + vga.crtc.horz_retrace_start /= 2; + vga.crtc.horz_retrace_end /= 2; + vga.crtc.vert_total *= 2; + vga.crtc.vert_retrace_start *= 2; + vga.crtc.vert_disp_end *= 2; + vga.crtc.vert_blank_start *= 2; + } + else if(!data && m_interlace) + { + vga.crtc.horz_total *= 2; + vga.crtc.horz_disp_end *= 2; + vga.crtc.horz_blank_end *= 2; + vga.crtc.horz_retrace_start *= 2; + vga.crtc.horz_retrace_end *= 2; + vga.crtc.vert_total /= 2; + vga.crtc.vert_retrace_start /= 2; + vga.crtc.vert_disp_end /= 2; + vga.crtc.vert_blank_start /= 2; + } + m_interlace = data; return; } break; |