/*      $NetBSD: kbd_tables.c,v 1.10 2009/10/21 23:12:10 snj Exp $      */

/*
* Copyright (c) 1996 Gordon W. Ross
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
*    notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
*    notice, this list of conditions and the following disclaimer in the
*    documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

/*
* Keyboard translation tables.  (See kbd_tables.h)
*/

#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: kbd_tables.c,v 1.10 2009/10/21 23:12:10 snj Exp $");

#include <sys/types.h>

#define _KERNEL 1       /* XXX */
#include "kbd_tables.h"


/* The "compose" operations are not implemented. */
#define KEYSYM_COMPOSE KEYSYM_NOP


/*
* Key release codes are decoded in this map.
*/
u_short keymap_release[KEYMAP_SIZE] = {
   /*   0:             */      KEYSYM_HOLE,
   /*   1: L1/Stop     */      KEYSYM_NOP,
   /*   2:             */      KEYSYM_HOLE,
   /*   3: L2/Again    */      KEYSYM_NOP,
   /*   4:             */      KEYSYM_HOLE,
   /*   5: F1          */      KEYSYM_NOP,
   /*   6: F2          */      KEYSYM_NOP,
   /*   7: F10         */      KEYSYM_NOP,
   /*   8: F3          */      KEYSYM_NOP,
   /*   9: F11         */      KEYSYM_NOP,
   /*  10: F4          */      KEYSYM_NOP,
   /*  11: F12         */      KEYSYM_NOP,
   /*  12: F5          */      KEYSYM_NOP,
   /*  13: AltGraph    */      KEYSYM_CLRMOD | KBMOD_ALTGRAPH,
   /*  14: F6          */      KEYSYM_NOP,
   /*  15:             */      KEYSYM_HOLE,
   /*  16: F7          */      KEYSYM_NOP,
   /*  17: F8          */      KEYSYM_NOP,
   /*  18: F9          */      KEYSYM_NOP,
   /*  19: Alt_L       */      KEYSYM_CLRMOD | KBMOD_ALT_L,
   /*  20: T5_Up       */      KEYSYM_NOP,
   /*  21: R1/Pause    */      KEYSYM_NOP,
   /*  22: R2/Print    */      KEYSYM_NOP,
   /*  23: R3/Break    */      KEYSYM_NOP,
   /*  24: T5_Left     */      KEYSYM_NOP,
   /*  25: L3/Props    */      KEYSYM_NOP,
   /*  26: L4/Undo     */      KEYSYM_NOP,
   /*  27: T5_Down     */      KEYSYM_NOP,
   /*  28: T5_Right    */      KEYSYM_NOP,
   /*  29: Esc         */      KEYSYM_NOP,
   /*  30: 1           */      KEYSYM_NOP,
   /*  31: 2           */      KEYSYM_NOP,
   /*  32: 3           */      KEYSYM_NOP,
   /*  33: 4           */      KEYSYM_NOP,
   /*  34: 5           */      KEYSYM_NOP,
   /*  35: 6           */      KEYSYM_NOP,
   /*  36: 7           */      KEYSYM_NOP,
   /*  37: 8           */      KEYSYM_NOP,
   /*  38: 9           */      KEYSYM_NOP,
   /*  39: 0           */      KEYSYM_NOP,
   /*  40: minus       */      KEYSYM_NOP,
   /*  41: equal       */      KEYSYM_NOP,
   /*  42: grave/tilde */      KEYSYM_NOP,
   /*  43: BackSpace   */      KEYSYM_NOP,
   /*  44: T5_Insert   */      KEYSYM_NOP,
   /*  45: R4/KP_Equal */      KEYSYM_NOP,
   /*  46: R5/KP_Div   */      KEYSYM_NOP,
   /*  47: R6/KP_Mult  */      KEYSYM_NOP,
   /*  48:             */      KEYSYM_NOP,
   /*  49: L5/Front    */      KEYSYM_NOP,
   /*  50: KP_Delete   */      KEYSYM_NOP,
   /*  51: L6/Copy     */      KEYSYM_NOP,
   /*  52: T5_Home     */      KEYSYM_NOP,
   /*  53: Tab         */      KEYSYM_NOP,
   /*  54: Q           */      KEYSYM_NOP,
   /*  55: W           */      KEYSYM_NOP,
   /*  56: E           */      KEYSYM_NOP,
   /*  57: R           */      KEYSYM_NOP,
   /*  58: T           */      KEYSYM_NOP,
   /*  59: Y           */      KEYSYM_NOP,
   /*  60: U           */      KEYSYM_NOP,
   /*  61: I           */      KEYSYM_NOP,
   /*  62: O           */      KEYSYM_NOP,
   /*  63: P           */      KEYSYM_NOP,
   /*  64: [           */      KEYSYM_NOP,
   /*  65: ]           */      KEYSYM_NOP,
   /*  66: Delete      */      KEYSYM_NOP,
   /*  67: Compose     */      KEYSYM_NOP,
   /*  68: R7/Home     */      KEYSYM_NOP,
   /*  69: R8/Up       */      KEYSYM_NOP,
   /*  70: R9/PgUp     */      KEYSYM_NOP,
   /*  71: KP_Minus    */      KEYSYM_NOP,
   /*  72: L7/Open     */      KEYSYM_NOP,
   /*  73: L8/Paste    */      KEYSYM_NOP,
   /*  74: T5_End      */      KEYSYM_NOP,
   /*  75:             */      KEYSYM_HOLE,
   /*  76: Ctrl_L      */      KEYSYM_CLRMOD | KBMOD_CTRL_L,
   /*  77: A           */      KEYSYM_NOP,
   /*  78: S           */      KEYSYM_NOP,
   /*  79: D           */      KEYSYM_NOP,
   /*  80: F           */      KEYSYM_NOP,
   /*  81: G           */      KEYSYM_NOP,
   /*  82: H           */      KEYSYM_NOP,
   /*  83: J           */      KEYSYM_NOP,
   /*  84: K           */      KEYSYM_NOP,
   /*  85: L           */      KEYSYM_NOP,
   /*  86: ;           */      KEYSYM_NOP,
   /*  87: apostr.     */      KEYSYM_NOP,
   /*  88: backslash   */      KEYSYM_NOP,
   /*  89: Return      */      KEYSYM_NOP,
   /*  90: KP_Enter    */      KEYSYM_NOP,
   /*  91: R10/Left    */      KEYSYM_NOP,
   /*  92: R11/KP_5    */      KEYSYM_NOP,
   /*  93: R12/Right   */      KEYSYM_NOP,
   /*  94: KP_Insert   */      KEYSYM_NOP,
   /*  95: L9/Find     */      KEYSYM_NOP,
   /*  96: T5_PgUp     */      KEYSYM_NOP,
   /*  97: L10/Cut     */      KEYSYM_NOP,
   /*  98: Num_Lock    */      KEYSYM_NOP,
   /*  99: Shift_L     */      KEYSYM_CLRMOD | KBMOD_SHIFT_L,
   /* 100: Z           */      KEYSYM_NOP,
   /* 101: X           */      KEYSYM_NOP,
   /* 102: C           */      KEYSYM_NOP,
   /* 103: V           */      KEYSYM_NOP,
   /* 104: B           */      KEYSYM_NOP,
   /* 105: N           */      KEYSYM_NOP,
   /* 106: M           */      KEYSYM_NOP,
   /* 107: ,           */      KEYSYM_NOP,
   /* 108: .           */      KEYSYM_NOP,
   /* 109: /           */      KEYSYM_NOP,
   /* 110: Shift_R     */      KEYSYM_CLRMOD | KBMOD_SHIFT_R,
   /* 111: Linefeed    */      KEYSYM_NOP,
   /* 112: R13/End     */      KEYSYM_NOP,
   /* 113: R14/Down    */      KEYSYM_NOP,
   /* 114: R15/PgDn    */      KEYSYM_NOP,
   /* 115:             */      KEYSYM_HOLE,
   /* 116:             */      KEYSYM_HOLE,
   /* 117:             */      KEYSYM_HOLE,
   /* 118: L16/Help    */      KEYSYM_NOP,
   /* 119: CapsLock    */      KEYSYM_NOP,
   /* 120: Meta_L      */      KEYSYM_CLRMOD | KBMOD_META_L,
   /* 121: SpaceBar    */      KEYSYM_NOP,
   /* 122: Meta_R      */      KEYSYM_CLRMOD | KBMOD_META_R,
   /* 123: T5_PgDn     */      KEYSYM_NOP,
   /* 124:             */      KEYSYM_HOLE,
   /* 125: KP_Add      */      KEYSYM_NOP,
   /* 126:             */      KEYSYM_LAYOUT,  /* layout next */
   /* 127:             */      KEYSYM_RESET,   /* kbd ID next */
};


