From 3629d09dbea4a988e0eaf683191e8ea2c64dab59 Mon Sep 17 00:00:00 2001 From: AJR Date: Thu, 20 Jun 2019 00:58:25 -0400 Subject: v550: Emulate and hook up keyboard (nw) --- src/mame/drivers/v550.cpp | 28 +++---- src/mame/machine/v102_kbd.cpp | 179 +++++++++++++++++++++++++++++++++++++++--- src/mame/machine/v102_kbd.h | 34 ++++++-- 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 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 -- cgit v1.2.3