8 /* table with rough translations from set 1 scancodes to ASCII-ish */
9 static int scantbl[] = {
10 0, KB_ESC, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', '\b', /* 0 - e */
11 '\t', 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', '\n', /* f - 1c */
12 KB_LCTRL, 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', '\'', '`', /* 1d - 29 */
13 KB_LSHIFT, '\\', 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', KB_RSHIFT, /* 2a - 36 */
14 KB_NUM_MUL, KB_LALT, ' ', KB_CAPSLK, KB_F1, KB_F2, KB_F3, KB_F4, KB_F5, KB_F6, KB_F7, KB_F8, KB_F9, KB_F10, /* 37 - 44 */
15 KB_NUMLK, KB_SCRLK, KB_NUM_7, KB_NUM_8, KB_NUM_9, KB_NUM_MINUS, KB_NUM_4, KB_NUM_5, KB_NUM_6, KB_NUM_PLUS, /* 45 - 4e */
16 KB_NUM_1, KB_NUM_2, KB_NUM_3, KB_NUM_0, KB_NUM_DOT, KB_SYSRQ, 0, 0, KB_F11, KB_F12, /* 4d - 58 */
17 0, 0, 0, 0, 0, 0, 0, /* 59 - 5f */
18 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 60 - 6f */
19 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 /* 70 - 7f */
25 #define ADVANCE(x) ((x) = ((x) + 1) & (BUFSZ - 1))
27 static int buffer[BUFSZ];
28 static int buf_ridx, buf_widx;
30 static unsigned int num_pressed;
31 static unsigned char keystate[256];
35 interrupt(IRQ_TO_INTR(KB_IRQ), kbintr);
38 int kb_isdown(int key)
45 return keystate[KB_LALT] + keystate[KB_RALT];
48 return keystate[KB_LCTRL] + keystate[KB_RCTRL];
56 while((key = kb_getkey()) == -1) {
57 /* put the processor to sleep while waiting for keypresses, but first
58 * make sure interrupts are enabled, or we'll sleep forever
70 if(buf_ridx == buf_widx) {
73 res = buffer[buf_ridx];
78 void kb_putback(int key)
85 /* if the write end hasn't caught up with us, go back one place
86 * and put it there, otherwise just overwrite the oldest key which
87 * is right where we were.
89 if(buf_ridx == buf_widx) {
93 buffer[buf_ridx] = key;
107 if(num_pressed > 0) {
119 /* append to buffer */
120 buffer[buf_widx] = key;
122 /* if the write end overtook the read end, advance the read end
123 * too, to discard the oldest keypress from the buffer
125 if(buf_widx == buf_ridx) {
130 /* and update keystate table */
131 keystate[key] = press;