From 326526206eface026e6ec291d75cd037dbec6609 Mon Sep 17 00:00:00 2001 From: James Barnett Date: Tue, 28 Aug 2018 18:02:17 +0100 Subject: Add text colour manipulation --- kernel/io/text_mode_diplay.h | 3 --- kernel/io/text_mode_display.c | 34 ------------------------------- kernel/io/vga/colours.h | 16 +++++++++++++++ kernel/io/vga/text_mode_diplay.h | 4 ++++ kernel/io/vga/text_mode_display.c | 42 +++++++++++++++++++++++++++++++++++++++ kernel/kernel.c | 12 +++++++++-- 6 files changed, 72 insertions(+), 39 deletions(-) delete mode 100644 kernel/io/text_mode_diplay.h delete mode 100644 kernel/io/text_mode_display.c create mode 100644 kernel/io/vga/colours.h create mode 100644 kernel/io/vga/text_mode_diplay.h create mode 100644 kernel/io/vga/text_mode_display.c (limited to 'kernel') diff --git a/kernel/io/text_mode_diplay.h b/kernel/io/text_mode_diplay.h deleted file mode 100644 index d2d1180..0000000 --- a/kernel/io/text_mode_diplay.h +++ /dev/null @@ -1,3 +0,0 @@ -void clear_screen(); -void print(char *msg); -void print_ln(char *msg); \ No newline at end of file diff --git a/kernel/io/text_mode_display.c b/kernel/io/text_mode_display.c deleted file mode 100644 index 514ba9f..0000000 --- a/kernel/io/text_mode_display.c +++ /dev/null @@ -1,34 +0,0 @@ -#define COLS 80 -#define ROWS 25 -#define FRAME_SIZE (ROWS * COLS * 2) // 2 bytes per char - -char *video_ram = (char *)0xB8000; -int cursor_pos = 0; - -void clear_screen() -{ - for (int i = 0; i < FRAME_SIZE; i = i + 2) - { - video_ram[i] = ' '; - video_ram[i + 1] = 0x07; - }; - cursor_pos = 0; -} - -void print(char *msg) -{ - int j = 0; - while (msg[j] != '\0') - { - video_ram[cursor_pos++] = msg[j]; - video_ram[cursor_pos++] = 0x07; - ++j; - } -} - -void print_ln(char *msg) -{ - print(msg); - int current_line = cursor_pos / COLS; - cursor_pos = (current_line + 1) * (COLS*2); -} diff --git a/kernel/io/vga/colours.h b/kernel/io/vga/colours.h new file mode 100644 index 0000000..a019fd3 --- /dev/null +++ b/kernel/io/vga/colours.h @@ -0,0 +1,16 @@ +#define COLOUR_BLACK 0x00 +#define COLOUR_BLUE 0x01 +#define COLOUR_GREEN 0x02 +#define COLOUR_CYAN 0x03 +#define COLOUR_RED 0x04 +#define COLOUR_PURPLE 0x05 +#define COLOUR_BROWN 0x06 +#define COLOUR_GRAY 0x07 +#define COLOUR_DARK_GREY 0x08 +#define COLOUR_LIGHT_BLUE 0x09 +#define COLOUR_LIGHT_GREEN 0x0A +#define COLOUR_LIGHT_CYAN 0x0B +#define COLOUR_LIGHT_RED 0x0C +#define COLOUR_LIGHT_PURPLE 0x0D +#define COLOUR_YELLOW 0x0E +#define COLOUR_WHITE 0x0F \ No newline at end of file diff --git a/kernel/io/vga/text_mode_diplay.h b/kernel/io/vga/text_mode_diplay.h new file mode 100644 index 0000000..269a6ce --- /dev/null +++ b/kernel/io/vga/text_mode_diplay.h @@ -0,0 +1,4 @@ +void clear_screen(); +void print(char *msg); +void print_ln(char *msg); +void set_text_colour(int foreground, int background); \ No newline at end of file diff --git a/kernel/io/vga/text_mode_display.c b/kernel/io/vga/text_mode_display.c new file mode 100644 index 0000000..958eb87 --- /dev/null +++ b/kernel/io/vga/text_mode_display.c @@ -0,0 +1,42 @@ +#include "colours.h" + +#define COLS (80 * 2) // 2 bytes per char +#define ROWS 25 +#define FRAME_SIZE (ROWS * COLS) + +char *video_ram = (char *)0xB8000; +int cursor_pos = 0; +int char_attribute_byte = 0x07; + +void clear_screen() +{ + for (int i = 0; i < FRAME_SIZE; i = i + 2) + { + video_ram[i] = ' '; + video_ram[i + 1] = char_attribute_byte; + }; + cursor_pos = 0; +} + +void print(char *msg) +{ + int j = 0; + while (msg[j] != '\0') + { + video_ram[cursor_pos++] = msg[j]; + video_ram[cursor_pos++] = char_attribute_byte; + ++j; + } +} + +void print_ln(char *msg) +{ + print(msg); + int current_line = cursor_pos / COLS; + cursor_pos = (current_line + 1) * COLS; +} + +void set_text_colour(int foreground, int background) +{ + char_attribute_byte = (background << 4) | foreground; +} \ No newline at end of file diff --git a/kernel/kernel.c b/kernel/kernel.c index e872fa5..d10060a 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -1,12 +1,20 @@ -#include "./io/text_mode_diplay.h" +#include "./io/vga/text_mode_diplay.h" +#include "./io/vga/colours.h" void run_kern() { clear_screen(); print_ln("I am a kernel!"); + set_text_colour(COLOUR_WHITE, COLOUR_GREEN); print("I am on a new line"); - print(" - I am not"); + print_ln(" - I am not"); + + set_text_colour(COLOUR_RED, COLOUR_WHITE); + print_ln("red on white"); + + set_text_colour(COLOUR_WHITE, COLOUR_BLUE); + print_ln("white on blue"); } void kernel_entrypoint() -- cgit v1.2.3