);
}
-void strblit(char *src, int row, int col)
+void strblit(char *src, int row, int col, int fill)
{
char *destp = vga_base() + row * 80 * 2 + col * 2;
outb(0x80, 0x3C);
{
*(destp++) = *(src++);
*(destp++) = COLOR;
+ col++;
}
+ if (fill)
+ while (col < 80)
+ {
+ *(destp++) = ' ';
+ *(destp++) = COLOR;
+ col++;
+ }
outb(0x80, 0x3F);
smram_restore_state(old_state);
void outlog()
{
- int y, x;
- char *basep = vga_base();
-
- smram_state_t old_state = smram_save_state();
-
- smram_aseg_set_state(SMRAM_ASEG_SMMCODE);
-
- for (y = 0; y < LOG_ONSCREEN; y++)
- for (x = 40; x < 80; x++)
- {
- basep[y*80*2+x*2] = ' ';
- basep[y*80*2+x*2+1] = 0x1F;
- }
+ int y;
- smram_restore_state(old_state);
-
for (y = -LOG_ONSCREEN; y < 0; y++)
- strblit(logents[(y + prodptr) % LOGLEN], y + LOG_ONSCREEN, 40);
+ strblit(logents[(y + prodptr) % LOGLEN], y + LOG_ONSCREEN, 40, 1);
}
void dolog(const char *s)
prodptr = (prodptr + 1) % LOGLEN;
while (*s)
serial_tx(*(s++));
+ serial_tx('\r');
+ serial_tx('\n');
if (flush_imm)
outlog();
}
void dologf(const char *fmt, ...)
{
+ char *s;
+ va_list va;
+
+ va_start(va, fmt);
+ vsnprintf(logents[prodptr], 40, fmt, va);
+ s = logents[prodptr];
+ while (*s)
+ serial_tx(*(s++));
+ serial_tx('\r');
+ serial_tx('\n');
+ va_end(va);
+ prodptr = (prodptr + 1) % LOGLEN;
+ if (flush_imm)
+ outlog();
}
void (*outputf)(const char *s, ...) = dologf;