/*
* This map is used when a control key is down.
*/
#define CTL(c)  ((c)&0x1F)
u_short keymap_control[KEYMAP_SIZE] = {
   /*   0:             */      KEYSYM_HOLE,
   /*   1: L1/Stop     */      KEYSYM_NOP,
   /*   2:             */      KEYSYM_HOLE,
   /*   3: L2/Again    */      KEYSYM_NOP,
   /*   4:             */      KEYSYM_HOLE,
   /*   5: F1          */      KEYSYM_NOP,
   /*   6: F2          */      KEYSYM_NOP,
   /*   7: F10         */      KEYSYM_NOP,
   /*   8: F3          */      KEYSYM_NOP,
   /*   9: F11         */      KEYSYM_NOP,
   /*  10: F4          */      KEYSYM_NOP,
   /*  11: F12         */      KEYSYM_NOP,
   /*  12: F5          */      KEYSYM_NOP,
   /*  13: AltGraph    */      KEYSYM_SETMOD | KBMOD_ALTGRAPH,
   /*  14: F6          */      KEYSYM_NOP,
   /*  15:             */      KEYSYM_HOLE,
   /*  16: F7          */      KEYSYM_NOP,
   /*  17: F8          */      KEYSYM_NOP,
   /*  18: F9          */      KEYSYM_NOP,
   /*  19: Alt_L       */      KEYSYM_SETMOD | KBMOD_ALT_L,
   /*  20: T5_Up       */      KEYSYM_NOP,
   /*  21: R1/Pause    */      KEYSYM_NOP,
   /*  22: R2/Print    */      KEYSYM_NOP,
   /*  23: R3/Break    */      KEYSYM_NOP,
   /*  24: T5_Left     */      KEYSYM_NOP,
   /*  25: L3/Props    */      KEYSYM_NOP,
   /*  26: L4/Undo     */      KEYSYM_NOP,
   /*  27: T5_Down     */      KEYSYM_NOP,
   /*  28: T5_Right    */      KEYSYM_NOP,
   /*  29: Esc         */      0x1b,
   /*  30: 1           */      KEYSYM_NOP,
   /*  31: 2           */      CTL('@'),
   /*  32: 3           */      KEYSYM_NOP,
   /*  33: 4           */      KEYSYM_NOP,
   /*  34: 5           */      KEYSYM_NOP,
   /*  35: 6           */      CTL('^'),
   /*  36: 7           */      KEYSYM_NOP,
   /*  37: 8           */      KEYSYM_NOP,
   /*  38: 9           */      KEYSYM_NOP,
   /*  39: 0           */      KEYSYM_NOP,
   /*  40: minus _     */      CTL('_'),
   /*  41: equal       */      KEYSYM_NOP,
   /*  42: grave/tilde */      CTL('~'),
   /*  43: BackSpace   */      '\b',
   /*  44: T5_Insert   */      KEYSYM_NOP,
   /*  45: R4/KP_Equal */      KEYSYM_NOP,
   /*  46: R5/KP_Div   */      KEYSYM_NOP,
   /*  47: R6/KP_Mult  */      KEYSYM_NOP,
   /*  48:             */      KEYSYM_NOP,
   /*  49: L5/Front    */      KEYSYM_NOP,
   /*  50: KP_Delete   */      KEYSYM_NOP,
   /*  51: L6/Copy     */      KEYSYM_NOP,
   /*  52: T5_Home     */      KEYSYM_NOP,
   /*  53: Tab         */      '\t',
   /*  54: Q           */      CTL('Q'),
   /*  55: W           */      CTL('W'),
   /*  56: E           */      CTL('E'),
   /*  57: R           */      CTL('R'),
   /*  58: T           */      CTL('T'),
   /*  59: Y           */      CTL('Y'),
   /*  60: U           */      CTL('U'),
   /*  61: I           */      CTL('I'),
   /*  62: O           */      CTL('O'),
   /*  63: P           */      CTL('P'),
   /*  64: [           */      CTL('['),
   /*  65: ]           */      CTL(']'),
   /*  66: Delete      */      0x7f,
   /*  67: Compose     */      KEYSYM_COMPOSE,
   /*  68: R7/Home     */      CTL('A'),       /* emacs */
   /*  69: R8/Up       */      CTL('P'),       /* emacs */
   /*  70: R9/PgUp     */      0x80|'v',       /* emacs */
   /*  71: KP_Minus    */      KEYSYM_NOP,
   /*  72: L7/Open     */      KEYSYM_NOP,
   /*  73: L8/Paste    */      KEYSYM_NOP,
   /*  74: T5_End      */      KEYSYM_NOP,
   /*  75:             */      KEYSYM_HOLE,
   /*  76: Ctrl_L      */      KEYSYM_SETMOD | KBMOD_CTRL_L,
   /*  77: A           */      CTL('A'),
   /*  78: S           */      CTL('S'),
   /*  79: D           */      CTL('D'),
   /*  80: F           */      CTL('F'),
   /*  81: G           */      CTL('G'),
   /*  82: H           */      CTL('H'),
   /*  83: J           */      CTL('J'),
   /*  84: K           */      CTL('K'),
   /*  85: L           */      CTL('L'),
   /*  86: ;           */      KEYSYM_NOP,
   /*  87: apostr.     */      KEYSYM_NOP,
   /*  88: backslash   */      CTL('\\'),
   /*  89: Return      */      '\r',
   /*  90: KP_Enter    */      KEYSYM_NOP,
   /*  91: R10/Left    */      CTL('B'),       /* emacs */
   /*  92: R11/KP_5    */      KEYSYM_NOP,
   /*  93: R12/Right   */      CTL('F'),       /* emacs */
   /*  94: KP_Insert   */      KEYSYM_NOP,
   /*  95: L9/Find     */      KEYSYM_NOP,
   /*  96: T5_PgUp     */      KEYSYM_NOP,
   /*  97: L10/Cut     */      KEYSYM_NOP,
   /*  98: Num_Lock    */      KEYSYM_INVMOD | KBMOD_NUMLOCK,
   /*  99: Shift_L     */      KEYSYM_SETMOD | KBMOD_SHIFT_L,
   /* 100: Z           */      CTL('Z'),
   /* 101: X           */      CTL('X'),
   /* 102: C           */      CTL('C'),
   /* 103: V           */      CTL('V'),
   /* 104: B           */      CTL('B'),
   /* 105: N           */      CTL('N'),
   /* 106: M           */      CTL('M'),
   /* 107: ,           */      KEYSYM_NOP,
   /* 108: .           */      KEYSYM_NOP,
   /* 109: / ?         */      CTL('?'),
   /* 110: Shift_R     */      KEYSYM_SETMOD | KBMOD_SHIFT_R,
   /* 111: Linefeed    */      '\n',
   /* 112: R13/End     */      CTL('E'),       /* emacs */
   /* 113: R14/Down    */      CTL('N'),       /* emacs */
   /* 114: R15/PgDn    */      CTL('V'),       /* emacs */
   /* 115:             */      KEYSYM_HOLE,
   /* 116:             */      KEYSYM_HOLE,
   /* 117:             */      KEYSYM_HOLE,
   /* 118: L16/Help    */      KEYSYM_NOP,
   /* 119: CapsLock    */      KEYSYM_INVMOD | KBMOD_CAPSLOCK,
   /* 120: Meta_L      */      KEYSYM_SETMOD | KBMOD_META_L,
   /* 121: SpaceBar    */      CTL(' '),
   /* 122: Meta_R      */      KEYSYM_SETMOD | KBMOD_META_R,
   /* 123: T5_PgDn     */      KEYSYM_NOP,
   /* 124:             */      KEYSYM_HOLE,
   /* 125: KP_Add      */      KEYSYM_NOP,
   /* 126:             */      KEYSYM_HW_ERR,
   /* 127:             */      KEYSYM_ALL_UP,
};
#undef  CTL


