OSDN Git Service

[WIP][VM][FM7] Implementing keyboard, more...
authorK.Ohta <whatisthis.sowhat@gmail.com>
Sat, 14 Feb 2015 14:35:12 +0000 (23:35 +0900)
committerK.Ohta <whatisthis.sowhat@gmail.com>
Sat, 14 Feb 2015 14:35:12 +0000 (23:35 +0900)
source/src/vm/fm7/keyboard.cpp

index 86f0500..f7b2771 100644 (file)
 #include "keyboard.h"
 
 enum {
-  SIG_FM7KEY_KEY_UP = 0x800,
-  SIG_FM7KEY_KEY_DOWN,
-  SIG_FM7KEY_READ, // D400 = high , D401 = low
-  SIG_FM7KEY_LED_ONOFF, // D40D: Write = OFF / Read = ON
-  // D431
-  SIG_FM7KEY_PUSH_TO_ENCODER,
+       SIG_FM7KEY_KEY_UP = 0x800,
+       SIG_FM7KEY_KEY_DOWN,
+       SIG_FM7KEY_READ, // D400 = high , D401 = low
+       SIG_FM7KEY_LED_ONOFF, // D40D: Write = OFF / Read = ON
+       // D431
+       SIG_FM7KEY_PUSH_TO_ENCODER,
 };
 //
 
 uint16 vk_matrix[0x68] = { // VK
-  // +0, +1, +2, +3, +4, +5, +6, +7
-  0x00, /* ESC : KANJI or PAUSE*/ VK_KANJI, '1', '2',  '3', '4', '5', '6', // +0x00
-  '7', '8',       '9', '0', /* - */ 0xbd, /* ^ */ 0xde, /* \| */ 0xdc, VK_BACK, // +0x08
-  VK_TAB, 'Q',       'W', 'E', 'R', 'T', 'Y', 'U', // +0x10
-  'I', 'O',       'P', /* @ */ 0xc0, /* [ */ 0xdb, VK_RETURN, 'A', 'S',  //+0x18
-  'D', 'F', 'G', 'H', 'J', 'K', 'L', /* SEMICOLON */ 0xbb,  // +0x20
-  /* COLON */ 0xba, /* ] */ 0xdd, 'Z', 'X', 'C', 'V', 'B', 'N',  // +0x28
-  'M',  /* COMMA */ 0xbc, /* PERIOD */ 0xbe, /* SLASH */ 0xbf, /* BACKSLASH _ */ 0xe2, VK_SPACE, VK_MULTIPLY, VK_DIVIDE // +0x30
-  VK_ADD, VK_SUBTRACT, VK_NUMPAD7, VK_NUMPAD8, VK_NUMPAD9, 0x00, VK_NUMPAD4, VK_NUMPAD5, // +0x38
-  VK_NUMPAD6, /* NUMPADCOMMA */ 0x00, VK_NUMPAD1, VK_NUMPAD2, VK_NUMPAD3, /* NUMPADENTER: Right? */ VK_RETURN, VK_NUMPAD0, VK_DECIMAL, // +0x40
-  VK_INSERT, VK_HOME, VK_PRIOR, VK_DELETE, VK_END, VK_UP, VK_NEXT, VK_LEFT, // +0x48
-  VK_DOWN, VK_RIGHT, VK_LCONTROL, VK_LSHIFT, VK_RSHIFT, VK_CAPITAL, /* MUHENKAN */ 0x1d, HENKAN, // +0x50
-  /* VK_KANA */ 0xf2, 0x00, VK_RCONTROL, 0x00, VK_ESCAPE, VK_F1, VK_F2, VK_F3, // +0x58
-  VK_F4, VK_F5, VK_F6, VK_F7, VK_F8, VK_F9, VK_F10, 0xffff // +0x60
+       // +0, +1, +2, +3, +4, +5, +6, +7
+       /* 0x00, ESC, 1 , 2, 3, 4, 5, 6 */
+       0x00,            VK_KANJI,      '1',            '2',            '3',            '4',            '5',            '6',            // +0x00
+       /* 7, 8, 9, 0, - , ^, \|, BS */
+       '7',            '8',            '9',            '0',            0xbd,           0xde,           0xdc,           VK_BACK,        // +0x08
+       /* TAB, Q, W, E, R, T, Y, U */
+       VK_TAB,         'Q',            'W',            'E',            'R',            'T',            'Y',            'U',            // +0x10
+       /* I, O, P, @, [, [RET], A, S */
+       'I',            'O',            'P',            0xc0,           0xdb,           VK_RETURN,      'A',            'S',            //+0x18
+       /* D, F, G, H, J, K, L, ; */
+       'D',            'F',            'G',            'H',            'J',            'K',            'L',            0xbb,           // +0x20
+       /* :, ], Z, X, C, V, B, N */
+       0xba,           0xdd,           'Z',            'X',            'C',            'V',            'B',            'N',            // +0x28
+       /* M, , , ., / , \, RSPACE=RWIN , * , / */
+       'M',            0xbc,           0xbe,           0xbf,           0xe2,           VK_RWIN,        VK_MULTIPLY,    VK_DIVIDE,      // +0x30
+       /* + , - , 7, 8, 9, = , 4, 5 */
+       VK_ADD,         VK_SUBTRACT,    VK_NUMPAD7,     VK_NUMPAD8,     VK_NUMPAD9,     0x00,           VK_NUMPAD4,     VK_NUMPAD5,     // +0x38
+       /* 6, NUMPADCOMMA=RMENU , 1, 2, 3, NUMPADENTER=RETURN,0, . */
+       VK_NUMPAD6,     VK_RMENU,       VK_NUMPAD1,     VK_NUMPAD2,     VK_NUMPAD3,     VK_RETURN,      VK_NUMPAD0,     VK_DECIMAL,     // +0x40
+       /* INS, HOME, PRIOR, DEL, END, ↑, ↓,← */
+       VK_INSERT,      VK_HOME,        VK_PRIOR,       VK_DELETE,      VK_END,         VK_UP,          VK_NEXT,        VK_LEFT,        // +0x48
+       /* PAgeDown, →, LCTRL, LSHIFT, RSHIFT, CAPS, Graph=Muhenkan, Lspace=LALT */
+       VK_DOWN,        VK_RIGHT,       VK_LCONTROL,    VK_LSHIFT,      VK_RSHIFT,      VK_CAPITAL,     0x1d,   0xf3,   // +0x50
+       /* Cspace=Space, *Unknown*, KANA, *Unknown* , ESC(Break), F1, F2, F3 */
+       VK_SPACE,       0x00,           0xf2,           0x00,           VK_ESCAPE,      VK_F1,          VK_F2,  VK_F3,  // +0x58
+       /* F4, F5, F6, F7, F8, F9, F10 , *END* */
+       VK_F4,          VK_F5,          VK_F6,          VK_F7,          VK_F8,          VK_F9,          VK_F10,         0xffff  // +0x60
 };
