From 58da5af56ce30e667fd4699d41e7a4a4bc18d2a3 Mon Sep 17 00:00:00 2001 From: shockrah Date: Sun, 1 Dec 2019 02:31:08 -0800 Subject: [PATCH] improvement: kbd_key_read now populates a bit mask containing information about state --- kbd.c | 18 ++++++++++++++++-- kbd.h | 8 ++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/kbd.c b/kbd.c index 94fa03b..09083c7 100644 --- a/kbd.c +++ b/kbd.c @@ -1,6 +1,7 @@ // US Keyboard layout because 'Murrica #include "kbd.h" #include "ports.h" +#include "pit.h" #include "serial.h" #include "types.h" #include "stlio.h" @@ -49,10 +50,23 @@ unsigned char keymap[128] = { // Reads one key from the keyboard void kbd_read_key(struct cpu_reg_state* cpu) { - u32 scancode = serial_read_byte(KBD_PORT); - putch(keymap[scancode]); + u8 scancode = serial_read_byte(KBD_PORT); + if(scancode & 0x80) { + // Key released + kbd_state &= KBD_RELEASE; + } + else { + // Key pressed + kbd_key = keymap[scancode & 0x7f]; // clamp to 127 as the max val(gcc is anoying) + kbd_state = kbd_state & !KBD_RELEASE & KBD_PRESS; + kbd_time = pit_timer_ticks; + putch(kbd_key); + } } void kbd_install_keyboard(void) { init_irq_handler(1, kbd_read_key); + kbd_key = '\0'; + kbd_state = 0; + kbd_time = 0; } diff --git a/kbd.h b/kbd.h index 26d9fe4..b1e2039 100644 --- a/kbd.h +++ b/kbd.h @@ -5,6 +5,14 @@ #define KBD_PORT 0x60 +#define KBD_PRESS 0b00000001 +#define KBD_RELEASE 0b00000010 +#define KBD_SHIFT 0b00000100 + +char kbd_key; +u8 kbd_state; +u8 kbd_time; + void kbd_install_keyboard(void); void kbd_read_key(struct cpu_reg_state* cpu);