diff options
25 files changed, 1757 insertions, 1601 deletions
diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua index fa5f6dabd15..727b8acb029 100644 --- a/scripts/src/bus.lua +++ b/scripts/src/bus.lua @@ -1657,6 +1657,7 @@ if (BUSES["RS232"]~=null) then MAME_DIR .. "src/devices/bus/rs232/printer.cpp", MAME_DIR .. "src/devices/bus/rs232/printer.h", MAME_DIR .. "src/devices/bus/rs232/rs232.cpp", + MAME_DIR .. "src/devices/bus/rs232/rs232.ipp", MAME_DIR .. "src/devices/bus/rs232/rs232.h", MAME_DIR .. "src/devices/bus/rs232/pty.cpp", MAME_DIR .. "src/devices/bus/rs232/pty.h", diff --git a/scripts/src/machine.lua b/scripts/src/machine.lua index 45753bf8bde..fd9fd3d8ee4 100644 --- a/scripts/src/machine.lua +++ b/scripts/src/machine.lua @@ -18,6 +18,7 @@ files { MAME_DIR .. "src/devices/machine/clock.h", MAME_DIR .. "src/devices/machine/keyboard.cpp", MAME_DIR .. "src/devices/machine/keyboard.h", + MAME_DIR .. "src/devices/machine/keyboard.ipp", MAME_DIR .. "src/devices/machine/laserdsc.cpp", MAME_DIR .. "src/devices/machine/laserdsc.h", MAME_DIR .. "src/devices/machine/latch.cpp", diff --git a/src/devices/bus/rs232/keyboard.cpp b/src/devices/bus/rs232/keyboard.cpp index af8cb01420b..c9064aca578 100644 --- a/src/devices/bus/rs232/keyboard.cpp +++ b/src/devices/bus/rs232/keyboard.cpp @@ -2,35 +2,8 @@ // copyright-holders:smf #include "keyboard.h" -serial_keyboard_device::serial_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) - : generic_keyboard_device(mconfig, SERIAL_KEYBOARD, "Serial Keyboard", tag, owner, clock, "serial_keyboard", __FILE__), - device_serial_interface(mconfig, *this), - device_rs232_port_interface(mconfig, *this), - m_curr_key(0), - m_key_valid(false), - m_rs232_txbaud(*this, "RS232_TXBAUD"), - m_rs232_startbits(*this, "RS232_STARTBITS"), - m_rs232_databits(*this, "RS232_DATABITS"), - m_rs232_parity(*this, "RS232_PARITY"), - m_rs232_stopbits(*this, "RS232_STOPBITS") -{ -} - -serial_keyboard_device::serial_keyboard_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source) - : generic_keyboard_device(mconfig, type, name, tag, owner, clock, shortname, source), - device_serial_interface(mconfig, *this), - device_rs232_port_interface(mconfig, *this), - m_curr_key(0), - m_key_valid(false), - m_rs232_txbaud(*this, "RS232_TXBAUD"), - m_rs232_startbits(*this, "RS232_STARTBITS"), - m_rs232_databits(*this, "RS232_DATABITS"), - m_rs232_parity(*this, "RS232_PARITY"), - m_rs232_stopbits(*this, "RS232_STOPBITS") -{ -} - -static INPUT_PORTS_START(serial_keyboard) +namespace { +INPUT_PORTS_START(serial_keyboard) PORT_INCLUDE(generic_keyboard) MCFG_RS232_BAUD("RS232_TXBAUD", RS232_BAUD_9600, "TX Baud", serial_keyboard_device, update_serial) @@ -39,6 +12,28 @@ static INPUT_PORTS_START(serial_keyboard) MCFG_RS232_PARITY("RS232_PARITY", RS232_PARITY_NONE, "Parity", serial_keyboard_device, update_serial) MCFG_RS232_STOPBITS("RS232_STOPBITS", RS232_STOPBITS_1, "Stop Bits", serial_keyboard_device, update_serial) INPUT_PORTS_END +} // anonymous namespace + +serial_keyboard_device::serial_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : serial_keyboard_device(mconfig, SERIAL_KEYBOARD, "Serial Keyboard", tag, owner, clock, "serial_keyboard", __FILE__) +{ +} + +serial_keyboard_device::serial_keyboard_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source) + : generic_keyboard_device(mconfig, type, name, tag, owner, clock, shortname, source) + , device_serial_interface(mconfig, *this) + , device_rs232_port_interface(mconfig, *this) + , m_fifo{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } + , m_head(0) + , m_tail(0) + , m_empty(0) + , m_rs232_txbaud(*this, "RS232_TXBAUD") + , m_rs232_startbits(*this, "RS232_STARTBITS") + , m_rs232_databits(*this, "RS232_DATABITS") + , m_rs232_parity(*this, "RS232_PARITY") + , m_rs232_stopbits(*this, "RS232_STOPBITS") +{ +} ioport_constructor serial_keyboard_device::device_input_ports() const { @@ -49,11 +44,19 @@ void serial_keyboard_device::device_start() { generic_keyboard_device::device_start(); device_serial_interface::register_save_state(machine().save(), this); - save_item(NAME(m_curr_key)); - save_item(NAME(m_key_valid)); + + save_item(NAME(m_fifo)); + save_item(NAME(m_head)); + save_item(NAME(m_tail)); + save_item(NAME(m_empty)); } -WRITE_LINE_MEMBER(serial_keyboard_device::update_serial) +WRITE_LINE_MEMBER( serial_keyboard_device::input_txd ) +{ + device_serial_interface::rx_w(state); +} + +WRITE_LINE_MEMBER( serial_keyboard_device::update_serial ) { reset(); } @@ -62,14 +65,18 @@ void serial_keyboard_device::device_reset() { generic_keyboard_device::device_reset(); - int startbits = convert_startbits(m_rs232_startbits->read()); - int databits = convert_databits(m_rs232_databits->read()); - parity_t parity = convert_parity(m_rs232_parity->read()); - stop_bits_t stopbits = convert_stopbits(m_rs232_stopbits->read()); + std::fill(std::begin(m_fifo), std::end(m_fifo), 0U); + m_head = m_tail = 0; + m_empty = 1; + + int const startbits = convert_startbits(m_rs232_startbits->read()); + int const databits = convert_databits(m_rs232_databits->read()); + parity_t const parity = convert_parity(m_rs232_parity->read()); + stop_bits_t const stopbits = convert_stopbits(m_rs232_stopbits->read()); set_data_frame(startbits, databits, parity, stopbits); - int txbaud = convert_baud(m_rs232_txbaud->read()); + int const txbaud = convert_baud(m_rs232_txbaud->read()); set_tra_rate(txbaud); output_rxd(1); @@ -79,25 +86,36 @@ void serial_keyboard_device::device_reset() output_dsr(0); output_cts(0); receive_register_reset(); + transmit_register_reset(); } void serial_keyboard_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) { - if (id) - device_serial_interface::device_timer(timer, id, param, ptr); - else - generic_keyboard_device::device_timer(timer, id, param, ptr); + // give both bases a chance to handle it + device_serial_interface::device_timer(timer, id, param, ptr); + generic_keyboard_device::device_timer(timer, id, param, ptr); } void serial_keyboard_device::send_key(UINT8 code) { - if(is_transmit_register_empty()) + assert(!m_empty || (m_head == m_tail)); + assert(m_head < ARRAY_LENGTH(m_fifo)); + assert(m_tail < ARRAY_LENGTH(m_fifo)); + + if (m_empty && is_transmit_register_empty()) { transmit_register_setup(code); - return; } - m_key_valid = true; - m_curr_key = code; + else if (m_empty || (m_head != m_tail)) + { + m_fifo[m_tail] = code; + m_tail = (m_tail + 1) & 0x0fU; + m_empty = 0; + } + else + { + logerror("FIFO overrun (code = 0x%02x)", code); + } } void serial_keyboard_device::tra_callback() @@ -107,10 +125,15 @@ void serial_keyboard_device::tra_callback() void serial_keyboard_device::tra_complete() { - if(m_key_valid) + assert(!m_empty || (m_head == m_tail)); + assert(m_head < ARRAY_LENGTH(m_fifo)); + assert(m_tail < ARRAY_LENGTH(m_fifo)); + + if (!m_empty) { - transmit_register_setup(m_curr_key); - m_key_valid = false; + transmit_register_setup(m_fifo[m_head]); + m_head = (m_head + 1) & 0x0fU; + m_empty = (m_head == m_tail) ? 1 : 0; } } diff --git a/src/devices/bus/rs232/keyboard.h b/src/devices/bus/rs232/keyboard.h index 37e2097b8fb..1f36cab145f 100644 --- a/src/devices/bus/rs232/keyboard.h +++ b/src/devices/bus/rs232/keyboard.h @@ -1,26 +1,23 @@ // license:BSD-3-Clause // copyright-holders:smf -#ifndef __RS232_KEYBOARD_H__ -#define __RS232_KEYBOARD_H__ +#ifndef MAME_BUS_RS232_KEYBOARD_H +#define MAME_BUS_RS232_KEYBOARD_H #pragma once #include "rs232.h" #include "machine/keyboard.h" -class serial_keyboard_device : - public generic_keyboard_device, - public device_serial_interface, - public device_rs232_port_interface +class serial_keyboard_device : public generic_keyboard_device, public device_serial_interface, public device_rs232_port_interface { public: serial_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); serial_keyboard_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source); - virtual DECLARE_WRITE_LINE_MEMBER( input_txd ) override { device_serial_interface::rx_w(state); } - virtual ioport_constructor device_input_ports() const override; + virtual DECLARE_WRITE_LINE_MEMBER( input_txd ) override; + DECLARE_WRITE_LINE_MEMBER(update_serial); protected: @@ -32,8 +29,8 @@ protected: virtual void send_key(UINT8 code) override; private: - UINT8 m_curr_key; - bool m_key_valid; + UINT8 m_fifo[16]; + UINT8 m_head, m_tail, m_empty; required_ioport m_rs232_txbaud; required_ioport m_rs232_startbits; @@ -44,4 +41,4 @@ private: extern const device_type SERIAL_KEYBOARD; -#endif /* __RS232_KEYBOARD_H__ */ +#endif // MAME_BUS_RS232_KEYBOARD_H diff --git a/src/devices/bus/rs232/rs232.h b/src/devices/bus/rs232/rs232.h index 75e1e963eca..c48b529a589 100644 --- a/src/devices/bus/rs232/rs232.h +++ b/src/devices/bus/rs232/rs232.h @@ -1,7 +1,7 @@ // license:BSD-3-Clause -// copyright-holders:smf -#ifndef __BUS_RS232_H__ -#define __BUS_RS232_H__ +// copyright-holders:smf,Vas Crabb +#ifndef MAME_BUS_RS232_H +#define MAME_BUS_RS232_H #pragma once @@ -256,8 +256,35 @@ protected: } }; +template <UINT32 FIFO_LENGTH> +class buffered_rs232_device : public device_t, public device_serial_interface, public device_rs232_port_interface +{ +public: + virtual DECLARE_WRITE_LINE_MEMBER( input_txd ) override; + +protected: + buffered_rs232_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source); + + virtual void device_start() override; + virtual void tra_callback() override; + virtual void tra_complete() override; + virtual void rcv_complete() override; + + void clear_fifo(); + void transmit_byte(UINT8 byte); + + using device_serial_interface::device_timer; + +private: + virtual void received_byte(UINT8 byte) = 0; + + UINT8 m_fifo[FIFO_LENGTH]; + UINT32 m_head, m_tail; + UINT8 m_empty; +}; + extern const device_type RS232_PORT; SLOT_INTERFACE_EXTERN( default_rs232_devices ); -#endif +#endif // MAME_BUS_RS232_H diff --git a/src/devices/bus/rs232/rs232.ipp b/src/devices/bus/rs232/rs232.ipp new file mode 100644 index 00000000000..cf0c44b7f6b --- /dev/null +++ b/src/devices/bus/rs232/rs232.ipp @@ -0,0 +1,110 @@ +// license:BSD-3-Clause +// copyright-holders:smf,Vas Crabb +#ifndef MAME_BUS_RS232_IPP +#define MAME_BUS_RS232_IPP + +#include "rs232.h" + + +template <UINT32 FIFO_LENGTH> +WRITE_LINE_MEMBER( buffered_rs232_device<FIFO_LENGTH>::input_txd ) +{ + device_serial_interface::rx_w(state); +} + + +template <UINT32 FIFO_LENGTH> +buffered_rs232_device<FIFO_LENGTH>::buffered_rs232_device( + const machine_config &mconfig, + device_type type, + const char *name, + const char *tag, + device_t *owner, + UINT32 clock, + const char *shortname, + const char *source) + : device_t(mconfig, type, name, tag, owner, clock, shortname, source) + , device_serial_interface(mconfig, *this) + , device_rs232_port_interface(mconfig, *this) + , m_head(0U) + , m_tail(0U) + , m_empty(1U) +{ +} + + +template <UINT32 FIFO_LENGTH> +void buffered_rs232_device<FIFO_LENGTH>::device_start() +{ + device_serial_interface::register_save_state(machine().save(), this); + + save_item(NAME(m_fifo)); + save_item(NAME(m_head)); + save_item(NAME(m_tail)); + save_item(NAME(m_empty)); +} + + +template <UINT32 FIFO_LENGTH> +void buffered_rs232_device<FIFO_LENGTH>::tra_callback() +{ + output_rxd(transmit_register_get_data_bit()); +} + + +template <UINT32 FIFO_LENGTH> +void buffered_rs232_device<FIFO_LENGTH>::tra_complete() +{ + assert(!m_empty || (m_head == m_tail)); + assert(m_head < ARRAY_LENGTH(m_fifo)); + assert(m_tail < ARRAY_LENGTH(m_fifo)); + + if (!m_empty) + { + transmit_register_setup(m_fifo[m_head]); + m_head = (m_head + 1U) % FIFO_LENGTH; + m_empty = (m_head == m_tail) ? 1U : 0U; + } +} + + +template <UINT32 FIFO_LENGTH> +void buffered_rs232_device<FIFO_LENGTH>::rcv_complete() +{ + receive_register_extract(); + received_byte(get_received_char()); +} + + +template <UINT32 FIFO_LENGTH> +void buffered_rs232_device<FIFO_LENGTH>::clear_fifo() +{ + m_head = m_tail = 0U; + m_empty = 1U; +} + + +template <UINT32 FIFO_LENGTH> +void buffered_rs232_device<FIFO_LENGTH>::transmit_byte(UINT8 byte) +{ + assert(!m_empty || (m_head == m_tail)); + assert(m_head < ARRAY_LENGTH(m_fifo)); + assert(m_tail < ARRAY_LENGTH(m_fifo)); + + if (m_empty && is_transmit_register_empty()) + { + transmit_register_setup(byte); + } + else if (m_empty || (m_head != m_tail)) + { + m_fifo[m_tail] = byte; + m_tail = (m_tail + 1U) & FIFO_LENGTH; + m_empty = 0U; + } + else + { + logerror("FIFO overrun (byte = 0x%02x)", byte); + } +} + +#endif // MAME_BUS_RS232_IPP diff --git a/src/devices/bus/rs232/terminal.cpp b/src/devices/bus/rs232/terminal.cpp index c242184b387..26d52344b27 100644 --- a/src/devices/bus/rs232/terminal.cpp +++ b/src/devices/bus/rs232/terminal.cpp @@ -3,17 +3,19 @@ #include "terminal.h" serial_terminal_device::serial_terminal_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) - : generic_terminal_device(mconfig, SERIAL_TERMINAL, "Serial Terminal", tag, owner, clock, "serial_terminal", __FILE__), - device_serial_interface(mconfig, *this), - device_rs232_port_interface(mconfig, *this), - m_rs232_txbaud(*this, "RS232_TXBAUD"), - m_rs232_rxbaud(*this, "RS232_RXBAUD"), - m_rs232_startbits(*this, "RS232_STARTBITS"), - m_rs232_databits(*this, "RS232_DATABITS"), - m_rs232_parity(*this, "RS232_PARITY"), - m_rs232_stopbits(*this, "RS232_STOPBITS"), - m_curr_key(0), - m_key_valid(false) + : generic_terminal_device(mconfig, SERIAL_TERMINAL, "Serial Terminal", tag, owner, clock, "serial_terminal", __FILE__) + , device_serial_interface(mconfig, *this) + , device_rs232_port_interface(mconfig, *this) + , m_rs232_txbaud(*this, "RS232_TXBAUD") + , m_rs232_rxbaud(*this, "RS232_RXBAUD") + , m_rs232_startbits(*this, "RS232_STARTBITS") + , m_rs232_databits(*this, "RS232_DATABITS") + , m_rs232_parity(*this, "RS232_PARITY") + , m_rs232_stopbits(*this, "RS232_STOPBITS") + , m_fifo{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } + , m_head(0) + , m_tail(0) + , m_empty(0) { } @@ -36,21 +38,31 @@ ioport_constructor serial_terminal_device::device_input_ports() const void serial_terminal_device::device_start() { generic_terminal_device::device_start(); + device_serial_interface::register_save_state(machine().save(), this); + + save_item(NAME(m_fifo)); + save_item(NAME(m_head)); + save_item(NAME(m_tail)); + save_item(NAME(m_empty)); } WRITE_LINE_MEMBER(serial_terminal_device::update_serial) { - int startbits = convert_startbits(m_rs232_startbits->read()); - int databits = convert_databits(m_rs232_databits->read()); - parity_t parity = convert_parity(m_rs232_parity->read()); - stop_bits_t stopbits = convert_stopbits(m_rs232_stopbits->read()); + std::fill(std::begin(m_fifo), std::end(m_fifo), 0U); + m_head = m_tail = 0; + m_empty = 1; + + int const startbits = convert_startbits(m_rs232_startbits->read()); + int const databits = convert_databits(m_rs232_databits->read()); + parity_t const parity = convert_parity(m_rs232_parity->read()); + stop_bits_t const stopbits = convert_stopbits(m_rs232_stopbits->read()); set_data_frame(startbits, databits, parity, stopbits); - int txbaud = convert_baud(m_rs232_txbaud->read()); + int const txbaud = convert_baud(m_rs232_txbaud->read()); set_tra_rate(txbaud); - int rxbaud = convert_baud(m_rs232_rxbaud->read()); + int const rxbaud = convert_baud(m_rs232_rxbaud->read()); set_rcv_rate(rxbaud); output_rxd(1); @@ -59,6 +71,8 @@ WRITE_LINE_MEMBER(serial_terminal_device::update_serial) output_dcd(0); output_dsr(0); output_cts(0); + receive_register_reset(); + transmit_register_reset(); } void serial_terminal_device::device_reset() @@ -70,19 +84,30 @@ void serial_terminal_device::device_reset() void serial_terminal_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) { + generic_terminal_device::device_timer(timer, id, param, ptr); device_serial_interface::device_timer(timer, id, param, ptr); } void serial_terminal_device::send_key(UINT8 code) { - if (is_transmit_register_empty()) + assert(!m_empty || (m_head == m_tail)); + assert(m_head < ARRAY_LENGTH(m_fifo)); + assert(m_tail < ARRAY_LENGTH(m_fifo)); + + if (m_empty && is_transmit_register_empty()) { transmit_register_setup(code); - return; } - - m_key_valid = true; - m_curr_key = code; + else if (m_empty || (m_head != m_tail)) + { + m_fifo[m_tail] = code; + m_tail = (m_tail + 1) & 0x0fU; + m_empty = 0; + } + else + { + logerror("FIFO overrun (code = 0x%02x)", code); + } } void serial_terminal_device::tra_callback() @@ -92,10 +117,15 @@ void serial_terminal_device::tra_callback() void serial_terminal_device::tra_complete() { - if (m_key_valid) + assert(!m_empty || (m_head == m_tail)); + assert(m_head < ARRAY_LENGTH(m_fifo)); + assert(m_tail < ARRAY_LENGTH(m_fifo)); + + if (!m_empty) { - transmit_register_setup(m_curr_key); - m_key_valid = false; + transmit_register_setup(m_fifo[m_head]); + m_head = (m_head + 1) & 0x0fU; + m_empty = (m_head == m_tail) ? 1 : 0; } } diff --git a/src/devices/bus/rs232/terminal.h b/src/devices/bus/rs232/terminal.h index 0cde8f71f32..9ac4b26aff8 100644 --- a/src/devices/bus/rs232/terminal.h +++ b/src/devices/bus/rs232/terminal.h @@ -37,8 +37,8 @@ private: required_ioport m_rs232_parity; required_ioport m_rs232_stopbits; - UINT8 m_curr_key; - bool m_key_valid; + UINT8 m_fifo[16]; + UINT8 m_head, m_tail, m_empty; }; extern const device_type SERIAL_TERMINAL; diff --git a/src/devices/bus/sunkbd/hlekbd.cpp b/src/devices/bus/sunkbd/hlekbd.cpp index 87f5d799905..54355cf376d 100644 --- a/src/devices/bus/sunkbd/hlekbd.cpp +++ b/src/devices/bus/sunkbd/hlekbd.cpp @@ -849,14 +849,14 @@ void hle_device_base::device_start() void hle_device_base::device_reset() { // initialise state - std::fill(std::begin(m_current_keys), std::end(m_current_keys), 0x0000U); - m_next_row = 0; - std::fill(std::begin(m_fifo), std::end(m_fifo), 0); - m_head = m_tail = 0; - m_empty = 1; + std::fill(std::begin(m_current_keys), std::end(m_current_keys), UINT16(0x0000U)); + m_next_row = 0U; + std::fill(std::begin(m_fifo), std::end(m_fifo), UINT8(0x00U)); + m_head = m_tail = 0U; + m_empty = 1U; m_rx_state = RX_IDLE; - m_keyclick = 0; - m_beeper_state = 0; + m_keyclick = 0U; + m_beeper_state = 0x00U; // configure device_serial_interface set_data_frame(START_BIT_COUNT, DATA_BIT_COUNT, PARITY, STOP_BITS); diff --git a/src/devices/machine/keyboard.cpp b/src/devices/machine/keyboard.cpp index d801bbf7dcf..fa03e41faa1 100644 --- a/src/devices/machine/keyboard.cpp +++ b/src/devices/machine/keyboard.cpp @@ -1,5 +1,5 @@ // license:BSD-3-Clause -// copyright-holders:smf +// copyright-holders:Vas Crabb /*************************************************************************** Generic ASCII Keyboard @@ -24,378 +24,349 @@ WRITE8_MEMBER( xxx_state::kbd_put ) ***************************************************************************/ -#include "machine/keyboard.h" +#include "machine/keyboard.ipp" + + + +namespace { +UINT8 const TRANSLATION_TABLE[][2][4][16] = { + { + { // ANSI + { '`', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', 0x08U, 0x7fU, 0x1bU }, + { 0x09U, 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', '\\', 0xffU, 0xffU }, + { 0xffU, 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', '\'', 0x0dU, 0xffU, 0xffU, 0xffU }, + { 0xffU, '\\', 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', 0xffU, 0xffU, 0xffU, ' ' } + }, + { // JIS + { '\\', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '^', 0x08U, 0x7fU, 0x1bU }, + { 0x09U, 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '@', '[', ']', 0xffU, 0xffU }, + { 0xffU, 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', ':', 0x0dU, 0xffU, 0xffU, 0xffU }, + { 0xffU, '\\', 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', 0xffU, 0xffU, 0xffU, ' ' } + } + }, + { + { // ANSI shift + { '~', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', 0x08U, 0x7fU, 0x1bU }, + { 0x09U, 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '{', '}', '|', 0xffU, 0xffU }, + { 0xffU, 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', '"', 0x0dU, 0xffU, 0xffU, 0xffU }, + { 0xffU, '_', 'Z', 'X', 'C', 'V', 'B', 'N', 'M', '<', '>', '?', 0xffU, 0xffU, 0xffU, ' ' } + }, + { // JIS shift + { '|', '!', '"', '#', '$', '%', '&', '\'', '(', ')', 0xffU, '=', '~', 0x08U, 0x7fU, 0x1bU }, + { 0x09U, 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '`', '{', '}', 0xffU, 0xffU }, + { 0xffU, 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', '+', '*', 0x0dU, 0xffU, 0xffU, 0xffU }, + { 0xffU, '_', 'Z', 'X', 'C', 'V', 'B', 'N', 'M', '<', '>', '?', 0xffU, 0xffU, 0xffU, ' ' } + } + }, + { + { // ANSI ctrl + { 0x00U, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 0x1fU, 0x1eU, 0x08U, 0x7fU, 0x1bU }, + { 0x09U, 0x11U, 0x17U, 0x05U, 0x12U, 0x14U, 0x19U, 0x15U, 0x09U, 0x0fU, 0x10U, 0x1bU, 0x1dU, 0x1cU, 0xffU, 0xffU }, + { 0xffU, 0x01U, 0x13U, 0x04U, 0x06U, 0x07U, 0x08U, 0x0aU, 0x0bU, 0x0cU, ';', '\'', 0x0dU, 0xffU, 0xffU, 0xffU }, + { 0xffU, 0x1cU, 0x1aU, 0x18U, 0x03U, 0x16U, 0x02U, 0x0eU, 0x0dU, ',', '.', 0x1fU, 0xffU, 0xffU, 0xffU, 0x00U } + }, + { // JIS ctrl + { 0x1cU, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 0x1fU, 0x1eU, 0x08U, 0x7fU, 0x1bU }, + { 0x09U, 0x11U, 0x17U, 0x05U, 0x12U, 0x14U, 0x19U, 0x15U, 0x09U, 0x0fU, 0x10U, 0x00U, 0x1bU, 0x1dU, 0xffU, 0xffU }, + { 0xffU, 0x01U, 0x13U, 0x04U, 0x06U, 0x07U, 0x08U, 0x0aU, 0x0bU, 0x0cU, ';', ':', 0x0dU, 0xffU, 0xffU, 0xffU }, + { 0xffU, 0x1cU, 0x1aU, 0x18U, 0x03U, 0x16U, 0x02U, 0x0eU, 0x0dU, ',', '.', 0x1fU, 0xffU, 0xffU, 0xffU, 0x00U } + } + } +}; + + +bool const CAPS_TABLE[4][16] = { + { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false }, + { false, true, true, true, true, true, true, true, true, true, true, false, false, false, false, false }, + { false, true, true, true, true, true, true, true, true, true, false, false, false, false, false, false }, + { false, false, true, true, true, true, true, true, true, false, false, false, false, false, false, false } +}; + +} // anonymous namespace + + + +/*************************************************************************** + REUSABLE I/O PORTS +***************************************************************************/ + +INPUT_PORTS_START( generic_keyboard ) + PORT_START("GENKBD_CFG") + PORT_CONFNAME( 0x0001U, 0x0000U, "Layout" ) + PORT_CONFSETTING( 0x0000U, "ANSI" ) + PORT_CONFSETTING( 0x0001U, "JIS" ) + PORT_CONFNAME( 0x0006U, 0x0004U, "Typematic Delay" ) + PORT_CONFSETTING( 0x0000U, "0.25s" ) + PORT_CONFSETTING( 0x0002U, "0.5s" ) + PORT_CONFSETTING( 0x0004U, "0.75s" ) + PORT_CONFSETTING( 0x0006U, "1.0s" ) + PORT_CONFNAME( 0x00f8U, 0x0098U, "Typematic Rate" ) + PORT_CONFSETTING( 0x0000U, "2.0cps" ) + PORT_CONFSETTING( 0x0008U, "2.1cps" ) + PORT_CONFSETTING( 0x0010U, "2.5cps" ) + PORT_CONFSETTING( 0x0018U, "2.7cps" ) + PORT_CONFSETTING( 0x0020U, "2.0cps" ) + PORT_CONFSETTING( 0x0028U, "2.1cps" ) + PORT_CONFSETTING( 0x0030U, "2.5cps" ) + PORT_CONFSETTING( 0x0038U, "2.7cps" ) + PORT_CONFSETTING( 0x0040U, "3.3cps" ) + PORT_CONFSETTING( 0x0048U, "3.8cps" ) + PORT_CONFSETTING( 0x0050U, "4.0cps" ) + PORT_CONFSETTING( 0x0058U, "4.3cps" ) + PORT_CONFSETTING( 0x0060U, "4.6cps" ) + PORT_CONFSETTING( 0x0068U, "5.0cps" ) + PORT_CONFSETTING( 0x0070U, "5.5cps" ) + PORT_CONFSETTING( 0x0078U, "6.0cps" ) + PORT_CONFSETTING( 0x0080U, "8.0cps" ) + PORT_CONFSETTING( 0x0088U, "8.6cps" ) + PORT_CONFSETTING( 0x0090U, "9.2cps" ) + PORT_CONFSETTING( 0x0098U, "10.0cps" ) + PORT_CONFSETTING( 0x00a0U, "10.9cps" ) + PORT_CONFSETTING( 0x00a8U, "12.0cps" ) + PORT_CONFSETTING( 0x00b0U, "13.3cps" ) + PORT_CONFSETTING( 0x00b8U, "15.0cps" ) + PORT_CONFSETTING( 0x00c0U, "16.0cps" ) + PORT_CONFSETTING( 0x00c8U, "17.1cps" ) + PORT_CONFSETTING( 0x00d0U, "18.5cps" ) + PORT_CONFSETTING( 0x00d8U, "20.0cps" ) + PORT_CONFSETTING( 0x00e0U, "21.8cps" ) + PORT_CONFSETTING( 0x00e8U, "24.0cps" ) + PORT_CONFSETTING( 0x00f0U, "26.7cps" ) + PORT_CONFSETTING( 0x00f8U, "30.0cps" ) + + PORT_START("GENKBD_MOD") + PORT_BIT( 0x01U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Ctrl") PORT_CODE(KEYCODE_LCONTROL) PORT_CODE(KEYCODE_RCONTROL) PORT_CHAR(UCHAR_MAMEKEY(LCONTROL)) + PORT_BIT( 0x02U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Shift") PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1) + PORT_BIT( 0x04U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Caps Lock") PORT_CODE(KEYCODE_CAPSLOCK) PORT_TOGGLE PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) + PORT_BIT( 0x08U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Meta") PORT_CODE(KEYCODE_LALT) PORT_CODE(KEYCODE_RALT) PORT_CHAR(UCHAR_MAMEKEY(LALT)) + + PORT_START("GENKBD_ROW0") + PORT_BIT( 0x0001U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TILDE) PORT_CONDITION("GENKBD_CFG", 0x01, EQUALS, 0x00) PORT_CHAR('`') PORT_CHAR('~') + PORT_BIT( 0x0001U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TILDE) PORT_CONDITION("GENKBD_CFG", 0x01, EQUALS, 0x01) PORT_CHAR('\\') PORT_CHAR('|') + PORT_BIT( 0x0002U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') + PORT_BIT( 0x0004U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CONDITION("GENKBD_CFG", 0x01, EQUALS, 0x00) PORT_CHAR('2') PORT_CHAR('@') + PORT_BIT( 0x0004U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CONDITION("GENKBD_CFG", 0x01, EQUALS, 0x01) PORT_CHAR('2') PORT_CHAR('"') + PORT_BIT( 0x0008U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') + PORT_BIT( 0x0010U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') + PORT_BIT( 0x0020U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') + PORT_BIT( 0x0040U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CONDITION("GENKBD_CFG", 0x01, EQUALS, 0x00) PORT_CHAR('6') PORT_CHAR('^') + PORT_BIT( 0x0040U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CONDITION("GENKBD_CFG", 0x01, EQUALS, 0x01) PORT_CHAR('6') PORT_CHAR('&') + PORT_BIT( 0x0080U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CONDITION("GENKBD_CFG", 0x01, EQUALS, 0x00) PORT_CHAR('7') PORT_CHAR('&') + PORT_BIT( 0x0080U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CONDITION("GENKBD_CFG", 0x01, EQUALS, 0x01) PORT_CHAR('7') PORT_CHAR('\'') + PORT_BIT( 0x0100U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CONDITION("GENKBD_CFG", 0x01, EQUALS, 0x00) PORT_CHAR('8') PORT_CHAR('*') + PORT_BIT( 0x0100U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CONDITION("GENKBD_CFG", 0x01, EQUALS, 0x01) PORT_CHAR('8') PORT_CHAR('(') + PORT_BIT( 0x0200U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CONDITION("GENKBD_CFG", 0x01, EQUALS, 0x00) PORT_CHAR('9') PORT_CHAR('(') + PORT_BIT( 0x0200U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CONDITION("GENKBD_CFG", 0x01, EQUALS, 0x01) PORT_CHAR('9') PORT_CHAR(')') + PORT_BIT( 0x0400U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CONDITION("GENKBD_CFG", 0x01, EQUALS, 0x00) PORT_CHAR('0') PORT_CHAR('(') + PORT_BIT( 0x0400U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CONDITION("GENKBD_CFG", 0x01, EQUALS, 0x01) PORT_CHAR('0') + PORT_BIT( 0x0800U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_CONDITION("GENKBD_CFG", 0x01, EQUALS, 0x00) PORT_CHAR('-') PORT_CHAR('_') + PORT_BIT( 0x0800U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_CONDITION("GENKBD_CFG", 0x01, EQUALS, 0x01) PORT_CHAR('-') PORT_CHAR('=') + PORT_BIT( 0x1000U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_CONDITION("GENKBD_CFG", 0x01, EQUALS, 0x00) PORT_CHAR('=') PORT_CHAR('+') + PORT_BIT( 0x1000U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_CONDITION("GENKBD_CFG", 0x01, EQUALS, 0x01) PORT_CHAR('^') PORT_CHAR('~') + PORT_BIT( 0x2000U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Backspace") PORT_CHAR(0x08U) + PORT_BIT( 0x4000U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("Del") PORT_CHAR(UCHAR_MAMEKEY(DEL)) + PORT_BIT( 0x8000U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ESC) PORT_NAME("Escape") PORT_CHAR(UCHAR_MAMEKEY(ESC)) + + PORT_START("GENKBD_ROW1") + PORT_BIT( 0x0001U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TAB) PORT_CHAR('\t') + PORT_BIT( 0x0002U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') + PORT_BIT( 0x0004U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') + PORT_BIT( 0x0008U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E') + PORT_BIT( 0x0010U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') + PORT_BIT( 0x0020U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T') + PORT_BIT( 0x0040U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') + PORT_BIT( 0x0080U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') + PORT_BIT( 0x0100U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') + PORT_BIT( 0x0200U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') + PORT_BIT( 0x0400U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') + PORT_BIT( 0x0800U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_CONDITION("GENKBD_CFG", 0x01, EQUALS, 0x00) PORT_CHAR('[') PORT_CHAR('{') + PORT_BIT( 0x0800U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_CONDITION("GENKBD_CFG", 0x01, EQUALS, 0x01) PORT_CHAR('@') PORT_CHAR('`') + PORT_BIT( 0x1000U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CONDITION("GENKBD_CFG", 0x01, EQUALS, 0x00) PORT_CHAR(']') PORT_CHAR('}') + PORT_BIT( 0x1000U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CONDITION("GENKBD_CFG", 0x01, EQUALS, 0x01) PORT_CHAR('[') PORT_CHAR('{') + PORT_BIT( 0x2000U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH) PORT_CONDITION("GENKBD_CFG", 0x01, EQUALS, 0x00) PORT_CHAR('\\') PORT_CHAR('|') + PORT_BIT( 0x2000U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH) PORT_CONDITION("GENKBD_CFG", 0x01, EQUALS, 0x01) PORT_CHAR(']') PORT_CHAR('}') + PORT_BIT( 0x4000U, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x8000U, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("GENKBD_ROW2") + PORT_BIT( 0x0001U, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x0002U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('Q') + PORT_BIT( 0x0004U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('W') + PORT_BIT( 0x0008U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('E') + PORT_BIT( 0x0010U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('R') + PORT_BIT( 0x0020U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('T') + PORT_BIT( 0x0040U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('Y') + PORT_BIT( 0x0080U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('U') + PORT_BIT( 0x0100U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('I') + PORT_BIT( 0x0200U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('O') + PORT_BIT( 0x0400U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_CONDITION("GENKBD_CFG", 0x01, EQUALS, 0x00) PORT_CHAR(';') PORT_CHAR(':') + PORT_BIT( 0x0400U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_CONDITION("GENKBD_CFG", 0x01, EQUALS, 0x01) PORT_CHAR(';') PORT_CHAR('+') + PORT_BIT( 0x0800U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CONDITION("GENKBD_CFG", 0x01, EQUALS, 0x00) PORT_CHAR('\'') PORT_CHAR('"') + PORT_BIT( 0x0800U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CONDITION("GENKBD_CFG", 0x01, EQUALS, 0x01) PORT_CHAR(':') PORT_CHAR('*') + PORT_BIT( 0x1000U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CHAR(0x0dU) + PORT_BIT( 0x2000U, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x4000U, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x8000U, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("GENKBD_ROW3") + PORT_BIT( 0x0001U, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x0002U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH2) PORT_CHAR('\\') PORT_CHAR('_') + PORT_BIT( 0x0004U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') + PORT_BIT( 0x0008U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') + PORT_BIT( 0x0010U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C') + PORT_BIT( 0x0020U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V') + PORT_BIT( 0x0040U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B') + PORT_BIT( 0x0080U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N') + PORT_BIT( 0x0100U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') + PORT_BIT( 0x0200U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<') + PORT_BIT( 0x0400U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>') + PORT_BIT( 0x0800U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') + PORT_BIT( 0x1000U, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x2000U, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x4000U, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x8000U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') +INPUT_PORTS_END + + + +/*************************************************************************** + DEVICE TYPE GLOBALS +***************************************************************************/ + +device_type const GENERIC_KEYBOARD = &device_creator<generic_keyboard_device>; + + /*************************************************************************** IMPLEMENTATION ***************************************************************************/ +generic_keyboard_device::generic_keyboard_device( + machine_config const &mconfig, + device_type type, + char const *name, + char const *tag, + device_t *owner, + UINT32 clock, + char const *shortname, + char const *source) + : device_t(mconfig, type, name, tag, owner, clock, shortname, source) + , device_matrix_keyboard_interface(mconfig, *this, "GENKBD_ROW0", "GENKBD_ROW1", "GENKBD_ROW2", "GENKBD_ROW3") + , m_config(*this, "GENKBD_CFG") + , m_modifiers(*this, "GENKBD_MOD") + , m_last_modifiers(0U) + , m_keyboard_cb(*this) +{ +} + -generic_keyboard_device::generic_keyboard_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source) - : device_t(mconfig, type, name, tag, owner, clock, shortname, source), - m_io_kbd0(*this, "TERM_LINE0"), - m_io_kbd1(*this, "TERM_LINE1"), - m_io_kbd2(*this, "TERM_LINE2"), - m_io_kbd3(*this, "TERM_LINE3"), - m_io_kbd4(*this, "TERM_LINE4"), - m_io_kbd5(*this, "TERM_LINE5"), - m_io_kbd6(*this, "TERM_LINE6"), - m_io_kbd7(*this, "TERM_LINE7"), - m_io_kbd8(*this, "TERM_LINE8"), - m_io_kbd9(*this, "TERM_LINE9"), - m_io_kbdc(*this, "TERM_LINEC"), - m_timer(nullptr), - m_last_code(0), - m_scan_line(0), - m_keyboard_cb(*this) +generic_keyboard_device::generic_keyboard_device(machine_config const &mconfig, char const *tag, device_t *owner, UINT32 clock) + : generic_keyboard_device(mconfig, GENERIC_KEYBOARD, "Generic Keyboard", tag, owner, clock, "generic_keyboard", __FILE__) { } -generic_keyboard_device::generic_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) - : device_t(mconfig, GENERIC_KEYBOARD, "Generic Keyboard", tag, owner, clock, "generic_keyboard", __FILE__), - m_io_kbd0(*this, "TERM_LINE0"), - m_io_kbd1(*this, "TERM_LINE1"), - m_io_kbd2(*this, "TERM_LINE2"), - m_io_kbd3(*this, "TERM_LINE3"), - m_io_kbd4(*this, "TERM_LINE4"), - m_io_kbd5(*this, "TERM_LINE5"), - m_io_kbd6(*this, "TERM_LINE6"), - m_io_kbd7(*this, "TERM_LINE7"), - m_io_kbd8(*this, "TERM_LINE8"), - m_io_kbd9(*this, "TERM_LINE9"), - m_io_kbdc(*this, "TERM_LINEC"), - m_timer(nullptr), - m_last_code(0), - m_scan_line(0), - m_keyboard_cb(*this) + +ioport_constructor generic_keyboard_device::device_input_ports() const { + return INPUT_PORTS_NAME(generic_keyboard); } -UINT8 generic_keyboard_device::row_number(UINT8 code) +void generic_keyboard_device::device_start() { - if BIT(code,0) return 0; - if BIT(code,1) return 1; - if BIT(code,2) return 2; - if BIT(code,3) return 3; - if BIT(code,4) return 4; - if BIT(code,5) return 5; - if BIT(code,6) return 6; - if BIT(code,7) return 7; - return 0; + m_keyboard_cb.resolve_safe(); + + save_item(NAME(m_last_modifiers)); } -UINT8 generic_keyboard_device::keyboard_handler(UINT8 last_code, UINT8 *scan_line) + +void generic_keyboard_device::device_reset() { - int i; - UINT8 code = 0; - UINT8 key_code = 0; - UINT8 retVal = 0; - UINT8 shift = BIT(m_io_kbdc->read(), 1); - UINT8 caps = BIT(m_io_kbdc->read(), 2); - UINT8 ctrl = BIT(m_io_kbdc->read(), 0); - i = *scan_line; - { - if (i == 0) code = m_io_kbd0->read(); - else - if (i == 1) code = m_io_kbd1->read(); - else - if (i == 2) code = m_io_kbd2->read(); - else - if (i == 3) code = m_io_kbd3->read(); - else - if (i == 4) code = m_io_kbd4->read(); - else - if (i == 5) code = m_io_kbd5->read(); - else - if (i == 6) code = m_io_kbd6->read(); - else - if (i == 7) code = m_io_kbd7->read(); - else - if (i == 8) code = m_io_kbd8->read(); - else - if (i == 9) code = m_io_kbd9->read(); - - if (code != 0) - { - if (i==0 && shift==0) { - key_code = 0x30 + row_number(code) + 8*i; // for numbers and some signs - } - if (i==0 && shift==1) { - key_code = 0x20 + row_number(code) + 8*i; // for shifted numbers - } - if (i==1 && shift==0) { - if (row_number(code) < 4) { - key_code = 0x30 + row_number(code) + 8*i; // for numbers and some signs - } else { - key_code = 0x20 + row_number(code) + 8*i; // for numbers and some signs - } - } - if (i==1 && shift==1) { - if (row_number(code) < 4) { - key_code = 0x20 + row_number(code) + 8*i; // for numbers and some signs - } else { - key_code = 0x30 + row_number(code) + 8*i; // for numbers and some signs - } - } - if (i>=2 && i<=4 && (shift ^ caps)==0 && ctrl==0) { - key_code = 0x60 + row_number(code) + (i-2)*8; // for small letters - } - if (i>=2 && i<=4 && (shift ^ caps)==1 && ctrl==0) { - key_code = 0x40 + row_number(code) + (i-2)*8; // for big letters - } - if (i>=2 && i<=5 && ctrl==1) { - key_code = 0x00 + row_number(code) + (i-2)*8; // for CTRL + letters - } - if (i==5 && shift==1 && ctrl==0) { - if (row_number(code)<7) { - if (row_number(code)<3) { - key_code = (caps ? 0x60 : 0x40) + row_number(code) + (i-2)*8; // for big letters - } else { - key_code = 0x60 + row_number(code) + (i-2)*8; // for upper symbols letters - } - } else { - key_code = 0x40 + row_number(code) + (i-2)*8; // for DEL it is switched - } - } - if (i==5 && shift==0 && ctrl==0) { - if (row_number(code)<7) { - if (row_number(code)<3) { - key_code = (caps ? 0x40 : 0x60) + row_number(code) + (i-2)*8; // for small letters - } else { - key_code = 0x40 + row_number(code) + (i-2)*8; // for lower symbols letters - } - } else { - key_code = 0x60 + row_number(code) + (i-2)*8; // for DEL it is switched - } - } - - if (i==6) { - switch(row_number(code)) - { -/* case 0: key_code = 0x11; break; - case 1: key_code = 0x12; break; - case 2: key_code = 0x13; break; - case 3: key_code = 0x14; break;*/ - case 4: key_code = 0x20; break; // Space - case 5: key_code = 0x0A; break; // LineFeed - case 6: key_code = 0x09; break; // TAB - case 7: key_code = 0x0D; break; // Enter - } - } - if (i==7) - { - switch(row_number(code)) - { - case 0: key_code = 0x1B; break; // Escape - case 1: key_code = 0x08; break; // Backspace - } - } - else - if (i==8) - { - key_code = row_number(code)+0x81; - if (ctrl) key_code+=0x10; - if (shift) key_code+=0x20; - } - else - if (i==9) - { - key_code = row_number(code)+0x89; - if (ctrl) key_code+=0x10; - if (shift) key_code+=0x20; - } - - retVal = key_code; - } - else - { - *scan_line += 1; - if (*scan_line==10) - *scan_line = 0; - } - } - return retVal; + reset_key_state(); + m_last_modifiers = 0; + + start_processing(attotime::from_hz(2'400)); + typematic_stop(); } + void generic_keyboard_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) { - UINT8 new_code; - new_code = keyboard_handler(m_last_code, &m_scan_line); - if ((m_last_code != new_code) && (new_code)) - send_key(new_code); - m_last_code = new_code; + device_matrix_keyboard_interface::device_timer(timer, id, param, ptr); } -/*************************************************************************** - VIDEO HARDWARE -***************************************************************************/ -static MACHINE_CONFIG_FRAGMENT( generic_keyboard ) -MACHINE_CONFIG_END +void generic_keyboard_device::key_make(UINT8 row, UINT8 column) +{ + send_translated((row << 4) | column); + typematic_start(row, column, typematic_delay(), typematic_period()); +} + -machine_config_constructor generic_keyboard_device::device_mconfig_additions() const +void generic_keyboard_device::key_repeat(UINT8 row, UINT8 column) { - return MACHINE_CONFIG_NAME(generic_keyboard); + send_translated((row << 4) | column); } -void generic_keyboard_device::device_start() + +void generic_keyboard_device::send_key(UINT8 code) { - m_keyboard_cb.resolve_safe(); - m_timer = timer_alloc(); - save_item(NAME(m_last_code)); - save_item(NAME(m_scan_line)); + m_keyboard_cb(offs_t(0), code); } -void generic_keyboard_device::device_reset() + +bool generic_keyboard_device::translate(UINT8 code, UINT8 &translated) const { - m_last_code = 0; - m_scan_line = 0; - m_timer->adjust(attotime::from_hz(2400), 0, attotime::from_hz(2400)); + unsigned const row((code >> 4) & 0x03U); + unsigned const col((code >> 0) & 0x0fU); + + unsigned const layout(m_config->read() & 0x0001U); + + UINT16 const modifiers(m_modifiers->read()); + bool const shift(bool(modifiers & 0x02U) != (bool(modifiers & 0x04U) && CAPS_TABLE[row][col])); + bool const ctrl(modifiers & 0x01U); + bool const meta(modifiers & 0x08U); + + unsigned const map(ctrl ? 2U : shift ? 1U : 0U); + UINT8 const result(TRANSLATION_TABLE[map][layout][row][col]); + if (result == UINT8(~0U)) + { + return false; + } + else + { + translated = result | (meta ? 0x80U : 0x00U); + return true; + } } -/* -Char Dec Oct Hex | Char Dec Oct Hex | Char Dec Oct Hex | Char Dec Oct Hex -------------------------------------------------------------------------------------- -(nul) 0 0000 0x00 | (sp) 32 0040 0x20 | @ 64 0100 0x40 | ` 96 0140 0x60 -(soh) 1 0001 0x01 | ! 33 0041 0x21 | A 65 0101 0x41 | a 97 0141 0x61 -(stx) 2 0002 0x02 | " 34 0042 0x22 | B 66 0102 0x42 | b 98 0142 0x62 -(etx) 3 0003 0x03 | # 35 0043 0x23 | C 67 0103 0x43 | c 99 0143 0x63 -(eot) 4 0004 0x04 | $ 36 0044 0x24 | D 68 0104 0x44 | d 100 0144 0x64 -(enq) 5 0005 0x05 | % 37 0045 0x25 | E 69 0105 0x45 | e 101 0145 0x65 -(ack) 6 0006 0x06 | & 38 0046 0x26 | F 70 0106 0x46 | f 102 0146 0x66 -(bel) 7 0007 0x07 | ' 39 0047 0x27 | G 71 0107 0x47 | g 103 0147 0x67 -(bs) 8 0010 0x08 | ( 40 0050 0x28 | H 72 0110 0x48 | h 104 0150 0x68 -(ht) 9 0011 0x09 | ) 41 0051 0x29 | I 73 0111 0x49 | i 105 0151 0x69 -(nl) 10 0012 0x0a | * 42 0052 0x2a | J 74 0112 0x4a | j 106 0152 0x6a -(vt) 11 0013 0x0b | + 43 0053 0x2b | K 75 0113 0x4b | k 107 0153 0x6b -(np) 12 0014 0x0c | , 44 0054 0x2c | L 76 0114 0x4c | l 108 0154 0x6c -(cr) 13 0015 0x0d | - 45 0055 0x2d | M 77 0115 0x4d | m 109 0155 0x6d -(so) 14 0016 0x0e | . 46 0056 0x2e | N 78 0116 0x4e | n 110 0156 0x6e -(si) 15 0017 0x0f | / 47 0057 0x2f | O 79 0117 0x4f | o 111 0157 0x6f -(dle) 16 0020 0x10 | 0 48 0060 0x30 | P 80 0120 0x50 | p 112 0160 0x70 -(dc1) 17 0021 0x11 | 1 49 0061 0x31 | Q 81 0121 0x51 | q 113 0161 0x71 -(dc2) 18 0022 0x12 | 2 50 0062 0x32 | R 82 0122 0x52 | r 114 0162 0x72 -(dc3) 19 0023 0x13 | 3 51 0063 0x33 | S 83 0123 0x53 | s 115 0163 0x73 -(dc4) 20 0024 0x14 | 4 52 0064 0x34 | T 84 0124 0x54 | t 116 0164 0x74 -(nak) 21 0025 0x15 | 5 53 0065 0x35 | U 85 0125 0x55 | u 117 0165 0x75 -(syn) 22 0026 0x16 | 6 54 0066 0x36 | V 86 0126 0x56 | v 118 0166 0x76 -(etb) 23 0027 0x17 | 7 55 0067 0x37 | W 87 0127 0x57 | w 119 0167 0x77 -(can) 24 0030 0x18 | 8 56 0070 0x38 | X 88 0130 0x58 | x 120 0170 0x78 -(em) 25 0031 0x19 | 9 57 0071 0x39 | Y 89 0131 0x59 | y 121 0171 0x79 -(sub) 26 0032 0x1a | : 58 0072 0x3a | Z 90 0132 0x5a | z 122 0172 0x7a -(esc) 27 0033 0x1b | ; 59 0073 0x3b | [ 91 0133 0x5b | { 123 0173 0x7b -(fs) 28 0034 0x1c | < 60 0074 0x3c | \ 92 0134 0x5c | | 124 0174 0x7c -(gs) 29 0035 0x1d | = 61 0075 0x3d | ] 93 0135 0x5d | } 125 0175 0x7d -(rs) 30 0036 0x1e | > 62 0076 0x3e | ^ 94 0136 0x5e | ~ 126 0176 0x7e -(us) 31 0037 0x1f | ? 63 0077 0x3f | _ 95 0137 0x5f | (del) 127 0177 0x7f - -*/ -INPUT_PORTS_START( generic_keyboard ) - PORT_START("TERM_LINEC") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Ctrl") PORT_CODE(KEYCODE_LCONTROL) PORT_CODE(KEYCODE_RCONTROL) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Shift") PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Caps Lock") PORT_CODE(KEYCODE_CAPSLOCK) PORT_TOGGLE PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_UNUSED) - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_UNUSED) - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_UNUSED) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_UNUSED) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED) - - PORT_START("TERM_LINE0") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_0) PORT_CHAR('0') - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('"') - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('&') - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('\'') - - PORT_START("TERM_LINE1") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('(') - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR(')') - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR(':') PORT_CHAR('*') - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR('+') - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<') - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('=') - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>') - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') - - PORT_START("TERM_LINE2") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_END) PORT_CHAR('`') PORT_CHAR('@') - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B') - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C') - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D') - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E') - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F') - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G') - - PORT_START("TERM_LINE3") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J') - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K') - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L') - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N') - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') - - PORT_START("TERM_LINE4") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S') - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T') - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V') - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') - - PORT_START("TERM_LINE5") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('[') PORT_CHAR('{') - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('\\') PORT_CHAR('|') - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}') - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_TILDE) PORT_CHAR('^') PORT_CHAR('~') - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("DEL") PORT_CODE(KEYCODE_DEL) PORT_CHAR(UCHAR_MAMEKEY(DEL)) - - PORT_START("TERM_LINE6") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Left") PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Right") PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Up") PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP)) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Down") PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("LF") PORT_CODE(KEYCODE_RALT) PORT_CHAR(10) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_TAB) PORT_CHAR(9) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) - - PORT_START("TERM_LINE7") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Escape") PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC)) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Backspace") PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) - - PORT_START("TERM_LINE8") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F1") PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1)) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F2") PORT_CODE(KEYCODE_F2) PORT_CHAR(UCHAR_MAMEKEY(F2)) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F3") PORT_CODE(KEYCODE_F3) PORT_CHAR(UCHAR_MAMEKEY(F3)) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F4") PORT_CODE(KEYCODE_F4) PORT_CHAR(UCHAR_MAMEKEY(F4)) - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F5") PORT_CODE(KEYCODE_F5) PORT_CHAR(UCHAR_MAMEKEY(F5)) - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F6") PORT_CODE(KEYCODE_F6) PORT_CHAR(UCHAR_MAMEKEY(F6)) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F7") PORT_CODE(KEYCODE_F7) PORT_CHAR(UCHAR_MAMEKEY(F7)) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F8") PORT_CODE(KEYCODE_F8) PORT_CHAR(UCHAR_MAMEKEY(F8)) - - PORT_START("TERM_LINE9") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F9") PORT_CODE(KEYCODE_F9) PORT_CHAR(UCHAR_MAMEKEY(F9)) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F10") PORT_CODE(KEYCODE_F10) PORT_CHAR(UCHAR_MAMEKEY(F10)) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F11") PORT_CODE(KEYCODE_F11) PORT_CHAR(UCHAR_MAMEKEY(F11)) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F12") PORT_CODE(KEYCODE_F12) PORT_CHAR(UCHAR_MAMEKEY(F12)) -INPUT_PORTS_END -ioport_constructor generic_keyboard_device::device_input_ports() const +void generic_keyboard_device::will_scan_row(UINT8 row) { - return INPUT_PORTS_NAME(generic_keyboard); + UINT16 const modifiers(m_modifiers->read()); + if (modifiers != m_last_modifiers) + typematic_restart(typematic_delay(), typematic_period()); + + m_last_modifiers = modifiers; } -const device_type GENERIC_KEYBOARD = &device_creator<generic_keyboard_device>; + +void generic_keyboard_device::send_translated(UINT8 code) +{ + UINT8 translated; + if (translate(code, translated)) + send_key(translated); +} + + +attotime generic_keyboard_device::typematic_delay() const +{ + return attotime::from_msec(250 * (1 + ((m_config->read() >> 1) & 0x03U))); +} + + +attotime generic_keyboard_device::typematic_period() const +{ + unsigned const rate(~(m_config->read() >> 3) & 0x1fU); + return attotime::from_ticks((8U + (rate & 0x07U)) * (1 << ((rate >> 3) & 0x03)), 240U); +} diff --git a/src/devices/machine/keyboard.h b/src/devices/machine/keyboard.h index 79a91f923c9..04972925815 100644 --- a/src/devices/machine/keyboard.h +++ b/src/devices/machine/keyboard.h @@ -1,7 +1,9 @@ // license:BSD-3-Clause -// copyright-holders:smf -#ifndef __KEYBOARD_H__ -#define __KEYBOARD_H__ +// copyright-holders:Vas Crabb +#ifndef MAME_DEVICES_MACHINE_KEYBOARD_H +#define MAME_DEVICES_MACHINE_KEYBOARD_H + +#pragma once #include "emu.h" @@ -9,52 +11,120 @@ DEVICE CONFIGURATION MACROS ***************************************************************************/ -#define MCFG_GENERIC_KEYBOARD_CB(_devcb) \ - devcb = &generic_keyboard_device::set_keyboard_callback(*device, DEVCB_##_devcb); +#define MCFG_GENERIC_KEYBOARD_CB(cb) \ + devcb = &generic_keyboard_device::set_keyboard_callback(*device, DEVCB_##cb); + + + +/*************************************************************************** + DEVICE TYPE GLOBALS +***************************************************************************/ + +extern const device_type GENERIC_KEYBOARD; + + /*************************************************************************** - FUNCTION PROTOTYPES + REUSABLE I/O PORTS ***************************************************************************/ INPUT_PORTS_EXTERN( generic_keyboard ); -class generic_keyboard_device : public device_t + + +/*************************************************************************** + TYPE DECLARATIONS +***************************************************************************/ + +template <UINT8 ROW_COUNT> +class device_matrix_keyboard_interface : public device_interface +{ +protected: + template <typename... T> + device_matrix_keyboard_interface(machine_config const &mconfig, device_t &device, T &&... tags); + + virtual void interface_pre_start() override; + virtual void interface_post_start() override; + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); + + void start_processing(const attotime &period); + void stop_processing(); + void reset_key_state(); + + void typematic_start(UINT8 row, UINT8 column, attotime const &delay, attotime const &interval); + void typematic_restart(attotime const &delay, attotime const &interval); + void typematic_stop(); + bool typematic_is(UINT8 row, UINT8 column) const { return (m_typematic_row == row) && (m_typematic_column == column); } + + virtual void key_make(UINT8 row, UINT8 column) = 0; + virtual void key_repeat(UINT8 row, UINT8 column); + virtual void key_break(UINT8 row, UINT8 column); + virtual void will_scan_row(UINT8 row); + +private: + // device_serial_interface uses 10'000 range + enum { + TIMER_ID_SCAN = 20'000, + TIMER_ID_TYPEMATIC + }; + + void scan_row(); + + emu_timer *m_scan_timer; + emu_timer *m_typematic_timer; + required_ioport m_key_rows[ROW_COUNT]; + ioport_value m_key_states[ROW_COUNT]; + UINT8 m_next_row; + UINT8 m_processing; + UINT8 m_typematic_row; + UINT8 m_typematic_column; +}; + + +class generic_keyboard_device : public device_t, protected device_matrix_keyboard_interface<4U> { public: - generic_keyboard_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source); - generic_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + generic_keyboard_device( + const machine_config &mconfig, + device_type type, + char const *name, + char const *tag, + device_t *owner, + UINT32 clock, + char const *shortname, + char const *source); + generic_keyboard_device( + const machine_config &mconfig, + const char *tag, + device_t *owner, + UINT32 clock); - template<class _Object> static devcb_base &set_keyboard_callback(device_t &device, _Object object) { return downcast<generic_keyboard_device &>(device).m_keyboard_cb.set_callback(object); } + template <class Object> static devcb_base &set_keyboard_callback(device_t &device, Object object) { return downcast<generic_keyboard_device &>(device).m_keyboard_cb.set_callback(object); } virtual ioport_constructor device_input_ports() const override; - virtual machine_config_constructor device_mconfig_additions() const override; -protected: - required_ioport m_io_kbd0; - required_ioport m_io_kbd1; - required_ioport m_io_kbd2; - required_ioport m_io_kbd3; - required_ioport m_io_kbd4; - required_ioport m_io_kbd5; - required_ioport m_io_kbd6; - required_ioport m_io_kbd7; - required_ioport m_io_kbd8; - required_ioport m_io_kbd9; - required_ioport m_io_kbdc; +protected: virtual void device_start() override; virtual void device_reset() override; virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; - virtual void send_key(UINT8 code) { m_keyboard_cb((offs_t)0, code); } - emu_timer *m_timer; + virtual void key_make(UINT8 row, UINT8 column) override; + virtual void key_repeat(UINT8 row, UINT8 column) override; + virtual void send_key(UINT8 code); + virtual bool translate(UINT8 code, UINT8 &translated) const; + + required_ioport m_config; + required_ioport m_modifiers; + private: - virtual UINT8 keyboard_handler(UINT8 last_code, UINT8 *scan_line); - UINT8 row_number(UINT8 code); - UINT8 m_last_code; - UINT8 m_scan_line; + virtual void will_scan_row(UINT8 row) override; - devcb_write8 m_keyboard_cb; -}; + void typematic(); + void send_translated(UINT8 code); + attotime typematic_delay() const; + attotime typematic_period() const; -extern const device_type GENERIC_KEYBOARD; + UINT16 m_last_modifiers; + devcb_write8 m_keyboard_cb; +}; -#endif /* __KEYBOARD_H__ */ +#endif // MAME_DEVICES_MACHINE_KEYBOARD_H diff --git a/src/devices/machine/keyboard.ipp b/src/devices/machine/keyboard.ipp new file mode 100644 index 00000000000..966662b00a0 --- /dev/null +++ b/src/devices/machine/keyboard.ipp @@ -0,0 +1,160 @@ +// license:BSD-3-Clause +// copyright-holders:Vas Crabb +#ifndef MAME_DEVICES_MACHINE_KEYBOARD_IPP +#define MAME_DEVICES_MACHINE_KEYBOARD_IPP + +#pragma once + +#include "keyboard.h" + +template <UINT8 ROW_COUNT> +template <typename... T> +device_matrix_keyboard_interface<ROW_COUNT>::device_matrix_keyboard_interface(machine_config const &mconfig, device_t &device, T &&... tags) + : device_interface(device, "matrix_keyboard") + , m_scan_timer(nullptr) + , m_typematic_timer(nullptr) + , m_key_rows{ { device, std::forward<T>(tags) }... } + , m_next_row(0U) + , m_processing(0U) + , m_typematic_row(0U) + , m_typematic_column(0U) +{ +} + + +template <UINT8 ROW_COUNT> +void device_matrix_keyboard_interface<ROW_COUNT>::interface_pre_start() +{ + m_scan_timer = device().timer_alloc(TIMER_ID_SCAN); + m_typematic_timer = device().timer_alloc(TIMER_ID_TYPEMATIC); + reset_key_state(); + typematic_stop(); +} + + +template <UINT8 ROW_COUNT> +void device_matrix_keyboard_interface<ROW_COUNT>::interface_post_start() +{ + device().save_item(NAME(m_key_states)); + device().save_item(NAME(m_next_row)); + device().save_item(NAME(m_processing)); + device().save_item(NAME(m_typematic_row)); + device().save_item(NAME(m_typematic_column)); +} + + +template <UINT8 ROW_COUNT> +void device_matrix_keyboard_interface<ROW_COUNT>::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +{ + switch (id) + { + case TIMER_ID_SCAN: + scan_row(); + break; + case TIMER_ID_TYPEMATIC: + assert((m_typematic_row != UINT8(~0U)) || (m_typematic_column != UINT8(~0U))); + key_repeat(m_typematic_row, m_typematic_column); + break; + } +} + + +template <UINT8 ROW_COUNT> +void device_matrix_keyboard_interface<ROW_COUNT>::start_processing(const attotime &period) +{ + m_processing = 1U; + m_scan_timer->adjust(period, 0, period); +} + + +template <UINT8 ROW_COUNT> +void device_matrix_keyboard_interface<ROW_COUNT>::stop_processing() +{ + m_scan_timer->reset(); + m_processing = 0U; +} + + +template <UINT8 ROW_COUNT> +void device_matrix_keyboard_interface<ROW_COUNT>::reset_key_state() +{ + std::fill(std::begin(m_key_states), std::end(m_key_states), ioport_value(0U)); + m_next_row = 0U; +} + + +template <UINT8 ROW_COUNT> +void device_matrix_keyboard_interface<ROW_COUNT>::typematic_start(UINT8 row, UINT8 column, attotime const &delay, attotime const &interval) +{ + m_typematic_row = row; + m_typematic_column = column; + m_typematic_timer->adjust(delay, 0, interval); +} + + +template <UINT8 ROW_COUNT> +void device_matrix_keyboard_interface<ROW_COUNT>::typematic_restart(attotime const &delay, attotime const &interval) +{ + if ((m_typematic_row != UINT8(~0U)) || (m_typematic_column != UINT8(~0U))) + m_typematic_timer->adjust(delay, 0, interval); +} + + +template <UINT8 ROW_COUNT> +void device_matrix_keyboard_interface<ROW_COUNT>::typematic_stop() +{ + m_typematic_row = UINT8(~0U); + m_typematic_column = UINT8(~0U); + m_typematic_timer->reset(); +} + + +template <UINT8 ROW_COUNT> +void device_matrix_keyboard_interface<ROW_COUNT>::scan_row() +{ + assert(m_next_row < ARRAY_LENGTH(m_key_rows)); + assert(m_next_row < ARRAY_LENGTH(m_key_states)); + + will_scan_row(m_next_row); + + ioport_value &state(m_key_states[m_next_row]); + ioport_value const keys(m_key_rows[m_next_row]->read()); + ioport_value const change(state ^ keys); + + ioport_value mask(1U); + for (UINT8 column = 0U; m_processing && (state != keys); ++column, mask <<= 1) + { + if (change & mask) + { + state ^= mask; + if (keys & mask) + key_make(m_next_row, column); + else + key_break(m_next_row, column); + } + } + + m_next_row = (m_next_row + 1) % ARRAY_LENGTH(m_key_rows); +} + + +template <UINT8 ROW_COUNT> +void device_matrix_keyboard_interface<ROW_COUNT>::key_repeat(UINT8 row, UINT8 column) +{ +} + + +template <UINT8 ROW_COUNT> +void device_matrix_keyboard_interface<ROW_COUNT>::key_break(UINT8 row, UINT8 column) +{ + if (typematic_is(row, column)) + typematic_stop(); +} + + +template <UINT8 ROW_COUNT> +void device_matrix_keyboard_interface<ROW_COUNT>::will_scan_row(UINT8 row) +{ +} + +#endif // MAME_DEVICES_MACHINE_KEYBOARD_IPP diff --git a/src/devices/machine/terminal.cpp b/src/devices/machine/terminal.cpp index a2be090b261..b4d0d4b6c4a 100644 --- a/src/devices/machine/terminal.cpp +++ b/src/devices/machine/terminal.cpp @@ -141,24 +141,20 @@ static const UINT8 terminal_font[256*16] = }; generic_terminal_device::generic_terminal_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source) - : device_t(mconfig, type, name, tag, owner, clock, shortname, source), - m_palette(*this, "palette"), - m_io_term_conf(*this, "TERM_CONF"), - m_x_pos(0), - m_framecnt(0), - m_y_pos(0), - m_keyboard_cb(*this) + : device_t(mconfig, type, name, tag, owner, clock, shortname, source) + , m_palette(*this, "palette") + , m_io_term_conf(*this, "TERM_CONF") + , m_x_pos(0) + , m_framecnt(0) + , m_y_pos(0) + , m_bell_timer(nullptr) + , m_beeper(*this, "beeper") + , m_keyboard_cb(*this) { } generic_terminal_device::generic_terminal_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) - : device_t(mconfig, GENERIC_TERMINAL, "Generic Terminal", tag, owner, clock, "generic_terminal", __FILE__), - m_palette(*this, "palette"), - m_io_term_conf(*this, "TERM_CONF"), - m_x_pos(0), - m_framecnt(0), - m_y_pos(0), - m_keyboard_cb(*this) + : generic_terminal_device(mconfig, GENERIC_TERMINAL, "Generic Terminal", tag, owner, clock, "generic_terminal", __FILE__) { } @@ -186,7 +182,7 @@ void generic_terminal_device::write_char(UINT8 data) void generic_terminal_device::clear() { - memset(m_buffer,0x20,TERMINAL_WIDTH*TERMINAL_HEIGHT); + std::fill(std::begin(m_buffer), std::end(m_buffer), 0x20); m_x_pos = 0; m_y_pos = 0; } @@ -196,44 +192,52 @@ void generic_terminal_device::term_write(UINT8 data) if (data > 0x1f) { // printable char - if (data!=0x7f) write_char(data); + if (data != 0x7f) write_char(data); } else { + const UINT16 options = m_io_term_conf->read(); switch(data) { - case 0x07 : // bell - break; - - case 0x08: if (m_x_pos) m_x_pos--; - break; - - case 0x09: m_x_pos = (m_x_pos & 0xf8) + 8; - if (m_x_pos >= TERMINAL_WIDTH) - m_x_pos = TERMINAL_WIDTH-1; - break; - - case 0x0a: m_y_pos++; - m_x_pos = 0; - if (m_y_pos >= TERMINAL_HEIGHT) - { - scroll_line(); - m_y_pos = TERMINAL_HEIGHT-1; - } - break; - - case 0x0b: if (m_y_pos) m_y_pos--; - break; + case 0x07: // bell + m_beeper->set_state(1); + m_bell_timer->reset(attotime::from_msec(250)); + break; + + case 0x08: // backspace + if (m_x_pos) m_x_pos--; + break; + + case 0x09: // horizontal tab + m_x_pos = (std::min<UINT8>)((m_x_pos & 0xf8) + 8, TERMINAL_WIDTH - 1); + break; + + case 0x0d: // carriage return + m_x_pos = 0; + if (!(options & 0x080)) break; + + case 0x0a: // linefeed + m_y_pos++; + if (m_y_pos >= TERMINAL_HEIGHT) + { + scroll_line(); + m_y_pos = TERMINAL_HEIGHT - 1; + } + if (options & 0x040) m_x_pos = 0; + break; - case 0x0c: clear(); - break; + case 0x0b: // vertical tab + if (m_y_pos) m_y_pos--; + break; - case 0x0d: m_x_pos = 0; - break; + case 0x0c: // form feed + clear(); + break; - case 0x1e: m_x_pos = 0; - m_y_pos = 0; - break; + case 0x1e: // record separator + m_x_pos = 0; + m_y_pos = 0; + break; } } } @@ -243,17 +247,17 @@ void generic_terminal_device::term_write(UINT8 data) ***************************************************************************/ UINT32 generic_terminal_device::update(screen_device &device, bitmap_rgb32 &bitmap, const rectangle &cliprect) { - UINT8 options = m_io_term_conf->read(); + const UINT16 options = m_io_term_conf->read(); UINT16 cursor = m_y_pos * TERMINAL_WIDTH + m_x_pos; UINT8 y,ra,chr,gfx; UINT16 sy=0,ma=0,x; - switch (options & 0x30) + switch (options & 0x030) { - case 0x10: + case 0x010: m_palette->set_pen_color(1, rgb_t(0xf7, 0xaa, 0x00)); break; - case 0x20: + case 0x020: m_palette->set_pen_color(1, rgb_t::white); break; default: @@ -275,16 +279,16 @@ UINT32 generic_terminal_device::update(screen_device &device, bitmap_rgb32 &bitm chr = m_buffer[x]; gfx = terminal_font[(chr<<4) | ra ]; - if ((x == cursor) && (options & 1)) // at cursor position and want a cursor + if ((x == cursor) && (options & 0x001)) // at cursor position and want a cursor { if ((options & 2) || (ra == 9)) // block, or underline & at bottom line { - if ((options & 4) && (m_framecnt & 8)) // want blink & time to blink + if ((options & 0x004) && (m_framecnt & 8)) // want blink & time to blink { } else { - if (options & 8) + if (options & 0x008) gfx ^= 0xff; // invert else gfx |= 0xff; // overwrite @@ -303,15 +307,15 @@ UINT32 generic_terminal_device::update(screen_device &device, bitmap_rgb32 &bitm *p++ = (BIT( gfx, 0 ))?font_color:0; } } - ma+=TERMINAL_WIDTH; + ma += TERMINAL_WIDTH; } return 0; } WRITE8_MEMBER( generic_terminal_device::kbd_put ) { - if (data) - send_key(data); + if (m_io_term_conf->read() & 0x100) term_write(data); + send_key(data); } /*************************************************************************** @@ -330,6 +334,10 @@ static MACHINE_CONFIG_FRAGMENT( generic_terminal ) MCFG_DEVICE_ADD(KEYBOARD_TAG, GENERIC_KEYBOARD, 0) MCFG_GENERIC_KEYBOARD_CB(WRITE8(generic_terminal_device, kbd_put)) + + MCFG_SPEAKER_STANDARD_MONO("bell") + MCFG_SOUND_ADD("beeper", BEEP, 2'000) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "bell", 1.0) MACHINE_CONFIG_END machine_config_constructor generic_terminal_device::device_mconfig_additions() const @@ -339,6 +347,7 @@ machine_config_constructor generic_terminal_device::device_mconfig_additions() c void generic_terminal_device::device_start() { + m_bell_timer = timer_alloc(BELL_TIMER_ID); m_keyboard_cb.resolve_safe(); save_item(NAME(m_buffer)); save_item(NAME(m_x_pos)); @@ -348,10 +357,21 @@ void generic_terminal_device::device_start() void generic_terminal_device::device_reset() { + m_beeper->set_state(0); clear(); m_framecnt = 0; } +void generic_terminal_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +{ + switch (id) + { + case BELL_TIMER_ID: + m_beeper->set_state(0); + break; + } +} + /* Char Dec Oct Hex | Char Dec Oct Hex | Char Dec Oct Hex | Char Dec Oct Hex ------------------------------------------------------------------------------------- @@ -391,22 +411,31 @@ Char Dec Oct Hex | Char Dec Oct Hex | Char Dec Oct Hex | Char Dec Oct */ INPUT_PORTS_START( generic_terminal ) PORT_START("TERM_CONF") - PORT_CONFNAME( 0x01, 0x01, "Cursor") - PORT_CONFSETTING( 0x00, DEF_STR(No)) - PORT_CONFSETTING( 0x01, DEF_STR(Yes)) - PORT_CONFNAME( 0x02, 0x02, "Type") - PORT_CONFSETTING( 0x00, "Underline") - PORT_CONFSETTING( 0x02, "Block") - PORT_CONFNAME( 0x04, 0x04, "Blinking") - PORT_CONFSETTING( 0x00, DEF_STR(No)) - PORT_CONFSETTING( 0x04, DEF_STR(Yes)) - PORT_CONFNAME( 0x08, 0x08, "Invert") - PORT_CONFSETTING( 0x00, DEF_STR(No)) - PORT_CONFSETTING( 0x08, DEF_STR(Yes)) - PORT_CONFNAME( 0x30, 0x00, "Color") - PORT_CONFSETTING( 0x00, "Green") - PORT_CONFSETTING( 0x10, "Amber") - PORT_CONFSETTING( 0x20, "White") + PORT_CONFNAME( 0x001, 0x001, "Cursor" ) + PORT_CONFSETTING( 0x000, DEF_STR(No) ) + PORT_CONFSETTING( 0x001, DEF_STR(Yes) ) + PORT_CONFNAME( 0x002, 0x002, "Type" ) + PORT_CONFSETTING( 0x000, "Underline" ) + PORT_CONFSETTING( 0x002, "Block" ) + PORT_CONFNAME( 0x004, 0x004, "Blinking" ) + PORT_CONFSETTING( 0x000, DEF_STR(No) ) + PORT_CONFSETTING( 0x004, DEF_STR(Yes) ) + PORT_CONFNAME( 0x008, 0x008, "Invert" ) + PORT_CONFSETTING( 0x000, DEF_STR(No) ) + PORT_CONFSETTING( 0x008, DEF_STR(Yes) ) + PORT_CONFNAME( 0x030, 0x000, "Color" ) + PORT_CONFSETTING( 0x000, "Green" ) + PORT_CONFSETTING( 0x010, "Amber" ) + PORT_CONFSETTING( 0x020, "White" ) + PORT_CONFNAME( 0x040, 0x000, "Auto CR on LF" ) + PORT_CONFSETTING( 0x000, DEF_STR(No) ) + PORT_CONFSETTING( 0x040, DEF_STR(Yes) ) + PORT_CONFNAME( 0x080, 0x000, "Auto LF on CR" ) + PORT_CONFSETTING( 0x000, DEF_STR(No) ) + PORT_CONFSETTING( 0x080, DEF_STR(Yes) ) + PORT_CONFNAME( 0x100, 0x000, "Local echo" ) + PORT_CONFSETTING( 0x000, DEF_STR(No) ) + PORT_CONFSETTING( 0x100, DEF_STR(Yes) ) INPUT_PORTS_END ioport_constructor generic_terminal_device::device_input_ports() const diff --git a/src/devices/machine/terminal.h b/src/devices/machine/terminal.h index 0f6901629af..5b8112c9823 100644 --- a/src/devices/machine/terminal.h +++ b/src/devices/machine/terminal.h @@ -1,9 +1,10 @@ // license:BSD-3-Clause // copyright-holders:Miodrag Milanovic -#ifndef __TERMINAL_H__ -#define __TERMINAL_H__ +#ifndef MAME_DEVICES_TERMINAL_H +#define MAME_DEVICES_TERMINAL_H #include "machine/keyboard.h" +#include "sound/beep.h" #define TERMINAL_SCREEN_TAG "terminal_screen" @@ -37,16 +38,22 @@ public: virtual ioport_constructor device_input_ports() const override; virtual machine_config_constructor device_mconfig_additions() const override; + protected: - optional_device<palette_device> m_palette; - required_ioport m_io_term_conf; + enum { BELL_TIMER_ID = 20'000 }; virtual void term_write(UINT8 data); virtual void device_start() override; virtual void device_reset() override; + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; virtual void send_key(UINT8 code) { m_keyboard_cb((offs_t)0, code); } - UINT8 m_buffer[TERMINAL_WIDTH*50]; // make big enough for teleprinter + + optional_device<palette_device> m_palette; + required_ioport m_io_term_conf; + + UINT8 m_buffer[TERMINAL_WIDTH * 50]; // make big enough for teleprinter UINT8 m_x_pos; + private: void scroll_line(); void write_char(UINT8 data); @@ -55,9 +62,11 @@ private: UINT8 m_framecnt; UINT8 m_y_pos; + emu_timer *m_bell_timer; + required_device<beep_device> m_beeper; devcb_write8 m_keyboard_cb; }; extern const device_type GENERIC_TERMINAL; -#endif /* __TERMINAL_H__ */ +#endif /* MAME_DEVICES_TERMINAL_H */ diff --git a/src/emu/attotime.h b/src/emu/attotime.h index fce0b928e88..d2209ea9c32 100644 --- a/src/emu/attotime.h +++ b/src/emu/attotime.h @@ -64,18 +64,18 @@ const seconds_t ATTOTIME_MAX_SECONDS = 1000000000; //************************************************************************** // convert between a double and attoseconds -#define ATTOSECONDS_TO_DOUBLE(x) ((double)(x) * 1e-18) -#define DOUBLE_TO_ATTOSECONDS(x) ((attoseconds_t)((x) * 1e18)) +inline constexpr double ATTOSECONDS_TO_DOUBLE(attoseconds_t x) { return double(x) * 1e-18; } +inline constexpr attoseconds_t DOUBLE_TO_ATTOSECONDS(double x) { return attoseconds_t(x * 1e18); } // convert between hertz (as a double) and attoseconds -#define ATTOSECONDS_TO_HZ(x) ((double)ATTOSECONDS_PER_SECOND / (double)(x)) -#define HZ_TO_ATTOSECONDS(x) ((attoseconds_t)(ATTOSECONDS_PER_SECOND / (x))) +inline constexpr double ATTOSECONDS_TO_HZ(attoseconds_t x) { return double(ATTOSECONDS_PER_SECOND) / double(x); } +template <typename T> inline constexpr attoseconds_t HZ_TO_ATTOSECONDS(T &&x) { return attoseconds_t(ATTOSECONDS_PER_SECOND / x); } // macros for converting other seconds types to attoseconds -#define ATTOSECONDS_IN_SEC(x) ((attoseconds_t)(x) * ATTOSECONDS_PER_SECOND) -#define ATTOSECONDS_IN_MSEC(x) ((attoseconds_t)(x) * ATTOSECONDS_PER_MILLISECOND) -#define ATTOSECONDS_IN_USEC(x) ((attoseconds_t)(x) * ATTOSECONDS_PER_MICROSECOND) -#define ATTOSECONDS_IN_NSEC(x) ((attoseconds_t)(x) * ATTOSECONDS_PER_NANOSECOND) +template <typename T> inline constexpr attoseconds_t ATTOSECONDS_IN_SEC(T &&x) { return attoseconds_t(x) * ATTOSECONDS_PER_SECOND; } +template <typename T> inline constexpr attoseconds_t ATTOSECONDS_IN_MSEC(T &&x) { return attoseconds_t(x) * ATTOSECONDS_PER_MILLISECOND; } +template <typename T> inline constexpr attoseconds_t ATTOSECONDS_IN_USEC(T &&x) { return attoseconds_t(x) * ATTOSECONDS_PER_MICROSECOND; } +template <typename T> inline constexpr attoseconds_t ATTOSECONDS_IN_NSEC(T &&x) { return attoseconds_t(x) * ATTOSECONDS_PER_NANOSECOND; } @@ -88,18 +88,12 @@ class attotime { public: // construction/destruction - attotime() - : m_seconds(0), - m_attoseconds(0) { } + constexpr attotime() : m_seconds(0), m_attoseconds(0) { } /** Constructs with @p secs seconds and @p attos attoseconds. */ - attotime(seconds_t secs, attoseconds_t attos) - : m_seconds(secs), - m_attoseconds(attos) { } + constexpr attotime(seconds_t secs, attoseconds_t attos) : m_seconds(secs), m_attoseconds(attos) { } - attotime(const attotime& that) - : m_seconds(that.m_seconds), - m_attoseconds(that.m_attoseconds) { } + constexpr attotime(const attotime& that) : m_seconds(that.m_seconds), m_attoseconds(that.m_attoseconds) { } // assignment attotime& operator=(const attotime& that) @@ -110,32 +104,32 @@ public: } // queries - bool is_zero() const { return (m_seconds == 0 && m_attoseconds == 0); } + constexpr bool is_zero() const { return (m_seconds == 0 && m_attoseconds == 0); } /** Test if value is above @ref ATTOTIME_MAX_SECONDS (considered an overflow) */ - bool is_never() const { return (m_seconds >= ATTOTIME_MAX_SECONDS); } + constexpr bool is_never() const { return (m_seconds >= ATTOTIME_MAX_SECONDS); } // conversion to other forms - double as_double() const { return double(m_seconds) + ATTOSECONDS_TO_DOUBLE(m_attoseconds); } - attoseconds_t as_attoseconds() const; + constexpr double as_double() const { return double(m_seconds) + ATTOSECONDS_TO_DOUBLE(m_attoseconds); } + constexpr attoseconds_t as_attoseconds() const; UINT64 as_ticks(UINT32 frequency) const; /** Convert to string using at @p precision */ const char *as_string(int precision = 9) const; /** @return the attoseconds portion. */ - attoseconds_t attoseconds() const { return m_attoseconds; } + constexpr attoseconds_t attoseconds() const { return m_attoseconds; } /** @return the seconds portion. */ - seconds_t seconds() const { return m_seconds; } + constexpr seconds_t seconds() const { return m_seconds; } - static attotime from_double(double _time); + static constexpr attotime from_double(double _time); static attotime from_ticks(UINT64 ticks, UINT32 frequency); /** Create an attotime from a integer count of seconds @seconds */ - static attotime from_seconds(INT32 seconds) { return attotime(seconds, 0); } + static constexpr attotime from_seconds(INT32 seconds) { return attotime(seconds, 0); } /** Create an attotime from a integer count of milliseconds @msec */ - static attotime from_msec(INT64 msec) { return attotime(msec / 1000, (msec % 1000) * (ATTOSECONDS_PER_SECOND / 1000)); } + static constexpr attotime from_msec(INT64 msec) { return attotime(msec / 1000, (msec % 1000) * (ATTOSECONDS_PER_SECOND / 1000)); } /** Create an attotime from a integer count of microseconds @usec */ - static attotime from_usec(INT64 usec) { return attotime(usec / 1000000, (usec % 1000000) * (ATTOSECONDS_PER_SECOND / 1000000)); } + static constexpr attotime from_usec(INT64 usec) { return attotime(usec / 1000000, (usec % 1000000) * (ATTOSECONDS_PER_SECOND / 1000000)); } /** Create an attotime from a integer count of nanoseconds @nsec */ - static attotime from_nsec(INT64 nsec) { return attotime(nsec / 1000000000, (nsec % 1000000000) * (ATTOSECONDS_PER_SECOND / 1000000000)); } + static constexpr attotime from_nsec(INT64 nsec) { return attotime(nsec / 1000000000, (nsec % 1000000000) * (ATTOSECONDS_PER_SECOND / 1000000000)); } /** Create an attotime from at the given frequency @frequency */ static attotime from_hz(double frequency) { assert(frequency > 0); double d = 1 / frequency; return attotime(floor(d), modf(d, &d) * ATTOSECONDS_PER_SECOND); } @@ -277,32 +271,32 @@ inline attotime operator/(const attotime &left, UINT32 factor) /** handle comparisons between attotimes */ -inline bool operator==(const attotime &left, const attotime &right) +inline constexpr bool operator==(const attotime &left, const attotime &right) { return (left.m_seconds == right.m_seconds && left.m_attoseconds == right.m_attoseconds); } -inline bool operator!=(const attotime &left, const attotime &right) +inline constexpr bool operator!=(const attotime &left, const attotime &right) { return (left.m_seconds != right.m_seconds || left.m_attoseconds != right.m_attoseconds); } -inline bool operator<(const attotime &left, const attotime &right) +inline constexpr bool operator<(const attotime &left, const attotime &right) { return (left.m_seconds < right.m_seconds || (left.m_seconds == right.m_seconds && left.m_attoseconds < right.m_attoseconds)); } -inline bool operator<=(const attotime &left, const attotime &right) +inline constexpr bool operator<=(const attotime &left, const attotime &right) { return (left.m_seconds < right.m_seconds || (left.m_seconds == right.m_seconds && left.m_attoseconds <= right.m_attoseconds)); } -inline bool operator>(const attotime &left, const attotime &right) +inline constexpr bool operator>(const attotime &left, const attotime &right) { return (left.m_seconds > right.m_seconds || (left.m_seconds == right.m_seconds && left.m_attoseconds > right.m_attoseconds)); } -inline bool operator>=(const attotime &left, const attotime &right) +inline constexpr bool operator>=(const attotime &left, const attotime &right) { return (left.m_seconds > right.m_seconds || (left.m_seconds == right.m_seconds && left.m_attoseconds >= right.m_attoseconds)); } @@ -312,7 +306,7 @@ inline bool operator>=(const attotime &left, const attotime &right) // min - return the minimum of two attotimes //------------------------------------------------- -inline attotime min(const attotime &left, const attotime &right) +inline constexpr attotime min(const attotime &left, const attotime &right) { if (left.m_seconds > right.m_seconds) return right; @@ -328,7 +322,7 @@ inline attotime min(const attotime &left, const attotime &right) // max - return the maximum of two attotimes //------------------------------------------------- -inline attotime max(const attotime &left, const attotime &right) +inline constexpr attotime max(const attotime &left, const attotime &right) { if (left.m_seconds > right.m_seconds) return left; @@ -340,7 +334,7 @@ inline attotime max(const attotime &left, const attotime &right) } /** Convert to an attoseconds value, clamping to +/- 1 second */ -inline attoseconds_t attotime::as_attoseconds() const +inline constexpr attoseconds_t attotime::as_attoseconds() const { // positive values between 0 and 1 second if (m_seconds == 0) @@ -382,7 +376,7 @@ inline attotime attotime::from_ticks(UINT64 ticks, UINT32 frequency) } /** Create an attotime from floating point count of seconds @p _time */ -inline attotime attotime::from_double(double _time) +inline constexpr attotime attotime::from_double(double _time) { seconds_t secs = floor(_time); _time -= double(secs); diff --git a/src/mame/machine/m20_kbd.cpp b/src/mame/machine/m20_kbd.cpp index ecccffae775..ace6136b8e0 100644 --- a/src/mame/machine/m20_kbd.cpp +++ b/src/mame/machine/m20_kbd.cpp @@ -1,225 +1,238 @@ // license:BSD-3-Clause -// copyright-holders:Carl -// TODO: dump 8048 mcu +// copyright-holders:Carl,Vas Crabb #include "machine/m20_kbd.h" -m20_keyboard_device::m20_keyboard_device(const machine_config& mconfig, const char* tag, device_t* owner, UINT32 clock) : - serial_keyboard_device(mconfig, M20_KEYBOARD, "M20 Keyboard", tag, owner, 0, "m20_keyboard", __FILE__) +#include "bus/rs232/rs232.ipp" +#include "machine/keyboard.ipp" + + +namespace { +/* + TODO: dump 8048 mcu + + There seem to be a lot of guesses in this code - actual scan rate, + FIFO length, command processing, etc. don't seem to be evidence- + based. The modifier handling seems very odd as it has aliasing and + overflow all over the place. + + Layout is selected with a set of four jumpers on the keyboard MCU. + We need to bring these out to DIP switches, work out which command + is the layout request, and respond appropriately. + + Available layouts: + Italian + German + French + British + USA ASCII + Spanish + Portuguese + Swedish - Finnish + Danish + Katakana + Yugoslavian + Norwegian + Greek + Swiss - French + Swiss - German + + The keyboard MCU drives a buzzer. We should work out what the bell + on/off commands are and emulate it. + + There are apparently no break codes. + The scancodes are arranged to read in alphabetical order with the QWERTY layout. + Modifiers apparently modify the make codes. + We are using a matrix here that corresponds to the logical scan codes - the physical matrix apparently doesn't match this. + + 00 1c 1d 1e 1f 20 21 22 23 24 25 26 27 c3 cd ce cf d0 + ?? 12 18 06 13 15 1a 16 0a 10 11 28 29 c2 ca cb cc d1 + ?? 02 14 05 07 08 09 0b 0c 0d 2a 2b 2c c1 c7 c8 c9 d2 + ?? 01 1b 19 04 17 03 0f 0e 2d 2e 2f ?? c4 c5 c6 d3 + c0 + + Ths is the 72-key version of the keyboard. + The katakana kayout has 75 keys, but we don't have a diagram for it. + ?? are modifiers, which are read directly, not through the 8x9 scan matrix. +*/ +// Italian layout (QZERTY typewriter) +static INPUT_PORTS_START( m20_keyboard ) + PORT_START("LINE0") + PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("RESET") PORT_CODE(KEYCODE_ESC) + PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_LALT) PORT_CHAR('<') PORT_CHAR('>') + PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') + PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B') + PORT_BIT(0x10,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C') + PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D') + PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E') + PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F') + + PORT_START("LINE1") + PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G') + PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') + PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') + PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J') + PORT_BIT(0x10,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K') + PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L') + PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_M) PORT_CHAR(',') PORT_CHAR('?') + PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N') + + PORT_START("LINE2") + PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') + PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') + PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') + PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') + PORT_BIT(0x10,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S') + PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T') + PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') + PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V') + + PORT_START("LINE3") + PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_W) PORT_CHAR('z') PORT_CHAR('Z') + PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') + PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') + PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_Z) PORT_CHAR('w') PORT_CHAR('W') + PORT_BIT(0x10,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_0) PORT_CHAR(0x00e0U) PORT_CHAR('0') // a grave + PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_1) PORT_CHAR(0x00a3U) PORT_CHAR('1') // pound + PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_2) PORT_CHAR(0x00e9U) PORT_CHAR('2') // e acute + PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_3) PORT_CHAR('"') PORT_CHAR('3') + + PORT_START("LINE4") + PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_4) PORT_CHAR('\'') PORT_CHAR('4') + PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_5) PORT_CHAR('(') PORT_CHAR('5') + PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_6) PORT_CHAR('_') PORT_CHAR('6') + PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_7) PORT_CHAR(0x00e8U) PORT_CHAR('7') // e grave + PORT_BIT(0x10,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_8) PORT_CHAR('^') PORT_CHAR('8') + PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_9) PORT_CHAR(0x00e7U) PORT_CHAR('9') // c cedilla + PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS) PORT_CHAR(')') PORT_CHAR(0x00b0U) // degree + PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('-') PORT_CHAR('+') + + PORT_START("LINE5") + PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR(0x00ecU) PORT_CHAR('=') // i grave + PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR('$') PORT_CHAR('&') + PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_COLON) PORT_CHAR('m') PORT_CHAR('M') + PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR(0x00f9U) PORT_CHAR('%') // u grave + PORT_BIT(0x10,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_TILDE) PORT_CHAR('*') PORT_CHAR(0x00a7U) // section + PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(';') PORT_CHAR('.') + PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP) PORT_CHAR(':') PORT_CHAR('/') + PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH) PORT_CHAR(0x00f2U) PORT_CHAR('!') // o grave + + PORT_START("LINE6") + PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') + PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_ENTER) PORT_CHAR(0x000dU) + PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("S1") PORT_CODE(KEYCODE_BACKSLASH) + PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("S2") PORT_CODE(KEYCODE_BACKSPACE) + PORT_BIT(0x10,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Keypad .") PORT_CODE(KEYCODE_DEL_PAD) PORT_CHAR(UCHAR_MAMEKEY(DEL_PAD)) + PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_0_PAD) PORT_CHAR(UCHAR_MAMEKEY(0_PAD)) + PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Keypad 00") PORT_CODE(KEYCODE_ENTER_PAD) + PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_1_PAD) PORT_CHAR(UCHAR_MAMEKEY(1_PAD)) + + PORT_START("LINE7") + PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_2_PAD) PORT_CHAR(UCHAR_MAMEKEY(2_PAD)) + PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_3_PAD) PORT_CHAR(UCHAR_MAMEKEY(3_PAD)) + PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_4_PAD) PORT_CHAR(UCHAR_MAMEKEY(4_PAD)) + PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_5_PAD) PORT_CHAR(UCHAR_MAMEKEY(5_PAD)) + PORT_BIT(0x10,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_6_PAD) PORT_CHAR(UCHAR_MAMEKEY(6_PAD)) + PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_7_PAD) PORT_CHAR(UCHAR_MAMEKEY(7_PAD)) + PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_8_PAD) PORT_CHAR(UCHAR_MAMEKEY(8_PAD)) + PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_9_PAD) PORT_CHAR(UCHAR_MAMEKEY(9_PAD)) + + PORT_START("LINE8") + PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_PLUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(PLUS_PAD)) + PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(MINUS_PAD)) + PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_ASTERISK) PORT_CHAR(UCHAR_MAMEKEY(ASTERISK)) + PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH_PAD) PORT_CHAR(UCHAR_MAMEKEY(SLASH_PAD)) + PORT_BIT(0xf0,IP_ACTIVE_HIGH,IPT_UNUSED) + + PORT_START("MODIFIERS") + PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("COMMAND") PORT_CODE(KEYCODE_TAB) + PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("CTRL") PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_MAMEKEY(LCONTROL)) + PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("R SHIFT") PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1) + PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("L SHIFT") PORT_CODE(KEYCODE_LSHIFT) + PORT_BIT(0xf0,IP_ACTIVE_HIGH,IPT_UNUSED) +INPUT_PORTS_END +} // anonymous namespace + + +m20_keyboard_device::m20_keyboard_device(const machine_config& mconfig, const char* tag, device_t* owner, UINT32 clock) + : buffered_rs232_device(mconfig, M20_KEYBOARD, "M20 Keyboard", tag, owner, 0, "m20_keyboard", __FILE__) + , device_matrix_keyboard_interface(mconfig, *this, "LINE0", "LINE1", "LINE2", "LINE3", "LINE4", "LINE5", "LINE6", "LINE7", "LINE8") + , m_modifiers(*this, "MODIFIERS") { } -void m20_keyboard_device::write(UINT8 data) + +ioport_constructor m20_keyboard_device::device_input_ports() const { - switch(data) - { - case 0x03: - send_key(2); - break; - case 0x80: - send_key(0x80); - break; - } - return; + return INPUT_PORTS_NAME(m20_keyboard); } -UINT8 m20_keyboard_device::keyboard_handler(UINT8 last_code, UINT8 *scan_line) + +void m20_keyboard_device::device_reset() { - int i = *scan_line, j; - UINT8 code = 0, state = m_state[i]; - - if (i == 0) code = m_io_kbd0->read(); - else - if (i == 1) code = m_io_kbd1->read(); - else - if (i == 2) code = m_io_kbd2->read(); - else - if (i == 3) code = m_io_kbd3->read(); - else - if (i == 4) code = m_io_kbd4->read(); - else - if (i == 5) code = m_io_kbd5->read(); - else - if (i == 6) code = m_io_kbd6->read(); - else - if (i == 7) code = m_io_kbd7->read(); - else - if (i == 8) code = m_io_kbd8->read(); - - *scan_line = (*scan_line + 1) % 9; - - if(m_state[i] == code) - return 0; - - m_state[i] = code; - code = (state ^ code) & code; - - if(!code) - return 0; - - for(j = 0; j < 8; j++) - if((code >> j) == 1) - break; - - if(i >= 6) - code = 0xc0 + ((i - 6) << 3) + j; - else - code = (i << 3) + j; - - state = m_io_kbd9->read(); - if(state && (i <= 8)) - { - switch(state) - { - case 1: - code += 0x90; - break; - case 2: - code += 0x60; - break; - case 4: - case 8: - code += 0x30; - break; - } - } + buffered_rs232_device::device_reset(); + + reset_key_state(); + clear_fifo(); - return code; + set_data_frame(1, 8, PARITY_NONE, STOP_BITS_2); + 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(1'200)); } -// Italian layout -static INPUT_PORTS_START( m20_keyboard ) - PORT_START("TERM_LINE0") - PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("RESET") PORT_CODE(KEYCODE_ESC) - PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("<") PORT_CODE(KEYCODE_LALT) PORT_CHAR('<') PORT_CHAR('>') - PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') - PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B') - PORT_BIT(0x10,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C') - PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D') - PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E') - PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F') - - PORT_START("TERM_LINE1") - PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G') - PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') - PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') - PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J') - PORT_BIT(0x10,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K') - PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L') - PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('?') - PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N') - - PORT_START("TERM_LINE2") - PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') - PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') - PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') - PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') - PORT_BIT(0x10,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S') - PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T') - PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') - PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V') - - PORT_START("TERM_LINE3") - PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') - PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') - PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') - PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') - PORT_BIT(0x10,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("\xc3\xa0 0") PORT_CODE(KEYCODE_0) PORT_CHAR(0x85) PORT_CHAR('0') // a_GRAVE - PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("\xc2\xa3 1") PORT_CODE(KEYCODE_1) PORT_CHAR(0x9c) PORT_CHAR('1') // POUND - PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME(e_ACUTE " 2") PORT_CODE(KEYCODE_2) PORT_CHAR(0x82) PORT_CHAR('2') - PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("\" 3") PORT_CODE(KEYCODE_3) PORT_CHAR('"') PORT_CHAR('3') - - PORT_START("TERM_LINE4") - PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("' 4") PORT_CODE(KEYCODE_4) PORT_CHAR('\'') PORT_CHAR('4') - PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("( 5") PORT_CODE(KEYCODE_5) PORT_CHAR('(') PORT_CHAR('5') - PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("_ 6") PORT_CODE(KEYCODE_6) PORT_CHAR('_') PORT_CHAR('6') - PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("\xc3\xa8 7") PORT_CODE(KEYCODE_7) PORT_CHAR(0x8a) PORT_CHAR('7') // e_GRAVE - PORT_BIT(0x10,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("^ 8") PORT_CODE(KEYCODE_8) PORT_CHAR('^') PORT_CHAR('8') - PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("\xc3\xa7 9") PORT_CODE(KEYCODE_9) PORT_CHAR(0x87) PORT_CHAR('9') // c_CEDILLA - PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME(") \xc2\xb0") PORT_CODE(KEYCODE_MINUS) PORT_CHAR(')') PORT_CHAR(0xa7) // DEGREE - PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("- +") PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('-') PORT_CHAR('+') - - PORT_START("TERM_LINE5") - PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("\xc3\xac =") PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR(0x8d) PORT_CHAR('=') // i_GRAVE - PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("$ &") PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR('$') PORT_CHAR('&') - PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') - PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("\xc3\xb9 %") PORT_CODE(KEYCODE_COLON) PORT_CHAR(0x8a) PORT_CHAR('%') // u_GRAVE - PORT_BIT(0x10,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("* \xc2\xa7") PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('*') PORT_CHAR(0xf5) // SECTION - PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("; .") PORT_CODE(KEYCODE_STOP) PORT_CHAR(';') PORT_CHAR('.') - PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME(": /") PORT_CODE(KEYCODE_SLASH) PORT_CHAR(':') PORT_CHAR('/') - PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("\xc3\xb2") PORT_CODE(KEYCODE_RALT) PORT_CHAR(0x95) - - PORT_START("TERM_LINE6") - PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') - PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) - PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("S1") PORT_CODE(KEYCODE_BACKSPACE) - PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("S2") PORT_CODE(KEYCODE_BACKSLASH) - PORT_BIT(0x10,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Keypad .") PORT_CODE(KEYCODE_DEL_PAD) PORT_CHAR(UCHAR_MAMEKEY(DEL_PAD)) - PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_0_PAD) PORT_CHAR(UCHAR_MAMEKEY(0_PAD)) - PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Keypad 00") PORT_CODE(KEYCODE_ENTER_PAD) - PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_1_PAD) PORT_CHAR(UCHAR_MAMEKEY(1_PAD)) - - PORT_START("TERM_LINE7") - PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_2_PAD) PORT_CHAR(UCHAR_MAMEKEY(2_PAD)) - PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_3_PAD) PORT_CHAR(UCHAR_MAMEKEY(3_PAD)) - PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_4_PAD) PORT_CHAR(UCHAR_MAMEKEY(4_PAD)) - PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_5_PAD) PORT_CHAR(UCHAR_MAMEKEY(5_PAD)) - PORT_BIT(0x10,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_6_PAD) PORT_CHAR(UCHAR_MAMEKEY(6_PAD)) - PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_7_PAD) PORT_CHAR(UCHAR_MAMEKEY(7_PAD)) - PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_8_PAD) PORT_CHAR(UCHAR_MAMEKEY(8_PAD)) - PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_9_PAD) PORT_CHAR(UCHAR_MAMEKEY(9_PAD)) - - PORT_START("TERM_LINE8") - PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_PLUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(PLUS_PAD)) - PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(PLUS_PAD)) - PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_ASTERISK) PORT_CHAR(UCHAR_MAMEKEY(ASTERISK)) - PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH_PAD) PORT_CHAR(UCHAR_MAMEKEY(SLASH_PAD)) - - PORT_START("TERM_LINE9") - PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("COMMAND") PORT_CODE(KEYCODE_TAB) - PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("CTRL") PORT_CODE(KEYCODE_LCONTROL) - PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1) - PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_CODE(KEYCODE_LSHIFT) - - PORT_START("TERM_LINEC") - - PORT_START("RS232_TXBAUD") - PORT_CONFNAME(0xff, RS232_BAUD_1200, "TX Baud") PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, serial_keyboard_device, update_serial) - PORT_CONFSETTING( RS232_BAUD_1200, "1200") - - PORT_START("RS232_STARTBITS") - PORT_CONFNAME(0xff, RS232_STARTBITS_1, "Start Bits") PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, serial_keyboard_device, update_serial) - PORT_CONFSETTING( RS232_STARTBITS_1, "1") - - PORT_START("RS232_DATABITS") - PORT_CONFNAME(0xff, RS232_DATABITS_8, "Data Bits") PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, serial_keyboard_device, update_serial) - PORT_CONFSETTING( RS232_DATABITS_8, "8") - - PORT_START("RS232_PARITY") - PORT_CONFNAME(0xff, RS232_PARITY_NONE, "Parity") PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, serial_keyboard_device, update_serial) - PORT_CONFSETTING( RS232_PARITY_NONE, "None") - - PORT_START("RS232_STOPBITS") - PORT_CONFNAME(0xff, RS232_STOPBITS_2, "Stop Bits") PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, serial_keyboard_device, update_serial) - PORT_CONFSETTING( RS232_STOPBITS_2, "2") -INPUT_PORTS_END -ioport_constructor m20_keyboard_device::device_input_ports() const +void m20_keyboard_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) { - return INPUT_PORTS_NAME(m20_keyboard); + device_matrix_keyboard_interface::device_timer(timer, id, param, ptr); + buffered_rs232_device::device_timer(timer, id, param, ptr); } -void m20_keyboard_device::device_start() + +void m20_keyboard_device::key_make(UINT8 row, UINT8 column) { - serial_keyboard_device::device_start(); - memset(m_state, '\0', sizeof(m_state)); - set_rcv_rate(1200); + UINT8 const row_code(((row < 6U) ? row : (0x18U | (row - 6U))) << 3); + UINT8 const modifiers(m_modifiers->read()); + UINT8 mod_code(0U); + switch (modifiers) + { + case 0x01U: // COMMAND + mod_code = 0x90; + break; + case 0x02U: // CTRL + mod_code = 0x60; + break; + case 0x04U: // RSHIFT + case 0x08U: // LSHIFT + case 0x0cU: // LSHIFT|RSHIFT + mod_code = 0x30; + break; + } + transmit_byte((row_code | column) + mod_code); } -void m20_keyboard_device::rcv_complete() + +void m20_keyboard_device::received_byte(UINT8 byte) { - receive_register_extract(); - write(get_received_char()); + switch (byte) + { + case 0x03U: + transmit_byte(0x02U); + break; + case 0x80U: + transmit_byte(0x80U); + break; + default: + logerror("received unknown command %02x", byte); + } } + const device_type M20_KEYBOARD = &device_creator<m20_keyboard_device>; diff --git a/src/mame/machine/m20_kbd.h b/src/mame/machine/m20_kbd.h index 3cade9c11e4..dfbd6d71a62 100644 --- a/src/mame/machine/m20_kbd.h +++ b/src/mame/machine/m20_kbd.h @@ -1,26 +1,28 @@ // license:BSD-3-Clause -// copyright-holders:Carl -#ifndef M20KBD_H_ -#define M20KBD_H_ +// copyright-holders:Carl,Vas Crabb +#ifndef MAME_MACHINE_M20KBD_H +#define MAME_MACHINE_M20KBD_H -#include "bus/rs232/keyboard.h" +#include "bus/rs232/rs232.h" +#include "machine/keyboard.h" -class m20_keyboard_device : public serial_keyboard_device +class m20_keyboard_device : public buffered_rs232_device<16U>, protected device_matrix_keyboard_interface<9U> { public: m20_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); virtual ioport_constructor device_input_ports() const override; protected: - virtual void device_start() override; - virtual void rcv_complete() override; + virtual void device_reset() override; + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; + virtual void key_make(UINT8 row, UINT8 column) override; private: - void write(UINT8 data); - virtual UINT8 keyboard_handler(UINT8 last_code, UINT8 *scan_line) override; - UINT8 m_state[16]; + virtual void received_byte(UINT8 byte) override; + + required_ioport m_modifiers; }; extern const device_type M20_KEYBOARD; -#endif /* M20KBD_H_ */ +#endif // MAME_MACHINE_M20KBD_H diff --git a/src/mame/machine/ngen_kb.cpp b/src/mame/machine/ngen_kb.cpp index 4c901ea5d41..960cc97f3c7 100644 --- a/src/mame/machine/ngen_kb.cpp +++ b/src/mame/machine/ngen_kb.cpp @@ -1,12 +1,19 @@ // license:BSD-3-Clause // copyright-holders:Barry Rodewald // Convergent NGEN keyboard device +/* + TODO: represent the real layout/scancodes for this keyboard. The + current HLE just sends ASCII and hopes, with an additional 0xc0 + "last key up" code. We're also inheriting typematic behaviour from + the serial keyboard which may not be desirable. +*/ #include "ngen_kb.h" -ngen_keyboard_device::ngen_keyboard_device(const machine_config& mconfig, const char* tag, device_t* owner, UINT32 clock) : - serial_keyboard_device(mconfig, NGEN_KEYBOARD, "NGEN Keyboard", tag, owner, 0, "ngen_keyboard", __FILE__), - m_keys_down(false) +ngen_keyboard_device::ngen_keyboard_device(const machine_config& mconfig, const char* tag, device_t* owner, UINT32 clock) + : serial_keyboard_device(mconfig, NGEN_KEYBOARD, "NGEN Keyboard", tag, owner, 0, "ngen_keyboard", __FILE__) + , m_keys_down(0U) + , m_last_reset(0U) { } @@ -21,164 +28,12 @@ void ngen_keyboard_device::write(UINT8 data) logerror("KB: received character %02x\n",data); switch(data) { - case 0x92: // reset(?) - m_last_reset = true; - break; + case 0x92U: // reset(?) + m_last_reset = 0x01U; + break; } } -UINT8 ngen_keyboard_device::row_number(UINT8 code) -{ - if BIT(code,0) return 0; - if BIT(code,1) return 1; - if BIT(code,2) return 2; - if BIT(code,3) return 3; - if BIT(code,4) return 4; - if BIT(code,5) return 5; - if BIT(code,6) return 6; - if BIT(code,7) return 7; - return 0; -} - -UINT8 ngen_keyboard_device::keyboard_handler(UINT8 last_code, UINT8 *scan_line) -{ - int i; - UINT8 code = 0; - UINT8 key_code = 0; - UINT8 retVal = 0x00; - UINT8 shift = BIT(m_io_kbdc->read(), 1); - UINT8 caps = BIT(m_io_kbdc->read(), 2); - UINT8 ctrl = BIT(m_io_kbdc->read(), 0); - i = *scan_line; - { - if (i == 0) code = m_io_kbd0->read(); - else - if (i == 1) code = m_io_kbd1->read(); - else - if (i == 2) code = m_io_kbd2->read(); - else - if (i == 3) code = m_io_kbd3->read(); - else - if (i == 4) code = m_io_kbd4->read(); - else - if (i == 5) code = m_io_kbd5->read(); - else - if (i == 6) code = m_io_kbd6->read(); - else - if (i == 7) code = m_io_kbd7->read(); - else - if (i == 8) code = m_io_kbd8->read(); - else - if (i == 9) code = m_io_kbd9->read(); - - if (code != 0) - { - if (i==0 && shift==0) { - key_code = 0x30 + row_number(code) + 8*i; // for numbers and some signs - } - if (i==0 && shift==1) { - key_code = 0x20 + row_number(code) + 8*i; // for shifted numbers - } - if (i==1 && shift==0) { - if (row_number(code) < 4) { - key_code = 0x30 + row_number(code) + 8*i; // for numbers and some signs - } else { - key_code = 0x20 + row_number(code) + 8*i; // for numbers and some signs - } - } - if (i==1 && shift==1) { - if (row_number(code) < 4) { - key_code = 0x20 + row_number(code) + 8*i; // for numbers and some signs - } else { - key_code = 0x30 + row_number(code) + 8*i; // for numbers and some signs - } - } - if (i>=2 && i<=4 && (shift ^ caps)==0 && ctrl==0) { - key_code = 0x60 + row_number(code) + (i-2)*8; // for small letters - } - if (i>=2 && i<=4 && (shift ^ caps)==1 && ctrl==0) { - key_code = 0x40 + row_number(code) + (i-2)*8; // for big letters - } - if (i>=2 && i<=5 && ctrl==1) { - key_code = 0x00 + row_number(code) + (i-2)*8; // for CTRL + letters - } - if (i==5 && shift==1 && ctrl==0) { - if (row_number(code)<7) { - if (row_number(code)<3) { - key_code = (caps ? 0x60 : 0x40) + row_number(code) + (i-2)*8; // for big letters - } else { - key_code = 0x60 + row_number(code) + (i-2)*8; // for upper symbols letters - } - } else { - key_code = 0x40 + row_number(code) + (i-2)*8; // for DEL it is switched - } - } - if (i==5 && shift==0 && ctrl==0) { - if (row_number(code)<7) { - if (row_number(code)<3) { - key_code = (caps ? 0x40 : 0x60) + row_number(code) + (i-2)*8; // for small letters - } else { - key_code = 0x40 + row_number(code) + (i-2)*8; // for lower symbols letters - } - } else { - key_code = 0x60 + row_number(code) + (i-2)*8; // for DEL it is switched - } - } - - if (i==6) { - switch(row_number(code)) - { -/* case 0: key_code = 0x11; break; - case 1: key_code = 0x12; break; - case 2: key_code = 0x13; break; - case 3: key_code = 0x14; break;*/ - case 4: key_code = 0x20; break; // Space - case 5: key_code = 0x0A; break; // LineFeed - case 6: key_code = 0x09; break; // TAB - case 7: key_code = 0x0D; break; // Enter - } - } - if (i==7) - { - switch(row_number(code)) - { - case 0: key_code = 0x1B; break; // Escape - case 1: key_code = 0x08; break; // Backspace - } - } - else - if (i==8) - { - key_code = row_number(code)+0x81; - if (ctrl) key_code+=0x10; - if (shift) key_code+=0x20; - } - else - if (i==9) - { - key_code = row_number(code)+0x89; - if (ctrl) key_code+=0x10; - if (shift) key_code+=0x20; - } - m_keys_down = true; - m_last_reset = false; - retVal = key_code; - } - else - { - *scan_line += 1; - if (*scan_line==10) - *scan_line = 0; - if(m_keys_down) - { - retVal = 0xc0; - m_keys_down = false; - } - } - } - return retVal; -} - static INPUT_PORTS_START( ngen_keyboard ) PORT_INCLUDE(generic_keyboard) @@ -212,14 +67,19 @@ ioport_constructor ngen_keyboard_device::device_input_ports() const void ngen_keyboard_device::device_start() { serial_keyboard_device::device_start(); + + save_item(NAME(m_keys_down)); + save_item(NAME(m_last_reset)); + set_rcv_rate(19200); } void ngen_keyboard_device::device_reset() { serial_keyboard_device::device_reset(); - m_keys_down = false; - m_last_reset = true; + + m_keys_down = UINT8(~0U); + m_last_reset = 0U; } void ngen_keyboard_device::rcv_complete() @@ -228,4 +88,21 @@ void ngen_keyboard_device::rcv_complete() write(get_received_char()); } +void ngen_keyboard_device::key_make(UINT8 row, UINT8 column) +{ + serial_keyboard_device::key_make(row, column); + m_keys_down = UINT8((row << 4) | column); + m_last_reset = 0U; +} + +void ngen_keyboard_device::key_break(UINT8 row, UINT8 column) +{ + serial_keyboard_device::key_break(row, column); + if (m_keys_down == UINT8((row << 4) | column)) + { + m_keys_down = UINT8(~0U); + send_key(0xc0U); + } +} + const device_type NGEN_KEYBOARD = &device_creator<ngen_keyboard_device>; diff --git a/src/mame/machine/ngen_kb.h b/src/mame/machine/ngen_kb.h index 1270077bf99..5b181cd0db6 100644 --- a/src/mame/machine/ngen_kb.h +++ b/src/mame/machine/ngen_kb.h @@ -2,8 +2,8 @@ // copyright-holders:Barry Rodewald // Convergent NGEN keyboard -#ifndef NGEN_KB_H_ -#define NGEN_KB_H_ +#ifndef MAME_MACHINE_NGEN_KB_H +#define MAME_MACHINE_NGEN_KB_H #include "bus/rs232/keyboard.h" @@ -12,22 +12,21 @@ class ngen_keyboard_device : public serial_keyboard_device public: ngen_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); virtual ioport_constructor device_input_ports() const override; - virtual DECLARE_WRITE_LINE_MEMBER( input_txd ) override { device_serial_interface::rx_w(state); } protected: virtual void device_start() override; virtual void device_reset() override; virtual void rcv_complete() override; + virtual void key_make(UINT8 row, UINT8 column) override; + virtual void key_break(UINT8 row, UINT8 column) override; private: - virtual UINT8 keyboard_handler(UINT8 last_code, UINT8 *scan_line) override; - UINT8 row_number(UINT8 code); void write(UINT8 data); - bool m_keys_down; - bool m_last_reset; + UINT8 m_keys_down; + UINT8 m_last_reset; }; extern const device_type NGEN_KEYBOARD; -#endif /* NGENKB_H_ */ +#endif // MAME_MACHINE_NGEN_KB_H diff --git a/src/mame/machine/qx10kbd.cpp b/src/mame/machine/qx10kbd.cpp index 1a4c7364c06..6945f36b9a4 100644 --- a/src/mame/machine/qx10kbd.cpp +++ b/src/mame/machine/qx10kbd.cpp @@ -1,105 +1,83 @@ // license:BSD-3-Clause // copyright-holders:Carl -// TODO: dump 8049 mcu; key repeat +// TODO: dump 8049 mcu; key repeat; LEDs #include "machine/qx10kbd.h" -qx10_keyboard_device::qx10_keyboard_device(const machine_config& mconfig, const char* tag, device_t* owner, UINT32 clock) : - serial_keyboard_device(mconfig, QX10_KEYBOARD, "QX10 Keyboard", tag, owner, 0, "qx10_keyboard", __FILE__), - m_io_kbd8(*this, "TERM_LINE8"), - m_io_kbd9(*this, "TERM_LINE9"), - m_io_kbda(*this, "TERM_LINEA"), - m_io_kbdb(*this, "TERM_LINEB"), - m_io_kbdd(*this, "TERM_LINED"), - m_io_kbde(*this, "TERM_LINEE"), - m_io_kbdf(*this, "TERM_LINEF") +#include "bus/rs232/rs232.ipp" +#include "machine/keyboard.ipp" + + +qx10_keyboard_device::qx10_keyboard_device(const machine_config& mconfig, const char* tag, device_t* owner, UINT32 clock) + : buffered_rs232_device(mconfig, QX10_KEYBOARD, "QX10 Keyboard", tag, owner, 0, "qx10_keyboard", __FILE__) + , device_matrix_keyboard_interface(mconfig, *this, "LINE0", "LINE1", "LINE2", "LINE3", "LINE4", "LINE5", "LINE6", "LINE7", "LINE8", "LINE9", "LINEA", "LINEB", "LINEC", "LINED", "LINEE", "LINEF") { } -void qx10_keyboard_device::write(UINT8 data) + +void qx10_keyboard_device::device_reset() { - switch(data & 0xe0) - { - default: - break; - case 0x00: // set repeat start - break; - case 0x20: // set repeat interval - break; - case 0x40: // set LED - break; - case 0x60: // get LED - send_key(0); - break; - case 0x80: // get SW - break; - case 0xa0: // set repeat - break; - case 0xc0: // enable keyboard - break; - case 0xe0: - if(!(data & 1)) - send_key(0); - break; - } - return; + 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)); +} + + +void qx10_keyboard_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +{ + device_matrix_keyboard_interface::device_timer(timer, id, param, ptr); + buffered_rs232_device::device_timer(timer, id, param, ptr); } -UINT8 qx10_keyboard_device::keyboard_handler(UINT8 last_code, UINT8 *scan_line) + +void qx10_keyboard_device::key_make(UINT8 row, UINT8 column) { - int i = *scan_line, j; - UINT8 code = 0; - - if (i == 0) code = m_io_kbd0->read(); - else - if (i == 1) code = m_io_kbd1->read(); - else - if (i == 2) code = m_io_kbd2->read(); - else - if (i == 3) code = m_io_kbd3->read(); - else - if (i == 4) code = m_io_kbd4->read(); - else - if (i == 5) code = m_io_kbd5->read(); - else - if (i == 6) code = m_io_kbd6->read(); - else - if (i == 7) code = m_io_kbd7->read(); - else - if (i == 8) code = m_io_kbd8->read(); - else - if (i == 9) code = m_io_kbd9->read(); - else - if (i == 10) code = m_io_kbda->read(); - else - if (i == 11) code = m_io_kbdb->read(); - else - if (i == 12) code = m_io_kbdc->read(); - else - if (i == 13) code = m_io_kbdd->read(); - else - if (i == 14) code = m_io_kbde->read(); - else - if (i == 15) code = m_io_kbdf->read(); - - *scan_line = (*scan_line + 1) % 16; - - if(m_state[i] == code) - return 0; - - m_state[i] = code; - - if(!code) - return 0; - - for(j = 0; j < 8; j++) - if((code >> j) == 1) break; - - return (j << 4) + i; + transmit_byte((column << 4) | row); } + +void qx10_keyboard_device::received_byte(UINT8 data) +{ + 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; + } +} + + static INPUT_PORTS_START( qx10_keyboard ) - PORT_START("TERM_LINE0") + PORT_START("LINE0") PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_UNUSED) PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_UNUSED) PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("RSHIFT") @@ -109,7 +87,7 @@ static INPUT_PORTS_START( qx10_keyboard ) PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("GRPH SHIFT") PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("LCTRL") PORT_CODE(KEYCODE_LCONTROL) - PORT_START("TERM_LINE1") + PORT_START("LINE1") PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("F4/UNDO") PORT_CODE(KEYCODE_F4) PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_UNUSED) PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_UNUSED) @@ -119,7 +97,7 @@ static INPUT_PORTS_START( qx10_keyboard ) PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("2") PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("F3/COPY DISK") PORT_CODE(KEYCODE_F3) - PORT_START("TERM_LINE2") + PORT_START("LINE2") PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("F5/(H1)") PORT_CODE(KEYCODE_F5) PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_UNUSED) PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_UNUSED) @@ -129,7 +107,7 @@ static INPUT_PORTS_START( qx10_keyboard ) PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("3") PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("F2/HELP") PORT_CODE(KEYCODE_F2) - PORT_START("TERM_LINE3") + PORT_START("LINE3") PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("F6/STORE") PORT_CODE(KEYCODE_F6) PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_UNUSED) PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_UNUSED) @@ -139,7 +117,7 @@ static INPUT_PORTS_START( qx10_keyboard ) PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("4") PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("F1/STOP") PORT_CODE(KEYCODE_F1) - PORT_START("TERM_LINE4") + PORT_START("LINE4") PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("F7/RETRIEVE") PORT_CODE(KEYCODE_F7) PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_UNUSED) PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_UNUSED) @@ -149,7 +127,7 @@ static INPUT_PORTS_START( qx10_keyboard ) PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("5") PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("MAR SEL") - PORT_START("TERM_LINE5") + PORT_START("LINE5") PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("F8/PRINT") PORT_CODE(KEYCODE_F8) PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("ENTER (PAD)") PORT_CODE(KEYCODE_ENTER_PAD) PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("3 (PAD)") PORT_CODE(KEYCODE_3_PAD) PORT_CHAR('3') @@ -159,7 +137,7 @@ static INPUT_PORTS_START( qx10_keyboard ) PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("6") PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("ESC/^") PORT_CODE(KEYCODE_ESC) - PORT_START("TERM_LINE6") + PORT_START("LINE6") PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("F9/INDEX") PORT_CODE(KEYCODE_F9) PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME(". (PAD)") PORT_CODE(KEYCODE_DEL_PAD) PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("2 (PAD)") PORT_CODE(KEYCODE_2_PAD) PORT_CHAR('2') @@ -169,7 +147,7 @@ static INPUT_PORTS_START( qx10_keyboard ) PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("7") PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("1") PORT_CODE(KEYCODE_1) PORT_CHAR('1') - PORT_START("TERM_LINE7") + PORT_START("LINE7") PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("F10/MAIL") PORT_CODE(KEYCODE_F10) PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("0 (PAD)") PORT_CODE(KEYCODE_0_PAD) PORT_CHAR('0') PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("1 (PAD)") PORT_CODE(KEYCODE_1_PAD) PORT_CHAR('1') @@ -179,7 +157,7 @@ static INPUT_PORTS_START( qx10_keyboard ) PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("8") PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("TAB") PORT_CODE(KEYCODE_TAB) - PORT_START("TERM_LINE8") + PORT_START("LINE8") PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("(H2)") PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("= (PAD)") PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("+ (PAD)") PORT_CODE(KEYCODE_PLUS_PAD) PORT_CHAR('+') @@ -189,7 +167,7 @@ static INPUT_PORTS_START( qx10_keyboard ) PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("9") PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("TAB SET") - PORT_START("TERM_LINE9") + PORT_START("LINE9") PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("BREAK/MENU") PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("6 (PAD)") PORT_CODE(KEYCODE_6_PAD) PORT_CHAR('6') PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("9 (PAD)") PORT_CODE(KEYCODE_9_PAD) PORT_CHAR('9') @@ -199,7 +177,7 @@ static INPUT_PORTS_START( qx10_keyboard ) PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("0") PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_UNUSED) - PORT_START("TERM_LINEA") + PORT_START("LINEA") PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("PAUSE/CALC") PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("5 (PAD)") PORT_CODE(KEYCODE_5_PAD) PORT_CHAR('5') PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("8 (PAD)") PORT_CODE(KEYCODE_8_PAD) PORT_CHAR('8') @@ -209,7 +187,7 @@ static INPUT_PORTS_START( qx10_keyboard ) PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("-") PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_UNUSED) - PORT_START("TERM_LINEB") + PORT_START("LINEB") PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("SCRN DUMP/SCHED") PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("4 (PAD)") PORT_CODE(KEYCODE_4_PAD) PORT_CHAR('4') PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("7 (PAD)") PORT_CODE(KEYCODE_7_PAD) PORT_CHAR('7') @@ -219,7 +197,7 @@ static INPUT_PORTS_START( qx10_keyboard ) PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("=") PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_UNUSED) - PORT_START("TERM_LINEC") + PORT_START("LINEC") PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("HELP/DRAW") PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("(H5)") PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("- (PAD)") PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHAR('-') @@ -229,7 +207,7 @@ static INPUT_PORTS_START( qx10_keyboard ) PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("\\") PORT_CODE(KEYCODE_BACKSLASH) PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_UNUSED) - PORT_START("TERM_LINED") + PORT_START("LINED") PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("(H3)") PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("MF4/(H4)") PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("* (PAD)") PORT_CODE(KEYCODE_ASTERISK) PORT_CHAR('*') @@ -239,7 +217,7 @@ static INPUT_PORTS_START( qx10_keyboard ) PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("BACKSPACE") PORT_CODE(KEYCODE_BACKSPACE) PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_UNUSED) - PORT_START("TERM_LINEE") + PORT_START("LINEE") PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("BOLD") PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("MF3/STYLE") PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("/ (PAD)") PORT_CODE(KEYCODE_SLASH_PAD) PORT_CHAR('/') @@ -249,7 +227,7 @@ static INPUT_PORTS_START( qx10_keyboard ) PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("D-7") PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_UNUSED) - PORT_START("TERM_LINEF") + PORT_START("LINEF") PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("MF1/ITALIC") PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("MF2/SIZE") PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("`/DEC TAB") PORT_CODE(KEYCODE_TILDE) PORT_CHAR('`') @@ -258,26 +236,6 @@ static INPUT_PORTS_START( qx10_keyboard ) PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("DEL/WORD") PORT_CODE(KEYCODE_DEL) PORT_CHAR(UCHAR_MAMEKEY(DEL)) PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("CLS/LINE") PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_UNUSED) - - PORT_START("RS232_TXBAUD") - PORT_CONFNAME(0xff, RS232_BAUD_1200, "TX Baud") PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, serial_keyboard_device, update_serial) - PORT_CONFSETTING( RS232_BAUD_1200, "1200") - - PORT_START("RS232_STARTBITS") - PORT_CONFNAME(0xff, RS232_STARTBITS_1, "Start Bits") PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, serial_keyboard_device, update_serial) - PORT_CONFSETTING( RS232_STARTBITS_1, "1") - - PORT_START("RS232_DATABITS") - PORT_CONFNAME(0xff, RS232_DATABITS_8, "Data Bits") PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, serial_keyboard_device, update_serial) - PORT_CONFSETTING( RS232_DATABITS_8, "8") - - PORT_START("RS232_PARITY") - PORT_CONFNAME(0xff, RS232_PARITY_EVEN, "Parity") PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, serial_keyboard_device, update_serial) - PORT_CONFSETTING( RS232_PARITY_EVEN, "Even") - - PORT_START("RS232_STOPBITS") - PORT_CONFNAME(0xff, RS232_STOPBITS_1, "Stop Bits") PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, serial_keyboard_device, update_serial) - PORT_CONFSETTING( RS232_STOPBITS_1, "1") INPUT_PORTS_END ioport_constructor qx10_keyboard_device::device_input_ports() const @@ -285,17 +243,5 @@ ioport_constructor qx10_keyboard_device::device_input_ports() const return INPUT_PORTS_NAME(qx10_keyboard); } -void qx10_keyboard_device::device_start() -{ - serial_keyboard_device::device_start(); - memset(m_state, '\0', sizeof(m_state)); - set_rcv_rate(1200); -} - -void qx10_keyboard_device::rcv_complete() -{ - receive_register_extract(); - write(get_received_char()); -} const device_type QX10_KEYBOARD = &device_creator<qx10_keyboard_device>; diff --git a/src/mame/machine/qx10kbd.h b/src/mame/machine/qx10kbd.h index 4adb6ebb9a4..f77b1b06c31 100644 --- a/src/mame/machine/qx10kbd.h +++ b/src/mame/machine/qx10kbd.h @@ -1,35 +1,25 @@ // license:BSD-3-Clause // copyright-holders:Carl -#ifndef QX10KBD_H_ -#define QX10KBD_H_ +#ifndef MAME_MACHINE_QX10KBD_H +#define MAME_MACHINE_QX10KBD_H #include "bus/rs232/keyboard.h" -class qx10_keyboard_device : public serial_keyboard_device +class qx10_keyboard_device : public buffered_rs232_device<16U>, protected device_matrix_keyboard_interface<16U> { public: qx10_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); virtual ioport_constructor device_input_ports() const override; protected: - virtual void device_start() override; - virtual void rcv_complete() override; + virtual void device_reset() override; + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; + virtual void key_make(UINT8 row, UINT8 column) override; private: - virtual UINT8 keyboard_handler(UINT8 last_code, UINT8 *scan_line) override; - void write(UINT8 data); - - required_ioport m_io_kbd8; - required_ioport m_io_kbd9; - required_ioport m_io_kbda; - required_ioport m_io_kbdb; - required_ioport m_io_kbdd; - required_ioport m_io_kbde; - required_ioport m_io_kbdf; - - UINT8 m_state[16]; + virtual void received_byte(UINT8 data) override; }; extern const device_type QX10_KEYBOARD; -#endif /* QX10KBD_H_ */ +#endif // MAME_MACHINE_QX10KBD_H diff --git a/src/mame/machine/rmnkbd.cpp b/src/mame/machine/rmnkbd.cpp index 30987c6701e..c21da9fbe02 100644 --- a/src/mame/machine/rmnkbd.cpp +++ b/src/mame/machine/rmnkbd.cpp @@ -1,209 +1,180 @@ // license:BSD-3-Clause -// copyright-holders:Carl +// copyright-holders:Carl,Vas Crabb #include "machine/rmnkbd.h" -rmnimbus_keyboard_device::rmnimbus_keyboard_device(const machine_config& mconfig, const char* tag, device_t* owner, UINT32 clock) : - serial_keyboard_device(mconfig, RMNIMBUS_KEYBOARD, "RM Nimbus Keyboard", tag, owner, 0, "rmnimbus_keyboard", __FILE__), - m_io_kbd8(*this, "TERM_LINE8"), - m_io_kbd9(*this, "TERM_LINE9"), - m_io_kbda(*this, "TERM_LINEA") -{ -} +#include "bus/rs232/rs232.ipp" +#include "machine/keyboard.ipp" + + +namespace { +INPUT_PORTS_START( rmnimbus_keyboard ) + PORT_START("LINE0") // Key row 0 scancodes 00..07 + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("ESC") PORT_CODE(KEYCODE_ESC) PORT_CHAR(0x001bU) + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('"') + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR(0x00a3U) + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('^') + + PORT_START("LINE1") // Key row 1 scancodes 08..0F + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('&') + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('*') + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR('(') + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(')') + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('_') + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('=') PORT_CHAR('+') + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("BSPACE") PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(0x0008U) + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("TAB") PORT_CODE(KEYCODE_TAB) PORT_CHAR(0x0009U) + + PORT_START("LINE2") // Key row 2 scancodes 10..17 + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E') + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T') + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') + + PORT_START("LINE3") // Key row 3 scancodes 18..1F + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('[') PORT_CHAR('{') + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}') + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("ENTER") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(0x0D) + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("CTRL") PORT_CODE(KEYCODE_LCONTROL) PORT_CODE(KEYCODE_RCONTROL) // Either control + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S') + + PORT_START("LINE4") // Key row 4 scancodes 20..27 + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D') + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F') + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G') + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J') + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K') + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L') + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':') + + PORT_START("LINE5") // Key row 5 scancodes 28..2F + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'') PORT_CHAR('@') + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_TILDE) PORT_CHAR('#') PORT_CHAR('~') + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("LSHIFT") PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('\\') PORT_CHAR('|') + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C') + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V') + + PORT_START("LINE6") // Key row 6 scancodes 30..37 + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B') + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N') + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<') + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>') + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("RSHIFT") PORT_CODE(KEYCODE_RSHIFT) + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("PRT SC") PORT_CODE(KEYCODE_ASTERISK) PORT_CHAR(UCHAR_MAMEKEY(ASTERISK)) + + PORT_START("LINE7") // Key row 7 scancodes 38..3F + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("ALT") PORT_CODE(KEYCODE_LALT) PORT_CODE(KEYCODE_RALT) // Either alt + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("SPACE") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("CAPS LOCK") PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F1") PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1)) + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F2") PORT_CODE(KEYCODE_F2) PORT_CHAR(UCHAR_MAMEKEY(F2)) + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F3") PORT_CODE(KEYCODE_F3) PORT_CHAR(UCHAR_MAMEKEY(F3)) + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F4") PORT_CODE(KEYCODE_F4) PORT_CHAR(UCHAR_MAMEKEY(F4)) + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F5") PORT_CODE(KEYCODE_F5) PORT_CHAR(UCHAR_MAMEKEY(F5)) + + PORT_START("LINE8") // Key row 8 scancodes 40..47 + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F6") PORT_CODE(KEYCODE_F6) PORT_CHAR(UCHAR_MAMEKEY(F6)) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F7") PORT_CODE(KEYCODE_F7) PORT_CHAR(UCHAR_MAMEKEY(F7)) + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F8") PORT_CODE(KEYCODE_F8) PORT_CHAR(UCHAR_MAMEKEY(F8)) + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F9") PORT_CODE(KEYCODE_F9) PORT_CHAR(UCHAR_MAMEKEY(F9)) + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F10") PORT_CODE(KEYCODE_F10) PORT_CHAR(UCHAR_MAMEKEY(F1)) + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("NUM LOCK") PORT_CODE(KEYCODE_NUMLOCK) PORT_CHAR(UCHAR_MAMEKEY(NUMLOCK)) + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("SCROLL LOCK") PORT_CODE(KEYCODE_SCRLOCK) PORT_CHAR(UCHAR_MAMEKEY(SCRLOCK)) + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KP7") PORT_CODE(KEYCODE_7_PAD) PORT_CHAR(UCHAR_MAMEKEY(7_PAD)) + + PORT_START("LINE9") // Key row 9 scancodes 48..4F + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KP8") PORT_CODE(KEYCODE_8_PAD) PORT_CHAR(UCHAR_MAMEKEY(8_PAD)) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KP9") PORT_CODE(KEYCODE_9_PAD) PORT_CHAR(UCHAR_MAMEKEY(9_PAD)) + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KP-") PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(MINUS_PAD)) + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KP4") PORT_CODE(KEYCODE_4_PAD) PORT_CHAR(UCHAR_MAMEKEY(4_PAD)) + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KP5") PORT_CODE(KEYCODE_5_PAD) PORT_CHAR(UCHAR_MAMEKEY(5_PAD)) + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KP6") PORT_CODE(KEYCODE_6_PAD) PORT_CHAR(UCHAR_MAMEKEY(6_PAD)) + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KP+") PORT_CODE(KEYCODE_PLUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(PLUS_PAD)) + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KP1") PORT_CODE(KEYCODE_1_PAD) PORT_CHAR(UCHAR_MAMEKEY(1_PAD)) + + PORT_START("LINEA") /* Key row 10 scancodes 50..57 */ + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KP2") PORT_CODE(KEYCODE_2_PAD) PORT_CHAR(UCHAR_MAMEKEY(2_PAD)) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KP3") PORT_CODE(KEYCODE_3_PAD) PORT_CHAR(UCHAR_MAMEKEY(3_PAD)) + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KP0") PORT_CODE(KEYCODE_0_PAD) PORT_CHAR(UCHAR_MAMEKEY(0_PAD)) + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KP.") PORT_CODE(KEYCODE_DEL_PAD) PORT_CHAR(UCHAR_MAMEKEY(DEL_PAD)) + PORT_BIT(0xf0, IP_ACTIVE_HIGH, IPT_UNUSED) +INPUT_PORTS_END +} // anonymous namespace + -UINT8 rmnimbus_keyboard_device::keyboard_handler(UINT8 last_code, UINT8 *scan_line) +rmnimbus_keyboard_device::rmnimbus_keyboard_device(const machine_config& mconfig, const char* tag, device_t* owner, UINT32 clock) + : buffered_rs232_device(mconfig, RMNIMBUS_KEYBOARD, "RM Nimbus Keyboard", tag, owner, 0, "rmnimbus_keyboard", __FILE__) + , device_matrix_keyboard_interface(mconfig, *this, "LINE0", "LINE1", "LINE2", "LINE3", "LINE4", "LINE5", "LINE6", "LINE7", "LINE8", "LINE9", "LINEA") { - int i = *scan_line, j; - UINT8 code = 0, change; - - if (i == 0) code = m_io_kbd0->read(); - else - if (i == 1) code = m_io_kbd1->read(); - else - if (i == 2) code = m_io_kbd2->read(); - else - if (i == 3) code = m_io_kbd3->read(); - else - if (i == 4) code = m_io_kbd4->read(); - else - if (i == 5) code = m_io_kbd5->read(); - else - if (i == 6) code = m_io_kbd6->read(); - else - if (i == 7) code = m_io_kbd7->read(); - else - if (i == 8) code = m_io_kbd8->read(); - else - if (i == 9) code = m_io_kbd9->read(); - else - if (i == 10) code = m_io_kbda->read(); - - *scan_line = (*scan_line + 1) % 11; - code = ~code; - - if(m_state[i] == code) - return 0; - - change = (m_state[i] ^ code); - - for(j = 0; j < 8; j++) - if((change >> j) == 1) break; - - change = (1 << j); - m_state[i] ^= change; - - return ((change & code) ? 0 : 0x80) | ((i << 3) + j); } -static INPUT_PORTS_START( rmnimbus_keyboard ) - PORT_START("TERM_LINE0") /* Key row 0 scancodes 00..07 */ - //PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("1") PORT_CODE(KEYCODE_1) PORT_CHAR('1') - PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED) - PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("ESC") PORT_CODE(KEYCODE_ESC) PORT_CHAR(0x1B) - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("1") PORT_CODE(KEYCODE_1) PORT_CHAR('1') - PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("2") PORT_CODE(KEYCODE_2) PORT_CHAR('2') - PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("3") PORT_CODE(KEYCODE_3) PORT_CHAR('3') - PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("4") PORT_CODE(KEYCODE_4) PORT_CHAR('4') - PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("5") PORT_CODE(KEYCODE_5) PORT_CHAR('5') - PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("6") PORT_CODE(KEYCODE_6) PORT_CHAR('6') - - PORT_START("TERM_LINE1") /* Key row 1 scancodes 08..0F */ - PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("7") PORT_CODE(KEYCODE_7) PORT_CHAR('7') - PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("8") PORT_CODE(KEYCODE_8) PORT_CHAR('8') - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("9") PORT_CODE(KEYCODE_9) PORT_CHAR('9') - PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("0") PORT_CODE(KEYCODE_0) PORT_CHAR('0') - PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("-") PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') - PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("=") PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('=') - PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("BSPACE") PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(0x08) - PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("TAB") PORT_CODE(KEYCODE_TAB) PORT_CHAR(0x09) - - PORT_START("TERM_LINE2") /* Key row 2 scancodes 10..17 */ - PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Q") PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') - PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("W") PORT_CODE(KEYCODE_W) PORT_CHAR('W') - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("E") PORT_CODE(KEYCODE_E) PORT_CHAR('E') - PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("R") PORT_CODE(KEYCODE_R) PORT_CHAR('R') - PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("T") PORT_CODE(KEYCODE_T) PORT_CHAR('T') - PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Y") PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') - PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("U") PORT_CODE(KEYCODE_U) PORT_CHAR('U') - PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("I") PORT_CODE(KEYCODE_I) PORT_CHAR('I') - - PORT_START("TERM_LINE3") /* Key row 3 scancodes 18..1F */ - PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("O") PORT_CODE(KEYCODE_O) PORT_CHAR('O') - PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("P") PORT_CODE(KEYCODE_P) PORT_CHAR('P') - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("[") PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('[') - PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("]") PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') - PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("ENTER") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(0x0D) - PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("CTRL") PORT_CODE(KEYCODE_LCONTROL) PORT_CODE(KEYCODE_RCONTROL) // Ether control - PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("A") PORT_CODE(KEYCODE_A) PORT_CHAR('A') - PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("S") PORT_CODE(KEYCODE_S) PORT_CHAR('S') - - PORT_START("TERM_LINE4") /* Key row 4 scancodes 20..27 */ - PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("D") PORT_CODE(KEYCODE_D) PORT_CHAR('D') - PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F") PORT_CODE(KEYCODE_F) PORT_CHAR('F') - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("G") PORT_CODE(KEYCODE_G) PORT_CHAR('G') - PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("H") PORT_CODE(KEYCODE_H) PORT_CHAR('H') - PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("J") PORT_CODE(KEYCODE_J) PORT_CHAR('J') - PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("K") PORT_CODE(KEYCODE_K) PORT_CHAR('K') - PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("L") PORT_CODE(KEYCODE_L) PORT_CHAR('L') - PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(";") PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') - - PORT_START("TERM_LINE5") /* Key row 5 scancodes 28..2F */ - PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("#") PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('#') - PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("BACKSLASH") PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('\\') - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("LSHIFT") PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) - PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("TILDE") PORT_CODE(KEYCODE_TILDE) PORT_CHAR('`') - PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Z") PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') - PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("X") PORT_CODE(KEYCODE_X) PORT_CHAR('X') - PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("C") PORT_CODE(KEYCODE_C) PORT_CHAR('C') - PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("V") PORT_CODE(KEYCODE_V) PORT_CHAR('V') - - - PORT_START("TERM_LINE6") /* Key row 6 scancodes 30..37 */ - PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("B") PORT_CODE(KEYCODE_B) PORT_CHAR('B') - PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("N") PORT_CODE(KEYCODE_N) PORT_CHAR('N') - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("M") PORT_CODE(KEYCODE_M) PORT_CHAR('M') - PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(",") PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') - PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(".") PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') - PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("/") PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') - PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("RSHIFT") PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_2) - PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("PRSCR") PORT_CODE(KEYCODE_ASTERISK) PORT_CHAR('*') - - PORT_START("TERM_LINE7") /* Key row 7 scancodes 38..3F */ - PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("ALT") PORT_CODE(KEYCODE_LALT) PORT_CODE(KEYCODE_RALT) - PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("SPACE") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("CAPS") PORT_CODE(KEYCODE_CAPSLOCK) - PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F1") PORT_CODE(KEYCODE_F1) - PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F2") PORT_CODE(KEYCODE_F2) - PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F3") PORT_CODE(KEYCODE_F3) - PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F4") PORT_CODE(KEYCODE_F4) - PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F5") PORT_CODE(KEYCODE_F5) - - - PORT_START("TERM_LINE8") /* Key row 8 scancodes 40..47 */ - PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F6") PORT_CODE(KEYCODE_F6) - PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F7") PORT_CODE(KEYCODE_F7) - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F8") PORT_CODE(KEYCODE_F8) - PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F9") PORT_CODE(KEYCODE_F9) - PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F10") PORT_CODE(KEYCODE_F10) - PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("NUMLK") PORT_CODE(KEYCODE_NUMLOCK) - PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("SCRLK") PORT_CODE(KEYCODE_SCRLOCK) - PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("KP7") PORT_CODE(KEYCODE_7_PAD) PORT_CHAR('7') - - PORT_START("TERM_LINE9") /* Key row 9 scancodes 48..4F */ - PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("KP8") PORT_CODE(KEYCODE_8_PAD) //PORT_CHAR('8') - PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("KP9") PORT_CODE(KEYCODE_9_PAD) //PORT_CHAR('9') - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("KP-") PORT_CODE(KEYCODE_MINUS_PAD) //PORT_CHAR('-') - PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("KP4") PORT_CODE(KEYCODE_4_PAD) //PORT_CHAR('4') - PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("KP5") PORT_CODE(KEYCODE_5_PAD) //PORT_CHAR('5') - PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("KP6") PORT_CODE(KEYCODE_6_PAD) //PORT_CHAR('6') - PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("KP+") PORT_CODE(KEYCODE_PLUS_PAD) //PORT_CHAR('+') - PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("KP1") PORT_CODE(KEYCODE_1_PAD) //PORT_CHAR('1') - - PORT_START("TERM_LINEA") /* Key row 10 scancodes 50..57 */ - PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("KP2") PORT_CODE(KEYCODE_2_PAD) //PORT_CHAR('2') - PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("KP3") PORT_CODE(KEYCODE_3_PAD) //PORT_CHAR('3') - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("KP0") PORT_CODE(KEYCODE_0_PAD) //PORT_CHAR('0') - PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("KP.") PORT_CODE(KEYCODE_DEL_PAD) //PORT_CHAR('.') - PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED) - PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNUSED) - PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNUSED) - PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNUSED) - //PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("KP5") PORT_CODE(KEYCODE_5_PAD) PORT_CHAR('5') - //PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("KP6") PORT_CODE(KEYCODE_6_PAD) PORT_CHAR('6') - //PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("KP+") PORT_CODE(KEYCODE_PLUS_PAD) PORT_CHAR('+') - //PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("KP1") PORT_CODE(KEYCODE_1_PAD) PORT_CHAR('1') - - PORT_START("TERM_LINEC") - - PORT_START("RS232_TXBAUD") - PORT_CONFNAME(0xff, RS232_BAUD_9600, "TX Baud") PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, serial_keyboard_device, update_serial) - PORT_CONFSETTING( RS232_BAUD_9600, "9600") - - PORT_START("RS232_STARTBITS") - PORT_CONFNAME(0xff, RS232_STARTBITS_1, "Start Bits") PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, serial_keyboard_device, update_serial) - PORT_CONFSETTING( RS232_STARTBITS_1, "1") - - PORT_START("RS232_DATABITS") - PORT_CONFNAME(0xff, RS232_DATABITS_8, "Data Bits") PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, serial_keyboard_device, update_serial) - PORT_CONFSETTING( RS232_DATABITS_8, "8") - - PORT_START("RS232_PARITY") - PORT_CONFNAME(0xff, RS232_PARITY_NONE, "Parity") PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, serial_keyboard_device, update_serial) - PORT_CONFSETTING( RS232_PARITY_NONE, "None") - - PORT_START("RS232_STOPBITS") - PORT_CONFNAME(0xff, RS232_STOPBITS_1, "Stop Bits") PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, serial_keyboard_device, update_serial) - PORT_CONFSETTING( RS232_STOPBITS_1, "1") -INPUT_PORTS_END ioport_constructor rmnimbus_keyboard_device::device_input_ports() const { return INPUT_PORTS_NAME(rmnimbus_keyboard); } -void rmnimbus_keyboard_device::device_start() + +void rmnimbus_keyboard_device::device_reset() +{ + buffered_rs232_device::device_reset(); + + reset_key_state(); + clear_fifo(); + + set_data_frame(1, 8, PARITY_NONE, STOP_BITS_1); + set_rate(9'600); + 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)); +} + + +void rmnimbus_keyboard_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) { - serial_keyboard_device::device_start(); - memset(m_state, '\0', sizeof(m_state)); + device_matrix_keyboard_interface::device_timer(timer, id, param, ptr); + buffered_rs232_device::device_timer(timer, id, param, ptr); } + +void rmnimbus_keyboard_device::key_make(UINT8 row, UINT8 column) +{ + transmit_byte((row << 3) | column); +} + + +void rmnimbus_keyboard_device::key_break(UINT8 row, UINT8 column) +{ + transmit_byte(0x80U | (row << 3) | column); +} + + +void rmnimbus_keyboard_device::received_byte(UINT8 byte) +{ + logerror("received command %02x", byte); +} + + const device_type RMNIMBUS_KEYBOARD = &device_creator<rmnimbus_keyboard_device>; diff --git a/src/mame/machine/rmnkbd.h b/src/mame/machine/rmnkbd.h index f60f600ac99..01cbce7f7ea 100644 --- a/src/mame/machine/rmnkbd.h +++ b/src/mame/machine/rmnkbd.h @@ -1,28 +1,27 @@ // license:BSD-3-Clause // copyright-holders:Carl -#ifndef RMNKBD_H_ -#define RMNKBD_H_ +#ifndef MAME_MACHINE_RMNKBD_H +#define MAME_MACHINE_RMNKBD_H -#include "bus/rs232/keyboard.h" +#include "bus/rs232/rs232.h" +#include "machine/keyboard.h" -class rmnimbus_keyboard_device : public serial_keyboard_device +class rmnimbus_keyboard_device : public buffered_rs232_device<16U>, protected device_matrix_keyboard_interface<11U> { public: rmnimbus_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); virtual ioport_constructor device_input_ports() const override; protected: - virtual void device_start() override; + virtual void device_reset() override; + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; + virtual void key_make(UINT8 row, UINT8 column) override; + virtual void key_break(UINT8 row, UINT8 column) override; private: - virtual UINT8 keyboard_handler(UINT8 last_code, UINT8 *scan_line) override; - - required_ioport m_io_kbd8; - required_ioport m_io_kbd9; - required_ioport m_io_kbda; - UINT8 m_state[11]; + virtual void received_byte(UINT8 byte) override; }; extern const device_type RMNIMBUS_KEYBOARD; -#endif /* RMNKBD_H_ */ +#endif // MAME_MACHINE_RMNKBD_H diff --git a/src/mame/machine/x68k_kbd.cpp b/src/mame/machine/x68k_kbd.cpp index 675038414c4..ae697d08f5f 100644 --- a/src/mame/machine/x68k_kbd.cpp +++ b/src/mame/machine/x68k_kbd.cpp @@ -1,20 +1,19 @@ // license:BSD-3-Clause -// copyright-holders:Barry Rodewald +// copyright-holders:Barry Rodewald,Vas Crabb #include "machine/x68k_kbd.h" -x68k_keyboard_device::x68k_keyboard_device(const machine_config& mconfig, const char* tag, device_t* owner, UINT32 clock) : - serial_keyboard_device(mconfig, X68K_KEYBOARD, "X68k Keyboard", tag, owner, 0, "x68k_keyboard", __FILE__), - m_io_kbd8(*this, "TERM_LINE8"), - m_io_kbd9(*this, "TERM_LINE9"), - m_io_kbda(*this, "TERM_LINEA"), - m_io_kbdb(*this, "TERM_LINEB"), - m_io_kbdd(*this, "TERM_LINED"), - m_io_kbde(*this, "TERM_LINEE") +#include "bus/rs232/rs232.ipp" +#include "machine/keyboard.ipp" + + +x68k_keyboard_device::x68k_keyboard_device(const machine_config& mconfig, const char* tag, device_t* owner, UINT32 clock) + : buffered_rs232_device(mconfig, X68K_KEYBOARD, "X68k Keyboard", tag, owner, 0, "x68k_keyboard", __FILE__) + , device_matrix_keyboard_interface(mconfig, *this, "LINE0", "LINE1", "LINE2", "LINE3", "LINE4", "LINE5", "LINE6", "LINE7", "LINE8", "LINE9", "LINEA", "LINEB", "LINEC", "LINED", "LINEE") { } -void x68k_keyboard_device::write(UINT8 data) +void x68k_keyboard_device::received_byte(UINT8 data) { /* Keyboard control commands: 00xxxxxx - TV Control @@ -39,292 +38,223 @@ void x68k_keyboard_device::write(UINT8 data) (repeat rate)^2*5 + 30ms 1xxxxxxx - xxxxxxx = keyboard LED status - b6 = "full size" + b6 = fullwidth b5 = hiragana b4 = insert b3 = caps b2 = code input - b1 = romaji input + b1 = romaji b0 = kana */ - if(data & 0x80) // LED status + if (data & 0x80) // LED status { - machine().output().set_value("key_led_kana",(data & 0x01) ? 0 : 1); - machine().output().set_value("key_led_romaji",(data & 0x02) ? 0 : 1); - machine().output().set_value("key_led_code",(data & 0x04) ? 0 : 1); - machine().output().set_value("key_led_caps",(data & 0x08) ? 0 : 1); - machine().output().set_value("key_led_insert",(data & 0x10) ? 0 : 1); - machine().output().set_value("key_led_hiragana",(data & 0x20) ? 0 : 1); - machine().output().set_value("key_led_fullsize",(data & 0x40) ? 0 : 1); - logerror("KB: LED status set to %02x\n",data & 0x7f); + machine().output().set_value("key_led_kana", (data & 0x01) ? 0 : 1); + machine().output().set_value("key_led_romaji", (data & 0x02) ? 0 : 1); + machine().output().set_value("key_led_code", (data & 0x04) ? 0 : 1); + machine().output().set_value("key_led_caps", (data & 0x08) ? 0 : 1); + machine().output().set_value("key_led_insert", (data & 0x10) ? 0 : 1); + machine().output().set_value("key_led_hiragana", (data & 0x20) ? 0 : 1); + machine().output().set_value("key_led_fullsize", (data & 0x40) ? 0 : 1); + logerror("KB: LED status set to %02x\n", data & 0x7f); } - if((data & 0xc0) == 0) // TV control + if ((data & 0xc0) == 0) // TV control { // nothing for now } - if((data & 0xf8) == 0x48) // Keyboard enable + if ((data & 0xf8) == 0x48) // Keyboard enable { m_enabled = data & 0x01; - logerror("KB: Keyboard enable bit = %i\n",m_enabled); + if (m_enabled) start_processing(attotime::from_hz(2'400)); + else stop_processing(); + logerror("KB: Keyboard enable bit = %i\n", m_enabled); } - if((data & 0xf0) == 0x60) // Key delay time + if ((data & 0xf0) == 0x60) // Key delay time { m_delay = data & 0x0f; - logerror("KB: Keypress delay time is now %ims\n",(data & 0x0f)*100+200); + logerror("KB: Keypress delay time is now %ims\n", ((data & 0x0f) * 100) + 200); } - if((data & 0xf0) == 0x70) // Key repeat rate + if ((data & 0xf0) == 0x70) // Key repeat rate { m_repeat = data & 0x0f; - logerror("KB: Keypress repeat rate is now %ims\n",((data & 0x0f)^2)*5+30); + logerror("KB: Keypress repeat rate is now %ims\n", (((data & 0x0f)^2) * 5) + 30); } } -UINT8 x68k_keyboard_device::keyboard_handler(UINT8 last_code, UINT8 *scan_line) +void x68k_keyboard_device::key_make(UINT8 row, UINT8 column) { - if (m_enabled) - { - for (int row = 0; row < 15; row++ ) - { - UINT8 data = 0; - - if (row == 0) data = m_io_kbd0->read(); - else - if (row == 1) data = m_io_kbd1->read(); - else - if (row == 2) data = m_io_kbd2->read(); - else - if (row == 3) data = m_io_kbd3->read(); - else - if (row == 4) data = m_io_kbd4->read(); - else - if (row == 5) data = m_io_kbd5->read(); - else - if (row == 6) data = m_io_kbd6->read(); - else - if (row == 7) data = m_io_kbd7->read(); - else - if (row == 8) data = m_io_kbd8->read(); - else - if (row == 9) data = m_io_kbd9->read(); - else - if (row == 10) data = m_io_kbda->read(); - else - if (row == 11) data = m_io_kbdb->read(); - else - if (row == 12) data = m_io_kbdc->read(); - else - if (row == 13) data = m_io_kbdd->read(); - else - if (row == 14) data = m_io_kbde->read(); - - for (int column = 0; column < 8; column++ ) - { - int new_down = (data & (1 << column)) != 0; - int scan_code = (row * 8) + column; - int old_down = m_key_down[scan_code]; - m_key_down[scan_code] = new_down; - - if (new_down && !old_down) - { - m_repeat_code = scan_code; - m_until_repeat = m_delay * 240; - - return scan_code; - } - else if(!new_down && old_down) - { - m_repeat_code = 0; - return scan_code + 0x80; - } - } - } + // TODO: work out which keys actually repeat (this assumes it's anything other than ctrl/opt/shift) + if (row != 0x0eU) + typematic_start(row, column, attotime::from_msec(m_delay), attotime::from_msec(m_repeat)); + else + typematic_restart(attotime::from_msec(m_delay), attotime::from_msec(m_repeat)); - if (m_repeat_code > 0 && m_key_down[m_repeat_code]) - { - m_until_repeat--; - if (m_until_repeat == 0) - { - m_until_repeat = m_repeat * 240; - return m_repeat_code; - } - } - } + transmit_byte((row << 3) | column); +} - return 0; +void x68k_keyboard_device::key_repeat(UINT8 row, UINT8 column) +{ + transmit_byte((row << 3) | column); +} + +void x68k_keyboard_device::key_break(UINT8 row, UINT8 column) +{ + device_matrix_keyboard_interface::key_break(row, column); + + transmit_byte(0x80U | (row << 3) | column); } static INPUT_PORTS_START( x68k_keyboard ) - PORT_START("TERM_LINE0") + PORT_START("LINE0") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED) // unused - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("ESC") PORT_CODE(KEYCODE_ESC) PORT_CHAR(27) /* ESC */ - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("1 ! \xE3\x83\x8C") PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') /* 1 ! */ - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("2 \" \xE3\x83\x95") PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('\"') /* 2 " */ - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("3 # \xE3\x82\xA2 \xE3\x82\xA1") PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') /* 3 # */ - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("4 $ \xE3\x82\xA6 \xE3\x82\xA5") PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') /* 4 $ */ - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("5 % \xE3\x82\xA8 \xE3\x82\xA7") PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') /* 5 % */ - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("6 & \xE3\x82\xAA \xE3\x82\xA9") PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('&') /* 6 & */ - - PORT_START("TERM_LINE1") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("7 \' \xE3\x83\xA4 \xE3\x83\xA3") PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('\'') /* 7 ' */ - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("8 ( \xE3\x83\xA6 \xE3\x83\xA5") PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('(') /* 8 ( */ - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("9 ) \xE3\x83\xA8 \xE3\x83\xA7") PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR(')') /* 9 ) */ - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("0 \xE3\x83\xAF \xE3\x83\xB2") PORT_CODE(KEYCODE_0) PORT_CHAR('0') /* 0 */ - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("- = \xE3\x83\x9B") PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('=') /* - = */ - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("^ \xE3\x83\x98") PORT_CHAR('^') /* ^ */ - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("\xC2\xA5 \xE3\x83\xBC |") PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('\\') PORT_CHAR('|') /* Yen | */ - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) /* Backspace */ - - PORT_START("TERM_LINE2") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TAB) PORT_CHAR(9) /* Tab */ - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Q \xE3\x82\xBF") PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') /* Q */ - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("W \xE3\x83\x86") PORT_CODE(KEYCODE_W) PORT_CHAR('W') /* W */ - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("E \xE3\x82\xA4 \xE3\x82\xA3") PORT_CODE(KEYCODE_E) PORT_CHAR('E') /* E */ - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("R \xE3\x82\xB9") PORT_CODE(KEYCODE_R) PORT_CHAR('R') /* R */ - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("T \xE3\x82\xAB") PORT_CODE(KEYCODE_T) PORT_CHAR('T') /* T */ - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Y \xE3\x83\xB3") PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') /* Y */ - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("U \xE3\x83\x8A") PORT_CODE(KEYCODE_U) PORT_CHAR('U') /* U */ - - PORT_START("TERM_LINE3") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("I \xE3\x83\x8B") PORT_CODE(KEYCODE_I) PORT_CHAR('I') /* I */ - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("O \xE3\x83\xA9") PORT_CODE(KEYCODE_O) PORT_CHAR('O') /* O */ - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("P \xE3\x82\xBB") PORT_CODE(KEYCODE_P) PORT_CHAR('P') /* P */ - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("@ ` \xE3\x82\x9B") PORT_CHAR('@') PORT_CHAR('`') /* @ */ - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("[ { \xE3\x82\x9C \xE3\x80\x8C") PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('[') PORT_CHAR('{') /* [ { */ - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) /* Return */ - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("A \xE3\x83\x81") PORT_CODE(KEYCODE_A) PORT_CHAR('A') /* A */ - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("S \xE3\x83\x88") PORT_CODE(KEYCODE_S) PORT_CHAR('S') /* S */ - - PORT_START("TERM_LINE4") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("D \xE3\x82\xB7") PORT_CODE(KEYCODE_D) PORT_CHAR('D') /* D */ - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F \xE3\x83\x8F") PORT_CODE(KEYCODE_F) PORT_CHAR('F') /* F */ - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("G \xE3\x82\xAD") PORT_CODE(KEYCODE_G) PORT_CHAR('G') /* G */ - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("H \xE3\x82\xAF") PORT_CODE(KEYCODE_H) PORT_CHAR('H') /* H */ - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("J \xE3\x83\x9E") PORT_CODE(KEYCODE_J) PORT_CHAR('J') /* J */ - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("K \xE3\x83\x8E") PORT_CODE(KEYCODE_K) PORT_CHAR('K') /* K */ - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("L \xE3\x83\xAA") PORT_CODE(KEYCODE_L) PORT_CHAR('L') /* L */ - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("; + \xE3\x83\xAC") PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR('+') /* ; + */ - - PORT_START("TERM_LINE5") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME(": * \xE3\x82\xB1") PORT_CODE(KEYCODE_QUOTE) PORT_CHAR(':') PORT_CHAR('*') /* : * */ - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("] } \xE3\x83\xA0 \xE3\x80\x8D") PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}') /* ] } */ - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Z \xE3\x83\x84 \xE3\x83\x83") PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') /* Z */ - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("X \xE3\x82\xB5") PORT_CODE(KEYCODE_X) PORT_CHAR('X') /* X */ - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("C \xE3\x82\xBD") PORT_CODE(KEYCODE_C) PORT_CHAR('C') /* C */ - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("V \xE3\x83\x92") PORT_CODE(KEYCODE_V) PORT_CHAR('V') /* V */ - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("B \xE3\x82\xB3") PORT_CODE(KEYCODE_B) PORT_CHAR('B') /* B */ - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("N \xE3\x83\x9F") PORT_CODE(KEYCODE_N) PORT_CHAR('N') /* N */ - - PORT_START("TERM_LINE6") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("M \xE3\x83\xA2") PORT_CODE(KEYCODE_M) PORT_CHAR('M') /* M */ - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME(", < \xE3\x83\x8D \xE3\x80\x81") PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<') /* , < */ - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME(". > \xE3\x83\xAB \xE3\x80\x82") PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>') /* . > */ - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("/ ? \xE3\x83\xA1 \xE3\x83\xBB") PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') /* / ? */ - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("_ \xE3\x83\xAD") PORT_CHAR('_') /* Underscore (shifted only?) */ - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Space") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') /* Space */ - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Home") PORT_CODE(KEYCODE_HOME) /* Home */ - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Delete") PORT_CODE(KEYCODE_DEL) /* Del */ - - PORT_START("TERM_LINE7") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Roll Up") PORT_CODE(KEYCODE_PGUP) /* Roll Up */ - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Roll Down") PORT_CODE(KEYCODE_PGDN) /* Roll Down */ - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Undo") PORT_CODE(KEYCODE_END) /* Undo */ - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Cursor Left") PORT_CODE(KEYCODE_LEFT) /* Left */ - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Cursor Up") PORT_CODE(KEYCODE_UP) /* Up */ - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Cursor Right") PORT_CODE(KEYCODE_RIGHT) /* Right */ - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Cursor Down") PORT_CODE(KEYCODE_DOWN) /* Down */ - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Tenkey CLR") PORT_CODE(KEYCODE_NUMLOCK) /* CLR */ - - PORT_START("TERM_LINE8") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Tenkey /") PORT_CODE(KEYCODE_SLASH_PAD) /* / (numpad) */ - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Tenkey *") PORT_CODE(KEYCODE_ASTERISK) /* * (numpad) */ - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Tenkey -") PORT_CODE(KEYCODE_MINUS_PAD) /* - (numpad) */ - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Tenkey 7") PORT_CODE(KEYCODE_7_PAD) /* 7 (numpad) */ - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Tenkey 8") PORT_CODE(KEYCODE_8_PAD) /* 8 (numpad) */ - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Tenkey 9") PORT_CODE(KEYCODE_9_PAD) /* 9 (numpad) */ - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Tenkey +") PORT_CODE(KEYCODE_PLUS_PAD) /* + (numpad) */ - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Tenkey 4") PORT_CODE(KEYCODE_4_PAD) /* 4 (numpad) */ - - PORT_START("TERM_LINE9") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Tenkey 5") PORT_CODE(KEYCODE_5_PAD) /* 5 (numpad) */ - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Tenkey 6") PORT_CODE(KEYCODE_6_PAD) /* 6 (numpad) */ - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Tenkey =") /* = (numpad) */ - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Tenkey 1") PORT_CODE(KEYCODE_1_PAD) /* 1 (numpad) */ - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Tenkey 2") PORT_CODE(KEYCODE_2_PAD) /* 2 (numpad) */ - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Tenkey 3") PORT_CODE(KEYCODE_3_PAD) /* 3 (numpad) */ - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Tenkey Enter") PORT_CODE(KEYCODE_ENTER_PAD) /* Enter (numpad) */ - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Tenkey 0") PORT_CODE(KEYCODE_0_PAD) /* 0 (numpad) */ - - PORT_START("TERM_LINEA") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Tenkey ,") /* , (numpad) */ - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Tenkey .") PORT_CODE(KEYCODE_DEL_PAD) /* 2 (numpad) */ - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("\xE8\xA8\x98\xE5\x8F\xB7 (Symbolic input)") /* Sign / Symbolic input (babelfish translation) */ - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("\xE7\x99\xBB\xE9\x8C\xB2 (Register)") /* Register (babelfish translation) */ - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Help") /* Help */ - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("XF1") PORT_CODE(KEYCODE_F11) /* XF1 */ - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("XF2") PORT_CODE(KEYCODE_F12) /* XF2 */ - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("XF3") /* XF3 */ - - PORT_START("TERM_LINEB") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("XF4") /* XF4 */ - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("XF5") /* XF5 */ - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("\xe3\x81\x8b\xe3\x81\xaa (Kana)") /* Kana */ - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("\xe3\x83\xad\xe3\x83\xbc\xe3\x83\x9e\xe5\xad\x97 (Romaji)") /* Romaji */ - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("\xE3\x82\xB3\xE3\x83\xBC\xE3\x83\x89 (Code input)") /* Code input */ - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Caps") PORT_CODE(KEYCODE_CAPSLOCK) /* Caps lock */ - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Insert") PORT_CODE(KEYCODE_INSERT) /* Insert */ - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("\xE3\x81\xB2\xE3\x82\x89\xE3\x81\x8C\xE3\x81\xAA (Hiragana)") /* Hiragana */ - - PORT_START("TERM_LINEC") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("\xE5\x85\xA8\xE8\xA7\x92 (Full size)") /* Full size (babelfish translation) */ + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("ESC") PORT_CODE(KEYCODE_ESC) PORT_CHAR(27) // Escape + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("1 ! \xE3\x81\xAC") PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') // 1 ! nu + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("2 \" \xE3\x81\xB5") PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('\"') // 2 " fu + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("3 # \xE3\x81\x82 \xE3\x81\x81") PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') // 3 # a + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("4 $ \xE3\x81\x86 \xE3\x81\x85") PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') // 4 $ u + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("5 % \xE3\x81\x88 \xE3\x81\x87") PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') // 5 % e + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("6 & \xE3\x81\x8A \xE3\x81\x89") PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('&') // 6 & o + + PORT_START("LINE1") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("7 \' \xE3\x82\x84 \xE3\x82\x83") PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('\'') // 7 ' ya + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("8 ( \xE3\x82\x86 \xE3\x82\x85") PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('(') // 8 ( yu + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("9 ) \xE3\x82\x88 \xE3\x82\x87") PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR(')') // 9 ) yo + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("0 \xE3\x82\x8F \xE3\x82\x92") PORT_CODE(KEYCODE_0) PORT_CHAR('0') // 0 wa wo + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("- = \xE3\x81\xBB") PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('=') // - = ho + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("^ \xE3\x81\xB8") PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('^') // ^ he + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("\xC2\xA5 | \xE3\x83\xBC") PORT_CODE(KEYCODE_TILDE) PORT_CHAR('\\') PORT_CHAR('|') // Yen | - + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("BS") PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) // Backspace + + PORT_START("LINE2") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("TAB") PORT_CODE(KEYCODE_TAB) PORT_CHAR(9) // Tab + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Q \xE3\x81\x9F") PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') // Q ta + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("W \xE3\x81\xA6") PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') // W te + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("E \xE3\x81\x84 \xE3\x81\x83") PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E') // E i + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("R \xE3\x81\x99") PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') // R su + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("T \xE3\x81\x8B") PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T') // T ka + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Y \xE3\x82\x93") PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') // Y n + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("U \xE3\x81\xAA") PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') // U na + + PORT_START("LINE3") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("I \xE3\x81\xAB") PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') // I ni + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("O \xE3\x82\x89") PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') // O ra + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("P \xE3\x81\x9B") PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') // P se + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("@ ` \xE3\x82\x9B") PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('@') PORT_CHAR('`') // @ ` dakuten + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("[ { \xE3\x82\x9C \xE3\x80\x8C") PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR('[') PORT_CHAR('{') // [ { handakuten kagikakko + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) // Return + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("A \xE3\x81\xA1") PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') // A chi + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("S \xE3\x81\xA8") PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S') // S to + + PORT_START("LINE4") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("D \xE3\x81\x97") PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D') // D shi + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F \xE3\x81\xAF") PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F') // F ha + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("G \xE3\x81\x8D") PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G') // G ki + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("H \xE3\x81\x8F") PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') // H ku + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("J \xE3\x81\xBE") PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J') // J ma + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("K \xE3\x81\xAE") PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K') // K no + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("L \xE3\x82\x8A") PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L') // L ri + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("; + \xE3\x82\x8C") PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR('+') // ; + re + + PORT_START("LINE5") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME(": * \xE3\x81\x91") PORT_CODE(KEYCODE_QUOTE) PORT_CHAR(':') PORT_CHAR('*') // : * ke + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("] } \xE3\x82\x80 \xE3\x80\x8D") PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR(']') PORT_CHAR('}') // ] } mu kagikakko + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Z \xE3\x81\xA4 \xE3\x81\xA3") PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') // Z tsu + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("X \xE3\x81\x95") PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') // X sa + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("C \xE3\x81\x9D") PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C') // C so + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("V \xE3\x81\xB2") PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V') // V hi + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("B \xE3\x81\x93") PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B') // B ko + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("N \xE3\x81\xBF") PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N') // N mi + + PORT_START("LINE6") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("M \xE3\x82\x82") PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') // M mo + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME(", < \xE3\x81\xAD \xE3\x80\x81") PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<') // , < ne comma + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME(". > \xE3\x82\x8B \xE3\x80\x82") PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>') // . > ru stop + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("/ ? \xE3\x82\x81 \xE3\x83\xBB") PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') // / ? me interpunct + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("_ \xE3\x82\x8D") PORT_CHAR('_') // Underscore (shifted only?) ro + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Space") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') // Space + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("HOME") PORT_CODE(KEYCODE_HOME) PORT_CHAR(UCHAR_MAMEKEY(HOME)) // Home + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("DEL") PORT_CODE(KEYCODE_DEL) PORT_CHAR(UCHAR_MAMEKEY(DEL)) // Del + + PORT_START("LINE7") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("ROLL UP") PORT_CODE(KEYCODE_PGUP) PORT_CHAR(UCHAR_MAMEKEY(PGUP)) // Roll Up + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("ROLL DOWN") PORT_CODE(KEYCODE_PGDN) PORT_CHAR(UCHAR_MAMEKEY(PGDN)) // Roll Down + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("UNDO") PORT_CODE(KEYCODE_END) PORT_CHAR(UCHAR_MAMEKEY(END)) // Undo + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Cursor Left") PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) // Left + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Cursor Up") PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP)) // Up + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Cursor Right") PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) // Right + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Cursor Down") PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) // Down + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Tenkey CLR") PORT_CODE(KEYCODE_NUMLOCK) PORT_CHAR(UCHAR_MAMEKEY(NUMLOCK)) // Clear + + PORT_START("LINE8") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Tenkey /") PORT_CODE(KEYCODE_SLASH_PAD) PORT_CHAR(UCHAR_MAMEKEY(SLASH_PAD)) // / (numpad) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Tenkey *") PORT_CODE(KEYCODE_ASTERISK) PORT_CHAR(UCHAR_MAMEKEY(ASTERISK)) // * (numpad) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Tenkey -") PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(MINUS_PAD)) // - (numpad) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Tenkey 7") PORT_CODE(KEYCODE_7_PAD) PORT_CHAR(UCHAR_MAMEKEY(7_PAD)) // 7 (numpad) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Tenkey 8") PORT_CODE(KEYCODE_8_PAD) PORT_CHAR(UCHAR_MAMEKEY(8_PAD)) // 8 (numpad) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Tenkey 9") PORT_CODE(KEYCODE_9_PAD) PORT_CHAR(UCHAR_MAMEKEY(9_PAD)) // 9 (numpad) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Tenkey +") PORT_CODE(KEYCODE_PLUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(PLUS_PAD)) // + (numpad) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Tenkey 4") PORT_CODE(KEYCODE_4_PAD) PORT_CHAR(UCHAR_MAMEKEY(4_PAD)) // 4 (numpad) + + PORT_START("LINE9") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Tenkey 5") PORT_CODE(KEYCODE_5_PAD) PORT_CHAR(UCHAR_MAMEKEY(5_PAD)) // 5 (numpad) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Tenkey 6") PORT_CODE(KEYCODE_6_PAD) PORT_CHAR(UCHAR_MAMEKEY(6_PAD)) // 6 (numpad) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Tenkey =") // = (numpad) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Tenkey 1") PORT_CODE(KEYCODE_1_PAD) PORT_CHAR(UCHAR_MAMEKEY(1_PAD)) // 1 (numpad) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Tenkey 2") PORT_CODE(KEYCODE_2_PAD) PORT_CHAR(UCHAR_MAMEKEY(2_PAD)) // 2 (numpad) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Tenkey 3") PORT_CODE(KEYCODE_3_PAD) PORT_CHAR(UCHAR_MAMEKEY(3_PAD)) // 3 (numpad) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Tenkey ENTER") PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHAR(UCHAR_MAMEKEY(ENTER_PAD)) // Enter (numpad) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Tenkey 0") PORT_CODE(KEYCODE_0_PAD) PORT_CHAR(UCHAR_MAMEKEY(0_PAD)) // 0 (numpad) + + PORT_START("LINEA") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Tenkey ,") // , (numpad) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Tenkey .") PORT_CODE(KEYCODE_DEL_PAD) PORT_CHAR(UCHAR_MAMEKEY(DEL_PAD)) // . (numpad) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("\xE8\xA8\x98\xE5\x8F\xB7\xE5\x85\xA5\xE5\x8A\x9B (Symbol input)") // Kigou nyuuryoku (Symbol input) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("\xE7\x99\xBB\xE9\x8C\xB2 (Register)") // Register (babelfish translation) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Help") // Help + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("XF1") PORT_CODE(KEYCODE_F11) PORT_CHAR(UCHAR_MAMEKEY(F11)) // XF1 + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("XF2") PORT_CODE(KEYCODE_F12) PORT_CHAR(UCHAR_MAMEKEY(F12)) // XF2 + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("XF3") // XF3 + + PORT_START("LINEB") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("XF4") // XF4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("XF5") PORT_CODE(KEYCODE_RALT) // XF5 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("\xE3\x81\x8B\xE3\x81\xAA (Kana)") // Kana + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("\xE3\x83\xAD\xE3\x83\xBC\xE3\x83\x9E\xE5\xAD\x97 (Romaji)") // Romaji + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("\xE3\x82\xB3\xE3\x83\xBC\xE3\x83\x89\xE5\x85\xA5\xE5\x8A\x9B (Code input)") // Code input + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("CAPS") PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) // Caps lock + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("INS") PORT_CODE(KEYCODE_INSERT) PORT_CHAR(UCHAR_MAMEKEY(INSERT)) // Insert + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("\xE3\x81\xB2\xE3\x82\x89\xE3\x81\x8C\xE3\x81\xAA (Hiragana)") PORT_CODE(KEYCODE_LALT) // Hiragana + + PORT_START("LINEC") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("\xE5\x85\xA8\xE8\xA7\x92 (Fullwidth)") PORT_CODE(KEYCODE_RCONTROL) // Zenkaku (Fullwidth) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Break") /* Break */ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Copy") /* Copy */ - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F1") PORT_CODE(KEYCODE_F1) /* F1 */ - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F2") PORT_CODE(KEYCODE_F2) /* F2 */ - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F3") PORT_CODE(KEYCODE_F3) /* F3 */ - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F4") PORT_CODE(KEYCODE_F4) /* F4 */ - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F5") PORT_CODE(KEYCODE_F5) /* F5 */ - - PORT_START("TERM_LINED") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F6") PORT_CODE(KEYCODE_F6) /* F6 */ - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F7") PORT_CODE(KEYCODE_F7) /* F7 */ - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F8") PORT_CODE(KEYCODE_F8) /* F8 */ - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F9") PORT_CODE(KEYCODE_F9) /* F9 */ - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F10") PORT_CODE(KEYCODE_F10) /* F10 */ + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F1") PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1)) // F1 + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F2") PORT_CODE(KEYCODE_F2) PORT_CHAR(UCHAR_MAMEKEY(F2)) // F2 + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F3") PORT_CODE(KEYCODE_F3) PORT_CHAR(UCHAR_MAMEKEY(F3)) // F3 + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F4") PORT_CODE(KEYCODE_F4) PORT_CHAR(UCHAR_MAMEKEY(F4)) // F4 + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F5") PORT_CODE(KEYCODE_F5) PORT_CHAR(UCHAR_MAMEKEY(F5)) // F5 + + PORT_START("LINED") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F6") PORT_CODE(KEYCODE_F6) PORT_CHAR(UCHAR_MAMEKEY(F6)) // F6 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F7") PORT_CODE(KEYCODE_F7) PORT_CHAR(UCHAR_MAMEKEY(F7)) // F7 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F8") PORT_CODE(KEYCODE_F8) PORT_CHAR(UCHAR_MAMEKEY(F8)) // F8 + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F9") PORT_CODE(KEYCODE_F9) PORT_CHAR(UCHAR_MAMEKEY(F9)) // F9 + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F10") PORT_CODE(KEYCODE_F10) PORT_CHAR(UCHAR_MAMEKEY(F10)) // F10 // 0x6d reserved // 0x6e reserved // 0x6f reserved - PORT_START("TERM_LINEE") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Shift") PORT_CODE(KEYCODE_LSHIFT) /* Shift */ - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Ctrl") PORT_CODE(KEYCODE_LCONTROL) /* Ctrl */ - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Opt. 1") PORT_CODE(KEYCODE_PRTSCR) /* Opt1 */ - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Opt. 2") PORT_CODE(KEYCODE_PAUSE) /* Opt2 */ - - PORT_START("RS232_TXBAUD") - PORT_CONFNAME(0xff, RS232_BAUD_38400, "TX Baud") PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, serial_keyboard_device, update_serial) - PORT_CONFSETTING( RS232_BAUD_38400, "38400") // TODO: Should be 2400 but MC68901 doesn't support divide by 16 - - PORT_START("RS232_STARTBITS") - PORT_CONFNAME(0xff, RS232_STARTBITS_1, "Start Bits") PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, serial_keyboard_device, update_serial) - PORT_CONFSETTING( RS232_STARTBITS_1, "1") - - PORT_START("RS232_DATABITS") - PORT_CONFNAME(0xff, RS232_DATABITS_8, "Data Bits") PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, serial_keyboard_device, update_serial) - PORT_CONFSETTING( RS232_DATABITS_8, "8") - - PORT_START("RS232_PARITY") - PORT_CONFNAME(0xff, RS232_PARITY_NONE, "Parity") PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, serial_keyboard_device, update_serial) - PORT_CONFSETTING( RS232_PARITY_NONE, "None") - - PORT_START("RS232_STOPBITS") - PORT_CONFNAME(0xff, RS232_STOPBITS_1, "Stop Bits") PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, serial_keyboard_device, update_serial) - PORT_CONFSETTING( RS232_STOPBITS_1, "1") + PORT_START("LINEE") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("SHIFT") PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1) // Shift + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("CTRL") PORT_CODE(KEYCODE_LCONTROL) // Control + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("OPT.1") PORT_CODE(KEYCODE_PRTSCR) // Opt1 + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("OPT.2") PORT_CODE(KEYCODE_PAUSE) // Opt2 INPUT_PORTS_END ioport_constructor x68k_keyboard_device::device_input_ports() const @@ -334,28 +264,44 @@ ioport_constructor x68k_keyboard_device::device_input_ports() const void x68k_keyboard_device::device_start() { - serial_keyboard_device::device_start(); - set_rcv_rate(38400); // TODO: Should be 2400 but MC68901 doesn't support divide by 16 + buffered_rs232_device::device_start(); + + save_item(NAME(m_delay)); + save_item(NAME(m_repeat)); + save_item(NAME(m_enabled)); } void x68k_keyboard_device::device_reset() { - serial_keyboard_device::device_reset(); + buffered_rs232_device::device_reset(); + + set_data_frame(1, 8, PARITY_NONE, STOP_BITS_1); + set_rate(38'400); // TODO: Should be 2400 but MC68901 doesn't support divide by 16 + receive_register_reset(); + transmit_register_reset(); m_enabled = 0; m_delay = 500; // 3*100+200 m_repeat = 110; // 4^2*5+30 - m_repeat_code = 0; - memset(m_key_down, 0, sizeof(m_key_down)); + stop_processing(); + reset_key_state(); + typematic_stop(); + clear_fifo(); + + output_dcd(0); + output_dsr(0); + output_cts(0); + output_rxd(1); } -void x68k_keyboard_device::rcv_complete() +void x68k_keyboard_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) { - receive_register_extract(); - write(get_received_char()); + device_matrix_keyboard_interface::device_timer(timer, id, param, ptr); + buffered_rs232_device::device_timer(timer, id, param, ptr); } + const device_type X68K_KEYBOARD = &device_creator<x68k_keyboard_device>; #if 0 diff --git a/src/mame/machine/x68k_kbd.h b/src/mame/machine/x68k_kbd.h index 09c5b1c0e0c..5540be8f151 100644 --- a/src/mame/machine/x68k_kbd.h +++ b/src/mame/machine/x68k_kbd.h @@ -1,11 +1,11 @@ // license:BSD-3-Clause -// copyright-holders:Barry Rodewald -#ifndef X68K_KBD_H_ -#define X68K_KBD_H_ +// copyright-holders:Barry Rodewald,Vas Crabb +#ifndef MAME_MACHINE_X68K_KBD_H +#define MAME_MACHINE_X68K_KBD_H #include "bus/rs232/keyboard.h" -class x68k_keyboard_device : public serial_keyboard_device +class x68k_keyboard_device : public buffered_rs232_device<16U>, protected device_matrix_keyboard_interface<15U> { public: x68k_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); @@ -14,28 +14,19 @@ public: protected: virtual void device_start() override; virtual void device_reset() override; - virtual void rcv_complete() override; + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; + virtual void key_make(UINT8 row, UINT8 column) override; + virtual void key_repeat(UINT8 row, UINT8 column) override; + virtual void key_break(UINT8 row, UINT8 column) override; private: - virtual UINT8 keyboard_handler(UINT8 last_code, UINT8 *scan_line) override; - void write(UINT8 data); - - required_ioport m_io_kbd8; - required_ioport m_io_kbd9; - required_ioport m_io_kbda; - required_ioport m_io_kbdb; - required_ioport m_io_kbdd; - required_ioport m_io_kbde; + virtual void received_byte(UINT8 data) override; int m_delay; // keypress delay after initial press int m_repeat; // keypress repeat rate - int m_enabled; // keyboard enabled? - - UINT8 m_key_down[15*8]; - int m_repeat_code; - int m_until_repeat; + UINT8 m_enabled; // keyboard enabled? }; extern const device_type X68K_KEYBOARD; -#endif /* X68KKBD_H_ */ +#endif // MAME_MACHINE_X68K_KBD_H |