root/usr/src/uts/common/io/keytables.c
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

/*
 * This module contains the translation tables for the up-down encoded
 * Sun keyboards.
 */

#include <sys/param.h>
#include <sys/kbd.h>

/* handy way to define control characters in the tables */
#define c(c_char)       (c_char&0x1F)
#define ESC 0x1B
#define DEL 0x7F


/* Unshifted keyboard table for Type 3 keyboard */

static struct keymap keytab_s3_lc = {
/* BEGIN CSTYLED */
/*  0 */        HOLE,   BUCKYBITS+SYSTEMBIT,
                                HOLE,   LF(2),  HOLE,   TF(1),  TF(2),  HOLE,
/*  8 */        TF(3),  HOLE,   TF(4),  HOLE,   TF(5),  HOLE,   TF(6),  HOLE,
/* 16 */        TF(7),  TF(8),  TF(9),  SHIFTKEYS+ALT,
                                                HOLE,   RF(1),  RF(2),  RF(3),
/* 24 */        HOLE,   LF(3),  LF(4),  HOLE,   HOLE,   ESC,    '1',    '2',
/* 32 */        '3',    '4',    '5',    '6',    '7',    '8',    '9',    '0',
/* 40 */        '-',    '=',    '`',    '\b',   HOLE,   RF(4),  RF(5),  RF(6),
/* 48 */        HOLE,   LF(5),  HOLE,   LF(6),  HOLE,   '\t',   'q',    'w',
/* 56 */        'e',    'r',    't',    'y',    'u',    'i',    'o',    'p',
/* 64 */        '[',    ']',    DEL,    HOLE,   RF(7),  STRING+UPARROW,
                                                                RF(9),  HOLE,
/* 72 */        LF(7),  LF(8),  HOLE,   HOLE,   SHIFTKEYS+LEFTCTRL,
                                                        'a',    's',    'd',
/* 80 */        'f',    'g',    'h',    'j',    'k',    'l',    ';',    '\'',
/* 88 */        '\\',   '\r',   HOLE,   STRING+LEFTARROW,
                                                RF(11), STRING+RIGHTARROW,
                                                                HOLE,   LF(9),
/* 96 */        HOLE,   LF(10), HOLE,   SHIFTKEYS+LEFTSHIFT,
                                                'z',    'x',    'c',    'v',
/*104 */        'b',    'n',    'm',    ',',    '.',    '/',    SHIFTKEYS+RIGHTSHIFT,
                                                                        '\n',
/*112 */        RF(13), STRING+DOWNARROW,
                                RF(15), HOLE,   HOLE,   HOLE,   HOLE,   SHIFTKEYS+CAPSLOCK,
/*120 */        BUCKYBITS+METABIT,
                        ' ',    BUCKYBITS+METABIT,
                                        HOLE,   HOLE,   HOLE,   ERROR,  IDLE,
/* END CSTYLED */
};

/* Shifted keyboard table for Type 3 keyboard */

static struct keymap keytab_s3_uc = {
/* BEGIN CSTYLED */
/*  0 */        HOLE,   BUCKYBITS+SYSTEMBIT,
                                HOLE,   LF(2),  HOLE,   TF(1),  TF(2),  HOLE,
/*  8 */        TF(3),  HOLE,   TF(4),  HOLE,   TF(5),  HOLE,   TF(6),  HOLE,
/* 16 */        TF(7),  TF(8),  TF(9),  SHIFTKEYS+ALT,
                                                HOLE,   RF(1),  RF(2),  RF(3),
/* 24 */        HOLE,   LF(3),  LF(4),  HOLE,   HOLE,   ESC,    '!',    '@',
/* 32 */        '#',    '$',    '%',    '^',    '&',    '*',    '(',    ')',
/* 40 */        '_',    '+',    '~',    '\b',   HOLE,   RF(4),  RF(5),  RF(6),
/* 48 */        HOLE,   LF(5),  HOLE,   LF(6),  HOLE,   '\t',   'Q',    'W',
/* 56 */        'E',    'R',    'T',    'Y',    'U',    'I',    'O',    'P',
/* 64 */        '{',    '}',    DEL,    HOLE,   RF(7),  STRING+UPARROW,
                                                                RF(9),  HOLE,
/* 72 */        LF(7),  LF(8),  HOLE,   HOLE,   SHIFTKEYS+LEFTCTRL,
                                                        'A',    'S',    'D',
/* 80 */        'F',    'G',    'H',    'J',    'K',    'L',    ':',    '"',
/* 88 */        '|',    '\r',   HOLE,   STRING+LEFTARROW,
                                                RF(11), STRING+RIGHTARROW,
                                                                HOLE,   LF(9),
/* 96 */        HOLE,   LF(10), HOLE,   SHIFTKEYS+LEFTSHIFT,
                                                'Z',    'X',    'C',    'V',
/*104 */        'B',    'N',    'M',    '<',    '>',    '?',    SHIFTKEYS+RIGHTSHIFT,
                                                                        '\n',
/*112 */        RF(13), STRING+DOWNARROW,
                                RF(15), HOLE,   HOLE,   HOLE,   HOLE,   SHIFTKEYS+CAPSLOCK,
/*120 */        BUCKYBITS+METABIT,
                        ' ',    BUCKYBITS+METABIT,
                                        HOLE,   HOLE,   HOLE,   ERROR,  IDLE,
/* END CSTYLED */
};

/* Caps Locked keyboard table for Type 3 keyboard */

