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/gpu/text_mode | |
| parent | c68b5b688db76e00126302bbac669a5639949943 (diff) | |
| download | tinyOS-820fa143edde3bf1ca103869dfaff8ba35e8702b.tar.xz tinyOS-820fa143edde3bf1ca103869dfaff8ba35e8702b.zip | |
Add hardware cursor support
Diffstat (limited to 'kernel/gpu/text_mode')
| -rw-r--r-- | kernel/gpu/text_mode/display.c | 21 |
1 files changed, 18 insertions, 3 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(); +} + |