summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Vas Crabb <vas@vastheman.com>2016-07-27 21:59:32 +1000
committer Vas Crabb <vas@vastheman.com>2016-07-27 21:59:32 +1000
commiteac2a1fcc5d4540eb05f3f5011226841c4ca854c (patch)
treeafe35e2cdaf179bc757fcb3bba99a8cd0080434b
parent14e7367f7e1dd575754f8c59fcf74b956c91e87b (diff)
Keyboard/terminal improvements: [Vas Crabb]
* Mark lots of things constexpr in attotime and turn macros into functions * Add base classes for HLE matrix keyboard and buffered RS232 device * Make generic keyboard/terminal more usable * Keyboard has configurable typematic delay/rate * Keyboard has selectable JIS/ANSI layout * Keyboard handles simultaneous keypresses more intuitively * Keyboard uses meta to set high bit * Terminal has configurable auto LF on CR, auto CR on LF and local echo * Terminal has audible bell * Untangle Olivetti M20 keyboard from generic_keyboard * Add notes to Olivetti M20 keyboard emulation * Make Olivetti M20 keyboard match physical layout * Untangle RM Nimbus keyboard from generic_keyboard * Fix natural keyboard mode with RM Nimbus * Untangle x68k keyboard from generic_keyboard * Improve x68k key names and mapping * Improve x68k typematic behaviour * Untangle QX-10 keyboard from generic_keyboard * Keep NGEN keyboard barely working
-rw-r--r--scripts/src/bus.lua1
-rw-r--r--scripts/src/machine.lua1
-rw-r--r--src/devices/bus/rs232/keyboard.cpp119
-rw-r--r--src/devices/bus/rs232/keyboard.h19
-rw-r--r--src/devices/bus/rs232/rs232.h35
-rw-r--r--src/devices/bus/rs232/rs232.ipp110
-rw-r--r--src/devices/bus/rs232/terminal.cpp80
-rw-r--r--src/devices/bus/rs232/terminal.h4
-rw-r--r--src/devices/bus/sunkbd/hlekbd.cpp14
-rw-r--r--src/devices/machine/keyboard.cpp647
-rw-r--r--src/devices/machine/keyboard.h136
-rw-r--r--src/devices/machine/keyboard.ipp160
-rw-r--r--src/devices/machine/terminal.cpp171
-rw-r--r--src/devices/machine/terminal.h21
-rw-r--r--src/emu/attotime.h70
-rw-r--r--src/mame/machine/m20_kbd.cpp413
-rw-r--r--src/mame/machine/m20_kbd.h24
-rw-r--r--src/mame/machine/ngen_kb.cpp197
-rw-r--r--src/mame/machine/ngen_kb.h15
-rw-r--r--src/mame/machine/qx10kbd.cpp214
-rw-r--r--src/mame/machine/qx10kbd.h26
-rw-r--r--src/mame/machine/rmnkbd.cpp355
-rw-r--r--src/mame/machine/rmnkbd.h23
-rw-r--r--src/mame/machine/x68k_kbd.cpp472
-rw-r--r--src/mame/machine/x68k_kbd.h31
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