diff options
Diffstat (limited to 'src/mame/drivers/tm990189.cpp')
-rw-r--r-- | src/mame/drivers/tm990189.cpp | 66 |
1 files changed, 43 insertions, 23 deletions
diff --git a/src/mame/drivers/tm990189.cpp b/src/mame/drivers/tm990189.cpp index 154f456b9cb..4aa4acbb96e 100644 --- a/src/mame/drivers/tm990189.cpp +++ b/src/mame/drivers/tm990189.cpp @@ -112,9 +112,9 @@ private: DECLARE_WRITE_LINE_MEMBER(usr9901_led1_w); DECLARE_WRITE_LINE_MEMBER(usr9901_led2_w); DECLARE_WRITE_LINE_MEMBER(usr9901_led3_w); - DECLARE_WRITE8_MEMBER(usr9901_interrupt_callback); + DECLARE_WRITE_LINE_MEMBER(usr9901_interrupt_callback); - DECLARE_WRITE8_MEMBER(sys9901_interrupt_callback); + DECLARE_WRITE_LINE_MEMBER(sys9901_interrupt_callback); DECLARE_READ8_MEMBER(sys9901_r); DECLARE_WRITE_LINE_MEMBER(sys9901_digitsel0_w); DECLARE_WRITE_LINE_MEMBER(sys9901_digitsel1_w); @@ -282,13 +282,13 @@ TIMER_DEVICE_CALLBACK_MEMBER(tm990189_state::display_callback) tms9901 code */ -WRITE8_MEMBER( tm990189_state::usr9901_interrupt_callback ) +WRITE_LINE_MEMBER( tm990189_state::usr9901_interrupt_callback ) { // Triggered by internal timer (set by ROM to 1.6 ms cycle) on level 3 // or by keyboard interrupt (level 6) if (!m_load_state) { - m_tms9980a->set_input_line(offset & 7, ASSERT_LINE); + m_tms9980a->set_input_line(m_tms9901_usr->get_int_level() & 7, ASSERT_LINE); } } @@ -320,31 +320,51 @@ WRITE_LINE_MEMBER( tm990189_state::usr9901_led3_w ) led_set(3, state); } -WRITE8_MEMBER( tm990189_state::sys9901_interrupt_callback ) +WRITE_LINE_MEMBER( tm990189_state::sys9901_interrupt_callback ) { // TODO: Check this - m_tms9901_usr->set_single_int(5, (data!=0)? ASSERT_LINE:CLEAR_LINE); + m_tms9901_usr->set_int_line(5, state); } READ8_MEMBER( tm990189_state::sys9901_r ) { - uint8_t data = 0; - if (offset == tms9901_device::CB_INT7) - { - static const char *const keynames[] = { "LINE0", "LINE1", "LINE2", "LINE3", "LINE4", "LINE5", "LINE6", "LINE7", "LINE8" }; - - /* keyboard read */ - if (m_digitsel < 9) - data |= ioport(keynames[m_digitsel])->read() << 1; + // |-|Cass|K|K|K|K|K|C| + static const char *const keynames[] = { "LINE0", "LINE1", "LINE2", "LINE3", "LINE4", "LINE5", "LINE6", "LINE7", "LINE8" }; - /* tape input */ - if (m_cass->input() > 0.0) - data |= 0x40; + offset &= 0x0F; + switch (offset) + { + case tms9901_device::INT1: + case tms9901_device::INT2: + case tms9901_device::INT3: + case tms9901_device::INT4: + case tms9901_device::INT5: + if (m_digitsel < 9) + return BIT(ioport(keynames[m_digitsel])->read(), offset-tms9901_device::INT1); + else return 0; + + case tms9901_device::INT6: + return (m_cass->input() > 0); + default: + return 0; } - - return data; } +/* + uint8_t data = 0; + if (offset == tms9901_device::CB_INT7) + { + static const char *const keynames[] = { "LINE0", "LINE1", "LINE2", "LINE3", "LINE4", "LINE5", "LINE6", "LINE7", "LINE8" }; + // keyboard read + if (m_digitsel < 9) + data |= ioport(keynames[m_digitsel])->read() << 1; + // tape input + if (m_cass->input() > 0.0) + data |= 0x40; + } + return data; +*/ + void tm990189_state::digitsel(int offset, bool state) { if (state) @@ -843,7 +863,7 @@ void tm990189_state::tm990_189(machine_config &config) m_tms9901_usr->p_out_cb(1).set(FUNC(tm990189_state::usr9901_led1_w)); m_tms9901_usr->p_out_cb(2).set(FUNC(tm990189_state::usr9901_led2_w)); m_tms9901_usr->p_out_cb(3).set(FUNC(tm990189_state::usr9901_led3_w)); - m_tms9901_usr->intlevel_cb().set(FUNC(tm990189_state::usr9901_interrupt_callback)); + m_tms9901_usr->intreq_cb().set(FUNC(tm990189_state::usr9901_interrupt_callback)); TMS9901(config, m_tms9901_sys, 8_MHz_XTAL / 4); m_tms9901_sys->read_cb().set(FUNC(tm990189_state::sys9901_r)); @@ -863,7 +883,7 @@ void tm990189_state::tm990_189(machine_config &config) m_tms9901_sys->p_out_cb(13).set(FUNC(tm990189_state::sys9901_shiftlight_w)); m_tms9901_sys->p_out_cb(14).set(FUNC(tm990189_state::sys9901_spkrdrive_w)); m_tms9901_sys->p_out_cb(15).set(FUNC(tm990189_state::sys9901_tapewdata_w)); - m_tms9901_sys->intlevel_cb().set(FUNC(tm990189_state::sys9901_interrupt_callback)); + m_tms9901_sys->intreq_cb().set(FUNC(tm990189_state::sys9901_interrupt_callback)); TMS9902(config, m_tms9902, 8_MHz_XTAL / 4); m_tms9902->xmit_cb().set(FUNC(tm990189_state::xmit_callback)); // called when a character is transmitted @@ -907,7 +927,7 @@ void tm990189_state::tm990_189_v(machine_config &config) m_tms9901_usr->p_out_cb(1).set(FUNC(tm990189_state::usr9901_led1_w)); m_tms9901_usr->p_out_cb(2).set(FUNC(tm990189_state::usr9901_led2_w)); m_tms9901_usr->p_out_cb(3).set(FUNC(tm990189_state::usr9901_led3_w)); - m_tms9901_usr->intlevel_cb().set(FUNC(tm990189_state::usr9901_interrupt_callback)); + m_tms9901_usr->intreq_cb().set(FUNC(tm990189_state::usr9901_interrupt_callback)); TMS9901(config, m_tms9901_sys, 8_MHz_XTAL / 4); m_tms9901_sys->read_cb().set(FUNC(tm990189_state::sys9901_r)); @@ -927,7 +947,7 @@ void tm990189_state::tm990_189_v(machine_config &config) m_tms9901_sys->p_out_cb(13).set(FUNC(tm990189_state::sys9901_shiftlight_w)); m_tms9901_sys->p_out_cb(14).set(FUNC(tm990189_state::sys9901_spkrdrive_w)); m_tms9901_sys->p_out_cb(15).set(FUNC(tm990189_state::sys9901_tapewdata_w)); - m_tms9901_sys->intlevel_cb().set(FUNC(tm990189_state::sys9901_interrupt_callback)); + m_tms9901_sys->intreq_cb().set(FUNC(tm990189_state::sys9901_interrupt_callback)); TMS9902(config, m_tms9902, 8_MHz_XTAL / 4); m_tms9902->xmit_cb().set(FUNC(tm990189_state::xmit_callback)); // called when a character is transmitted; |