summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author AJR <ajrhacker@users.noreply.github.com>2019-06-20 00:58:25 -0400
committer AJR <ajrhacker@users.noreply.github.com>2019-06-20 00:58:25 -0400
commit3629d09dbea4a988e0eaf683191e8ea2c64dab59 (patch)
treee0e3f1fb5f30623158af79ca772264c1c726ed80
parentf67bcf9e01b21d08477d318bb8f8a843cced1e51 (diff)
v550: Emulate and hook up keyboard (nw)
-rw-r--r--src/mame/drivers/v550.cpp28
-rw-r--r--src/mame/machine/v102_kbd.cpp179
-rw-r--r--src/mame/machine/v102_kbd.h34
3 files changed, 205 insertions, 36 deletions
diff --git a/src/mame/drivers/v550.cpp b/src/mame/drivers/v550.cpp
index 404724bacb1..541babd0877 100644
--- a/src/mame/drivers/v550.cpp
+++ b/src/mame/drivers/v550.cpp
@@ -15,12 +15,12 @@
#include "emu.h"
//include "bus/rs232/rs232.h"
#include "cpu/z80/z80.h"
-#include "cpu/mcs48/mcs48.h"
#include "machine/com8116.h"
#include "machine/input_merger.h"
#include "machine/nvram.h"
#include "machine/i8251.h"
#include "machine/i8255.h"
+#include "machine/v102_kbd.h"
#include "machine/z80sio.h"
#include "video/scn2674.h"
#include "video/upd7220.h"
@@ -44,7 +44,6 @@ private:
void mem_map(address_map &map);
void io_map(address_map &map);
- void kbd_map(address_map &map);
void pvtc_char_map(address_map &map);
void pvtc_attr_map(address_map &map);
@@ -81,11 +80,6 @@ void v550_state::io_map(address_map &map)
map(0x71, 0x71).rw("pvtc", FUNC(scn2672_device::attr_buffer_r), FUNC(scn2672_device::attr_buffer_w));
}
-void v550_state::kbd_map(address_map &map)
-{
- map(0x0000, 0x07ff).rom().region("keyboard", 0);
-}
-
void v550_state::pvtc_char_map(address_map &map)
{
map(0x0000, 0x0fff).ram();
@@ -120,6 +114,7 @@ void v550_state::v550(machine_config &config)
I8255(config, "ppi"); // NEC D8255AC-5
I8251(config, m_usart, 34.846_MHz_XTAL / 16); // NEC D8251AC
+ m_usart->txd_handler().set("keyboard", FUNC(v550_keyboard_device::write_rxd));
m_usart->rxrdy_handler().set("mainint", FUNC(input_merger_device::in_w<1>));
upd7201_new_device& mpsc(UPD7201_NEW(config, "mpsc", 34.846_MHz_XTAL / 16)); // NEC D7201C
@@ -128,17 +123,17 @@ void v550_state::v550(machine_config &config)
INPUT_MERGER_ANY_HIGH(config, "mainint").output_handler().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
com8116_device &brg1(COM8116_020(config, "brg1", 1.8432_MHz_XTAL)); // SMC COM8116T-020
- brg1.ft_handler().set("mpsc", FUNC(upd7201_new_device::txca_w));
- brg1.fr_handler().set("mpsc", FUNC(upd7201_new_device::rxca_w));
+ brg1.ft_handler().set("mpsc", FUNC(upd7201_new_device::txcb_w));
+ brg1.ft_handler().append("mpsc", FUNC(upd7201_new_device::rxcb_w));
+ brg1.fr_handler().set("usart", FUNC(i8251_device::write_txc));
+ brg1.fr_handler().append("usart", FUNC(i8251_device::write_rxc));
com8116_device &brg2(COM8116_020(config, "brg2", 1.8432_MHz_XTAL)); // SMC COM8116T-020
- brg2.ft_handler().set("mpsc", FUNC(upd7201_new_device::txcb_w));
- brg2.ft_handler().append("mpsc", FUNC(upd7201_new_device::rxcb_w));
- brg2.fr_handler().set("usart", FUNC(i8251_device::write_txc));
- brg2.fr_handler().append("usart", FUNC(i8251_device::write_rxc));
+ brg2.ft_handler().set("mpsc", FUNC(upd7201_new_device::txca_w));
+ brg2.fr_handler().set("mpsc", FUNC(upd7201_new_device::rxca_w));
- mcs48_cpu_device &kbdmcu(I8035(config, "kbdmcu", 4'608'000));
- kbdmcu.set_addrmap(AS_PROGRAM, &v550_state::kbd_map);
+ v550_keyboard_device &keyboard(V550_KEYBOARD(config, "keyboard"));
+ keyboard.txd_callback().set(m_usart, FUNC(i8251_device::write_rxd));
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_raw(34.846_MHz_XTAL, 19 * 102, 0, 19 * 80, 295, 0, 272);
@@ -165,9 +160,6 @@ ROM_START( v550 )
ROM_REGION(0x1000, "chargen", 0)
ROM_LOAD("e242-085_r03_u97.bin", 0x0000, 0x1000, CRC(8a491cee) SHA1(d8a9546a7dd2ffc0a5e54524ee16068dde56975c))
-
- ROM_REGION(0x0800, "keyboard", 0)
- ROM_LOAD("v550kb.bin", 0x0000, 0x0800, CRC(d11d19a3) SHA1(2d88202d0548e934800f07667c8d13a3762b12fa))
ROM_END
COMP( 1982, v550, 0, 0, v550, v550, v550_state, empty_init, "Visual Technology", "Visual 550", MACHINE_IS_SKELETON )
diff --git a/src/mame/machine/v102_kbd.cpp b/src/mame/machine/v102_kbd.cpp
index 728745dccc7..e774b263caa 100644
--- a/src/mame/machine/v102_kbd.cpp
+++ b/src/mame/machine/v102_kbd.cpp
@@ -16,15 +16,27 @@ through software commands.
#include "machine/v102_kbd.h"
DEFINE_DEVICE_TYPE(V102_KEYBOARD, v102_keyboard_device, "v102_kbd", "Visual 102 Keyboard")
+DEFINE_DEVICE_TYPE(V550_KEYBOARD, v550_keyboard_device, "v550_kbd", "Visual 550 Keyboard")
-v102_keyboard_device::v102_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
- : device_t(mconfig, V102_KEYBOARD, tag, owner, clock)
+visual_mcs48_keyboard_device::visual_mcs48_keyboard_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner)
+ : device_t(mconfig, type, tag, owner, 0U)
, m_txd_callback(*this)
, m_kbdc(*this, "kbdc")
, m_keys(*this, "KEY%u", 0U)
{
}
+v102_keyboard_device::v102_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : visual_mcs48_keyboard_device(mconfig, V102_KEYBOARD, tag, owner)
+{
+}
+
+v550_keyboard_device::v550_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : visual_mcs48_keyboard_device(mconfig, V550_KEYBOARD, tag, owner)
+{
+}
+
+
INPUT_PORTS_START(v102_keyboard)
PORT_START("KEY0")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Left Shift") PORT_CHAR(UCHAR_SHIFT_1) PORT_CODE(KEYCODE_LSHIFT)
@@ -147,17 +159,145 @@ INPUT_PORTS_START(v102_keyboard)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("M") PORT_CHAR('m') PORT_CHAR('M') PORT_CODE(KEYCODE_M)
INPUT_PORTS_END
+INPUT_PORTS_START(v550_keyboard)
+ PORT_START("KEY0")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNKNOWN)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Right Shift") PORT_CHAR(UCHAR_SHIFT_1) PORT_CODE(KEYCODE_RSHIFT)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Left Shift") PORT_CHAR(UCHAR_SHIFT_1) PORT_CODE(KEYCODE_LSHIFT) // or other way around
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Ctrl") PORT_CHAR(UCHAR_SHIFT_2) PORT_CODE(KEYCODE_LCONTROL)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key 80")
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key AC")
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key 94")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key 90")
+
+ PORT_START("KEY1")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 9 DC") PORT_CHAR(UCHAR_MAMEKEY(9_PAD)) PORT_CODE(KEYCODE_9_PAD)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(MINUS_PAD)) PORT_CODE(KEYCODE_MINUS_PAD)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(COMMA_PAD)) PORT_CODE(KEYCODE_PLUS_PAD)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key 83")
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(2_PAD)) PORT_CODE(KEYCODE_2_PAD)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 5 EL") PORT_CHAR(UCHAR_MAMEKEY(5_PAD)) PORT_CODE(KEYCODE_5_PAD)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key FC")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key F8")
+
+ PORT_START("KEY2")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Backspace") PORT_CHAR(0x08) PORT_CODE(KEYCODE_BACKSPACE)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key 88")
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(0_PAD)) PORT_CODE(KEYCODE_0_PAD)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 6 EP") PORT_CHAR(UCHAR_MAMEKEY(6_PAD)) PORT_CODE(KEYCODE_6_PAD)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 3 DL") PORT_CHAR(UCHAR_MAMEKEY(3_PAD)) PORT_CODE(KEYCODE_3_PAD)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(DEL)) PORT_CODE(KEYCODE_DEL)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key F4")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key F0")
+
+ PORT_START("KEY3")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 7 IC") PORT_CHAR(UCHAR_MAMEKEY(7_PAD)) PORT_CODE(KEYCODE_7_PAD)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(8_PAD)) PORT_CODE(KEYCODE_8_PAD)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Line Feed") PORT_CHAR(0x0a)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 4 EF") PORT_CHAR(UCHAR_MAMEKEY(4_PAD)) PORT_CODE(KEYCODE_4_PAD)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 1 IL") PORT_CHAR(UCHAR_MAMEKEY(1_PAD)) PORT_CODE(KEYCODE_1_PAD)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("O") PORT_CHAR('o') PORT_CHAR('O') PORT_CHAR(0x0f) PORT_CODE(KEYCODE_O)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key EC")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key E8")
+
+ PORT_START("KEY4")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key 98")
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key 9C")
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("L") PORT_CHAR('l') PORT_CHAR('L') PORT_CHAR(0x0c) PORT_CODE(KEYCODE_L)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Space Bar") PORT_CHAR(' ') PORT_CODE(KEYCODE_SPACE)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Return") PORT_CHAR(0x0d) PORT_CODE(KEYCODE_ENTER)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("U") PORT_CHAR('u') PORT_CHAR('U') PORT_CHAR(0x15) PORT_CODE(KEYCODE_U)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key E4")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key E0")
+
+ PORT_START("KEY5")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("N") PORT_CHAR('n') PORT_CHAR('N') PORT_CHAR(0x0e) PORT_CODE(KEYCODE_N)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("J") PORT_CHAR('j') PORT_CHAR('J') PORT_CODE(KEYCODE_J)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("P") PORT_CHAR('p') PORT_CHAR('P') PORT_CHAR(0x10) PORT_CODE(KEYCODE_P)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("K") PORT_CHAR('k') PORT_CHAR('K') PORT_CHAR(0x0b) PORT_CODE(KEYCODE_K)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("T") PORT_CHAR('t') PORT_CHAR('T') PORT_CHAR(0x14) PORT_CODE(KEYCODE_T)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key DC")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key D8")
+
+ PORT_START("KEY6")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("B") PORT_CHAR('b') PORT_CHAR('B') PORT_CHAR(0x02) PORT_CODE(KEYCODE_B)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("V") PORT_CHAR('v') PORT_CHAR('V') PORT_CHAR(0x16) PORT_CODE(KEYCODE_V)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("G Bell") PORT_CHAR('g') PORT_CHAR('G') PORT_CHAR(0x07) PORT_CODE(KEYCODE_G)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("I") PORT_CHAR('i') PORT_CHAR('I') PORT_CODE(KEYCODE_I)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("H") PORT_CHAR('h') PORT_CHAR('H') PORT_CODE(KEYCODE_H)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("E") PORT_CHAR('e') PORT_CHAR('E') PORT_CHAR(0x05) PORT_CODE(KEYCODE_E)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key D4")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key D0")
+
+ PORT_START("KEY7")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("C") PORT_CHAR('c') PORT_CHAR('C') PORT_CHAR(0x03) PORT_CODE(KEYCODE_C)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("X") PORT_CHAR('x') PORT_CHAR('X') PORT_CHAR(0x18) PORT_CODE(KEYCODE_X)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("D") PORT_CHAR('d') PORT_CHAR('D') PORT_CHAR(0x04) PORT_CODE(KEYCODE_D)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("R") PORT_CHAR('r') PORT_CHAR('R') PORT_CHAR(0x12) PORT_CODE(KEYCODE_R)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F") PORT_CHAR('f') PORT_CHAR('F') PORT_CHAR(0x06) PORT_CODE(KEYCODE_F)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key 8C")
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key CC")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key C8")
+
+ // The first three keys of this row, and all keys of the next three rows, may vary between layouts selected by the terminal.
+ PORT_START("KEY8")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('7') PORT_CHAR('&') PORT_CODE(KEYCODE_7)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('8') PORT_CHAR('*') PORT_CODE(KEYCODE_8)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('/') PORT_CHAR('?') PORT_CODE(KEYCODE_SLASH)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key 84")
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("S") PORT_CHAR('s') PORT_CHAR('S') PORT_CHAR(0x13) PORT_CODE(KEYCODE_S)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(0x1b) PORT_CODE(KEYCODE_TILDE)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key C4")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Key C0")
+
+ PORT_START("KEY9")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('5') PORT_CHAR('%') PORT_CODE(KEYCODE_5)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('6') PORT_CHAR('^') PORT_CODE(KEYCODE_6)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('.') PORT_CHAR('<') PORT_CODE(KEYCODE_STOP)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('`') PORT_CHAR('~') PORT_CODE(KEYCODE_BACKSLASH)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('\\') PORT_CHAR('|') PORT_CODE(KEYCODE_BACKSLASH2)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('\'') PORT_CHAR('"') PORT_CODE(KEYCODE_QUOTE)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('=') PORT_CHAR('+') PORT_CODE(KEYCODE_EQUALS)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Y") PORT_CHAR('y') PORT_CHAR('Y') PORT_CHAR(0x19) PORT_CODE(KEYCODE_Y)
+
+ PORT_START("KEY10")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('3') PORT_CHAR('#') PORT_CODE(KEYCODE_3)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('4') PORT_CHAR('$') PORT_CODE(KEYCODE_4)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(',') PORT_CHAR('<') PORT_CODE(KEYCODE_COMMA)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('-') PORT_CHAR('=') PORT_CODE(KEYCODE_MINUS)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("W") PORT_CHAR('w') PORT_CHAR('W') PORT_CHAR(0x17) PORT_CODE(KEYCODE_W)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(';') PORT_CHAR(':') PORT_CODE(KEYCODE_COLON)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('0') PORT_CHAR(')') PORT_CODE(KEYCODE_0)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(']') PORT_CHAR('}') PORT_CODE(KEYCODE_CLOSEBRACE)
+
+ PORT_START("KEY11")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('1') PORT_CHAR('!') PORT_CODE(KEYCODE_1)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('2') PORT_CHAR('@') PORT_CODE(KEYCODE_2)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("M") PORT_CHAR('m') PORT_CHAR('M') PORT_CODE(KEYCODE_M)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('9') PORT_CHAR('(') PORT_CODE(KEYCODE_9)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Q") PORT_CHAR('q') PORT_CHAR('Q') PORT_CHAR(0x11) PORT_CODE(KEYCODE_Q)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("A") PORT_CHAR('a') PORT_CHAR('A') PORT_CHAR(0x01) PORT_CODE(KEYCODE_A)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Z") PORT_CHAR('z') PORT_CHAR('Z') PORT_CHAR(0x1a) PORT_CODE(KEYCODE_Z)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('[') PORT_CHAR('{') PORT_CODE(KEYCODE_OPENBRACE)
+INPUT_PORTS_END
+
ioport_constructor v102_keyboard_device::device_input_ports() const
{
return INPUT_PORTS_NAME(v102_keyboard);
}
-void v102_keyboard_device::device_resolve_objects()
+ioport_constructor v550_keyboard_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME(v550_keyboard);
+}
+
+void visual_mcs48_keyboard_device::device_resolve_objects()
{
m_txd_callback.resolve_safe();
}
-void v102_keyboard_device::device_start()
+void visual_mcs48_keyboard_device::device_start()
{
m_key_select = 0x0f;
m_prog_line = true;
@@ -166,12 +306,12 @@ void v102_keyboard_device::device_start()
save_item(NAME(m_key_select));
}
-WRITE_LINE_MEMBER(v102_keyboard_device::write_rxd)
+WRITE_LINE_MEMBER(visual_mcs48_keyboard_device::write_rxd)
{
m_kbdc->set_input_line(MCS48_INPUT_IRQ, state ? CLEAR_LINE : ASSERT_LINE);
}
-u8 v102_keyboard_device::p1_r()
+u8 visual_mcs48_keyboard_device::p1_r()
{
if (m_key_select < 12)
return m_keys[m_key_select]->read();
@@ -179,12 +319,12 @@ u8 v102_keyboard_device::p1_r()
return 0xff;
}
-void v102_keyboard_device::p2_w(u8 data)
+void visual_mcs48_keyboard_device::p2_w(u8 data)
{
m_txd_callback(BIT(data, 7));
}
-WRITE_LINE_MEMBER(v102_keyboard_device::prog_w)
+WRITE_LINE_MEMBER(visual_mcs48_keyboard_device::prog_w)
{
if (state && !m_prog_line)
m_key_select = m_kbdc->p2_r() & 0x0f;
@@ -192,12 +332,12 @@ WRITE_LINE_MEMBER(v102_keyboard_device::prog_w)
m_prog_line = bool(state);
}
-void v102_keyboard_device::prog_map(address_map &map)
+void visual_mcs48_keyboard_device::prog_map(address_map &map)
{
map(0x000, 0x7ff).rom().region("kbdc", 0);
}
-void v102_keyboard_device::ext_map(address_map &map)
+void visual_mcs48_keyboard_device::ext_map(address_map &map)
{
map(0x00, 0xff).nopr(); // only accessed at startup
}
@@ -212,6 +352,15 @@ void v102_keyboard_device::device_add_mconfig(machine_config &config)
m_kbdc->prog_out_cb().set(FUNC(v102_keyboard_device::prog_w));
}
+void v550_keyboard_device::device_add_mconfig(machine_config &config)
+{
+ I8039(config, m_kbdc, 4'608'000);
+ m_kbdc->set_addrmap(AS_PROGRAM, &v550_keyboard_device::prog_map);
+ m_kbdc->p1_in_cb().set(FUNC(v550_keyboard_device::p1_r));
+ m_kbdc->p2_out_cb().set(FUNC(v550_keyboard_device::p2_w));
+ m_kbdc->prog_out_cb().set(FUNC(v550_keyboard_device::prog_w));
+}
+
// The oscillator is marked 4608 / 300 107 / KSS4D.
// Flanking the "68039" and its oscillator are two 20-pin custom SDIPs from Exar, marked 22-908-03A and 22-950-3B.
ROM_START(v102_kbd)
@@ -219,7 +368,17 @@ ROM_START(v102_kbd)
ROM_LOAD("150.kbd", 0x0000, 0x0800, CRC(afe55cff) SHA1(b26ebdde63ec0e94c08780285def39a282e128b3)) // MM2716Q
ROM_END
+ROM_START(v550_kbd)
+ ROM_REGION(0x0800, "kbdc", 0)
+ ROM_LOAD("v550kb.bin", 0x0000, 0x0800, CRC(d11d19a3) SHA1(2d88202d0548e934800f07667c8d13a3762b12fa))
+ROM_END
+
const tiny_rom_entry *v102_keyboard_device::device_rom_region() const
{
return ROM_NAME(v102_kbd);
}
+
+const tiny_rom_entry *v550_keyboard_device::device_rom_region() const
+{
+ return ROM_NAME(v550_kbd);
+}
diff --git a/src/mame/machine/v102_kbd.h b/src/mame/machine/v102_kbd.h
index 1a1a6a32c04..e9e0dd7e2d0 100644
--- a/src/mame/machine/v102_kbd.h
+++ b/src/mame/machine/v102_kbd.h
@@ -8,23 +8,19 @@
#include "cpu/mcs48/mcs48.h"
-class v102_keyboard_device : public device_t
+class visual_mcs48_keyboard_device : public device_t
{
public:
- v102_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0);
-
auto txd_callback() { return m_txd_callback.bind(); }
DECLARE_WRITE_LINE_MEMBER(write_rxd);
protected:
- virtual ioport_constructor device_input_ports() const override;
+ visual_mcs48_keyboard_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner);
+
virtual void device_resolve_objects() override;
virtual void device_start() override;
- virtual void device_add_mconfig(machine_config &config) override;
- virtual const tiny_rom_entry *device_rom_region() const override;
-private:
u8 p1_r();
void p2_w(u8 data);
DECLARE_WRITE_LINE_MEMBER(prog_w);
@@ -32,7 +28,6 @@ private:
void ext_map(address_map &map);
devcb_write_line m_txd_callback;
-
required_device<mcs48_cpu_device> m_kbdc;
required_ioport_array<12> m_keys;
@@ -40,6 +35,29 @@ private:
bool m_prog_line;
};
+class v102_keyboard_device : public visual_mcs48_keyboard_device
+{
+public:
+ v102_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0);
+
+protected:
+ virtual ioport_constructor device_input_ports() const override;
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+};
+
+class v550_keyboard_device : public visual_mcs48_keyboard_device
+{
+public:
+ v550_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0);
+
+protected:
+ virtual ioport_constructor device_input_ports() const override;
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+};
+
DECLARE_DEVICE_TYPE(V102_KEYBOARD, v102_keyboard_device)
+DECLARE_DEVICE_TYPE(V550_KEYBOARD, v550_keyboard_device)
#endif // MAME_MACHINE_V102_KBD_H