diff options
| author | James Barnett <noreply@jamesbarnett.xyz> | 2019-05-26 16:39:13 +0100 |
|---|---|---|
| committer | James Barnett <noreply@jamesbarnett.xyz> | 2019-05-26 16:39:13 +0100 |
| commit | 820fa143edde3bf1ca103869dfaff8ba35e8702b (patch) | |
| tree | f6e5df4e26421fa4313b9d210a86970489a2f187 /kernel | |
| parent | c68b5b688db76e00126302bbac669a5639949943 (diff) | |
| download | tinyOS-820fa143edde3bf1ca103869dfaff8ba35e8702b.tar.xz tinyOS-820fa143edde3bf1ca103869dfaff8ba35e8702b.zip | |
Add hardware cursor support
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/gpu/text_mode/display.c | 21 | ||||
| -rw-r--r-- | 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(); } |