#define NB_COLS 80 #define NB_ROWS 25 /* XXX doest not always handle memory overlaps */ static void my_memmove(void *dest, const void *src, size_t n) { for (size_t i = 0; i < n; ++i) { dest[i] = src[i]; } } static void my_memset(void *dest, int c, size_t n) { for (size_t i = 0; i < n; ++i) { dest[i] = c; } } int printk(const char *str) { static char *offset = (char *) 0xb8000; static char *addr = offset; int count = 0; for (int i = 0; str[i]; ++i) { if ((long)addr >= 0xb8000 + NB_COLS * NB_ROWS) { /* shift up */ addr -= NB_COLS; my_memmove(offset, offset + NB_COLS, NB_COLS * (NB_ROWS - 1)); my_memset(offset + NB_COLS * (NB_ROWS - 1), ' ', NB_ROWS); } *addr++ = str[i] ++count; } return count; } int main(void) { }