Added IBM-J 5576 keyboard and scancode set 8Ah

This commit is contained in:
Akamaki
2024-08-15 10:38:48 +09:00
committed by GitHub
parent a8c75fb0af
commit bb9b4dc64f
2 changed files with 668 additions and 3 deletions

View File

@@ -18,10 +18,13 @@
* Copyright 2015-2019 Miran Grca.
* Copyright 2017-2019 Fred N. van Kempen.
*/
#include <stdarg.h>
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <stdlib.h>
#include <wchar.h>
#define HAVE_STDARG_H
#include <86box/86box.h>
#include <86box/machine.h>
#include <86box/keyboard.h>
@@ -49,6 +52,24 @@ uint16_t key_uncapture_1 = 0x04f; /* Numpad End */
uint16_t key_uncapture_2 = 0x14f; /* End */
#endif
#ifdef ENABLE_KBC_AT_LOG
int kbc_at_do_log = ENABLE_KBC_AT_LOG;
static void
kbc_at_log(const char* fmt, ...)
{
va_list ap;
if (kbc_at_do_log) {
va_start(ap, fmt);
pclog_ex(fmt, ap);
va_end(ap);
}
}
#else
# define kbc_at_log(fmt, ...)
#endif
void (*keyboard_send)(uint16_t val);
static int recv_key[512] = { 0 }; /* keyboard input buffer */
@@ -64,6 +85,64 @@ static uint8_t num_lock = 0;
static uint8_t scroll_lock = 0;
static uint8_t shift = 0;
static int key5576mode = 0;
typedef struct {
const uint16_t sc;
const uint8_t mk[4];
const uint8_t brk[4];
} scconvtbl;
static scconvtbl scconv55_82[18 + 1] =
{
// clang-format off
{.sc = 0x02 , .mk = { 0x5f, 0 }, .brk = { 0xf0, 0x5f, 0 } }, /* '1' -> 'Clear/ /SysRq' */
{.sc = 0x03 , .mk = { 0x48, 0 }, .brk = { 0xf0, 0x48, 0 } }, /* '2' -> '終了 (Exit)' */
{.sc = 0x04 , .mk = { 0x38, 0 }, .brk = { 0xf0, 0x38, 0 } }, /* '3' -> 'メッセージ (Message)/ /応答 (Respond)' */
{.sc = 0x05 , .mk = { 0x30, 0 }, .brk = { 0xf0, 0x30, 0 } }, /* '4' -> 'サイズ変換 (Change Size)/ /横倍角 (2x Width)' */
{.sc = 0x06 , .mk = { 0x20, 0 }, .brk = { 0xf0, 0x20, 0 } }, /* '5' -> '単語登録 (Register Word)/ /再交換 (Re-change)' */
{.sc = 0x07 , .mk = { 0x28, 0 }, .brk = { 0xf0, 0x28, 0 } }, /* '6' -> '漢字 (Kanji)/ /番号 (Number)' */
{.sc = 0x08 , .mk = { 0x60, 0 }, .brk = { 0xf0, 0x60, 0 } }, /* '7' -> '取消 (Cancel)' */
{.sc = 0x09 , .mk = { 0x40, 0 }, .brk = { 0xf0, 0x40, 0 } }, /* '8' -> 'コピー (Copy)/ /移動 (Move)' */
{.sc = 0x3d , .mk = { 0x1f, 0 }, .brk = { 0xf0, 0x1f, 0 } }, /* 'F3' -> 'Cr Bnk/領域呼出 (Call Range)/All Cr/登録 (Register)' */
{.sc = 0x3e , .mk = { 0x27, 0 }, .brk = { 0xf0, 0x27, 0 } }, /* 'F4' -> '割込み (Interrupt)' */
{.sc = 0x3f , .mk = { 0x2f, 0 }, .brk = { 0xf0, 0x2f, 0 } }, /* 'F5' -> 'UF1' */
{.sc = 0x40 , .mk = { 0x5e, 0 }, .brk = { 0xf0, 0x5e, 0 } }, /* 'F6' -> 'UF2' */
{.sc = 0x41 , .mk = { 0x08, 0 }, .brk = { 0xf0, 0x08, 0 } }, /* 'F7' -> 'UF3' */
{.sc = 0x42 , .mk = { 0x10, 0 }, .brk = { 0xf0, 0x10, 0 } }, /* 'F8' -> 'UF4' */
{.sc = 0x43 , .mk = { 0x50, 0 }, .brk = { 0xf0, 0x50, 0 } }, /* 'F9' -> 'EOF/Erase/ErInp' */
{.sc = 0x44 , .mk = { 0x18, 0 }, .brk = { 0xf0, 0x18, 0 } }, /* 'F10' -> 'Attn/ /CrSel' */
{.sc = 0x57 , .mk = { 0x17, 0 }, .brk = { 0xf0, 0x17, 0 } }, /* 'F11' -> 'PA1/ /DvCncl' */
{.sc = 0x58 , .mk = { 0x37, 0 }, .brk = { 0xf0, 0x37, 0 } }, /* 'F12' -> 'PA2/ /PA3' */
{.sc = 0 , .mk = { 0 }, .brk = { 0 } } /* end */
// clang-format on
};
static scconvtbl scconv55_8a[18 + 1] =
{
// clang-format off
{.sc = 0x02 , .mk = { 0x48 }, .brk = { 0 } }, /* '1' -> 'Clear/ /SysRq' */
{.sc = 0x03 , .mk = { 0x49 }, .brk = { 0 } }, /* '2' -> '終了 (Exit)' */
{.sc = 0x04 , .mk = { 0x46 }, .brk = { 0 } }, /* '3' -> 'メッセージ (Message)/ /応答 (Respond)' */
{.sc = 0x05 , .mk = { 0x44 }, .brk = { 0 } }, /* '4' -> 'サイズ変換 (Change Size)/ /横倍角 (2x Width)' */
{.sc = 0x06 , .mk = { 0x42 }, .brk = { 0 } }, /* '5' -> '単語登録 (Register Word)/ /再交換 (Re-change)' */
{.sc = 0x07 , .mk = { 0x43 }, .brk = { 0 } }, /* '6' -> '漢字 (Kanji)/ /番号 (Number)' */
{.sc = 0x08 , .mk = { 0x40 }, .brk = { 0 } }, /* '7' -> '取消 (Cancel)' */
{.sc = 0x09 , .mk = { 0x51 }, .brk = { 0 } }, /* '8' -> 'コピー (Copy)/ /移動 (Move)' */
{.sc = 0x3d , .mk = { 0x76 }, .brk = { 0 } }, /* 'F3' -> 'Cr Bnk/領域呼出 (Call Range)/All Cr/登録 (Register)' */
{.sc = 0x3e , .mk = { 0x77 }, .brk = { 0 } }, /* 'F4' -> '割込み (Interrupt)' */
{.sc = 0x3f , .mk = { 0x78 }, .brk = { 0 } }, /* 'F5' -> 'UF1' */
{.sc = 0x40 , .mk = { 0x79 }, .brk = { 0 } }, /* 'F6' -> 'UF2' */
{.sc = 0x41 , .mk = { 0x7a }, .brk = { 0 } }, /* 'F7' -> 'UF3' */
{.sc = 0x42 , .mk = { 0x7b }, .brk = { 0 } }, /* 'F8' -> 'UF4' */
{.sc = 0x43 , .mk = { 0x7c }, .brk = { 0 } }, /* 'F9' -> 'EOF/Erase/ErInp' */
{.sc = 0x44 , .mk = { 0x7d }, .brk = { 0 } }, /* 'F10' -> 'Attn/ /CrSel' */
{.sc = 0x57 , .mk = { 0x7e }, .brk = { 0 } }, /* 'F11' -> 'PA1/ /DvCncl' */
{.sc = 0x58 , .mk = { 0x7f }, .brk = { 0 } }, /* 'F12' -> 'PA2/ /PA3' */
{.sc = 0 , .mk = { 0 }, .brk = { 0 } } /* end */
// clang-format on
};
void
keyboard_init(void)
{
@@ -119,6 +198,36 @@ key_process(uint16_t scan, int down)
oldkey[scan] = down;
pclog("keyboard : %04X,%d in process\n", scan, down);
c = 0;
/* According to Japanese DOS K3.3 manual (N:SC18-2194-1),
IBM 5576-002, -003 keyboards have the one-time key conversion mode
that emulates 18 out of 131 keys on IBM 5576-001 keyboard.
It is triggered by pressing L-Shift (⇧) + L-Ctrl + R-Alt (前面キー)
when the scancode set is 82h or 8ah.
*/
if (key5576mode) {
int i = 0;
if (!down) {
/* Do and exit the 5576-001 emulation when a key is pressed other than trigger keys. */
if (scan != 0x1d && scan != 0x2a && scan != 0x138)
{
key5576mode = 0;
pclog("keyboard : 5576-001 key emulation disabled.\n");
}
}
while (scconv55_8a[i].sc != 0)
{
if (scconv55_8a[i].sc == scan) {
while (scconv55_8a[i].mk[c] != 0)
keyboard_send(scconv55_8a[i].mk[c++]);
return;
}
i++;
}
}
if (down && (codes[scan].mk[0] == 0))
return;
@@ -145,6 +254,13 @@ key_process(uint16_t scan, int down)
if (fake_shift_needed(scan))
keyboard_send(0x101);
}
/* Enter the 5576-001 emulation mode. */
if (keyboard_mode == 0x8a && down && ((keyboard_get_shift() & 0x43) == 0x43))
{
key5576mode = 1;
pclog("keyboard : 5576-001 key emulation enabled.\n");
}
}
/* Handle a keystroke event from the UI layer. */

