From 00d5836c010e82463fff1db14e588be881cdac4e Mon Sep 17 00:00:00 2001 From: iximeow Date: Mon, 28 Sep 2015 02:39:47 -0700 Subject: refactor to multi-file build --- src/output/vga_character.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++ src/output/vga_character.h | 16 +++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 src/output/vga_character.c create mode 100644 src/output/vga_character.h (limited to 'src/output') 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; +} diff --git a/src/output/vga_character.h b/src/output/vga_character.h new file mode 100644 index 0000000..0d067f3 --- /dev/null +++ b/src/output/vga_character.h @@ -0,0 +1,16 @@ +#ifndef vga_character +#define vga_character + +void vga_graphics_write_at_offset(char, short); +void vga_graphics_write(char); +void vga_graphics_write_with_attr(char, char); +void vga_graphics_write_str(char*); + +void vga_graphics_byte_hex(char); +//void vga_graphics_short_hex(short); +//void vga_graphics_int_hex(int); +//void vga_graphics_long_hex(long); + +void vga_graphics_clear(void); + +#endif -- cgit v1.1