diff --git a/core/irq_handler.c b/core/irq_handler.c index 5c24677..971f699 100644 --- a/core/irq_handler.c +++ b/core/irq_handler.c @@ -1,6 +1,7 @@ #include "interrupt.h" #include "io.h" #include "irq.h" +#include "keyboard.h" #include "pic.h" #include "vga.h" @@ -8,13 +9,7 @@ __attribute__((interrupt)) void keyboard_handler(struct interrupt_frame *frame) { EOIIrq(IRQ_KEYBOARD); - char c = 0; - if (inb(0x60) != c) { - c = inb(0x60); - if (c > 0) { - printInt(c); - } - } + keyboard_do_irq(); (void)frame; } diff --git a/drivers/keyboard.c b/drivers/keyboard.c new file mode 100644 index 0000000..3a4bdb1 --- /dev/null +++ b/drivers/keyboard.c @@ -0,0 +1,146 @@ +#include "keyboard.h" +#include "vga.h" +#include "io.h" + +const char *scancode [128] = { + /* 0 */ 0, + /* 1 */ "\e", + /* 2 */ "&", + /* 3 */ "é", + /* 4 */ "\"", + /* 5 */ "'", + /* 6 */ "(", + /* 7 */ "-", + /* 8 */ "è", + /* 9 */ "_", + /* 10 */ "ç", + /* 11 */ "à", + /* 12 */ ")", + /* 13 */ "=", + /* 14 */ "\b", /* Backspace */ + /* 15 */ "\t", /* Tab */ + /* 16 */ "a", + /* 17 */ "z", + /* 18 */ "e", + /* 19 */ "r", + /* 20 */ "t", + /* 21 */ "y", + /* 22 */ "u", + /* 23 */ "i", + /* 24 */ "o", + /* 25 */ "p", + /* 26 */ "^", + /* 27 */ "$", + /* 28 */ "\n", + /* 29 */ 0, /* left control */ + /* 30 */ "q", + /* 31 */ "s", + /* 32 */ "d", + /* 33 */ "f", + /* 34 */ "g", + /* 35 */ "h", + /* 36 */ "j", + /* 37 */ "k", + /* 38 */ "l", + /* 39 */ "m", + /* 40 */ "ù", + /* 41 */ 0, + /* 42 */ 0, /* left shift */ + /* 43 */ "*", + /* 44 */ "w", + /* 45 */ "x", + /* 46 */ "c", + /* 47 */ "v", + /* 48 */ "b", + /* 49 */ "n", + /* 50 */ ",", + /* 51 */ ";", + /* 52 */ ":", + /* 53 */ "!", + /* 54 */ 0, + /* 55 */ 0, + /* 56 */ 0, + /* 57 */ " ", + /* 58 */ 0, + /* 59 */ "\eOP", /* F1 */ + /* 60 */ "\eOQ", /* F2 */ + /* 61 */ "\eOR", /* F3 */ + /* 62 */ "\eOS", /* F4 */ + /* 63 */ "\e[15~", /* F5 */ + /* 64 */ "\e[17~", /* F6 */ + /* 65 */ "\e[18~", /* F7 */ + /* 66 */ "\e[19~", /* F8 */ + /* 67 */ "\e[20~", /* F9 */ + /* 68 */ "\e[21~", /* F10 */ + /* 69 */ 0, + /* 70 */ 0, + /* 71 */ 0, + /* 72 */ 0, + /* 73 */ 0, + /* 74 */ 0, + /* 75 */ 0, + /* 76 */ 0, + /* 77 */ 0, + /* 78 */ 0, + /* 79 */ 0, + /* 80 */ 0, + /* 81 */ 0, + /* 82 */ 0, + /* 83 */ 0, + /* 84 */ 0, + /* 85 */ 0, + /* 86 */ "<", + /* 87 */ "\e[23~", /* F11 */ + /* 88 */ "\e[24~", /* F12 */ + /* 89 */ 0, + /* 90 */ 0, + /* 91 */ 0, + /* 92 */ 0, + /* 93 */ 0, + /* 94 */ 0, + /* 95 */ 0, + /* 96 */ 0, + /* 97 */ 0, + /* 98 */ 0, + /* 99 */ 0, + /* 100 */ 0, + /* 101 */ 0, + /* 102 */ 0, + /* 103 */ 0, + /* 104 */ 0, + /* 105 */ 0, + /* 106 */ 0, + /* 107 */ 0, + /* 108 */ 0, + /* 109 */ 0, + /* 110 */ 0, + /* 111 */ 0, + /* 112 */ 0, + /* 113 */ 0, + /* 114 */ 0, + /* 115 */ 0, + /* 116 */ 0, + /* 117 */ 0, + /* 118 */ 0, + /* 119 */ 0, + /* 120 */ 0, + /* 121 */ 0, + /* 122 */ 0, + /* 123 */ 0, + /* 124 */ 0, + /* 125 */ 0, + /* 126 */ 0, + /* 127 */ 0 +}; + + +void keyboard_do_irq(){ + char c = 0; + if (inb(0x60) != c) { + c = inb(0x60); + if (c > 0) { + printString(scancode[(int)c]); + } + } +} + diff --git a/drivers/keyboard.h b/drivers/keyboard.h new file mode 100644 index 0000000..277a752 --- /dev/null +++ b/drivers/keyboard.h @@ -0,0 +1,3 @@ +#pragma once + +void keyboard_do_irq(); diff --git a/drivers/vga.c b/drivers/vga.c index 16507ca..b0c1091 100644 --- a/drivers/vga.c +++ b/drivers/vga.c @@ -4,7 +4,7 @@ static uint vgaBgColor; static uint vgaColor; -static uint line, col; +static int line, col; int initVGA(uint bgColor, uint color) { @@ -97,18 +97,36 @@ void printChar(const char str) if (str == '\n') { line++; col = 0; + if (line >= VGA_HEIGHT) { + vgaScrollUp(); + line--; + } } - if (col == VGA_WIDTH) { + else if(str == '\r') + { col = 0; - line++; } - if (line >= VGA_HEIGHT) { - vgaScrollUp(); - line--; + else if(str == '\b') + { + col--; + if (col < 0) { + col = VGA_WIDTH - 1; + line--; + } + printCharDetails(' ', vgaColor, vgaBgColor, col, line); + } + else + { + printCharDetails(str, vgaColor, vgaBgColor, col++, line); + if (col == VGA_WIDTH) { + col = 0; + line++; + } + if (line >= VGA_HEIGHT) { + vgaScrollUp(); + line--; + } } - if (str == '\n') - return; - printCharDetails(str, vgaColor, vgaBgColor, col++, line); } void printStringDetails(const char *str, uint color, uint bgColor, int startX, int startY)