| 1 | // PC keyboard interface constants | 
|---|
| 2 |  | 
|---|
| 3 | #define KBSTATP         0x64    // kbd controller status port(I) | 
|---|
| 4 | #define KBS_DIB         0x01    // kbd data in buffer | 
|---|
| 5 | #define KBDATAP         0x60    // kbd data port(I) | 
|---|
| 6 |  | 
|---|
| 7 | #define NO              0 | 
|---|
| 8 |  | 
|---|
| 9 | #define SHIFT           (1<<0) | 
|---|
| 10 | #define CTL             (1<<1) | 
|---|
| 11 | #define ALT             (1<<2) | 
|---|
| 12 |  | 
|---|
| 13 | #define CAPSLOCK        (1<<3) | 
|---|
| 14 | #define NUMLOCK         (1<<4) | 
|---|
| 15 | #define SCROLLLOCK      (1<<5) | 
|---|
| 16 |  | 
|---|
| 17 | #define E0ESC           (1<<6) | 
|---|
| 18 |  | 
|---|
| 19 | // Special keycodes | 
|---|
| 20 | #define KEY_HOME        0xE0 | 
|---|
| 21 | #define KEY_END         0xE1 | 
|---|
| 22 | #define KEY_UP          0xE2 | 
|---|
| 23 | #define KEY_DN          0xE3 | 
|---|
| 24 | #define KEY_LF          0xE4 | 
|---|
| 25 | #define KEY_RT          0xE5 | 
|---|
| 26 | #define KEY_PGUP        0xE6 | 
|---|
| 27 | #define KEY_PGDN        0xE7 | 
|---|
| 28 | #define KEY_INS         0xE8 | 
|---|
| 29 | #define KEY_DEL         0xE9 | 
|---|
| 30 |  | 
|---|
| 31 | // C('A') == Control-A | 
|---|
| 32 | #define C(x) (x - '@') | 
|---|
| 33 |  | 
|---|
| 34 | static uchar shiftcode[256] = | 
|---|
| 35 | { | 
|---|
| 36 | [0x1D] CTL, | 
|---|
| 37 | [0x2A] SHIFT, | 
|---|
| 38 | [0x36] SHIFT, | 
|---|
| 39 | [0x38] ALT, | 
|---|
| 40 | [0x9D] CTL, | 
|---|
| 41 | [0xB8] ALT | 
|---|
| 42 | }; | 
|---|
| 43 |  | 
|---|
| 44 | static uchar togglecode[256] = | 
|---|
| 45 | { | 
|---|
| 46 | [0x3A] CAPSLOCK, | 
|---|
| 47 | [0x45] NUMLOCK, | 
|---|
| 48 | [0x46] SCROLLLOCK | 
|---|
| 49 | }; | 
|---|
| 50 |  | 
|---|
| 51 | static uchar normalmap[256] = | 
|---|
| 52 | { | 
|---|
| 53 | NO,   0x1B, '1',  '2',  '3',  '4',  '5',  '6',  // 0x00 | 
|---|
| 54 | '7',  '8',  '9',  '0',  '-',  '=',  '\b', '\t', | 
|---|
| 55 | 'q',  'w',  'e',  'r',  't',  'y',  'u',  'i',  // 0x10 | 
|---|
| 56 | 'o',  'p',  '[',  ']',  '\n', NO,   'a',  's', | 
|---|
| 57 | 'd',  'f',  'g',  'h',  'j',  'k',  'l',  ';',  // 0x20 | 
|---|
| 58 | '\'', '`',  NO,   '\\', 'z',  'x',  'c',  'v', | 
|---|
| 59 | 'b',  'n',  'm',  ',',  '.',  '/',  NO,   '*',  // 0x30 | 
|---|
| 60 | NO,   ' ',  NO,   NO,   NO,   NO,   NO,   NO, | 
|---|
| 61 | NO,   NO,   NO,   NO,   NO,   NO,   NO,   '7',  // 0x40 | 
|---|
| 62 | '8',  '9',  '-',  '4',  '5',  '6',  '+',  '1', | 
|---|
| 63 | '2',  '3',  '0',  '.',  NO,   NO,   NO,   NO,   // 0x50 | 
|---|
| 64 | [0x9C] '\n',      // KP_Enter | 
|---|
| 65 | [0xB5] '/',       // KP_Div | 
|---|
| 66 | [0xC8] KEY_UP,    [0xD0] KEY_DN, | 
|---|
| 67 | [0xC9] KEY_PGUP,  [0xD1] KEY_PGDN, | 
|---|
| 68 | [0xCB] KEY_LF,    [0xCD] KEY_RT, | 
|---|
| 69 | [0x97] KEY_HOME,  [0xCF] KEY_END, | 
|---|
| 70 | [0xD2] KEY_INS,   [0xD3] KEY_DEL | 
|---|
| 71 | }; | 
|---|
| 72 |  | 
|---|
| 73 | static uchar shiftmap[256] = | 
|---|
| 74 | { | 
|---|
| 75 | NO,   033,  '!',  '@',  '#',  '$',  '%',  '^',  // 0x00 | 
|---|
| 76 | '&',  '*',  '(',  ')',  '_',  '+',  '\b', '\t', | 
|---|
| 77 | 'Q',  'W',  'E',  'R',  'T',  'Y',  'U',  'I',  // 0x10 | 
|---|
| 78 | 'O',  'P',  '{',  '}',  '\n', NO,   'A',  'S', | 
|---|
| 79 | 'D',  'F',  'G',  'H',  'J',  'K',  'L',  ':',  // 0x20 | 
|---|
| 80 | '"',  '~',  NO,   '|',  'Z',  'X',  'C',  'V', | 
|---|
| 81 | 'B',  'N',  'M',  '<',  '>',  '?',  NO,   '*',  // 0x30 | 
|---|
| 82 | NO,   ' ',  NO,   NO,   NO,   NO,   NO,   NO, | 
|---|
| 83 | NO,   NO,   NO,   NO,   NO,   NO,   NO,   '7',  // 0x40 | 
|---|
| 84 | '8',  '9',  '-',  '4',  '5',  '6',  '+',  '1', | 
|---|
| 85 | '2',  '3',  '0',  '.',  NO,   NO,   NO,   NO,   // 0x50 | 
|---|
| 86 | [0x9C] '\n',      // KP_Enter | 
|---|
| 87 | [0xB5] '/',       // KP_Div | 
|---|
| 88 | [0xC8] KEY_UP,    [0xD0] KEY_DN, | 
|---|
| 89 | [0xC9] KEY_PGUP,  [0xD1] KEY_PGDN, | 
|---|
| 90 | [0xCB] KEY_LF,    [0xCD] KEY_RT, | 
|---|
| 91 | [0x97] KEY_HOME,  [0xCF] KEY_END, | 
|---|
| 92 | [0xD2] KEY_INS,   [0xD3] KEY_DEL | 
|---|
| 93 | }; | 
|---|
| 94 |  | 
|---|
| 95 | static uchar ctlmap[256] = | 
|---|
| 96 | { | 
|---|
| 97 | NO,      NO,      NO,      NO,      NO,      NO,      NO,      NO, | 
|---|
| 98 | NO,      NO,      NO,      NO,      NO,      NO,      NO,      NO, | 
|---|
| 99 | C('Q'),  C('W'),  C('E'),  C('R'),  C('T'),  C('Y'),  C('U'),  C('I'), | 
|---|
| 100 | C('O'),  C('P'),  NO,      NO,      '\r',    NO,      C('A'),  C('S'), | 
|---|
| 101 | C('D'),  C('F'),  C('G'),  C('H'),  C('J'),  C('K'),  C('L'),  NO, | 
|---|
| 102 | NO,      NO,      NO,      C('\\'), C('Z'),  C('X'),  C('C'),  C('V'), | 
|---|
| 103 | C('B'),  C('N'),  C('M'),  NO,      NO,      C('/'),  NO,      NO, | 
|---|
| 104 | [0x9C] '\r',      // KP_Enter | 
|---|
| 105 | [0xB5] C('/'),    // KP_Div | 
|---|
| 106 | [0xC8] KEY_UP,    [0xD0] KEY_DN, | 
|---|
| 107 | [0xC9] KEY_PGUP,  [0xD1] KEY_PGDN, | 
|---|
| 108 | [0xCB] KEY_LF,    [0xCD] KEY_RT, | 
|---|
| 109 | [0x97] KEY_HOME,  [0xCF] KEY_END, | 
|---|
| 110 | [0xD2] KEY_INS,   [0xD3] KEY_DEL | 
|---|
| 111 | }; | 
|---|
| 112 |  | 
|---|
| 113 |  | 
|---|