+
 struct key_tbl_t {
-  uint16 phy;
-  uint16 code;
+       uint16 phy;
+       uint16 code;
 };
 
 // Key tables value from XM7.
+const key_tbl_t standard_key[] = {
+       {0x01, 0x1b},
+       {0x02, 0x31},
+       {0x03, 0x32},
+       {0x04, 0x33},
+       {0x05, 0x34},
+       {0x06, 0x35},
+       {0x07, 0x36},
+       {0x08, 0x37},
+       {0x09, 0x38},
+       {0x0a, 0x39},
+       {0x0b, 0x30},
+       {0x0c, 0x2d},
+       {0x0d, 0x5e},
+       {0x0e, 0x5c},
+       {0x0f, 0x08},
+       
+       {0x10, 0x09},
+       {0x11, 0x71},
+       {0x12, 0x77},
+       {0x13, 0x65},
+       {0x14, 0x72},
+       {0x15, 0x74},
+       {0x16, 0x79},
+       {0x17, 0x75},
+       {0x18, 0x69},
+       {0x19, 0x6f},
+       {0x1a, 0x70},
+       {0x1b, 0x40},
+       {0x1c, 0x5b},
+       {0x1d, 0x0d},
+       {0x1e, 0x61},
+       {0x1f, 0x73},
+       
+       {0x20, 0x64},
+       {0x21, 0x66},
+       {0x22, 0x67},
+       {0x23, 0x68},
+       {0x24, 0x6a},
+       {0x25, 0x6b},
+       {0x26, 0x6c},
+       {0x27, 0x3b},
+       {0x28, 0x3a},
+       {0x29, 0x5d},
+       {0x2a, 0x7a},
+       {0x2b, 0x78},
+       {0x2c, 0x63},
+       {0x2d, 0x76},
+       {0x2e, 0x62},
+       {0x2f, 0x6e},
+       
+       {0x30, 0x6d},
+       {0x31, 0x2c},
+       {0x32, 0x2e},
+       {0x33, 0x2f},
+       {0x34, 0x22},
+       {0x35, 0x20},
+       {0x36, 0x2a},
+       {0x37, 0x2f},
+       {0x38, 0x2b},
+       {0x39, 0x2d},
+       {0x3a, 0x37},
+       {0x3b, 0x38},
+       {0x3c, 0x39},
+       {0x3d, 0x3d},
+       {0x3e, 0x34},
+       {0x3f, 0x35},
+       
+       {0x40, 0x36},
+       {0x41, 0x2c},
+       {0x42, 0x31},
+       {0x43, 0x32},
+       {0x44, 0x33},
+       {0x45, 0x0d},
+       {0x46, 0x30},
+       {0x47, 0x2e},
+       {0x48, 0x12},
+       {0x49, 0x05},
+       {0x4a, 0x0c},
+       {0x4b, 0x7f},
+       {0x4c, 0x11},
+       {0x4d, 0x1e},
+       {0x4e, 0x0b},
+       {0x4f, 0x1d},
+       
+       {0x50, 0x1f},
+       {0x51, 0x1c},
+       
+       {0x57, 0x20},
+       {0x58, 0x20},
+       
+       {0x5d, 0x0101},
+       {0x5e, 0x0102},
+       {0x5f, 0x0103},
+       {0x60, 0x0104},
+       {0x61, 0x0105},
+       {0x62, 0x0106},
+       {0x63, 0x0107},
+       {0x64, 0x0108},
+       {0x65, 0x0109},
+       {0x66, 0x010a},
+       
+       {0xffff, 0xffff}
+};
+
+const key_tbl_t standard_shift_key[] = {
+       {0x01, 0x1b},
+       {0x02, 0x21},
+       {0x03, 0x22},
+       {0x04, 0x23},
+       {0x05, 0x24},
+       {0x06, 0x25},
+       {0x07, 0x26},
+       {0x08, 0x27},
+       {0x09, 0x28},
+       {0x0a, 0x29},
+       
+       {0x0c, 0x3d},
+       {0x0d, 0x7e},
+       {0x0e, 0x7c},
+       {0x0f, 0x08},
+       
+       {0x10, 0x09},
+       {0x11, 0x51},
+       {0x12, 0x57},
+       {0x13, 0x45},
+       {0x14, 0x52},
+       {0x15, 0x54},
+       {0x16, 0x59},
+       {0x17, 0x55},
+       {0x18, 0x49},
+       {0x19, 0x4f},
+       {0x1a, 0x50},
+       {0x1b, 0x60},
+       {0x1c, 0x7b},
+       {0x1d, 0x0d},
+       {0x1e, 0x41},
+       {0x1f, 0x53},
+       
+       {0x20, 0x44},
+       {0x21, 0x46},
+       {0x22, 0x47},
+       {0x23, 0x48},
+       {0x24, 0x4a},
+       {0x25, 0x4b},
+       {0x26, 0x4c},
+       {0x27, 0x2b},
+       {0x28, 0x2a},
+       {0x29, 0x7d},
+       {0x2a, 0x5a},
+       {0x2b, 0x58},
+       {0x2c, 0x43},
+       {0x2d, 0x56},
+       {0x2e, 0x42},
+       {0x2f, 0x4e},
+       
+       {0x30, 0x4d},
+       {0x31, 0x3c},
+       {0x32, 0x3e},
+       {0x33, 0x3f},
+       {0x34, 0x5f},
+       {0x35, 0x20},
+       {0x36, 0x2a},
+       {0x37, 0x2f},
+       {0x38, 0x2b},
+       {0x39, 0x2d},
+       {0x3a, 0x37},
+       {0x3b, 0x38},
+       {0x3c, 0x39},
+       {0x3d, 0x3d},
+       {0x3e, 0x34},
+       {0x3f, 0x35},
+
+       {0x40, 0x36},
+       {0x41, 0x2c},
+       {0x42, 0x31},
+       {0x43, 0x32},
+       {0x44, 0x33},
+       {0x45, 0x0d},
+       {0x46, 0x30},
+       {0x47, 0x2e},
+       {0x48, 0x12},
+       {0x49, 0x05},
+       {0x4a, 0x0c},
+       {0x4b, 0x7f},
+       {0x4c, 0x11},
+       {0x4d, 0x19},
+       {0x4e, 0x0b},
+       {0x4f, 0x02},
+       
+       {0x50, 0x1a},
+       {0x51, 0x06},
+
+       {0x57, 0x20},
+       {0x58, 0x20},
+       {0xffff, 0xffff}
+};
+
 const struct key_tbl_t ctrl_key[] = {
-  {0x0c, 0x1e},
-  {0x0d, 0x1c},
-  {0x11, 0x11},
-  {0x12, 0x17},
-  {0x13, 0x05},
-  {0x14, 0x12},
-  {0x15, 0x14},
-  {0x16, 0x19},
-  {0x17, 0x15},
-  {0x18, 0x09},
-  {0x19, 0x0f},
-  {0x1a, 0x10},
-  {0x1b, 0x00},
-  {0x1c, 0x1b},
-  {0x1e, 0x01},
-  {0x1f, 0x13},
-  {0x20, 0x04},
-  {0x21, 0x06},
-  {0x22, 0x07},
-  {0x23, 0x08},
-  {0x24, 0x0a},
-  {0x25, 0x0b},
-  {0x26, 0x0c},
-  {0x29, 0x1d},
-  {0x2a, 0x1a},
-  {0x2b, 0x18},
-  {0x2c, 0x03},
-  {0x2d, 0x16},
-  {0x2e, 0x02},
-  {0x2f, 0x0e},
-  {0x30, 0x0d},
-  {0x34, 0x1f},
-  {0xffff, 0xffff}
+       {0x0c, 0x1e},
+       {0x0d, 0x1c},
+       
+       {0x11, 0x11},
+       {0x12, 0x17},
+       {0x13, 0x05},
+       {0x14, 0x12},
+       {0x15, 0x14},
+       {0x16, 0x19},
+       {0x17, 0x15},
+       {0x18, 0x09},
+       {0x19, 0x0f}, // 09
+       {0x1a, 0x10},
+       {0x1b, 0x00},
+       {0x1c, 0x1b},
+       {0x1e, 0x01},
+       {0x1f, 0x13},
+       
+       {0x20, 0x04},
+       {0x21, 0x06},
+       {0x22, 0x07},
+       {0x23, 0x08},
+       {0x24, 0x0a},
+       {0x25, 0x0b},
+       {0x26, 0x0c},
+       {0x29, 0x1d},
+       {0x2a, 0x1a},
+       {0x2b, 0x18},
+       {0x2c, 0x03},
+       {0x2d, 0x16},
+       {0x2e, 0x02},
+       {0x2f, 0x0e},
+  
+       {0x30, 0x0d},
+       
+       {0x34, 0x1f},
+       {0xffff, 0xffff}
+};
+
+const struct key_tbl_t ctrl_shift_key[] = {
+       {0x0c, 0x1e},
+       {0x0d, 0x1c},
+       
+       {0x11, 0x11},
+       {0x12, 0x17},
+       {0x13, 0x05},
+       {0x14, 0x12},
+       {0x15, 0x14},
+       {0x16, 0x19},
+       {0x17, 0x15},
+       {0x18, 0x09},
+       {0x19, 0x09},
+       {0x1a, 0x10},
+       {0x1b, 0x00},
+       {0x1c, 0x1b},
+       {0x1e, 0x01},
+       {0x1f, 0x13},
+  
+       {0x20, 0x04},
+       {0x21, 0x06},
+       {0x22, 0x07},
+       {0x23, 0x08},
+       {0x24, 0x0a},
+       {0x25, 0x0b},
+       {0x26, 0x0c},
+       {0x29, 0x1d},
+       {0x2a, 0x1a},
+       {0x2b, 0x18},
+       {0x2c, 0x03},
+       {0x2d, 0x16},
+       {0x2e, 0x02},
+       {0x2f, 0x0e},
+  
+       {0x30, 0x0d},
+       
+       {0x34, 0x1f},
+       {0xffff, 0xffff}
 };
 
 const struct key_tbl_t graph_key[] = {
-  {0x5d, 0x101},
-  {0x5e, 0x102},
-  {0x5f, 0x103},
-  {0x60, 0x104},
-  {0x61, 0x105},
-  {0x62, 0x106},
-  {0x63, 0x107},
-  {0x64, 0x108},
-  {0x65, 0x109},
-  {0x66, 0x10a},
-
-  {0x01, 0x1b},
-  {0x02, 0xf9},
-  {0x03, 0xfa},
-  {0x04, 0xfb},
-  {0x05, 0xfc},
-  {0x06, 0xf2},
-  {0x07, 0xf3},
-  {0x08, 0xf4},
-  {0x09, 0xf5},
-  {0x0a, 0xf6},
-  {0x0b, 0xf7},
-  {0x0c, 0x8c},
-  {0x0d, 0x8b},
-  {0x0e, 0xf1},
-  {0x0f, 0x08},
-
-  {0x10, 0x09},
-  {0x11, 0xfd},
-  {0x12, 0xf8},
-  {0x13, 0xe4},
-  {0x14, 0xe5},
-  {0x15, 0x9c},
-  {0x16, 0x9d},
-  {0x17, 0xf0},
-  {0x18, 0xe8},
-  {0x19, 0xe9},
-  {0x1a, 0x8d},
-  {0x1b, 0x8a},
-  {0x1c, 0xed},
-  {0x1d, 0x0d},
-  {0x1e, 0x95},
-  {0x1f, 0x96},
+       {0x01, 0x1b},
+       {0x02, 0xf9},
+       {0x03, 0xfa},
+       {0x04, 0xfb},
+       {0x05, 0xfc},
+       {0x06, 0xf2},
+       {0x07, 0xf3},
+       {0x08, 0xf4},
+       {0x09, 0xf5},
+       {0x0a, 0xf6},
+       {0x0b, 0xf7},
+       {0x0c, 0x8c},
+       {0x0d, 0x8b},
+       {0x0e, 0xf1},
+       {0x0f, 0x08},
+       
+       {0x10, 0x09},
+       {0x11, 0xfd},
+       {0x12, 0xf8},
+       {0x13, 0xe4},
+       {0x14, 0xe5},
+       {0x15, 0x9c},
+       {0x16, 0x9d},
+       {0x17, 0xf0},
+       {0x18, 0xe8},
+       {0x19, 0xe9},
+       {0x1a, 0x8d},
+       {0x1b, 0x8a},
+       {0x1c, 0xed},
+       {0x1d, 0x0d},
+       {0x1e, 0x95},
+       {0x1f, 0x96},
+  
+       {0x20, 0xe6},
+       {0x21, 0xe7},
+       {0x22, 0x9e},
+       {0x23, 0x9f},
+       {0x24, 0xea},
+       {0x25, 0xeb},
+       {0x26, 0x8e},
+       {0x27, 0x99},
+       {0x28, 0x94},
+       {0x29, 0xec},
+       {0x2a, 0x80},
+       {0x2b, 0x81},
+       {0x2c, 0x82},
+       {0x2d, 0x83},
+       {0x2e, 0x84},
+       {0x2f, 0x85},
+       
+       {0x30, 0x86},
+       {0x31, 0x87},
+       {0x32, 0x88},
+       {0x33, 0x97},
+       {0x34, 0xe0},
+       {0x35, 0x20},
+       {0x36, 0x98},
+       {0x37, 0x91},
+       {0x38, 0x99},
+       {0x39, 0xee},
+       {0x3a, 0xe1},
+       {0x3b, 0xe2},
+       {0x3c, 0xe3},
+       {0x3d, 0xef},
+       {0x3e, 0x93},
+       {0x3f, 0x8f},
+
+       {0x40, 0x92}, 
+       
+       {0x42, 0x9a},
+       {0x43, 0x90},
+       {0x44, 0x9b},
+       {0x45, 0x0d},
+       {0x48, 0x12},
+       {0x49, 0x05},
+       {0x4a, 0x0c},
+       {0x4b, 0x7f},
+       {0x4c, 0x11},
+       {0x4d, 0x1e},
+       {0x4e, 0x0b},
+       {0x4f, 0x1d},
+  
+       {0x50, 0x1f},
+       {0x51, 0x1c},
 
+       {0x57, 0x20},
+       {0x58, 0x20},
+       /* Belows is none when shift */
+       {0x5d, 0x101},
+       {0x5e, 0x102},
+       {0x5f, 0x103},
+       {0x60, 0x104},
+       {0x61, 0x105},
+       {0x62, 0x106},
+       {0x63, 0x107},
+       {0x64, 0x108},
+       {0x65, 0x109},
+       {0x66, 0x10a},
+       {0xffff, 0xffff}
 };
