diff options
Diffstat (limited to 'src/keyboard.c')
-rw-r--r-- | src/keyboard.c | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/src/keyboard.c b/src/keyboard.c new file mode 100644 index 0000000..30dc5b7 --- /dev/null +++ b/src/keyboard.c @@ -0,0 +1,98 @@ + +#include <stdint.h> +#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 process_scancode(uint8_t c) { + uint8_t code; + int release; + if (c > 0x80 && c <= 0xD8) { + release = 1; + code = c - 0x80; + } else { + release = 0; + code = c; + } + 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; + } +} |