From 820fa143edde3bf1ca103869dfaff8ba35e8702b Mon Sep 17 00:00:00 2001 From: James Barnett Date: Sun, 26 May 2019 16:39:13 +0100 Subject: Add hardware cursor support --- kernel/gpu/text_mode/display.c | 21 ++++++++++-- kernel/kernel.c | 78 ++---------------------------------------- 2 files changed, 21 insertions(+), 78 deletions(-) diff --git a/kernel/gpu/text_mode/display.c b/kernel/gpu/text_mode/display.c index 3659e60..19074f7 100644 --- a/kernel/gpu/text_mode/display.c +++ b/kernel/gpu/text_mode/display.c @@ -6,18 +6,29 @@ char *video_ram = (char *) 0xB8000; int cursor_pos = 0; -int char_attribute_byte = 0x07; +int char_attribute_byte = 0x0F; + +extern void write_port(unsigned short port, unsigned char data); void scrn_clear() { for (int i = 0; i < FRAME_SIZE; i = i + 2) { - video_ram[i] = ' '; + video_ram[i] = 0; video_ram[i + 1] = char_attribute_byte; }; cursor_pos = 0; } +void scrn_update_csr() +{ + unsigned short csr = cursor_pos/2; + write_port(0x3D4, 14); + write_port(0x3D5, csr >> 8); + write_port(0x3D4, 15); + write_port(0x3D5, csr); +} + void scrn_print(char *msg) { int j = 0; @@ -45,6 +56,7 @@ void scrn_putchar(unsigned char byte) { video_ram[cursor_pos++] = byte; video_ram[cursor_pos++] = char_attribute_byte; + scrn_update_csr(); } // TODO - jump cursor to prev non 0 text char rather than reversing through whole array @@ -54,6 +66,7 @@ void scrn_backspace() { video_ram[--cursor_pos] = char_attribute_byte; video_ram[--cursor_pos] = 0; + scrn_update_csr(); } } @@ -61,4 +74,6 @@ void scrn_newline() { int current_line = cursor_pos / COLS; cursor_pos = (current_line + 1) * COLS; -} \ No newline at end of file + scrn_update_csr(); +} + diff --git a/kernel/kernel.c b/kernel/kernel.c index 80f110d..a6540f5 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -5,9 +5,10 @@ void run_kern_demo() { - scrn_set_text_colour(COLOUR_LIGHT_GREEN, COLOUR_BLACK); + scrn_clear(); - + scrn_set_text_colour(COLOUR_LIGHT_GREEN, COLOUR_BLACK); + scrn_println(" _ _ ____ _____ "); scrn_println(" | | (_) / __ \\ / ____|"); scrn_println(" | |_ _ _ __ _ _| | | | (___ "); @@ -17,79 +18,6 @@ void run_kern_demo() scrn_println(" __/ | "); scrn_println(" |___/ "); - scrn_println(""); - scrn_println("Supported colours"); - scrn_set_text_colour(COLOUR_BLUE, COLOUR_BLACK); - scrn_print("blue "); - scrn_set_text_colour(COLOUR_GREEN, COLOUR_BLACK); - scrn_print("green "); - scrn_set_text_colour(COLOUR_CYAN, COLOUR_BLACK); - scrn_print("cyan "); - scrn_set_text_colour(COLOUR_RED, COLOUR_BLACK); - scrn_print("red "); - scrn_set_text_colour(COLOUR_PURPLE, COLOUR_BLACK); - scrn_print("purple "); - scrn_set_text_colour(COLOUR_BROWN, COLOUR_BLACK); - scrn_print("brown "); - scrn_set_text_colour(COLOUR_GRAY, COLOUR_BLACK); - scrn_println("gray "); - scrn_set_text_colour(COLOUR_DARK_GREY, COLOUR_BLACK); - scrn_print("dark gray "); - scrn_set_text_colour(COLOUR_LIGHT_BLUE, COLOUR_BLACK); - scrn_print("light blue "); - scrn_set_text_colour(COLOUR_LIGHT_GREEN, COLOUR_BLACK); - scrn_print("light green "); - scrn_set_text_colour(COLOUR_LIGHT_CYAN, COLOUR_BLACK); - scrn_println("light cyan"); - scrn_set_text_colour(COLOUR_LIGHT_RED, COLOUR_BLACK); - scrn_print("light red "); - scrn_set_text_colour(COLOUR_LIGHT_PURPLE, COLOUR_BLACK); - scrn_print("light purple "); - scrn_set_text_colour(COLOUR_YELLOW, COLOUR_BLACK); - scrn_print("yellow "); - scrn_set_text_colour(COLOUR_WHITE, COLOUR_BLACK); - scrn_println("white "); - - scrn_set_text_colour(COLOUR_BLACK, COLOUR_WHITE); - scrn_print("B"); - scrn_set_text_colour(COLOUR_WHITE, COLOUR_BLUE); - scrn_print("A"); - scrn_set_text_colour(COLOUR_WHITE, COLOUR_GREEN); - scrn_print("C"); - scrn_set_text_colour(COLOUR_WHITE, COLOUR_CYAN); - scrn_print("K"); - scrn_set_text_colour(COLOUR_WHITE, COLOUR_RED); - scrn_print("G"); - scrn_set_text_colour(COLOUR_WHITE, COLOUR_PURPLE); - scrn_print("R"); - scrn_set_text_colour(COLOUR_WHITE, COLOUR_BROWN); - scrn_print("O"); - scrn_set_text_colour(COLOUR_WHITE, COLOUR_GRAY); - scrn_print("U"); - scrn_set_text_colour(COLOUR_WHITE, COLOUR_LIGHT_BLUE); - scrn_print("N"); - scrn_set_text_colour(COLOUR_BLACK, COLOUR_YELLOW); - scrn_print("D"); - scrn_set_text_colour(COLOUR_BLACK, COLOUR_LIGHT_GREEN); - scrn_print(" "); - - scrn_set_text_colour(COLOUR_BLACK, COLOUR_LIGHT_CYAN); - scrn_print("C"); - scrn_set_text_colour(COLOUR_WHITE, COLOUR_LIGHT_RED); - scrn_print("O"); - scrn_set_text_colour(COLOUR_WHITE, COLOUR_LIGHT_PURPLE); - scrn_print("L"); - scrn_set_text_colour(COLOUR_BLACK, COLOUR_WHITE); - scrn_print("O"); - scrn_set_text_colour(COLOUR_WHITE, COLOUR_RED); - scrn_print("U"); - scrn_set_text_colour(COLOUR_WHITE, COLOUR_PURPLE); - scrn_print("R"); - scrn_set_text_colour(COLOUR_WHITE, COLOUR_BROWN); - scrn_print("S"); - scrn_set_text_colour(COLOUR_WHITE, COLOUR_GRAY); - scrn_print("!"); - scrn_set_text_colour(COLOUR_WHITE, COLOUR_BLACK); scrn_newline(); } -- cgit v1.2.3