/*
* Keymaps for the "type 3" keyboard.
* (lower-case, upper-case)
*/

u_short keymap_s3_lc[KEYMAP_SIZE] = {
   /*   0:             */      KEYSYM_HOLE,
   /*   1: L1/Stop     */      KEYSYM_FUNC_L(1),
   /*   2:             */      KEYSYM_HOLE,
   /*   3: L2/Again    */      KEYSYM_FUNC_L(2),
   /*   4:             */      KEYSYM_HOLE,
   /*   5: F1          */      KEYSYM_FUNC_F(1),
   /*   6: F2          */      KEYSYM_FUNC_F(2),
   /*   7: F10         */      KEYSYM_HOLE,
   /*   8: F3          */      KEYSYM_FUNC_F(3),
   /*   9: F11         */      KEYSYM_HOLE,
   /*  10: F4          */      KEYSYM_FUNC_F(4),
   /*  11: F12         */      KEYSYM_HOLE,
   /*  12: F5          */      KEYSYM_FUNC_F(5),
   /*  13: AltGraph    */      KEYSYM_HOLE,
   /*  14: F6          */      KEYSYM_FUNC_F(6),
   /*  15:             */      KEYSYM_HOLE,
   /*  16: F7          */      KEYSYM_FUNC_F(7),
   /*  17: F8          */      KEYSYM_FUNC_F(8),
   /*  18: F9          */      KEYSYM_FUNC_F(9),
   /*  19: Alt_L       */      KEYSYM_SETMOD | KBMOD_ALT_L,
   /*  20: T5_Up       */      KEYSYM_HOLE,
   /*  21: R1/Pause    */      KEYSYM_FUNC_R(1),
   /*  22: R2/Print    */      KEYSYM_FUNC_R(2),
   /*  23: R3/Break    */      KEYSYM_FUNC_R(3),
   /*  24: T5_Left     */      KEYSYM_HOLE,
   /*  25: L3/Props    */      KEYSYM_FUNC_L(3),
   /*  26: L4/Undo     */      KEYSYM_FUNC_L(4),
   /*  27: T5_Down     */      KEYSYM_HOLE,
   /*  28: T5_Right    */      KEYSYM_HOLE,
   /*  29: Esc         */      0x1b,
   /*  30: 1           */      '1',
   /*  31: 2           */      '2',
   /*  32: 3           */      '3',
   /*  33: 4           */      '4',
   /*  34: 5           */      '5',
   /*  35: 6           */      '6',
   /*  36: 7           */      '7',
   /*  37: 8           */      '8',
   /*  38: 9           */      '9',
   /*  39: 0           */      '0',
   /*  40: minus       */      '-',
   /*  41: equal       */      '=',
   /*  42: grave/tilde */      '`',
   /*  43: BackSpace   */      '\b',
   /*  44:             */      KEYSYM_HOLE,
   /*  45: R4/KP_Equal */      KEYSYM_FUNC_R(4),
   /*  46: R5/KP_Div   */      KEYSYM_FUNC_R(5),
   /*  47: R6/KP_Mult  */      KEYSYM_FUNC_R(6),
   /*  48:             */      KEYSYM_HOLE,
   /*  49: L5/Front    */      KEYSYM_FUNC_L(5),
   /*  50: KP_Delete   */      KEYSYM_HOLE,
   /*  51: L6/Copy     */      KEYSYM_FUNC_L(6),
   /*  52:             */      KEYSYM_HOLE,
   /*  53: Tab         */      '\t',
   /*  54: Q           */      'q',
   /*  55: W           */      'w',
   /*  56: E           */      'e',
   /*  57: R           */      'r',
   /*  58: T           */      't',
   /*  59: Y           */      'y',
   /*  60: U           */      'u',
   /*  61: I           */      'i',
   /*  62: O           */      'o',
   /*  63: P           */      'p',
   /*  64: [           */      '[',
   /*  65: ]           */      ']',
   /*  66: Delete      */      0x7f,
   /*  67: Compose     */      KEYSYM_HOLE,
   /*  68: R7/Home     */      KEYSYM_FUNC_R(7),
   /*  69: R8/Up       */      KEYSYM_FUNC_R(8),
   /*  70: R9/PgUp     */      KEYSYM_FUNC_R(9),
   /*  71: KP_Minus    */      KEYSYM_HOLE,
   /*  72: L7/Open     */      KEYSYM_FUNC_L(7),
   /*  73: L8/Paste    */      KEYSYM_FUNC_L(8),
   /*  74:             */      KEYSYM_HOLE,
   /*  75:             */      KEYSYM_HOLE,
   /*  76: Ctrl_L      */      KEYSYM_SETMOD | KBMOD_CTRL_L,
   /*  77: A           */      'a',
   /*  78: S           */      's',
   /*  79: D           */      'd',
   /*  80: F           */      'f',
   /*  81: G           */      'g',
   /*  82: H           */      'h',
   /*  83: J           */      'j',
   /*  84: K           */      'k',
   /*  85: L           */      'l',
   /*  86: ;           */      ';',
   /*  87: apostr.     */      '\'',
   /*  88: backslash   */      '\\',
   /*  89: Return      */      '\r',
   /*  90: KP_Enter    */      KEYSYM_HOLE,
   /*  91: R10/Left    */      KEYSYM_FUNC_R(10),
   /*  92: R11/KP_5    */      KEYSYM_FUNC_R(11),
   /*  93: R12/Right   */      KEYSYM_FUNC_R(12),
   /*  94: KP_Insert   */      KEYSYM_HOLE,
   /*  95: L9/Find     */      KEYSYM_FUNC_L(9),
   /*  96:             */      KEYSYM_HOLE,
   /*  97: L10/Cut     */      KEYSYM_FUNC_L(10),
   /*  98: Num_Lock    */      KEYSYM_HOLE,
   /*  99: Shift_L     */      KEYSYM_SETMOD | KBMOD_SHIFT_L,
   /* 100: Z           */      'z',
   /* 101: X           */      'x',
   /* 102: C           */      'c',
   /* 103: V           */      'v',
   /* 104: B           */      'b',
   /* 105: N           */      'n',
   /* 106: M           */      'm',
   /* 107: ,           */      ',',
   /* 108: .           */      '.',
   /* 109: /           */      '/',
   /* 110: Shift_R     */      KEYSYM_SETMOD | KBMOD_SHIFT_R,
   /* 111: Linefeed    */      '\n',
   /* 112: R13/End     */      KEYSYM_FUNC_R(13),
   /* 113: R14/Down    */      KEYSYM_FUNC_R(14),
   /* 114: R15/PgDn    */      KEYSYM_FUNC_R(15),
   /* 115:             */      KEYSYM_HOLE,
   /* 116:             */      KEYSYM_HOLE,
   /* 117:             */      KEYSYM_HOLE,
   /* 118: L16/Help    */      KEYSYM_HOLE,
   /* 119: CapsLock    */      KEYSYM_INVMOD | KBMOD_CAPSLOCK,
   /* 120: Meta_L      */      KEYSYM_SETMOD | KBMOD_META_L,
   /* 121: SpaceBar    */      ' ',
   /* 122: Meta_R      */      KEYSYM_SETMOD | KBMOD_META_R,
   /* 123:             */      KEYSYM_HOLE,
   /* 124:             */      KEYSYM_HOLE,
   /* 125: KP_Add      */      KEYSYM_HOLE,
   /* 126:             */      KEYSYM_HW_ERR,
   /* 127:             */      KEYSYM_ALL_UP,
};


