diff options
| author | Nic Gaffney <gaffney_nic@protonmail.com> | 2024-02-06 04:58:35 -0600 |
|---|---|---|
| committer | Nic Gaffney <gaffney_nic@protonmail.com> | 2024-02-06 04:58:35 -0600 |
| commit | ecf636f2797647d5dfc38a4562cae53fe275217d (patch) | |
| tree | c71d113c553821c2b949eb6a6cd67de5f2fce068 /src/kernel/keyboard/isr.c | |
| parent | f1dee4bc58e4bfb97a1b41831c5d4fc327882991 (diff) | |
| download | gftos-ecf636f2797647d5dfc38a4562cae53fe275217d.tar.gz | |
Interrupts + basic keyboard driver
Diffstat (limited to 'src/kernel/keyboard/isr.c')
| -rw-r--r-- | src/kernel/keyboard/isr.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/src/kernel/keyboard/isr.c b/src/kernel/keyboard/isr.c new file mode 100644 index 0000000..223bf9f --- /dev/null +++ b/src/kernel/keyboard/isr.c @@ -0,0 +1,49 @@ +#include "asm.h" +#include "print.h" +#include "str.h" +#include <stdint.h> +static uint8_t shift_held = 0; +static uint8_t capslock = 0; + +void keyboard_handler() { + const char *scancodes = + "??1234567890-=?\tqwertyuiop[]\n?asdfghjkl;'`?\\zxcvbnm,./?*? "; + const char *SCANCODES = + "\?\?!@#$%^&*()_+?\tQWERTYUIOP{}\n?ASDFGHJKL:\"~?|ZXCVBNM<>??*? "; + + unsigned char sc = inb(0x60); + + uint8_t isheld = shift_held != 0; + char c = ((isheld | capslock) & !(isheld & capslock)) ? SCANCODES[sc] + : scancodes[sc]; + + if (capslock & (!isheld) && !isalpha(c)) + c = scancodes[sc]; + if (isheld && !isalpha(c)) + c = SCANCODES[sc]; + + if (sc < 0x59 && scancodes[sc] != '?') + printf("%c", c); + + switch (sc) { + case 0x2A: + shift_held |= 0b10; + break; + case 0x36: + shift_held |= 0b01; + break; + case 0xAA: + shift_held &= 0b01; + break; + case 0xB6: + shift_held &= 0b10; + break; + case 0x0E: + delete_char(); + break; + case 0x3A: + capslock = !capslock; + break; + } + outb(0x20, 0x20); +} |
