keyboard.c
By: a guest | Mar 21st, 2010 | Syntax:
C | Size: 3.23 KB | Hits: 112 | Expires: Never
#include <system.h>
#define KEYB_PORT 0x60
#define KEYCTRL 1
#define KEYSHIFT 2
#define KEYALT 4
char modifiers = 0; /* This is a bit mask */
char escaped = 0;
/* I've set the '#' char on unprintable scancodes */
char keymap[64] = {
'#', '#', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '#', '#', '\b',
'\t', 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '[', ']', '\n',
'#', 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', '#', '#', '#',
'#', '\\', 'Z', 'X', 'C', 'V', 'B', 'N', 'M', ',', '.', '-', '#', '*',
'#', ' ', '#', '#', '#', '#', '#', '#' };
void keyboard_manager()
{
unsigned scan_code = inportb(KEYB_PORT);
char c;
if (escaped) scan_code += 0x100;
switch (scan_code) {
case 0x00: /* Error code */
puts("Keyboard error\n");
break;
case 0x01: /* ESC */
puts("Esc ");
break;
/* Shift down */
case 0x2a: /* L_SHIFT */
case 0x36: modifiers |= KEYSHIFT; /* R_SHIFT */
break;
/* Shift up */
case 0xaa:
case 0xb6: modifiers &= ~(KEYSHIFT);
break;
/* Ctrl down */
case 0x1d: /* L_CTRL */
case 0x11d: modifiers |= KEYCTRL; /* R_CTRL */
break;
/* Ctrl up */
case 0x9d:
case 0x19d: modifiers &= ~(KEYCTRL);
break;
/* Alt down */
case 0x38: /* L_ALT */
case 0x138: modifiers |= KEYALT; /* R_ALT */
break;
/* Alt up */
case 0xb8:
case 0x1b8: modifiers &= ~(KEYALT);
break;
/* Escape sequence start */
case 0xe0: escaped = 1;
break;
default:
if (scan_code & 0x80) {
/* Ignore the break code */
escaped = 0;
} else {
/* Echoes printable chars only */
if ((scan_code >= 0x02) && (scan_code < 64)) {
c = keymap[scan_code];
if ((c>='A') && (c<='Z'))
c=(modifiers & KEYSHIFT) ?
c : c - 'A' + 'a';
putch(c);
} else {
puts("Unknown scan code, sorry!\n");
}
escaped = 0;
}
break;
}
}