BSD 4_4 release
[unix-history] / usr / src / sys / tahoe / stand / prf.c
index 5c2487e..7e86693 100644 (file)
-/*     prf.c   1.1     86/01/12        */
-/*     prf.c   4.3     81/05/05        */
-
-#include "../machine/mtpr.h"
-
-#include "param.h"
-#include "../tahoe/cp.h"
-#ifdef NOIO
-#define CINADR 0xf0000         /* Dummy keyboard (memory mapped) */
-#define COUTADR        0xf1000         /* Dummy screen         -,,-      */
-#endif
-
-/*
- * Scaled down version of C Library printf.
- * Used to print diagnostic information directly on console tty.
- * Since it is not interrupt driven, all system activities are
- * suspended.  Printf should not be used for chit-chat.
+/*-
+ * Copyright (c) 1991 The Regents of the University of California.
+ * All rights reserved.
  *
  *
- * One additional format: %b is supported to decode error registers.
- * Usage is:
- *     printf("reg=%b\n", regval, "<base><arg>*");
- * Where <base> is the output base expressed as a control character,
- * e.g. \10 gives octal; \20 gives hex.  Each arg is a sequence of
- * characters, the first of which gives the bit number to be inspected
- * (origin 1), and the next characters (up to a control character, i.e.
- * a character <= 32), give the name of the register.  Thus
- *     printf("reg=%b\n", 3, "\10\2BITTWO\1BITONE\n");
- * would produce output:
- *     reg=2<BITTWO,BITONE>
- */
-/*VARARGS1*/
-printf(fmt, x1)
-       char *fmt;
-       unsigned x1;
-{
-
-       prf(fmt, &x1);
-}
-
-prf(fmt, adx)
-       register char *fmt;
-       register u_int *adx;
-{
-       register int b, c, i;
-       char *s;
-       int any;
-
-loop:
-       while ((c = *fmt++) != '%') {
-               if(c == '\0')
-                       return;
-               putchar(c);
-       }
-again:
-       c = *fmt++;
-       /* THIS CODE IS VAX DEPENDENT IN HANDLING %l? AND %c */
-       switch (c) {
-
-       case 'l':
-               goto again;
-       case 'x': case 'X':
-               b = 16;
-               goto number;
-       case 'd': case 'D':
-       case 'u':               /* what a joke */
-               b = 10;
-               goto number;
-       case 'o': case 'O':
-               b = 8;
-number:
-               printn((u_long)*adx, b);
-               break;
-       case 'c':
-               b = *adx;
-               for (i = 24; i >= 0; i -= 8)
-                       if (c = (b >> i) & 0x7f)
-                               putchar(c);
-               break;
-       case 'b':
-               b = *adx++;
-               s = (char *)*adx;
-               printn((u_long)b, *s++);
-               any = 0;
-               if (b) {
-                       putchar('<');
-                       while (i = *s++) {
-                               if (b & (1 << (i-1))) {
-                                       if (any)
-                                               putchar(',');
-                                       any = 1;
-                                       for (; (c = *s) > 32; s++)
-                                               putchar(c);
-                               } else
-                                       for (; *s > 32; s++)
-                                               ;
-                       }
-                       putchar('>');
-               }
-               break;
-
-       case 's':
-               s = (char *)*adx;
-               while (c = *s++)
-                       putchar(c);
-               break;
-       }
-       adx++;
-       goto loop;
-}
-
-/*
- * Printn prints a number n in base b.
- * We don't use recursion to avoid deep kernel stacks.
+ * This code is derived from software contributed to Berkeley by
+ * Computer Consoles Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *     @(#)prf.c       7.1 (Berkeley) 5/4/91
  */
  */
-printn(n, b)
-       u_long n;
-{
-       char prbuf[11];
-       register char *cp;
 
 
-       if (b == 10 && (int)n < 0) {
-               putchar('-');
-               n = (unsigned)(-(int)n);
-       }
-       cp = prbuf;
-       do {
-               *cp++ = "0123456789abcdef"[n%b];
-               n /= b;
-       } while (n);
-       do
-               putchar(*--cp);
-       while (cp > prbuf);
-}
+#include "sys/param.h"
+#include "../tahoe/cp.h"
+#include "../include/mtpr.h"
 
 /*
  * Print a character on console.
 
 /*
  * Print a character on console.
- * Attempts to save and restore device
- * status.
- *
- * Whether or not printing is inhibited,
- * the last MSGBUFS characters
- * are saved in msgbuf for inspection later.
  */
  */
