From ac7086fa7fef2fd7d5acf46e8b7f4987356a3171 Mon Sep 17 00:00:00 2001 From: Bah Thierno-Souleymane <thiernosouleymane.bah.etu@univ-lille.fr> Date: Wed, 31 Mar 2021 05:28:44 +0200 Subject: [PATCH] feat(keyboard mapping implementation done, only alphabetics letters and space for now) --- src/keyboard.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/main.c | 17 +++++++++++++++-- 2 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 src/keyboard.c diff --git a/src/keyboard.c b/src/keyboard.c new file mode 100644 index 0000000..09120da --- /dev/null +++ b/src/keyboard.c @@ -0,0 +1,50 @@ +#include "keyboard.h" + +void init_keymapping() +{ + int i; + for (int i = 0; i < NB_KEYS; i++) + KEY_MAPPING[i] = (key_t){0, 0}; + + shift_pressed = FALSE; + + KEY_MAPPING[0x1E] = (key_t){'a', 'A'}; + KEY_MAPPING[0x30] = (key_t){'b', 'B'}; + KEY_MAPPING[0x2E] = (key_t){'c', 'C'}; + KEY_MAPPING[0x20] = (key_t){'d', 'D'}; + KEY_MAPPING[0x12] = (key_t){'e', 'E'}; + KEY_MAPPING[0x21] = (key_t){'f', 'F'}; + KEY_MAPPING[0x22] = (key_t){'g', 'G'}; + KEY_MAPPING[0x23] = (key_t){'h', 'H'}; + KEY_MAPPING[0x17] = (key_t){'i', 'I'}; + KEY_MAPPING[0x24] = (key_t){'j', 'J'}; + KEY_MAPPING[0x25] = (key_t){'k', 'K'}; + KEY_MAPPING[0x26] = (key_t){'l', 'L'}; + KEY_MAPPING[0x32] = (key_t){'m', 'M'}; + KEY_MAPPING[0x31] = (key_t){'n', 'N'}; + KEY_MAPPING[0x18] = (key_t){'o', 'O'}; + KEY_MAPPING[0x19] = (key_t){'p', 'P'}; + KEY_MAPPING[0x10] = (key_t){'q', 'Q'}; + KEY_MAPPING[0x13] = (key_t){'r', 'R'}; + KEY_MAPPING[0x1F] = (key_t){'s', 'S'}; + KEY_MAPPING[0x14] = (key_t){'t', 'T'}; + KEY_MAPPING[0x16] = (key_t){'u', 'U'}; + KEY_MAPPING[0x2F] = (key_t){'v', 'V'}; + KEY_MAPPING[0x11] = (key_t){'w', 'W'}; + KEY_MAPPING[0x2D] = (key_t){'x', 'X'}; + KEY_MAPPING[0x15] = (key_t){'y', 'Y'}; + KEY_MAPPING[0x2C] = (key_t){'z', 'Z'}; + KEY_MAPPING[0x39] = (key_t){' ', ' '}; +} + +char keyboard_map(unsigned char code) +{ + if (code == SHIFT_UP) + shift_pressed = TRUE; + else if (code == SHIFT_DOWN) + shift_pressed = FALSE; + + if (shift_pressed) + return KEY_MAPPING[code].top; + return KEY_MAPPING[code].bottom; +} \ No newline at end of file diff --git a/src/main.c b/src/main.c index 32adbe2..bbe2e7e 100644 --- a/src/main.c +++ b/src/main.c @@ -1,6 +1,7 @@ #include "ioport.h" #include "gdt.h" #include "idt.h" +#include "keyboard.h" void clear_screen(); /* clear screen */ void putc(char aChar); /* print a single char on screen */ @@ -36,9 +37,21 @@ void main(unsigned int *mboot_info) puts("Hello world\n\n"); - for (;;) + init_keymapping(); + while (1) { - putc(_inb(0x60)); + // puthex(_inb(0x64)); + + if (_inb(0x64) == (0x1D)) + { + _outb(0x64, 0x1C); + char c = keyboard_map(_inb(0x60)); + if (c) + putc(c); + // puthex(_inb(0x60)); + } + + // puthex(_inb(0x60)); } for (;;) -- GitLab