Archive / / / / / screen.c
2002-12-01 03:59:44 UTC
previous next
void boot_printf(unsigned char color, const char *format, ...) { char *arg = ((char *) &format) + 1; unsigned char *video_mem = 0; char *string; outportb(0x3d4, 0x0E); video_mem = inportb(0x3d5); video_mem <<= 8; outportb(0x3d4, 0x0F); video_mem += inportb(0x3d5); video_mem <<= 1; video_mem += 0xb8000; while (*format != 0) { if (*format == '%') { format++; switch (*format) { case 's': string = (char *) *arg++; if (!string) string = "(null)"; while (*string) { *video_mem = *string; video_mem++; *video_mem = color; video_mem++; string++; } case '%': *video_mem = '%'; video_mem++; *video_mem = color; video_mem++; format++; break; default: format++; } if (*format == 0) break; } if (*format == '\n') { video_mem = (char *) ((int)video_mem - 0b8000) / 160; /* Gets line number from address*/ video_mem++; video_mem = (char *) ((int)video_mem * 160) + 0xb8000; /* Gets address of next line */ format++; if (*format == 0) break; } *video_mem = *format; video_mem++; *video_mem = color; video_mem++; format++; } } /* void itoa(char *buf, char base, int num) */