On a 101-key keyboard the keypad enter and keypad '/' keys have unique BIOS keycodes that are distinct from the main keyboard enter and '/' keys.
Signed-off-by: Kevin O'Connor kevin@koconnor.net --- src/kbd.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+)
diff --git a/src/kbd.c b/src/kbd.c index 2e43e71..b7b34ee 100644 --- a/src/kbd.c +++ b/src/kbd.c @@ -98,6 +98,14 @@ dequeue_key(struct bregs *regs, int incr, int extended) // Translate extended keys if (ascii == 0xe0) keycode &=0xff00; + else if ((keycode & 0xff00) == 0xe000) { + if (ascii == 0x2f) + // Extended '/' key + keycode = 0x352f; + else + // Extended enter key + keycode = 0x1c00 | (keycode & 0x00ff); + } // Technically, if the ascii value is 0xf0 or if the // 'scancode' is greater than 0x84 then the key should be // discarded. However, there seems no harm in passing on the @@ -385,6 +393,13 @@ static struct scaninfo { { 0x8600, 0x8800, 0x8a00, 0x8c00 }, /* F12 */ };
+struct scaninfo key_ext_enter VAR16 = { + 0xe00d, 0xe00d, 0xe00a, 0xa600 +}; +struct scaninfo key_ext_slash VAR16 = { + 0xe02f, 0xe02f, 0x9500, 0xa400 +}; + // Handle a ps2 style scancode read from the keyboard. static void __process_key(u8 scancode) @@ -515,6 +530,8 @@ __process_key(u8 scancode) } u16 keycode; struct scaninfo *info = &scan_to_keycode[scancode]; + if (flags2 & KF2_LAST_E0 && (scancode == 0x1c || scancode == 0x35)) + info = (scancode == 0x1c ? &key_ext_enter : &key_ext_slash); if (flags0 & KF0_ALTACTIVE) { keycode = GET_GLOBAL(info->alt); } else if (flags0 & KF0_CTRLACTIVE) {