133 lines
2.7 KiB
C
133 lines
2.7 KiB
C
#include <stdbool.h>
|
|
#include <stdint.h>
|
|
#include <strlib.h>
|
|
#include <kernel/tty.h>
|
|
|
|
static bool is_in_shift;
|
|
|
|
char keyboard_buffer[100];
|
|
size_t keyboard_buffer_top;
|
|
|
|
static unsigned char keyboard_char(unsigned char scancode)
|
|
{
|
|
if (0x01 < scancode && scancode < 0x0B) {
|
|
return scancode - 2 + '1';
|
|
}
|
|
|
|
if (scancode == 0x0B) {
|
|
return '0';
|
|
}
|
|
|
|
switch (scancode) {
|
|
case 0x10:
|
|
return 'Q';
|
|
case 0x11:
|
|
return 'W';
|
|
case 0x12:
|
|
return 'E';
|
|
case 0x13:
|
|
return 'R';
|
|
case 0x14:
|
|
return 'T';
|
|
case 0x15:
|
|
return 'Y';
|
|
case 0x16:
|
|
return 'U';
|
|
case 0x17:
|
|
return 'I';
|
|
case 0x18:
|
|
return 'O';
|
|
case 0x19:
|
|
return 'P';
|
|
case 0x1a:
|
|
return '[';
|
|
case 0x1b:
|
|
return ']';
|
|
case 0x1c:
|
|
return '\n';
|
|
case 0x1d:
|
|
return '\b';
|
|
case 0x1e:
|
|
return 'A';
|
|
case 0x1f:
|
|
return 'S';
|
|
case 0x20:
|
|
return 'D';
|
|
case 0x21:
|
|
return 'F';
|
|
case 0x22:
|
|
return 'G';
|
|
case 0x23:
|
|
return 'H';
|
|
case 0x24:
|
|
return 'J';
|
|
case 0x25:
|
|
return 'K';
|
|
case 0x26:
|
|
return 'L';
|
|
case 0x27:
|
|
return ';';
|
|
case 0x28:
|
|
return '\'';
|
|
case 0x29:
|
|
return '`';
|
|
case 0x2a:
|
|
is_in_shift = true;
|
|
break;
|
|
case 0x2b:
|
|
return '\\';
|
|
case 0x2c:
|
|
return 'Z';
|
|
case 0x2d:
|
|
return 'X';
|
|
case 0x2e:
|
|
return 'C';
|
|
case 0x2f:
|
|
return 'V';
|
|
case 0x30:
|
|
return 'B';
|
|
case 0x31:
|
|
return 'N';
|
|
case 0x32:
|
|
return 'M';
|
|
case 0x33:
|
|
return ',';
|
|
case 0x34:
|
|
return '.';
|
|
case 0x35:
|
|
return '/';
|
|
case 0x36:
|
|
is_in_shift = true;
|
|
break;
|
|
case 0x39:
|
|
return ' ';
|
|
case 0xaa:
|
|
is_in_shift = false;
|
|
break;
|
|
case 0xb6:
|
|
is_in_shift = false;
|
|
break;
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
void handle_keyboard(uint8_t scancode) {
|
|
char character;
|
|
|
|
if (is_in_shift) {
|
|
character = keyboard_char(scancode);
|
|
} else {
|
|
character = to_lower_char(keyboard_char(scancode));
|
|
}
|
|
|
|
if (character == -1) {
|
|
return;
|
|
}
|
|
|
|
keyboard_buffer[keyboard_buffer_top] = character;
|
|
keyboard_buffer_top++;
|
|
|
|
terminal_putchar(character);
|
|
}
|