Add original unix v6
This commit is contained in:
+150
@@ -0,0 +1,150 @@
|
||||
#
|
||||
/*
|
||||
*/
|
||||
|
||||
#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);
|
||||
}
|
||||
Reference in New Issue
Block a user