static struct keymap keytab_s3_cl = {
/* BEGIN CSTYLED */
/*  0 */        HOLE,   BUCKYBITS+SYSTEMBIT,
                                HOLE,   LF(2),  HOLE,   TF(1),  TF(2),  HOLE,
/*  8 */        TF(3),  HOLE,   TF(4),  HOLE,   TF(5),  HOLE,   TF(6),  HOLE,
/* 16 */        TF(7),  TF(8),  TF(9),  SHIFTKEYS+ALT,
                                                HOLE,   RF(1),  RF(2),  RF(3),
/* 24 */        HOLE,   LF(3),  LF(4),  HOLE,   HOLE,   ESC,    '1',    '2',
/* 32 */        '3',    '4',    '5',    '6',    '7',    '8',    '9',    '0',
/* 40 */        '-',    '=',    '`',    '\b',   HOLE,   RF(4),  RF(5),  RF(6),
/* 48 */        HOLE,   LF(5),  HOLE,   LF(6),  HOLE,   '\t',   'Q',    'W',
/* 56 */        'E',    'R',    'T',    'Y',    'U',    'I',    'O',    'P',
/* 64 */        '[',    ']',    DEL,    HOLE,   RF(7),  STRING+UPARROW,
                                                                RF(9),  HOLE,
/* 72 */        LF(7),  LF(8),  HOLE,   HOLE,   SHIFTKEYS+LEFTCTRL,
                                                        'A',    'S',    'D',
/* 80 */        'F',    'G',    'H',    'J',    'K',    'L',    ';',    '\'',
/* 88 */        '\\',   '\r',   HOLE,   STRING+LEFTARROW,
                                                RF(11), STRING+RIGHTARROW,
                                                                HOLE,   LF(9),
/* 96 */        HOLE,   LF(10), HOLE,   SHIFTKEYS+LEFTSHIFT,
                                                'Z',    'X',    'C',    'V',
/*104 */        'B',    'N',    'M',    ',',    '.',    '/',    SHIFTKEYS+RIGHTSHIFT,
                                                                        '\n',
/*112 */        RF(13), STRING+DOWNARROW,
                                RF(15), HOLE,   HOLE,   HOLE,   HOLE,   SHIFTKEYS+CAPSLOCK,
/*120 */        BUCKYBITS+METABIT,
                        ' ',    BUCKYBITS+METABIT,
                                        HOLE,   HOLE,   HOLE,   ERROR,  IDLE,
/* END CSTYLED */
};

/* Controlled keyboard table for Type 3 keyboard */

static struct keymap keytab_s3_ct = {
/* BEGIN CSTYLED */
/*  0 */        HOLE,   BUCKYBITS+SYSTEMBIT,
                                HOLE,   LF(2),  HOLE,   TF(1),  TF(2),  HOLE,
/*  8 */        TF(3),  HOLE,   TF(4),  HOLE,   TF(5),  HOLE,   TF(6),  HOLE,
/* 16 */        TF(7),  TF(8),  TF(9),  SHIFTKEYS+ALT,
                                                HOLE,   RF(1),  RF(2),  RF(3),
/* 24 */        HOLE,   LF(3),  LF(4),  HOLE,   HOLE,   ESC,    '1',    c('@'),
/* 32 */        '3',    '4',    '5',    c('^'), '7',    '8',    '9',    '0',
/* 40 */        c('_'), '=',    c('^'), '\b',   HOLE,   RF(4),  RF(5),  RF(6),
/* 48 */        HOLE,   LF(5),  HOLE,   LF(6),  HOLE,   '\t',   c('q'), c('w'),
/* 56 */        c('e'), c('r'), c('t'), c('y'), c('u'), c('i'), c('o'), c('p'),
/* 64 */        c('['), c(']'), DEL,    HOLE,   RF(7),  STRING+UPARROW,
                                                                RF(9),  HOLE,
/* 72 */        LF(7),  LF(8),  HOLE,   HOLE,   SHIFTKEYS+LEFTCTRL,
                                                        c('a'), c('s'), c('d'),
/* 80 */        c('f'), c('g'), c('h'), c('j'), c('k'), c('l'), ';',    '\'',
/* 88 */        c('\\'),
                        '\r',   HOLE,   STRING+LEFTARROW,
                                                RF(11), STRING+RIGHTARROW,
                                                                HOLE,   LF(9),
/* 96 */        HOLE,   LF(10), HOLE,   SHIFTKEYS+LEFTSHIFT,
                                                c('z'), c('x'), c('c'), c('v'),
/*104 */        c('b'), c('n'), c('m'), ',',    '.',    c('_'), SHIFTKEYS+RIGHTSHIFT,
                                                                        '\n',
/*112 */        RF(13), STRING+DOWNARROW,
                                RF(15), HOLE,   HOLE,   HOLE,   HOLE,   SHIFTKEYS+CAPSLOCK,
/*120 */        BUCKYBITS+METABIT,
                        c(' '), BUCKYBITS+METABIT,
                                        HOLE,   HOLE,   HOLE,   ERROR,  IDLE,
/* END CSTYLED */
};

/* "Key Up" keyboard table for Type 3 keyboard */

static struct keymap keytab_s3_up = {
/* BEGIN CSTYLED */
/*  0 */        HOLE,   BUCKYBITS+SYSTEMBIT,
                                HOLE,   NOP,    HOLE,   NOP,    NOP,    HOLE,
/*  8 */        NOP,    HOLE,   NOP,    HOLE,   NOP,    HOLE,   NOP,    HOLE,
/* 16 */        NOP,    NOP,    NOP,    SHIFTKEYS+ALT,
                                                HOLE,   NOP,    NOP,    NOP,
/* 24 */        HOLE,   NOP,    NOP,    HOLE,   HOLE,   NOP,    NOP,    NOP,
/* 32 */        NOP,    NOP,    NOP,    NOP,    NOP,    NOP,    NOP,    NOP,
/* 40 */        NOP,    NOP,    NOP,    NOP,    HOLE,   NOP,    NOP,    NOP,
/* 48 */        HOLE,   NOP,    HOLE,   NOP,    HOLE,   NOP,    NOP,    NOP,
/* 56 */        NOP,    NOP,    NOP,    NOP,    NOP,    NOP,    NOP,    NOP,
/* 64 */        NOP,    NOP,    NOP,    HOLE,   NOP,    NOP,    NOP,    HOLE,
/* 72 */        NOP,    NOP,    HOLE,   HOLE,   SHIFTKEYS+LEFTCTRL,
                                                        NOP,    NOP,    NOP,
/* 80 */        NOP,    NOP,    NOP,    NOP,    NOP,    NOP,    NOP,    NOP,
/* 88 */        NOP,    NOP,    HOLE,   NOP,    NOP,    NOP,    HOLE,   NOP,
/* 96 */        HOLE,   NOP,    HOLE,   SHIFTKEYS+LEFTSHIFT,
                                                NOP,    NOP,    NOP,    NOP,
/*104 */        NOP,    NOP,    NOP,    NOP,    NOP,    NOP,    SHIFTKEYS+RIGHTSHIFT,
                                                                        NOP,
/*112 */        NOP,    NOP,    NOP,    HOLE,   HOLE,   HOLE,   HOLE,   NOP,
/*120 */        BUCKYBITS+METABIT,
                        NOP,    BUCKYBITS+METABIT,
                                        HOLE,   HOLE,   HOLE,   HOLE,   RESET,
/* END CSTYLED */
};

/* Index to keymaps for Type 3 keyboard */
static struct keyboard keyindex_s3 = {
        &keytab_s3_lc,
        &keytab_s3_uc,
        &keytab_s3_cl,
        0,              /* no Alt Graph key, no Alt Graph table */
        0,              /* no Num Lock key, no Num Lock table */
        &keytab_s3_ct,
        &keytab_s3_up,
        0x0000,         /* Shift bits which stay on with idle keyboard */
        0x0000,         /* Bucky bits which stay on with idle keyboard */
        1, 0,   77,     /* abort keys */
        CAPSMASK,       /* Shift bits which toggle on down event */
        NULL,
        99, 110, 21,    /* New abort keys */
};


