aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kernel/io/keyboard/keyboard_handler.c12
-rw-r--r--kernel/io/vga/text_mode_display.c18
-rw-r--r--kernel/io/vga/text_mode_display.h4
-rw-r--r--kernel/kernel.c3
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);
}