// kout.c // Author: Josh Holtrop // Date: 08/02/04 // Modified: 08/16/04 #include "hos_defines.h" #include "char/parallel.h" #include "kout.h" #include "lang/conv.h" #include "fs/devices.h" extern int display_activeConsole; char buffer[64]; // print a character void putc(int c) { #ifdef PARALLEL_DEBUG char_write(MAJORC_PARALLEL, 0, c); #endif char_write(MAJORC_VCONSOLE, display_activeConsole, c); } // print a formatted string void kprintf(char *fmt, ...) { u32_t *params = ((u32_t *)(&fmt)) + 1; //points to the first paramater int i; int special = 0; for (i = 0; ; i++) { if (special) { special = 0; switch (fmt[i]) { case 0: return; case '%': putc('%'); break; case 's': case 'S': puts((char *)*params); params++; break; case 'c': case 'C': putc(*params); params++; break; case 'd': case 'D': case 'i': case 'I': putDec(*params); params++; break; case 'u': case 'U': putDecu(*params); params++; break; case 'x': case 'X': putHex(*params); params++; break; case 'b': case 'B': kio_putBCD(*params); params++; break; } } else { switch (fmt[i]) { case '%': special = 1; break; case 0: return; default: putc(fmt[i]); } } } } // This function prints a raw string void puts(char *str) { while (*str) { putc(*str++); } } // This function prints a signed, decimal integer void putDec(int num) { itoa(num, buffer); puts(buffer); } // This function prints an unsigned, decimal integer void putDecu(u32_t num) { utoa(num, buffer); puts(buffer); } // This function displays a number in hexadecimal void putHex(u32_t num) { itox(num, buffer); puts(buffer); } // This function prints a two-digit binary-coded-decimal value void kio_putBCD(u32_t bcd) { bcdtoa(bcd, buffer); }