aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Barnett <noreply@jamesbarnett.xyz>2019-05-26 16:39:13 +0100
committerJames Barnett <noreply@jamesbarnett.xyz>2019-05-26 16:39:13 +0100
commit820fa143edde3bf1ca103869dfaff8ba35e8702b (patch)
treef6e5df4e26421fa4313b9d210a86970489a2f187
parentc68b5b688db76e00126302bbac669a5639949943 (diff)
downloadtinyOS-820fa143edde3bf1ca103869dfaff8ba35e8702b.tar.xz
tinyOS-820fa143edde3bf1ca103869dfaff8ba35e8702b.zip
Add hardware cursor support
-rw-r--r--kernel/gpu/text_mode/display.c21
-rw-r--r--kernel/kernel.c78
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();
}