+const struct key_tbl_t graph_shift_key[] = {
+       {0x01, 0x1b},
+       {0x02, 0xf9},
+       {0x03, 0xfa},
+       {0x04, 0xfb},
+       {0x05, 0xfc},
+       {0x06, 0xf2},
+       {0x07, 0xf3},
+       {0x08, 0xf4},
+       {0x09, 0xf5},
+       {0x0a, 0xf6},
+       {0x0b, 0xf7},
+       {0x0c, 0x8c},
+       {0x0d, 0x8b},
+       {0x0e, 0xf1},
+       {0x0f, 0x08},
+
+       {0x10, 0x09},
+       {0x11, 0xfd},
+       {0x12, 0xf8},
+       {0x13, 0xe4},
+       {0x14, 0xe5},
+       {0x15, 0x9c},
+       {0x16, 0x9d},
+       {0x17, 0xf0},
+       {0x18, 0xe8},
+       {0x19, 0xe9},
+       {0x1a, 0x8d},
+       {0x1b, 0x8a},
+       {0x1c, 0xed},
+       {0x1d, 0x0d},
+       {0x1e, 0x95},
+       {0x1f, 0x96},
+  
+       {0x20, 0xe6},
+       {0x21, 0xe7},
+       {0x22, 0x9e},
+       {0x23, 0x9f},
+       {0x24, 0xea},
+       {0x25, 0xeb},
+       {0x26, 0x8e},
+       {0x27, 0x99},
+       {0x28, 0x94},
+       {0x29, 0xec},
+       {0x2a, 0x80},
+       {0x2b, 0x81},
+       {0x2c, 0x82},
+       {0x2d, 0x83},
+       {0x2e, 0x84},
+       {0x2f, 0x85},
+  
+       {0x30, 0x86},
+       {0x31, 0x87},
+       {0x32, 0x88},
+       {0x33, 0x97},
+       {0x34, 0xe0},
+       {0x35, 0x20},
+       {0x36, 0x98},
+       {0x37, 0x91},
+       {0x38, 0x99},
+       {0x39, 0xee},
+       {0x3a, 0xe1},
+       {0x3b, 0xe2},
+       {0x3c, 0xe3},
+       {0x3d, 0xef},
+       {0x3e, 0x93},
+       {0x3f, 0x8f},
+
+       {0x40, 0x92}, 
+       
+       {0x42, 0x9a},
+       {0x43, 0x90},
+       {0x44, 0x9b},
+       {0x45, 0x0d},
+       
+       {0x48, 0x12},
+       {0x49, 0x05},
+       {0x4a, 0x0c},
+       {0x4b, 0x7f},
+       {0x4c, 0x11},
+       {0x4d, 0x19},
+       {0x4e, 0x0b},
+       {0x4f, 0x02},
+  
+       {0x50, 0x1a},
+       {0x51, 0x06},
+       
+       {0x57, 0x20},
+       {0x58, 0x20},
+       {0xffff, 0xffff}
+};
+
+const struct key_tbl_t kana_key[] = {
+       {0x01, 0x1b}
+       {0x02, 0xc7},
+       {0x03, 0xcc},
+       {0x04, 0xb1},
+       {0x05, 0xb3},
+       {0x06, 0xb4},
+       {0x07, 0xb5},
+       {0x08, 0xd4},
+       {0x09, 0xd5},
+       {0x0a, 0xd6},
+       {0x0b, 0xdc},
+       {0x0c, 0xce},
+       {0x0d, 0xcd},
+       {0x0e, 0xb0},
+       {0x0f, 0x08},
+       
+       {0x10, 0x09},
+       {0x11, 0xc0},
+       {0x12, 0xc3},
+       {0x13, 0xb2},
+       {0x14, 0xbd},
+       {0x15, 0xb6},
+       {0x16, 0xdd},
+       {0x17, 0xc5},
+       {0x18, 0xc6},
+       {0x19, 0xd7},
+       {0x1a, 0xbe},
+       {0x1b, 0xde},
+       {0x1c, 0xdf},
+       {0x1d, 0x0d},
+       {0x1e, 0xc1},
+       {0x1f, 0xc4},
+       
+       {0x20, 0xbc},
+       {0x21, 0xca},
+       {0x22, 0xb7},
+       {0x23, 0xb8},
+       {0x24, 0xcf},
+       {0x25, 0xc9},
+       {0x26, 0xd8},
+       {0x27, 0xda},
+       {0x28, 0xb9},
+       {0x29, 0xd1},
+       {0x2a, 0xc2},
+       {0x2b, 0xbb},
+       {0x2c, 0xbf},
+       {0x2d, 0xcb},
+       {0x2e, 0xba},
+       {0x2f, 0xd0},
+                 
+       {0x30, 0xd3},
+       {0x31, 0xc8},
+       {0x32, 0xd9},
+       {0x33, 0xd2},
+       {0x34, 0xdb},
+       {0x35, 0x20},
+       {0x36, 0x2a},
+       {0x37, 0x2f},
+       {0x38, 0x2b},
+       {0x39, 0x2d},
+       {0x3a, 0x37},
+       {0x3b, 0x38},
+       {0x3c, 0x39},
+       {0x3d, 0x3d},
+       {0x3e, 0x34},
+       {0x3f, 0x35},
+                 
+       {0x40, 0x36},
+       {0x41, 0x2c},
+       {0x42, 0x31},
+       {0x43, 0x32},
+       {0x44, 0x33},
+       {0x45, 0x0d},
+       {0x46, 0x30},
+       {0x47, 0x2e},
+  
+       {0x48, 0x12},
+       {0x49, 0x05},
+       {0x4a, 0x0c},
+       {0x4b, 0x7f},
+       {0x4c, 0x11},
+       {0x4d, 0x1e},
+       
+       {0x4e, 0x0b},
+       {0x4f, 0x1d},
+       {0x50, 0x1f},
+       {0x51, 0x1c},
+       
+       
+       {0x57, 0x20},
+       {0x58, 0x20},
+       
+       {0x5d, 0x0101},
+       {0x5e, 0x0102},
+       {0x5f, 0x0103},
+       {0x60, 0x0104},
+       {0x61, 0x0105},
+       {0x62, 0x0106},
+       {0x63, 0x0107},
+       {0x64, 0x0108},
+       {0x65, 0x0109},
+       {0x66, 0x010a},
+
+       {0xffff, 0xffff}
+};
+
+const struct key_tbl_t kana_shift_key[] = {
+       {0x01, 0x1b}
+       {0x04, 0xa7},
+       {0x05, 0xa9},
+       {0x06, 0xaa},
+       {0x07, 0xab},
+       {0x08, 0xac},
+       {0x09, 0xad},
+       {0x0a, 0xae},
+       {0x0b, 0xa6},
+       {0x0f, 0x08},
+       
+       {0x10, 0x09},
+       {0x13, 0xa8},
+       {0x1c, 0xa2},
+       {0x1d, 0x0d},
+       
+       {0x29, 0xa3},
+       {0x2a, 0xaf},
+       
+       {0x31, 0xa4},
+       {0x32, 0xa1},
+       {0x33, 0xa5},
+       
+       {0x35, 0x20},
+       {0x36, 0x2a},
+       {0x37, 0x2f},
+       {0x38, 0x2b},
+       {0x39, 0x2d},
+       {0x3a, 0x37},
+       {0x3b, 0x38},
+       {0x3c, 0x39},
+       {0x3d, 0x3d},
+       {0x3e, 0x34},
+       {0x3f, 0x35},
+       
+       {0x40, 0x36},
+       {0x41, 0x2c},
+       {0x42, 0x31},
+       {0x43, 0x32},
+       {0x44, 0x33},
+       {0x45, 0x0d},
+       {0x46, 0x30},
+       {0x47, 0x2e},
+  
+       {0x48, 0x12},
+       {0x49, 0x05},
+       {0x4a, 0x0c},
+       {0x4b, 0x7f},
+       {0x4c, 0x11},
+       {0x4d, 0x19},
+
+       {0x4e, 0x0b},
+       {0x4f, 0x02},
+       {0x50, 0x1a},
+       {0x51, 0x06},
+       
+       {0x57, 0x20},
+       {0x58, 0x20},
+
+       {0xffff, 0xffff}
+};
+
 /*
  * I/O API (subio)
  */
 // 0xd431 : Read
 uint8 KEYBOARD::read_data_reg(void)
 {
-  if(rxrdy->read_signal(0) != 0) {
-    if(!data_fifo->empty()) {
-      datareg = data_fifo->read() & 0xff;
-    }
-    rxrdy->write_signal(0x01, 0x00, 0x01);
-  }
-  return datareg;
+       if(rxrdy->read_signal(0) != 0) {
+               if(!data_fifo->empty()) {
+                       datareg = data_fifo->read() & 0xff;
+               }
+       }
+       if(data_fifo->empty()) {
+               rxrdy->write_signal(0x00, 0x00, 0x01);
+       } else {
+               rxrdy->write_signal(0x00, 0x01, 0x01);
+       }
+       return datareg;
 }
 
 // 0xd432
 uint8 KEYBOARD::read_stat_reg(void)
 {
-  uint8 data = 0x7f;
-  if(rxrdy->read_signal(0x00) != 0) {
-    data |= 0x80;
-  }
-  // Digityze : bit0 = '0' when waiting,
+       uint8 data = 0xff;
+       
+       if(!data_fifo->empty()) {
+               rxrdy->write_signal(0x00, 0x01, 0x01);
+               data &= 0x7f;
+       }
+       if(key_ack->read_signal(0) == 0x00) {
+         data &= 0xfe;
+       }
+       // Digityze : bit0 = '0' when waiting,
+       return data;
 }
 
 // 0xd400(SUB) or 0xfd00(MAIN)
 uint8 KEYBOARD::get_keycode_high(void)
 {
-  uint8 data = 0x00;
-  if((keycode_7 & 0x0100) != 0) data |= 0x01;
-  return data;
+       uint8 data = 0x00;
+       if((keycode_7 & 0x0100) != 0) data |= 0x01;
+       return data;
 }
 
 // 0xd401(SUB) or 0xfd01(MAIN)
 uint8 KEYBOARD::get_keycode_low(void)
 {
-  uint8 data = keycode_7 & 0xff;
-  maincpu->write_signal(SIG_CPU_IRQ, 0, 1);
-  subcpu->write_signal(SIG_CPU_FIRQ, 0, 1);
-  return data;
+       uint8 data = keycode_7 & 0xff;
+       maincpu->write_signal(SIG_CPU_IRQ, 0, 1);
+       subcpu->write_signal(SIG_CPU_FIRQ, 0, 1);
+       return data;
+}
+
+// 0xd40d : R
+void KEYBOARD::turn_on_ins_led(void)
+{
+       ins_led->write_signal(0x00, 0x01, 0x01);
+}
+
+// 0xd40d : W
+void KEYBOARD::turn_off_ins_led(void)
+{
+       ins_led->write_signal(0x00, 0x00, 0x01);
 }
 
 
 
 // UI Handler. 
