Commit | Line | Data |
---|---|---|
55b4dbd0 | 1 | /* |
0880b18e | 2 | * Copyright (c) 1982, 1986 Regents of the University of California. |
55b4dbd0 KM |
3 | * All rights reserved. The Berkeley software License Agreement |
4 | * specifies the terms and conditions for redistribution. | |
5 | * | |
37dc7db2 | 6 | * @(#)prf.c 7.4 (Berkeley) %G% |
55b4dbd0 | 7 | */ |
4d05cd07 | 8 | |
39c71180 | 9 | #include "param.h" |
a031a31b SL |
10 | |
11 | #include "../vax/mtpr.h" | |
12 | #include "../vax/cons.h" | |
4d05cd07 BJ |
13 | |
14 | /* | |
15 | * Scaled down version of C Library printf. | |
99fe9747 BJ |
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> | |
4d05cd07 BJ |
31 | */ |
32 | /*VARARGS1*/ | |
33 | printf(fmt, x1) | |
99fe9747 BJ |
34 | char *fmt; |
35 | unsigned x1; | |
4d05cd07 | 36 | { |
99fe9747 BJ |
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; | |
4d05cd07 | 46 | char *s; |
99fe9747 | 47 | int any; |
4d05cd07 | 48 | |
4d05cd07 | 49 | loop: |
99fe9747 | 50 | while ((c = *fmt++) != '%') { |
4d05cd07 BJ |
51 | if(c == '\0') |
52 | return; | |
53 | putchar(c); | |
54 | } | |
99fe9747 | 55 | again: |
4d05cd07 | 56 | c = *fmt++; |
99fe9747 BJ |
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++; | |
4d05cd07 | 82 | s = (char *)*adx; |
99fe9747 BJ |
83 | printn((u_long)b, *s++); |
84 | any = 0; | |
85 | if (b) { | |
99fe9747 BJ |
86 | while (i = *s++) { |
87 | if (b & (1 << (i-1))) { | |
d3553ea4 | 88 | putchar(any? ',' : '<'); |
99fe9747 BJ |
89 | any = 1; |
90 | for (; (c = *s) > 32; s++) | |
91 | putchar(c); | |
92 | } else | |
93 | for (; *s > 32; s++) | |
94 | ; | |
95 | } | |
d3553ea4 MK |
96 | if (any) |
97 | putchar('>'); | |
99fe9747 BJ |
98 | } |
99 | break; | |
100 | ||
101 | case 's': | |
102 | s = (char *)*adx; | |
103 | while (c = *s++) | |
4d05cd07 | 104 | putchar(c); |
99fe9747 | 105 | break; |
4d05cd07 BJ |
106 | } |
107 | adx++; | |
108 | goto loop; | |
109 | } | |
110 | ||
4d05cd07 BJ |
111 | /* |
112 | * Print a character on console. | |
4d05cd07 BJ |
113 | */ |
114 | putchar(c) | |
99fe9747 | 115 | register c; |
4d05cd07 BJ |
116 | { |
117 | register s, timo; | |
118 | ||
119 | timo = 30000; | |
120 | /* | |
121 | * Try waiting for the console tty to come ready, | |
122 | * otherwise give up after a reasonable time. | |
123 | */ | |
124 | while((mfpr(TXCS)&TXCS_RDY) == 0) | |
125 | if(--timo == 0) | |
126 | break; | |
127 | if(c == 0) | |
128 | return; | |
129 | s = mfpr(TXCS); | |
130 | mtpr(TXCS,0); | |
131 | mtpr(TXDB, c&0xff); | |
132 | if(c == '\n') | |
133 | putchar('\r'); | |
134 | putchar(0); | |
135 | mtpr(TXCS, s); | |
136 | } | |
137 | ||
138 | getchar() | |
139 | { | |
140 | register c; | |
141 | ||
142 | while((mfpr(RXCS)&RXCS_DONE) == 0) | |
143 | ; | |
144 | c = mfpr(RXDB)&0177; | |
145 | if (c=='\r') | |
146 | c = '\n'; | |
a14fe297 MK |
147 | if (c != '\b' && c != '\177') |
148 | putchar(c); | |
4d05cd07 BJ |
149 | return(c); |
150 | } |