1 // PC keyboard interface constants
3 #define KBSTATP 0x64 // kbd controller status port(I)
4 #define KBS_DIB 0x01 // kbd data in buffer
5 #define KBDATAP 0x60 // kbd data port(I)
13 #define CAPSLOCK (1<<3)
14 #define NUMLOCK (1<<4)
15 #define SCROLLLOCK (1<<5)
31 // C('A') == Control-A
32 #define C(x) (x - '@')
34 static uchar shiftcode
[256] =
44 static uchar togglecode
[256] =
51 static uchar normalmap
[256] =
53 NO
, 0x1B, '1', '2', '3', '4', '5', '6', // 0x00
54 '7', '8', '9', '0', '-', '=', '\b', '\t',
55 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', // 0x10
56 'o', 'p', '[', ']', '\n', NO
, 'a', 's',
57 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', // 0x20
58 '\'', '`', NO
, '\\', 'z', 'x', 'c', 'v',
59 'b', 'n', 'm', ',', '.', '/', NO
, '*', // 0x30
60 NO
, ' ', NO
, NO
, NO
, NO
, NO
, NO
,
61 NO
, NO
, NO
, NO
, NO
, NO
, NO
, '7', // 0x40
62 '8', '9', '-', '4', '5', '6', '+', '1',
63 '2', '3', '0', '.', NO
, NO
, NO
, NO
, // 0x50
64 [0x9C] '\n', // KP_Enter
66 [0xC8] KEY_UP
, [0xD0] KEY_DN
,
67 [0xC9] KEY_PGUP
, [0xD1] KEY_PGDN
,
68 [0xCB] KEY_LF
, [0xCD] KEY_RT
,
69 [0x97] KEY_HOME
, [0xCF] KEY_END
,
70 [0xD2] KEY_INS
, [0xD3] KEY_DEL
73 static uchar shiftmap
[256] =
75 NO
, 033, '!', '@', '#', '$', '%', '^', // 0x00
76 '&', '*', '(', ')', '_', '+', '\b', '\t',
77 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', // 0x10
78 'O', 'P', '{', '}', '\n', NO
, 'A', 'S',
79 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', // 0x20
80 '"', '~', NO
, '|', 'Z', 'X', 'C', 'V',
81 'B', 'N', 'M', '<', '>', '?', NO
, '*', // 0x30
82 NO
, ' ', NO
, NO
, NO
, NO
, NO
, NO
,
83 NO
, NO
, NO
, NO
, NO
, NO
, NO
, '7', // 0x40
84 '8', '9', '-', '4', '5', '6', '+', '1',
85 '2', '3', '0', '.', NO
, NO
, NO
, NO
, // 0x50
86 [0x9C] '\n', // KP_Enter
88 [0xC8] KEY_UP
, [0xD0] KEY_DN
,
89 [0xC9] KEY_PGUP
, [0xD1] KEY_PGDN
,
90 [0xCB] KEY_LF
, [0xCD] KEY_RT
,
91 [0x97] KEY_HOME
, [0xCF] KEY_END
,
92 [0xD2] KEY_INS
, [0xD3] KEY_DEL
95 static uchar ctlmap
[256] =
97 NO
, NO
, NO
, NO
, NO
, NO
, NO
, NO
,
98 NO
, NO
, NO
, NO
, NO
, NO
, NO
, NO
,
99 C('Q'), C('W'), C('E'), C('R'), C('T'), C('Y'), C('U'), C('I'),
100 C('O'), C('P'), NO
, NO
, '\r', NO
, C('A'), C('S'),
101 C('D'), C('F'), C('G'), C('H'), C('J'), C('K'), C('L'), NO
,
102 NO
, NO
, NO
, C('\\'), C('Z'), C('X'), C('C'), C('V'),
103 C('B'), C('N'), C('M'), NO
, NO
, C('/'), NO
, NO
,
104 [0x9C] '\r', // KP_Enter
105 [0xB5] C('/'), // KP_Div
106 [0xC8] KEY_UP
, [0xD0] KEY_DN
,
107 [0xC9] KEY_PGUP
, [0xD1] KEY_PGDN
,
108 [0xCB] KEY_LF
, [0xCD] KEY_RT
,
109 [0x97] KEY_HOME
, [0xCF] KEY_END
,
110 [0xD2] KEY_INS
, [0xD3] KEY_DEL