u_short keymap_s3_uc[KEYMAP_SIZE] = {
   /*   0:             */      KEYSYM_HOLE,
   /*   1: L1/Stop     */      KEYSYM_FUNC_L(1),
   /*   2:             */      KEYSYM_HOLE,
   /*   3: L2/Again    */      KEYSYM_FUNC_L(2),
   /*   4:             */      KEYSYM_HOLE,
   /*   5: F1          */      KEYSYM_FUNC_F(1),
   /*   6: F2          */      KEYSYM_FUNC_F(2),
   /*   7: F10         */      KEYSYM_HOLE,
   /*   8: F3          */      KEYSYM_FUNC_F(3),
   /*   9: F11         */      KEYSYM_HOLE,
   /*  10: F4          */      KEYSYM_FUNC_F(4),
   /*  11: F12         */      KEYSYM_HOLE,
   /*  12: F5          */      KEYSYM_FUNC_F(5),
   /*  13: AltGraph    */      KEYSYM_HOLE,
   /*  14: F6          */      KEYSYM_FUNC_F(6),
   /*  15:             */      KEYSYM_HOLE,
   /*  16: F7          */      KEYSYM_FUNC_F(7),
   /*  17: F8          */      KEYSYM_FUNC_F(8),
   /*  18: F9          */      KEYSYM_FUNC_F(9),
   /*  19: Alt_L       */      KEYSYM_SETMOD | KBMOD_ALT_L,
   /*  20: T5_Up       */      KEYSYM_HOLE,
   /*  21: R1/Pause    */      KEYSYM_FUNC_R(1),
   /*  22: R2/Print    */      KEYSYM_FUNC_R(2),
   /*  23: R3/Break    */      KEYSYM_FUNC_R(3),
   /*  24: T5_Left     */      KEYSYM_HOLE,
   /*  25: L3/Props    */      KEYSYM_FUNC_L(3),
   /*  26: L4/Undo     */      KEYSYM_FUNC_L(4),
   /*  27: T5_Down     */      KEYSYM_HOLE,
   /*  28: T5_Right    */      KEYSYM_HOLE,
   /*  29: Esc         */      0x1b,
   /*  30: 1           */      '!',
   /*  31: 2           */      '@',
   /*  32: 3           */      '#',
   /*  33: 4           */      '$',
   /*  34: 5           */      '%',
   /*  35: 6           */      '^',
   /*  36: 7           */      '&',
   /*  37: 8           */      '*',
   /*  38: 9           */      '(',
   /*  39: 0           */      ')',
   /*  40: minus       */      '_',
   /*  41: equal       */      '+',
   /*  42: grave/tilde */      '~',
   /*  43: BackSpace   */      '\b',
   /*  44:             */      KEYSYM_HOLE,
   /*  45: R4/KP_Equal */      KEYSYM_FUNC_R(4),
   /*  46: R5/KP_Div   */      KEYSYM_FUNC_R(5),
   /*  47: R6/KP_Mult  */      KEYSYM_FUNC_R(6),
   /*  48:             */      KEYSYM_HOLE,
   /*  49: L5/Front    */      KEYSYM_FUNC_L(5),
   /*  50: KP_Delete   */      KEYSYM_HOLE,
   /*  51: L6/Copy     */      KEYSYM_FUNC_L(6),
   /*  52:             */      KEYSYM_HOLE,
   /*  53: Tab         */      '\t',
   /*  54: Q           */      'Q',
   /*  55: W           */      'W',
   /*  56: E           */      'E',
   /*  57: R           */      'R',
   /*  58: T           */      'T',
   /*  59: Y           */      'Y',
   /*  60: U           */      'U',
   /*  61: I           */      'I',
   /*  62: O           */      'O',
   /*  63: P           */      'P',
   /*  64: [           */      '{',
   /*  65: ]           */      '}',
   /*  66: Delete      */      0x7f,
   /*  67: Compose     */      KEYSYM_HOLE,
   /*  68: R7/Home     */      KEYSYM_FUNC_R(7),
   /*  69: R8/Up       */      KEYSYM_FUNC_R(8),
   /*  70: R9/PgUp     */      KEYSYM_FUNC_R(9),
   /*  71: KP_Minus    */      KEYSYM_HOLE,
   /*  72: L7/Open     */      KEYSYM_FUNC_L(7),
   /*  73: L8/Paste    */      KEYSYM_FUNC_L(8),
   /*  74:             */      KEYSYM_HOLE,
   /*  75:             */      KEYSYM_HOLE,
   /*  76: Ctrl_L      */      KEYSYM_SETMOD | KBMOD_CTRL_L,
   /*  77: A           */      'A',
   /*  78: S           */      'S',
   /*  79: D           */      'D',
   /*  80: F           */      'F',
   /*  81: G           */      'G',
   /*  82: H           */      'H',
   /*  83: J           */      'J',
   /*  84: K           */      'K',
   /*  85: L           */      'L',
   /*  86: ;           */      ':',
   /*  87: apostr.     */      '"',
   /*  88: backslash   */      '|',
   /*  89: Return      */      '\r',
   /*  90: KP_Enter    */      KEYSYM_HOLE,
   /*  91: R10/Left    */      KEYSYM_FUNC_R(10),
   /*  92: R11/KP_5    */      KEYSYM_FUNC_R(11),
   /*  93: R12/Right   */      KEYSYM_FUNC_R(12),
   /*  94: KP_Insert   */      KEYSYM_HOLE,
   /*  95: L9/Find     */      KEYSYM_FUNC_L(9),
   /*  96:             */      KEYSYM_HOLE,
   /*  97: L10/Cut     */      KEYSYM_FUNC_L(10),
   /*  98: Num_Lock    */      KEYSYM_HOLE,
   /*  99: Shift_L     */      KEYSYM_SETMOD | KBMOD_SHIFT_L,
   /* 100: Z           */      'Z',
   /* 101: X           */      'X',
   /* 102: C           */      'C',
   /* 103: V           */      'V',
   /* 104: B           */      'B',
   /* 105: N           */      'N',
   /* 106: M           */      'M',
   /* 107: ,           */      '<',
   /* 108: .           */      '>',
   /* 109: /           */      '?',
   /* 110: Shift_R     */      KEYSYM_SETMOD | KBMOD_SHIFT_R,
   /* 111: Linefeed    */      '\n',
   /* 112: R13/End     */      KEYSYM_FUNC_R(13),
   /* 113: R14/Down    */      KEYSYM_FUNC_R(14),
   /* 114: R15/PgDn    */      KEYSYM_FUNC_R(15),
   /* 115:             */      KEYSYM_HOLE,
   /* 116:             */      KEYSYM_HOLE,
   /* 117:             */      KEYSYM_HOLE,
   /* 118: L16/Help    */      KEYSYM_HOLE,
   /* 119: CapsLock    */      KEYSYM_INVMOD | KBMOD_CAPSLOCK,
   /* 120: Meta_L      */      KEYSYM_SETMOD | KBMOD_META_L,
   /* 121: SpaceBar    */      ' ',
   /* 122: Meta_R      */      KEYSYM_SETMOD | KBMOD_META_R,
   /* 123:             */      KEYSYM_HOLE,
   /* 124:             */      KEYSYM_HOLE,
   /* 125: KP_Add      */      KEYSYM_HOLE,
   /* 126:             */      KEYSYM_HW_ERR,
   /* 127:             */      KEYSYM_ALL_UP,
};


