Clear BIOS keyboard queue before pressing shift, add unknown key
[jpcrr.git] / scripts / translate-raw-input-to-keycodes
blob5b99c940d04fc22c242eb2fe8fde546f19b2b987
1 #!/usr/bin/env lua
3 demappings = {};
5 for k, v in ipairs(arg) do
6         demap = string.match(v, "ignore=([0-9]+)");
7         if demap then
8                 demap = tonumber(demap);
9                 if not demap then
10                         error("Bad ignore");
11                 end
12                 table.insert(demappings, demap);
13         end
14 end
16 add_keyboard_map_entry = function(keynum, raw, shifted)
17         if type(raw) == "string" then
18                 raw = string.byte(raw);
19         end
20         if type(shifted) == "string" then
21                 shifted = string.byte(shifted);
22         end
23         if raw then
24                 keyboard_map[raw] = {keynum, keynum};
25                 keyboard_map[raw + 128] = {56, keynum, keynum, 56};
26                 if raw >= 64 and raw <= 95 then
27                         keyboard_map[raw - 64] = {29, keynum, keynum, 29};
28                         keyboard_map[raw + 64] = {56, 29, keynum, keynum, 29, 56};
29                 end
30         end
31         if shifted then
32                 keyboard_map[shifted] = {54, keynum, keynum, 54};
33                 keyboard_map[shifted + 128] = {56, 54, keynum, keynum, 54, 56};
34                 if shifted >= 64 and shifted <= 95 then
35                         keyboard_map[shifted - 64] = {29, 54, keynum, keynum, 54, 29};
36                         keyboard_map[shifted + 64] = {56, 54, 29, keynum, keynum, 29, 54, 56};
37                 end
38         end
39 end
41 -- Specials.
42 special_keys = {};
43 special_keys["1"] = {2, 2};
44 special_keys["2"] = {3, 3};
45 special_keys["3"] = {4, 4};
46 special_keys["4"] = {5, 5};
47 special_keys["5"] = {6, 6};
48 special_keys["6"] = {7, 7};
49 special_keys["7"] = {8, 8};
50 special_keys["8"] = {9, 9};
51 special_keys["9"] = {10, 10};
52 special_keys["0"] = {11, 11};
53 special_keys["A"] = {63, 63};
54 special_keys["B"] = {66, 66};
55 special_keys["C"] = {15, 15};
56 special_keys["n"] = {28, 28};
57 special_keys["D"] = {95, 95};
60 -- Keyboard mapping table
61 keyboard_map = {};
62 add_keyboard_map_entry(1);                              -- ESCAPE
63 add_keyboard_map_entry(2, nil, "!");
64 add_keyboard_map_entry(3, nil, "@");
65 add_keyboard_map_entry(4, nil, "#");
66 add_keyboard_map_entry(5, nil, "$");
67 add_keyboard_map_entry(6, nil, "%");
68 add_keyboard_map_entry(7, nil, "^");
69 add_keyboard_map_entry(8, nil, "&");
70 add_keyboard_map_entry(9, nil, "*");
71 add_keyboard_map_entry(10, nil, "(");
72 add_keyboard_map_entry(11, nil, ")");
73 add_keyboard_map_entry(12, "-", "_");
74 add_keyboard_map_entry(13, "=", "+");
75 add_keyboard_map_entry(14);                             -- BACKSPACE
76 add_keyboard_map_entry(15);                             -- TABULATOR
77 add_keyboard_map_entry(16, "q", "Q");
78 add_keyboard_map_entry(17, "w", "W");
79 add_keyboard_map_entry(18, "e", "E");
80 add_keyboard_map_entry(19, "r", "R");
81 add_keyboard_map_entry(20, "t", "T");
82 add_keyboard_map_entry(21, "y", "Y");
83 add_keyboard_map_entry(22, "u", "U");
84 add_keyboard_map_entry(23, "i", "I");
85 add_keyboard_map_entry(24, "o", "O");
86 add_keyboard_map_entry(25, "p", "P");
87 add_keyboard_map_entry(26, "[", "{");
88 add_keyboard_map_entry(27, "]", "}");
89 add_keyboard_map_entry(28);                             -- ENTER
90 add_keyboard_map_entry(29);                             -- Left CONTROL
91 add_keyboard_map_entry(30, "a", "A");
92 add_keyboard_map_entry(31, "s", "S");
93 add_keyboard_map_entry(32, "d", "D");
94 add_keyboard_map_entry(33, "f", "F");
95 add_keyboard_map_entry(34, "g", "G");
96 add_keyboard_map_entry(35, "h", "H");
97 add_keyboard_map_entry(36, "j", "J");
98 add_keyboard_map_entry(37, "k", "K");
99 add_keyboard_map_entry(38, "l", "L");
100 add_keyboard_map_entry(39, ";", ":");
101 add_keyboard_map_entry(40, "'", "\"");
102 add_keyboard_map_entry(41, "`", "~");
103 add_keyboard_map_entry(42);                             -- LEFT SHIFT
104 add_keyboard_map_entry(43, "\\", "|");
105 add_keyboard_map_entry(44, "z", "Z");
106 add_keyboard_map_entry(45, "x", "X");
107 add_keyboard_map_entry(46, "c", "C");
108 add_keyboard_map_entry(47, "v", "V");
109 add_keyboard_map_entry(48, "b", "B");
110 add_keyboard_map_entry(49, "n", "N");
111 add_keyboard_map_entry(50, "m", "M");
112 add_keyboard_map_entry(51, ",", "<");
113 add_keyboard_map_entry(52, ".", ">");
114 add_keyboard_map_entry(53, "/", "?");
115 add_keyboard_map_entry(54);                             -- RIGHT SHIFT
116 add_keyboard_map_entry(55);                             -- KEYPAD MULTIPLY
117 add_keyboard_map_entry(56);                             -- LEFT ALT
118 add_keyboard_map_entry(57, " ");
119 add_keyboard_map_entry(58);                             -- CAPS LOCK
120 add_keyboard_map_entry(59);                             -- F1
121 add_keyboard_map_entry(60);                             -- F2
122 add_keyboard_map_entry(61);                             -- F3
123 add_keyboard_map_entry(62);                             -- F4
124 add_keyboard_map_entry(63);                             -- F5
125 add_keyboard_map_entry(64);                             -- F6
126 add_keyboard_map_entry(65);                             -- F7
127 add_keyboard_map_entry(66);                             -- F8
128 add_keyboard_map_entry(67);                             -- F9
129 add_keyboard_map_entry(68);                             -- F10
130 add_keyboard_map_entry(69);                             -- NUM LOCK
131 add_keyboard_map_entry(70);                             -- SCROLL LOCK
132 add_keyboard_map_entry(71, "7");
133 add_keyboard_map_entry(72, "8");
134 add_keyboard_map_entry(73, "9");
135 add_keyboard_map_entry(74);                             -- KEYPAD MINUS
136 add_keyboard_map_entry(75, "4");
137 add_keyboard_map_entry(76, "5");
138 add_keyboard_map_entry(77, "6");
139 add_keyboard_map_entry(78);                             -- KEYPAD PLUS
140 add_keyboard_map_entry(79, "1");
141 add_keyboard_map_entry(80, "2");
142 add_keyboard_map_entry(81, "3");
143 add_keyboard_map_entry(82, "0");
144 add_keyboard_map_entry(83);                             -- KEYPAD DECIMAL SIGN
145 add_keyboard_map_entry(84);                             -- RESERVED BY EMULATOR
146 add_keyboard_map_entry(85);                             -- UNKNOWN
147 add_keyboard_map_entry(86);                             -- UNKNOWN
148 add_keyboard_map_entry(87);                             -- F11
149 add_keyboard_map_entry(88);                             -- F12
150 add_keyboard_map_entry(89);                             -- UNKNOWN
151 add_keyboard_map_entry(90);                             -- UNKNOWN
152 add_keyboard_map_entry(91);                             -- UNKNOWN
153 add_keyboard_map_entry(92);                             -- UNKNOWN
154 add_keyboard_map_entry(93);                             -- UNKNOWN
155 add_keyboard_map_entry(94);                             -- UNKNOWN
156 add_keyboard_map_entry(95);                             -- UNKNOWN
158 -- Ignore ENTER.
159 keyboard_map[0x0A] = {};
161 -- Demap unwanted keys.
162 for k, v in ipairs(demappings) do
163         keyboard_map[v] = {};
166 write = function(tab)
167         local k, v;
168         for k, v in ipairs(tab) do
169                 print(v);
170         end
173 special_escape = false;
174 while true do
175         charo = io.stdin:read(1);
176         if special_escape then
177                 if charo == "\\" then
178                         -- Handle as ordinary.
179                         char = string.byte(charo);
180                         if not keyboard_map[char] then
181                                 error(string.format("Unknown character 0x%02X (not found in keyboard map)", char));
182                         end
183                         write(keyboard_map[char]);
184                 elseif special_keys[charo] then
185                         write(special_keys[charo]);
186                 else
187                         error("Bad special '" .. charo .. "'");
188                 end
189                 special_escape = false;
190         elseif charo == "\\" then
191                 special_escape = true;
192         else
193                 if not charo then
194                         break;
195                 end
196                 char = string.byte(charo);
197                 if not keyboard_map[char] then
198                         error(string.format("Unknown character 0x%02X (not found in keyboard map)", char));
199                 end
200                 write(keyboard_map[char]);
201         end