#include #include #define VGA_COLUMNS 80 #define VGA_LINES 25 #define VGA_START (uint16_t *)0x000b8000 #define VGA_END (VGA_START + VGA_COLUMNS * VGA_LINES) uint16_t *cursor = VGA_START; uint16_t color = 0x1f00; void vga_scroll() { cursor = VGA_START; } void vga_blank() { uint32_t f = (color << 16) | color | 0x00200020; uint32_t *p = (uint32_t *)VGA_START; while (p < (uint32_t *)VGA_END) *(p++) = f; cursor = VGA_START; } void vga_printch(uint8_t ch) { if (ch == '\n') { if ((cursor = cursor - (cursor - VGA_START) % VGA_COLUMNS + VGA_COLUMNS) == VGA_END) vga_scroll(); return; } *(cursor++) = color | ch; if (cursor == VGA_END) vga_scroll(); } void vga_printsz(uint8_t *sz) { while (*sz) vga_printch(*(sz++)); } void vga_printsn(uint8_t *sn, uint8_t n) { while (n--) vga_printch(*(sn++)); } void vga_printu32(uint32_t n) { bool zero = false; for (uint32_t m = 1000000000; m; m /= 10) { uint8_t d = (n / m) % 10; if (zero) vga_printch(d + '0'); else if (d) { zero = true; vga_printch(d + '0'); } } } void vga_printu16(uint16_t n) { bool zero = false; for (uint16_t m = 10000; m; m /= 10) { uint8_t d = (n / m) % 10; if (zero) vga_printch(d + '0'); else if (d) { zero = true; vga_printch(d + '0'); } } } void vga_printu8(uint8_t n) { bool zero = false; for (uint8_t m = 100; m; m /= 10) { uint8_t d = (n / m) % 10; if (zero) vga_printch(d + '0'); else if (d) { zero = true; vga_printch(d + '0'); } } }