diff options
Diffstat (limited to 'src/mess/drivers/rainbow.c')
-rw-r--r-- | src/mess/drivers/rainbow.c | 154 |
1 files changed, 13 insertions, 141 deletions
diff --git a/src/mess/drivers/rainbow.c b/src/mess/drivers/rainbow.c index ad203bb8aed..893a20d0812 100644 --- a/src/mess/drivers/rainbow.c +++ b/src/mess/drivers/rainbow.c @@ -160,9 +160,8 @@ W16 pulls J2 printer port pin 1 to GND when set (chassis to logical GND). W17 pulls J1 serial port pin 1 to GND when set (chassis to logical GND). ****************************************************************************/ -// Workarounds DO NOT APPLY to the 190-B ROM. Only enable when compiling the 'rainbow' driver - +// Workaround DOES NOT APPLY to the 190-B ROM. Only enable when compiling the 'rainbow' driver - //#define FORCE_RAINBOW_100_LOGO -#define KBD_DELAY 875 // (debounce delay). Recommended: 875. #include "emu.h" #include "cpu/i86/i86.h" @@ -175,7 +174,6 @@ W17 pulls J1 serial port pin 1 to GND when set (chassis to logical GND). #include "machine/i8251.h" #include "machine/dec_lk201.h" -#include "sound/beep.h" #include "machine/nvram.h" #include "rainbow.lh" // BEZEL - LAYOUT with LEDs for diag 1-7, keyboard 8-11 and floppy 20-23 @@ -195,7 +193,6 @@ public: m_inp8(*this, "MEMORY PRESENT"), m_inp9(*this, "MONITOR TYPE"), - m_beep(*this, "beeper"), m_crtc(*this, "vt100_video"), m_i8088(*this, "maincpu"), m_z80(*this, "subcpu"), @@ -220,8 +217,6 @@ public: required_ioport m_inp8; required_ioport m_inp9; - required_device<beep_device> m_beep; - required_device<rainbow_video_device> m_crtc; required_device<cpu_device> m_i8088; required_device<cpu_device> m_z80; @@ -252,10 +247,6 @@ public: DECLARE_WRITE8_MEMBER(floating_bus_w); DECLARE_READ8_MEMBER(hd_status_68_r); - // EMULATOR TRAP TO INTERCEPT KEYBOARD cmd in AH and PARAMETER in AL (port 90 = AL / port 91 = AH) - // TODO: beeper and led handling should better be handled by LK201 code. - DECLARE_WRITE8_MEMBER(PORT90_W); - DECLARE_WRITE8_MEMBER(PORT91_W); DECLARE_READ8_MEMBER(i8088_latch_r); DECLARE_WRITE8_MEMBER(i8088_latch_w); @@ -338,32 +329,6 @@ void rainbow_state::machine_start() rom[0xf4384]=0xeb; // JMPS => BOOT80 #endif - // Enables PORT90_W + PORT91_W via BIOS call (offset +$21 in HIGH ROM) - // F8 / FC ROM REGION (CHECK + PATCH) - if(rom[0xfc000 + 0x0022] == 0x22 && rom[0xfc000 + 0x0023] == 0x28) - { - rom[0xf4303]=0x00; // Disable CRC CHECK (F0 / F4 ROM) - - rom[0xfc000 + 0x0022] =0xfe; // jmp to offset $1922 - rom[0xfc000 + 0x0023] =0x18; - - rom[0xfc000 + 0x1922] =0xe6; // out 90,al - rom[0xfc000 + 0x1923] =0x90; - - rom[0xfc000 + 0x1924] =0x86; // xchg al,ah - rom[0xfc000 + 0x1925] =0xc4; - - rom[0xfc000 + 0x1926] =0xe6; // out 91,al - rom[0xfc000 + 0x1927] =0x91; - - rom[0xfc000 + 0x1928] =0x86; // xchg al,ah - rom[0xfc000 + 0x1929] =0xc4; - - rom[0xfc000 + 0x192a] =0xe9; // jmp (original jump offset $2846) e9 + 19 0f - rom[0xfc000 + 0x192b] =0x19; - rom[0xfc000 + 0x192c] =0x0f; - } - } static ADDRESS_MAP_START( rainbow8088_map, AS_PROGRAM, 8, rainbow_state) @@ -443,9 +408,6 @@ static ADDRESS_MAP_START( rainbow8088_io , AS_IO, 8, rainbow_state) // - DOS 3 has a 1024 cylinder limit (32 MB). // - the custom boot loader that comes with 'WUTIL 3.2' allows 117 MB and 8 surfaces. AM_RANGE (0x68, 0x68) AM_READ(hd_status_68_r) - - AM_RANGE (0x90, 0x90) AM_WRITE(PORT90_W) - AM_RANGE (0x91, 0x91) AM_WRITE(PORT91_W) ADDRESS_MAP_END static ADDRESS_MAP_START(rainbowz80_mem, AS_PROGRAM, 8, rainbow_state) @@ -468,9 +430,8 @@ ADDRESS_MAP_END /* Input ports */ -/* KEYBOARD (preliminary - transfer to DEC_LK201.xx as soon as possible) */ -static INPUT_PORTS_START( rainbow100b_in ) /* DIP switches */ +static INPUT_PORTS_START( rainbow100b_in ) PORT_START("MONITOR TYPE") PORT_DIPNAME( 0x03, 0x03, "MONOCHROME MONITOR") PORT_DIPSETTING( 0x01, "PAPER WHITE" ) @@ -565,9 +526,6 @@ void rainbow_state::machine_reset() m_KBD = 0; - m_beep->set_frequency(2000); - m_beep->set_state(0); - // RESET ALL LEDs output_set_value("led1", 1); output_set_value("led2", 1); @@ -576,10 +534,12 @@ void rainbow_state::machine_reset() output_set_value("led5", 1); output_set_value("led6", 1); output_set_value("led7", 1); - output_set_value("led8", 1); - output_set_value("led9", 1); - output_set_value("led10", 1); - output_set_value("led11", 1); + + // GREEN KEYBOARD LEDs (1 = on, 0 = off): + output_set_value("led_wait", 0); // led8 + output_set_value("led_compose", 0); // led9 + output_set_value("led_lock", 0); // led10 + output_set_value("led_hold", 0); // led11 MOTOR_DISABLE_counter = 2; // soon resets drv.LEDs m_unit = 0; @@ -758,87 +718,6 @@ WRITE8_MEMBER(rainbow_state::comm_control_w) // printf("%02x to COMM.CONTROL REGISTER\n", data); } -// EMULATOR TRAP (patched into ROM @ machine_start) via BIOS : call / offset +$21 (AL / AH) -WRITE8_MEMBER(rainbow_state::PORT90_W) -{ - //printf("KBD COMMAND : %02x to AL (90)\n", data); - - m_KBD = 0; // reset previous command. - - if(MOTOR_DISABLE_counter == 0) - { - if (data == LK_CMD_POWER_UP) { // Powerup (beep) - //m_beep->set_state(1); - //m_beep_counter=600; // BELL = 125 ms - } - - if (data == LK_CMD_BELL) { - m_KBD = data; - m_beep->set_state(1); - m_beep_counter=600; // BELL = 125 ms - } - - if (data == LK_CMD_SOUND_CLK) { // emit a keyclick (2ms) - m_KBD = data; - m_beep->set_state(1); - m_beep_counter=25; // longer than calculated ( 9,6 ) - } - - if (data == LK_CMD_ENB_BELL) { // enable the bell - PARAMETER: VOLUME! - m_KBD = data; - } - - if (data == LK_CMD_ENB_KEYCLK) { // enable the keyclick- PARAMETER: VOLUME! - m_KBD = data; - } - - if (data == LK_CMD_LEDS_ON ) { // light LEDs - - m_KBD = data; - } - if (data == LK_CMD_LEDS_OFF) { // switch off LEDs - - m_KBD = data; - } - - } // prevent beeps during disk load operations -} - -WRITE8_MEMBER(rainbow_state::PORT91_W) -{ - // 4 leds, represented in the low 4 bits of a byte - if (m_KBD == LK_CMD_LEDS_ON) { // light LEDs - - if (data & 1) { output_set_value("led8", 0); } // KEYBOARD : "Wait" LED - if (data & 2) { output_set_value("led9", 0); } // KEYBOARD : "Compose" LED - if (data & 4) { output_set_value("led10", 0); } // KEYBOARD : "Lock" LED - if (data & 8) { output_set_value("led11", 0); } // KEYBOARD : "Hold" LED - m_KBD = 0; // reset previous command. - } - if (m_KBD == LK_CMD_LEDS_OFF) { // switch off LEDs - - if (data & 1) { output_set_value("led8", 1); } // KEYBOARD : "Wait" LED - if (data & 2) { output_set_value("led9", 1); } // KEYBOARD : "Compose" LED - if (data & 4) { output_set_value("led10", 1); } // KEYBOARD : "Lock" LED - if (data & 8) { output_set_value("led11", 1); } // KEYBOARD : "Hold" LED - m_KBD = 0; // reset previous command. - } - - // NVRAM offet $A8 : BELL VOLUME (=> ENABLE BELL 0x23) - if ( (m_KBD == LK_CMD_BELL) || (m_KBD == LK_CMD_ENB_BELL) ) /* BOTH sound or enable bell have a parameter */ - { /* max volume is 0, lowest is 0x7 */ -// printf("\n%02x BELL CMD has bell volume = %02x\n", m_KBD, 8 - (data & 7)); - m_KBD = 0; // reset previous command. - } - - // NVRAM offet $A9 = KEYCLICK VOLUME (=> ENABLE CLK 0x1b) - // NVRAM offset $8C = KEYCLICK ENABLE / DISABLE (0/1) - if ( ( m_KBD == LK_CMD_ENB_KEYCLK ) || ( m_KBD == LK_CMD_SOUND_CLK ) ) /* BOTH keyclick cmds have a parameter */ - { // max volume is 0, lowest is 0x7 - 87 (BELL VOL:1) and 80 (BELL VOL:8) -// printf("\n%02x CLICK CMD - keyclick volume = %02x\n", m_KBD, 8 - (data & 7)); - m_KBD = 0; // reset previous command. - } - -if (m_KBD > 0) - printf("UNHANDLED PARAM FOR MODE: %02x / KBD PARAM %02x to AH (91) \n", m_KBD, data); - -} // 8088 reads port 0x00. See page 133 (4-34) READ8_MEMBER(rainbow_state::i8088_latch_r) { @@ -1146,7 +1025,7 @@ WRITE_LINE_MEMBER(rainbow_state::kbd_rxready_w) WRITE_LINE_MEMBER(rainbow_state::kbd_txready_w) { -// printf("txready %d\n", state); +// printf("8251 txready %d\n", state); m_kbd_tx_ready = (state == 1) ? true : false; update_kbd_irq(); } @@ -1176,13 +1055,8 @@ TIMER_DEVICE_CALLBACK_MEMBER(rainbow_state::keyboard_tick) */ } - if (m_beep_counter > 1) + if (m_beep_counter > 0) m_beep_counter--; - else - if ( m_beep_counter == 1 ) - { m_beep->set_state(0); - m_beep_counter = 0; - } } static const vt_video_interface video_interface = @@ -1268,11 +1142,6 @@ static MACHINE_CONFIG_START( rainbow, rainbow_state ) MCFG_RAINBOW_VIDEO_ADD("vt100_video", video_interface) - /* sound hardware */ - MCFG_SPEAKER_STANDARD_MONO("mono") - MCFG_SOUND_ADD("beeper", BEEP, 0) - MCFG_SOUND_ROUTE(ALL_OUTPUTS,"mono",0.50) - MCFG_FD1793_ADD("wd1793", rainbow_wd17xx_interface ) MCFG_LEGACY_FLOPPY_4_DRIVES_ADD(floppy_intf) MCFG_SOFTWARE_LIST_ADD("flop_list","rainbow") @@ -1281,6 +1150,8 @@ static MACHINE_CONFIG_START( rainbow, rainbow_state ) MCFG_TIMER_DRIVER_ADD_PERIODIC("keyboard", rainbow_state, keyboard_tick, attotime::from_hz(4800*16)) // 8251 is set to /16 on the clock input MCFG_LK201_ADD() + MCFG_LK201_SET_TX_CALLBACK(DEVWRITELINE("kbdser", i8251_device, write_rx)) + MCFG_NVRAM_ADD_0FILL("nvram") MACHINE_CONFIG_END @@ -1328,3 +1199,4 @@ ROM_END /* YEAR NAME PARENT COMPAT MACHINE INPUT STATE INIT COMPANY FULLNAME FLAGS */ COMP( 1983, rainbow , 0 , 0, rainbow, rainbow100b_in, driver_device, 0, "Digital Equipment Corporation", "Rainbow 100-B", GAME_NOT_WORKING | GAME_IMPERFECT_COLORS) COMP( 1985, rainb190, rainbow, 0, rainbow, rainbow100b_in, driver_device, 0, "Digital Equipment Corporation", "Rainbow 190-B", GAME_NOT_WORKING | GAME_IMPERFECT_COLORS) + |