/*
* Keymaps for the "type 4" keyboard.
* (lower-case, upper-case)
*/

u_short keymap_s4_lc[KEYMAP_SIZE] = {
   /*   0:             */      KEYSYM_HOLE,
   /*   1: L1/Stop     */      KEYSYM_FUNC_L(1),
   /*   2:             */      KEYSYM_HOLE,
   /*   3: L2/Again    */      KEYSYM_FUNC_L(2),
   /*   4:             */      KEYSYM_HOLE,
   /*   5: F1          */      KEYSYM_FUNC_F(1),
   /*   6: F2          */      KEYSYM_FUNC_F(2),
   /*   7: F10         */      KEYSYM_FUNC_F(10),
   /*   8: F3          */      KEYSYM_FUNC_F(3),
   /*   9: F11         */      KEYSYM_FUNC_F(11),
   /*  10: F4          */      KEYSYM_FUNC_F(4),
   /*  11: F12         */      KEYSYM_FUNC_F(12),
   /*  12: F5          */      KEYSYM_FUNC_F(5),
   /*  13: AltGraph    */      KEYSYM_SETMOD | KBMOD_ALTGRAPH,
   /*  14: F6          */      KEYSYM_FUNC_F(6),
   /*  15:             */      KEYSYM_HOLE,
   /*  16: F7          */      KEYSYM_FUNC_F(7),
   /*  17: F8          */      KEYSYM_FUNC_F(8),
   /*  18: F9          */      KEYSYM_FUNC_F(9),
   /*  19: Alt_L       */      KEYSYM_SETMOD | KBMOD_ALT_L,
   /*  20: T5_Up       */      KEYSYM_STRING | 1,
   /*  21: R1/Pause    */      KEYSYM_FUNC_R(1),
   /*  22: R2/Print    */      KEYSYM_FUNC_R(2),
   /*  23: R3/Break    */      KEYSYM_FUNC_R(3),
   /*  24: T5_Left     */      KEYSYM_STRING | 3,
   /*  25: L3/Props    */      KEYSYM_FUNC_L(3),
   /*  26: L4/Undo     */      KEYSYM_FUNC_L(4),
   /*  27: T5_Down     */      KEYSYM_STRING | 2,
   /*  28: T5_Right    */      KEYSYM_STRING | 4,
   /*  29: Esc         */      0x1b,
   /*  30: 1           */      '1',
   /*  31: 2           */      '2',
   /*  32: 3           */      '3',
   /*  33: 4           */      '4',
   /*  34: 5           */      '5',
   /*  35: 6           */      '6',
   /*  36: 7           */      '7',
   /*  37: 8           */      '8',
   /*  38: 9           */      '9',
   /*  39: 0           */      '0',
   /*  40: minus       */      '-',
   /*  41: equal       */      '=',
   /*  42: grave/tilde */      '`',
   /*  43: BackSpace   */      '\b',
   /*  44: T5_Insert   */      KEYSYM_FUNC_N(8),
   /*  45: R4/KP_Equal */      KEYSYM_FUNC_R(4),
   /*  46: R5/KP_Div   */      KEYSYM_FUNC_R(5),
   /*  47: R6/KP_Mult  */      KEYSYM_FUNC_R(6),
   /*  48:             */      KEYSYM_FUNC_N(13),
   /*  49: L5/Front    */      KEYSYM_FUNC_L(5),
   /*  50: KP_Delete   */      KEYSYM_FUNC_N(10),
   /*  51: L6/Copy     */      KEYSYM_FUNC_L(6),
   /*  52: T5_Home     */      KEYSYM_FUNC_R(7),
   /*  53: Tab         */      '\t',
   /*  54: Q           */      'q',
   /*  55: W           */      'w',
   /*  56: E           */      'e',
   /*  57: R           */      'r',
   /*  58: T           */      't',
   /*  59: Y           */      'y',
   /*  60: U           */      'u',
   /*  61: I           */      'i',
   /*  62: O           */      'o',
   /*  63: P           */      'p',
   /*  64: [           */      '[',
   /*  65: ]           */      ']',
   /*  66: Delete      */      0x7f,
   /*  67: Compose     */      KEYSYM_COMPOSE,
   /*  68: R7/Home     */      KEYSYM_FUNC_R(7),
   /*  69: R8/Up       */      KEYSYM_FUNC_R(8),
   /*  70: R9/PgUp     */      KEYSYM_FUNC_R(9),
   /*  71: KP_Minus    */      KEYSYM_FUNC_N(15),
   /*  72: L7/Open     */      KEYSYM_FUNC_L(7),
   /*  73: L8/Paste    */      KEYSYM_FUNC_L(8),
   /*  74: T5_End      */      KEYSYM_FUNC_R(13),
   /*  75:             */      KEYSYM_HOLE,
   /*  76: Ctrl_L      */      KEYSYM_SETMOD | KBMOD_CTRL_L,
   /*  77: A           */      'a',
   /*  78: S           */      's',
   /*  79: D           */      'd',
   /*  80: F           */      'f',
   /*  81: G           */      'g',
   /*  82: H           */      'h',
   /*  83: J           */      'j',
   /*  84: K           */      'k',
   /*  85: L           */      'l',
   /*  86: ;           */      ';',
   /*  87: apostr.     */      '\'',
   /*  88: backslash   */      '\\',
   /*  89: Return      */      '\r',
   /*  90: KP_Enter    */      KEYSYM_FUNC_N(11),
   /*  91: R10/Left    */      KEYSYM_FUNC_R(10),
   /*  92: R11/KP_5    */      KEYSYM_FUNC_R(11),
   /*  93: R12/Right   */      KEYSYM_FUNC_R(12),
   /*  94: KP_Insert   */      KEYSYM_FUNC_N(8),
   /*  95: L9/Find     */      KEYSYM_FUNC_L(9),
   /*  96: T5_PgUp     */      KEYSYM_FUNC_R(9),
   /*  97: L10/Cut     */      KEYSYM_FUNC_L(10),
   /*  98: Num_Lock    */      KEYSYM_INVMOD | KBMOD_NUMLOCK,
   /*  99: Shift_L     */      KEYSYM_SETMOD | KBMOD_SHIFT_L,
   /* 100: Z           */      'z',
   /* 101: X           */      'x',
   /* 102: C           */      'c',
   /* 103: V           */      'v',
   /* 104: B           */      'b',
   /* 105: N           */      'n',
   /* 106: M           */      'm',
   /* 107: ,           */      ',',
   /* 108: .           */      '.',
   /* 109: /           */      '/',
   /* 110: Shift_R     */      KEYSYM_SETMOD | KBMOD_SHIFT_R,
   /* 111: Linefeed    */      '\n',
   /* 112: R13/End     */      KEYSYM_FUNC_R(13),
   /* 113: R14/Down    */      KEYSYM_FUNC_R(14),
   /* 114: R15/PgDn    */      KEYSYM_FUNC_R(15),
   /* 115:             */      KEYSYM_HOLE,
   /* 116:             */      KEYSYM_HOLE,
   /* 117:             */      KEYSYM_HOLE,
   /* 118: L16/Help    */      KEYSYM_FUNC_L(16),
   /* 119: CapsLock    */      KEYSYM_INVMOD | KBMOD_CAPSLOCK,
   /* 120: Meta_L      */      KEYSYM_SETMOD | KBMOD_META_L,
   /* 121: SpaceBar    */      ' ',
   /* 122: Meta_R      */      KEYSYM_SETMOD | KBMOD_META_R,
   /* 123: T5_PgDn     */      KEYSYM_FUNC_R(15),
   /* 124:             */      KEYSYM_HOLE,
   /* 125: KP_Add      */      KEYSYM_FUNC_N(14),
   /* 126:             */      KEYSYM_HW_ERR,
   /* 127:             */      KEYSYM_ALL_UP,
};


