summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--src/emu/cpu/i86/i86.c2
-rw-r--r--src/mame/drivers/chihiro.c16
-rw-r--r--src/mess/drivers/atari400.c4
-rw-r--r--src/mess/drivers/rainbow.c43
-rw-r--r--src/mess/video/vtvideo.c127
-rw-r--r--src/mess/video/vtvideo.h6
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();