/* Unshifted keyboard table for Type 4 keyboard */

static struct keymap keytab_s4_lc = {
/* BEGIN CSTYLED */
/*  0 */        HOLE,   BUCKYBITS+SYSTEMBIT,
                                HOLE,   LF(2),  HOLE,   TF(1),  TF(2),  TF(10),
/*  8 */        TF(3),  TF(11), TF(4),  TF(12), TF(5),  SHIFTKEYS+ALTGRAPH,
                                                                TF(6),  HOLE,
/* 16 */        TF(7),  TF(8),  TF(9),  SHIFTKEYS+ALT,
                                                HOLE,   RF(1),  RF(2),  RF(3),
/* 24 */        HOLE,   LF(3),  LF(4),  HOLE,   HOLE,   ESC,    '1',    '2',
/* 32 */        '3',    '4',    '5',    '6',    '7',    '8',    '9',    '0',
/* 40 */        '-',    '=',    '`',    '\b',   HOLE,   RF(4),  RF(5),  RF(6),
/* 48 */        BF(13), LF(5),  BF(10), LF(6),  HOLE,   '\t',   'q',    'w',
/* 56 */        'e',    'r',    't',    'y',    'u',    'i',    'o',    'p',
/* 64 */        '[',    ']',    DEL,    COMPOSE,
                                                RF(7),  STRING+UPARROW,
                                                                RF(9),  BF(15),
/* 72 */        LF(7),  LF(8),  HOLE,   HOLE,   SHIFTKEYS+LEFTCTRL,
                                                        'a',    's',    'd',
/* 80 */        'f',    'g',    'h',    'j',    'k',    'l',    ';',    '\'',
/* 88 */        '\\',   '\r',   BF(11), STRING+LEFTARROW,
                                                RF(11), STRING+RIGHTARROW,
                                                                BF(8),  LF(9),
/* 96 */        HOLE,   LF(10), SHIFTKEYS+NUMLOCK,
                                        SHIFTKEYS+LEFTSHIFT,
                                                'z',    'x',    'c',    'v',
/*104 */        'b',    'n',    'm',    ',',    '.',    '/',    SHIFTKEYS+RIGHTSHIFT,
                                                                        '\n',
/*112 */        RF(13), STRING+DOWNARROW,
                                RF(15), HOLE,   HOLE,   HOLE,   LF(16), SHIFTKEYS+CAPSLOCK,
/*120 */        BUCKYBITS+METABIT,
                        ' ',    BUCKYBITS+METABIT,
                                        HOLE,   HOLE,   BF(14), ERROR,  IDLE,
/* END CSTYLED */
};

/* Shifted keyboard table for Type 4 keyboard */

static struct keymap keytab_s4_uc = {
/* BEGIN CSTYLED */
/*  0 */        HOLE,   BUCKYBITS+SYSTEMBIT,
                                HOLE,   LF(2),  HOLE,   TF(1),  TF(2),  TF(10),
/*  8 */        TF(3),  TF(11), TF(4),  TF(12), TF(5),  SHIFTKEYS+ALTGRAPH,
                                                                TF(6),  HOLE,
/* 16 */        TF(7),  TF(8),  TF(9),  SHIFTKEYS+ALT,
                                                HOLE,   RF(1),  RF(2),  RF(3),
/* 24 */        HOLE,   LF(3),  LF(4),  HOLE,   HOLE,   ESC,    '!',    '@',
/* 32 */        '#',    '$',    '%',    '^',    '&',    '*',    '(',    ')',
/* 40 */        '_',    '+',    '~',    '\b',   HOLE,   RF(4),  RF(5),  RF(6),
/* 48 */        BF(13), LF(5),  BF(10), LF(6),  HOLE,   '\t',   'Q',    'W',
/* 56 */        'E',    'R',    'T',    'Y',    'U',    'I',    'O',    'P',
/* 64 */        '{',    '}',    DEL,    COMPOSE,
                                                RF(7),  STRING+UPARROW,
                                                                RF(9),  BF(15),
/* 72 */        LF(7),  LF(8),  HOLE,   HOLE,   SHIFTKEYS+LEFTCTRL,
                                                        'A',    'S',    'D',
/* 80 */        'F',    'G',    'H',    'J',    'K',    'L',    ':',    '"',
/* 88 */        '|',    '\r',   BF(11), STRING+LEFTARROW,
                                                RF(11), STRING+RIGHTARROW,
                                                                BF(8),  LF(9),
/* 96 */        HOLE,   LF(10), SHIFTKEYS+NUMLOCK,
                                        SHIFTKEYS+LEFTSHIFT,
                                                'Z',    'X',    'C',    'V',
/*104 */        'B',    'N',    'M',    '<',    '>',    '?',    SHIFTKEYS+RIGHTSHIFT,
                                                                        '\n',
/*112 */        RF(13), STRING+DOWNARROW,
                                RF(15), HOLE,   HOLE,   HOLE,   LF(16), SHIFTKEYS+CAPSLOCK,
/*120 */        BUCKYBITS+METABIT,
                        ' ',    BUCKYBITS+METABIT,
                                        HOLE,   HOLE,   BF(14), ERROR,  IDLE,
/* END CSTYLED */
};

/* Caps Locked keyboard table for Type 4 keyboard */

