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) */