From 24db213fc1c5d0cf2ecb36adb6ba0ce74e5d7478 Mon Sep 17 00:00:00 2001 From: angelosa Date: Mon, 27 Apr 2026 15:53:04 +0200 Subject: sony/smc777_kbd.cpp: overhaul * rewrite all key mappings, and add missing keys; * add function key command overrides; * hookup CTRL modifier; * workaround multikey presses; * remove ten key handling: it's a separate port not worth supporting unless a MCU LLE dump ever surfaces; --- hash/smc777.xml | 6 +- src/mame/sony/smc777.cpp | 2 + src/mame/sony/smc777_kbd.cpp | 413 +++++++++++++++++++++++++++---------------- src/mame/sony/smc777_kbd.h | 7 +- 4 files changed, 271 insertions(+), 157 deletions(-) diff --git a/hash/smc777.xml b/hash/smc777.xml index 94409530d1c..aa66b578330 100644 --- a/hash/smc777.xml +++ b/hash/smc777.xml @@ -854,9 +854,12 @@ Untested [FDC] saving ソニー・クリエイティブプロダクツ (Sony Creative Products) + + @@ -1169,6 +1172,7 @@ Stuck [buzzer] (fixed) <unknown> diff --git a/src/mame/sony/smc777.cpp b/src/mame/sony/smc777.cpp index 96c01495627..2b60ef07918 100644 --- a/src/mame/sony/smc777.cpp +++ b/src/mame/sony/smc777.cpp @@ -6,6 +6,7 @@ SMC-777 (c) 1983 Sony References: - http://www.x1center.org/smc777/smc70_777_IOMAP_20210923.txt +- https://web.archive.org/web/20230207074451/https://monochromeeffect.org/JVCC/2021/11/23/sony-smc-777c/ TODO: - convert video to a proper mc6845, consider this as a good base for new device rewrite; @@ -997,6 +998,7 @@ void smc777_state::smc777(machine_config &config) // No clue about bundled defaults but: // - dragon expects joystick in port 1 // - comp2:SMCPAINT/smcpaint expects mouse in port 2 + // - penjamin pukes if a mouse is in port 2 MSX_GENERAL_PURPOSE_PORT(config, m_joystick_port[0], msx_general_purpose_port_devices, "joystick"); MSX_GENERAL_PURPOSE_PORT(config, m_joystick_port[1], msx_general_purpose_port_devices, "mouse"); diff --git a/src/mame/sony/smc777_kbd.cpp b/src/mame/sony/smc777_kbd.cpp index f3ca210a9d0..e472a65051b 100644 --- a/src/mame/sony/smc777_kbd.cpp +++ b/src/mame/sony/smc777_kbd.cpp @@ -7,12 +7,10 @@ SMC-777 keyboard interface TODO: - Really comes from a 8041A with undumped ROM, with a custom protocol (host doesn't see any serial-like i/f); -- Remaining keys; -- CTRL modifier; - Key repeat; - Irq handling; -- Function key commands (can override F1~F5~H keys); -- Understand how multikey presses really works; +- Understand how multikey presses really works (currently worked around); +- Numpad is a separate slot interface (yagni without LLE dump I guess); **************************************************************************************************/ @@ -29,7 +27,7 @@ DEFINE_DEVICE_TYPE(SMC777_KBD, smc777_kbd_device, "smc777_kbd", "Sony SMC-777 Ke smc777_kbd_device::smc777_kbd_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, SMC777_KBD, tag, owner, clock) - , device_matrix_keyboard_interface(mconfig, *this, "KEY0", "KEY1", "KEY2", "KEY3", "KEY4", "KEY5", "KEY6", "KEY7", "KEY8", "KEY9", "KEYA") + , device_matrix_keyboard_interface(mconfig, *this, "KEY0", "KEY1", "KEY2", "KEY3", "KEY4", "KEY5", "KEY6", "KEY7", "KEY8", "KEY9") , m_key_mod(*this, "KEY_MOD") { } @@ -41,6 +39,11 @@ void smc777_kbd_device::device_start() save_item(NAME(m_scan_code)); save_item(NAME(m_repeat_interval)); save_item(NAME(m_repeat_start)); + save_item(NAME(m_held_keys)); + save_item(NAME(m_fkey_table)); + save_item(NAME(m_fkey_index)); + save_item(NAME(m_fkey_target)); + save_item(NAME(m_fkey_dir)); } @@ -55,131 +58,139 @@ void smc777_kbd_device::device_reset() m_scan_code = 0; m_repeat_interval = 100; m_repeat_start = 1000; + m_held_keys = 0; + + // reset fkeys to default + m_fkey_dir = false; + m_fkey_index = 0; + m_fkey_target = 0xf; + + const u8 fkey_default_table[3][6] = + { + /* normal*/ + { + 0x01, 0x02, 0x04, 0x06, 0x0b, 0x1d + }, + /* shift */ + { + 0x15, 0x18, 0x12, 0x05, 0x03, 0x1d + }, + /* ctrl */ + { + 0x1a, 0x10, 0x13, 0x07, 0x0c, 0x1d + } + }; + for (int j = 0; j < 3; j++) + for (int i = 0; i < 6; i++) + m_fkey_table[j][i] = fkey_default_table[j][i]; } static INPUT_PORTS_START( smc777_kbd ) - PORT_START("KEY0") //0x00-0x07 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0_PAD) PORT_CHAR(UCHAR_MAMEKEY(0_PAD)) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1_PAD) PORT_CHAR(UCHAR_MAMEKEY(1_PAD)) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2_PAD) PORT_CHAR(UCHAR_MAMEKEY(2_PAD)) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3_PAD) PORT_CHAR(UCHAR_MAMEKEY(3_PAD)) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4_PAD) PORT_CHAR(UCHAR_MAMEKEY(4_PAD)) - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5_PAD) PORT_CHAR(UCHAR_MAMEKEY(5_PAD)) - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6_PAD) PORT_CHAR(UCHAR_MAMEKEY(6_PAD)) - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7_PAD) PORT_CHAR(UCHAR_MAMEKEY(7_PAD)) - - PORT_START("KEY1") //0x08-0x0f - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8_PAD) PORT_CHAR(UCHAR_MAMEKEY(8_PAD)) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9_PAD) PORT_CHAR(UCHAR_MAMEKEY(9_PAD)) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("/ PAD") PORT_CODE(KEYCODE_SLASH_PAD) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("* PAD") PORT_CODE(KEYCODE_ASTERISK) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("- PAD") PORT_CODE(KEYCODE_MINUS_PAD) - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("+ PAD") PORT_CODE(KEYCODE_PLUS_PAD) - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("ENTER PAD") PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHAR(13) - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME(". PAD") PORT_CODE(KEYCODE_DEL_PAD) - - PORT_START("KEY2") //0x10-0x17 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) // PORT_NAME("@") PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('@') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("A") PORT_CODE(KEYCODE_A) PORT_CHAR('A') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("B") PORT_CODE(KEYCODE_B) PORT_CHAR('B') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("C") PORT_CODE(KEYCODE_C) PORT_CHAR('C') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("D") PORT_CODE(KEYCODE_D) PORT_CHAR('D') - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("E") PORT_CODE(KEYCODE_E) PORT_CHAR('E') - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F") PORT_CODE(KEYCODE_F) PORT_CHAR('F') - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("G") PORT_CODE(KEYCODE_G) PORT_CHAR('G') - - PORT_START("KEY3") //0x18-0x1f - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("H") PORT_CODE(KEYCODE_H) PORT_CHAR('H') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("I") PORT_CODE(KEYCODE_I) PORT_CHAR('I') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("J") PORT_CODE(KEYCODE_J) PORT_CHAR('J') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("K") PORT_CODE(KEYCODE_K) PORT_CHAR('K') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("L") PORT_CODE(KEYCODE_L) PORT_CHAR('L') - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("M") PORT_CODE(KEYCODE_M) PORT_CHAR('M') - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("N") PORT_CODE(KEYCODE_N) PORT_CHAR('N') - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("O") PORT_CODE(KEYCODE_O) PORT_CHAR('O') - - PORT_START("KEY4") //0x20-0x27 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("P") PORT_CODE(KEYCODE_P) PORT_CHAR('P') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Q") PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("R") PORT_CODE(KEYCODE_R) PORT_CHAR('R') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("S") PORT_CODE(KEYCODE_S) PORT_CHAR('S') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("T") PORT_CODE(KEYCODE_T) PORT_CHAR('T') - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("U") PORT_CODE(KEYCODE_U) PORT_CHAR('U') + PORT_START("KEY0") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) // TEN_DN + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("RETURN") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(27) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME(". / >") PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) // TEN_UP + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("SPACE") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("E") PORT_CODE(KEYCODE_E) PORT_CHAR('E') + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("ESC") PORT_CODE(KEYCODE_ESC) + + PORT_START("KEY1") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("LF") PORT_CODE(KEYCODE_F12) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("/ / ?") PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME(", / <") PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("N") PORT_CODE(KEYCODE_N) PORT_CHAR('N') PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("V") PORT_CODE(KEYCODE_V) PORT_CHAR('V') - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("W") PORT_CODE(KEYCODE_W) PORT_CHAR('W') - - PORT_START("KEY5") //0x28-0x2f - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("X") PORT_CODE(KEYCODE_X) PORT_CHAR('X') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Y") PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Z") PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("0-1") /* TODO: labels */ - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("0-2") - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("1-1") - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("1-2") - - PORT_START("KEY6") //0x30-0x37 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("0") PORT_CODE(KEYCODE_0) PORT_CHAR('0') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("1") PORT_CODE(KEYCODE_1) PORT_CHAR('1') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("2") PORT_CODE(KEYCODE_2) PORT_CHAR('2') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("3") PORT_CODE(KEYCODE_3) PORT_CHAR('3') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("4") PORT_CODE(KEYCODE_4) PORT_CHAR('4') - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("5") PORT_CODE(KEYCODE_5) PORT_CHAR('5') - 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("7") PORT_CODE(KEYCODE_7) PORT_CHAR('7') - - PORT_START("KEY7") //0x38-0x3f - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("8") PORT_CODE(KEYCODE_8) PORT_CHAR('8') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("9") PORT_CODE(KEYCODE_9) PORT_CHAR('9') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("2-1") /* TODO: labels */ - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("2-3") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("3-1") - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("3-2") - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("3-3") - - PORT_START("KEY8") //0x40-0x47 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("RETURN") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(27) - 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("BACKSPACE") PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("TAB") PORT_CODE(KEYCODE_TAB) PORT_CHAR(9) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("ESC") PORT_CHAR(27) - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("INS") PORT_CODE(KEYCODE_INSERT) - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("DEL") PORT_CODE(KEYCODE_DEL) - /* TODO: control inputs */ - - PORT_START("KEY9") //0x40-0x47 - /* TODO: cursor inputs */ + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("X") PORT_CODE(KEYCODE_X) PORT_CHAR('X') + + PORT_START("KEY2") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("CURSOR DOWN") PORT_CODE(KEYCODE_DOWN) + // Red 'H', on the right of Kana Lock + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("HELP") PORT_CODE(KEYCODE_F11) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME(u8"¥ / ¦") PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR(U'¥','\\') PORT_CHAR(U'¦','|') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("M") PORT_CODE(KEYCODE_M) PORT_CHAR('M') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("B") PORT_CODE(KEYCODE_B) PORT_CHAR('B') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("C") PORT_CODE(KEYCODE_C) PORT_CHAR('C') + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Z") PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') + + PORT_START("KEY3") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("CURSOR UP") PORT_CODE(KEYCODE_UP) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("CURSOR DOWN") PORT_CODE(KEYCODE_DOWN) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("CURSOR LEFT") PORT_CODE(KEYCODE_LEFT) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("CURSOR RIGHT") PORT_CODE(KEYCODE_RIGHT) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("HOME") PORT_CODE(KEYCODE_HOME) - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("END") PORT_CODE(KEYCODE_END) - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("PGUP") PORT_CODE(KEYCODE_PGUP) - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("PGDOWN") PORT_CODE(KEYCODE_PGDN) - - PORT_START("KEYA") //0x48-0x4f - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F1") PORT_CODE(KEYCODE_F1) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F2") PORT_CODE(KEYCODE_F2) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F3") PORT_CODE(KEYCODE_F3) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F4") PORT_CODE(KEYCODE_F4) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F5") PORT_CODE(KEYCODE_F5) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("CURSOR LEFT") PORT_CODE(KEYCODE_LEFT) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("; / :") PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("K") PORT_CODE(KEYCODE_K) PORT_CHAR('K') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("H") PORT_CODE(KEYCODE_H) PORT_CHAR('H') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F") PORT_CODE(KEYCODE_F) PORT_CHAR('F') + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("S") PORT_CODE(KEYCODE_S) PORT_CHAR('S') + + PORT_START("KEY4") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("CURSOR RIGHT") PORT_CODE(KEYCODE_RIGHT) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("` / ~") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("\' / \"") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("L") PORT_CODE(KEYCODE_L) PORT_CHAR('L') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("J") PORT_CODE(KEYCODE_J) PORT_CHAR('J') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("G") PORT_CODE(KEYCODE_G) PORT_CHAR('G') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("D") PORT_CODE(KEYCODE_D) PORT_CHAR('D') + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("A") PORT_CODE(KEYCODE_A) PORT_CHAR('A') + + PORT_START("KEY5") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("BS") PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) + 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_NAME("[ / {") PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('[') PORT_CHAR('{') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("O") PORT_CODE(KEYCODE_O) PORT_CHAR('O') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("U") PORT_CODE(KEYCODE_U) PORT_CHAR('U') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("T") PORT_CODE(KEYCODE_T) PORT_CHAR('T') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Q") PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') + + PORT_START("KEY6") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("RUBOUT") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("P") PORT_CODE(KEYCODE_P) PORT_CHAR('P') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("I") PORT_CODE(KEYCODE_I) PORT_CHAR('I') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Y") PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("R") PORT_CODE(KEYCODE_R) PORT_CHAR('R') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("W") PORT_CODE(KEYCODE_W) PORT_CHAR('W') + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("TAB") PORT_CODE(KEYCODE_TAB) PORT_CHAR(9) + + PORT_START("KEY7") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("HOME") PORT_CODE(KEYCODE_HOME) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("= / +") PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('=') PORT_CHAR('+') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) // TEN_LT + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("9 / (") PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR(')') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("7 / &") PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('&') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("5 / %") PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("3 / #") PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("1 / !") PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') + + PORT_START("KEY8") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("DEL") PORT_CODE(KEYCODE_DEL) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) // TEN_RT + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("- / _") PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('_') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("0 / )") PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(')') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("8 / *") PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('*') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("6 / ^") PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('^') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("4 / $") PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("2 / @") PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('@') + + PORT_START("KEY9") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("INS") PORT_CODE(KEYCODE_INSERT) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("CLR") PORT_CODE(KEYCODE_END) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F1") PORT_CODE(KEYCODE_F1) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F2") PORT_CODE(KEYCODE_F2) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F3") PORT_CODE(KEYCODE_F3) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F4") PORT_CODE(KEYCODE_F4) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F5") PORT_CODE(KEYCODE_F5) PORT_START("KEY_MOD") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("CTRL") PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_SHIFT_2) PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KANA SHIFT") PORT_CODE(KEYCODE_LALT) - - - #if 0 - PORT_BIT(0x00002000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("-") PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') - - PORT_BIT(0x04000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME(":") PORT_CODE(KEYCODE_QUOTE) PORT_CHAR(':') - PORT_BIT(0x08000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME(";") PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') - PORT_BIT(0x08000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("[") PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR('[') - PORT_BIT(0x20000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("]") PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR(']') - PORT_BIT(0x40000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("^") PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('^') - PORT_BIT(0x80000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("_") - #endif INPUT_PORTS_END ioport_constructor smc777_kbd_device::device_input_ports() const @@ -193,42 +204,95 @@ ioport_constructor smc777_kbd_device::device_input_ports() const uint8_t smc777_kbd_device::translate(uint8_t row, uint8_t column) { - const u8 keytable[2][0xa0] = + // Ignore numpad for now + // F-keys handled dynamically therefore ignored in this static table + const u8 keytable[3][0x50] = { - /* normal*/ + /* normal */ { - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* numpad */ - 0x38, 0x39, 0x2f, 0x2a, 0x2d, 0x2b, 0x0d, 0x2e, - 0xff, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, /* A - G */ - 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, /* H - O */ - 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, /* P - W */ - 0x78, 0x79, 0x7a, 0x2d, 0x5d, 0x60, 0xff, 0xff, /* X - Z */ - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 0 - 7*/ - 0x38, 0x39, 0x3b, 0x5c, 0x2c, 0x2e, 0x2f, 0xff, /* 8 - 9 */ - 0x0d, 0x20, 0x08, 0x09, 0x1b, 0x0f, 0x11, 0xff, - 0x17, 0x1c, 0x16, 0x19, 0x14, 0x0e, 0x12, 0x03, - 0x01, 0x02, 0x04, 0x06, 0x0b, 0xff, 0xff, 0xff +// ------, TEN_DN, RETURN, >, TEN_UP, SPACE, E, ESC + 0xff, 0xff, 0x0d, 0x2e, 0xff, 0x20, 0x65, 0x1b, +// LF, ------, ------, ?, <, N, V, X + 0x0a, 0xff, 0xff, 0x2f, 0x2c, 0x6e, 0x76, 0x78, +// CUR_DN, HELP, \, ------, M, B, C, Z + 0x1c, 0xff, 0x5c, 0xff, 0x6d, 0x62, 0x63, 0x7a, +// CUR_UP, CUR_LT, ------, :, K, H, F, S + 0x17, 0x16, 0xff, 0x3b, 0x6b, 0x68, 0x66, 0x73, +// CUR_RT, ~, ", L, J, G, D, A + 0x19, 0x60, 0x27, 0x6c, 0x6a, 0x67, 0x64, 0x61, +// BS, }, {, O, U, T, ------, Q + 0x08, 0x5d, 0x5b, 0x6f, 0x75, 0x74, 0xff, 0x71, +// ------, RUBOUT, P, I, Y, R, W, TAB + 0xff, 0x7f, 0x70, 0x69, 0x79, 0x72, 0x77, 0x09, +// HOME, +, TEN_LT, 9, 7, 5, 3, 1 + 0x14, 0x3d, 0xff, 0x39, 0x37, 0x35, 0x33, 0x31, +// DEL, TEN_RT, -, 0, 8, 6, 4, 2 + 0x11, 0xff, 0x2d, 0x30, 0x38, 0x36, 0x34, 0x32, +// INS, CLR, ------, F1, F2, F3, F4, F5 + 0x0f, 0x0e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }, /* shift */ { - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* numpad */ - 0x38, 0x39, 0x2f, 0x2a, 0x2d, 0x2b, 0x0d, 0x2e, - 0xff, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, - 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, /* H - O */ - 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, /* P - W */ - 0x58, 0x59, 0x5a, 0x5f, 0x7d, 0x7e, 0xff, 0xff, /* X - Z */ - 0x29, 0x21, 0x40, 0x23, 0x24, 0x25, 0x5e, 0x26, - 0x2a, 0x28, 0x3a, 0x7c, 0x3c, 0x3e, 0x3f, 0xff, - 0x0d, 0x20, 0x08, 0x09, 0x1b, 0x0f, 0x11, 0xff, - 0x17, 0x1c, 0x16, 0x19, 0x14, 0x0e, 0x12, 0x03, - 0x15, 0x18, 0x12, 0x05, 0x03, 0xff, 0xff, 0xff /* F1 - F5 */ +// ------, TEN_DN, RETURN, >, TEN_UP, SPACE, E, ESC + 0xff, 0xff, 0x0d, 0x3e, 0xff, 0x20, 0x45, 0x1b, +// LF, ------, ------, ?, <, N, V, X + 0x0a, 0xff, 0xff, 0x3f, 0x3c, 0x4e, 0x56, 0x58, +// CUR_DN, HELP, \, ------, M, B, C, Z + 0x1c, 0xff, 0x7c, 0xff, 0x4d, 0x42, 0x43, 0x5a, +// CUR_UP, CUR_LT, ------, :, K, H, F, S + 0x17, 0x16, 0xff, 0x3a, 0x4b, 0x48, 0x46, 0x53, +// CUR_RT, ~, ", L, J, G, D, A + 0x19, 0x7e, 0x22, 0x4c, 0x4a, 0x47, 0x44, 0x41, +// BS, }, {, O, U, T, ------, Q + 0x08, 0x7d, 0x7b, 0x4f, 0x55, 0x54, 0xff, 0x51, +// ------, RUBOUT, P, I, Y, R, W, TAB + 0xff, 0x7f, 0x50, 0x49, 0x59, 0x52, 0x57, 0x09, +// HOME, +, TEN_LT, 9, 7, 5, 3, 1 + 0x14, 0x2b, 0xff, 0x28, 0x26, 0x25, 0x23, 0x21, +// DEL, TEN_RT, -, 0, 8, 6, 4, 2 + 0x11, 0xff, 0x5f, 0x29, 0x2a, 0x5e, 0x24, 0x40, +// INS, CLR, ------, F1, F2, F3, F4, F5 + 0x0f, 0x0e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff + }, + /* ctrl */ + { +// ------, TEN_DN, RETURN, >, TEN_UP, SPACE, E, ESC + 0xff, 0xff, 0x0d, 0x1e, 0xff, 0x20, 0x05, 0x1b, +// LF, ------, ------, ?, <, N, V, X + 0x0a, 0xff, 0xff, 0x1f, 0x00, 0x0e, 0x16, 0x18, +// CUR_DN, HELP, \, ------, M, B, C, Z + 0x1c, 0xff, 0x1c, 0xff, 0x0d, 0x02, 0x03, 0x1a, +// CUR_UP, CUR_LT, ------, :, K, H, F, S + 0x17, 0x16, 0xff, 0x00, 0x0b, 0x08, 0x06, 0x13, +// CUR_RT, ~, ", L, J, G, D, A + 0x19, 0x00, 0x00, 0x0c, 0x0a, 0x07, 0x04, 0x01, +// BS, }, {, O, U, T, ------, Q + 0x08, 0x1d, 0x1b, 0x0f, 0x15, 0x14, 0xff, 0x11, +// ------, RUBOUT, P, I, Y, R, W, TAB + 0xff, 0x7f, 0x10, 0x09, 0x19, 0x12, 0x17, 0x09, +// HOME, +, TEN_LT, 9, 7, 5, 3, 1 + 0x14, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, +// DEL, TEN_RT, -, 0, 8, 6, 4, 2 + 0x11, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +// INS, CLR, ------, F1, F2, F3, F4, F5 + 0x0f, 0x0e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } }; - // TODO: CTRL modifier, CAPS LOCK modifier, not all keys supports kana modifier + // TODO: CAPS LOCK modifier, not all keys supports kana modifier const u8 shift = BIT(m_key_mod->read(), 0); + const u8 ctrl = BIT(m_key_mod->read(), 1); + const u8 modifier = ctrl ? 2 : shift ? 1 : 0; + + // HELP key + if (row == 2 && column == 1) + return m_fkey_table[modifier][5]; - return keytable[shift][row * 8 + column] | (BIT(m_key_mod->read(), 4) << 7); + // F1 ~ F5 keys + if (row == 9 && column >= 3) + return m_fkey_table[modifier][column - 3]; + + return keytable[modifier][row * 8 + column] | (BIT(m_key_mod->read(), 4) << 7); } @@ -236,12 +300,16 @@ void smc777_kbd_device::key_make(uint8_t row, uint8_t column) { m_scan_code = translate(row, column); m_status |= 5; + // take count of multipresses like this (testable in games like ldrun/cloderun) + m_held_keys ++; } void smc777_kbd_device::key_break(uint8_t row, uint8_t column) { // m_scan_code = 0; - m_status &= ~4; + m_held_keys --; + if (m_held_keys <= 0) + m_status &= ~4; } void smc777_kbd_device::key_repeat(uint8_t row, uint8_t column) @@ -274,20 +342,47 @@ void smc777_kbd_device::scan_mode(u8 data) u8 smc777_kbd_device::data_r(offs_t offset) { - // TODO: really cleared after 80 usec - if (!machine().side_effects_disabled()) - m_status &= ~1; - return m_scan_code; + if (m_command == 0) + { + // TODO: really cleared after 80 usec + if (!machine().side_effects_disabled()) + m_status &= ~1; + return m_scan_code; + } + else if (m_command == 0x80 && !m_fkey_dir) + { + LOG("data_r function key code %01x\n", m_fkey_target); + if (m_fkey_target == 0xf) + return 0; + u8 res = m_fkey_table[m_fkey_index][m_fkey_target]; + if (!machine().side_effects_disabled()) + { + m_fkey_index ++; + if (m_fkey_index >= 3) + m_command = 0xff; + } + return res; + } + + return 0; } void smc777_kbd_device::data_w(offs_t offset, u8 data) { if (m_command == 0) scan_mode(data); - else + else if (m_command == 0x80 && m_fkey_dir) { - LOG("data_w function key code TBD %02x\n", data); + LOG("data_w function key code %01x %02x\n", m_fkey_target, data); + if (m_fkey_target == 0xf) + return; + m_fkey_table[m_fkey_index][m_fkey_target] = data; + m_fkey_index ++; + if (m_fkey_index >= 3) + m_command = 0xff; } + else + LOG("data_w with command %02x data %02x (ignored)\n", m_command, data); } /* @@ -345,7 +440,16 @@ void smc777_kbd_device::control_w(offs_t offset, u8 data) break; case 0x80: - LOG("Function key %s (tbd)\n", BIT(data, 5) ? "write" : "read"); + m_fkey_target = data & 0xf; + m_fkey_dir = !!BIT(data, 5); + m_fkey_index = 0; + LOG("Function key %s target %01x\n", m_fkey_dir ? "write" : "read", m_fkey_target); + // clamp to natural table, otherwise mark it as invalid + // (is the MCU really handling f-keys starting from bit 1?) + if (m_fkey_target == std::clamp(m_fkey_target, 1, 6)) + m_fkey_target --; + else + m_fkey_target = 0xf; break; case 0xc0: @@ -355,4 +459,3 @@ void smc777_kbd_device::control_w(offs_t offset, u8 data) } } } - diff --git a/src/mame/sony/smc777_kbd.h b/src/mame/sony/smc777_kbd.h index 46f6342e96d..ab2aea6cdf0 100644 --- a/src/mame/sony/smc777_kbd.h +++ b/src/mame/sony/smc777_kbd.h @@ -8,7 +8,7 @@ #include "machine/keyboard.h" class smc777_kbd_device : public device_t - , protected device_matrix_keyboard_interface<11> + , protected device_matrix_keyboard_interface<10> { public: smc777_kbd_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); @@ -38,6 +38,11 @@ private: u8 m_scan_code; u16 m_repeat_interval; u16 m_repeat_start; + s8 m_held_keys; + u8 m_fkey_table[3][6]; + bool m_fkey_dir; + u8 m_fkey_target; + u8 m_fkey_index; }; DECLARE_DEVICE_TYPE(SMC777_KBD, smc777_kbd_device) -- cgit v1.2.3