diff options
Diffstat (limited to 'src/devices/bus/epson_qx/keyboard/keyboard.cpp')
-rw-r--r-- | src/devices/bus/epson_qx/keyboard/keyboard.cpp | 205 |
1 files changed, 205 insertions, 0 deletions
diff --git a/src/devices/bus/epson_qx/keyboard/keyboard.cpp b/src/devices/bus/epson_qx/keyboard/keyboard.cpp new file mode 100644 index 00000000000..6316313fc9d --- /dev/null +++ b/src/devices/bus/epson_qx/keyboard/keyboard.cpp @@ -0,0 +1,205 @@ +// license:BSD-3-Clause +// copyright-holders:Carl, Brian Johnson +/*************************************************************************** + + Epson QX-10 Keyboard Interface + +***************************************************************************/ + +#include "emu.h" +#include "keyboard.h" + +#include "matrix.h" + +#include "cpu/mcs48/mcs48.h" + +#include "qx10ascii.lh" +#include "qx10hasci.lh" + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +DEFINE_DEVICE_TYPE(EPSON_QX_KEYBOARD_PORT, bus::epson_qx::keyboard::keyboard_port_device, "epson_qx_kbd", "Epson QX-10 Keyboard Port") +DEFINE_DEVICE_TYPE(QX10_KEYBOARD_HASCI, bus::epson_qx::keyboard::qx10_keyboard_hasci, "qx10_keyboard_hasci", "Epson QX-10 Keyboard (HASCI)") +DEFINE_DEVICE_TYPE(QX10_KEYBOARD_ASCII, bus::epson_qx::keyboard::qx10_keyboard_ascii, "qx10_keyboard_ascii", "Epson QX-10 Keyboard (ASCII)") + + +namespace bus::epson_qx::keyboard { + +//************************************************************************** +// SLOT DEVICE +//************************************************************************** + +//------------------------------------------------- +// keyboard_port_device - constructor +//------------------------------------------------- + +keyboard_port_device::keyboard_port_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, EPSON_QX_KEYBOARD_PORT, tag, owner, clock) + , device_single_card_slot_interface<keyboard_device>(mconfig, *this) + , m_kbd(nullptr) + , m_txd_handler(*this) +{ +} + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void keyboard_port_device::device_start() +{ +} + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void keyboard_port_device::device_reset() +{ + // get connected keyboard + m_kbd = get_card_device(); +} + +void keyboard_port_device::txd_w(int state) +{ + m_txd_handler(state); +} + +//------------------------------------------------- +// +// host to module interface +//------------------------------------------------- + +void keyboard_port_device::rxd_w(int state) +{ + if (m_kbd) + m_kbd->rxd_w(state); +} + +void keyboard_port_device::clk_w(int state) +{ + if (m_kbd) + m_kbd->clk_w(state); +} + +ROM_START(qx10kbd) + ROM_REGION(0x0800, "mcu", 0) + ROM_LOAD("mbl8049h.5a", 0x0000, 0x0800, CRC(8615e159) SHA1(26b7f447acfe2c605dbe0fc98e6c777f0fa8a94d)) +ROM_END + +//************************************************************************** +// KEYBOARD DEVICE +//************************************************************************** + +//------------------------------------------------- +// keyboard_device - constructor +//------------------------------------------------- + +keyboard_device::keyboard_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, type, tag, owner, clock) + , device_interface(*this, "epson_qx_kbd") + , m_rows(*this, "LINE%X", 0U) + , m_mcu(*this, "mcu") + , m_leds(*this, "led%u", 0U) +{ + m_host = dynamic_cast<keyboard_port_device *>(this->owner()); +} + +tiny_rom_entry const *keyboard_device::device_rom_region() const +{ + return ROM_NAME(qx10kbd); +} + +void keyboard_device::device_add_mconfig(machine_config &config) +{ + auto &mcu(I8049(config, "mcu", 11_MHz_XTAL)); + mcu.p1_out_cb().set(FUNC(keyboard_device::mcu_p1_w)); + mcu.p2_out_cb().set(FUNC(keyboard_device::mcu_p2_w)); + 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; }); + + config.set_default_layout(layout()); +} + +void keyboard_device::device_start() +{ + m_leds.resolve(); + + m_clk_state = 0; + + save_item(NAME(m_rxd)); + save_item(NAME(m_row)); + save_item(NAME(m_clk_state)); +} + +void keyboard_device::mcu_p1_w(uint8_t data) +{ + m_row = data & 0xf; + m_host->txd_w(BIT(data, 7)); +} + +void keyboard_device::mcu_p2_w(uint8_t data) +{ + for (int i = 0; i < 8; ++i) { + m_leds[i] = BIT(data, i); + } +} + +void keyboard_device::rxd_w(int state) +{ + m_rxd = state; +} + +void keyboard_device::clk_w(int state) +{ + m_clk_state = !state; +} + +//************************************************************************** +// HASCI KEYBOARD DEVICE +//************************************************************************** + +qx10_keyboard_hasci::qx10_keyboard_hasci(const machine_config& mconfig, const char* tag, device_t* owner, uint32_t clock) + : keyboard_device(mconfig, QX10_KEYBOARD_HASCI, tag, owner, clock) +{ +} + +ioport_constructor qx10_keyboard_hasci::device_input_ports() const +{ + return INPUT_PORTS_NAME(qx10_keyboard_hasci); +} + +const internal_layout &qx10_keyboard_hasci::layout() const +{ + return layout_qx10hasci; +} + +//************************************************************************** +// ASCII KEYBOARD DEVICE +//************************************************************************** + +qx10_keyboard_ascii::qx10_keyboard_ascii(const machine_config& mconfig, const char* tag, device_t* owner, uint32_t clock) + : keyboard_device(mconfig, QX10_KEYBOARD_ASCII, tag, owner, clock) +{ +} + +ioport_constructor qx10_keyboard_ascii::device_input_ports() const +{ + return INPUT_PORTS_NAME(qx10_keyboard_ascii); +} + +const internal_layout &qx10_keyboard_ascii::layout() const +{ + return layout_qx10ascii; +} + +void keyboard_devices(device_slot_interface &device) +{ + device.option_add("qx10_hasci", QX10_KEYBOARD_HASCI); + device.option_add("qx10_ascii", QX10_KEYBOARD_ASCII); +} + +} |