diff --git a/src/keyboard.c b/src/keyboard.c
new file mode 100644
index 0000000000000000000000000000000000000000..09120daa9aee5213bb21717538546479313ceb89
--- /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 32adbe229c45f792b3ea51937df201dbf8b0243c..bbe2e7e106fffe7802750d6e2b5ab7b129255984 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 (;;)