summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Patrick Mackinlay <pmackinlay@hotmail.com>2020-04-16 20:31:21 +0700
committer Patrick Mackinlay <pmackinlay@hotmail.com>2020-04-16 20:31:21 +0700
commit4ce182352ed0f58739c4e614c1f63c1ffc91679a (patch)
tree578f87af6b04c6d704049da10f7a194ccc7d927f
parentcd318c1ace0b8d27fcc0d7b17ec295c0fbb226f7 (diff)
news_hid_hle: add 68k system interface (nw)
-rw-r--r--src/mame/machine/news_hid.cpp51
-rw-r--r--src/mame/machine/news_hid.h6
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)