u_short keymap_s4_uc[KEYMAP_SIZE] = {
   /*   0:             */      KEYSYM_HOLE,
   /*   1: L1/Stop     */      KEYSYM_FUNC_L(1),
   /*   2:             */      KEYSYM_HOLE,
   /*   3: L2/Again    */      KEYSYM_FUNC_L(2),
   /*   4:             */      KEYSYM_HOLE,
   /*   5: F1          */      KEYSYM_FUNC_F(1),
   /*   6: F2          */      KEYSYM_FUNC_F(2),
   /*   7: F10         */      KEYSYM_FUNC_F(10),
   /*   8: F3          */      KEYSYM_FUNC_F(3),
   /*   9: F11         */      KEYSYM_FUNC_F(11),
   /*  10: F4          */      KEYSYM_FUNC_F(4),
   /*  11: F12         */      KEYSYM_FUNC_F(12),
   /*  12: F5          */      KEYSYM_FUNC_F(5),
   /*  13: AltGraph    */      KEYSYM_SETMOD | KBMOD_ALTGRAPH,
   /*  14: F6          */      KEYSYM_FUNC_F(6),
   /*  15:             */      KEYSYM_HOLE,
   /*  16: F7          */      KEYSYM_FUNC_F(7),
   /*  17: F8          */      KEYSYM_FUNC_F(8),
   /*  18: F9          */      KEYSYM_FUNC_F(9),
   /*  19: Alt_L       */      KEYSYM_SETMOD | KBMOD_ALT_L,
   /*  20: T5_Up       */      KEYSYM_STRING | 1,
   /*  21: R1/Pause    */      KEYSYM_FUNC_R(1),
   /*  22: R2/Print    */      KEYSYM_FUNC_R(2),
   /*  23: R3/Break    */      KEYSYM_FUNC_R(3),
   /*  24: T5_Left     */      KEYSYM_STRING | 3,
   /*  25: L3/Props    */      KEYSYM_FUNC_L(3),
   /*  26: L4/Undo     */      KEYSYM_FUNC_L(4),
   /*  27: T5_Down     */      KEYSYM_STRING | 2,
   /*  28: T5_Right    */      KEYSYM_STRING | 4,
   /*  29: Esc         */      0x1b,
   /*  30: 1           */      '!',
   /*  31: 2           */      '@',
   /*  32: 3           */      '#',
   /*  33: 4           */      '$',
   /*  34: 5           */      '%',
   /*  35: 6           */      '^',
   /*  36: 7           */      '&',
   /*  37: 8           */      '*',
   /*  38: 9           */      '(',
   /*  39: 0           */      ')',
   /*  40: minus       */      '_',
   /*  41: equal       */      '+',
   /*  42: grave/tilde */      '~',
   /*  43: BackSpace   */      '\b',
   /*  44: T5_Insert   */      KEYSYM_FUNC_N(8),
   /*  45: R4/KP_Equal */      KEYSYM_FUNC_R(4),
   /*  46: R5/KP_Div   */      KEYSYM_FUNC_R(5),
   /*  47: R6/KP_Mult  */      KEYSYM_FUNC_R(6),
   /*  48:             */      KEYSYM_FUNC_N(13),
   /*  49: L5/Front    */      KEYSYM_FUNC_L(5),
   /*  50: KP_Delete   */      KEYSYM_FUNC_N(10),
   /*  51: L6/Copy     */      KEYSYM_FUNC_L(6),
   /*  52: T5_Home     */      KEYSYM_FUNC_R(7),
   /*  53: Tab         */      '\t',
   /*  54: Q           */      'Q',
   /*  55: W           */      'W',
   /*  56: E           */      'E',
   /*  57: R           */      'R',
   /*  58: T           */      'T',
   /*  59: Y           */      'Y',
   /*  60: U           */      'U',
   /*  61: I           */      'I',
   /*  62: O           */      'O',
   /*  63: P           */      'P',
   /*  64: [           */      '{',
   /*  65: ]           */      '}',
   /*  66: Delete      */      0x7f,
   /*  67: Compose     */      KEYSYM_COMPOSE,
   /*  68: R7/Home     */      KEYSYM_FUNC_R(7),
   /*  69: R8/Up       */      KEYSYM_FUNC_R(8),
   /*  70: R9/PgUp     */      KEYSYM_FUNC_R(9),
   /*  71: KP_Minus    */      KEYSYM_FUNC_N(15),
   /*  72: L7/Open     */      KEYSYM_FUNC_L(7),
   /*  73: L8/Paste    */      KEYSYM_FUNC_L(8),
   /*  74: T5_End      */      KEYSYM_FUNC_R(13),
   /*  75:             */      KEYSYM_HOLE,
   /*  76: Ctrl_L      */      KEYSYM_SETMOD | KBMOD_CTRL_L,
   /*  77: A           */      'A',
   /*  78: S           */      'S',
   /*  79: D           */      'D',
   /*  80: F           */      'F',
   /*  81: G           */      'G',
   /*  82: H           */      'H',
   /*  83: J           */      'J',
   /*  84: K           */      'K',
   /*  85: L           */      'L',
   /*  86: ;           */      ':',
   /*  87: apostr.     */      '"',
   /*  88: backslash   */      '|',
   /*  89: Return      */      '\r',
   /*  90: KP_Enter    */      KEYSYM_FUNC_N(11),
   /*  91: R10/Left    */      KEYSYM_FUNC_R(10),
   /*  92: R11/KP_5    */      KEYSYM_FUNC_R(11),
   /*  93: R12/Right   */      KEYSYM_FUNC_R(12),
   /*  94: KP_Insert   */      KEYSYM_FUNC_N(8),
   /*  95: L9/Find     */      KEYSYM_FUNC_L(9),
   /*  96: T5_PgUp     */      KEYSYM_FUNC_R(9),
   /*  97: L10/Cut     */      KEYSYM_FUNC_L(10),
   /*  98: Num_Lock    */      KEYSYM_INVMOD | KBMOD_NUMLOCK,
   /*  99: Shift_L     */      KEYSYM_SETMOD | KBMOD_SHIFT_L,
   /* 100: Z           */      'Z',
   /* 101: X           */      'X',
   /* 102: C           */      'C',
   /* 103: V           */      'V',
   /* 104: B           */      'B',
   /* 105: N           */      'N',
   /* 106: M           */      'M',
   /* 107: ,           */      '<',
   /* 108: .           */      '>',
   /* 109: /           */      '?',
   /* 110: Shift_R     */      KEYSYM_SETMOD | KBMOD_SHIFT_R,
   /* 111: Linefeed    */      '\n',
   /* 112: R13/End     */      KEYSYM_FUNC_R(13),
   /* 113: R14/Down    */      KEYSYM_FUNC_R(14),
   /* 114: R15/PgDn    */      KEYSYM_FUNC_R(15),
   /* 115:             */      KEYSYM_HOLE,
   /* 116:             */      KEYSYM_HOLE,
   /* 117:             */      KEYSYM_HOLE,
   /* 118: L16/Help    */      KEYSYM_FUNC_L(16),
   /* 119: CapsLock    */      KEYSYM_INVMOD | KBMOD_CAPSLOCK,
   /* 120: Meta_L      */      KEYSYM_SETMOD | KBMOD_META_L,
   /* 121: SpaceBar    */      ' ',
   /* 122: Meta_R      */      KEYSYM_SETMOD | KBMOD_META_R,
   /* 123: T5_PgDn     */      KEYSYM_FUNC_R(15),
   /* 124:             */      KEYSYM_HOLE,
   /* 125: KP_Add      */      KEYSYM_FUNC_N(14),
   /* 126:             */      KEYSYM_HW_ERR,
   /* 127:             */      KEYSYM_ALL_UP,
};



