5 for k, v in ipairs(arg) do
6 demap = string.match(v, "ignore=([0-9]+)");
8 demap = tonumber(demap);
12 table.insert(demappings, demap);
16 add_keyboard_map_entry = function(keynum, raw, shifted)
17 if type(raw) == "string" then
18 raw = string.byte(raw);
20 if type(shifted) == "string" then
21 shifted = string.byte(shifted);
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};
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};
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
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
159 keyboard_map[0x0A] = {};
161 -- Demap unwanted keys.
162 for k, v in ipairs(demappings) do
163 keyboard_map[v] = {};
166 write = function(tab)
168 for k, v in ipairs(tab) do
173 special_escape = false;
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));
183 write(keyboard_map[char]);
184 elseif special_keys[charo] then
185 write(special_keys[charo]);
187 error("Bad special '" .. charo .. "'");
189 special_escape = false;
190 elseif charo == "\\" then
191 special_escape = true;
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));
200 write(keyboard_map[char]);