|
|
1.1 root 1: /*
2: * Copyright (c) 1982, 1986 Regents of the University of California.
3: * All rights reserved. The Berkeley software License Agreement
4: * specifies the terms and conditions for redistribution.
5: *
6: * @(#)prf.c 7.5 (Berkeley) 6/6/88
7: */
8:
9: #include "param.h"
10:
11: #include "../vax/mtpr.h"
12: #include "../vax/cons.h"
13:
14: /*
15: * Scaled down version of C Library printf.
16: * Used to print diagnostic information directly on console tty.
17: * Since it is not interrupt driven, all system activities are
18: * suspended. Printf should not be used for chit-chat.
19: *
20: * One additional format: %b is supported to decode error registers.
21: * Usage is:
22: * printf("reg=%b\n", regval, "<base><arg>*");
23: * Where <base> is the output base expressed as a control character,
24: * e.g. \10 gives octal; \20 gives hex. Each arg is a sequence of
25: * characters, the first of which gives the bit number to be inspected
26: * (origin 1), and the next characters (up to a control character, i.e.
27: * a character <= 32), give the name of the register. Thus
28: * printf("reg=%b\n", 3, "\10\2BITTWO\1BITONE\n");
29: * would produce output:
30: * reg=2<BITTWO,BITONE>
31: */
32: /*VARARGS1*/
33: printf(fmt, x1)
34: char *fmt;
35: unsigned x1;
36: {
37:
38: prf(fmt, &x1);
39: }
40:
41: prf(fmt, adx)
42: register char *fmt;
43: register u_int *adx;
44: {
45: register int b, c, i;
46: char *s;
47: int any;
48:
49: loop:
50: while ((c = *fmt++) != '%') {
51: if(c == '\0')
52: return;
53: putchar(c);
54: }
55: again:
56: c = *fmt++;
57: /* THIS CODE IS VAX DEPENDENT IN HANDLING %l? AND %c */
58: switch (c) {
59:
60: case 'l':
61: goto again;
62: case 'x': case 'X':
63: b = 16;
64: goto number;
65: case 'd': case 'D':
66: case 'u': /* what a joke */
67: b = 10;
68: goto number;
69: case 'o': case 'O':
70: b = 8;
71: number:
72: printn((u_long)*adx, b);
73: break;
74: case 'c':
75: b = *adx;
76: for (i = 24; i >= 0; i -= 8)
77: if (c = (b >> i) & 0x7f)
78: putchar(c);
79: break;
80: case 'b':
81: b = *adx++;
82: s = (char *)*adx;
83: printn((u_long)b, *s++);
84: any = 0;
85: if (b) {
86: while (i = *s++) {
87: if (b & (1 << (i-1))) {
88: putchar(any? ',' : '<');
89: any = 1;
90: for (; (c = *s) > 32; s++)
91: putchar(c);
92: } else
93: for (; *s > 32; s++)
94: ;
95: }
96: if (any)
97: putchar('>');
98: }
99: break;
100:
101: case 's':
102: s = (char *)*adx;
103: while (c = *s++)
104: putchar(c);
105: break;
106: }
107: adx++;
108: goto loop;
109: }
110:
111: /*
112: * Print a character on console.
113: */
114: putchar(c)
115: register c;
116: {
117: register s, timo;
118: #if VAX630
119: extern (*v_putc)();
120:
121: if (v_putc) {
122: (*v_putc)(c);
123: if (c == '\n')
124: (*v_putc)('\r');
125: return;
126: }
127: #endif
128: timo = 30000;
129: /*
130: * Try waiting for the console tty to come ready,
131: * otherwise give up after a reasonable time.
132: */
133: while((mfpr(TXCS)&TXCS_RDY) == 0)
134: if(--timo == 0)
135: break;
136: if(c == 0)
137: return;
138: s = mfpr(TXCS);
139: mtpr(TXCS,0);
140: mtpr(TXDB, c&0xff);
141: if(c == '\n')
142: putchar('\r');
143: putchar(0);
144: mtpr(TXCS, s);
145: }
146:
147: getchar()
148: {
149: register c;
150: #if VAX630
151: extern (*v_getc)();
152:
153: if (v_getc) {
154: c = (*v_getc)();
155: } else {
156: #endif
157: while((mfpr(RXCS)&RXCS_DONE) == 0)
158: ;
159: c = mfpr(RXDB)&0177;
160: #if VAX630
161: }
162: #endif
163: if (c=='\r')
164: c = '\n';
165: if (c != '\b' && c != '\177')
166: putchar(c);
167: return(c);
168: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.