//kio.c // Author: Josh Holtrop // Created: 12/25/03 // Modified: 12/25/03 // This is the main output routine, it uses a format string and a variable // number of arguments to print formatted text void printf(char *fmt, ...) { dword *params = ((dword *)(&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': putDec(*params); params++; break; case 'u': case 'U': putDecu(*params); params++; break; case 'x': case 'X': putHex(*params); params++; break; } } else { switch (fmt[i]) { case '%': special = 1; break; case 0: return; default: putc(fmt[i]); } } } } // This function draws a single character void putc(dword chr) { char charac = (char)chr; word *vidmem = (word *)0xC00B8000; if (charac == '\n') { if (cursorPosition % 80) cursorPosition = cursorPosition + 80 - (cursorPosition % 80); else cursorPosition += 80; } else if (charac == '\t') { if (cursorPosition % 8) cursorPosition = cursorPosition + 8 - (cursorPosition % 8); else cursorPosition += 8; } else { if (videoMode) { console_memory[cursorPosition] = charac | 0x0700; video_drawConsoleChar(cursorPosition); } else { console_memory[cursorPosition] = charac | 0x0700; vidmem[cursorPosition] = charac | 0x0700; } cursorPosition++; } if (cursorPosition >= 2000) { console_scroll(); cursorPosition = 2000-80; if (videoMode) video_drawConsole(); } if (!videoMode) writeCursorPosition(cursorPosition); } // This function displays a number in hexadecimal int putHex(dword number) { int hitNum = 0; int i; for (i = 7; i >= 0; i--) { dword val = (number >> (i*4)) & 0xF; if ((val != 0) || (i == 0)) hitNum = 1; if (hitNum) { val = val + '0'; if (val > '9') val = val + ('A' - '9' - 1); putc(val); } } }