From a7ac2f0dae44df944f8e4db97f193281053a0e0e Mon Sep 17 00:00:00 2001 From: cracyc Date: Sat, 29 Sep 2018 22:23:02 -0500 Subject: qx10kbd: add keyboard rom and emulate it [Carl, Frank Hughes] --- src/mame/machine/qx10kbd.cpp | 83 +++++++++++++++++++------------------------- src/mame/machine/qx10kbd.h | 18 +++++++--- 2 files changed, 50 insertions(+), 51 deletions(-) diff --git a/src/mame/machine/qx10kbd.cpp b/src/mame/machine/qx10kbd.cpp index c467b4689ee..4351f1e5caf 100644 --- a/src/mame/machine/qx10kbd.cpp +++ b/src/mame/machine/qx10kbd.cpp @@ -1,73 +1,62 @@ // license:BSD-3-Clause // copyright-holders:Carl -// TODO: dump 8049 mcu; key repeat; LEDs +// TODO: LEDs #include "emu.h" #include "machine/qx10kbd.h" - -#include "machine/keyboard.ipp" +#include "cpu/mcs48/mcs48.h" qx10_keyboard_device::qx10_keyboard_device(const machine_config& mconfig, const char* tag, device_t* owner, uint32_t clock) - : buffered_rs232_device(mconfig, QX10_KEYBOARD, tag, owner, 0) - , device_matrix_keyboard_interface(mconfig, *this, "LINE0", "LINE1", "LINE2", "LINE3", "LINE4", "LINE5", "LINE6", "LINE7", "LINE8", "LINE9", "LINEA", "LINEB", "LINEC", "LINED", "LINEE", "LINEF") + : device_t(mconfig, QX10_KEYBOARD, tag, owner, clock) + , device_rs232_port_interface(mconfig, *this) + , m_rows(*this, "LINE%X", 0U) + , m_mcu(*this, "mcu") { } +ROM_START(qx10kbd) + ROM_REGION(0x0800, "mcu", 0) + ROM_LOAD("mbl8049h.5a", 0x0000, 0x0800, CRC(8615e159) SHA1(26b7f447acfe2c605dbe0fc98e6c777f0fa8a94d)) +ROM_END -void qx10_keyboard_device::device_reset() +tiny_rom_entry const *qx10_keyboard_device::device_rom_region() const { - buffered_rs232_device::device_reset(); - - reset_key_state(); - clear_fifo(); - - set_data_frame(1, 8, PARITY_EVEN, STOP_BITS_1); - set_rate(1'200); - receive_register_reset(); - transmit_register_reset(); - - output_dcd(0); - output_dsr(0); - output_cts(0); - output_rxd(1); - - start_processing(attotime::from_hz(2'400)); + return ROM_NAME(qx10kbd); } +void qx10_keyboard_device::device_start() +{ + m_bit_timer = timer_alloc(); + m_bit_timer->adjust(attotime::from_hz(2400), 0, attotime::from_hz(2400)); + m_clk_state = 0; +} -void qx10_keyboard_device::key_make(uint8_t row, uint8_t column) +WRITE_LINE_MEMBER(qx10_keyboard_device::input_txd) { - transmit_byte((column << 4) | row); + m_rxd = state; } +void qx10_keyboard_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +{ + m_clk_state = !m_clk_state; +} -void qx10_keyboard_device::received_byte(uint8_t data) +WRITE8_MEMBER(qx10_keyboard_device::mcu_p1_w) { - switch (data & 0xe0) - { - case 0x00: // set repeat start - break; - case 0x20: // set repeat interval - break; - case 0x40: // set LED - break; - case 0x60: // get LED - transmit_byte(0); - break; - case 0x80: // get SW - break; - case 0xa0: // set repeat - break; - case 0xc0: // enable keyboard - break; - case 0xe0: - if (!(data & 1)) - transmit_byte(0); - break; - } + m_row = data & 0xf; + output_rxd(BIT(data, 7)); } +void qx10_keyboard_device::device_add_mconfig(machine_config &config) +{ + auto &mcu(I8049(config, "mcu", 11_MHz_XTAL)); + mcu.p1_out_cb().set(FUNC(qx10_keyboard_device::mcu_p1_w)); + mcu.p2_out_cb().set([this](u8 data) { /* leds */ }); + mcu.bus_in_cb().set([this]() { return m_rows[m_row]->read(); }); + mcu.t1_in_cb().set([this]() { return m_rxd; }); + mcu.t0_in_cb().set([this]() { return m_clk_state; }); +} static INPUT_PORTS_START( qx10_keyboard ) PORT_START("LINE0") diff --git a/src/mame/machine/qx10kbd.h b/src/mame/machine/qx10kbd.h index b351fd4ef73..a93a53aa80e 100644 --- a/src/mame/machine/qx10kbd.h +++ b/src/mame/machine/qx10kbd.h @@ -9,18 +9,28 @@ #include "machine/keyboard.h" -class qx10_keyboard_device : public buffered_rs232_device<16U>, protected device_matrix_keyboard_interface<16U> +class qx10_keyboard_device + : public device_t + , public device_rs232_port_interface { public: qx10_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); virtual ioport_constructor device_input_ports() const override; + virtual DECLARE_WRITE_LINE_MEMBER(input_txd) override; + DECLARE_WRITE8_MEMBER(mcu_p1_w); protected: - virtual void device_reset() override; - virtual void key_make(uint8_t row, uint8_t column) override; + virtual const tiny_rom_entry *device_rom_region() const override; + virtual void device_add_mconfig(machine_config &config) override; + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; + virtual void device_start() override; private: - virtual void received_byte(uint8_t data) override; + required_ioport_array<16> m_rows; + required_device m_mcu; + emu_timer *m_bit_timer; + u8 m_line, m_rxd, m_clk; + int m_row, m_clk_state; }; DECLARE_DEVICE_TYPE(QX10_KEYBOARD, qx10_keyboard_device) -- cgit v1.2.3