1
2
3 #define KBSTATP 0x64
4 #define KBS_DIB 0x01
5 #define KBDATAP 0x60
6
7 #define NO 0
8
9 #define SHIFT (1<<0)
10 #define CTL (1<<1)
11 #define ALT (1<<2)
12
13 #define CAPSLOCK (1<<3)
14 #define NUMLOCK (1<<4)
15 #define SCROLLLOCK (1<<5)
16
17 #define E0ESC (1<<6)
18
19
20 #define KEY_HOME 0xE0
21 #define KEY_END 0xE1
22 #define KEY_UP 0xE2
23 #define KEY_DN 0xE3
24 #define KEY_LF 0xE4
25 #define KEY_RT 0xE5
26 #define KEY_PGUP 0xE6
27 #define KEY_PGDN 0xE7
28 #define KEY_INS 0xE8
29 #define KEY_DEL 0xE9
30
31
32 #define C(x) (x - '@')
33
34 static uchar shiftcode[256] =
35 {
36 [0x1D] CTL,
37 [0x2A] SHIFT,
38 [0x36] SHIFT,
39 [0x38] ALT,
40 [0x9D] CTL,
41 [0xB8] ALT
42 };
43
44 static uchar togglecode[256] =
45 {
46 [0x3A] CAPSLOCK,
47 [0x45] NUMLOCK,
48 [0x46] SCROLLLOCK
49 };
50
51 static uchar normalmap[256] =
52 {
53 NO, 0x1B, '1', '2', '3', '4', '5', '6',
54 '7', '8', '9', '0', '-', '=', '\b', '\t',
55 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i',
56 'o', 'p', '[', ']', '\n', NO, 'a', 's',
57 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';',
58 '\'', '`', NO, '\\', 'z', 'x', 'c', 'v',
59 'b', 'n', 'm', ',', '.', '/', NO, '*',
60 NO, ' ', NO, NO, NO, NO, NO, NO,
61 NO, NO, NO, NO, NO, NO, NO, '7',
62 '8', '9', '-', '4', '5', '6', '+', '1',
63 '2', '3', '0', '.', NO, NO, NO, NO,
64 [0x9C] '\n',
65 [0xB5] '/',
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
71 };
72
73 static uchar shiftmap[256] =
74 {
75 NO, 033, '!', '@', '#', '$', '%', '^',
76 '&', '*', '(', ')', '_', '+', '\b', '\t',
77 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I',
78 'O', 'P', '{', '}', '\n', NO, 'A', 'S',
79 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':',
80 '"', '~', NO, '|', 'Z', 'X', 'C', 'V',
81 'B', 'N', 'M', '<', '>', '?', NO, '*',
82 NO, ' ', NO, NO, NO, NO, NO, NO,
83 NO, NO, NO, NO, NO, NO, NO, '7',
84 '8', '9', '-', '4', '5', '6', '+', '1',
85 '2', '3', '0', '.', NO, NO, NO, NO,
86 [0x9C] '\n',
87 [0xB5] '/',
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
93 };
94
95 static uchar ctlmap[256] =
96 {
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',
105 [0xB5] C('/'),
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
111 };
112