diff options
| author | James Barnett <noreply@jamesbarnett.xyz> | 2018-08-28 18:02:17 +0100 |
|---|---|---|
| committer | James Barnett <noreply@jamesbarnett.xyz> | 2018-08-28 18:02:17 +0100 |
| commit | 326526206eface026e6ec291d75cd037dbec6609 (patch) | |
| tree | 3b7236a4024ba183d9f512b51072343436dbdbfa | |
| parent | d5cf6a9696f6f86bec5652f94ba7485aae4ca1bc (diff) | |
| download | tinyOS-326526206eface026e6ec291d75cd037dbec6609.tar.xz tinyOS-326526206eface026e6ec291d75cd037dbec6609.zip | |
Add text colour manipulation
| -rwxr-xr-x | build.sh | 6 | ||||
| -rw-r--r-- | kernel/io/text_mode_diplay.h | 3 | ||||
| -rw-r--r-- | kernel/io/vga/colours.h | 16 | ||||
| -rw-r--r-- | kernel/io/vga/text_mode_diplay.h | 4 | ||||
| -rw-r--r-- | kernel/io/vga/text_mode_display.c (renamed from kernel/io/text_mode_display.c) | 18 | ||||
| -rw-r--r-- | kernel/kernel.c | 12 |
6 files changed, 46 insertions, 13 deletions
@@ -3,9 +3,9 @@ # TODO - proper makefile rm -rf bin/kernel/* -mkdir -p bin/kernel/io +mkdir -p bin/kernel/io/vga nasm -f elf32 kernel/kernel-bootstrap.asm -o bin/kernel-bootstrap.o gcc -m32 -std=c99 -c kernel/kernel.c -o bin/kernel/kernel.o -gcc -m32 -std=c99 -c kernel/io/text_mode_display.c -o bin/kernel/io/text_mode_display.o -ld -m elf_i386 -T link.ld -o bin/kern bin/kernel-bootstrap.o bin/kernel/kernel.o bin/kernel/io/text_mode_display.o +gcc -m32 -std=c99 -c kernel/io/vga/text_mode_display.c -o bin/kernel/io/vga/text_mode_display.o +ld -m elf_i386 -T link.ld -o bin/kern bin/kernel-bootstrap.o bin/kernel/kernel.o bin/kernel/io/vga/text_mode_display.o #ld -m elf_i386 -T link.ld -o bin/kern bin/kernel-bootstrap.o bin/**/*.o
\ No newline at end of file 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/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/text_mode_display.c b/kernel/io/vga/text_mode_display.c index 514ba9f..958eb87 100644 --- a/kernel/io/text_mode_display.c +++ b/kernel/io/vga/text_mode_display.c @@ -1,16 +1,19 @@ -#define COLS 80 +#include "colours.h" + +#define COLS (80 * 2) // 2 bytes per char #define ROWS 25 -#define FRAME_SIZE (ROWS * COLS * 2) // 2 bytes per char +#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] = 0x07; + video_ram[i + 1] = char_attribute_byte; }; cursor_pos = 0; } @@ -21,7 +24,7 @@ void print(char *msg) while (msg[j] != '\0') { video_ram[cursor_pos++] = msg[j]; - video_ram[cursor_pos++] = 0x07; + video_ram[cursor_pos++] = char_attribute_byte; ++j; } } @@ -30,5 +33,10 @@ void print_ln(char *msg) { print(msg); int current_line = cursor_pos / COLS; - cursor_pos = (current_line + 1) * (COLS*2); + 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() |