summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author angelosa <lordkale4@gmail.com>2026-04-27 15:53:04 +0200
committer angelosa <lordkale4@gmail.com>2026-04-27 15:57:39 +0200
commit24db213fc1c5d0cf2ecb36adb6ba0ce74e5d7478 (patch)
tree06f9ea0597c772d8401ea660cee58fbd257b4d7c
parent9a20965ce119233c14d0664b10f5af6e99058402 (diff)
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;
-rw-r--r--hash/smc777.xml6
-rw-r--r--src/mame/sony/smc777.cpp2
-rw-r--r--src/mame/sony/smc777_kbd.cpp413
-rw-r--r--src/mame/sony/smc777_kbd.h7
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
<publisher>ソニー・クリエイティブプロダクツ (Sony Creative Products)</publisher>
<notes><![CDATA[
[FDC] "Err(BS) on A:"
-[MC6845] no input on title screen with continous border changes, scans DE a lot.
+[MC6845] scans DE a lot on title screen (verify)
+[MC6845] uses raster effect during gameplay
]]></notes>
<info name="alt_title" value="ペンジャミン"/>
+ <info name="usage" value="Use a joystick in port 2 (uses button 2)"/>
+ <sharedfeat name="joystick2_default" value="joystick" />
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="362992">
@@ -1169,6 +1172,7 @@ Stuck [buzzer] (fixed)
<publisher>&lt;unknown&gt;</publisher>
<notes><![CDATA[
Apparently a cooking application, not extensively tested (language barrier, katakana only)
+[MC6845] odd cut off of selection (by pressing F1)
]]></notes>
<info name="alt_title" value="クッキンキャット"/>
<info name="serial" value="SMW-H703D"/>
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<u8>(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)