i86.c: 0x60 shadow omitted in previous patch. Needed for DOS 2. [Bavarese]

[MESS] vtvideo.c): finally fix smooth scrolling (ED084 = 1). See DIAG DISK -> VIDEO TEST -> screen 3 (Rainbow driver - SKIP 0).  [Bavarese]

[MESS] atari400.c - Slightly revised Atari XL cartridge loading so that it doesn't crash when loading 8K carts. Confirmed to fix MT#05108.  [alegend45]

Description fix from MASH for chihiro.c.  (nw)
This commit is contained in:
Scott Stone 2014-07-01 17:33:25 +00:00
parent afa1206349
commit 020a35290e
6 changed files with 98 additions and 100 deletions

View File

@ -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;

View File

@ -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 )

View File

@ -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");
}

View File

@ -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.

View File

@ -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,43 +535,26 @@ 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;
y_preset -= scan_line;
if (y > 0)
y_preset -= extra_scan_line; // Y * 10 - extra_scan_line
}
// **** 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 ?)
}
}
} // (IF) scroll latch valid
switch (display_type)
{
case 0 : // bottom half of 'double height, double width' char.
@ -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:

View File

@ -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();