static struct keymap keytab_s4_cl = {
/* BEGIN CSTYLED */
/*  0 */        HOLE,   BUCKYBITS+SYSTEMBIT,
                                HOLE,   LF(2),  HOLE,   TF(1),  TF(2),  TF(10),
/*  8 */        TF(3),  TF(11), TF(4),  TF(12), TF(5),  SHIFTKEYS+ALTGRAPH,
                                                                TF(6),  HOLE,
/* 16 */        TF(7),  TF(8),  TF(9),  SHIFTKEYS+ALT,
                                                HOLE,   RF(1),  RF(2),  RF(3),
/* 24 */        HOLE,   LF(3),  LF(4),  HOLE,   HOLE,   ESC,    '1',    '2',
/* 32 */        '3',    '4',    '5',    '6',    '7',    '8',    '9',    '0',
/* 40 */        '-',    '=',    '`',    '\b',   HOLE,   RF(4),  RF(5),  RF(6),
/* 48 */        BF(13), LF(5),  BF(10), LF(6),  HOLE,   '\t',   'Q',    'W',
/* 56 */        'E',    'R',    'T',    'Y',    'U',    'I',    'O',    'P',
/* 64 */        '[',    ']',    DEL,    COMPOSE,
                                                RF(7),  STRING+UPARROW,
                                                                RF(9),  BF(15),
/* 72 */        LF(7),  LF(8),  HOLE,   HOLE,   SHIFTKEYS+LEFTCTRL,
                                                        'A',    'S',    'D',
/* 80 */        'F',    'G',    'H',    'J',    'K',    'L',    ';',    '\'',
/* 88 */        '\\',   '\r',   BF(11), STRING+LEFTARROW,
                                                RF(11), STRING+RIGHTARROW,
                                                                BF(8),  LF(9),
/* 96 */        HOLE,   LF(10), SHIFTKEYS+NUMLOCK,
                                        SHIFTKEYS+LEFTSHIFT,
                                                'Z',    'X',    'C',    'V',
/*104 */        'B',    'N',    'M',    ',',    '.',    '/',    SHIFTKEYS+RIGHTSHIFT,
                                                                        '\n',
/*112 */        RF(13), STRING+DOWNARROW,
                                RF(15), HOLE,   HOLE,   HOLE,   LF(16), SHIFTKEYS+CAPSLOCK,
/*120 */        BUCKYBITS+METABIT,
                        ' ',    BUCKYBITS+METABIT,
                                        HOLE,   HOLE,   BF(14), ERROR,  IDLE,
/* END CSTYLED */
};

/* Alt Graph keyboard table for Type 4 keyboard */

static struct keymap keytab_s4_ag = {
/* BEGIN CSTYLED */
/*  0 */        HOLE,   BUCKYBITS+SYSTEMBIT,
                                HOLE,   LF(2),  HOLE,   TF(1),  TF(2),  TF(10),
/*  8 */        TF(3),  TF(11), TF(4),  TF(12), TF(5),  SHIFTKEYS+ALTGRAPH,
                                                                TF(6),  HOLE,
/* 16 */        TF(7),  TF(8),  TF(9),  SHIFTKEYS+ALT,
                                                HOLE,   RF(1),  RF(2),  RF(3),
/* 24 */        HOLE,   LF(3),  LF(4),  HOLE,   HOLE,   ESC,    NOP,    NOP,
/* 32 */        NOP,    NOP,    NOP,    NOP,    NOP,    NOP,    NOP,    NOP,
/* 40 */        NOP,    NOP,    NOP,    '\b',   HOLE,   RF(4),  RF(5),  RF(6),
/* 48 */        BF(13), LF(5),  BF(10), LF(6),  HOLE,   '\t',   NOP,    NOP,
/* 56 */        NOP,    NOP,    NOP,    NOP,    NOP,    NOP,    NOP,    NOP,
/* 64 */        NOP,    NOP,    DEL,    COMPOSE,
                                                RF(7),  STRING+UPARROW,
                                                                RF(9),  BF(15),
/* 72 */        LF(7),  LF(8),  HOLE,   HOLE,   SHIFTKEYS+LEFTCTRL,
                                                        NOP,    NOP,    NOP,
/* 80 */        NOP,    NOP,    NOP,    NOP,    NOP,    NOP,    NOP,    NOP,
/* 88 */        NOP,    '\r',   BF(11), STRING+LEFTARROW,
                                                RF(11), STRING+RIGHTARROW,
                                                                BF(8),  LF(9),
/* 96 */        HOLE,   LF(10), SHIFTKEYS+NUMLOCK,
                                        SHIFTKEYS+LEFTSHIFT,
                                                NOP,    NOP,    NOP,    NOP,
/*104 */        NOP,    NOP,    NOP,    NOP,    NOP,    NOP,    SHIFTKEYS+RIGHTSHIFT,
                                                                        '\n',
/*112 */        RF(13), STRING+DOWNARROW,
                                RF(15), HOLE,   HOLE,   HOLE,   LF(16), SHIFTKEYS+CAPSLOCK,
/*120 */        BUCKYBITS+METABIT,
                        ' ',    BUCKYBITS+METABIT,
                                        HOLE,   HOLE,   BF(14), ERROR,  IDLE,
/* END CSTYLED */
};

/* Num Locked keyboard table for Type 4 keyboard */

static struct keymap keytab_s4_nl = {
/* BEGIN CSTYLED */
/*  0 */        HOLE,   NONL,   HOLE,   NONL,   HOLE,   NONL,   NONL,   NONL,
/*  8 */        NONL,   NONL,   NONL,   NONL,   NONL,   NONL,   NONL,   HOLE,
/* 16 */        NONL,   NONL,   NONL,   NONL,   HOLE,   NONL,   NONL,   NONL,
/* 24 */        HOLE,   NONL,   NONL,   HOLE,   HOLE,   NONL,   NONL,   NONL,
/* 32 */        NONL,   NONL,   NONL,   NONL,   NONL,   NONL,   NONL,   NONL,
/* 40 */        NONL,   NONL,   NONL,   NONL,   HOLE,   PADEQUAL,
                                                                PADSLASH,
                                                                        PADSTAR,
/* 48 */        NONL,   NONL,   PADDOT, NONL,   HOLE,   NONL,   NONL,   NONL,
/* 56 */        NONL,   NONL,   NONL,   NONL,   NONL,   NONL,   NONL,   NONL,
/* 64 */        NONL,   NONL,   NONL,   NONL,
                                                PAD7,   PAD8,   PAD9,   PADMINUS,
/* 72 */        NONL,   NONL,   HOLE,   HOLE,   NONL,   NONL,   NONL,   NONL,
/* 80 */        NONL,   NONL,   NONL,   NONL,   NONL,   NONL,   NONL,   NONL,
/* 88 */        NONL,   NONL,   PADENTER,
                                        PAD4,   PAD5,   PAD6,   PAD0,   NONL,
/* 96 */        HOLE,   NONL,   NONL,   NONL,   NONL,   NONL,   NONL,   NONL,
/*104 */        NONL,   NONL,   NONL,   NONL,   NONL,   NONL,   NONL,
                                                                        NONL,
/*112 */        PAD1,   PAD2,   PAD3,   HOLE,   HOLE,   HOLE,   NONL,   NONL,
/*120 */        NONL,   NONL,   NONL,   HOLE,   HOLE,   PADPLUS,
                                                                ERROR,  IDLE,
/* END CSTYLED */
};

/* Controlled keyboard table for Type 4 keyboard */

