diff --git a/src/mame/drivers/rainbow.cpp b/src/mame/drivers/rainbow.cpp index b3e830c9800..3ac6560a199 100644 --- a/src/mame/drivers/rainbow.cpp +++ b/src/mame/drivers/rainbow.cpp @@ -903,7 +903,7 @@ void rainbow_state::machine_reset() INT88 = false; m_kbd_tx_ready = m_kbd_rx_ready = false; - m_kbd8251->write_cts(1); + m_kbd8251->write_cts(0); m_KBD = 0; m_irq_high = 0; diff --git a/src/mame/machine/dec_lk201.cpp b/src/mame/machine/dec_lk201.cpp index ca640dc7add..dc3b07f7d2d 100644 --- a/src/mame/machine/dec_lk201.cpp +++ b/src/mame/machine/dec_lk201.cpp @@ -192,6 +192,7 @@ static ADDRESS_MAP_START( lk201_map, AS_PROGRAM, 8, lk201_device ) AM_RANGE(0x0004, 0x0006) AM_READWRITE(ddr_r, ddr_w) AM_RANGE(0x000a, 0x000c) AM_READWRITE(spi_r, spi_w) AM_RANGE(0x000d, 0x0011) AM_READWRITE(sci_r, sci_w) + AM_RANGE(0x0012, 0x001b) AM_READWRITE(timer_r, timer_w) AM_RANGE(0x0050, 0x00ff) AM_RAM AM_RANGE(0x0100, 0x1fff) AM_ROM AM_REGION(LK201_CPU_TAG, 0x100) ADDRESS_MAP_END @@ -495,6 +496,7 @@ lk201_device::lk201_device(const machine_config &mconfig, const char *tag, devic void lk201_device::device_start() { + m_count = timer_alloc(1); m_tx_handler.resolve_safe(); } @@ -507,6 +509,8 @@ void lk201_device::device_reset() { set_data_frame(1, 8, PARITY_NONE, STOP_BITS_1); set_rate(4800); + m_count->adjust(attotime::from_hz(1200), 0, attotime::from_hz(1200)); + memset(m_timer.regs, 0, sizeof(m_timer.regs)); sci_status = (SCSR_TC | SCSR_TDRE); @@ -522,7 +526,14 @@ void lk201_device::device_reset() void lk201_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) { - device_serial_interface::device_timer(timer, id, param, ptr); + if(id == 1) + { + if(m_timer.tcr & 0x40) + m_maincpu->set_input_line(M68HC05EG_INT_TIMER, ASSERT_LINE); + m_timer.tsr |= 0x40; + } + else + device_serial_interface::device_timer(timer, id, param, ptr); } void lk201_device::rcv_complete() @@ -556,6 +567,22 @@ void lk201_device::update_interrupts() } } +READ8_MEMBER( lk201_device::timer_r ) +{ + UINT8 ret = m_timer.regs[offset]; + if(m_timer.tsr) + { + m_timer.tsr = 0; + m_maincpu->set_input_line(M68HC05EG_INT_TIMER, CLEAR_LINE); + } + return ret; +} + +WRITE8_MEMBER( lk201_device::timer_w ) +{ + m_timer.regs[offset] = data; +} + READ8_MEMBER( lk201_device::ddr_r ) { return ddrs[offset]; diff --git a/src/mame/machine/dec_lk201.h b/src/mame/machine/dec_lk201.h index 88271331523..0871f1c3c4e 100644 --- a/src/mame/machine/dec_lk201.h +++ b/src/mame/machine/dec_lk201.h @@ -53,6 +53,8 @@ public: DECLARE_WRITE8_MEMBER( sci_w ); DECLARE_READ8_MEMBER( spi_r ); DECLARE_WRITE8_MEMBER( spi_w ); + DECLARE_READ8_MEMBER( timer_r ); + DECLARE_WRITE8_MEMBER( timer_w ); template static devcb_base &set_tx_handler(device_t &device, _Object wr) { return downcast(device).m_tx_handler.set_callback(wr); } @@ -76,6 +78,24 @@ private: UINT8 led_data; UINT8 kbd_data; + union { + struct { + UINT8 tcr; + UINT8 tsr; + UINT8 icrh; + UINT8 icrl; + UINT8 ocrh; + UINT8 ocrl; + UINT8 crh; + UINT8 crl; + UINT8 acrh; + UINT8 acrl; + }; + UINT8 regs[10]; + } m_timer; + + emu_timer *m_count; + UINT8 sci_ctl2; UINT8 sci_status; //UINT8 sci_data;