/*
* Strings indexed by:  (KEYSYM_STRING | idx)
*/
char kbd_stringtab[16][10] = {
       { 0x1b, '[', 'H', 0 },  /* 0: Home */
       { 0x1b, '[', 'A', 0 },  /* 1: Up   */
       { 0x1b, '[', 'B', 0 },  /* 2: Down */
       { 0x1b, '[', 'D', 0 },  /* 3: Left */
       { 0x1b, '[', 'C', 0 },  /* 4: Right */
};

/*
* The "NumLock" map, which is used to remap
* function keysyms when NumLock is on.
*/
unsigned short kbd_numlock_map[64] = {
       /* KEYSYM_FUNC_L: Identity map */
       0x600, 0x601, 0x602, 0x603, 0x604, 0x605, 0x606, 0x607,
       0x608, 0x609, 0x60a, 0x60b, 0x60c, 0x60d, 0x60e, 0x60f,

       /* KEYSYM_FUNC_R: remap to numbers... */
       0x610, 0x611, 0x612,
       '=', '/', '*',
       '7', '8', '9',
       '4', '5', '6',
       '1', '2', '3',
       0x61f,

       /* KEYSYM_FUNC_F: Identity map */
       0x620, 0x621, 0x622, 0x623, 0x624, 0x625, 0x626, 0x627,
       0x628, 0x629, 0x62a, 0x62b, 0x62c, 0x62d, 0x62e, 0x62f,

       /* KEYSYM_FUNC_N: remap just a few... */
       0x630, 0x631, 0x632, 0x633, 0x634, 0x635, 0x636,   '0',
       0x638,   '.',  '\r', 0x63b, 0x63c,   '+',   '-', 0x63f,
};


/*
* Keyboard descriptions for each type.
*/

/* Treat type 2 as type 3 (close enough) */
#define kbd_type2 kbd_type3

static struct keyboard kbd_type3 = {
       keymap_release,
       keymap_control,
       keymap_s3_lc,
       keymap_s3_uc,
};

static struct keyboard kbd_type4 = {
       keymap_release,
       keymap_control,
       keymap_s4_lc,
       keymap_s4_uc,
};

/* Treat type 5 as type 4 (close enough) */
#define kbd_type5 kbd_type4

struct keyboard * keyboards[] = {
       0, /* type 0 */
       0, /* type 1 */
       &kbd_type2,
       &kbd_type3,
       &kbd_type4,
       &kbd_type5,
};
int kbd_max_type = 5;