diff --git a/drivers/keyboard.c b/drivers/keyboard.c index 5a49276..0894c07 100644 --- a/drivers/keyboard.c +++ b/drivers/keyboard.c @@ -58,7 +58,7 @@ const char *scancode[128] = { /* 52 */ ":", /* 53 */ "!", /* 54 */ 0, /* right shift*/ - /* 55 */ 0, + /* 55 */ "*", /* 56 */ 0, /* left alt*/ /* 57 */ " ", /* 58 */ 0, /* caps Lock */ @@ -72,21 +72,21 @@ const char *scancode[128] = { /* 66 */ "\e[19~", /* F8 */ /* 67 */ "\e[20~", /* F9 */ /* 68 */ "\e[21~", /* F10 */ - /* 69 */ 0, + /* 69 */ 0, /* VerrNum*/ /* 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, + /* 71 */ "7", + /* 72 */ "8", + /* 73 */ "9", + /* 74 */ "-", + /* 75 */ "4", + /* 76 */ "5", + /* 77 */ "6", + /* 78 */ "+", + /* 79 */ "1", /* pavnum*/ + /* 80 */ "2", + /* 81 */ "3", + /* 82 */ "0", + /* 83 */ ".", /* 84 */ 0, /* 85 */ 0, /* 86 */ "<", @@ -264,41 +264,50 @@ const char *scancode_shift[128] = { void keyboard_do_irq() { - static int lshift = 0; - static int rshift = 0; + static int lshift = 0; + static int rshift = 0; static int capslock = 0; - unsigned char c = 0; - if (inb(0x60) != c) { - c = inb(0x60); - if (c > 0) { - if (c < BREAK_CODE) { - switch (c) { - case 42: - lshift = 1; - break; - case 54: - rshift = 1; - break; - case 58: - capslock = 1 - capslock; - break; - default: - if ((lshift || rshift) ^ capslock) - printf(scancode_shift[(int)c]); - else - printf(scancode[(int)c]); - } - }else { - c = c - BREAK_CODE; - switch (c) { - case 42: - lshift = 0; - break; - case 54: - rshift = 0; - } + static int isExt = 0; + unsigned char c = inb(KEYBOARD_DATA_PORT); + const char *key = NULL; + if (c > 0) { + if (c == 0xE0) { // non printable such as page up/down ... See https://wiki.osdev.org/Keyboard + isExt = 1; + } else if (isExt) { + isExt = 0; + return; + } + if (c < BREAK_CODE) { + switch (c) { + case 42: + lshift = 1; + break; + case 54: + rshift = 1; + break; + case 58: + capslock = 1 - capslock; + break; + default: + if ((lshift || rshift) ^ capslock) { + key = scancode_shift[(int)c]; + } else { + key = scancode[(int)c]; + } + } + } else { + c = c - BREAK_CODE; + switch (c) { + case 42: + lshift = 0; + break; + case 54: + rshift = 0; } } } + + if (key) + printf(key); } diff --git a/drivers/keyboard.h b/drivers/keyboard.h index 7f1efb4..9e4f3fe 100644 --- a/drivers/keyboard.h +++ b/drivers/keyboard.h @@ -3,4 +3,6 @@ // Pushing generate MAKE_CODE (<0x80) // Releasing generate BREAK_CODE (break_code = make_code + 0x80) #define BREAK_CODE 0x80 +#define KEYBOARD_DATA_PORT 0x60 + void keyboard_do_irq();