#include #include "vga.h" enum special_key { K_ESCAPE = 0x1b, K_BACKSPACE = 0x08, K_F1 = 0x0E, K_F2 = 0x0F, K_F3 = 0x10, K_F4 = 0x11, K_F5 = 0x12, K_F6 = 0x13, K_F7 = 0x14, K_F8 = 0x15, K_F9 = 0x16, K_F10 = 0x17, K_F11 = 0x18, K_F12 = 0x19 }; enum mod_scancodes { SC_LSHIFT = 0x2A, SC_RSHIFT = 0x36, SC_LCTRL = 0x1D, SC_LALT = 0x38, SC_META = 0x3A }; char keymap_unshift[] = { 0,K_ESCAPE,'1','2','3','4','5','6','7','8','9','0','-','=',K_BACKSPACE, '\t','q','w','e','r','t','y','u','i','o','p','[',']','\n',0, 'a','s','d','f','g','h','j','k','l',';','\'','`',0,'\\', 'z','x','c','v','b','n','m',',','.','/',0,'*',0,' ',0, K_F1,K_F2,K_F3,K_F4,K_F5,K_F6,K_F7,K_F8,K_F9,K_F10,0,0, '7','8','9','-','4','5','6','1','2','3','0','.',0,0,0,K_F11,K_F12 }; char keymap_shift[] = { 0,K_ESCAPE,'!','@','#','$','%','^','&','*','(',')','_','+',K_BACKSPACE, '\t','Q','W','E','R','T','Y','U','I','O','P','{','}','\n',0, 'A','S','D','F','G','H','J','K','L',':','"','~',0,'|', 'Z','X','C','V','B','N','M','<','>','?',0,'*',0,' ',0, K_F1,K_F2,K_F3,K_F4,K_F5,K_F6,K_F7,K_F8,K_F9,K_F10,0,0, '7','8','9','-','4','5','6','1','2','3','0','.',0,0,0,K_F11,K_F12 }; char *keymap = keymap_unshift; struct { int shift; int ctrl; int alt; int meta; } mod_keys = {0}; void keydown(char c) { vputchar(c); } void keyup(char c) { } void keyboard_event(uint8_t (*get_bytes)()) { uint8_t data = get_bytes(); uint8_t code; int release; if (data > 0x80 && data <= 0xD8) { release = 1; code = data - 0x80; } else { release = 0; code = data; } switch (code) { default: if (code <= 0x58 && keymap[code] != 0) { if (!release) keydown(keymap[code]); else keyup(keymap[code]); } break; case SC_LSHIFT: case SC_RSHIFT: mod_keys.shift = !release; keymap = release ? keymap_unshift : keymap_shift; break; case SC_LCTRL: mod_keys.ctrl = !release; break; case SC_LALT: mod_keys.alt = !release; break; case SC_META: mod_keys.meta = !release; break; } }