From 5155e7adaee7d5f4ccb6dad501625279e51db530 Mon Sep 17 00:00:00 2001 From: Aren Elchinyan Date: Tue, 16 Jan 2024 22:23:26 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A2=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20=D0=B2?= =?UTF-8?q?=D1=81=D0=B5=20=D1=81=D0=B8=D0=BC=D0=B2=D0=BE=D0=BB=D1=8B=20?= =?UTF-8?q?=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=B0=D1=82=D1=8B=D0=B2=D0=B0?= =?UTF-8?q?=D1=8E=D1=82=D1=81=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modules/ps2/main.c | 71 +++++++++++++++++++++++++++------------------- 1 file changed, 42 insertions(+), 29 deletions(-) diff --git a/modules/ps2/main.c b/modules/ps2/main.c index 1fa42d1..a876ecc 100644 --- a/modules/ps2/main.c +++ b/modules/ps2/main.c @@ -26,21 +26,36 @@ static void wait_irq( ) { kbd_free = false; } -static char getc( ) { +static char getkey( ) { wait_irq( ); return c_char; } +static char getc( ) { +__repeat: + wait_irq( ); + if (c_char >= '0' && c_char <= '9') { return c_char; } + + if (c_char >= 'A' && c_char <= 'Z') { return c_char; } + + if (c_char >= 'a' && c_char <= 'z') { return c_char; } + + if (c_char >= 'А' && c_char <= 'Я') { return c_char; } + + if (c_char >= 'а' && c_char <= 'я') { return c_char; } + + goto __repeat; +} + static void *__get_func(uint64_t func) { switch (func) { case 0: return wait_irq; - case 1: return getc; + case 1: return getkey; + case 2: return getc; default: return NULL; } } -static uint8_t keyboard_to_ascii(uint8_t key) {} - static void after_interrupt( ) { uint8_t status = inb(0x61) | 1; outb(0x61, status); @@ -49,34 +64,17 @@ static void after_interrupt( ) { static int is_shift(uint8_t scancode) { switch (scancode) { case 0x2A: // Левый SHIFT - return 1; case 0x36: // Правый SHIFT return 1; - case 0xAA: // Левый SHIFT отпущен - return -1; - case 0xB6: // Правый SHIFT отпущен - return -1; default: // Другой символ return 0; } } static int is_ctrl(uint8_t scancode) { - if (current_state == PREFIX_STATE) { - switch (scancode) { - case 0x1D: // Правый CTRL - return 1; - case 0x9D: // Правый CTRL отпущен - return -1; - default: // Другой символ - return 0; - } - } switch (scancode) { - case 0x1D: // Левый CTRL + case 0x1D: // Левый или правый CTRL return 1; - case 0x9D: // Левый CTRL отпущен - return -1; default: // Другой символ return 0; } @@ -99,14 +97,26 @@ static void handler( ) { return; } - if (is_shift(scancode) != 0) { - keyboard_buffer.shift_pressed = is_shift(scancode); + if (scancode == 0xAA || scancode == 0xB6) { // Отпущена клавиша SHIFT + keyboard_buffer.shift_pressed = 0; after_interrupt( ); return; } - if (is_ctrl(scancode) != 0) { - keyboard_buffer.ctrl_pressed = is_ctrl(scancode); + if (scancode == 0x9D) { // Отпущена клавиша CTRL + keyboard_buffer.ctrl_pressed = 0; + after_interrupt( ); + return; + } + + if (is_shift(scancode)) { // Нажата клавиша SHIFT + keyboard_buffer.shift_pressed = 1; + after_interrupt( ); + return; + } + + if (is_ctrl(scancode)) { // Нажата клавиша CTRL + keyboard_buffer.ctrl_pressed = 1; after_interrupt( ); return; } @@ -114,13 +124,13 @@ static void handler( ) { if (current_state == PREFIX_STATE) { current_state = NORMAL_STATE; } if (ru) { - if (keyboard_buffer.shift_pressed) { + if (keyboard_buffer.shift_pressed && !keyboard_buffer.ctrl_pressed) { c = ru_chars_shifted[scancode]; } else { c = ru_chars_lower[scancode]; } } else { - if (keyboard_buffer.shift_pressed) { + if (keyboard_buffer.shift_pressed && !keyboard_buffer.ctrl_pressed) { c = en_chars_shifted[scancode]; } else { c = en_chars_lower[scancode]; @@ -133,7 +143,6 @@ static void handler( ) { switch (scancode) { case 0x01: virt_exit( ); break; // Клавиша "ESCAPE" case 0x4F: // Клавиша "END" - asm volatile("int $32"); break; default: break; } @@ -143,6 +152,10 @@ static void handler( ) { module_info_t __attribute__((section(".minit"))) init(env_t *env) { init_env(env); current_state = NORMAL_STATE; + keyboard_buffer.ctrl_pressed = 0; + keyboard_buffer.shift_pressed = 0; + fb_printf("\t\t[%u][%c]\n", 27, 27); + return (module_info_t){ .name = (char *)"[KEYBOARD]", .message = (char *)"PS/2 драйвер", .type = 0,