diff options
-rw-r--r-- | src/emu/cpu/i86/i86.c | 2 | ||||
-rw-r--r-- | src/mame/drivers/chihiro.c | 16 | ||||
-rw-r--r-- | src/mess/drivers/atari400.c | 4 | ||||
-rw-r--r-- | src/mess/drivers/rainbow.c | 43 | ||||
-rw-r--r-- | src/mess/video/vtvideo.c | 127 | ||||
-rw-r--r-- | src/mess/video/vtvideo.h | 6 |
6 files changed, 98 insertions, 100 deletions
diff --git a/src/emu/cpu/i86/i86.c b/src/emu/cpu/i86/i86.c index cb7b412d62e..05413a61b70 100644 --- a/src/emu/cpu/i86/i86.c +++ b/src/emu/cpu/i86/i86.c @@ -1143,7 +1143,7 @@ bool i8086_common_cpu_device::common_op(UINT8 op) // // Instructions are used in the boot sector for some versions of // MS-DOS (e.g. the DEC Rainbow-100 version of DOS 2.x) -// case 0x60: + case 0x60: case 0x70: // i_jo JMP( OF); break; diff --git a/src/mame/drivers/chihiro.c b/src/mame/drivers/chihiro.c index 593746deddf..ca677f0a357 100644 --- a/src/mame/drivers/chihiro.c +++ b/src/mame/drivers/chihiro.c @@ -27,9 +27,9 @@ Games on this system include.... | | 2004 | Wangan Midnight Maximum Tune (Japan) | Namco | GDROM | GDX-0008 | 317-5101-JPN | | | 2004 | Wangan Midnight Maximum Tune (Japan) (Rev A) | Namco | GDROM | GDX-0008A | 317-5101-JPN | |*| 2004 | Wangan Midnight Maximum Tune (Japan) (Rev B) | Namco | GDROM | GDX-0008B | 317-5101-JPN | -| | 2004 | Wangan Midnight Maximum Tune (export) | Namco | GDROM | GDX-0009 | 317-5101-COM | -| | 2004 | Wangan Midnight Maximum Tune (export) (Rev A) | Namco | GDROM | GDX-0009A | 317-5101-COM | -|*| 2004 | Wangan Midnight Maximum Tune (export) (Rev B) | Namco | GDROM | GDX-0009B | 317-5101-COM | +| | 2004 | Wangan Midnight Maximum Tune (Export) | Namco | GDROM | GDX-0009 | 317-5101-COM | +| | 2004 | Wangan Midnight Maximum Tune (Export) (Rev A) | Namco | GDROM | GDX-0009A | 317-5101-COM | +|*| 2004 | Wangan Midnight Maximum Tune (Export) (Rev B) | Namco | GDROM | GDX-0009B | 317-5101-COM | | | 2004 | Outrun 2 SP (Japan) | Sega | GDROM | GDX-0011 | | | | 2004 | Ghost Squad | Sega | GDROM | GDX-0012 | 317-0398-COM | |*| 2004 | Ghost Squad (Rev A) | Sega | GDROM | GDX-0012A | 317-0398-COM | @@ -38,7 +38,7 @@ Games on this system include.... |*| 2004 | Outrun 2 Special Tours (Rev A) | Sega | GDROM | GDX-0014A | 317-0xxx-COM | |*| 2005 | Wangan Midnight Maximum Tune 2 (Japan) | Namco | GDROM | GDX-0015 | 317-5106-JPN | |*| 2005 | Wangan Midnight Maximum Tune 2 (Japan) (Rev A) | Namco | GDROM | GDX-0015A | 317-5106-JPN | -|*| 2005 | Wangan Midnight Maximum Tune 2 (export) | Namco | GDROM | GDX-0016 | 317-5106-COM | +|*| 2005 | Wangan Midnight Maximum Tune 2 (Export) | Namco | GDROM | GDX-0016 | 317-5106-COM | | | 2005 | Sega Network Taisen Mahjong MJ 3 | Sega | GDROM | GDX-0017 | 317-0414-JPN | | | 2005 | Sega Network Taisen Mahjong MJ 3 (Rev A) | Sega | GDROM | GDX-0017A | 317-0414-JPN | | | 2005 | Sega Network Taisen Mahjong MJ 3 (Rev B) | Sega | GDROM | GDX-0017B | 317-0414-JPN | @@ -4883,9 +4883,9 @@ ROM_END // 0008 GAME( 2004, wangmdjo, wangmidj, chihirogd, chihiro, driver_device, 0, ROT0, "Namco", "Wangan Midnight Maximum Tune (Japan) (GDX-0008)", GAME_NO_SOUND|GAME_NOT_WORKING ) // 0008A GAME( 2004, wangmdja, wangmidj, chihirogd, chihiro, driver_device, 0, ROT0, "Namco", "Wangan Midnight Maximum Tune (Japan) (Rev A) (GDX-0008A)", GAME_NO_SOUND|GAME_NOT_WORKING ) // 0008B GAME( 2004, wangmidj, wangmidj, chihirogd, chihiro, driver_device, 0, ROT0, "Namco", "Wangan Midnight Maximum Tune (Japan) (Rev B) (GDX-0008B)", GAME_NO_SOUND|GAME_NOT_WORKING ) -// 0009 GAME( 2004, wangmido, wangmid, chihirogd, chihiro, driver_device, 0, ROT0, "Namco", "Wangan Midnight Maximum Tune (export) (GDX-0009)", GAME_NO_SOUND|GAME_NOT_WORKING ) -// 0009A GAME( 2004, wangmida, wangmid, chihirogd, chihiro, driver_device, 0, ROT0, "Namco", "Wangan Midnight Maximum Tune (export) (Rev A) (GDX-0009A)", GAME_NO_SOUND|GAME_NOT_WORKING ) -/* 0009B */ GAME( 2004, wangmid, chihiro, chihirogd, chihiro, driver_device, 0, ROT0, "Namco", "Wangan Midnight Maximum Tune (export) (Rev B) (GDX-0009B)", GAME_NO_SOUND|GAME_NOT_WORKING ) +// 0009 GAME( 2004, wangmido, wangmid, chihirogd, chihiro, driver_device, 0, ROT0, "Namco", "Wangan Midnight Maximum Tune (Export) (GDX-0009)", GAME_NO_SOUND|GAME_NOT_WORKING ) +// 0009A GAME( 2004, wangmida, wangmid, chihirogd, chihiro, driver_device, 0, ROT0, "Namco", "Wangan Midnight Maximum Tune (Export) (Rev A) (GDX-0009A)", GAME_NO_SOUND|GAME_NOT_WORKING ) +/* 0009B */ GAME( 2004, wangmid, chihiro, chihirogd, chihiro, driver_device, 0, ROT0, "Namco", "Wangan Midnight Maximum Tune (Export) (Rev B) (GDX-0009B)", GAME_NO_SOUND|GAME_NOT_WORKING ) // 0011 GAME( 2004, outr2sp, chihiro, chihirogd, chihiro, driver_device, 0, ROT0, "Sega", "Out Run 2 SP (Japan) (GDX-0011)", GAME_NO_SOUND|GAME_NOT_WORKING|GAME_SUPPORTS_SAVE ) // 0012 GAME( 2004, ghostsqo, ghostsqu, chihirogd, chihiro, driver_device, 0, ROT0, "Sega", "Ghost Squad (GDX-0012)", GAME_NO_SOUND|GAME_NOT_WORKING ) /* 0012A */ GAME( 2004, ghostsqu, chihiro, chihirogd, chihiro, driver_device, 0, ROT0, "Sega", "Ghost Squad (Rev A) (GDX-0012A)", GAME_NO_SOUND|GAME_NOT_WORKING ) @@ -4894,7 +4894,7 @@ ROM_END /* 0014A */ GAME( 2004, outr2st, chihiro, chihirogd, chihiro, driver_device, 0, ROT0, "Sega", "Out Run 2 Special Tours (Rev A) (GDX-0014A)", GAME_NO_SOUND|GAME_NOT_WORKING ) // 0015 GAME( 2005, wanmd2bo, wangmd2b, chihirogd, chihiro, driver_device, 0, ROT0, "Namco", "Wangan Midnight Maximum Tune 2 (Japan) (GDX-0015)", GAME_NO_SOUND|GAME_NOT_WORKING ) /* 0015A */ GAME( 2005, wangmd2b, chihiro, chihirogd, chihiro, driver_device, 0, ROT0, "Namco", "Wangan Midnight Maximum Tune 2 (Japan) (Rev A) (GDX-0015A)", GAME_NO_SOUND|GAME_NOT_WORKING ) -/* 0016 */ GAME( 2005, wangmid2, chihiro, chihirogd, chihiro, driver_device, 0, ROT0, "Namco", "Wangan Midnight Maximum Tune 2 (export) (GDX-0016)", GAME_NO_SOUND|GAME_NOT_WORKING ) +/* 0016 */ GAME( 2005, wangmid2, chihiro, chihirogd, chihiro, driver_device, 0, ROT0, "Namco", "Wangan Midnight Maximum Tune 2 (Export) (GDX-0016)", GAME_NO_SOUND|GAME_NOT_WORKING ) // 0017 GAME( 2005, mj3o, mj3, chihirogd, chihiro, driver_device, 0, ROT0, "Sega", "Sega Network Taisen Mahjong MJ 3 (GDX-0017)", GAME_NO_SOUND|GAME_NOT_WORKING ) // 0017A GAME( 2005, mj3a, mj3, chihirogd, chihiro, driver_device, 0, ROT0, "Sega", "Sega Network Taisen Mahjong MJ 3 (Rev A) (GDX-0017A)", GAME_NO_SOUND|GAME_NOT_WORKING ) // 0017B GAME( 2005, mj3b, mj3, chihirogd, chihiro, driver_device, 0, ROT0, "Sega", "Sega Network Taisen Mahjong MJ 3 (Rev B) (GDX-0017B)", GAME_NO_SOUND|GAME_NOT_WORKING ) diff --git a/src/mess/drivers/atari400.c b/src/mess/drivers/atari400.c index 18ed201129a..ad602ba2a84 100644 --- a/src/mess/drivers/atari400.c +++ b/src/mess/drivers/atari400.c @@ -1745,10 +1745,10 @@ void a400_state::a800_setbank(int cart_mounted) m_8000->set_base(m_region_lslot->base()); m_maincpu->space(AS_PROGRAM).unmap_write(0x8000, 0x9fff); - memcpy(m_region_maincpu->base() + 0x10000, m_region_lslot->base() + 0x2000, 0x2000); + memcpy(m_region_maincpu->base() + 0xa000, m_region_lslot->base() + 0x2000, 0x2000); } else if (m_a800_cart_type == A800_8K) - memcpy(m_region_maincpu->base() + 0x10000, m_region_lslot->base(), 0x2000); + memcpy(m_region_maincpu->base() + 0xa000, m_region_lslot->base(), 0x2000); else fatalerror("This type of cart is not supported yet in this driver. Please use a400 or a800.\n"); } diff --git a/src/mess/drivers/rainbow.c b/src/mess/drivers/rainbow.c index adb013f2d04..4b0df8f2498 100644 --- a/src/mess/drivers/rainbow.c +++ b/src/mess/drivers/rainbow.c @@ -8,13 +8,17 @@ --------------------- Driver is based entirely on the DEC-100 'B' variant (DEC-190 and DEC-100 A models are treated as clones). While this is OK for the compatible -190, it doesn't do justice to ancient '100 A' hardware. +RBCONVERT.ZIP has details on how model 'A' differs from version B. - Currently, there are several issues here: +Issues with this driver: (1) Keyboard emulation incomplete (inhibits the system from booting with ERROR 50). - (2) after fixing (1), IRQ logic for 100-B should be verified (text in RBCONVERT.ZIP has details concerning -A versus -B. + +(2) IRQ / DMA / arbitration logic should be verified DMA (needed for 'Extended communication option') or Z80-8088 arbitration is non-existent (E11/E13 dumps anyone?). - (3) Read errors when booting CP/M 2.x or DOS 2.x (secondary boot; read errors beyond T >= 2). - Seek (+ verify) and a number of signals (TRACK > 43 TG43, INDEX etc.) do not work (diag.disk aborts drive test). + +(3) Read errors when booting CPM 2 / DOS 2.x / DOS 3 (secondary boot loader finds errors on tracks >= 2). +Seek (+ verify) and a number of signals (TRACK > 43 TG43, INDEX etc.) appear to be incorrect (-> diag.disk aborts drive test). +UCSD systems (fort_sys, pas_sys) and diag disks boot! - NOT WORKING: serial (ERROR 60). - NOT WORKING: printer interface (ERROR 40). Like error 60 not mission-critical. @@ -378,7 +382,7 @@ FLOPPY_FORMATS_MEMBER( rainbow_state::floppy_formats ) FLOPPY_FORMATS_END static SLOT_INTERFACE_START( rainbow_floppies ) - SLOT_INTERFACE( "525qd", FLOPPY_525_SSQD ) // "525ssdd" + SLOT_INTERFACE("525qd", FLOPPY_525_SSQD) SLOT_INTERFACE_END @@ -414,7 +418,8 @@ void rainbow_state::machine_start() rom[0xf4000 + 0x363b]= 0xeb; // COND => JMPS if (rom[0xf4174] == 0x75) - { rom[0xf4174] = 0xeb; // jmps RAINBOW100_LOGO__loc_33D + { + rom[0xf4174] = 0xeb; // jmps RAINBOW100_LOGO__loc_33D rom[0xf4175] = 0x08; } @@ -559,7 +564,7 @@ static INPUT_PORTS_START( rainbow100b_in ) #endif PORT_START("MONITOR TYPE") PORT_DIPNAME( 0x03, 0x03, "MONOCHROME MONITOR") - PORT_DIPSETTING( 0x01, "PAPER WHITE" ) +PORT_DIPSETTING(0x01, "WHITE") PORT_DIPSETTING( 0x02, "GREEN" ) PORT_DIPSETTING( 0x03, "AMBER" ) @@ -640,7 +645,8 @@ void rainbow_state::machine_reset() /* configure RAM */ address_space &program = m_maincpu->space(AS_PROGRAM); if (m_inp8->read() < END_OF_RAM) - { program.unmap_readwrite(m_inp8->read(), END_OF_RAM); + { + program.unmap_readwrite(m_inp8->read(), END_OF_RAM); } // BIOS can't handle soft resets (=> triggers ERROR 16). @@ -695,9 +701,6 @@ void rainbow_state::machine_reset() UINT32 rainbow_state::screen_update_rainbow(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - if (MOTOR_DISABLE_counter) - return 0; - m_crtc->palette_select( m_inp9->read() ); if ( m_SCREEN_BLANK ) @@ -1046,7 +1049,8 @@ WRITE8_MEMBER(rainbow_state::z80_diskcontrol_w) floppy_connector *con = machine().device<floppy_connector>(names[drive]); if (con) - { m_floppy = con->get_device(); + { + m_floppy = con->get_device(); if (m_floppy) { selected_drive = drive; @@ -1073,7 +1077,8 @@ WRITE8_MEMBER(rainbow_state::z80_diskcontrol_w) MOTOR_DISABLE_counter = 4800; // 2400 = 500 ms // m_fdc->set_force_ready(force_ready); - } else + } + else { // m_fdc->set_force_ready(false); } @@ -1090,8 +1095,10 @@ WRITE8_MEMBER(rainbow_state::z80_diskcontrol_w) data = data & (255 -3); data = data | 8; // MOTOR 0 OFF data = data | 16; // MOTOR 1 OFF - }else - { data = ( data & (255 -3) ) | m_unit; + } + else + { + data = (data & (255 - 3)) | m_unit; if(m_unit < 2) data = data & (255 - 8); // MOTOR 0 (for A or B) @@ -1110,15 +1117,15 @@ READ8_MEMBER( rainbow_state::read_video_ram_r ) INTERRUPT_GEN_MEMBER(rainbow_state::vblank_irq) { raise_8088_irq(IRQ_8088_VBL); + m_crtc->notify_vblank(true); } WRITE_LINE_MEMBER( rainbow_state::clear_video_interrupt ) { lower_8088_irq(IRQ_8088_VBL); + m_crtc->notify_vblank(false); } - - READ8_MEMBER( rainbow_state::diagnostic_r ) // 8088 (port 0A READ). Fig.4-29 + table 4-15 { // printf("%02x DIP value ORed to diagnostic\n", ( m_inp1->read() | m_inp2->read() | m_inp3->read() ) ); @@ -1346,7 +1353,7 @@ ROM_START( rainbow100a ) ROM_LOAD( "chargen.bin", 0x0000, 0x1000, CRC(1685e452) SHA1(bc299ff1cb74afcededf1a7beb9001188fdcf02f)) ROM_END -// ROM definition for 100-B (system module 70-1994-02, PSU H7842-D) +// ROM definition for 100-B (system module 70-19974-02, PSU H7842-D) // Built until ~ May 1986 (see MP-01491-00) // - 32 K ROM (version 5.03) // - 128 K base and 896 K max. mem. diff --git a/src/mess/video/vtvideo.c b/src/mess/video/vtvideo.c index fcd11257b85..3b1cba9aa98 100644 --- a/src/mess/video/vtvideo.c +++ b/src/mess/video/vtvideo.c @@ -10,18 +10,20 @@ ---------------------------------- - TESTS REQUIRED : do line and character attributes (plus combinations) match real hardware? - - JUMPY SOFT SCROLL : Soft scroll *should* be synced with beam or DMA (line linking/unlinking is done during VBI, in less than 550ms). - See 4.7.4 and up in VT manual. +- SCROLLING REGIONS / SPLIT SCREEN SCROLLING UNTESTED (if you open > 1 file with the VAX editor EDT) + See VT100 Technical Manual: 4.7.4 Address Shuffling to 4.7.9 Split Screen Smooth Scrolling. + More on scrolling regions: Rainbow 100 B technical documentation (QV069-GZ) April 1985 page 22 - - UNDOCUMENTED FEATURES of DC011 / DC012 (CLUES WANTED) - A. (VT 100): DEC VT terminals are said to have a feature that doubles the number of lines - (50 real lines or just interlaced mode with 500 instead of 250 scanlines?) +- INTERLACED MODE UNEMULATED: + There is no RAM (on a Rainbow-100) to hold twice as many vertical lines, so the video chip + doubles existing ones. Flickers on CRTs and is of dubious value on modern hosts. - B. (DEC-100-B) fun PD program SQUEEZE.COM _compresses_ display to X/2 and Y/2 - - so picture takes a quarter of the original screen. How does it accomplish this? +- FUN WITH DC011 / DC012 REGISTERS (clues wanted): + Public domain program SQUEEZE.COM (for DEC-100-B) _compresses_ display to X/2 and Y/2 + so picture takes a quarter of the original screen. How does it accomplish this? - IMPROVEMENTS: - - exact colors for different VR201 monitors ('paper white', green and amber) + exact colors for different VR201 monitors ('paper white', green and amber) Copyright MESS Team. Visit http://mamedev.org for licensing and usage restrictions. @@ -116,7 +118,8 @@ void vt100_video_device::device_reset() m_lba7 = 0; m_scroll_latch = 0; - m_scroll_latch_valid = 0; + m_scroll_latch_valid = false; + m_last_scroll = 0; m_blink_flip_flop = 0; m_reverse_field = 0; @@ -144,7 +147,8 @@ void rainbow_video_device::device_reset() m_lba7 = 0; m_scroll_latch = 0; - m_scroll_latch_valid = 0; + m_scroll_latch_valid = false; + m_last_scroll = 0; m_blink_flip_flop = 0; m_reverse_field = 0; @@ -171,7 +175,8 @@ void vt100_video_device::recompute_parameters() if (m_columns == 132) { horiz_pix_total = m_columns * 9; // display 1 less filler pixel in 132 char. mode (DEC-100) - } else { + } + else { horiz_pix_total = m_columns * 10; // normal 80 character mode. } @@ -210,24 +215,9 @@ WRITE8_MEMBER( vt100_video_device::dc012_w ) if (!(data & 0x08)) { - // The scroll offset put in 'm_scroll_latch' is a decimal offset controlling 10 scan lines. - // The BIOS first writes the least significant bits, then the 2 most significant bits. - - // If scrolling up (incrementing the scroll latch), the additional line is linked in at the bottom. - // When the scroll latch is incremented back to 0, the top line of the scrolling region must be unlinked. - - // When scrolling down (decrementing the scroll latch), new lines must be linked in at the top of the scroll region - // and unlinked down at the bottom. - - // Note that the scroll latch value will be used during the next frame rather than the current frame. - // All line linking/unlinking is done during the vertical blanking interval (< 550ms). - - // More on scrolling regions: Rainbow 100 B technical documentation (QV069-GZ) April 1985 page 22 - // Also see VT100 Technical Manual: 4.7.4 Address Shuffling to 4.7.9 Split Screen Smooth Scrolling. if (!(data & 0x04)) { - m_scroll_latch_valid = 0; // LSB is written first. - + m_scroll_latch_valid = false; // LSB is written first. // set lower part scroll m_scroll_latch = data & 0x03; } @@ -235,8 +225,7 @@ WRITE8_MEMBER( vt100_video_device::dc012_w ) { // set higher part scroll m_scroll_latch = (m_scroll_latch & 0x03) | ((data & 0x03) << 2); - - m_scroll_latch_valid = 1; // MSB is written last. + m_scroll_latch_valid = true; } } else @@ -492,9 +481,11 @@ void rainbow_video_device::display_char(bitmap_ind16 &bitmap, UINT8 code, int x, UINT16 y_preset; UINT16 x_preset, d_x_preset; if (m_columns == 132) - { x_preset = x * 9; + { + x_preset = x * 9; d_x_preset = x * 18; - } else + } + else { x_preset = x * 10; d_x_preset = x * 20; @@ -513,8 +504,6 @@ void rainbow_video_device::display_char(bitmap_ind16 &bitmap, UINT8 code, int x, display_type = display_type & 3; - static int old_scroll_region; - // * SCREEN ATTRIBUTES (see VT-180 manual 6-30) * // 'reverse field' = reverse video over entire screen @@ -546,42 +535,25 @@ void rainbow_video_device::display_char(bitmap_ind16 &bitmap, UINT8 code, int x, bool double_width = (display_type != 3) ? true : false; // all except normal: double width bool double_height = (display_type & 1) ? false : true; // 0,2 = double height + int smooth_offset = 0; + if (scroll_region != 0) + smooth_offset = m_last_scroll; // valid after VBI + + int extra_scan_line = 0; for (int scan_line = 0; scan_line < 10; scan_line++) { y_preset = y * 10 + scan_line; - // Offset to bitmap in char-rom (used later below) - int i = scan_line; - - // Affects 'i' / 'y_preset' / 'scan_line' (= LOOP VARIABLE) - if ( m_scroll_latch_valid == 1) + int i = scan_line + smooth_offset; // offset to bitmap in char-rom (+ scroll) + if (i > 9) // SMOOTH SCROLL - fill previous scan line: { - // **** START IF SCROLL REGION: - if ( (old_scroll_region == 0) && (scroll_region == 1) ) - { - if (scan_line == 0) // * EXECUTED ONCE * - { - scan_line = m_scroll_latch; // write less lines ! SIDE EFFECT ON LOOP ! - i = m_scroll_latch; // set hard offset to char-rom - } - } + extra_scan_line += 1; + i = smooth_offset - extra_scan_line; // correct bitmap - // **** MIDDLE OF REGION: - if ( (old_scroll_region == 1) && (scroll_region == 1) ) - { - if ( ( y * 10 + scan_line - m_scroll_latch ) >= 0 ) - y_preset = y * 10 + scan_line - m_scroll_latch; - } - - // **** END OF SCROLL REGION: - if ( (old_scroll_region == 1) && (scroll_region == 0) ) - { - if (i > (9 - m_scroll_latch) ) - { old_scroll_region = m_scroll_latch_valid; // keep track - return; // WHAT HAPPENS WITH THE REST OF THE LINE (BLANK ?) + y_preset -= scan_line; + if (y > 0) + y_preset -= extra_scan_line; // Y * 10 - extra_scan_line } - } - } // (IF) scroll latch valid switch (display_type) { @@ -613,7 +585,8 @@ void rainbow_video_device::display_char(bitmap_ind16 &bitmap, UINT8 code, int x, if (invert == 0) line = 0xff; // CASE 5 A) else - { line = 0x00; // CASE 5 B) + { + line = 0x00; // CASE 5 B) back_intensity = 0; // OVERRIDE: BLACK BACKGROUND } } @@ -622,7 +595,8 @@ void rainbow_video_device::display_char(bitmap_ind16 &bitmap, UINT8 code, int x, for (int b = 0; b < 8; b++) // 0..7 { if (blank) - { bit = m_reverse_field ^ m_basic_attribute; + { + bit = m_reverse_field ^ m_basic_attribute; } else { @@ -652,7 +626,6 @@ void rainbow_video_device::display_char(bitmap_ind16 &bitmap, UINT8 code, int x, } } // for (8 bit) - // char interleave (X) is filled with last bit if (double_width) { @@ -661,7 +634,8 @@ void rainbow_video_device::display_char(bitmap_ind16 &bitmap, UINT8 code, int x, bitmap.pix16(y_preset, d_x_preset + 17) = bit; if (m_columns == 80) - { bitmap.pix16(y_preset, d_x_preset + 18) = bit; + { + bitmap.pix16(y_preset, d_x_preset + 18) = bit; bitmap.pix16(y_preset, d_x_preset + 19) = bit; } } @@ -672,7 +646,6 @@ void rainbow_video_device::display_char(bitmap_ind16 &bitmap, UINT8 code, int x, if (m_columns == 80) bitmap.pix16(y_preset, x_preset + 9) = bit; } - } // for (scan_line) } @@ -765,6 +738,20 @@ void rainbow_video_device::video_update(bitmap_ind16 &bitmap, const rectangle &c } +void rainbow_video_device::notify_vblank(bool v) +{ + static bool v_last; + m_notify_vblank = v; + + if (m_scroll_latch_valid) + { + // Line linking / unlinking is done during VBI (see 4.7.4 and up in VT manual). + if ((v == false) && (v_last == true)) + m_last_scroll = m_scroll_latch; + } + + v_last = v; +} void rainbow_video_device::palette_select ( int choice ) { @@ -778,9 +765,9 @@ void rainbow_video_device::palette_select ( int choice ) break; case 0x02: - m_palette->set_pen_color(1, 0 , 205 -50, 70 - 50); // GREEN (dim) - m_palette->set_pen_color(2, 0 , 205, 70 ); // GREEN (NORMAL) - m_palette->set_pen_color(3, 0, 205 +50, 70 + 50); // GREEN (brighter) + m_palette->set_pen_color(1, 35, 200 - 55, 75); // GREEN (dim) + m_palette->set_pen_color(2, 35 + 55, 200, 75 + 55); // GREEN (NORMAL) + m_palette->set_pen_color(3, 35 + 110, 200 + 55, 75 + 110); // GREEN (brighter) break; case 0x03: diff --git a/src/mess/video/vtvideo.h b/src/mess/video/vtvideo.h index 99e10f39d56..d1ea787b113 100644 --- a/src/mess/video/vtvideo.h +++ b/src/mess/video/vtvideo.h @@ -57,7 +57,7 @@ protected: // dc012 attributes UINT8 m_scroll_latch; - UINT8 m_scroll_latch_valid; + bool m_scroll_latch_valid; UINT8 m_blink_flip_flop; UINT8 m_reverse_field; UINT8 m_basic_attribute; @@ -71,6 +71,9 @@ protected: const char *m_char_rom_tag; /* character rom region */ required_device<palette_device> m_palette; + + bool m_notify_vblank; + int m_last_scroll; }; @@ -84,6 +87,7 @@ public: int MHFU(int); void palette_select(int choice); + void notify_vblank(bool choice); protected: virtual void display_char(bitmap_ind16 &bitmap, UINT8 code, int x, int y, UINT8 scroll_region, UINT8 display_type); virtual void device_reset(); |