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.6 (Berkeley) 08/27/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 || VAX650 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 || VAX650 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 || VAX650 161 } 162 #endif 163 if (c=='\r') 164 c = '\n'; 165 if (c != '\b' && c != '\177') 166 putchar(c); 167 return(c); 168 } 169