diff options
author | 2020-04-16 20:31:21 +0700 | |
---|---|---|
committer | 2020-04-16 20:31:21 +0700 | |
commit | 4ce182352ed0f58739c4e614c1f63c1ffc91679a (patch) | |
tree | 578f87af6b04c6d704049da10f7a194ccc7d927f | |
parent | cd318c1ace0b8d27fcc0d7b17ec295c0fbb226f7 (diff) |
news_hid_hle: add 68k system interface (nw)
-rw-r--r-- | src/mame/machine/news_hid.cpp | 51 | ||||
-rw-r--r-- | src/mame/machine/news_hid.h | 6 |
2 files changed, 46 insertions, 11 deletions
diff --git a/src/mame/machine/news_hid.cpp b/src/mame/machine/news_hid.cpp index b770e79fba2..f158fd54e15 100644 --- a/src/mame/machine/news_hid.cpp +++ b/src/mame/machine/news_hid.cpp @@ -48,17 +48,29 @@ void news_hid_hle_device::map(address_map &map) map(0x7, 0x7).w(FUNC(news_hid_hle_device::init_w<MOUSE>)); } +void news_hid_hle_device::map_68k(address_map &map) +{ + map(0x0, 0x0).r(FUNC(news_hid_hle_device::data_r<KEYBOARD>)); + map(0x1, 0x1).r(FUNC(news_hid_hle_device::status_68k_r)); + map(0x2, 0x2).w(FUNC(news_hid_hle_device::ien_w<KEYBOARD>)); + map(0x3, 0x3).w(FUNC(news_hid_hle_device::reset_w<KEYBOARD>)); + // TODO: keyboard buzzer + map(0x5, 0x5).r(FUNC(news_hid_hle_device::data_r<MOUSE>)); + map(0x6, 0x6).w(FUNC(news_hid_hle_device::ien_w<MOUSE>)); + map(0x7, 0x7).w(FUNC(news_hid_hle_device::reset_w<MOUSE>)); +} + void news_hid_hle_device::device_start() { m_irq_out_cb.resolve_all_safe(); //save_item(NAME(m_fifo)); + save_item(NAME(m_irq_enabled)); save_item(NAME(m_irq_out_state)); save_item(NAME(m_mouse_x)); save_item(NAME(m_mouse_y)); save_item(NAME(m_mouse_b)); - save_item(NAME(m_mouse_enable)); } void news_hid_hle_device::device_reset() @@ -66,11 +78,11 @@ void news_hid_hle_device::device_reset() m_fifo[KEYBOARD].clear(); m_fifo[MOUSE].clear(); + m_irq_enabled[KEYBOARD] = false; + m_irq_enabled[MOUSE] = false; out_irq<KEYBOARD>(false); out_irq<MOUSE>(false); - m_mouse_enable = false; - reset_key_state(); start_processing(attotime::from_hz(1'200)); } @@ -99,9 +111,6 @@ void news_hid_hle_device::push_key(u8 code) // HACK: abuse the keyboard row scanner to sample the mouse too void news_hid_hle_device::scan_complete() { - if (!m_mouse_enable) - return; - // read mouse state s16 const x = m_mouse_x_axis->read(); s16 const y = m_mouse_y_axis->read(); @@ -140,7 +149,7 @@ template <news_hid_hle_device::news_hid_device Device> void news_hid_hle_device: if (m_irq_out_state[Device] != state) { m_irq_out_state[Device] = state; - m_irq_out_cb[Device](state); + m_irq_out_cb[Device](state && m_irq_enabled[Device]); } } @@ -174,9 +183,31 @@ template <news_hid_hle_device::news_hid_device Device> void news_hid_hle_device: { LOG("init_w<%d> 0x%02x\n", Device, data); - // HACK: prevent unexpected mouse activity from crashing NEWS-OS - if (Device == MOUSE) - m_mouse_enable = bool(data); + ien_w<Device>(data); +} + +template <news_hid_hle_device::news_hid_device Device> void news_hid_hle_device::ien_w(u8 data) +{ + LOG("ien_w<%d> 0x%02x\n", Device, data); + + m_irq_enabled[Device] = bool(data); +} + +u8 news_hid_hle_device::status_68k_r() +{ + u8 const data = + (!m_fifo[KEYBOARD].empty() ? 0x80 : 0) | + (!m_fifo[MOUSE].empty() ? 0x40 : 0) | + (m_fifo[KEYBOARD].full() ? 0x20 : 0) | + (m_fifo[MOUSE].full() ? 0x10 : 0) | + (m_irq_out_state[KEYBOARD] ? 0x08 : 0) | + (m_irq_out_state[MOUSE] ? 0x08 : 0) | + (m_irq_enabled[KEYBOARD] ? 0x02 : 0) | + (m_irq_enabled[MOUSE] ? 0x01 : 0); + + LOG("status_r 0x%02x\n", data); + + return data; } INPUT_PORTS_START(news_hid_hle_device) diff --git a/src/mame/machine/news_hid.h b/src/mame/machine/news_hid.h index bb5cc8f7da4..8d8ab1e5b79 100644 --- a/src/mame/machine/news_hid.h +++ b/src/mame/machine/news_hid.h @@ -23,6 +23,7 @@ public: template <news_hid_device Device> auto irq_out() { return m_irq_out_cb[Device].bind(); } void map(address_map &map); + void map_68k(address_map &map); protected: // device_t overrides @@ -44,6 +45,9 @@ private: template <news_hid_device Device> u8 data_r(); template <news_hid_device Device> void reset_w(u8 data); template <news_hid_device Device> void init_w(u8 data); + template <news_hid_device Device> void ien_w(u8 data); + + u8 status_68k_r(); required_ioport m_mouse_x_axis; required_ioport m_mouse_y_axis; @@ -52,13 +56,13 @@ private: devcb_write_line::array<2> m_irq_out_cb; util::fifo<u8, 8> m_fifo[2]; + bool m_irq_enabled[2]; bool m_irq_out_state[2]; // mouse state s16 m_mouse_x; s16 m_mouse_y; u8 m_mouse_b; - bool m_mouse_enable; }; DECLARE_DEVICE_TYPE(NEWS_HID_HLE, news_hid_hle_device) |