151 lines
2.2 KiB
C
151 lines
2.2 KiB
C
#
|
|
/*
|
|
*/
|
|
|
|
#include "../param.h"
|
|
#include "../seg.h"
|
|
#include "../buf.h"
|
|
#include "../conf.h"
|
|
|
|
/*
|
|
* Address and structure of the
|
|
* KL-11 console device registers.
|
|
*/
|
|
struct
|
|
{
|
|
int rsr;
|
|
int rbr;
|
|
int xsr;
|
|
int xbr;
|
|
};
|
|
|
|
/*
|
|
* In case console is off,
|
|
* panicstr contains argument to last
|
|
* call to panic.
|
|
*/
|
|
|
|
char *panicstr;
|
|
|
|
/*
|
|
* Scaled down version of C Library printf.
|
|
* Only %s %l %d (==%l) %o are recognized.
|
|
* Used to print diagnostic information
|
|
* directly on console tty.
|
|
* Since it is not interrupt driven,
|
|
* all system activities are pretty much
|
|
* suspended.
|
|
* Printf should not be used for chit-chat.
|
|
*/
|
|
printf(fmt,x1,x2,x3,x4,x5,x6,x7,x8,x9,xa,xb,xc)
|
|
char fmt[];
|
|
{
|
|
register char *s;
|
|
register *adx, c;
|
|
|
|
adx = &x1;
|
|
loop:
|
|
while((c = *fmt++) != '%') {
|
|
if(c == '\0')
|
|
return;
|
|
putchar(c);
|
|
}
|
|
c = *fmt++;
|
|
if(c == 'd' || c == 'l' || c == 'o')
|
|
printn(*adx, c=='o'? 8: 10);
|
|
if(c == 's') {
|
|
s = *adx;
|
|
while(c = *s++)
|
|
putchar(c);
|
|
}
|
|
adx++;
|
|
goto loop;
|
|
}
|
|
|
|
/*
|
|
* Print an unsigned integer in base b.
|
|
*/
|
|
printn(n, b)
|
|
{
|
|
register a;
|
|
|
|
if(a = ldiv(n, b))
|
|
printn(a, b);
|
|
putchar(lrem(n, b) + '0');
|
|
}
|
|
|
|
/*
|
|
* Print a character on console.
|
|
* Attempts to save and restore device
|
|
* status.
|
|
* If the switches are 0, all
|
|
* printing is inhibited.
|
|
*/
|
|
putchar(c)
|
|
{
|
|
register rc, s;
|
|
|
|
rc = c;
|
|
if(SW->integ == 0)
|
|
return;
|
|
while((KL->xsr&0200) == 0)
|
|
;
|
|
if(rc == 0)
|
|
return;
|
|
s = KL->xsr;
|
|
KL->xsr = 0;
|
|
KL->xbr = rc;
|
|
if(rc == '\n') {
|
|
putchar('\r');
|
|
putchar(0177);
|
|
putchar(0177);
|
|
}
|
|
putchar(0);
|
|
KL->xsr = s;
|
|
}
|
|
|
|
/*
|
|
* Panic is called on unresolvable
|
|
* fatal errors.
|
|
* It syncs, prints "panic: mesg" and
|
|
* then loops.
|
|
*/
|
|
panic(s)
|
|
char *s;
|
|
{
|
|
panicstr = s;
|
|
update();
|
|
printf("panic: %s\n", s);
|
|
for(;;)
|
|
idle();
|
|
}
|
|
|
|
/*
|
|
* prdev prints a warning message of the
|
|
* form "mesg on dev x/y".
|
|
* x and y are the major and minor parts of
|
|
* the device argument.
|
|
*/
|
|
prdev(str, dev)
|
|
{
|
|
|
|
printf("%s on dev %l/%l\n", str, dev.d_major, dev.d_minor);
|
|
}
|
|
|
|
/*
|
|
* deverr prints a diagnostic from
|
|
* a device driver.
|
|
* It prints the device, block number,
|
|
* and an octal word (usually some error
|
|
* status register) passed as argument.
|
|
*/
|
|
deverror(bp, o1, o2)
|
|
int *bp;
|
|
{
|
|
register *rbp;
|
|
|
|
rbp = bp;
|
|
prdev("err", rbp->b_dev);
|
|
printf("bn%l er%o %o\n", rbp->b_blkno, o1, o2);
|
|
}
|