static struct keymap keytab_s4_ct = {
/* BEGIN CSTYLED */
/*  0 */        HOLE,   BUCKYBITS+SYSTEMBIT,
                                HOLE,   LF(2),  HOLE,   TF(1),  TF(2),  TF(10),
/*  8 */        TF(3),  TF(11), TF(4),  TF(12), TF(5),  SHIFTKEYS+ALTGRAPH,
                                                                TF(6),  HOLE,
/* 16 */        TF(7),  TF(8),  TF(9),  SHIFTKEYS+ALT,
                                                HOLE,   RF(1),  RF(2),  RF(3),
/* 24 */        HOLE,   LF(3),  LF(4),  HOLE,   HOLE,   ESC,    '1',    c('@'),
/* 32 */        '3',    '4',    '5',    c('^'), '7',    '8',    '9',    '0',
/* 40 */        c('_'), '=',    c('^'), '\b',   HOLE,   RF(4),  RF(5),  RF(6),
/* 48 */        BF(13), LF(5),  BF(10), LF(6),  HOLE,   '\t',   c('q'), c('w'),
/* 56 */        c('e'), c('r'), c('t'), c('y'), c('u'), c('i'), c('o'), c('p'),
/* 64 */        c('['), c(']'), DEL,    COMPOSE,
                                                RF(7),  STRING+UPARROW,
                                                                RF(9),  BF(15),
/* 72 */        LF(7),  LF(8),  HOLE,   HOLE,   SHIFTKEYS+LEFTCTRL,
                                                        c('a'), c('s'), c('d'),
/* 80 */        c('f'), c('g'), c('h'), c('j'), c('k'), c('l'), ';',    '\'',
/* 88 */        c('\\'),
                        '\r',   BF(11), STRING+LEFTARROW,
                                                RF(11), STRING+RIGHTARROW,
                                                                BF(8),  LF(9),
/* 96 */        HOLE,   LF(10), SHIFTKEYS+NUMLOCK,
                                        SHIFTKEYS+LEFTSHIFT,
                                                c('z'), c('x'), c('c'), c('v'),
/*104 */        c('b'), c('n'), c('m'), ',',    '.',    c('_'), SHIFTKEYS+RIGHTSHIFT,
                                                                        '\n',
/*112 */        RF(13), STRING+DOWNARROW,
                                RF(15), HOLE,   HOLE,   HOLE,   LF(16), SHIFTKEYS+CAPSLOCK,
/*120 */        BUCKYBITS+METABIT,
                        c(' '), BUCKYBITS+METABIT,
                                        HOLE,   HOLE,   BF(14), ERROR,  IDLE,
/* END CSTYLED */
};

/* "Key Up" keyboard table for Type 4 keyboard */

static struct keymap keytab_s4_up = {
/* BEGIN CSTYLED */
/*  0 */        HOLE,   BUCKYBITS+SYSTEMBIT,
                                HOLE,   NOP,    HOLE,   NOP,    NOP,    NOP,
/*  8 */        NOP,    NOP,    NOP,    NOP,    NOP,    SHIFTKEYS+ALTGRAPH,
                                                                NOP,    HOLE,
/* 16 */        NOP,    NOP,    NOP,    SHIFTKEYS+ALT,
                                                HOLE,   NOP,    NOP,    NOP,
/* 24 */        HOLE,   NOP,    NOP,    HOLE,   HOLE,   NOP,    NOP,    NOP,
/* 32 */        NOP,    NOP,    NOP,    NOP,    NOP,    NOP,    NOP,    NOP,
/* 40 */        NOP,    NOP,    NOP,    NOP,    HOLE,   NOP,    NOP,    NOP,
/* 48 */        NOP,    NOP,    NOP,    NOP,    HOLE,   NOP,    NOP,    NOP,
/* 56 */        NOP,    NOP,    NOP,    NOP,    NOP,    NOP,    NOP,    NOP,
/* 64 */        NOP,    NOP,    NOP,    NOP,    NOP,    NOP,    NOP,    NOP,
/* 72 */        NOP,    NOP,    HOLE,   HOLE,   SHIFTKEYS+LEFTCTRL,
                                                        NOP,    NOP,    NOP,
/* 80 */        NOP,    NOP,    NOP,    NOP,    NOP,    NOP,    NOP,    NOP,
/* 88 */        NOP,    NOP,    NOP,    NOP,    NOP,    NOP,    NOP,    NOP,
/* 96 */        HOLE,   NOP,    NOP,
                                        SHIFTKEYS+LEFTSHIFT,
                                                NOP,    NOP,    NOP,    NOP,
/*104 */        NOP,    NOP,    NOP,    NOP,    NOP,    NOP,    SHIFTKEYS+RIGHTSHIFT,
                                                                        NOP,
/*112 */        NOP,    NOP,    NOP,    HOLE,   HOLE,   HOLE,   NOP,    NOP,
/*120 */        BUCKYBITS+METABIT,
                        NOP,    BUCKYBITS+METABIT,
                                        HOLE,   HOLE,   NOP,    HOLE,   RESET,
/* END CSTYLED */
};

/* Index to keymaps for Type 4 keyboard */
static struct keyboard keyindex_s4 = {
        &keytab_s4_lc,
        &keytab_s4_uc,
        &keytab_s4_cl,
        &keytab_s4_ag,
        &keytab_s4_nl,
        &keytab_s4_ct,
        &keytab_s4_up,
        0x0000,         /* Shift bits which stay on with idle keyboard */
        0x0000,         /* Bucky bits which stay on with idle keyboard */
        1, 0,   77,     /* abort keys */
        CAPSMASK|NUMLOCKMASK,   /* Shift bits which toggle on down event */
        NULL,
        99, 110, 21,    /* New abort keys */
};


/*
 * Index table for the whole shebang
 * The first entry is used as the default if the id isn't recognized.
 */
struct keyboards keytables[] = {
        KB_SUN3,        &keyindex_s3,
        KB_SUN4,        &keyindex_s4,
        0,              NULL,
};

/*
 * Keyboard String Table
 *
 * This defines the strings sent by various keys (as selected in the
 * tables above).
 * The first byte of each string is its length, the rest is data.
 */

#ifdef  __STDC__
/*
 * XXX  This is here to silence compiler warnings. The non-ansi-c form
 *      is retained if somebody can figure out how to replicate it in
 *      ansi-c.
 */
char keystringtab[16][KTAB_STRLEN] = {
        { '\033', '[', 'H', '\0' },     /* home */
        { '\033', '[', 'A', '\0' },     /* up */
        { '\033', '[', 'B', '\0' },     /* down */
        { '\033', '[', 'D', '\0' },     /* left */
        { '\033', '[', 'C', '\0' },     /* right */
};
#else   /* __STDC__ */
#define kstescinit(c)   {'\033', '[', 'c', '\0'}
char keystringtab[16][KTAB_STRLEN] = {
        kstescinit(H) /* home */,
        kstescinit(A) /* up */,
        kstescinit(B) /* down */,
        kstescinit(D) /* left */,
        kstescinit(C) /* right */,
};
#endif  /* __STDC__ */


