kbd.h (3535B)
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