diff options
Diffstat (limited to 'kernel/gpu')
| -rw-r--r-- | kernel/gpu/text_mode/colours.h | 16 | ||||
| -rw-r--r-- | kernel/gpu/text_mode/display.c | 64 | ||||
| -rw-r--r-- | kernel/gpu/text_mode/display.h | 7 |
3 files changed, 87 insertions, 0 deletions
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 |