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 // Instructions are used in the boot sector for some versions of
// MS-DOS (e.g. the DEC Rainbow-100 version of DOS 2.x) // MS-DOS (e.g. the DEC Rainbow-100 version of DOS 2.x)
// case 0x60: case 0x60:
case 0x70: // i_jo case 0x70: // i_jo
JMP( OF); JMP( OF);
break; 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) | 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 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 (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) | 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 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) (Rev B) | Namco | GDROM | GDX-0009B | 317-5101-COM |
| | 2004 | Outrun 2 SP (Japan) | Sega | GDROM | GDX-0011 | | | | 2004 | Outrun 2 SP (Japan) | Sega | GDROM | GDX-0011 | |
| | 2004 | Ghost Squad | Sega | GDROM | GDX-0012 | 317-0398-COM | | | 2004 | Ghost Squad | Sega | GDROM | GDX-0012 | 317-0398-COM |
|*| 2004 | Ghost Squad (Rev A) | Sega | GDROM | GDX-0012A | 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 | |*| 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) | 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 (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 | 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 A) | Sega | GDROM | GDX-0017A | 317-0414-JPN |
| | 2005 | Sega Network Taisen Mahjong MJ 3 (Rev B) | Sega | GDROM | GDX-0017B | 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 ) // 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 ) // 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 ) // 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 ) // 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 ) // 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 ) /* 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 ) // 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 ) // 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 ) /* 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 ) /* 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 ) // 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 ) /* 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 ) // 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 ) // 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 ) // 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_8000->set_base(m_region_lslot->base());
m_maincpu->space(AS_PROGRAM).unmap_write(0x8000, 0x9fff); 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) 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 else
fatalerror("This type of cart is not supported yet in this driver. Please use a400 or a800.\n"); 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). 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. 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). (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?). 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: serial (ERROR 60).
- NOT WORKING: printer interface (ERROR 40). Like error 60 not mission-critical. - 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 FLOPPY_FORMATS_END
static SLOT_INTERFACE_START( rainbow_floppies ) static SLOT_INTERFACE_START( rainbow_floppies )
SLOT_INTERFACE( "525qd", FLOPPY_525_SSQD ) // "525ssdd" SLOT_INTERFACE("525qd", FLOPPY_525_SSQD)
SLOT_INTERFACE_END SLOT_INTERFACE_END
@ -414,7 +418,8 @@ void rainbow_state::machine_start()
rom[0xf4000 + 0x363b]= 0xeb; // COND => JMPS rom[0xf4000 + 0x363b]= 0xeb; // COND => JMPS
if (rom[0xf4174] == 0x75) if (rom[0xf4174] == 0x75)
{ rom[0xf4174] = 0xeb; // jmps RAINBOW100_LOGO__loc_33D {
rom[0xf4174] = 0xeb; // jmps RAINBOW100_LOGO__loc_33D
rom[0xf4175] = 0x08; rom[0xf4175] = 0x08;
} }
@ -559,7 +564,7 @@ static INPUT_PORTS_START( rainbow100b_in )
#endif #endif
PORT_START("MONITOR TYPE") PORT_START("MONITOR TYPE")
PORT_DIPNAME( 0x03, 0x03, "MONOCHROME MONITOR") PORT_DIPNAME( 0x03, 0x03, "MONOCHROME MONITOR")
PORT_DIPSETTING( 0x01, "PAPER WHITE" ) PORT_DIPSETTING(0x01, "WHITE")
PORT_DIPSETTING( 0x02, "GREEN" ) PORT_DIPSETTING( 0x02, "GREEN" )
PORT_DIPSETTING( 0x03, "AMBER" ) PORT_DIPSETTING( 0x03, "AMBER" )
@ -640,7 +645,8 @@ void rainbow_state::machine_reset()
/* configure RAM */ /* configure RAM */
address_space &program = m_maincpu->space(AS_PROGRAM); address_space &program = m_maincpu->space(AS_PROGRAM);
if (m_inp8->read() < END_OF_RAM) 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). // 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) 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() ); m_crtc->palette_select( m_inp9->read() );
if ( m_SCREEN_BLANK ) if ( m_SCREEN_BLANK )
@ -1046,7 +1049,8 @@ WRITE8_MEMBER(rainbow_state::z80_diskcontrol_w)
floppy_connector *con = machine().device<floppy_connector>(names[drive]); floppy_connector *con = machine().device<floppy_connector>(names[drive]);
if (con) if (con)
{ m_floppy = con->get_device(); {
m_floppy = con->get_device();
if (m_floppy) if (m_floppy)
{ {
selected_drive = drive; selected_drive = drive;
@ -1073,7 +1077,8 @@ WRITE8_MEMBER(rainbow_state::z80_diskcontrol_w)
MOTOR_DISABLE_counter = 4800; // 2400 = 500 ms MOTOR_DISABLE_counter = 4800; // 2400 = 500 ms
// m_fdc->set_force_ready(force_ready); // m_fdc->set_force_ready(force_ready);
} else }
else
{ {
// m_fdc->set_force_ready(false); // m_fdc->set_force_ready(false);
} }
@ -1090,8 +1095,10 @@ WRITE8_MEMBER(rainbow_state::z80_diskcontrol_w)
data = data & (255 -3); data = data & (255 -3);
data = data | 8; // MOTOR 0 OFF data = data | 8; // MOTOR 0 OFF
data = data | 16; // MOTOR 1 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) if(m_unit < 2)
data = data & (255 - 8); // MOTOR 0 (for A or B) 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) INTERRUPT_GEN_MEMBER(rainbow_state::vblank_irq)
{ {
raise_8088_irq(IRQ_8088_VBL); raise_8088_irq(IRQ_8088_VBL);
m_crtc->notify_vblank(true);
} }
WRITE_LINE_MEMBER( rainbow_state::clear_video_interrupt ) WRITE_LINE_MEMBER( rainbow_state::clear_video_interrupt )
{ {
lower_8088_irq(IRQ_8088_VBL); 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 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() ) ); // 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_LOAD( "chargen.bin", 0x0000, 0x1000, CRC(1685e452) SHA1(bc299ff1cb74afcededf1a7beb9001188fdcf02f))
ROM_END 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) // Built until ~ May 1986 (see MP-01491-00)
// - 32 K ROM (version 5.03) // - 32 K ROM (version 5.03)
// - 128 K base and 896 K max. mem. // - 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? - 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). - SCROLLING REGIONS / SPLIT SCREEN SCROLLING UNTESTED (if you open > 1 file with the VAX editor EDT)
See 4.7.4 and up in VT manual. 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) - INTERLACED MODE UNEMULATED:
A. (VT 100): DEC VT terminals are said to have a feature that doubles the number of lines There is no RAM (on a Rainbow-100) to hold twice as many vertical lines, so the video chip
(50 real lines or just interlaced mode with 500 instead of 250 scanlines?) 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 - FUN WITH DC011 / DC012 REGISTERS (clues wanted):
- so picture takes a quarter of the original screen. How does it accomplish this? 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: - 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. Copyright MESS Team.
Visit http://mamedev.org for licensing and usage restrictions. Visit http://mamedev.org for licensing and usage restrictions.
@ -116,7 +118,8 @@ void vt100_video_device::device_reset()
m_lba7 = 0; m_lba7 = 0;
m_scroll_latch = 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_blink_flip_flop = 0;
m_reverse_field = 0; m_reverse_field = 0;
@ -144,7 +147,8 @@ void rainbow_video_device::device_reset()
m_lba7 = 0; m_lba7 = 0;
m_scroll_latch = 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_blink_flip_flop = 0;
m_reverse_field = 0; m_reverse_field = 0;
@ -171,7 +175,8 @@ void vt100_video_device::recompute_parameters()
if (m_columns == 132) { if (m_columns == 132) {
horiz_pix_total = m_columns * 9; // display 1 less filler pixel in 132 char. mode (DEC-100) 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. horiz_pix_total = m_columns * 10; // normal 80 character mode.
} }
@ -210,24 +215,9 @@ WRITE8_MEMBER( vt100_video_device::dc012_w )
if (!(data & 0x08)) 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)) 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 // set lower part scroll
m_scroll_latch = data & 0x03; m_scroll_latch = data & 0x03;
} }
@ -235,8 +225,7 @@ WRITE8_MEMBER( vt100_video_device::dc012_w )
{ {
// set higher part scroll // set higher part scroll
m_scroll_latch = (m_scroll_latch & 0x03) | ((data & 0x03) << 2); m_scroll_latch = (m_scroll_latch & 0x03) | ((data & 0x03) << 2);
m_scroll_latch_valid = true;
m_scroll_latch_valid = 1; // MSB is written last.
} }
} }
else else
@ -492,9 +481,11 @@ void rainbow_video_device::display_char(bitmap_ind16 &bitmap, UINT8 code, int x,
UINT16 y_preset; UINT16 y_preset;
UINT16 x_preset, d_x_preset; UINT16 x_preset, d_x_preset;
if (m_columns == 132) if (m_columns == 132)
{ x_preset = x * 9; {
x_preset = x * 9;
d_x_preset = x * 18; d_x_preset = x * 18;
} else }
else
{ {
x_preset = x * 10; x_preset = x * 10;
d_x_preset = x * 20; 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; display_type = display_type & 3;
static int old_scroll_region;
// * SCREEN ATTRIBUTES (see VT-180 manual 6-30) * // * SCREEN ATTRIBUTES (see VT-180 manual 6-30) *
// 'reverse field' = reverse video over entire screen // '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_width = (display_type != 3) ? true : false; // all except normal: double width
bool double_height = (display_type & 1) ? false : true; // 0,2 = double height 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++) for (int scan_line = 0; scan_line < 10; scan_line++)
{ {
y_preset = y * 10 + scan_line; y_preset = y * 10 + scan_line;
// Offset to bitmap in char-rom (used later below) int i = scan_line + smooth_offset; // offset to bitmap in char-rom (+ scroll)
int i = scan_line; if (i > 9) // SMOOTH SCROLL - fill previous scan line:
{
extra_scan_line += 1;
i = smooth_offset - extra_scan_line; // correct bitmap
// Affects 'i' / 'y_preset' / 'scan_line' (= LOOP VARIABLE) y_preset -= scan_line;
if ( m_scroll_latch_valid == 1) if (y > 0)
{ y_preset -= extra_scan_line; // Y * 10 - extra_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
} }
}
// **** 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 ?)
}
}
} // (IF) scroll latch valid
switch (display_type) switch (display_type)
{ {
@ -613,7 +585,8 @@ void rainbow_video_device::display_char(bitmap_ind16 &bitmap, UINT8 code, int x,
if (invert == 0) if (invert == 0)
line = 0xff; // CASE 5 A) line = 0xff; // CASE 5 A)
else else
{ line = 0x00; // CASE 5 B) {
line = 0x00; // CASE 5 B)
back_intensity = 0; // OVERRIDE: BLACK BACKGROUND 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 for (int b = 0; b < 8; b++) // 0..7
{ {
if (blank) if (blank)
{ bit = m_reverse_field ^ m_basic_attribute; {
bit = m_reverse_field ^ m_basic_attribute;
} }
else else
{ {
@ -652,7 +626,6 @@ void rainbow_video_device::display_char(bitmap_ind16 &bitmap, UINT8 code, int x,
} }
} // for (8 bit) } // for (8 bit)
// char interleave (X) is filled with last bit // char interleave (X) is filled with last bit
if (double_width) 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; bitmap.pix16(y_preset, d_x_preset + 17) = bit;
if (m_columns == 80) 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; 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) if (m_columns == 80)
bitmap.pix16(y_preset, x_preset + 9) = bit; bitmap.pix16(y_preset, x_preset + 9) = bit;
} }
} // for (scan_line) } // 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 ) void rainbow_video_device::palette_select ( int choice )
{ {
@ -778,9 +765,9 @@ void rainbow_video_device::palette_select ( int choice )
break; break;
case 0x02: case 0x02:
m_palette->set_pen_color(1, 0 , 205 -50, 70 - 50); // GREEN (dim) m_palette->set_pen_color(1, 35, 200 - 55, 75); // GREEN (dim)
m_palette->set_pen_color(2, 0 , 205, 70 ); // GREEN (NORMAL) m_palette->set_pen_color(2, 35 + 55, 200, 75 + 55); // GREEN (NORMAL)
m_palette->set_pen_color(3, 0, 205 +50, 70 + 50); // GREEN (brighter) m_palette->set_pen_color(3, 35 + 110, 200 + 55, 75 + 110); // GREEN (brighter)
break; break;
case 0x03: case 0x03:

View File

@ -57,7 +57,7 @@ protected:
// dc012 attributes // dc012 attributes
UINT8 m_scroll_latch; UINT8 m_scroll_latch;
UINT8 m_scroll_latch_valid; bool m_scroll_latch_valid;
UINT8 m_blink_flip_flop; UINT8 m_blink_flip_flop;
UINT8 m_reverse_field; UINT8 m_reverse_field;
UINT8 m_basic_attribute; UINT8 m_basic_attribute;
@ -71,6 +71,9 @@ protected:
const char *m_char_rom_tag; /* character rom region */ const char *m_char_rom_tag; /* character rom region */
required_device<palette_device> m_palette; required_device<palette_device> m_palette;
bool m_notify_vblank;
int m_last_scroll;
}; };
@ -84,6 +87,7 @@ public:
int MHFU(int); int MHFU(int);
void palette_select(int choice); void palette_select(int choice);
void notify_vblank(bool choice);
protected: protected:
virtual void display_char(bitmap_ind16 &bitmap, UINT8 code, int x, int y, UINT8 scroll_region, UINT8 display_type); virtual void display_char(bitmap_ind16 &bitmap, UINT8 code, int x, int y, UINT8 scroll_region, UINT8 display_type);
virtual void device_reset(); virtual void device_reset();