+uint16 KEYBOARD::vk2scancode(uint32 vk)
+{
+       uint16 i;
+       
+       i = 0;
+       do {
+               if(vk_matrix[i] == vk) return i;
+               i++;
+       } while(vk_matrix[i] != 0xffff);
+       return 0x0000;
+}
+
+bool KEYBOARD::isModifier(uint16 scancode)
+{
+       if(((scancode >= 0x52) && (scancode <= 0x56)) || // CTRL LSHIFT RSHIFT CAPS GRPH
+               (scancode == 0x5a) || (scancode == 0x5c)) { // KANA BREAK
+               return true;
+       }
+       return false;
+}
+
+void KEYBOARD::set_modifiers(uint16 scancode, bool flag)
+{
+       if(scancode == 0x52) { // CTRL
+               ctrl_pressed = flag; 
+       } else if(scancode == 0x53) { // LSHIFT
+               lshift_pressed = flag;
+               if(rshift_pressed) {
+                       shift_pressed = true;
+               } else {
+                       shift_pressed = flag;
+               }
+       } else if(scancode == 0x54) { // RSHIFT
+               rshift_pressed = flag;
+               if(lshift_pressed) {
+                 shift_pressed = true;
+               } else {
+                 shift_pressed = flag;
+               }
+       } else if(scancode == 0x56) { // GRPH
+               graph_pressed = flag;
+       } else if(scancode == 0x55) { // CAPS
+               // Toggle on press.
+               if(flag) {
+                       if(caps_pressed) {
+                               caps_pressed = false;
+                       } else {
+                               caps_pressed = true;
+                       }
+                       if(keymode == KEYMODE_STANDARD) caps_led->write_signal(0x00, caps_pressed ? 0x01 : 0x00, 0x01);
+               }
+       } else if(scancode == 0x5a) { // KANA
+               // Toggle on press.
+               if(flag) {
+                       if(kana_pressed) {
+                               kana_pressed = false;
+                       } else {
+                               kana_pressed = true;
+                       }
+                       if(keymode == KEYMODE_STANDARD) kana_led->write_signal(0x00, kana_pressed ? 0x01 : 0x00, 0x01);
+               }
+       } else if(scancode == 0x5c) { // Break
+               break_pressed = flag;
+       }
+}
+
+uint16 KEYBOARD::scan2fmkeycode(uint16 scancode)
+{
+       struct key_tbl_t *keyptr;
+       uint16 code;
+       bool stdkey = false;
+       int i;
+       uint16 retval;
+       
+       if((scancode == 0) || (scancode >= 0x67)) return 0xffff;
+       // Set repeat flag(s)
+       if(shift_pressed && ctrl_pressed) {
+               switch(scancode) {
+                       case 0x02: // 1
+                       case 0x42: // 1
+                               repeat_mode = true;
+                               //return 0xffff;
+                               break;
+                       case 0x0b: // 0
+                       case 0x46: // 0
+                               repeat_mode = false;
+                               //return 0xffff;
+                               break;
+               }
+       }
+       if(shift_pressed) {
+         // DO super-impose mode:
+         // F7 : PC
+         // F8 : IMPOSE (High brightness)
+         // F9 : IMPOSE (Low brightness)
+         // F10: TV
+       }
+       if(keymode == KEYMODE_SCAN) {
+               retval = scancode;
+               return retval;
+       } else if(keymode == KEYMODE_STANDARD) {
+               if(ctrl_pressed) {
+                       if(shift_pressed) {
+                               keyptr = ctrl_shift_key;
+                       } else {
+                               keyptr = ctrl_key;
+                       }
+               } else if(graphkey_pressed) {
+                       if(shift_pressed) {
+                               keyptr = graph_shift_key;
+                       } else {
+                               keyptr = graph_key;
+                       }
+               } else if(kanakey_pressed) {
+                       if(shift_pressed) {
+                               keyptr = kana_shift_key;
+                       } else {
+                               keyptr = kana_key;
+                       }
+               } else { // Standard
+                       stdkey = true;
+                       if(shift_pressed) {
+                               keyptr = standard_shift_key;
+                       } else {
+                               keyptr = standard_key;
+                       }
+               }
+               if(keyptr == NULL) return 0xffff;
+       } else if(keymode == KEYMODE_16BETA) {
+               return 0xffff;
+       }
+       
+       i = 0;
+       retval = 0xffff;
+       do {
+               if(keyptr[i].phy == scancode) {
+                       retval = keyptr[i].code;
+                       break;
+               }
+               i++;
+       } while(keyptr[i].phy != 0xffff);
+
+       if(stdkey) {
+               if((retval >= 'A') && (retval <= 'Z')) {
+                       if(caps_pressed) {
+                               retval += 0x20;
+                       }
+               } else if((retval >= 'a') && (retval <= 'z')) {
+                       if(caps_pressed) {
+                               retval -= 0x20;
+                       }
+               }
+       }
+       return retval;
+}
+
 void KEYBOARD::key_up(uint32 vk)
 {
-  vk = vk & 0x1ff;
-  if(event_ids[vk] >= 0){
-    cancel_event(this, event_ids[vk]);
-    event_ids[vk] = -1;
-  }
-  if(this->isModifiers(vk)) {
-        set_modifiers(vk, false);
-  }
-  if(isBreakKey(vk)) {
-    break_line->write_signal(0x01, 0, 1);
-    maincpu->write_signal(SIG_CPU_FIRQ, 0, 1);
-  }
-  key_pressed_flag[vk] = false; 
+       uint16 scancode = vk2scancode(vk);
+       bool stat_break = break_pressed;
+       if(event_ids[scancode] >= 0){
+               cancel_event(this, event_ids[scancode]);
+               event_ids[scancode] = -1;
+       }
+       if(this->isModifiers(scancode)) {
+               set_modifiers(scancode, false);
+               if(break_pressed != stat_break) { // Break key UP.
+                       break_line->write_signal(0x00, 0, 1);
+                       maincpu->write_signal(SIG_CPU_FIRQ, 0, 1);
+               }
+       }
+       key_pressed_flag[scancode] = false; 
 }
 
 void KEYBOARD::key_down(uint32 vk)
 {
-  double usec = (double)repeat_time_long * 1000.0;
-  uint32 code_7;
-  vk = vk & 0x1ff;
-  key_pressed_flag[vk] = true;
-  if(!this->isModifiers(vk)) {
-    code_7 = vk2fmkeycode(vk);
-    if(code_7 < 0x200) keycode_7 = code_7;
-    maincpu->write_signal(SIG_CPU_IRQ, 1, 1);
-    subcpu->write_signal(SIG_CPU_FIRQ, 1, 1);
-    if(repeat_mode) register_event(this, ID_KEYBOARD_AUTOREPEAT + vk, usec, false, &event_ids[vk]);
-  } else {
-    set_modifiers(vk, true);
-  }
-  if(isBreakKey(vk)) {
-    break_line->write_signal(0x01, 1, 1);
-    maincpu->write_signal(SIG_CPU_FIRQ, 1, 1);
-  }
+       double usec = (double)repeat_time_long * 1000.0;
+       uint32 code_7;
+       uint16 scancode = vk2scancode(vk);
+       bool stat_break = break_pressed;
+       key_pressed_flag[scancode] = true;
+       
+       code_7 = scan2fmkeycode(scancode);
+       if(code_7 < 0x200) {
+               keycode_7 = code_7;
+               maincpu->write_signal(SIG_CPU_IRQ, 1, 1);
+               subcpu->write_signal(SIG_CPU_FIRQ, 1, 1);
+       }
+       if(this->isModifiers(scancode)) {  // modifiers
+               if(break_pressed != stat_break) { // Break key Down.
+                       break_line->write_signal(0x00, 1, 1);
+                       maincpu->write_signal(SIG_CPU_FIRQ, 1, 1);
+               }
+       }
+       // If repeat && !(PF) && !(BREAK) 
+       if((repeat_mode) && (scancode < 0x5c) && (scancode != 0)) {
+               register_event(this,
+                              ID_KEYBOARD_AUTOREPEAT_FIRST + scancode,
+                              usec, false, &event_ids[scancode]);
+       } else {
+               event_ids[scancode] = -1;
+       }
+       key_pressed_flag[scancode] = true;
+
+}
+
+void KEYBOARD::do_repeatkey(uint16 scancode)
+{
+       uint16 code_7;
+       if((scancode == 0) || (scancode >= 0x67)) return; // scancode overrun.
+       if(!repeat_mode) {
+               if(event_ids[scancode] >= 0) {
+                       cancel_event(this, event_ids[scancode]);
+                       event_ids[scancode] = -1;
+               }
+               return;
+       }
+       key_pressed_flag[scancode] = true;
+       code_7 = scan2fmkeycode(scancode);
+       if(code_7 < 0x200) {
+               keycode_7 = code_7;
+               maincpu->write_signal(SIG_CPU_IRQ, 1, 1);
+               subcpu->write_signal(SIG_CPU_FIRQ, 1, 1);
+       }
+       //if(this->isModifiers(scancode)) {  // modifiers
+         //if(break_pressed != stat_break) { // Break key Down.
+         //            break_line->write_signal(0x00, 1, 1);
+         //            maincpu->write_signal(SIG_CPU_FIRQ, 1, 1);
+         //    }
+       //}
 }
 
 void KEYBOARD::event_callback(int event_id, int err)
 {
-  if((event_id >= ID_KEYBOARD_AUTOREPEAT) && (event_id <= (ID_KEYBOARD_AUTOREPEAT + 0x1ff))){
-      // Key repeat.
-      uint32 vk = event_id - ID_KEYBOARD_AUTOREPEAT;
-      double usec = (double)repeat_time_short * 1000.0;
-      uint16 code_7;
-      key_pressed_flag[vk] = true;
-      if(!this->isModifiers(vk)) {
-       code_7 = vk2fmkeycode(vk);
-       if(code_7 < 0x200) keycode_7 = code_7;
-       maincpu->write_signal(SIG_CPU_IRQ, 1, 1);
-       subcpu->write_signal(SIG_CPU_FIRQ, 1, 1);
-       if(repeat_mode) register_event(this, ID_KEYBOARD_AUTOREPEAT + vk, usec, false, &event_ids[vk]);
-      }
-  }
+       if(event_id == ID_KEYBOARD_RXRDY_OK) {
+               rxrdy->write_signal(0x00, 0x01, 0x01);
+       } else if(event_id == ID_KEYBOARD_RXRDY_BUSY) {
+               rxrdy->write_signal(0x00, 0x00, 0x01);
+       } else if(event_id == ID_KEYBOARD_ACK) {
+               key_ack->write_signal(0x00, 0x01, 0x01);
+       } else if((event_id >= ID_KEYBOARD_AUTOREPEAT_FIRST) && (event_id <= (ID_KEYBOARD_AUTOREPEAT_FIRST + 0x1ff))) {
+               uint32 scancode = event_id - ID_KEYBOARD_AUTOREPEAT_FIRST;
+               double usec = (double)repeat_time_short * 1000.0;
+
+               if((scancode >= 0x67) || (scancode == 0)) return;
+               do_repeatkey((uint16)scancode);
+               register_event(this,
+                              ID_KEYBOARD_AUTOREPEAT + scancode,
+                              usec, true, &event_ids[scancode]);
+               // Key repeat.
+       } else if((event_id >= ID_KEYBOARD_AUTOREPEAT) && (event_id <= (ID_KEYBOARD_AUTOREPEAT + 0x1ff))){
+               uint32 scancode = event_id - ID_KEYBOARD_AUTOREPEAT;
+               do_repeatkey((uint16)scancode);
+       }
 }
 
 // Commands
 void KEYBOARD::reset_keyboard(void)
 {
-  repeat_time_short = 70; // mS
-  repeat_time_long = 700; // mS
-  repeat_on = true;
-  caps_led = false;
-  kana_led = false;
-  ins_led = false;
-  key_code = 0x00;
-
-  lshift = false;
-  rshift = false;
-  ctrl   = false;
-  graph = false;
-  cmd_fifo->clear();
-  data_fifo->clear();
-  datareg = 0x00;
-  rxrdy->write_signal(0x01, 0x00, 0x01);
+       repeat_time_short = 70; // mS
+       repeat_time_long = 700; // mS
+       repeat_mode = true;
+       key_code = 0x00;
+       
+       lshift_pressed = false;
+       rshift_pressed = false;
+       ctrl_pressed   = false;
+       graph_pressed = false;
+       //      ins_pressed = false;
+       cmd_fifo->clear();
+       data_fifo->clear();
+       datareg = 0x00;
+       // Bus
+       rxrdy->write_signal(0x00, 0x00, 0x01);
+       key_ack->write_signal(0x00, 0x01, 0x01);
+       break_line->write_signal(0x00, 0, 1);
+       // leds
+       ins_led->write_signal(0x01, 0x00, 0x01);
+       caps_led->write_signal(0x01, 0x00, 0x01);
+       kana_led->write_signal(0x01, 0x00, 0x01);
 }
   
 void KEYBOARD::set_mode(void)
 {
-  int count = cmd_fifo->count();
-  int cmd;
-  if(count < 2) return;
-  cmd = cmd_fifo->read();
-  key_format = cmd_fifo->read();
-  reset_keyboard();
+       int count = cmd_fifo->count();
+       int cmd;
+       if(count < 2) return;
+       cmd = cmd_fifo->read();
+       key_format = cmd_fifo->read();
+       reset_keyboard();
 }
 
 void KEYBOARD::get_mode(void)
 {
-  int cmd;
-  int dummy;
-  cmd = cmd_fifo->read();
-  if(data_fifo->full()) {
-    dummy = data_fifo->read();
-  }
-  data_fifo->write(key_format);
-  rxrdy->write_signal(0x01, 0x01, 0x01);
+       int cmd;
+       int dummy;
+       cmd = cmd_fifo->read();
+       if(data_fifo->full()) {
+               dummy = data_fifo->read();
+       }
+       data_fifo->write(key_format);
+       rxrdy->write_signal(0x01, 0x01, 0x01);
 }
 
 
