aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xbuild.sh6
-rw-r--r--kernel/io/text_mode_diplay.h3
-rw-r--r--kernel/io/vga/colours.h16
-rw-r--r--kernel/io/vga/text_mode_diplay.h4
-rw-r--r--kernel/io/vga/text_mode_display.c (renamed from kernel/io/text_mode_display.c)18
-rw-r--r--kernel/kernel.c12
6 files changed, 46 insertions, 13 deletions
diff --git a/build.sh b/build.sh
index 9b67fcb..6de1500 100755
--- a/build.sh
+++ b/build.sh
@@ -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()