os/kernel/io/keyboard.c
2024-08-11 13:40:21 +02:00

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);
}