diff options
| author | James Barnett <noreply@jamesbarnett.xyz> | 2019-05-25 23:31:57 +0100 |
|---|---|---|
| committer | James Barnett <noreply@jamesbarnett.xyz> | 2019-05-25 23:31:57 +0100 |
| commit | ef0c2b2bfe2de7721674521f11c583f943f77461 (patch) | |
| tree | dadc8e45ce94d4aab1bfcbd277993132ffd64433 | |
| parent | 506f1691f1ca7b562d82ab6f2280b87d0e4af84c (diff) | |
| download | tinyOS-ef0c2b2bfe2de7721674521f11c583f943f77461.tar.xz tinyOS-ef0c2b2bfe2de7721674521f11c583f943f77461.zip | |
Handle backspace and newline scancode
| -rw-r--r-- | kernel/io/keyboard/keyboard_handler.c | 12 | ||||
| -rw-r--r-- | kernel/io/vga/text_mode_display.c | 18 | ||||
| -rw-r--r-- | kernel/io/vga/text_mode_display.h | 4 | ||||
| -rw-r--r-- | kernel/kernel.c | 3 |
4 files changed, 34 insertions, 3 deletions
diff --git a/kernel/io/keyboard/keyboard_handler.c b/kernel/io/keyboard/keyboard_handler.c index 86a50a7..2578ebf 100644 --- a/kernel/io/keyboard/keyboard_handler.c +++ b/kernel/io/keyboard/keyboard_handler.c @@ -67,7 +67,17 @@ void handle_keypress() { if(!isKeyup(scancode)) { char pressed_key = scancode_map[scancode]; - vga_print_raw(pressed_key); + switch(pressed_key) + { + case '\b': + vga_backspace(); + break; + case '\n': + vga_newline(); + break; + default: + vga_print_raw(pressed_key); + } } } diff --git a/kernel/io/vga/text_mode_display.c b/kernel/io/vga/text_mode_display.c index bfee909..db0e028 100644 --- a/kernel/io/vga/text_mode_display.c +++ b/kernel/io/vga/text_mode_display.c @@ -4,7 +4,7 @@ #define ROWS 25 #define FRAME_SIZE (ROWS * COLS) -char *video_ram = (char *)0xB8000; +char *video_ram = (char *) 0xB8000; int cursor_pos = 0; int char_attribute_byte = 0x07; @@ -45,4 +45,20 @@ void vga_print_raw(unsigned char byte) { video_ram[cursor_pos++] = byte; video_ram[cursor_pos++] = char_attribute_byte; +} + +// TODO - jump cursor to prev non 0 text char rather than reversing through whole array +void vga_backspace() +{ + if (cursor_pos != 0) + { + video_ram[--cursor_pos] = char_attribute_byte; + video_ram[--cursor_pos] = 0; + } +} + +void vga_newline() +{ + int current_line = cursor_pos / COLS; + cursor_pos = (current_line + 1) * COLS; }
\ No newline at end of file diff --git a/kernel/io/vga/text_mode_display.h b/kernel/io/vga/text_mode_display.h index 48bae85..6c46185 100644 --- a/kernel/io/vga/text_mode_display.h +++ b/kernel/io/vga/text_mode_display.h @@ -2,4 +2,6 @@ void vga_clear_screen(); void vga_print(char *msg); void vga_print_ln(char *msg); void vga_set_text_colour(int foreground, int background); -void vga_print_raw(unsigned char byte);
\ No newline at end of file +void vga_print_raw(unsigned char byte); +void vga_backspace(); +void vga_newline();
\ No newline at end of file diff --git a/kernel/kernel.c b/kernel/kernel.c index ab518e6..fbef9d4 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -88,6 +88,9 @@ void run_kern_demo() vga_set_text_colour(COLOUR_WHITE, COLOUR_BROWN); vga_print("S"); vga_set_text_colour(COLOUR_WHITE, COLOUR_GRAY); + vga_print("!"); + + vga_set_text_colour(COLOUR_WHITE, COLOUR_BLACK); } |