Minor cleanups.
[seabios.git] / src / output.c
index 0336610ee1bb3d9568f343c6b591c75f4484fa07..fc77c214899c91e7e39f0c58ab2515ceb9591a31 100644 (file)
@@ -7,7 +7,7 @@
 #include <stdarg.h> // va_list
 
 #include "farptr.h" // GET_VAR
-#include "util.h" // bprintf
+#include "util.h" // printf
 #include "biosvar.h" // struct bregs
 
 static void
@@ -20,14 +20,11 @@ screenc(u8 c)
     call16_int(0x10, &br);
 }
 
-// XXX
-#define PORT_DEBUG  0x403
-
 // Write a charcter to the framebuffer.
 static void
 putc(u16 action, char c)
 {
-    outb(c, PORT_DEBUG);
+    outb(c, PORT_BIOS_DEBUG);
     if (action) {
         if (c == '\n')
             screenc('\r');
@@ -48,7 +45,7 @@ static void
 puts_cs(u16 action, const char *s)
 {
     for (;; s++) {
-        char c = GET_VAR(CS, (u8)*s);
+        char c = GET_VAR(CS, *(u8*)s);
         if (!c)
             break;
         putc(action, c);
@@ -103,14 +100,12 @@ isdigit(u8 c)
     return c - '0' < 10;
 }
 
-void
-bprintf(u16 action, const char *fmt, ...)
+static void
+bvprintf(u16 action, const char *fmt, va_list args)
 {
-    va_list args;
-    va_start(args, fmt);
     const char *s = fmt;
     for (;; s++) {
-        char c = GET_VAR(CS, (u8)*s);
+        char c = GET_VAR(CS, *(u8*)s);
         if (!c)
             break;
         if (c != '%') {
@@ -119,7 +114,7 @@ bprintf(u16 action, const char *fmt, ...)
         }
         const char *n = s+1;
         for (;;) {
-            c = GET_VAR(CS, (u8)*n);
+            c = GET_VAR(CS, *(u8*)n);
             if (!isdigit(c))
                 break;
             n++;
@@ -127,7 +122,7 @@ bprintf(u16 action, const char *fmt, ...)
         if (c == 'l') {
             // Ignore long format indicator
             n++;
-            c = GET_VAR(CS, (u8)*n);
+            c = GET_VAR(CS, *(u8*)n);
         }
         s32 val;
         const char *sarg;
@@ -147,6 +142,7 @@ bprintf(u16 action, const char *fmt, ...)
             val = va_arg(args, s32);
             putuint(action, val);
             break;
+        case 'p':
         case 'x':
             val = va_arg(args, s32);
             puthex(action, val);
@@ -155,6 +151,14 @@ bprintf(u16 action, const char *fmt, ...)
             val = va_arg(args, int);
             putc(action, val);
             break;
+        case '.':
+            // Hack to support "%.s" - meaning string on stack.
+            if (GET_VAR(CS, *(u8*)(n+1)) != 's')
+                break;
+            n++;
+            sarg = va_arg(args, const char *);
+            puts(action, sarg);
+            break;
         case 's':
             sarg = va_arg(args, const char *);
             puts_cs(action, sarg);
@@ -165,6 +169,37 @@ bprintf(u16 action, const char *fmt, ...)
         }
         s = n;
     }
+}
+
+void
+BX_PANIC(const char *fmt, ...)
+{
+    va_list args;
+    va_start(args, fmt);
+    bvprintf(0, fmt, args);
+    va_end(args);
+
+    // XXX - use PANIC PORT.
+    irq_disable();
+    for (;;)
+        hlt();
+}
+
+void
+BX_INFO(const char *fmt, ...)
+{
+    va_list args;
+    va_start(args, fmt);
+    bvprintf(0, fmt, args);
+    va_end(args);
+}
+
+void
+printf(const char *fmt, ...)
+{
+    va_list args;
+    va_start(args, fmt);
+    bvprintf(1, fmt, args);
     va_end(args);
 }
 
@@ -172,15 +207,14 @@ static void
 dump_regs(const char *fname, const char *type, struct bregs *regs)
 {
     if (!regs) {
-        bprintf(0, "%s %s: NULL\n", type, fname);
+        BX_INFO("%s %s: NULL\n", type, fname);
         return;
     }
-    bprintf(0, "%s %s: a=%x b=%x c=%x d=%x si=%x di=%x\n"
+    BX_INFO("%s %s: a=%x b=%x c=%x d=%x si=%x di=%x\n"
             , type, fname, regs->eax, regs->ebx, regs->ecx, regs->edx
             , regs->esi, regs->edi);
-    bprintf(0, "  ds=%x es=%x ip=%x cs=%x f=%x\n"
-            , regs->ds, regs->es
-            , regs->ip, regs->cs, regs->flags);
+    BX_INFO("  ds=%x es=%x ip=%x cs=%x f=%x r=%p\n"
+            , regs->ds, regs->es, regs->ip, regs->cs, regs->flags, regs);
 }
 
 void