View File

@@ -53,10 +53,10 @@ const uint8_t id_bytes[16][4] = { { 0x00, 0x00, 0x00, 0x00 }, /* AT 84-key */
{ 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00 }, /* FLAG_PS2 = 0x08 */
{ 0xab, 0x83, 0x00, 0x00 }, /* PS/2 101-key */
{ 0xab, 0x83, 0x00, 0x00 }, /* PS/2 102-key */
{ 0xab, 0x90, 0x00, 0x00 }, /* PS/2 106-key JIS */
{ 0xab, 0x90, 0x00, 0x00 }, /* PS/55 106-key JIS (IBM-J 5576-002) */
/* Japanese keyboard ID - TODO: Find the actual Korean one. */
{ 0xab, 0x90, 0x00, 0x00 }, /* PS/2 Korean */
{ 0x00, 0x00, 0x00, 0x00 },
@@ -1630,6 +1630,548 @@ static const scancode scancode_set3[512] = {
// clang-format on
};
/* IBM Japan 5576-001, 002 and 003 keyboards have three extra scancode sets; 81h, 82h, 8ah.
Scancode set 81h and 82h are not implemented yet.
To implement them, we need take the following into consideration.
* Add a UI to switch the type of keyboards and keyboard IDs.
* Add modified scancode set 1 and 2 (in these modes, language input keys are used as an alternative key).
* Japanese keyboards traditionally use a typewriter layout. Its key mapping doesn't match with foreign keyboards.
5576 keyboards kept 101-key compatible scancode sets because PS/55 had to support western (PS/2) versions of operating systems.
The default scancode set is 2.
In Japanese DOS, the keyboard driver confirms its keyboard ID, and sends a command to switch the scancode set to 8Ah.
The OADG standard and modern Japanese keyboards use the same keyboard ID and scancode set number as PS/2 keyboards use.
Three extra scancode sets are no longer available. Instead, language input keys are available in scancode set 1 and 2.
However, it has a different key mapping.
Users have to choose the correct keyboard layout on setup, and the driver needs to remap keys.
[Japanese DOS and keyboard scancode set]
| | K3.3 | J4.0 | J5.0 | J4.0/V | J5.0/V | OS/2 J1.3 | PC DOS 5 |
|---------------------------|:----:|:----:|:----:|:------:|:------:|:---------:|:--------:|
| IBM 101-key | n/a | n/a | n/a | n/a | 2 | n/a | 2 |
| IBM-J 5576-00x (obsolete) | 8A | 8A | 8A | 82 | 82 | 82 | 2 |
| OADG (modern JA standard) | n/a | n/a | n/a | 2 | 2 | 2 | 2 | */
/* Scancode set 8Ah : 5556 keyboard compatible scancode set used by J-DOS */
static scancode scancode_set8a[512] =
{
// clang-format off
{.mk = { 0 }, .brk = { 0 } }, /* 000 */
{.mk = { 0x3d, 0 }, .brk = { 0 } }, /* 001 */
{.mk = { 0x24, 0 }, .brk = { 0 } }, /* 002 */
{.mk = { 0x25, 0 }, .brk = { 0 } }, /* 003 */
{.mk = { 0x26, 0 }, .brk = { 0 } }, /* 004 */
{.mk = { 0x27, 0 }, .brk = { 0 } }, /* 005 */
{.mk = { 0x28, 0 }, .brk = { 0 } }, /* 006 */
{.mk = { 0x29, 0 }, .brk = { 0 } }, /* 007 */
{.mk = { 0x2a, 0 }, .brk = { 0 } }, /* 008 */
{.mk = { 0x2b, 0 }, .brk = { 0 } }, /* 009 */
{.mk = { 0x2c, 0 }, .brk = { 0 } }, /* 00a */
{.mk = { 0x2d, 0 }, .brk = { 0 } }, /* 00b */
{.mk = { 0x2e, 0 }, .brk = { 0 } }, /* 00c */
{.mk = { 0x2f, 0 }, .brk = { 0 } }, /* 00d */
{.mk = { 0x3e, 0 }, .brk = { 0 } }, /* 00e */
{.mk = { 0x3c, 0 }, .brk = { 0 } }, /* 00f */
{.mk = { 0x18, 0 }, .brk = { 0 } }, /* 010 */
{.mk = { 0x19, 0 }, .brk = { 0 } }, /* 011 */
{.mk = { 0x1a, 0 }, .brk = { 0 } }, /* 012 */
{.mk = { 0x1b, 0 }, .brk = { 0 } }, /* 013 */
{.mk = { 0x1c, 0 }, .brk = { 0 } }, /* 014 */
{.mk = { 0x1d, 0 }, .brk = { 0 } }, /* 015 */
{.mk = { 0x1e, 0 }, .brk = { 0 } }, /* 016 */
{.mk = { 0x1f, 0 }, .brk = { 0 } }, /* 017 */
{.mk = { 0x20, 0 }, .brk = { 0 } }, /* 018 */
{.mk = { 0x21, 0 }, .brk = { 0 } }, /* 019 */
{.mk = { 0x22, 0 }, .brk = { 0 } }, /* 01a */
{.mk = { 0x23, 0 }, .brk = { 0 } }, /* 01b */
{.mk = { 0x3b, 0 }, .brk = { 0 } }, /* 01c */
{.mk = { 0x41, 0 }, .brk = { 0xc1, 0 } }, /* 01d LCTRL */
{.mk = { 0x0c, 0 }, .brk = { 0 } }, /* 01e */
{.mk = { 0x0d, 0 }, .brk = { 0 } }, /* 01f */
{.mk = { 0x0e, 0 }, .brk = { 0 } }, /* 020 */
{.mk = { 0x0f, 0 }, .brk = { 0 } }, /* 021 */
{.mk = { 0x10, 0 }, .brk = { 0 } }, /* 022 */
{.mk = { 0x11, 0 }, .brk = { 0 } }, /* 023 */
{.mk = { 0x12, 0 }, .brk = { 0 } }, /* 024 */
{.mk = { 0x13, 0 }, .brk = { 0 } }, /* 025 */
{.mk = { 0x14, 0 }, .brk = { 0 } }, /* 026 */
{.mk = { 0x15, 0 }, .brk = { 0 } }, /* 027 */
{.mk = { 0x16, 0 }, .brk = { 0 } }, /* 028* */
{.mk = { 0x45, 0 }, .brk = { 0 } }, /* 029 Hankaku, Zenkaku */
{.mk = { 0x38, 0 }, .brk = { 0xb8, 0 } }, /* 02a LSHIFT */
{.mk = { 0x17, 0 }, .brk = { 0 } }, /* 02b Mu */
{.mk = { 0x01, 0 }, .brk = { 0 } }, /* 02c */
{.mk = { 0x02, 0 }, .brk = { 0 } }, /* 02d */
{.mk = { 0x03, 0 }, .brk = { 0 } }, /* 02e */
{.mk = { 0x04, 0 }, .brk = { 0 } }, /* 02f */
{.mk = { 0x05, 0 }, .brk = { 0 } }, /* 030 */
{.mk = { 0x06, 0 }, .brk = { 0 } }, /* 031 */
{.mk = { 0x07, 0 }, .brk = { 0 } }, /* 032 */
{.mk = { 0x08, 0 }, .brk = { 0 } }, /* 033 */
{.mk = { 0x09, 0 }, .brk = { 0 } }, /* 034 */
{.mk = { 0x0a, 0 }, .brk = { 0 } }, /* 035 */
{.mk = { 0x39, 0 }, .brk = { 0xb9, 0 } }, /* 036 RSHIFT */
{.mk = { 0x64, 0 }, .brk = { 0 } }, /* 037 * (asterisk) */
{.mk = { 0x3A, 0 }, .brk = { 0xba, 0 } }, /* 038 LALT = Kanji */
{.mk = { 0x34, 0 }, .brk = { 0 } }, /* 039 */
{.mk = { 0x32, 0 }, .brk = { 0xb2, 0 } }, /* 03a CAPSLOCK */
{.mk = { 0x68, 0 }, .brk = { 0 } }, /* 03b F1 */
{.mk = { 0x69, 0 }, .brk = { 0 } }, /* 03c */
{.mk = { 0x6a, 0 }, .brk = { 0 } }, /* 03d */
{.mk = { 0x6b, 0 }, .brk = { 0 } }, /* 03e */
{.mk = { 0x6c, 0 }, .brk = { 0 } }, /* 03f */
{.mk = { 0x6d, 0 }, .brk = { 0 } }, /* 040 */
{.mk = { 0x6e, 0 }, .brk = { 0 } }, /* 041 */
{.mk = { 0x6f, 0 }, .brk = { 0 } }, /* 042 */
{.mk = { 0x70, 0 }, .brk = { 0 } }, /* 043 */
{.mk = { 0x71, 0 }, .brk = { 0 } }, /* 044 F10 */
{.mk = { 0 }, .brk = { 0 } }, /* 045 NUMLOCKCLEAR -> Shift + SCRLOCK :TODO */
{.mk = { 0x75, 0 }, .brk = { 0 } }, /* 046 SCROLLLOCK */
{.mk = { 0x5d, 0 }, .brk = { 0 } }, /* 047 KP7 */
{.mk = { 0x5e, 0 }, .brk = { 0 } }, /* 048 */
{.mk = { 0x5f, 0 }, .brk = { 0 } }, /* 049 */
{.mk = { 0x67, 0 }, .brk = { 0 } }, /* 04a KP_MINUS */
{.mk = { 0x5a, 0 }, .brk = { 0 } }, /* 04b */
{.mk = { 0x5b, 0 }, .brk = { 0 } }, /* 04c */
{.mk = { 0x5c, 0 }, .brk = { 0 } }, /* 04d */
{.mk = { 0x63, 0 }, .brk = { 0 } }, /* 04e */
{.mk = { 0x57, 0 }, .brk = { 0 } }, /* 04f */
{.mk = { 0x58, 0 }, .brk = { 0 } }, /* 050 */
{.mk = { 0x59, 0 }, .brk = { 0 } }, /* 051 */
{.mk = { 0x55, 0 }, .brk = { 0 } }, /* 052 KP0 */
{.mk = { 0x56, 0 }, .brk = { 0 } }, /* 053 KP_PERIOD */
{.mk = { 0 }, .brk = { 0 } }, /* 054 */
{.mk = { 0 }, .brk = { 0 } }, /* 055 */
{.mk = { 0 }, .brk = { 0 } }, /* 056 */
{.mk = { 0x72, 0 }, .brk = { 0 } }, /* 057 F11 */
{.mk = { 0x73, 0 }, .brk = { 0 } }, /* 058 F12 */
{.mk = { 0 }, .brk = { 0 } }, /* 059 */
{.mk = { 0 }, .brk = { 0 } }, /* 05a */
{.mk = { 0 }, .brk = { 0 } }, /* 05b */
{.mk = { 0 }, .brk = { 0 } }, /* 05c */
{.mk = { 0 }, .brk = { 0 } }, /* 05d */
{.mk = { 0 }, .brk = { 0 } }, /* 05e */
{.mk = { 0 }, .brk = { 0 } }, /* 05f */
{.mk = { 0 }, .brk = { 0 } }, /* 060 */
{.mk = { 0 }, .brk = { 0 } }, /* 061 */
{.mk = { 0 }, .brk = { 0 } }, /* 062 */
{.mk = { 0 }, .brk = { 0 } }, /* 063 */
{.mk = { 0 }, .brk = { 0 } }, /* 064 */
{.mk = { 0 }, .brk = { 0 } }, /* 065 */
{.mk = { 0 }, .brk = { 0 } }, /* 066 */
{.mk = { 0 }, .brk = { 0 } }, /* 067 */
{.mk = { 0 }, .brk = { 0 } }, /* 068 */
{.mk = { 0 }, .brk = { 0 } }, /* 069 */
{.mk = { 0 }, .brk = { 0 } }, /* 06a */
{.mk = { 0 }, .brk = { 0 } }, /* 06b */
{.mk = { 0 }, .brk = { 0 } }, /* 06c */
{.mk = { 0 }, .brk = { 0 } }, /* 06d */
{.mk = { 0 }, .brk = { 0 } }, /* 06e */
{.mk = { 0 }, .brk = { 0 } }, /* 06f */
{.mk = { 0x36, 0 }, .brk = { 0xb6, 0 } }, /* 070 Kana */
{.mk = { 0 }, .brk = { 0 } }, /* 071 */
{.mk = { 0 }, .brk = { 0 } }, /* 072 */
{.mk = { 0x0b, 0 }, .brk = { 0 } }, /* 073 Ro, Underline */
{.mk = { 0 }, .brk = { 0 } }, /* 074 */
{.mk = { 0 }, .brk = { 0 } }, /* 075 */
{.mk = { 0 }, .brk = { 0 } }, /* 076 */
{.mk = { 0 }, .brk = { 0 } }, /* 077 */
{.mk = { 0 }, .brk = { 0 } }, /* 078 */
{.mk = { 0x35, 0 }, .brk = { 0 } }, /* 079 Henkan */
{.mk = { 0 }, .brk = { 0 } }, /* 07a */
{.mk = { 0x33, 0 }, .brk = { 0 } }, /* 07b Muhenkan */
{.mk = { 0 }, .brk = { 0 } }, /* 07c */
{.mk = { 0x30, 0 }, .brk = { 0 } }, /* 07d Yen, Vertical line */
{.mk = { 0 }, .brk = { 0 } }, /* 07e */
{.mk = { 0 }, .brk = { 0 } }, /* 07f */
{.mk = { 0 }, .brk = { 0 } }, /* 080 */
{.mk = { 0 }, .brk = { 0 } }, /* 081 */
{.mk = { 0 }, .brk = { 0 } }, /* 082 */
{.mk = { 0 }, .brk = { 0 } }, /* 083 */
{.mk = { 0 }, .brk = { 0 } }, /* 084 */
{.mk = { 0 }, .brk = { 0 } }, /* 085 */
{.mk = { 0 }, .brk = { 0 } }, /* 086 */
{.mk = { 0 }, .brk = { 0 } }, /* 087 */
{.mk = { 0 }, .brk = { 0 } }, /* 088 */
{.mk = { 0 }, .brk = { 0 } }, /* 089 */
{.mk = { 0 }, .brk = { 0 } }, /* 08a */
{.mk = { 0 }, .brk = { 0 } }, /* 08b */
{.mk = { 0 }, .brk = { 0 } }, /* 08c */
{.mk = { 0 }, .brk = { 0 } }, /* 08d */
{.mk = { 0 }, .brk = { 0 } }, /* 08e */
{.mk = { 0 }, .brk = { 0 } }, /* 08f */
{.mk = { 0 }, .brk = { 0 } }, /* 090 */
{.mk = { 0 }, .brk = { 0 } }, /* 091 */
{.mk = { 0 }, .brk = { 0 } }, /* 092 */
{.mk = { 0 }, .brk = { 0 } }, /* 093 */
{.mk = { 0 }, .brk = { 0 } }, /* 094 */
{.mk = { 0 }, .brk = { 0 } }, /* 095 */
{.mk = { 0 }, .brk = { 0 } }, /* 096 */
{.mk = { 0 }, .brk = { 0 } }, /* 097 */
{.mk = { 0 }, .brk = { 0 } }, /* 098 */
{.mk = { 0 }, .brk = { 0 } }, /* 099 */
{.mk = { 0 }, .brk = { 0 } }, /* 09a */
{.mk = { 0 }, .brk = { 0 } }, /* 09b */
{.mk = { 0 }, .brk = { 0 } }, /* 09c */
{.mk = { 0 }, .brk = { 0 } }, /* 09d */
{.mk = { 0 }, .brk = { 0 } }, /* 09e */
{.mk = { 0 }, .brk = { 0 } }, /* 09f */
{.mk = { 0 }, .brk = { 0 } }, /* 0a0 */
{.mk = { 0 }, .brk = { 0 } }, /* 0a1 */
{.mk = { 0 }, .brk = { 0 } }, /* 0a2 */
{.mk = { 0 }, .brk = { 0 } }, /* 0a3 */
{.mk = { 0 }, .brk = { 0 } }, /* 0a4 */
{.mk = { 0 }, .brk = { 0 } }, /* 0a5 */
{.mk = { 0 }, .brk = { 0 } }, /* 0a6 */
{.mk = { 0 }, .brk = { 0 } }, /* 0a7 */
{.mk = { 0 }, .brk = { 0 } }, /* 0a8 */
{.mk = { 0 }, .brk = { 0 } }, /* 0a9 */
{.mk = { 0 }, .brk = { 0 } }, /* 0aa */
{.mk = { 0 }, .brk = { 0 } }, /* 0ab */
{.mk = { 0 }, .brk = { 0 } }, /* 0ac */
{.mk = { 0 }, .brk = { 0 } }, /* 0ad */
{.mk = { 0 }, .brk = { 0 } }, /* 0ae */
{.mk = { 0 }, .brk = { 0 } }, /* 0af */
{.mk = { 0 }, .brk = { 0 } }, /* 0b0 */
{.mk = { 0 }, .brk = { 0 } }, /* 0b1 */
{.mk = { 0 }, .brk = { 0 } }, /* 0b2 */
{.mk = { 0 }, .brk = { 0 } }, /* 0b3 */
{.mk = { 0 }, .brk = { 0 } }, /* 0b4 */
{.mk = { 0 }, .brk = { 0 } }, /* 0b5 */
{.mk = { 0 }, .brk = { 0 } }, /* 0b6 */
{.mk = { 0 }, .brk = { 0 } }, /* 0b7 */
{.mk = { 0 }, .brk = { 0 } }, /* 0b8 */
{.mk = { 0 }, .brk = { 0 } }, /* 0b9 */
{.mk = { 0 }, .brk = { 0 } }, /* 0ba */
{.mk = { 0 }, .brk = { 0 } }, /* 0bb */
{.mk = { 0 }, .brk = { 0 } }, /* 0bc */
{.mk = { 0 }, .brk = { 0 } }, /* 0bd */
{.mk = { 0 }, .brk = { 0 } }, /* 0be */
{.mk = { 0 }, .brk = { 0 } }, /* 0bf */
{.mk = { 0 }, .brk = { 0 } }, /* 0c0 */
{.mk = { 0 }, .brk = { 0 } }, /* 0c1 */
{.mk = { 0 }, .brk = { 0 } }, /* 0c2 */
{.mk = { 0 }, .brk = { 0 } }, /* 0c3 */
{.mk = { 0 }, .brk = { 0 } }, /* 0c4 */
{.mk = { 0 }, .brk = { 0 } }, /* 0c5 */
{.mk = { 0 }, .brk = { 0 } }, /* 0c6 */
{.mk = { 0 }, .brk = { 0 } }, /* 0c7 */
{.mk = { 0 }, .brk = { 0 } }, /* 0c8 */
{.mk = { 0 }, .brk = { 0 } }, /* 0c9 */
{.mk = { 0 }, .brk = { 0 } }, /* 0ca */
{.mk = { 0 }, .brk = { 0 } }, /* 0cb */
{.mk = { 0 }, .brk = { 0 } }, /* 0cc */
{.mk = { 0 }, .brk = { 0 } }, /* 0cd */
{.mk = { 0 }, .brk = { 0 } }, /* 0ce */
{.mk = { 0 }, .brk = { 0 } }, /* 0cf */
{.mk = { 0 }, .brk = { 0 } }, /* 0d0 */
{.mk = { 0 }, .brk = { 0 } }, /* 0d1 */
{.mk = { 0 }, .brk = { 0 } }, /* 0d2 */
{.mk = { 0 }, .brk = { 0 } }, /* 0d3 */
{.mk = { 0 }, .brk = { 0 } }, /* 0d4 */
{.mk = { 0 }, .brk = { 0 } }, /* 0d5 */
{.mk = { 0 }, .brk = { 0 } }, /* 0d6 */
{.mk = { 0 }, .brk = { 0 } }, /* 0d7 */
{.mk = { 0 }, .brk = { 0 } }, /* 0d8 */
{.mk = { 0 }, .brk = { 0 } }, /* 0d9 */
{.mk = { 0 }, .brk = { 0 } }, /* 0da */
{.mk = { 0 }, .brk = { 0 } }, /* 0db */
{.mk = { 0 }, .brk = { 0 } }, /* 0dc */
{.mk = { 0 }, .brk = { 0 } }, /* 0dd */
{.mk = { 0 }, .brk = { 0 } }, /* 0de */
{.mk = { 0 }, .brk = { 0 } }, /* 0df */
{.mk = { 0 }, .brk = { 0 } }, /* 0e0 */
{.mk = { 0 }, .brk = { 0 } }, /* 0e1 */
{.mk = { 0 }, .brk = { 0 } }, /* 0e2 */
{.mk = { 0 }, .brk = { 0 } }, /* 0e3 */
{.mk = { 0 }, .brk = { 0 } }, /* 0e4 */
{.mk = { 0 }, .brk = { 0 } }, /* 0e5 */
{.mk = { 0 }, .brk = { 0 } }, /* 0e6 */
{.mk = { 0 }, .brk = { 0 } }, /* 0e7 */
{.mk = { 0 }, .brk = { 0 } }, /* 0e8 */
{.mk = { 0 }, .brk = { 0 } }, /* 0e9 */
{.mk = { 0 }, .brk = { 0 } }, /* 0ea */
{.mk = { 0 }, .brk = { 0 } }, /* 0eb */
{.mk = { 0 }, .brk = { 0 } }, /* 0ec */
{.mk = { 0 }, .brk = { 0 } }, /* 0ed */
{.mk = { 0 }, .brk = { 0 } }, /* 0ee */
{.mk = { 0 }, .brk = { 0 } }, /* 0ef */
{.mk = { 0 }, .brk = { 0 } }, /* 0f0 */
{.mk = { 0 }, .brk = { 0 } }, /* 0f1 */
{.mk = { 0 }, .brk = { 0 } }, /* 0f2 */
{.mk = { 0 }, .brk = { 0 } }, /* 0f3 */
{.mk = { 0 }, .brk = { 0 } }, /* 0f4 */
{.mk = { 0 }, .brk = { 0 } }, /* 0f5 */
{.mk = { 0 }, .brk = { 0 } }, /* 0f6 */
{.mk = { 0 }, .brk = { 0 } }, /* 0f7 */
{.mk = { 0 }, .brk = { 0 } }, /* 0f8 */
{.mk = { 0 }, .brk = { 0 } }, /* 0f9 */
{.mk = { 0 }, .brk = { 0 } }, /* 0fa */
{.mk = { 0 }, .brk = { 0 } }, /* 0fb */
{.mk = { 0 }, .brk = { 0 } }, /* 0fc */
{.mk = { 0 }, .brk = { 0 } }, /* 0fd */
{.mk = { 0 }, .brk = { 0 } }, /* 0fe */
{.mk = { 0 }, .brk = { 0 } }, /* 0ff */
{.mk = { 0x47, 0 }, .brk = { 0 } }, /* 100 Pause */
{.mk = { 0 }, .brk = { 0 } }, /* 101 */
{.mk = { 0 }, .brk = { 0 } }, /* 102 */
{.mk = { 0 }, .brk = { 0 } }, /* 103 */
{.mk = { 0 }, .brk = { 0 } }, /* 104 */
{.mk = { 0 }, .brk = { 0 } }, /* 105 */
{.mk = { 0 }, .brk = { 0 } }, /* 106 */
{.mk = { 0 }, .brk = { 0 } }, /* 107 */
{.mk = { 0 }, .brk = { 0 } }, /* 108 */
{.mk = { 0 }, .brk = { 0 } }, /* 109 */
{.mk = { 0 }, .brk = { 0 } }, /* 10a */
{.mk = { 0 }, .brk = { 0 } }, /* 10b */
{.mk = { 0 }, .brk = { 0 } }, /* 10c */
{.mk = { 0 }, .brk = { 0 } }, /* 10d */
{.mk = { 0 }, .brk = { 0 } }, /* 10e */
{.mk = { 0 }, .brk = { 0 } }, /* 10f */
{.mk = { 0 }, .brk = { 0 } }, /* 110 */
{.mk = { 0 }, .brk = { 0 } }, /* 112 */
{.mk = { 0 }, .brk = { 0 } }, /* 113 */
{.mk = { 0 }, .brk = { 0 } }, /* 113 */
{.mk = { 0 }, .brk = { 0 } }, /* 114 */
{.mk = { 0 }, .brk = { 0 } }, /* 115 */
{.mk = { 0 }, .brk = { 0 } }, /* 116 */
{.mk = { 0 }, .brk = { 0 } }, /* 117 */
{.mk = { 0 }, .brk = { 0 } }, /* 118 */
{.mk = { 0 }, .brk = { 0 } }, /* 119 */
{.mk = { 0 }, .brk = { 0 } }, /* 11a */
{.mk = { 0 }, .brk = { 0 } }, /* 11b */
{.mk = { 0x60, 0 }, .brk = { 0 } }, /* 11c KP_Enter */
{.mk = { 0x37, 0 }, .brk = { 0xb7, 0 } }, /* 11d R-Ctrl */
{.mk = { 0 }, .brk = { 0 } }, /* 11e */
{.mk = { 0 }, .brk = { 0 } }, /* 11f */
{.mk = { 0 }, .brk = { 0 } }, /* 120 */
{.mk = { 0 }, .brk = { 0 } }, /* 121 */
{.mk = { 0 }, .brk = { 0 } }, /* 122 */
{.mk = { 0 }, .brk = { 0 } }, /* 123 */
{.mk = { 0 }, .brk = { 0 } }, /* 124 */
{.mk = { 0 }, .brk = { 0 } }, /* 125 */
{.mk = { 0 }, .brk = { 0 } }, /* 126 */
{.mk = { 0 }, .brk = { 0 } }, /* 127 */
{.mk = { 0 }, .brk = { 0 } }, /* 128 */
{.mk = { 0 }, .brk = { 0 } }, /* 129 */
{.mk = { 0 }, .brk = { 0 } }, /* 12a */
{.mk = { 0 }, .brk = { 0 } }, /* 12b */
{.mk = { 0 }, .brk = { 0 } }, /* 12c */
{.mk = { 0 }, .brk = { 0 } }, /* 12d */
{.mk = { 0 }, .brk = { 0 } }, /* 12e */
{.mk = { 0 }, .brk = { 0 } }, /* 12f */
{.mk = { 0 }, .brk = { 0 } }, /* 130 */
{.mk = { 0 }, .brk = { 0 } }, /* 131 */
{.mk = { 0 }, .brk = { 0 } }, /* 132 */
{.mk = { 0 }, .brk = { 0 } }, /* 133 */
{.mk = { 0 }, .brk = { 0 } }, /* 134 */
{.mk = { 0x65, 0 }, .brk = { 0 } }, /* 135 KP_DIVIDE */
{.mk = { 0 }, .brk = { 0 } }, /* 136 */
{.mk = { 0x74, 0 }, .brk = { 0 } }, /* 137 PRINTSCREEN */
{.mk = { 0x31, 0 }, .brk = { 0xb1, 0 } }, /* 138* R-Alt */
{.mk = { 0 }, .brk = { 0 } }, /* 139 */
{.mk = { 0 }, .brk = { 0 } }, /* 13a */
{.mk = { 0 }, .brk = { 0 } }, /* 13b */
{.mk = { 0 }, .brk = { 0 } }, /* 13c */
{.mk = { 0 }, .brk = { 0 } }, /* 13d */
{.mk = { 0 }, .brk = { 0 } }, /* 13e */
{.mk = { 0 }, .brk = { 0 } }, /* 13f */
{.mk = { 0 }, .brk = { 0 } }, /* 140 */
{.mk = { 0 }, .brk = { 0 } }, /* 141 */
{.mk = { 0 }, .brk = { 0 } }, /* 142 */
{.mk = { 0 }, .brk = { 0 } }, /* 143 */
{.mk = { 0 }, .brk = { 0 } }, /* 144 */
{.mk = { 0 }, .brk = { 0 } }, /* 145 */
{.mk = { 0 }, .brk = { 0 } }, /* 146 */
{.mk = { 0x4c, 0 }, .brk = { 0 } }, /* 147 Home */
{.mk = { 0x4e, 0 }, .brk = { 0 } }, /* 148 Up */
{.mk = { 0x52, 0 }, .brk = { 0 } }, /* 149 PageUp */
{.mk = { 0 }, .brk = { 0 } }, /* 14a */
{.mk = { 0x4b, 0 }, .brk = { 0 } }, /* 14b Left */
{.mk = { 0 }, .brk = { 0 } }, /* 14c */
{.mk = { 0x4d, 0 }, .brk = { 0 } }, /* 14d Right */
{.mk = { 0 }, .brk = { 0 } }, /* 14e */
{.mk = { 0x53, 0 }, .brk = { 0 } }, /* 14f End */
{.mk = { 0x4a, 0 }, .brk = { 0 } }, /* 150 Down */
{.mk = { 0x54, 0 }, .brk = { 0 } }, /* 151 PageDown */
{.mk = { 0x4f, 0 }, .brk = { 0 } }, /* 152 Ins */
{.mk = { 0x50, 0 }, .brk = { 0 } }, /* 153 Del */
{.mk = { 0 }, .brk = { 0 } }, /* 154 */
{.mk = { 0 }, .brk = { 0 } }, /* 155 */
{.mk = { 0 }, .brk = { 0 } }, /* 156 */
{.mk = { 0 }, .brk = { 0 } }, /* 157 */
{.mk = { 0 }, .brk = { 0 } }, /* 158 */
{.mk = { 0 }, .brk = { 0 } }, /* 159 */
{.mk = { 0 }, .brk = { 0 } }, /* 15a */
{.mk = { 0x33, 0 }, .brk = { 0 } }, /* 15b LGUI->Muhenkan (in emulator only) */
{.mk = { 0x35, 0 }, .brk = { 0 } }, /* 15c RGUI->Henkan (in emulator only) */
{.mk = { 0x36, 0 }, .brk = { 0xb6, 0 } }, /* 15d APPLICATION->Kana (in emulator only) */
{.mk = { 0 }, .brk = { 0 } }, /* 15e */
{.mk = { 0 }, .brk = { 0 } }, /* 15f */
{.mk = { 0 }, .brk = { 0 } }, /* 160 */
{.mk = { 0 }, .brk = { 0 } }, /* 161 */
{.mk = { 0 }, .brk = { 0 } }, /* 162 */
{.mk = { 0 }, .brk = { 0 } }, /* 163 */
{.mk = { 0 }, .brk = { 0 } }, /* 164 */
{.mk = { 0 }, .brk = { 0 } }, /* 165 */
{.mk = { 0 }, .brk = { 0 } }, /* 166 */
{.mk = { 0 }, .brk = { 0 } }, /* 167 */
{.mk = { 0 }, .brk = { 0 } }, /* 168 */
{.mk = { 0 }, .brk = { 0 } }, /* 169 */
{.mk = { 0 }, .brk = { 0 } }, /* 16a */
{.mk = { 0 }, .brk = { 0 } }, /* 16b */
{.mk = { 0 }, .brk = { 0 } }, /* 16c */
{.mk = { 0 }, .brk = { 0 } }, /* 16d */
{.mk = { 0 }, .brk = { 0 } }, /* 16e */
{.mk = { 0 }, .brk = { 0 } }, /* 16f */
{.mk = { 0 }, .brk = { 0 } }, /* 170 */
{.mk = { 0 }, .brk = { 0 } }, /* 171 */
{.mk = { 0 }, .brk = { 0 } }, /* 172 */
{.mk = { 0 }, .brk = { 0 } }, /* 173 */
{.mk = { 0 }, .brk = { 0 } }, /* 174 */
{.mk = { 0 }, .brk = { 0 } }, /* 175 */
{.mk = { 0 }, .brk = { 0 } }, /* 176 */
{.mk = { 0 }, .brk = { 0 } }, /* 177 */
{.mk = { 0 }, .brk = { 0 } }, /* 178 */
{.mk = { 0 }, .brk = { 0 } }, /* 179 */
{.mk = { 0 }, .brk = { 0 } }, /* 17a */
{.mk = { 0 }, .brk = { 0 } }, /* 17b */
{.mk = { 0 }, .brk = { 0 } }, /* 17c */
{.mk = { 0 }, .brk = { 0 } }, /* 17d */
{.mk = { 0 }, .brk = { 0 } }, /* 17e */
{.mk = { 0 }, .brk = { 0 } }, /* 17f */
{.mk = { 0 }, .brk = { 0 } }, /* 180 */
{.mk = { 0 }, .brk = { 0 } }, /* 181 */
{.mk = { 0 }, .brk = { 0 } }, /* 182 */
{.mk = { 0 }, .brk = { 0 } }, /* 183 */
{.mk = { 0 }, .brk = { 0 } }, /* 184 */
{.mk = { 0 }, .brk = { 0 } }, /* 185 */
{.mk = { 0 }, .brk = { 0 } }, /* 186 */
{.mk = { 0 }, .brk = { 0 } }, /* 187 */
{.mk = { 0 }, .brk = { 0 } }, /* 188 */
{.mk = { 0 }, .brk = { 0 } }, /* 189 */
{.mk = { 0 }, .brk = { 0 } }, /* 18a */
{.mk = { 0 }, .brk = { 0 } }, /* 18b */
{.mk = { 0 }, .brk = { 0 } }, /* 18c */
{.mk = { 0 }, .brk = { 0 } }, /* 18d */
{.mk = { 0 }, .brk = { 0 } }, /* 18e */
{.mk = { 0 }, .brk = { 0 } }, /* 18f */
{.mk = { 0 }, .brk = { 0 } }, /* 190 */
{.mk = { 0 }, .brk = { 0 } }, /* 191 */
{.mk = { 0 }, .brk = { 0 } }, /* 192 */
{.mk = { 0 }, .brk = { 0 } }, /* 193 */
{.mk = { 0 }, .brk = { 0 } }, /* 194 */
{.mk = { 0 }, .brk = { 0 } }, /* 195 */
{.mk = { 0 }, .brk = { 0 } }, /* 196 */
{.mk = { 0 }, .brk = { 0 } }, /* 197 */
{.mk = { 0 }, .brk = { 0 } }, /* 198 */
{.mk = { 0 }, .brk = { 0 } }, /* 199 */
{.mk = { 0 }, .brk = { 0 } }, /* 19a */
{.mk = { 0 }, .brk = { 0 } }, /* 19b */
{.mk = { 0 }, .brk = { 0 } }, /* 19c */
{.mk = { 0 }, .brk = { 0 } }, /* 19d */
{.mk = { 0 }, .brk = { 0 } }, /* 19e */
{.mk = { 0 }, .brk = { 0 } }, /* 19f */
{.mk = { 0 }, .brk = { 0 } }, /* 1a0 */
{.mk = { 0 }, .brk = { 0 } }, /* 1a1 */
{.mk = { 0 }, .brk = { 0 } }, /* 1a2 */
{.mk = { 0 }, .brk = { 0 } }, /* 1a3 */
{.mk = { 0 }, .brk = { 0 } }, /* 1a4 */
{.mk = { 0 }, .brk = { 0 } }, /* 1a5 */
{.mk = { 0 }, .brk = { 0 } }, /* 1a6 */
{.mk = { 0 }, .brk = { 0 } }, /* 1a7 */
{.mk = { 0 }, .brk = { 0 } }, /* 1a8 */
{.mk = { 0 }, .brk = { 0 } }, /* 1a9 */
{.mk = { 0 }, .brk = { 0 } }, /* 1aa */
{.mk = { 0 }, .brk = { 0 } }, /* 1ab */
{.mk = { 0 }, .brk = { 0 } }, /* 1ac */
{.mk = { 0 }, .brk = { 0 } }, /* 1ad */
{.mk = { 0 }, .brk = { 0 } }, /* 1ae */
{.mk = { 0 }, .brk = { 0 } }, /* 1af */
{.mk = { 0 }, .brk = { 0 } }, /* 1b0 */
{.mk = { 0 }, .brk = { 0 } }, /* 1b1 */
{.mk = { 0 }, .brk = { 0 } }, /* 1b2 */
{.mk = { 0 }, .brk = { 0 } }, /* 1b3 */
{.mk = { 0 }, .brk = { 0 } }, /* 1b4 */
{.mk = { 0 }, .brk = { 0 } }, /* 1b5 */
{.mk = { 0 }, .brk = { 0 } }, /* 1b6 */
{.mk = { 0 }, .brk = { 0 } }, /* 1b7 */
{.mk = { 0 }, .brk = { 0 } }, /* 1b8 */
{.mk = { 0 }, .brk = { 0 } }, /* 1b9 */
{.mk = { 0 }, .brk = { 0 } }, /* 1ba */
{.mk = { 0 }, .brk = { 0 } }, /* 1bb */
{.mk = { 0 }, .brk = { 0 } }, /* 1bc */
{.mk = { 0 }, .brk = { 0 } }, /* 1bd */
{.mk = { 0 }, .brk = { 0 } }, /* 1be */
{.mk = { 0 }, .brk = { 0 } }, /* 1bf */
{.mk = { 0 }, .brk = { 0 } }, /* 1c0 */
{.mk = { 0 }, .brk = { 0 } }, /* 1c1 */
{.mk = { 0 }, .brk = { 0 } }, /* 1c2 */
{.mk = { 0 }, .brk = { 0 } }, /* 1c3 */
{.mk = { 0 }, .brk = { 0 } }, /* 1c4 */
{.mk = { 0 }, .brk = { 0 } }, /* 1c5 */
{.mk = { 0 }, .brk = { 0 } }, /* 1c6 */
{.mk = { 0 }, .brk = { 0 } }, /* 1c7 */
{.mk = { 0 }, .brk = { 0 } }, /* 1c8 */
{.mk = { 0 }, .brk = { 0 } }, /* 1c9 */
{.mk = { 0 }, .brk = { 0 } }, /* 1ca */
{.mk = { 0 }, .brk = { 0 } }, /* 1cb */
{.mk = { 0 }, .brk = { 0 } }, /* 1cv */
{.mk = { 0 }, .brk = { 0 } }, /* 1cd */
{.mk = { 0 }, .brk = { 0 } }, /* 1ce */
{.mk = { 0 }, .brk = { 0 } }, /* 1cf */
{.mk = { 0 }, .brk = { 0 } }, /* 1d0 */
{.mk = { 0 }, .brk = { 0 } }, /* 1d1 */
{.mk = { 0 }, .brk = { 0 } }, /* 1d2 */
{.mk = { 0 }, .brk = { 0 } }, /* 1d3 */
{.mk = { 0 }, .brk = { 0 } }, /* 1d4 */
{.mk = { 0 }, .brk = { 0 } }, /* 1d5 */
{.mk = { 0 }, .brk = { 0 } }, /* 1d6 */
{.mk = { 0 }, .brk = { 0 } }, /* 1d7 */
{.mk = { 0 }, .brk = { 0 } }, /* 1d8 */
{.mk = { 0 }, .brk = { 0 } }, /* 1d9 */
{.mk = { 0 }, .brk = { 0 } }, /* 1da */
{.mk = { 0 }, .brk = { 0 } }, /* 1db */
{.mk = { 0 }, .brk = { 0 } }, /* 1dc */
{.mk = { 0 }, .brk = { 0 } }, /* 1dd */
{.mk = { 0 }, .brk = { 0 } }, /* 1de */
{.mk = { 0 }, .brk = { 0 } }, /* 1df */
{.mk = { 0 }, .brk = { 0 } }, /* 1e0 */
{.mk = { 0 }, .brk = { 0 } }, /* 1e1 */
{.mk = { 0 }, .brk = { 0 } }, /* 1e2 */
{.mk = { 0 }, .brk = { 0 } }, /* 1e3 */
{.mk = { 0 }, .brk = { 0 } }, /* 1e4 */
{.mk = { 0 }, .brk = { 0 } }, /* 1e5 */
{.mk = { 0 }, .brk = { 0 } }, /* 1e6 */
{.mk = { 0 }, .brk = { 0 } }, /* 1e7 */
{.mk = { 0 }, .brk = { 0 } }, /* 1e8 */
{.mk = { 0 }, .brk = { 0 } }, /* 1e9 */
{.mk = { 0 }, .brk = { 0 } }, /* 1ea */
{.mk = { 0 }, .brk = { 0 } }, /* 1eb */
{.mk = { 0 }, .brk = { 0 } }, /* 1ec */
{.mk = { 0 }, .brk = { 0 } }, /* 1ed */
{.mk = { 0 }, .brk = { 0 } }, /* 1ee */
{.mk = { 0 }, .brk = { 0 } }, /* 1ef */
{.mk = { 0 }, .brk = { 0 } }, /* 1f0 */
{.mk = { 0 }, .brk = { 0 } }, /* 1f1 */
{.mk = { 0 }, .brk = { 0 } }, /* 1f2 */
{.mk = { 0 }, .brk = { 0 } }, /* 1f3 */
{.mk = { 0 }, .brk = { 0 } }, /* 1f4 */
{.mk = { 0 }, .brk = { 0 } }, /* 1f5 */
{.mk = { 0 }, .brk = { 0 } }, /* 1f6 */
{.mk = { 0 }, .brk = { 0 } }, /* 1f7 */
{.mk = { 0 }, .brk = { 0 } }, /* 1f8 */
{.mk = { 0 }, .brk = { 0 } }, /* 1f9 */
{.mk = { 0 }, .brk = { 0 } }, /* 1fa */
{.mk = { 0 }, .brk = { 0 } }, /* 1fb */
{.mk = { 0 }, .brk = { 0 } }, /* 1fc */
{.mk = { 0 }, .brk = { 0 } }, /* 1fd */
{.mk = { 0 }, .brk = { 0 } }, /* 1fe */
{.mk = { 0 }, .brk = { 0 } } /* 1ff */
// clang-format on
};
#ifdef ENABLE_KEYBOARD_AT_LOG
int keyboard_at_do_log = ENABLE_KEYBOARD_AT_LOG;
@@ -1664,6 +2206,10 @@ keyboard_at_set_scancode_set(void)
case 0x03:
keyboard_set_table(scancode_set3);
break;
case 0x8a:
keyboard_set_table(scancode_set8a);
break;
}
}
@@ -1922,19 +2468,22 @@ keyboard_at_write(void *priv)
break;
case 0xf0: /* Get/set scancode set */
kbc_at_dev_queue_add(dev, (val > 3) ? 0xfe : 0xfa, 0);
switch (val) {
case 0x00:
kbc_at_dev_queue_add(dev, 0xfa, 0); /* ACK */
keyboard_at_log("%s: Get scan code set [%02X]\n", dev->name, keyboard_mode);
kbc_at_dev_queue_add(dev, keyboard_mode, 0);
break;
case 0x01 ... 0x03:
case 0x8a:
kbc_at_dev_queue_add(dev, 0xfa, 0); /* ACK */
keyboard_mode = val;
keyboard_at_log("%s: Set scan code set [%02X]\n", dev->name, keyboard_mode);
keyboard_at_set_scancode_set();
break;
default:
/* Fatal so any instance of anything attempting to set scan code > 3 can be reported to us. */
kbc_at_dev_queue_add(dev, 0xfe, 0); /* Resend */
fatal("%s: Scan code set [%02X] invalid, resend\n", dev->name, val);
dev->flags |= FLAG_CTRLDAT;
dev->state = DEV_STATE_MAIN_WANT_IN;