home *** CD-ROM | disk | FTP | other *** search
- #include <dos.h>
- #include <stdarg.h>
- #include <mem.h>
- #include "types.h"
-
- static void kprintn(dword, int);
- int putchar(char c);
- static void cursor(dword pos);
- static void sput(byte c);
-
- void
- printf(const char *fmt, ...)
- {
- char *p;
- int ch;
- dword ul;
- int lflag;
- va_list ap;
-
- va_start(ap, fmt);
- for (;;) {
- while ((ch = *fmt++) != '%') {
- if (ch == '\0')
- return;
- putchar(ch);
- }
- lflag = 0;
- reswitch: switch (ch = *fmt++) {
- case 'l':
- lflag = 1;
- goto reswitch;
- case 'c':
- ch = va_arg(ap, int);
- putchar(ch & 0x7f);
- break;
- case 's':
- p = va_arg(ap, char *);
- while ((ch = *p++)!= 0)
- putchar(ch);
- break;
- case 'd':
- ul = lflag ?
- va_arg(ap, long) : va_arg(ap, int);
- if ((long)ul < 0) {
- putchar('-');
- ul = -(long)ul;
- }
- kprintn(ul, 10);
- break;
- case 'o':
- ul = lflag ?
- va_arg(ap, dword) : va_arg(ap, word);
- kprintn(ul, 8);
- break;
- case 'u':
- ul = lflag ?
- va_arg(ap, dword) : va_arg(ap, word);
- kprintn(ul, 10);
- break;
- case 'x':
- ul = lflag ?
- va_arg(ap, dword) : va_arg(ap, word);
- kprintn(ul, 16);
- break;
- default:
- putchar('%');
- if (lflag)
- putchar('l');
- putchar(ch);
- }
- }
- /* va_end(ap);*/
- }
-
- static void
- kprintn(dword ul, int base)
- {
- /* hold a long in base 8 */
- char *p, buf[16];
-
- p = buf;
- do {
- *p++ = (char) "0123456789abcdef"[(word) ul % base];
- } while (ul /= base);
- do {
- putchar(*--p);
- } while (p > buf);
- }
-
- int
- putchar(char c)
- {
- if (c == '\n')
- sput('\r');
- sput(c);
- return(0);
- }
-
- #define COL 80
- #define ROW 25
- #define CHR 2
- #define MONO_BASE 0x3B4
- #define MONO_BUF 0xB0000000
- #define CGA_BASE 0x3D4
- #define CGA_BUF 0xB8000000
-
- static byte att = 0x7 ;
- byte far *Crtat = (byte far *)CGA_BUF;
-
- static unsigned int addr_6845 = CGA_BASE;
-
- static void
- cursor(dword pos)
- {
- outportb(addr_6845,14);
- outportb(addr_6845+1,(pos >> 8)&0xff);
- outportb(addr_6845,15);
- outportb(addr_6845+1,pos&0xff);
- }
-
- static void
- sput(byte c)
- {
-
- static byte far *crtat = 0;
- unsigned cursorat;
- byte *cp;
-
- /* Extract cursor location */
- outportb(addr_6845,14);
- cursorat = inportb(addr_6845+1)<<8 ;
- outportb(addr_6845,15);
- cursorat |= inportb(addr_6845+1);
-
- if(cursorat <= COL*ROW) {
- crtat = Crtat + cursorat*CHR;
- /* att = crtat[1]; /* use current attribute present */
- } else crtat = Crtat;
-
- switch (c) {
-
- case '\t':
- do
- sput(' ');
- while ((int)crtat % (8*CHR));
- break;
-
- case '\010':
- crtat -= CHR;
- break;
-
- case '\r':
- crtat -= (word) ((crtat - Crtat) % (COL*CHR));
- break;
-
- case '\n':
- crtat += COL*CHR ;
- break;
-
- default:
- crtat[0] = c;
- crtat[1] = att;
- crtat += CHR;
- break ;
- }
-
- /* implement a scroll */
- if (crtat >= Crtat+COL*ROW*CHR) {
- /* move text up */
- memcpy(Crtat, Crtat+COL*CHR, COL*(ROW-1)*CHR);
-
- /* clear line */
- for (cp = Crtat+ COL*(ROW-1)*CHR;
- cp < Crtat + COL*ROW*CHR ; cp += 2)
- cp[0] = ' ';
-
- crtat -= COL*CHR ;
- }
-
- cursor((crtat-Crtat)/CHR);
- }
-
- void
- init_printf(void)
- {
- word was;
-
- /* probe to find if a color or monochrome display */
- was = *(word *)Crtat;
- *(word *)Crtat = 0xA55A;
- if (*(word *)Crtat != 0xA55A) {
- Crtat = (byte far *) MONO_BUF;
- addr_6845 = MONO_BASE;
- }
- *(word *)Crtat = was;
- }
-