/*
 * Compose Key Sequence Table
 *
 * Taken from Suncompose.h of openwindows.
 *
 * The idea here is to create a simple index into a table of
 * compose key sequences.  The purpose is to provide a fast
 * lookup mechanism using as little space as possible (while
 * still using a table of triplets).
 *
 * For reference, here is the set of all composable characters:
 * SP !\"\'*+,-./01234:<>?ACDEHILNOPRSTUXY\\^_`acdehilnoprstuxy|~
 *
 * if ascii_char[i] is not composable,
 *      kb_compose_map[i] is -1
 * else
 *      if ascii_char[i] appears as a first char in compose_table,
 *              kb_compose_map[i] is the index of it's first appearance
 *      else
 *              kb_compose_map[i] is 112        (end of table)
 */

signed char kb_compose_map[ASCII_SET_SIZE] = {
/* BEGIN CSTYLED */
         -1,    /* 000 (^@) */
         -1,    /* 001 (^A) */
         -1,    /* 002 (^B) */
         -1,    /* 003 (^C) */
         -1,    /* 004 (^D) */
         -1,    /* 005 (^E) */
         -1,    /* 006 (^F) */
         -1,    /* 007 (^G) */
         -1,    /* 008 (^H) */
         -1,    /* 009 (^I) */
         -1,    /* 010 (^J) */
         -1,    /* 011 (^K) */
         -1,    /* 012 (^L) */
         -1,    /* 013 (^M) */
         -1,    /* 014 (^N) */
         -1,    /* 015 (^O) */
         -1,    /* 016 (^P) */
         -1,    /* 017 (^Q) */
         -1,    /* 018 (^R) */
         -1,    /* 019 (^S) */
         -1,    /* 020 (^T) */
         -1,    /* 021 (^U) */
         -1,    /* 022 (^V) */
         -1,    /* 023 (^W) */
         -1,    /* 024 (^X) */
         -1,    /* 025 (^Y) */
         -1,    /* 026 (^Z) */
         -1,    /* 027 (^[) */
         -1,    /* 028 (^\) */
         -1,    /* 029 (^]) */
         -1,    /* 030 (^^) */
         -1,    /* 031 (^_) */
          0,    /* 032 (SP) */
          1,    /* 033 (!) */
          4,    /* 034 (") */
         -1,    /* 035 (#) */
         -1,    /* 036 ($) */
         -1,    /* 037 (%) */
         -1,    /* 038 (&) */
         16,    /* 039 (') */
         -1,    /* 040 (() */
         -1,    /* 041 ()) */
         28,    /* 042 (*) */
         31,    /* 043 (+) */
         32,    /* 044 (,) */
         36,    /* 045 (-) */
         48,    /* 046 (.) */
         49,    /* 047 (/) */
         54,    /* 048 (0) */
         57,    /* 049 (1) */
         60,    /* 050 (2) */
         61,    /* 051 (3) */
        112,    /* 052 (4) */
         -1,    /* 053 (5) */
         -1,    /* 054 (6) */
         -1,    /* 055 (7) */
         -1,    /* 056 (8) */
         -1,    /* 057 (9) */
        112,    /* 058 (:) */
         -1,    /* 059 (;) */
         63,    /* 060 (<) */
         -1,    /* 061 (=) */
         64,    /* 062 (>) */
         65,    /* 063 (?) */
         -1,    /* 064 (@) */
         66,    /* 065 (A) */
         -1,    /* 066 (B) */
         70,    /* 067 (C) */
        112,    /* 068 (D) */
         71,    /* 069 (E) */
         -1,    /* 070 (F) */
         -1,    /* 071 (G) */
         73,    /* 072 (H) */
         74,    /* 073 (I) */
         -1,    /* 074 (J) */
         -1,    /* 075 (K) */
        112,    /* 076 (L) */
         -1,    /* 077 (M) */
         76,    /* 078 (N) */
         77,    /* 079 (O) */
         84,    /* 080 (P) */
         -1,    /* 081 (Q) */
        112,    /* 082 (R) */
        112,    /* 083 (S) */
        112,    /* 084 (T) */
         85,    /* 085 (U) */
         -1,    /* 086 (V) */
         -1,    /* 087 (W) */
        112,    /* 088 (X) */
        112,    /* 089 (Y) */
         -1,    /* 090 (Z) */
         -1,    /* 091 ([) */
         87,    /* 092 (\) */
         -1,    /* 093 (]) */
         88,    /* 094 (^) */
         93,    /* 095 (_) */
         94,    /* 096 (`) */
         99,    /* 097 (a) */
         -1,    /* 098 (b) */
        101,    /* 099 (c) */
        112,    /* 100 (d) */
        112,    /* 101 (e) */
         -1,    /* 102 (f) */
         -1,    /* 103 (g) */
        102,    /* 104 (h) */
        112,    /* 105 (i) */
         -1,    /* 106 (j) */
         -1,    /* 107 (k) */
        112,    /* 108 (l) */
         -1,    /* 109 (m) */
        103,    /* 110 (n) */
        104,    /* 111 (o) */
        108,    /* 112 (p) */
         -1,    /* 113 (q) */
        112,    /* 114 (r) */
        109,    /* 115 (s) */
        112,    /* 116 (t) */
        112,    /* 117 (u) */
         -1,    /* 118 (v) */
         -1,    /* 119 (w) */
        110,    /* 120 (x) */
        112,    /* 121 (y) */
         -1,    /* 122 (z) */
         -1,    /* 123 ({) */
        111,    /* 124 (|) */
         -1,    /* 125 (}) */
        112,    /* 126 (~) */
         -1,    /* 127 (DEL) */
/* END CSTYLED */
};

/*
 * IMPORTANT NOTE:  This table MUST be kept in proper sorted order:
 *      The first and second characters in each entry must be in ASCII
 *          collating sequence (left to right).
 *      The table must be in ASCII collating sequence by first character
 *          (top to bottom).
 */

/* COMPOSE + first character + second character => ISO character */

