summaryrefslogtreecommitdiff
path: root/src/keyboard.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/keyboard.c')
-rw-r--r--src/keyboard.c98
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;
+ }
+}