1/*	$NetBSD: kbd_tables.c,v 1.9 2005/12/11 12:23:56 christos Exp $	*/
2
3/*
4 * Copyright (c) 1996 Gordon W. Ross
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28/*
29 * Keyboard translation tables.  (See kbd_tables.h)
30 */
31
32#include <sys/cdefs.h>
33__KERNEL_RCSID(0, "$NetBSD: kbd_tables.c,v 1.9 2005/12/11 12:23:56 christos Exp $");
34
35#include <sys/types.h>
36
37#define	_KERNEL 1	/* XXX */
38#include "kbd_tables.h"
39
40
41/* The "compose" operations are not implemented. */
42#define	KEYSYM_COMPOSE KEYSYM_NOP
43
44
45/*
46 * Key release codes are decoded in this map.
47 */
48u_short keymap_release[KEYMAP_SIZE] = {
49    /*   0:             */	KEYSYM_HOLE,
50    /*   1: L1/Stop     */	KEYSYM_NOP,
51    /*   2:             */	KEYSYM_HOLE,
52    /*   3: L2/Again    */	KEYSYM_NOP,
53    /*   4:             */	KEYSYM_HOLE,
54    /*   5: F1          */	KEYSYM_NOP,
55    /*   6: F2          */	KEYSYM_NOP,
56    /*   7: F10         */	KEYSYM_NOP,
57    /*   8: F3          */	KEYSYM_NOP,
58    /*   9: F11         */	KEYSYM_NOP,
59    /*  10: F4          */	KEYSYM_NOP,
60    /*  11: F12         */	KEYSYM_NOP,
61    /*  12: F5          */	KEYSYM_NOP,
62    /*  13: AltGraph    */	KEYSYM_CLRMOD | KBMOD_ALTGRAPH,
63    /*  14: F6          */	KEYSYM_NOP,
64    /*  15:             */	KEYSYM_HOLE,
65    /*  16: F7          */	KEYSYM_NOP,
66    /*  17: F8          */	KEYSYM_NOP,
67    /*  18: F9          */	KEYSYM_NOP,
68    /*  19: Alt_L       */	KEYSYM_CLRMOD | KBMOD_ALT_L,
69    /*  20: T5_Up       */	KEYSYM_NOP,
70    /*  21: R1/Pause    */	KEYSYM_NOP,
71    /*  22: R2/Print    */	KEYSYM_NOP,
72    /*  23: R3/Break    */	KEYSYM_NOP,
73    /*  24: T5_Left     */	KEYSYM_NOP,
74    /*  25: L3/Props    */	KEYSYM_NOP,
75    /*  26: L4/Undo     */	KEYSYM_NOP,
76    /*  27: T5_Down     */	KEYSYM_NOP,
77    /*  28: T5_Right    */	KEYSYM_NOP,
78    /*  29: Esc         */	KEYSYM_NOP,
79    /*  30: 1           */	KEYSYM_NOP,
80    /*  31: 2           */	KEYSYM_NOP,
81    /*  32: 3           */	KEYSYM_NOP,
82    /*  33: 4           */	KEYSYM_NOP,
83    /*  34: 5           */	KEYSYM_NOP,
84    /*  35: 6           */	KEYSYM_NOP,
85    /*  36: 7           */	KEYSYM_NOP,
86    /*  37: 8           */	KEYSYM_NOP,
87    /*  38: 9           */	KEYSYM_NOP,
88    /*  39: 0           */	KEYSYM_NOP,
89    /*  40: minus       */	KEYSYM_NOP,
90    /*  41: equal       */	KEYSYM_NOP,
91    /*  42: grave/tilde */	KEYSYM_NOP,
92    /*  43: BackSpace   */	KEYSYM_NOP,
93    /*  44: T5_Insert   */	KEYSYM_NOP,
94    /*  45: R4/KP_Equal */	KEYSYM_NOP,
95    /*  46: R5/KP_Div   */	KEYSYM_NOP,
96    /*  47: R6/KP_Mult  */	KEYSYM_NOP,
97    /*  48:             */	KEYSYM_NOP,
98    /*  49: L5/Front    */	KEYSYM_NOP,
99    /*  50: KP_Delete   */	KEYSYM_NOP,
100    /*  51: L6/Copy     */	KEYSYM_NOP,
101    /*  52: T5_Home     */	KEYSYM_NOP,
102    /*  53: Tab         */	KEYSYM_NOP,
103    /*  54: Q           */	KEYSYM_NOP,
104    /*  55: W           */	KEYSYM_NOP,
105    /*  56: E           */	KEYSYM_NOP,
106    /*  57: R           */	KEYSYM_NOP,
107    /*  58: T           */	KEYSYM_NOP,
108    /*  59: Y           */	KEYSYM_NOP,
109    /*  60: U           */	KEYSYM_NOP,
110    /*  61: I           */	KEYSYM_NOP,
111    /*  62: O           */	KEYSYM_NOP,
112    /*  63: P           */	KEYSYM_NOP,
113    /*  64: [           */	KEYSYM_NOP,
114    /*  65: ]           */	KEYSYM_NOP,
115    /*  66: Delete      */	KEYSYM_NOP,
116    /*  67: Compose     */	KEYSYM_NOP,
117    /*  68: R7/Home     */	KEYSYM_NOP,
118    /*  69: R8/Up       */	KEYSYM_NOP,
119    /*  70: R9/PgUp     */	KEYSYM_NOP,
120    /*  71: KP_Minus    */	KEYSYM_NOP,
121    /*  72: L7/Open     */	KEYSYM_NOP,
122    /*  73: L8/Paste    */	KEYSYM_NOP,
123    /*  74: T5_End      */	KEYSYM_NOP,
124    /*  75:             */	KEYSYM_HOLE,
125    /*  76: Ctrl_L      */	KEYSYM_CLRMOD | KBMOD_CTRL_L,
126    /*  77: A           */	KEYSYM_NOP,
127    /*  78: S           */	KEYSYM_NOP,
128    /*  79: D           */	KEYSYM_NOP,
129    /*  80: F           */	KEYSYM_NOP,
130    /*  81: G           */	KEYSYM_NOP,
131    /*  82: H           */	KEYSYM_NOP,
132    /*  83: J           */	KEYSYM_NOP,
133    /*  84: K           */	KEYSYM_NOP,
134    /*  85: L           */	KEYSYM_NOP,
135    /*  86: ;           */	KEYSYM_NOP,
136    /*  87: apostr.     */	KEYSYM_NOP,
137    /*  88: backslash   */	KEYSYM_NOP,
138    /*  89: Return      */	KEYSYM_NOP,
139    /*  90: KP_Enter    */	KEYSYM_NOP,
140    /*  91: R10/Left    */	KEYSYM_NOP,
141    /*  92: R11/KP_5    */	KEYSYM_NOP,
142    /*  93: R12/Right   */	KEYSYM_NOP,
143    /*  94: KP_Insert   */	KEYSYM_NOP,
144    /*  95: L9/Find     */	KEYSYM_NOP,
145    /*  96: T5_PgUp     */	KEYSYM_NOP,
146    /*  97: L10/Cut     */	KEYSYM_NOP,
147    /*  98: Num_Lock    */	KEYSYM_NOP,
148    /*  99: Shift_L     */	KEYSYM_CLRMOD | KBMOD_SHIFT_L,
149    /* 100: Z           */	KEYSYM_NOP,
150    /* 101: X           */	KEYSYM_NOP,
151    /* 102: C           */	KEYSYM_NOP,
152    /* 103: V           */	KEYSYM_NOP,
153    /* 104: B           */	KEYSYM_NOP,
154    /* 105: N           */	KEYSYM_NOP,
155    /* 106: M           */	KEYSYM_NOP,
156    /* 107: ,           */	KEYSYM_NOP,
157    /* 108: .           */	KEYSYM_NOP,
158    /* 109: /           */	KEYSYM_NOP,
159    /* 110: Shift_R     */	KEYSYM_CLRMOD | KBMOD_SHIFT_R,
160    /* 111: Linefeed    */	KEYSYM_NOP,
161    /* 112: R13/End     */	KEYSYM_NOP,
162    /* 113: R14/Down    */	KEYSYM_NOP,
163    /* 114: R15/PgDn    */	KEYSYM_NOP,
164    /* 115:             */	KEYSYM_HOLE,
165    /* 116:             */	KEYSYM_HOLE,
166    /* 117:             */	KEYSYM_HOLE,
167    /* 118: L16/Help    */	KEYSYM_NOP,
168    /* 119: CapsLock    */	KEYSYM_NOP,
169    /* 120: Meta_L      */	KEYSYM_CLRMOD | KBMOD_META_L,
170    /* 121: SpaceBar    */	KEYSYM_NOP,
171    /* 122: Meta_R      */	KEYSYM_CLRMOD | KBMOD_META_R,
172    /* 123: T5_PgDn     */	KEYSYM_NOP,
173    /* 124:             */	KEYSYM_HOLE,
174    /* 125: KP_Add      */	KEYSYM_NOP,
175    /* 126:             */	KEYSYM_LAYOUT,	/* layout next */
176    /* 127:             */	KEYSYM_RESET,	/* kbd ID next */
177};
178
179
180/*
181 * This map is used when a control key is down.
182 */
183#define	CTL(c)	((c)&0x1F)
184u_short keymap_control[KEYMAP_SIZE] = {
185    /*   0:             */	KEYSYM_HOLE,
186    /*   1: L1/Stop     */	KEYSYM_NOP,
187    /*   2:             */	KEYSYM_HOLE,
188    /*   3: L2/Again    */	KEYSYM_NOP,
189    /*   4:             */	KEYSYM_HOLE,
190    /*   5: F1          */	KEYSYM_NOP,
191    /*   6: F2          */	KEYSYM_NOP,
192    /*   7: F10         */	KEYSYM_NOP,
193    /*   8: F3          */	KEYSYM_NOP,
194    /*   9: F11         */	KEYSYM_NOP,
195    /*  10: F4          */	KEYSYM_NOP,
196    /*  11: F12         */	KEYSYM_NOP,
197    /*  12: F5          */	KEYSYM_NOP,
198    /*  13: AltGraph    */	KEYSYM_SETMOD | KBMOD_ALTGRAPH,
199    /*  14: F6          */	KEYSYM_NOP,
200    /*  15:             */	KEYSYM_HOLE,
201    /*  16: F7          */	KEYSYM_NOP,
202    /*  17: F8          */	KEYSYM_NOP,
203    /*  18: F9          */	KEYSYM_NOP,
204    /*  19: Alt_L       */	KEYSYM_SETMOD | KBMOD_ALT_L,
205    /*  20: T5_Up       */	KEYSYM_NOP,
206    /*  21: R1/Pause    */	KEYSYM_NOP,
207    /*  22: R2/Print    */	KEYSYM_NOP,
208    /*  23: R3/Break    */	KEYSYM_NOP,
209    /*  24: T5_Left     */	KEYSYM_NOP,
210    /*  25: L3/Props    */	KEYSYM_NOP,
211    /*  26: L4/Undo     */	KEYSYM_NOP,
212    /*  27: T5_Down     */	KEYSYM_NOP,
213    /*  28: T5_Right    */	KEYSYM_NOP,
214    /*  29: Esc         */	0x1b,
215    /*  30: 1           */	KEYSYM_NOP,
216    /*  31: 2           */	CTL('@'),
217    /*  32: 3           */	KEYSYM_NOP,
218    /*  33: 4           */	KEYSYM_NOP,
219    /*  34: 5           */	KEYSYM_NOP,
220    /*  35: 6           */	CTL('^'),
221    /*  36: 7           */	KEYSYM_NOP,
222    /*  37: 8           */	KEYSYM_NOP,
223    /*  38: 9           */	KEYSYM_NOP,
224    /*  39: 0           */	KEYSYM_NOP,
225    /*  40: minus _     */	CTL('_'),
226    /*  41: equal       */	KEYSYM_NOP,
227    /*  42: grave/tilde */	CTL('~'),
228    /*  43: BackSpace   */	'\b',
229    /*  44: T5_Insert   */	KEYSYM_NOP,
230    /*  45: R4/KP_Equal */	KEYSYM_NOP,
231    /*  46: R5/KP_Div   */	KEYSYM_NOP,
232    /*  47: R6/KP_Mult  */	KEYSYM_NOP,
233    /*  48:             */	KEYSYM_NOP,
234    /*  49: L5/Front    */	KEYSYM_NOP,
235    /*  50: KP_Delete   */	KEYSYM_NOP,
236    /*  51: L6/Copy     */	KEYSYM_NOP,
237    /*  52: T5_Home     */	KEYSYM_NOP,
238    /*  53: Tab         */	'\t',
239    /*  54: Q           */	CTL('Q'),
240    /*  55: W           */	CTL('W'),
241    /*  56: E           */	CTL('E'),
242    /*  57: R           */	CTL('R'),
243    /*  58: T           */	CTL('T'),
244    /*  59: Y           */	CTL('Y'),
245    /*  60: U           */	CTL('U'),
246    /*  61: I           */	CTL('I'),
247    /*  62: O           */	CTL('O'),
248    /*  63: P           */	CTL('P'),
249    /*  64: [           */	CTL('['),
250    /*  65: ]           */	CTL(']'),
251    /*  66: Delete      */	0x7f,
252    /*  67: Compose     */	KEYSYM_COMPOSE,
253    /*  68: R7/Home     */	CTL('A'),	/* emacs */
254    /*  69: R8/Up       */	CTL('P'),	/* emacs */
255    /*  70: R9/PgUp     */	0x80|'v',	/* emacs */
256    /*  71: KP_Minus    */	KEYSYM_NOP,
257    /*  72: L7/Open     */	KEYSYM_NOP,
258    /*  73: L8/Paste    */	KEYSYM_NOP,
259    /*  74: T5_End      */	KEYSYM_NOP,
260    /*  75:             */	KEYSYM_HOLE,
261    /*  76: Ctrl_L      */	KEYSYM_SETMOD | KBMOD_CTRL_L,
262    /*  77: A           */	CTL('A'),
263    /*  78: S           */	CTL('S'),
264    /*  79: D           */	CTL('D'),
265    /*  80: F           */	CTL('F'),
266    /*  81: G           */	CTL('G'),
267    /*  82: H           */	CTL('H'),
268    /*  83: J           */	CTL('J'),
269    /*  84: K           */	CTL('K'),
270    /*  85: L           */	CTL('L'),
271    /*  86: ;           */	KEYSYM_NOP,
272    /*  87: apostr.     */	KEYSYM_NOP,
273    /*  88: backslash   */	CTL('\\'),
274    /*  89: Return      */	'\r',
275    /*  90: KP_Enter    */	KEYSYM_NOP,
276    /*  91: R10/Left    */	CTL('B'),	/* emacs */
277    /*  92: R11/KP_5    */	KEYSYM_NOP,
278    /*  93: R12/Right   */	CTL('F'),	/* emacs */
279    /*  94: KP_Insert   */	KEYSYM_NOP,
280    /*  95: L9/Find     */	KEYSYM_NOP,
281    /*  96: T5_PgUp     */	KEYSYM_NOP,
282    /*  97: L10/Cut     */	KEYSYM_NOP,
283    /*  98: Num_Lock    */	KEYSYM_INVMOD | KBMOD_NUMLOCK,
284    /*  99: Shift_L     */	KEYSYM_SETMOD | KBMOD_SHIFT_L,
285    /* 100: Z           */	CTL('Z'),
286    /* 101: X           */	CTL('X'),
287    /* 102: C           */	CTL('C'),
288    /* 103: V           */	CTL('V'),
289    /* 104: B           */	CTL('B'),
290    /* 105: N           */	CTL('N'),
291    /* 106: M           */	CTL('M'),
292    /* 107: ,           */	KEYSYM_NOP,
293    /* 108: .           */	KEYSYM_NOP,
294    /* 109: / ?         */	CTL('?'),
295    /* 110: Shift_R     */	KEYSYM_SETMOD | KBMOD_SHIFT_R,
296    /* 111: Linefeed    */	'\n',
297    /* 112: R13/End     */	CTL('E'),	/* emacs */
298    /* 113: R14/Down    */	CTL('N'),	/* emacs */
299    /* 114: R15/PgDn    */	CTL('V'),	/* emacs */
300    /* 115:             */	KEYSYM_HOLE,
301    /* 116:             */	KEYSYM_HOLE,
302    /* 117:             */	KEYSYM_HOLE,
303    /* 118: L16/Help    */	KEYSYM_NOP,
304    /* 119: CapsLock    */	KEYSYM_INVMOD | KBMOD_CAPSLOCK,
305    /* 120: Meta_L      */	KEYSYM_SETMOD | KBMOD_META_L,
306    /* 121: SpaceBar    */	CTL(' '),
307    /* 122: Meta_R      */	KEYSYM_SETMOD | KBMOD_META_R,
308    /* 123: T5_PgDn     */	KEYSYM_NOP,
309    /* 124:             */	KEYSYM_HOLE,
310    /* 125: KP_Add      */	KEYSYM_NOP,
311    /* 126:             */	KEYSYM_HW_ERR,
312    /* 127:             */	KEYSYM_ALL_UP,
313};
314#undef	CTL
315
316
317/*
318 * Keymaps for the "type 3" keyboard.
319 * (lower-case, upper-case)
320 */
321
322u_short keymap_s3_lc[KEYMAP_SIZE] = {
323    /*   0:             */	KEYSYM_HOLE,
324    /*   1: L1/Stop     */	KEYSYM_FUNC_L(1),
325    /*   2:             */	KEYSYM_HOLE,
326    /*   3: L2/Again    */	KEYSYM_FUNC_L(2),
327    /*   4:             */	KEYSYM_HOLE,
328    /*   5: F1          */	KEYSYM_FUNC_F(1),
329    /*   6: F2          */	KEYSYM_FUNC_F(2),
330    /*   7: F10         */	KEYSYM_HOLE,
331    /*   8: F3          */	KEYSYM_FUNC_F(3),
332    /*   9: F11         */	KEYSYM_HOLE,
333    /*  10: F4          */	KEYSYM_FUNC_F(4),
334    /*  11: F12         */	KEYSYM_HOLE,
335    /*  12: F5          */	KEYSYM_FUNC_F(5),
336    /*  13: AltGraph    */	KEYSYM_HOLE,
337    /*  14: F6          */	KEYSYM_FUNC_F(6),
338    /*  15:             */	KEYSYM_HOLE,
339    /*  16: F7          */	KEYSYM_FUNC_F(7),
340    /*  17: F8          */	KEYSYM_FUNC_F(8),
341    /*  18: F9          */	KEYSYM_FUNC_F(9),
342    /*  19: Alt_L       */	KEYSYM_SETMOD | KBMOD_ALT_L,
343    /*  20: T5_Up       */	KEYSYM_HOLE,
344    /*  21: R1/Pause    */	KEYSYM_FUNC_R(1),
345    /*  22: R2/Print    */	KEYSYM_FUNC_R(2),
346    /*  23: R3/Break    */	KEYSYM_FUNC_R(3),
347    /*  24: T5_Left     */	KEYSYM_HOLE,
348    /*  25: L3/Props    */	KEYSYM_FUNC_L(3),
349    /*  26: L4/Undo     */	KEYSYM_FUNC_L(4),
350    /*  27: T5_Down     */	KEYSYM_HOLE,
351    /*  28: T5_Right    */	KEYSYM_HOLE,
352    /*  29: Esc         */	0x1b,
353    /*  30: 1           */	'1',
354    /*  31: 2           */	'2',
355    /*  32: 3           */	'3',
356    /*  33: 4           */	'4',
357    /*  34: 5           */	'5',
358    /*  35: 6           */	'6',
359    /*  36: 7           */	'7',
360    /*  37: 8           */	'8',
361    /*  38: 9           */	'9',
362    /*  39: 0           */	'0',
363    /*  40: minus       */	'-',
364    /*  41: equal       */	'=',
365    /*  42: grave/tilde */	'`',
366    /*  43: BackSpace   */	'\b',
367    /*  44:             */	KEYSYM_HOLE,
368    /*  45: R4/KP_Equal */	KEYSYM_FUNC_R(4),
369    /*  46: R5/KP_Div   */	KEYSYM_FUNC_R(5),
370    /*  47: R6/KP_Mult  */	KEYSYM_FUNC_R(6),
371    /*  48:             */	KEYSYM_HOLE,
372    /*  49: L5/Front    */	KEYSYM_FUNC_L(5),
373    /*  50: KP_Delete   */	KEYSYM_HOLE,
374    /*  51: L6/Copy     */	KEYSYM_FUNC_L(6),
375    /*  52:             */	KEYSYM_HOLE,
376    /*  53: Tab         */	'\t',
377    /*  54: Q           */	'q',
378    /*  55: W           */	'w',
379    /*  56: E           */	'e',
380    /*  57: R           */	'r',
381    /*  58: T           */	't',
382    /*  59: Y           */	'y',
383    /*  60: U           */	'u',
384    /*  61: I           */	'i',
385    /*  62: O           */	'o',
386    /*  63: P           */	'p',
387    /*  64: [           */	'[',
388    /*  65: ]           */	']',
389    /*  66: Delete      */	0x7f,
390    /*  67: Compose     */	KEYSYM_HOLE,
391    /*  68: R7/Home     */	KEYSYM_FUNC_R(7),
392    /*  69: R8/Up       */	KEYSYM_FUNC_R(8),
393    /*  70: R9/PgUp     */	KEYSYM_FUNC_R(9),
394    /*  71: KP_Minus    */	KEYSYM_HOLE,
395    /*  72: L7/Open     */	KEYSYM_FUNC_L(7),
396    /*  73: L8/Paste    */	KEYSYM_FUNC_L(8),
397    /*  74:             */	KEYSYM_HOLE,
398    /*  75:             */	KEYSYM_HOLE,
399    /*  76: Ctrl_L      */	KEYSYM_SETMOD | KBMOD_CTRL_L,
400    /*  77: A           */	'a',
401    /*  78: S           */	's',
402    /*  79: D           */	'd',
403    /*  80: F           */	'f',
404    /*  81: G           */	'g',
405    /*  82: H           */	'h',
406    /*  83: J           */	'j',
407    /*  84: K           */	'k',
408    /*  85: L           */	'l',
409    /*  86: ;           */	';',
410    /*  87: apostr.     */	'\'',
411    /*  88: backslash   */	'\\',
412    /*  89: Return      */	'\r',
413    /*  90: KP_Enter    */	KEYSYM_HOLE,
414    /*  91: R10/Left    */	KEYSYM_FUNC_R(10),
415    /*  92: R11/KP_5    */	KEYSYM_FUNC_R(11),
416    /*  93: R12/Right   */	KEYSYM_FUNC_R(12),
417    /*  94: KP_Insert   */	KEYSYM_HOLE,
418    /*  95: L9/Find     */	KEYSYM_FUNC_L(9),
419    /*  96:             */	KEYSYM_HOLE,
420    /*  97: L10/Cut     */	KEYSYM_FUNC_L(10),
421    /*  98: Num_Lock    */	KEYSYM_HOLE,
422    /*  99: Shift_L     */	KEYSYM_SETMOD | KBMOD_SHIFT_L,
423    /* 100: Z           */	'z',
424    /* 101: X           */	'x',
425    /* 102: C           */	'c',
426    /* 103: V           */	'v',
427    /* 104: B           */	'b',
428    /* 105: N           */	'n',
429    /* 106: M           */	'm',
430    /* 107: ,           */	',',
431    /* 108: .           */	'.',
432    /* 109: /           */	'/',
433    /* 110: Shift_R     */	KEYSYM_SETMOD | KBMOD_SHIFT_R,
434    /* 111: Linefeed    */	'\n',
435    /* 112: R13/End     */	KEYSYM_FUNC_R(13),
436    /* 113: R14/Down    */	KEYSYM_FUNC_R(14),
437    /* 114: R15/PgDn    */	KEYSYM_FUNC_R(15),
438    /* 115:             */	KEYSYM_HOLE,
439    /* 116:             */	KEYSYM_HOLE,
440    /* 117:             */	KEYSYM_HOLE,
441    /* 118: L16/Help    */	KEYSYM_HOLE,
442    /* 119: CapsLock    */	KEYSYM_INVMOD | KBMOD_CAPSLOCK,
443    /* 120: Meta_L      */	KEYSYM_SETMOD | KBMOD_META_L,
444    /* 121: SpaceBar    */	' ',
445    /* 122: Meta_R      */	KEYSYM_SETMOD | KBMOD_META_R,
446    /* 123:             */	KEYSYM_HOLE,
447    /* 124:             */	KEYSYM_HOLE,
448    /* 125: KP_Add      */	KEYSYM_HOLE,
449    /* 126:             */	KEYSYM_HW_ERR,
450    /* 127:             */	KEYSYM_ALL_UP,
451};
452
453
454u_short keymap_s3_uc[KEYMAP_SIZE] = {
455    /*   0:             */	KEYSYM_HOLE,
456    /*   1: L1/Stop     */	KEYSYM_FUNC_L(1),
457    /*   2:             */	KEYSYM_HOLE,
458    /*   3: L2/Again    */	KEYSYM_FUNC_L(2),
459    /*   4:             */	KEYSYM_HOLE,
460    /*   5: F1          */	KEYSYM_FUNC_F(1),
461    /*   6: F2          */	KEYSYM_FUNC_F(2),
462    /*   7: F10         */	KEYSYM_HOLE,
463    /*   8: F3          */	KEYSYM_FUNC_F(3),
464    /*   9: F11         */	KEYSYM_HOLE,
465    /*  10: F4          */	KEYSYM_FUNC_F(4),
466    /*  11: F12         */	KEYSYM_HOLE,
467    /*  12: F5          */	KEYSYM_FUNC_F(5),
468    /*  13: AltGraph    */	KEYSYM_HOLE,
469    /*  14: F6          */	KEYSYM_FUNC_F(6),
470    /*  15:             */	KEYSYM_HOLE,
471    /*  16: F7          */	KEYSYM_FUNC_F(7),
472    /*  17: F8          */	KEYSYM_FUNC_F(8),
473    /*  18: F9          */	KEYSYM_FUNC_F(9),
474    /*  19: Alt_L       */	KEYSYM_SETMOD | KBMOD_ALT_L,
475    /*  20: T5_Up       */	KEYSYM_HOLE,
476    /*  21: R1/Pause    */	KEYSYM_FUNC_R(1),
477    /*  22: R2/Print    */	KEYSYM_FUNC_R(2),
478    /*  23: R3/Break    */	KEYSYM_FUNC_R(3),
479    /*  24: T5_Left     */	KEYSYM_HOLE,
480    /*  25: L3/Props    */	KEYSYM_FUNC_L(3),
481    /*  26: L4/Undo     */	KEYSYM_FUNC_L(4),
482    /*  27: T5_Down     */	KEYSYM_HOLE,
483    /*  28: T5_Right    */	KEYSYM_HOLE,
484    /*  29: Esc         */	0x1b,
485    /*  30: 1           */	'!',
486    /*  31: 2           */	'@',
487    /*  32: 3           */	'#',
488    /*  33: 4           */	'$',
489    /*  34: 5           */	'%',
490    /*  35: 6           */	'^',
491    /*  36: 7           */	'&',
492    /*  37: 8           */	'*',
493    /*  38: 9           */	'(',
494    /*  39: 0           */	')',
495    /*  40: minus       */	'_',
496    /*  41: equal       */	'+',
497    /*  42: grave/tilde */	'~',
498    /*  43: BackSpace   */	'\b',
499    /*  44:             */	KEYSYM_HOLE,
500    /*  45: R4/KP_Equal */	KEYSYM_FUNC_R(4),
501    /*  46: R5/KP_Div   */	KEYSYM_FUNC_R(5),
502    /*  47: R6/KP_Mult  */	KEYSYM_FUNC_R(6),
503    /*  48:             */	KEYSYM_HOLE,
504    /*  49: L5/Front    */	KEYSYM_FUNC_L(5),
505    /*  50: KP_Delete   */	KEYSYM_HOLE,
506    /*  51: L6/Copy     */	KEYSYM_FUNC_L(6),
507    /*  52:             */	KEYSYM_HOLE,
508    /*  53: Tab         */	'\t',
509    /*  54: Q           */	'Q',
510    /*  55: W           */	'W',
511    /*  56: E           */	'E',
512    /*  57: R           */	'R',
513    /*  58: T           */	'T',
514    /*  59: Y           */	'Y',
515    /*  60: U           */	'U',
516    /*  61: I           */	'I',
517    /*  62: O           */	'O',
518    /*  63: P           */	'P',
519    /*  64: [           */	'{',
520    /*  65: ]           */	'}',
521    /*  66: Delete      */	0x7f,
522    /*  67: Compose     */	KEYSYM_HOLE,
523    /*  68: R7/Home     */	KEYSYM_FUNC_R(7),
524    /*  69: R8/Up       */	KEYSYM_FUNC_R(8),
525    /*  70: R9/PgUp     */	KEYSYM_FUNC_R(9),
526    /*  71: KP_Minus    */	KEYSYM_HOLE,
527    /*  72: L7/Open     */	KEYSYM_FUNC_L(7),
528    /*  73: L8/Paste    */	KEYSYM_FUNC_L(8),
529    /*  74:             */	KEYSYM_HOLE,
530    /*  75:             */	KEYSYM_HOLE,
531    /*  76: Ctrl_L      */	KEYSYM_SETMOD | KBMOD_CTRL_L,
532    /*  77: A           */	'A',
533    /*  78: S           */	'S',
534    /*  79: D           */	'D',
535    /*  80: F           */	'F',
536    /*  81: G           */	'G',
537    /*  82: H           */	'H',
538    /*  83: J           */	'J',
539    /*  84: K           */	'K',
540    /*  85: L           */	'L',
541    /*  86: ;           */	':',
542    /*  87: apostr.     */	'"',
543    /*  88: backslash   */	'|',
544    /*  89: Return      */	'\r',
545    /*  90: KP_Enter    */	KEYSYM_HOLE,
546    /*  91: R10/Left    */	KEYSYM_FUNC_R(10),
547    /*  92: R11/KP_5    */	KEYSYM_FUNC_R(11),
548    /*  93: R12/Right   */	KEYSYM_FUNC_R(12),
549    /*  94: KP_Insert   */	KEYSYM_HOLE,
550    /*  95: L9/Find     */	KEYSYM_FUNC_L(9),
551    /*  96:             */	KEYSYM_HOLE,
552    /*  97: L10/Cut     */	KEYSYM_FUNC_L(10),
553    /*  98: Num_Lock    */	KEYSYM_HOLE,
554    /*  99: Shift_L     */	KEYSYM_SETMOD | KBMOD_SHIFT_L,
555    /* 100: Z           */	'Z',
556    /* 101: X           */	'X',
557    /* 102: C           */	'C',
558    /* 103: V           */	'V',
559    /* 104: B           */	'B',
560    /* 105: N           */	'N',
561    /* 106: M           */	'M',
562    /* 107: ,           */	'<',
563    /* 108: .           */	'>',
564    /* 109: /           */	'?',
565    /* 110: Shift_R     */	KEYSYM_SETMOD | KBMOD_SHIFT_R,
566    /* 111: Linefeed    */	'\n',
567    /* 112: R13/End     */	KEYSYM_FUNC_R(13),
568    /* 113: R14/Down    */	KEYSYM_FUNC_R(14),
569    /* 114: R15/PgDn    */	KEYSYM_FUNC_R(15),
570    /* 115:             */	KEYSYM_HOLE,
571    /* 116:             */	KEYSYM_HOLE,
572    /* 117:             */	KEYSYM_HOLE,
573    /* 118: L16/Help    */	KEYSYM_HOLE,
574    /* 119: CapsLock    */	KEYSYM_INVMOD | KBMOD_CAPSLOCK,
575    /* 120: Meta_L      */	KEYSYM_SETMOD | KBMOD_META_L,
576    /* 121: SpaceBar    */	' ',
577    /* 122: Meta_R      */	KEYSYM_SETMOD | KBMOD_META_R,
578    /* 123:             */	KEYSYM_HOLE,
579    /* 124:             */	KEYSYM_HOLE,
580    /* 125: KP_Add      */	KEYSYM_HOLE,
581    /* 126:             */	KEYSYM_HW_ERR,
582    /* 127:             */	KEYSYM_ALL_UP,
583};
584
585
586/*
587 * Keymaps for the "type 4" keyboard.
588 * (lower-case, upper-case)
589 */
590
591u_short keymap_s4_lc[KEYMAP_SIZE] = {
592    /*   0:             */	KEYSYM_HOLE,
593    /*   1: L1/Stop     */	KEYSYM_FUNC_L(1),
594    /*   2:             */	KEYSYM_HOLE,
595    /*   3: L2/Again    */	KEYSYM_FUNC_L(2),
596    /*   4:             */	KEYSYM_HOLE,
597    /*   5: F1          */	KEYSYM_FUNC_F(1),
598    /*   6: F2          */	KEYSYM_FUNC_F(2),
599    /*   7: F10         */	KEYSYM_FUNC_F(10),
600    /*   8: F3          */	KEYSYM_FUNC_F(3),
601    /*   9: F11         */	KEYSYM_FUNC_F(11),
602    /*  10: F4          */	KEYSYM_FUNC_F(4),
603    /*  11: F12         */	KEYSYM_FUNC_F(12),
604    /*  12: F5          */	KEYSYM_FUNC_F(5),
605    /*  13: AltGraph    */	KEYSYM_SETMOD | KBMOD_ALTGRAPH,
606    /*  14: F6          */	KEYSYM_FUNC_F(6),
607    /*  15:             */	KEYSYM_HOLE,
608    /*  16: F7          */	KEYSYM_FUNC_F(7),
609    /*  17: F8          */	KEYSYM_FUNC_F(8),
610    /*  18: F9          */	KEYSYM_FUNC_F(9),
611    /*  19: Alt_L       */	KEYSYM_SETMOD | KBMOD_ALT_L,
612    /*  20: T5_Up       */	KEYSYM_STRING | 1,
613    /*  21: R1/Pause    */	KEYSYM_FUNC_R(1),
614    /*  22: R2/Print    */	KEYSYM_FUNC_R(2),
615    /*  23: R3/Break    */	KEYSYM_FUNC_R(3),
616    /*  24: T5_Left     */	KEYSYM_STRING | 3,
617    /*  25: L3/Props    */	KEYSYM_FUNC_L(3),
618    /*  26: L4/Undo     */	KEYSYM_FUNC_L(4),
619    /*  27: T5_Down     */	KEYSYM_STRING | 2,
620    /*  28: T5_Right    */	KEYSYM_STRING | 4,
621    /*  29: Esc         */	0x1b,
622    /*  30: 1           */	'1',
623    /*  31: 2           */	'2',
624    /*  32: 3           */	'3',
625    /*  33: 4           */	'4',
626    /*  34: 5           */	'5',
627    /*  35: 6           */	'6',
628    /*  36: 7           */	'7',
629    /*  37: 8           */	'8',
630    /*  38: 9           */	'9',
631    /*  39: 0           */	'0',
632    /*  40: minus       */	'-',
633    /*  41: equal       */	'=',
634    /*  42: grave/tilde */	'`',
635    /*  43: BackSpace   */	'\b',
636    /*  44: T5_Insert   */	KEYSYM_FUNC_N(8),
637    /*  45: R4/KP_Equal */	KEYSYM_FUNC_R(4),
638    /*  46: R5/KP_Div   */	KEYSYM_FUNC_R(5),
639    /*  47: R6/KP_Mult  */	KEYSYM_FUNC_R(6),
640    /*  48:             */	KEYSYM_FUNC_N(13),
641    /*  49: L5/Front    */	KEYSYM_FUNC_L(5),
642    /*  50: KP_Delete   */	KEYSYM_FUNC_N(10),
643    /*  51: L6/Copy     */	KEYSYM_FUNC_L(6),
644    /*  52: T5_Home     */	KEYSYM_FUNC_R(7),
645    /*  53: Tab         */	'\t',
646    /*  54: Q           */	'q',
647    /*  55: W           */	'w',
648    /*  56: E           */	'e',
649    /*  57: R           */	'r',
650    /*  58: T           */	't',
651    /*  59: Y           */	'y',
652    /*  60: U           */	'u',
653    /*  61: I           */	'i',
654    /*  62: O           */	'o',
655    /*  63: P           */	'p',
656    /*  64: [           */	'[',
657    /*  65: ]           */	']',
658    /*  66: Delete      */	0x7f,
659    /*  67: Compose     */	KEYSYM_COMPOSE,
660    /*  68: R7/Home     */	KEYSYM_FUNC_R(7),
661    /*  69: R8/Up       */	KEYSYM_FUNC_R(8),
662    /*  70: R9/PgUp     */	KEYSYM_FUNC_R(9),
663    /*  71: KP_Minus    */	KEYSYM_FUNC_N(15),
664    /*  72: L7/Open     */	KEYSYM_FUNC_L(7),
665    /*  73: L8/Paste    */	KEYSYM_FUNC_L(8),
666    /*  74: T5_End      */	KEYSYM_FUNC_R(13),
667    /*  75:             */	KEYSYM_HOLE,
668    /*  76: Ctrl_L      */	KEYSYM_SETMOD | KBMOD_CTRL_L,
669    /*  77: A           */	'a',
670    /*  78: S           */	's',
671    /*  79: D           */	'd',
672    /*  80: F           */	'f',
673    /*  81: G           */	'g',
674    /*  82: H           */	'h',
675    /*  83: J           */	'j',
676    /*  84: K           */	'k',
677    /*  85: L           */	'l',
678    /*  86: ;           */	';',
679    /*  87: apostr.     */	'\'',
680    /*  88: backslash   */	'\\',
681    /*  89: Return      */	'\r',
682    /*  90: KP_Enter    */	KEYSYM_FUNC_N(11),
683    /*  91: R10/Left    */	KEYSYM_FUNC_R(10),
684    /*  92: R11/KP_5    */	KEYSYM_FUNC_R(11),
685    /*  93: R12/Right   */	KEYSYM_FUNC_R(12),
686    /*  94: KP_Insert   */	KEYSYM_FUNC_N(8),
687    /*  95: L9/Find     */	KEYSYM_FUNC_L(9),
688    /*  96: T5_PgUp     */	KEYSYM_FUNC_R(9),
689    /*  97: L10/Cut     */	KEYSYM_FUNC_L(10),
690    /*  98: Num_Lock    */	KEYSYM_INVMOD | KBMOD_NUMLOCK,
691    /*  99: Shift_L     */	KEYSYM_SETMOD | KBMOD_SHIFT_L,
692    /* 100: Z           */	'z',
693    /* 101: X           */	'x',
694    /* 102: C           */	'c',
695    /* 103: V           */	'v',
696    /* 104: B           */	'b',
697    /* 105: N           */	'n',
698    /* 106: M           */	'm',
699    /* 107: ,           */	',',
700    /* 108: .           */	'.',
701    /* 109: /           */	'/',
702    /* 110: Shift_R     */	KEYSYM_SETMOD | KBMOD_SHIFT_R,
703    /* 111: Linefeed    */	'\n',
704    /* 112: R13/End     */	KEYSYM_FUNC_R(13),
705    /* 113: R14/Down    */	KEYSYM_FUNC_R(14),
706    /* 114: R15/PgDn    */	KEYSYM_FUNC_R(15),
707    /* 115:             */	KEYSYM_HOLE,
708    /* 116:             */	KEYSYM_HOLE,
709    /* 117:             */	KEYSYM_HOLE,
710    /* 118: L16/Help    */	KEYSYM_FUNC_L(16),
711    /* 119: CapsLock    */	KEYSYM_INVMOD | KBMOD_CAPSLOCK,
712    /* 120: Meta_L      */	KEYSYM_SETMOD | KBMOD_META_L,
713    /* 121: SpaceBar    */	' ',
714    /* 122: Meta_R      */	KEYSYM_SETMOD | KBMOD_META_R,
715    /* 123: T5_PgDn     */	KEYSYM_FUNC_R(15),
716    /* 124:             */	KEYSYM_HOLE,
717    /* 125: KP_Add      */	KEYSYM_FUNC_N(14),
718    /* 126:             */	KEYSYM_HW_ERR,
719    /* 127:             */	KEYSYM_ALL_UP,
720};
721
722
723u_short keymap_s4_uc[KEYMAP_SIZE] = {
724    /*   0:             */	KEYSYM_HOLE,
725    /*   1: L1/Stop     */	KEYSYM_FUNC_L(1),
726    /*   2:             */	KEYSYM_HOLE,
727    /*   3: L2/Again    */	KEYSYM_FUNC_L(2),
728    /*   4:             */	KEYSYM_HOLE,
729    /*   5: F1          */	KEYSYM_FUNC_F(1),
730    /*   6: F2          */	KEYSYM_FUNC_F(2),
731    /*   7: F10         */	KEYSYM_FUNC_F(10),
732    /*   8: F3          */	KEYSYM_FUNC_F(3),
733    /*   9: F11         */	KEYSYM_FUNC_F(11),
734    /*  10: F4          */	KEYSYM_FUNC_F(4),
735    /*  11: F12         */	KEYSYM_FUNC_F(12),
736    /*  12: F5          */	KEYSYM_FUNC_F(5),
737    /*  13: AltGraph    */	KEYSYM_SETMOD | KBMOD_ALTGRAPH,
738    /*  14: F6          */	KEYSYM_FUNC_F(6),
739    /*  15:             */	KEYSYM_HOLE,
740    /*  16: F7          */	KEYSYM_FUNC_F(7),
741    /*  17: F8          */	KEYSYM_FUNC_F(8),
742    /*  18: F9          */	KEYSYM_FUNC_F(9),
743    /*  19: Alt_L       */	KEYSYM_SETMOD | KBMOD_ALT_L,
744    /*  20: T5_Up       */	KEYSYM_STRING | 1,
745    /*  21: R1/Pause    */	KEYSYM_FUNC_R(1),
746    /*  22: R2/Print    */	KEYSYM_FUNC_R(2),
747    /*  23: R3/Break    */	KEYSYM_FUNC_R(3),
748    /*  24: T5_Left     */	KEYSYM_STRING | 3,
749    /*  25: L3/Props    */	KEYSYM_FUNC_L(3),
750    /*  26: L4/Undo     */	KEYSYM_FUNC_L(4),
751    /*  27: T5_Down     */	KEYSYM_STRING | 2,
752    /*  28: T5_Right    */	KEYSYM_STRING | 4,
753    /*  29: Esc         */	0x1b,
754    /*  30: 1           */	'!',
755    /*  31: 2           */	'@',
756    /*  32: 3           */	'#',
757    /*  33: 4           */	'$',
758    /*  34: 5           */	'%',
759    /*  35: 6           */	'^',
760    /*  36: 7           */	'&',
761    /*  37: 8           */	'*',
762    /*  38: 9           */	'(',
763    /*  39: 0           */	')',
764    /*  40: minus       */	'_',
765    /*  41: equal       */	'+',
766    /*  42: grave/tilde */	'~',
767    /*  43: BackSpace   */	'\b',
768    /*  44: T5_Insert   */	KEYSYM_FUNC_N(8),
769    /*  45: R4/KP_Equal */	KEYSYM_FUNC_R(4),
770    /*  46: R5/KP_Div   */	KEYSYM_FUNC_R(5),
771    /*  47: R6/KP_Mult  */	KEYSYM_FUNC_R(6),
772    /*  48:             */	KEYSYM_FUNC_N(13),
773    /*  49: L5/Front    */	KEYSYM_FUNC_L(5),
774    /*  50: KP_Delete   */	KEYSYM_FUNC_N(10),
775    /*  51: L6/Copy     */	KEYSYM_FUNC_L(6),
776    /*  52: T5_Home     */	KEYSYM_FUNC_R(7),
777    /*  53: Tab         */	'\t',
778    /*  54: Q           */	'Q',
779    /*  55: W           */	'W',
780    /*  56: E           */	'E',
781    /*  57: R           */	'R',
782    /*  58: T           */	'T',
783    /*  59: Y           */	'Y',
784    /*  60: U           */	'U',
785    /*  61: I           */	'I',
786    /*  62: O           */	'O',
787    /*  63: P           */	'P',
788    /*  64: [           */	'{',
789    /*  65: ]           */	'}',
790    /*  66: Delete      */	0x7f,
791    /*  67: Compose     */	KEYSYM_COMPOSE,
792    /*  68: R7/Home     */	KEYSYM_FUNC_R(7),
793    /*  69: R8/Up       */	KEYSYM_FUNC_R(8),
794    /*  70: R9/PgUp     */	KEYSYM_FUNC_R(9),
795    /*  71: KP_Minus    */	KEYSYM_FUNC_N(15),
796    /*  72: L7/Open     */	KEYSYM_FUNC_L(7),
797    /*  73: L8/Paste    */	KEYSYM_FUNC_L(8),
798    /*  74: T5_End      */	KEYSYM_FUNC_R(13),
799    /*  75:             */	KEYSYM_HOLE,
800    /*  76: Ctrl_L      */	KEYSYM_SETMOD | KBMOD_CTRL_L,
801    /*  77: A           */	'A',
802    /*  78: S           */	'S',
803    /*  79: D           */	'D',
804    /*  80: F           */	'F',
805    /*  81: G           */	'G',
806    /*  82: H           */	'H',
807    /*  83: J           */	'J',
808    /*  84: K           */	'K',
809    /*  85: L           */	'L',
810    /*  86: ;           */	':',
811    /*  87: apostr.     */	'"',
812    /*  88: backslash   */	'|',
813    /*  89: Return      */	'\r',
814    /*  90: KP_Enter    */	KEYSYM_FUNC_N(11),
815    /*  91: R10/Left    */	KEYSYM_FUNC_R(10),
816    /*  92: R11/KP_5    */	KEYSYM_FUNC_R(11),
817    /*  93: R12/Right   */	KEYSYM_FUNC_R(12),
818    /*  94: KP_Insert   */	KEYSYM_FUNC_N(8),
819    /*  95: L9/Find     */	KEYSYM_FUNC_L(9),
820    /*  96: T5_PgUp     */	KEYSYM_FUNC_R(9),
821    /*  97: L10/Cut     */	KEYSYM_FUNC_L(10),
822    /*  98: Num_Lock    */	KEYSYM_INVMOD | KBMOD_NUMLOCK,
823    /*  99: Shift_L     */	KEYSYM_SETMOD | KBMOD_SHIFT_L,
824    /* 100: Z           */	'Z',
825    /* 101: X           */	'X',
826    /* 102: C           */	'C',
827    /* 103: V           */	'V',
828    /* 104: B           */	'B',
829    /* 105: N           */	'N',
830    /* 106: M           */	'M',
831    /* 107: ,           */	'<',
832    /* 108: .           */	'>',
833    /* 109: /           */	'?',
834    /* 110: Shift_R     */	KEYSYM_SETMOD | KBMOD_SHIFT_R,
835    /* 111: Linefeed    */	'\n',
836    /* 112: R13/End     */	KEYSYM_FUNC_R(13),
837    /* 113: R14/Down    */	KEYSYM_FUNC_R(14),
838    /* 114: R15/PgDn    */	KEYSYM_FUNC_R(15),
839    /* 115:             */	KEYSYM_HOLE,
840    /* 116:             */	KEYSYM_HOLE,
841    /* 117:             */	KEYSYM_HOLE,
842    /* 118: L16/Help    */	KEYSYM_FUNC_L(16),
843    /* 119: CapsLock    */	KEYSYM_INVMOD | KBMOD_CAPSLOCK,
844    /* 120: Meta_L      */	KEYSYM_SETMOD | KBMOD_META_L,
845    /* 121: SpaceBar    */	' ',
846    /* 122: Meta_R      */	KEYSYM_SETMOD | KBMOD_META_R,
847    /* 123: T5_PgDn     */	KEYSYM_FUNC_R(15),
848    /* 124:             */	KEYSYM_HOLE,
849    /* 125: KP_Add      */	KEYSYM_FUNC_N(14),
850    /* 126:             */	KEYSYM_HW_ERR,
851    /* 127:             */	KEYSYM_ALL_UP,
852};
853
854
855
856/*
857 * Strings indexed by:  (KEYSYM_STRING | idx)
858 */
859char kbd_stringtab[16][10] = {
860	{ 0x1b, '[', 'H', 0 },	/* 0: Home */
861	{ 0x1b, '[', 'A', 0 },	/* 1: Up   */
862	{ 0x1b, '[', 'B', 0 },	/* 2: Down */
863	{ 0x1b, '[', 'D', 0 },	/* 3: Left */
864	{ 0x1b, '[', 'C', 0 },	/* 4: Right */
865};
866
867/*
868 * The "NumLock" map, which is used to remap
869 * function keysyms when NumLock is on.
870 */
871unsigned short kbd_numlock_map[64] = {
872	/* KEYSYM_FUNC_L: Identity map */
873	0x600, 0x601, 0x602, 0x603, 0x604, 0x605, 0x606, 0x607,
874	0x608, 0x609, 0x60a, 0x60b, 0x60c, 0x60d, 0x60e, 0x60f,
875
876	/* KEYSYM_FUNC_R: remap to numbers... */
877	0x610, 0x611, 0x612,
878	'=', '/', '*',
879	'7', '8', '9',
880	'4', '5', '6',
881	'1', '2', '3',
882	0x61f,
883
884	/* KEYSYM_FUNC_F: Identity map */
885	0x620, 0x621, 0x622, 0x623, 0x624, 0x625, 0x626, 0x627,
886	0x628, 0x629, 0x62a, 0x62b, 0x62c, 0x62d, 0x62e, 0x62f,
887
888	/* KEYSYM_FUNC_N: remap just a few... */
889	0x630, 0x631, 0x632, 0x633, 0x634, 0x635, 0x636,   '0',
890	0x638,   '.',  '\r', 0x63b, 0x63c,   '+',   '-', 0x63f,
891};
892
893
894/*
895 * Keyboard descriptions for each type.
896 */
897
898/* Treat type 2 as type 3 (close enough) */
899#define	kbd_type2 kbd_type3
900
901static struct keyboard kbd_type3 = {
902	keymap_release,
903	keymap_control,
904	keymap_s3_lc,
905	keymap_s3_uc,
906};
907
908static struct keyboard kbd_type4 = {
909	keymap_release,
910	keymap_control,
911	keymap_s4_lc,
912	keymap_s4_uc,
913};
914
915/* Treat type 5 as type 4 (close enough) */
916#define	kbd_type5 kbd_type4
917
918struct keyboard * keyboards[] = {
919	0, /* type 0 */
920	0, /* type 1 */
921	&kbd_type2,
922	&kbd_type3,
923	&kbd_type4,
924	&kbd_type5,
925};
926int kbd_max_type = 5;
927