-
-  
 void KEYBOARD::write_signal(int id, uint32 data, uint32 mask)
 {
   
-  if(id == SIG_FM7KEY_PUSH_TO_ENCODER) {
-    /*
-     * I refered XM7's sourcecode : VM/keyboard.c act of key-encoder.
-     * Thanks to Ryu.Takegami and PI.
-     */
-    int count;
-    
-    if(cmd_fifo->full()) {
-      cmd_fifo->clear();
-    }
-    if(cmd_fifo->empty()) {
-      cmd_phase = data & 0xff;
-    }
-    
-    cmd_fifo->write(data & 0xff);
-    count = cmd_fifo->count();
-    
-    switch(cmd_phase) {
-    case 0: // Set mode
-      if(count >= 2) set_mode();
-      break;
-    case 1: // Get mode
-      get_mode();
-      break;
-    case 2: // Set LED Phase
-      if(count >= 2) set_leds();
-      break;
-    case 3: // Get LED Phase
-      get_leds();
-      break;
-    case 4:
-      if(count >= 2) set_repeat_type();
-      break;
-    case 5:
-      if(count >= 3) set_repeat_time();
-      break;
-    case 0x80: // Communicate to/from RTC.
-      if(count == 1) {
-       rtc_set = false;
-      }
-      if(count == 2) {
-       if((data & 0xff) == 0) { // Get
-         get_rtc();
-       } else if((data & 0xff) == 1) { // Set
-         rtc_set_flag = true;
-       } else { // Illegal
-         cmd_fifo->clear(); 
-       }
-      }
-      if(rtc_set_flag) {
-       if(count >= 9) {
-         set_rtc();
+       if(id == SIG_FM7KEY_PUSH_TO_ENCODER) {
+               /*
+                * I refered XM7's sourcecode : VM/keyboard.c act of key-encoder.
+                * Thanks to Ryu.Takegami and PI.
+                */
+               int count;
+               if(key_ack->read_signal(0x00) == 0) return; // If (not(ACK)) noop.
+
+               if(cmd_fifo->full()) {
+                       cmd_fifo->clear();
+               }
+               if(cmd_fifo->empty()) {
+                       cmd_phase = data & 0xff;
+               }
+               
+               cmd_fifo->write(data & 0xff);
+               count = cmd_fifo->count();
+               
+               key_ack->write_signal(0x00, 0x00, 0x01);
+               switch(cmd_phase) {
+                       case 0: // Set mode
+                               if(count >= 2) set_mode();
+                               break;
+                       case 1: // Get mode
+                               get_mode();
+                               break;
+                       case 2: // Set LED Phase
+                               if(count >= 2) set_leds();
+                               break;
+                       case 3: // Get LED Phase
+                               get_leds();
+                               break;
+                       case 4:
+                               if(count >= 2) set_repeat_type();
+                               break;
+                       case 5:
+                               if(count >= 3) set_repeat_time();
+                               break;
+                       case 0x80: // Communicate to/from RTC.
+                               if(count == 1) {
+                                       rtc_set = false;
+                               }
+                               if(count == 2) {
+                                       if((data & 0xff) == 0) { // Get
+                                               get_rtc();
+                                       } else if((data & 0xff) == 1) { // Set
+                                               rtc_set_flag = true;
+                                       } else { // Illegal
+                                               cmd_fifo->clear(); 
+                                       }
+                               }
+                               if(rtc_set_flag) {
+                                       if(count >= 9) {
+                                               set_rtc();
+                                       }
+                               }
+                               break;
+                       case 0x81: // Digitize.
+                               if(count >= 2) do_digitize(); // WILL Implement?
+                               break;
+                       case 0x82:
+                               if(count >= 2) set_screen_mode();
+                               break;
+                       case 0x83:
+                               get_screen_mode();
+                               break;
+                       case 0x84:
+                               if(count >= 2) set_brightness();
+                               break;
+                       default:
+                               //cmd_fifo->clear();
+                               break;
+               }
+               register_event(this, ID_KEYBOARD_ACK, 5, false, NULL); // Delay 5us until ACK is up.
        }
-      }
-      break;
-    case 0x81: // Digitize.
-      if(count >= 2) do_digitize(); // WILL Implement?
-      break;
-    case 0x82:
-      if(count >= 2) set_screen_mode();
-      break;
-    case 0x83:
-      get_screen_mode();
-      break;
-    case 0x84:
-      if(count >= 2) set_brightness();
-      break;
-    default:
-      cmd_fifo->clear();
-      break;
-    }
-  }
 }