struct compose_sequence_t kb_compose_table[] = {

/* BEGIN CSTYLED */
        {' ', ' ', 0xA0},       /* 000 */       /* NBSP (non-breaking space) */
        {'!', '!', 0xA1},       /* 001 */       /* inverted ! */
        {'!', 'P', 0xB6},       /* 002 */       /* paragraph mark */
        {'!', 'p', 0xB6},       /* 003 */       /* paragraph mark */
        {'"', '"', 0xA8},       /* 004 */       /* diaresis */
        {'"', 'A', 0xC4},       /* 005 */       /* A with diaresis */
        {'"', 'E', 0xCB},       /* 006 */       /* E with diaresis */
        {'"', 'I', 0xCF},       /* 007 */       /* I with diaresis */
        {'"', 'O', 0xD6},       /* 008 */       /* O with diaresis */
        {'"', 'U', 0xDC},       /* 009 */       /* U with diaresis */
        {'"', 'a', 0xE4},       /* 010 */       /* a with diaresis */
        {'"', 'e', 0xEB},       /* 011 */       /* e with diaresis */
        {'"', 'i', 0xEF},       /* 012 */       /* i with diaresis */
        {'"', 'o', 0xF6},       /* 013 */       /* o with diaresis */
        {'"', 'u', 0xFC},       /* 014 */       /* u with diaresis */
        {'"', 'y', 0xFF},       /* 015 */       /* y with diaresis */
        {'\'','A', 0xC1},       /* 016 */       /* A with acute accent */
        {'\'','E', 0xC9},       /* 017 */       /* E with acute accent */
        {'\'','I', 0xCD},       /* 018 */       /* I with acute accent */
        {'\'','O', 0xD3},       /* 019 */       /* O with acute accent */
        {'\'','U', 0xDA},       /* 020 */       /* U with acute accent */
        {'\'','Y', 0xDD},       /* 021 */       /* Y with acute accent */
        {'\'','a', 0xE1},       /* 022 */       /* a with acute accent */
        {'\'','e', 0xE9},       /* 023 */       /* e with acute accent */
        {'\'','i', 0xED},       /* 024 */       /* i with acute accent */
        {'\'','o', 0xF3},       /* 025 */       /* o with acute accent */
        {'\'','u', 0xFA},       /* 026 */       /* u with acute accent */
        {'\'','y', 0xFD},       /* 027 */       /* y with acute accent */
        {'*', 'A', 0xC5},       /* 028 */       /* A with ring */
        {'*', '^', 0xB0},       /* 029 */       /* degree */
        {'*', 'a', 0xE5},       /* 030 */       /* a with ring */
        {'+', '-', 0xB1},       /* 031 */       /* plus/minus */
        {',', ',', 0xB8},       /* 032 */       /* cedilla */
        {',', '-', 0xAC},       /* 033 */       /* not sign */
        {',', 'C', 0xC7},       /* 034 */       /* C with cedilla */
        {',', 'c', 0xE7},       /* 035 */       /* c with cedilla */
        {'-', '-', 0xAD},       /* 036 */       /* soft hyphen */
        {'-', ':', 0xF7},       /* 037 */       /* division sign */
        {'-', 'A', 0xAA},       /* 038 */       /* feminine superior numeral */
        {'-', 'D', 0xD0},       /* 039 */       /* Upper-case eth */
        {'-', 'L', 0xA3},       /* 040 */       /* pounds sterling */
        {'-', 'Y', 0xA5},       /* 041 */       /* yen */
        {'-', '^', 0xAF},       /* 042 */       /* macron */
        {'-', 'a', 0xAA},       /* 043 */       /* feminine superior numeral */
        {'-', 'd', 0xF0},       /* 044 */       /* Lower-case eth */
        {'-', 'l', 0xA3},       /* 045 */       /* pounds sterling */
        {'-', 'y', 0xA5},       /* 046 */       /* yen */
        {'-', '|', 0xAC},       /* 047 */       /* not sign */
        {'.', '^', 0xB7},       /* 048 */       /* centered dot */
        {'/', 'C', 0xA2},       /* 049 */       /* cent sign */
        {'/', 'O', 0xD8},       /* 050 */       /* O with slash */
        {'/', 'c', 0xA2},       /* 051 */       /* cent sign */
        {'/', 'o', 0xF8},       /* 052 */       /* o with slash */
        {'/', 'u', 0xB5},       /* 053 */       /* mu */
        {'0', 'X', 0xA4},       /* 054 */       /* currency symbol */
        {'0', '^', 0xB0},       /* 055 */       /* degree */
        {'0', 'x', 0xA4},       /* 056 */       /* currency symbol */
        {'1', '2', 0xBD},       /* 057 */       /* 1/2 */
        {'1', '4', 0xBC},       /* 058 */       /* 1/4 */
        {'1', '^', 0xB9},       /* 059 */       /* superior '1' */
        {'2', '^', 0xB2},       /* 060 */       /* superior '2' */
        {'3', '4', 0xBE},       /* 061 */       /* 3/4 */
        {'3', '^', 0xB3},       /* 062 */       /* superior '3' */
        {'<', '<', 0xAB},       /* 063 */       /* left guillemot */
        {'>', '>', 0xBB},       /* 064 */       /* right guillemot */
        {'?', '?', 0xBF},       /* 065 */       /* inverted ? */
        {'A', 'E', 0xC6},       /* 066 */       /* AE dipthong */
        {'A', '^', 0xC2},       /* 067 */       /* A with circumflex accent */
        {'A', '`', 0xC0},       /* 068 */       /* A with grave accent */
        {'A', '~', 0xC3},       /* 069 */       /* A with tilde */
        {'C', 'O', 0xA9},       /* 060 */       /* copyright */
        {'E', '^', 0xCA},       /* 071 */       /* E with circumflex accent */
        {'E', '`', 0xC8},       /* 072 */       /* E with grave accent */
        {'H', 'T', 0xDE},       /* 073 */       /* Upper-case thorn */
        {'I', '^', 0xCE},       /* 074 */       /* I with circumflex accent */
        {'I', '`', 0xCC},       /* 075 */       /* I with grave accent */
        {'N', '~', 0xD1},       /* 076 */       /* N with tilde */
        {'O', 'R', 0xAE},       /* 077 */       /* registered */
        {'O', 'S', 0xA7},       /* 078 */       /* section mark */
        {'O', 'X', 0xA4},       /* 079 */       /* currency symbol */
        {'O', '^', 0xD4},       /* 080 */       /* O with circumflex accent */
        {'O', '_', 0xBA},       /* 081 */       /* masculine superior numeral */
        {'O', '`', 0xD2},       /* 082 */       /* O with grave accent */
        {'O', '~', 0xD5},       /* 083 */       /* O with tilde */
        {'P', '|', 0xDE},       /* 084 */       /* Upper-case thorn */
        {'U', '^', 0xDB},       /* 085 */       /* U with circumflex accent */
        {'U', '`', 0xD9},       /* 086 */       /* U with grave accent */
        {'\\','\\',0xB4},       /* 087 */       /* acute accent */
        {'^', 'a', 0xE2},       /* 088 */       /* a with circumflex accent */
        {'^', 'e', 0xEA},       /* 089 */       /* e with circumflex accent */
        {'^', 'i', 0xEE},       /* 090 */       /* i with circumflex accent */
        {'^', 'o', 0xF4},       /* 091 */       /* o with circumflex accent */
        {'^', 'u', 0xFB},       /* 092 */       /* u with circumflex accent */
        {'_', 'o', 0xBA},       /* 093 */       /* masculine superior numeral */
        {'`', 'a', 0xE0},       /* 094 */       /* a with grave accent */
        {'`', 'e', 0xE8},       /* 095 */       /* e with grave accent */
        {'`', 'i', 0xEC},       /* 096 */       /* i with grave accent */
        {'`', 'o', 0xF2},       /* 097 */       /* o with grave accent */
        {'`', 'u', 0xF9},       /* 098 */       /* u with grave accent */
        {'a', 'e', 0xE6},       /* 099 */       /* ae dipthong */
        {'a', '~', 0xE3},       /* 100 */       /* a with tilde */
        {'c', 'o', 0xA9},       /* 101 */       /* copyright */
        {'h', 't', 0xFE},       /* 102 */       /* Lower-case thorn */
        {'n', '~', 0xF1},       /* 103 */       /* n with tilde */
        {'o', 'r', 0xAE},       /* 104 */       /* registered */
        {'o', 's', 0xA7},       /* 105 */       /* section mark */
        {'o', 'x', 0xA4},       /* 106 */       /* currency symbol */
        {'o', '~', 0xF5},       /* 107 */       /* o with tilde */
        {'p', '|', 0xFE},       /* 108 */       /* Lower-case thorn */
        {'s', 's', 0xDF},       /* 109 */       /* German double-s */
        {'x', 'x', 0xD7},       /* 110 */       /* multiplication sign */
        {'|', '|', 0xA6},       /* 111 */       /* broken bar */

