| 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 | |