summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/bbc/userport/cfa3000kbd.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/bbc/userport/cfa3000kbd.cpp')
-rw-r--r--src/devices/bus/bbc/userport/cfa3000kbd.cpp141
1 files changed, 141 insertions, 0 deletions
diff --git a/src/devices/bus/bbc/userport/cfa3000kbd.cpp b/src/devices/bus/bbc/userport/cfa3000kbd.cpp
new file mode 100644
index 00000000000..d07d7b6dd2f
--- /dev/null
+++ b/src/devices/bus/bbc/userport/cfa3000kbd.cpp
@@ -0,0 +1,141 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ Henson CFA 3000 Keyboard
+
+ 240 Pattern Right 0000
+ 241 Pattern Left 0001
+ 242 Patient Response 0010
+ 243 Present Stimuli 0011
+
+ 244 Up 0100
+ 245 Down 0101
+ 246 Left 0110
+ 247 Right 0111
+
+ 248 D 1000
+ 249 C 1001
+ 250 B 1010
+ 251 A 1011
+
+ 252 Mode 1100
+ 253 Erase 1101
+ 254 Restart 1110
+ 255 Print 1111
+
+**********************************************************************/
+
+
+#include "emu.h"
+#include "cfa3000kbd.h"
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(CFA3000_KBD, cfa3000_kbd_device, "cfa3000kbd", "Henson CFA 3000 Keyboard")
+
+
+//-------------------------------------------------
+// INPUT_PORTS( cfa3000kbd )
+//-------------------------------------------------
+
+static INPUT_PORTS_START( cfa3000kbd )
+ PORT_START("KBD.0")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Pattern ->") PORT_CODE(KEYCODE_STOP)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Pattern <-") PORT_CODE(KEYCODE_COMMA)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Patient Response") PORT_CODE(KEYCODE_SPACE)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Present Stimuli") PORT_CODE(KEYCODE_S)
+ PORT_START("KBD.1")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Up") PORT_CODE(KEYCODE_UP)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Down") PORT_CODE(KEYCODE_DOWN)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Left/Menu") PORT_CODE(KEYCODE_LEFT)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Right/Extend") PORT_CODE(KEYCODE_RIGHT)
+ PORT_START("KBD.2")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("D") PORT_CODE(KEYCODE_D)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("C") PORT_CODE(KEYCODE_C)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("B") PORT_CODE(KEYCODE_B)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("A") PORT_CODE(KEYCODE_A)
+ PORT_START("KBD.3")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Mode") PORT_CODE(KEYCODE_M)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Erase") PORT_CODE(KEYCODE_E)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Restart") PORT_CODE(KEYCODE_R)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Print") PORT_CODE(KEYCODE_P)
+INPUT_PORTS_END
+
+
+//-------------------------------------------------
+// input_ports - device-specific input ports
+//-------------------------------------------------
+
+ioport_constructor cfa3000_kbd_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME( cfa3000kbd );
+}
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// cfa3000_kbd_device - constructor
+//-------------------------------------------------
+
+cfa3000_kbd_device::cfa3000_kbd_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, CFA3000_KBD, tag, owner, clock),
+ device_bbc_userport_interface(mconfig, *this),
+ m_kbd(*this, "KBD.%u", 0)
+{
+}
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void cfa3000_kbd_device::device_start()
+{
+}
+
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void cfa3000_kbd_device::device_reset()
+{
+}
+
+
+//**************************************************************************
+// IMPLEMENTATION
+//**************************************************************************
+
+READ8_MEMBER(cfa3000_kbd_device::pb_r)
+{
+ uint8_t data = 0x00;
+
+ if (m_kbd[0]->read())
+ {
+ data = m_kbd[0]->read() >> 1;
+ data = 0xf0 | (BIT(data, 2) ? 0x03 : data);
+ }
+ if (m_kbd[1]->read())
+ {
+ data = m_kbd[1]->read() >> 1;
+ data = 0xf4 | (BIT(data, 2) ? 0x03 : data);
+ }
+ if (m_kbd[2]->read())
+ {
+ data = m_kbd[2]->read() >> 1;
+ data = 0xf8 | (BIT(data, 2) ? 0x03 : data);
+ }
+ if (m_kbd[3]->read())
+ {
+ data = m_kbd[3]->read() >> 1;
+ data = 0xfc | (BIT(data, 2) ? 0x03 : data);
+ }
+ return data;
+}