diff options
Diffstat (limited to 'devices/vga.hpp')
-rw-r--r-- | devices/vga.hpp | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/devices/vga.hpp b/devices/vga.hpp new file mode 100644 index 0000000..5287d73 --- /dev/null +++ b/devices/vga.hpp @@ -0,0 +1,51 @@ +#pragma once + +#include <stdio.h> + +/** Hardware text mode color constants. */ +enum vga_color { + VGA_COLOR_BLACK = 0, + VGA_COLOR_BLUE = 1, + VGA_COLOR_GREEN = 2, + VGA_COLOR_CYAN = 3, + VGA_COLOR_RED = 4, + VGA_COLOR_MAGENTA = 5, + VGA_COLOR_BROWN = 6, + VGA_COLOR_LIGHT_GREY = 7, + VGA_COLOR_DARK_GREY = 8, + VGA_COLOR_LIGHT_BLUE = 9, + VGA_COLOR_LIGHT_GREEN = 10, + VGA_COLOR_LIGHT_CYAN = 11, + VGA_COLOR_LIGHT_RED = 12, + VGA_COLOR_LIGHT_MAGENTA = 13, + VGA_COLOR_LIGHT_BROWN = 14, + VGA_COLOR_WHITE = 15, +}; + +FILE *vga_init(void *buffer); + +struct VGA : public kIoDevice { + VGA(void *addr); + + void putc(char a) override; + int puts(const char *string, int length) override; + void + flush() override + { + update_cursor(); + } + + struct __attribute__((packed)) VGAEntry { + unsigned char text; + unsigned char foreground : 4; + unsigned char background : 4; + }; + +private: + void clear(enum vga_color foreground, enum vga_color background); + void update_cursor(); + + struct VGAEntry *buffer; + int col = 0; + int row = 0; +}; |