        {0, 0, 0},                      /* end of table */
};
/* END CSTYLED */

/*
 * Floating Accent Sequence Table
 */

/* FA + ASCII character => ISO character */
struct fltaccent_sequence_t kb_fltaccent_table[] = {

        {FA_UMLAUT, 'A', 0xC4},         /* A with umlaut */
        {FA_UMLAUT, 'E', 0xCB},         /* E with umlaut */
        {FA_UMLAUT, 'I', 0xCF},         /* I with umlaut */
        {FA_UMLAUT, 'O', 0xD6},         /* O with umlaut */
        {FA_UMLAUT, 'U', 0xDC},         /* U with umlaut */
        {FA_UMLAUT, 'a', 0xE4},         /* a with umlaut */
        {FA_UMLAUT, 'e', 0xEB},         /* e with umlaut */
        {FA_UMLAUT, 'i', 0xEF},         /* i with umlaut */
        {FA_UMLAUT, 'o', 0xF6},         /* o with umlaut */
        {FA_UMLAUT, 'u', 0xFC},         /* u with umlaut */
        {FA_UMLAUT, 'y', 0xFC},         /* y with umlaut */

        {FA_CFLEX, 'A', 0xC2},          /* A with circumflex */
        {FA_CFLEX, 'E', 0xCA},          /* E with circumflex */
        {FA_CFLEX, 'I', 0xCE},          /* I with circumflex */
        {FA_CFLEX, 'O', 0xD4},          /* O with circumflex */
        {FA_CFLEX, 'U', 0xDB},          /* U with circumflex */
        {FA_CFLEX, 'a', 0xE2},          /* a with circumflex */
        {FA_CFLEX, 'e', 0xEA},          /* e with circumflex */
        {FA_CFLEX, 'i', 0xEE},          /* i with circumflex */
        {FA_CFLEX, 'o', 0xF4},          /* o with circumflex */
        {FA_CFLEX, 'u', 0xFB},          /* u with circumflex */

        {FA_TILDE, 'A', 0xC3},          /* A with tilde */
        {FA_TILDE, 'N', 0xD1},          /* N with tilde */
        {FA_TILDE, 'O', 0xD5},          /* O with tilde */
        {FA_TILDE, 'a', 0xE3},          /* a with tilde */
        {FA_TILDE, 'n', 0xF1},          /* n with tilde */
        {FA_TILDE, 'o', 0xF5},          /* o with tilde */

        {FA_CEDILLA, 'C', 0xC7},        /* C with cedilla */
        {FA_CEDILLA, 'c', 0xE7},        /* c with cedilla */

        {FA_ACUTE, 'A', 0xC1},          /* A with acute accent */
        {FA_ACUTE, 'E', 0xC9},          /* E with acute accent */
        {FA_ACUTE, 'I', 0xCD},          /* I with acute accent */
        {FA_ACUTE, 'O', 0xD3},          /* O with acute accent */
        {FA_ACUTE, 'U', 0xDA},          /* U with acute accent */
        {FA_ACUTE, 'a', 0xE1},          /* a with acute accent */
        {FA_ACUTE, 'e', 0xE9},          /* e with acute accent */
        {FA_ACUTE, 'i', 0xED},          /* i with acute accent */
        {FA_ACUTE, 'o', 0xF3},          /* o with acute accent */
        {FA_ACUTE, 'u', 0xFA},          /* u with acute accent */
        {FA_ACUTE, 'y', 0xFD},          /* y with acute accent */

        {FA_GRAVE, 'A', 0xC0},          /* A with grave accent */
        {FA_GRAVE, 'E', 0xC8},          /* E with grave accent */
        {FA_GRAVE, 'I', 0xCC},          /* I with grave accent */
        {FA_GRAVE, 'O', 0xD2},          /* O with grave accent */
        {FA_GRAVE, 'U', 0xD9},          /* U with grave accent */
        {FA_GRAVE, 'a', 0xE0},          /* a with grave accent */
        {FA_GRAVE, 'e', 0xE8},          /* e with grave accent */
        {FA_GRAVE, 'i', 0xEC},          /* i with grave accent */
        {FA_GRAVE, 'o', 0xF2},          /* o with grave accent */
        {FA_GRAVE, 'u', 0xF9},          /* u with grave accent */

        {0, 0, 0},                      /* end of table */
};

/*
 * Num Lock Table
 */

/* Num Lock:  pad key entry & 0x1F => ASCII character */
uchar_t kb_numlock_table[] = {
        '=',
        '/',
        '*',
        '-',
        ',',

        '7',
        '8',
        '9',
        '+',

        '4',
        '5',
        '6',

        '1',
        '2',
        '3',

        '0',
        '.',
        '\n',   /* Enter */
};