#include "serial.h" #include "vga.h" /* XXX doest not always handle memory overlaps */ static void my_memmove(void *_dest, const void *_src, int n) { char *dest = _dest; const char *src = _src; for (int i = 0; i < n; ++i) { dest[i] = src[i]; } } static void clear_line(void *_addr) { char *addr = _addr; for (int i = 0; i < VGA_COLS; ++i) { if (i % VGA_BPC == 0) { *addr++ = ' '; } else { *addr++ = 0x7; } } } int printk(const char *str) { static const long int offset = VGA_BASE; static char *addr = (char *) VGA_BASE; int count = 0; for (int i = 0; str[i]; ++i) { serial_putchar(str[i]); char chr; char *new_addr = addr; char *addr_line = (char *)(((long)(addr - offset) / VGA_BPR) * VGA_BPR) + offset; if ((long)addr >= offset + VGA_ROWS * VGA_BPR) { /* shift up */ addr -= VGA_BPR; addr_line -= VGA_BPR; my_memmove((void *)offset, (void *)offset + VGA_BPR, VGA_BPR * (VGA_ROWS - 1)); clear_line(addr_line); } switch (str[i]) { case '\n': new_addr = addr_line + VGA_BPR; chr = '\0'; break; default: new_addr = addr + VGA_BPC; chr = str[i]; break; } if (chr) *addr = chr; addr = new_addr; ++count; } return count; } int main(void) { serial_init(); return 0; }