diff options
Diffstat (limited to 'src/devices/bus/apricot/keyboard/hle.cpp')
-rw-r--r-- | src/devices/bus/apricot/keyboard/hle.cpp | 85 |
1 files changed, 80 insertions, 5 deletions
diff --git a/src/devices/bus/apricot/keyboard/hle.cpp b/src/devices/bus/apricot/keyboard/hle.cpp index c8df35cd0cb..28e98b9fb50 100644 --- a/src/devices/bus/apricot/keyboard/hle.cpp +++ b/src/devices/bus/apricot/keyboard/hle.cpp @@ -6,7 +6,6 @@ TODO: - MicroScreen emulation - - Mouse emulation - LEDs Keyboard to System: @@ -188,6 +187,17 @@ static INPUT_PORTS_START( keyboard ) PORT_START("row_c") PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHAR(UCHAR_MAMEKEY(ENTER_PAD)) + + PORT_START("mouse_b") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_BUTTON2) PORT_NAME("Mouse Right Button") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_NAME("Mouse Left Button") + PORT_BIT(0x0c, IP_ACTIVE_HIGH, IPT_UNUSED) + + PORT_START("mouse_x") + PORT_BIT(0xff, 0x00, IPT_MOUSE_X) PORT_SENSITIVITY(75) PORT_KEYDELTA(5) + + PORT_START("mouse_y") + PORT_BIT(0xff, 0x00, IPT_MOUSE_Y) PORT_SENSITIVITY(50) PORT_KEYDELTA(5) INPUT_PORTS_END ioport_constructor apricot_keyboard_hle_device::device_input_ports() const @@ -195,9 +205,12 @@ ioport_constructor apricot_keyboard_hle_device::device_input_ports() const return INPUT_PORTS_NAME( keyboard ); } -MACHINE_CONFIG_START(apricot_keyboard_hle_device::device_add_mconfig) - MCFG_DEVICE_ADD("rtc", MSM5832, 32.768_kHz_XTAL) -MACHINE_CONFIG_END +void apricot_keyboard_hle_device::device_add_mconfig(machine_config &config) +{ + MSM5832(config, m_rtc, 32.768_kHz_XTAL); + + TIMER(config, "timer").configure_periodic(FUNC(apricot_keyboard_hle_device::mouse_callback), attotime::from_hz(60)); +} //************************************************************************** @@ -214,7 +227,12 @@ apricot_keyboard_hle_device::apricot_keyboard_hle_device(const machine_config &m device_buffered_serial_interface(mconfig, *this), device_matrix_keyboard_interface(mconfig, *this, "row_0", "row_1", "row_2", "row_3", "row_4", "row_5", "row_6", "row_7", "row_8", "row_9", "row_a", "row_b", "row_c"), m_rtc(*this, "rtc"), - m_rtc_index(0) + m_mouse_b(*this, "mouse_b"), + m_mouse_x(*this, "mouse_x"), + m_mouse_y(*this, "mouse_y"), + m_rtc_index(0), + m_mouse_enabled(false), + m_mouse_last_b(0), m_mouse_last_x(0), m_mouse_last_y(0) { } @@ -224,6 +242,12 @@ apricot_keyboard_hle_device::apricot_keyboard_hle_device(const machine_config &m void apricot_keyboard_hle_device::device_start() { + // register for save states + save_item(NAME(m_rtc_index)); + save_item(NAME(m_mouse_enabled)); + save_item(NAME(m_mouse_last_b)); + save_item(NAME(m_mouse_last_x)); + save_item(NAME(m_mouse_last_y)); } //------------------------------------------------- @@ -308,6 +332,16 @@ void apricot_keyboard_hle_device::received_byte(uint8_t byte) break; + case CMD_ENABLE_MOUSE: + logerror("System enables mouse\n"); + m_mouse_enabled = true; + break; + + case CMD_DISABLE_MOUSE: + logerror("System disables mouse\n"); + m_mouse_enabled = false; + break; + case CMD_KEYBOARD_RESET: logerror("System requests keyboard reset\n"); transmit_byte(ACK_DIAGNOSTICS); @@ -347,3 +381,44 @@ void apricot_keyboard_hle_device::out_w(int state) { device_buffered_serial_interface::rx_w(state); } + +//------------------------------------------------- +// mouse_callback - check for new mouse events +//------------------------------------------------- + +TIMER_DEVICE_CALLBACK_MEMBER( apricot_keyboard_hle_device::mouse_callback ) +{ + if (m_mouse_enabled) + { + // get mouse state + uint8_t buttons = m_mouse_b->read(); + uint8_t x = m_mouse_x->read(); + uint8_t y = m_mouse_y->read(); + + // anything changed since last time? + if (buttons != m_mouse_last_b || x != m_mouse_last_x || y != m_mouse_last_y) + { + // mouse header + transmit_byte(0xef); + + // button state + transmit_byte(0x70 | buttons); + + int8_t dx = x - m_mouse_last_x; + int8_t dy = y - m_mouse_last_y; + + // y direction change + transmit_byte(0x70 | ((dy >> 4) & 0x0f)); + transmit_byte(0x70 | ((dy >> 0) & 0x0f)); + + // x direction change + transmit_byte(0x70 | ((dx >> 4) & 0x0f)); + transmit_byte(0x70 | ((dx >> 0) & 0x0f)); + + // save mouse state for next run + m_mouse_last_b = buttons; + m_mouse_last_x = x; + m_mouse_last_y = y; + } + } +} |