diff --git a/src/kernel/drivers/keyboard.c b/src/kernel/drivers/keyboard.c new file mode 100644 index 0000000..5b3e3f8 --- /dev/null +++ b/src/kernel/drivers/keyboard.c @@ -0,0 +1,51 @@ +#include "../util/string.h" +#include "keyboard.h" +#include "../arch/i686/isr.h" +#include "../stdio.h" +#include "../arch/i686/io.h" +#include "../stdio.h" + +static char g_key_buffer[256]; + +static const char g_sc_ascii[128] = { + '?', '?', '1', '2', '3', '4', '5', '6', + '7', '8', '9', '0', '-', '=', '?', '?', + 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', + 'O', 'P', '[', ']', '?', '?', 'A', 'S', + 'D', 'F', 'G', 'H', 'J', 'K', 'L', ';', + '\'', '`', '?', '\\', 'z', 'x', 'c', 'v', + 'B', 'N', 'M', ',', '.', '/', '?', '?', + '?', ' ' +}; + +static void user_input(char *str){ + printf("In: \"%s\"\n", str); +} + +static void keyboard_callback(){ + uint8_t scancode = i686_inb(0x60); + //printf("KEYBOARD (%i)!\n", scancode); + if(scancode < 128){ // If it's a "pressed" event, not "released" + if(scancode == 0x0E){ // Backspace + putc('\b'); + g_key_buffer[strlen(g_key_buffer)-1] = '\0'; + } + else if(scancode == 0x1C){ // Enter + putc('\n'); + user_input(g_key_buffer); + g_key_buffer[0] = '\0'; + } + else{ + putc(g_sc_ascii[scancode]); + + // strlen() works here because char[] is the same as + // char*, and both are null-terminated, so they are + // exactly the same + g_key_buffer[strlen(g_key_buffer)] = g_sc_ascii[scancode]; + } + } +} + +void keyboard_initialize(){ + i686_isr_register_handler(IRQ(1), keyboard_callback); +} diff --git a/src/kernel/drivers/keyboard.h b/src/kernel/drivers/keyboard.h new file mode 100644 index 0000000..194ced5 --- /dev/null +++ b/src/kernel/drivers/keyboard.h @@ -0,0 +1,3 @@ +#pragma once + +void keyboard_initialize(); diff --git a/src/kernel/drivers/timer.c b/src/kernel/drivers/timer.c index ff4e7dd..0ba756f 100644 --- a/src/kernel/drivers/timer.c +++ b/src/kernel/drivers/timer.c @@ -3,7 +3,7 @@ #include "../stdio.h" static void timer_handler(registers *regs){ - printf("TICK\n"); + //printf("TICK\n"); } void timer_initialize(){ diff --git a/src/kernel/drivers/vga.c b/src/kernel/drivers/vga.c index 82ed3cb..77f7155 100644 --- a/src/kernel/drivers/vga.c +++ b/src/kernel/drivers/vga.c @@ -50,8 +50,11 @@ int vga_print_char(char c, int x, int y){ offset = (y+1)*VGA_WIDTH; } else if(c == '\b'){ - VGA_MEMORY[offset*2] = ' '; - VGA_MEMORY[offset*2+1] = current_color; + if(offset != 0){ + offset--; + VGA_MEMORY[offset*2] = ' '; + VGA_MEMORY[offset*2+1] = current_color; + } } else{ VGA_MEMORY[offset*2] = c; @@ -115,3 +118,12 @@ void vga_print_string_at(char *str, int x, int y){ void vga_print_string(char *str){ vga_print_string_at(str, -1, -1); } + +void vga_fill_screen(char c, uint8_t color){ + for(int y = 0; y < VGA_HEIGHT; y++){ + for(int x = 0; x < VGA_WIDTH; x++){ + vga_set_char(x, y, c); + vga_set_color(x, y, color); + } + } +} diff --git a/src/kernel/drivers/vga.h b/src/kernel/drivers/vga.h index 700140a..d80f306 100644 --- a/src/kernel/drivers/vga.h +++ b/src/kernel/drivers/vga.h @@ -53,3 +53,4 @@ int vga_get_cursor(); int vga_print_char(char c, int x, int y); void vga_print_string_at(char *str, int x, int y); void vga_print_string(char *str); +void vga_fill_screen(char c, uint8_t color); diff --git a/src/kernel/main.c b/src/kernel/main.c index ec2467e..e3e149a 100644 --- a/src/kernel/main.c +++ b/src/kernel/main.c @@ -2,13 +2,13 @@ #include "stdio.h" #include "hal/hal.h" #include "drivers/timer.h" +#include "drivers/keyboard.h" void __attribute__((cdecl)) kmain(uint64_t magic, uint64_t addr){ hal_initialize(); timer_initialize(); + keyboard_initialize(); - puts("\x1b[33mWARNING\x1b[0m"); - printf(": amazing %s ahead!\n", "math"); - printf("%i+%i=%i\n", 1, 1, 2); + clear_screen(); for(;;); } diff --git a/src/kernel/stdio.c b/src/kernel/stdio.c index 315f91e..8a21dc0 100644 --- a/src/kernel/stdio.c +++ b/src/kernel/stdio.c @@ -101,3 +101,8 @@ void printf(char *fmt, ...){ else putc(*(fmt++)); } } + +void clear_screen(){ + vga_fill_screen(' ', VGA_COLOR_BG_BLACK | VGA_COLOR_FG_WHITE); + vga_set_cursor(0); +} diff --git a/src/kernel/stdio.h b/src/kernel/stdio.h index 8f0a6ae..46ab96d 100644 --- a/src/kernel/stdio.h +++ b/src/kernel/stdio.h @@ -3,3 +3,4 @@ void puts(char *str); void putc(char c); void printf(char *fmt, ...); +void clear_screen(); diff --git a/src/kernel/util/string.c b/src/kernel/util/string.c new file mode 100644 index 0000000..a5f4523 --- /dev/null +++ b/src/kernel/util/string.c @@ -0,0 +1,7 @@ +#include "string.h" + +int strlen(char *s){ + int len = 0; + while(*(s++)) len++; + return len; +} diff --git a/src/kernel/util/string.h b/src/kernel/util/string.h new file mode 100644 index 0000000..d12821e --- /dev/null +++ b/src/kernel/util/string.h @@ -0,0 +1,3 @@ +#pragma once + +int strlen(char *s);