From c68b5b688db76e00126302bbac669a5639949943 Mon Sep 17 00:00:00 2001 From: James Barnett Date: Sun, 26 May 2019 15:32:53 +0100 Subject: Reorganise files --- kernel/gpu/text_mode/colours.h | 16 +++++++++++ kernel/gpu/text_mode/display.c | 64 ++++++++++++++++++++++++++++++++++++++++++ kernel/gpu/text_mode/display.h | 7 +++++ 3 files changed, 87 insertions(+) create mode 100644 kernel/gpu/text_mode/colours.h create mode 100644 kernel/gpu/text_mode/display.c create mode 100644 kernel/gpu/text_mode/display.h (limited to 'kernel/gpu/text_mode') diff --git a/kernel/gpu/text_mode/colours.h b/kernel/gpu/text_mode/colours.h new file mode 100644 index 0000000..a019fd3 --- /dev/null +++ b/kernel/gpu/text_mode/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/gpu/text_mode/display.c b/kernel/gpu/text_mode/display.c new file mode 100644 index 0000000..3659e60 --- /dev/null +++ b/kernel/gpu/text_mode/display.c @@ -0,0 +1,64 @@ +#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 scrn_clear() +{ + for (int i = 0; i < FRAME_SIZE; i = i + 2) + { + video_ram[i] = ' '; + video_ram[i + 1] = char_attribute_byte; + }; + cursor_pos = 0; +} + +void scrn_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 scrn_println(char *msg) +{ + scrn_print(msg); + int current_line = cursor_pos / COLS; + cursor_pos = (current_line + 1) * COLS; +} + +void scrn_set_text_colour(int foreground, int background) +{ + char_attribute_byte = (background << 4) | foreground; +} + +void scrn_putchar(unsigned char byte) +{ + video_ram[cursor_pos++] = byte; + video_ram[cursor_pos++] = char_attribute_byte; +} + +// TODO - jump cursor to prev non 0 text char rather than reversing through whole array +void scrn_backspace() +{ + if (cursor_pos != 0) + { + video_ram[--cursor_pos] = char_attribute_byte; + video_ram[--cursor_pos] = 0; + } +} + +void scrn_newline() +{ + int current_line = cursor_pos / COLS; + cursor_pos = (current_line + 1) * COLS; +} \ No newline at end of file diff --git a/kernel/gpu/text_mode/display.h b/kernel/gpu/text_mode/display.h new file mode 100644 index 0000000..f4f3724 --- /dev/null +++ b/kernel/gpu/text_mode/display.h @@ -0,0 +1,7 @@ +void scrn_clear(); +void scrn_print(char *msg); +void scrn_println(char *msg); +void scrn_set_text_colour(int foreground, int background); +void scrn_putchar(unsigned char byte); +void scrn_backspace(); +void scrn_newline(); \ No newline at end of file -- cgit v1.2.3