#include #include #define VGA_COLUMNS 80 #define VGA_START (uint16_t *)0x000b8000 #define VGA_END (VGA_START + VGA_COLUMNS * 25) static uint16_t *cursor = VGA_START; static uint16_t mask; void vga_set_color(uint8_t new_color) { mask = new_color << 8; } static void vga_scroll() { for (uint32_t *i = (uint32_t *)VGA_START; i < (uint32_t *)(VGA_END - VGA_COLUMNS); ++i) *i = *(i + VGA_COLUMNS / 2); uint32_t f = (mask | (uint8_t)' ') * 0x00010001; for (uint32_t *i = (uint32_t *)(VGA_END - VGA_COLUMNS); i < (uint32_t *)VGA_END; ++i) *i = f; cursor -= VGA_COLUMNS; } void vga_blank() { uint32_t f = (mask | (uint8_t)' ') * 0x00010001; uint32_t *p = (uint32_t *)VGA_START; while (p < (uint32_t *)VGA_END) *p++ = f; cursor = VGA_START; } void vga_printch(char ch) { if (ch == '\n') cursor = ((cursor - VGA_START) / VGA_COLUMNS + 1) * VGA_COLUMNS + VGA_START; else if (ch == '\b') *--cursor = mask | ' '; else *cursor++ = mask | (uint8_t)ch; if (cursor == VGA_END) vga_scroll(); }