summaryrefslogtreecommitdiff
path: root/src/output/vga_character.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/output/vga_character.c')
-rw-r--r--src/output/vga_character.c49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/output/vga_character.c b/src/output/vga_character.c
new file mode 100644
index 0000000..bd59a97
--- /dev/null
+++ b/src/output/vga_character.c
@@ -0,0 +1,49 @@
+#include "vga_character.h"
+
+__asm__(".code16gcc\n");
+
+static short CURSOR_LOC = 0;
+static char* HEX_CHARS = "0123456789abcdef";
+
+void vga_graphics_write_str(char* str) {
+ while(*str) {
+ vga_graphics_write_with_attr(*str++, 7);
+ }
+}
+
+void vga_graphics_write_with_attr(char value, char attr) {
+ vga_graphics_write_at_offset(value, CURSOR_LOC++);
+ vga_graphics_write_at_offset(attr, CURSOR_LOC++);
+}
+
+void vga_graphics_write(char value) {
+ vga_graphics_write_at_offset(value, CURSOR_LOC);
+ CURSOR_LOC += 2;
+}
+
+void vga_graphics_byte_hex(char value) {
+ char low = value & 0x0f;
+ char high = (value & 0xf0) >> 4;
+ vga_graphics_write(HEX_CHARS[high]);
+ vga_graphics_write(HEX_CHARS[low]);
+}
+
+void vga_graphics_write_at_offset(char value, short offset) {
+ __asm__(
+ "mov %0, %%al \n"
+ "mov %1, %%di \n"
+ "mov %%al, %%gs:(%%di) \n"
+ : :"r"(value), "r"(offset) : "%ax", "%di");
+}
+
+void vga_graphics_clear() {
+ int TERM_WIDTH = 80;
+ int TERM_HEIGHT = 25;
+
+ int i = 0;
+ while(i < TERM_WIDTH * TERM_HEIGHT) {
+ vga_graphics_write_with_attr(' ', 7);
+ i++;
+ }
+ CURSOR_LOC = 0;
+}