|
|
1.1 root 1: /* kprintf.c - kprintf, kputc, savestate, rststate */
2:
3: #include <conf.h>
4: #include <kernel.h>
5: #include <io.h>
6: #include <slu.h>
7: #include <tty.h>
8: #include <procreg.h>
9:
10: /*------------------------------------------------------------------------
11: * kprintf -- kernel printf: formatted, unbuffered output to CONSOLE
12: *------------------------------------------------------------------------
13: */
14: kprintf(fmt, args) /* Derived by Bob Brown, Purdue U. */
15: char *fmt; /* Flow control added by Steve Munson */
16: {
17: int kputc();
18: savestate();
19: _doprnt(fmt, &args, kputc, CONSOLE);
20: rststate();
21: return(OK);
22: }
23:
24: /*------------------------------------------------------------------------
25: * kputc -- write a character on the non memory-mapped console device
26: * using polled I/O
27: *------------------------------------------------------------------------
28: */
29: LOCAL kputc(device ,c)
30: int device;
31: register char c; /* character to print from _doprnt */
32: {
33: register int crstat, crbuf, ctstat;
34: register struct tty *ttyptr;
35:
36: if ( device != CONSOLE || c == 0 )
37: return;
38: if ( c == NEWLINE )
39: kputc( device, RETURN );
40: ttyptr = (struct tty *)devtab[device].dvioblk; /* control block*/
41: if (ttyptr) {
42: crstat = mfpr(RXCS); /* get recv. stat */
43: crbuf = mfpr(RXDB); /* get content of receiver buffer */
44: if ((crstat&SLUREADY) &&
45: (ttyptr->oheld || (ttyptr->oflow &&
46: (crbuf & SLUCHMASK) == ttyptr->ostop)))
47: do {
48: crstat = mfpr(RXCS); /* get recv stat */
49: while (!(crstat&SLUREADY)) /* wait til ready */
50: crstat = mfpr(RXCS);/* get recv stat */
51: crbuf = mfpr(RXDB); /* get rec buffer */
52: } while ((crbuf&SLUCHMASK) == ttyptr->ostop);
53: ttyptr->oheld = FALSE;
54: }
55: ctstat = mfpr(TXCS); /* get transmit status */
56: while (!(ctstat & SLUREADY)) /* not ready to transmit yet */
57: ctstat = mfpr(TXCS); /* poll for idle*/
58: mtpr(c & SLUCHMASK, TXDB); /* transmit character */
59: ctstat = mfpr(TXCS); /* get transmit status */
60: while (!(ctstat & SLUREADY))
61: ctstat = mfpr(TXCS); /* get transmit status */
62: }
63:
64: LOCAL int savecrstat, savectstat;
65: LOCAL PStype ps;
66: /*------------------------------------------------------------------------------
67: * savestate -- save the state of the non-memory mapped CONSOLE device
68: *------------------------------------------------------------------------------
69: */
70: LOCAL savestate()
71: {
72: disable(ps);
73: savecrstat = mfpr(RXCS) & SLUENABLE;
74: savectstat = mfpr(TXCS) & SLUENABLE;
75: mtpr(SLUDISABLE, RXCS); /* disable receive intpts */
76: mtpr(SLUDISABLE, TXCS); /* disable transmit intpts */
77: }
78:
79: /*--------------------------------------------------------------------------
80: * rststate -- restore the state of the non-memory mapped CONSOLE device
81: *--------------------------------------------------------------------------
82: */
83: LOCAL rststate()
84: {
85: mtpr(savecrstat, RXCS);
86: mtpr(savectstat, TXCS);
87: restore(ps);
88: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.