-#ifdef NOIO
-char   *coutadr=(char *)COUTADR;
-putchar(c)
-       register c;
-{
-       *coutadr++ = c;
-}
-
-char   *cinadr=(char *)CINADR;
-getchar()
-{
-       return( *cinadr++ );
-}
-
-#else
 struct cpdcb_o cpout;
 struct cpdcb_i cpin;
 
 /* console requires even parity */
 #define EVENP
 struct cpdcb_o cpout;
 struct cpdcb_i cpin;
 
 /* console requires even parity */
 #define EVENP
+
 putchar(c)
 putchar(c)
-char c;
+       char c;
 {
        int time;
 #ifdef EVENP
        register mask, par;
 
 {
        int time;
 #ifdef EVENP
        register mask, par;
 
-       for(par=0, mask=1; mask!=0200; mask<<=1, par<<=1)
+       for (par = 0, mask = 1; mask != 0200; mask <<= 1, par <<= 1)
                par ^= c&mask;
        c |= par;
                par ^= c&mask;
        c |= par;
-#endif EVENP
-       cpout.cp_hdr.cp_unit = CPCONS;  /* Resets done bit */
+#endif /* EVENP */
+       cpout.cp_hdr.cp_unit = CPCONS;          /* Resets done bit */
        cpout.cp_hdr.cp_comm = CPWRITE;
        cpout.cp_hdr.cp_count = 1;
        cpout.cp_buf[0] = c;
        mtpr(CPMDCB, &cpout);
        cpout.cp_hdr.cp_comm = CPWRITE;
        cpout.cp_hdr.cp_count = 1;
        cpout.cp_buf[0] = c;
        mtpr(CPMDCB, &cpout);
-#ifdef SIMIO
-       simout(&cpout);
-#endif
        time = 100000;                          /* Delay loop */
        while (time--) {
        time = 100000;                          /* Delay loop */
        while (time--) {
-               uncache (&cpout.cp_hdr.cp_unit) ;
-               if (cpout.cp_hdr.cp_unit & CPDONE) break;
+               uncache(&cpout.cp_hdr.cp_unit);
+               if (cpout.cp_hdr.cp_unit & CPDONE)
+                       break;
        }
        }
-       if (c == '\n') putchar ('\r');
+       if (c == '\n')
+               putchar ('\r');
 }
 
 }
 
-#ifdef SIMIO
-simout(addr)
-{
-       asm(".byte 0x4");
-}
-simin(addr)
-{
-       asm(".byte 0x3");
-}
-#endif
+scankbd()
+{}
 
 getchar()
 {
 
 getchar()
 {
-       char    c;
+       char c;
 
 
-       cpin.cp_hdr.cp_unit = CPCONS;   /* Resets done bit */
+       cpin.cp_hdr.cp_unit = CPCONS;           /* Resets done bit */
        cpin.cp_hdr.cp_comm = CPREAD;
        cpin.cp_hdr.cp_count = 1;
        mtpr(CPMDCB, &cpin);
        cpin.cp_hdr.cp_comm = CPREAD;
        cpin.cp_hdr.cp_count = 1;
        mtpr(CPMDCB, &cpin);
-#ifdef SIMIO
-       simin(&cpin);
-#endif
        while ((cpin.cp_hdr.cp_unit & CPDONE) == 0) 
        while ((cpin.cp_hdr.cp_unit & CPDONE) == 0) 
-               uncache (&cpin.cp_hdr.cp_unit);
-       uncache (&cpin.cpi_buf[0]);
+               uncache(&cpin.cp_hdr.cp_unit);
+       uncache(&cpin.cpi_buf[0]);
        c = cpin.cpi_buf[0] & 0x7f;
        c = cpin.cpi_buf[0] & 0x7f;
-       if (c == '\r')  c = '\n';
-       putchar(c);
-       return(c);
+       if (c == '\r')
+               c = '\n';
+       if (c != '\b' && c != '\177')
+               putchar(c);
+       return (c);
 }
 }
-#endif
-
 
 
-gets(buf)
-       char *buf;
+trap(ps)
+       int ps;
 {
 {
-       register char *lp;
-       register c;
+       printf("Trap %o\n", ps);
+       for (;;)
+               ;
+}
 
 
-       lp = buf;
-       for (;;) {
-               c = getchar() & 0177;
-       store:
-               switch(c) {
-               case '\n':
-               case '\r':
-                       c = '\n';
-                       *lp++ = '\0';
-                       return;
-               case '\b':
-               case '#':
-                       lp--;
-                       if (lp < buf)
-                               lp = buf;
-                       continue;
-               case '@':
-               case 'u'&037:
-                       lp = buf;
-                       putchar('\n');
-                       continue;
-               default:
-                       *lp++ = c;
-               }
-       }
+uncache (addr)
+       char *addr;
+{
+       /* Return *(addr-0x4000); DIRTY assumes this address is valid */
+       mtpr(PDCS, addr);
 }
 }