32V/usr/src/standalone/src.a

ea2l.cra2l(as)
register char *as ;
{
/*
*  Convert null-terminated ascii string to binary
*  and return value.
*  1st char in string :
*	0 -> octal
*	x -> hex
*	else decimal
*/
register value , base , sign , digit ;
 
digit = value = sign = 0 ;
base = 10 ;  /* default base */
 
aloop :
if ((digit = (*as++)) == 0) return(value) ; /* null */
 
if (digit == '-') {
	sign++ ;
	goto aloop ;
	}
 
if (digit == '0') base = 8 ;  /* octal base  */
else { if (digit == 'x') base = 16 ;  /* hex base */
	else value = (digit-060) ; /* 060 = '0' */
	}
 
while (digit = (*as++)) {
	if (digit < '0') return(0) ;
	switch (base) {
		case 8 : {
			if (digit > '7') return(0) ;
			digit -= 060 ;
			break ;
			}
		case 10 : {
			if (digit > '9') return(0) ;
			digit -= 060 ;
			break ;
			}
		case 16 : {
			if (digit <= '9') {
				digit -= 060 ;
				break ;
				}
			if ((digit >= 'A') && (digit <= 'F')) {
				digit = (digit - 0101 + 10) ;
					break ;
				}
			if ((digit >= 'a') && (digit <= 'f')) {
				digit = digit - 0141 + 10 ;
				break ;
				}
			return(0) ;
			break ;
			}
		}
	value = (value * base) + digit ;
	}
return (sign ? -value : value) ;
}
conio.c# include "CON.h"
putstr(csp)
register char *csp ;
{
if (putcon(csp)) return(-1) ;
return(0) ;
}
 
/*		*/
 
putlin(sptr)
register char *sptr ;
{
if (putcon(sptr)) return(-1) ;
if (putnl()) return(-1) ;
return(0) ;
}
 
/*		*/
 
putnl()
{
if (putcon("\r\n")) return(-1) ;
return(0) ;
}
 
/*		*/
 
putcon(csp)
register char *csp ;
{
/*
*  Function to output null-terminated string pointed to 
*  by 'csp' to the VAX LSI terminal.
*/
register c ;
 
c = 0 ;
while (c = (*csp++)) putc(c) ;
return(0) ;
}
 
/*		*/
 
putc(c)
{
/*  wait for LSI printer to be ready */
while ((mfpr(TXCS) & TXCS_RDY) == 0) ;
/*  output character */
mtpr(TXDB,c&0177) ;
}
 
/*		*/
 
getcon(cs)
register char *cs ;
{
/*
*  Function to return char's from VAX LSI keyboard to
*  char array 'cs' - input stops when CR or LF received -
*  null char appended to end of input
*/
register int c , c2 ;
int getc() ;
 
inloop :
	c = getc() ; /* get 1 char from terminal */
	putc(c) ;  /*  echo char */
	if ((c == NL) || (c == CR)) {
		putc(CR) ;
		putc(0) ;
		putc(NL) ;
		(*cs++) = '\0' ;
		return(0) ;
		}
	else {
		(*cs++) = c ;
		goto inloop ;
		}
}
 
/*		*/
 
getc()
{
/*
*  Return char from VAX LSI terminal char buffer
*/
int mfpr() ;
 
/*  Wait for receiver done (user entered char)
*/
while ((mfpr(RXCS) & RXCS_DONE) == 0) ;
return (mfpr(RXDB) & 0177) ;  /* return char from receiver buffer */
}
 
/*		*/
 
mtpr(regno,value)
{
	asm("	mtpr	8(ap),4(ap)") ;
}
 
/*		*/
 
mfpr(regno)
{
	asm("	mfpr	4(ap),r0") ;
}
dio.cD# include "RP.h"
dwait(dptr)
register int *dptr ;
{
/*
* Function to wait MBA 0 RP06 disc unit to be ready.
*/
while ((*(dptr+RP_sr)&RP_DRY) == 0) ;
}
 
/*		*/
 
derror(dptr)
register int *dptr ;
{
/*
*  Function to check for MBA 0 RP06 error.
*/
if (*(dptr+RP_sr) & RP_ERR) return(*(dptr+RP_er1) & 0177777) ;
return(0) ;
}
halt.chalt()
{
asm("	halt") ;
}
dadmes.cj# include "RP.h"
dadmes(dptr)
register int *dptr ;
{
register char *mesp ;
register int i ;
 
mesp = " cyl     trk     sec    " ;
i = l2x(*(dptr+RP_cyl) & 01777,&mesp[5]) ;
blnkit(&mesp[5+i],4-i) ;
 
i = l2x((*(dptr+RP_stk)>>8) & 037 , &mesp[13]) ;
blnkit(&mesp[13+i],3-i) ;
 
i = l2x(*(dptr+RP_stk)&037,&mesp[21]) ;
blnkit(&mesp[21+i],3-i) ;
 
putlin(mesp) ;
}
blnkit.cXblnkit(mp,cc)
register char *mp ;
register int cc ;
{
 
while (cc--)
	(*mp++) = ' ' ;
}
mbaerr.c}# include "MBA.h"
mbaerr(mba)
register int *mba ;
{
register int i ;
 
if ((i = (*(mba+M_sr))) != M_DTC) {
	putlin("- - - - - -") ;
	putstr("MBA error : status reg :") ;
	MBAS_print(i) ;
	*(mba+M_sr) = (-1) ;
	return(i) ;
  }
return(0) ;
}
l2x.cl2x(val,rptr)
register int val ;
register char *rptr ;
{
register int i , j ;
register char *tp ;
int knt ;
char tmp[20] , sign ;
 
knt = sign = 0 ;
if (val < 0) {
	sign++ ;
	val = (-val) ;
	}
 
tp = tmp ;
loop :
	knt++ ;
	i = val/16  ;  /*  quotient & base 16 */
	j = val%16 ;
	(*tp++) = j + (j<10?0x30:0x57) ;
	val = i ;
	if (val == 0) {
		/*  done  dividing  */
		if (sign) { knt++ ; (*tp++) = '-' ; }
		for (i = knt ; i ; i--)
			(*rptr++) = tmp[i-1] ;
		(*rptr++) = '\0' ;
		return(knt) ;
		}
	else goto loop ;
}
ECCrcv.c8# include "RP.h"
# include "MBA.h"
# include "SIZ.h"
ECCrcv(dptr)
register int *dptr ;
{
/*
*  Do ECC error recovery on disk whose register set is pointed
*  to by 'dptr'.
*  'mbaerr()' has cleared MBA status reg.
*  With ECC enabled, disk read has stopped after sector with bad
*  data. After correction of data, return to 'dread()' which will
*  continue read of track if more sectors to do.
*  Return 0.
*/
register unsigned int pos , pat ;
register unsigned short *wordp ;
union {
	unsigned int ll;
	struct {short slo,shi} sh;
	} lll;
struct { short wlo , whi ; } ;
char tmp[50] ;
extern char *bufptr ;
extern int *MBiptr ;
 
pat = (*(dptr+RP_Epat)) & 0xffff ; /* ECC pattern reg */
pos = (*(dptr+RP_Epos)) & 0xffff ; /* ECC position reg */
putstr("pat : ") ;
ul2x(pat,tmp) ;
putlin(tmp) ;
putstr("pos : ") ;
ul2x(pos,tmp) ;
putlin(tmp) ;
wordp = (unsigned short *)bufptr ;   /* ptr to buffer */
 
/*
*  'BUFSIZ' bytes are read on each read into buffer pointed to
*  by 'bufptr'. MBA byte count reg has neg. no. of bytes remaining
*  in read if this read error was not in the last sector to be
*  read.
*/
/* calculate buffer location of faulty data */
wordp = (unsigned short *)((char *)wordp + (BUFSIZ + ((*(MBiptr+M_bc))>>16) - BLKSIZ)) ; /* sector in buffer */
wordp = (unsigned short *)((int)wordp +  ((pos-1)>>4)) ; /* word within sector */
 
/* burst pattern may be across word boundary */
lll.ll = (*wordp) + ((*(wordp+1))<<16) ;
putstr("bad data  : ") ;
ul2x(lll.ll,tmp) ;
putlin(tmp) ;
pat = pat<<((pos%16)-1) ;
lll.ll = lll.ll^pat ; /* correction */
putstr("good data : ") ;
ul2x(lll.ll,tmp) ;
putlin(tmp) ;
 
/* put good data back in buffer */
*wordp = lll.sh.slo ;
*(wordp+1) = lll.sh.shi ;
 
return(0) ;
}
ul2x.cul2x(val,rptr)
register unsigned int val ;
register char *rptr ;
{
register unsigned int i , j ;
register char *tp ;
int knt ;
char tmp[20] ;
unsigned int udiv() , urem() ;
 
knt =  0 ;
 
tp = tmp ;
loop :
	knt++ ;
	/* use unsigned integer divide & remainder routines */
	i = udiv(val,16)  ;  /*  quotient & base 16 */
	j = urem(val,16) ;
	(*tp++) = j + (j<10?0x30:0x57) ;
	val = i ;
	if (val == 0) {
		/*  done  dividing  */
		for (i = knt ; i ; i--)
			(*rptr++) = tmp[i-1] ;
		(*rptr++) = '\0' ;
		return(knt) ;
		}
	else goto loop ;
}
idefs.h_# define RP6CYL  815  /*  no. RP06 cylinders/pack */
# define RP6TRK  19  /*  no. tracks/cyl  */
# define RP6SEC  22  /*  no. sectors/track  */
# define RP6ST  (RP6TRK*RP6SEC)  /*  no. sectors/cyl  */
# define MAXSEC  (RP6CYL*RP6TRK*RP6SEC)  /*  sectors/pack  */
# define RXCS	32  /*  receiver control/staus */
# define RXDB  33  /*  receiver data */
# define TXCS  34  /*  transmitter control/status */
# define TXDB  35  /*  transmitter data */
# define RXCS_DONE  0x80  /*  receiver done */
# define TXCS_RDY  0x80  /*  transmitter ready */
# define NL  012
# define CR 015
# define M0  0x20010000  /* phys addr MBA 0  */
# define M_st  2  /*  offset for MBA status reg */
# define M0_cr  (M0+4)  /*  MBA 0 control reg addr */
# define M0_map  (M0+0x800)  /* start MBA 0 map reg's */
# define M0_var  (M0+0xc)  /* MBA 0 virt addr reg */
# define M0_bc  (M0+0x10)  /*  MBA 0 byte count reg */
# define MBAinit 01  /*  MBA init bit */
# define MB_ERR 0x600e1fff  /* some error bits in MBA stus reg 2 */
/*		*/
# define RP  (M0+0x400)  /*  base for RP06 reg's, drive 0  */
/*		*/
# define RP_cr  0  /* RP06 control reg offset, longword */
# define RP_sr  1  /*  RP06 status reg offset */
# define RP_er1  2  /*  RP06 error reg 1 */
# define RP_stk  5  /*  RP06 sector/track reg offset */
# define RP_off  011  /*  RP offset reg */
# define RP_cyl  10  /*  RP06 cylinder reg offset */
# define RP_Epos 016  /*  RP ECC position reg */
# define RP_Epat 017  /*  RP ECC pattern reg */
/*		*/
# define RP_GO  1  /*  go bit */
# define RP_RD	070	/* RP06 read function code */
# define RP_WR  060  /*  RP06 write function code */
# define RP_DC  010  /*  drive clear function code */
# define RP_FMT  0x1000  /*  format bit in RP offset reg */
# define RP_RIP  020  /*  Read-in Preset function code */
# define RP_MOL  0x1000  /*  medium online bit in status */
# define RP_DRY  0200  /*  drive ready, status reg */
# define RP_ERR 040000  /* composite error, status reg */
# define RP_DCK  0x8000  /*  Data Check Error in ERR1 reg */
# define RP_ECH  0x40  /*  ECC hard error */
 udiv.sx#
#  unsigned int divide :
#  		(int) i = udiv( (int)dvdnd , (int) divis)
#
#  unsigned int remainder :
#  		(int) j = urem( (int)dvdnd , (int) divis)
#
	.text
	.align	1
	.globl	_udiv
	.globl	_urem
#
_udiv :
	.word	0  #  no reg save
	movl	4(ap),r0  #  dividend
	clrl	r1
	ediv	8(ap),r0,r0,r1  #  quotient in r0
	ret
#
	.align	1
_urem :
	.word	0
	movl	4(ap),r0
	clrl	r1
	ediv	8(ap),r0,r1,r0  #  remainder in r0
	ret
gtime.cO# include "t.h"
gtime()
{
/*
*  Return ptr to date/time string.
*  Time is taken from VAX Time of Day processor reg.
*/
register int ms10 , i , j , k , l ;
char monda[] , leap ;
char *amonth[] , ayear[] ;
char dstflg ;
static char datim[26] ;
 
ms10 = mfpr(TODR) ; /* no. 10 ms. since start of year */
 
/* convert GMT to local */
ms10 += LOCAL ;
/* adjust if daylight savings time */
if (dstflg)
	ms10 += MSHR ;
if (leap)
	amonth[1]++ ;  /* Feb leap year +1 day */
 
i = ms10/MSDAY ; /* no. days past */
for (j = 0 , k = 0 ; j < 12 ; j++) /* get current month */
	if ((k += monda[j]) > i) break ;
movc(amonth[j],datim) ; /* month ascii string */
datim[3] = ' ' ;
 
if (j > 0) /* get day in month */
	l = i - (k - monda[j]) + 1 ;
j = l2a(l,&datim[4]) ; /* day string */
if (j == 1) {
	datim[5] = datim[4] ;
	datim[4] = ' ' ;
	}
datim[6] = ',' ;
datim[7] = ' ' ;
movc(ayear,&datim[8]) ; /* year ascii string */
 
i = ms10%MSDAY ; /* no. 10 ms. into day */
j = i/MSHR ; /* no. hours into day */
k = l2a(j,&datim[13]) ; /* hour string */
if (k == 1) {
	datim[14] = datim[13] ;
	datim[13] = '0' ;
	}
datim[15] = ':' ;
 
l = i%MSHR ; /* no. 10 ms. into hour */
j = l/(60*100) ; /* no. minutes */
k = l2a(j,&datim[16]) ; /* minutes string */
if (k == 1) {
	datim[17] = datim[16] ;
	datim[16] = '0' ;
	}
datim[18] = ':' ;
 
j = l%(60*100) ; /* no. 10 ms. into minute */
j = j/100 ; /* no. seconds */
k = l2a(j,&datim[19]) ; /* seconds string */
if (k == 1) {
	datim[20] = datim[19] ;
	datim[19] = '0' ;
	}
datim[21] = ' ' ;
 
if (dstflg) /* Daylight Savings Time */
	movc("EDT",&datim[22]) ;
else movc("EST",&datim[22]) ; /* Standard Time */
return(datim) ;
}
 
/*		*/
 
movc(from,to)
register char *from , *to ;
{
register char c ;
 
while ((c = (*from++)) != '\0') (*to++) = c ;
}
l2a.cl2a(val,rptr)
register int val ;
register char *rptr ;
{
register int i ;
register char *tp ;
int knt ;
char tmp[20] , sign ;
 
knt = sign = 0 ;
if (val < 0) {
	sign++ ;
	val = (-val) ;
	}
 
tp = tmp ;
loop :
	knt++ ;
	i = val/10  ;  /*  quotient & base 10 */
	(*tp++) = val%10 + '0' ; /*  ascii remainder  */
	val = i ;
	if (val == 0) {
		/*  done  dividing  */
		if (sign) { knt++ ; (*tp++) = '-' ; }
		for (i = knt ; i ; i--)
			(*rptr++) = tmp[i-1] ;
		(*rptr++) = '\0' ;
		return(knt) ;
		}
	else goto loop ;
}
reloc.cx}	asm("	.set	RELOC,0x50000") ;
	asm("	.text") ;
	asm("	.globl	_edata") ;
	asm("	.word	0") ;
	asm("	movl	$RELOC,sp") ;
	asm("	movl	$(_edata-RELOC),r2") ;
	asm("	movl	$RELOC,r1") ;
	asm("	clrl	r0") ;
	asm("move :") ;
	asm("	movq	(r0)+,(r1)+") ;
	asm("	acbl	$1,$-8,r2,move") ;
	asm("	jmp	*$begin") ;
	asm("	.align	2") ;
	asm("begin :") ;
	asm("	calls	$0,_main") ;
	asm("	brb	begin") ;
+time.c2char dstflg 1 ;  /*  daylight savings time flag */
char leap 0 ; /* leap-year flag */
char monda[] {
	31 , 28 , 31 , 30 , 31 , 30 , 31 , 31 , 30 , 31 , 30 , 31
	} ;
char *amonth[] {
	"Jan" , "Feb" , "Mar" , "Apr" , "May" , "Jun" , "Jul" ,
	"Aug" , "Sep" , "Oct" , "Nov" , "Dec"
	} ;
char ayear[] "1978 " ;
time.h&M# define MSDAY (24*60*60*100)  /* no. 10 ms. per day */
# define MSHR  (60*60*100)  /*  no. 10 ms. per hour */
# define LOCAL (-(5*60*60*100))  /* local time offset from GMT */
# define TODR  27  /*  Time of Day VAX processor reg no */
rel.hx# define RELOC 0x50000
0t.h# define MSDAY (24*60*60*100)  /* no. 10 ms. per day */
# define MSHR  (60*60*100)  /*  no. 10 ms. per hour */
# define LOCAL (-(5*60*60*100))  /* local time offset from GMT */
# define TODR  27  /*  Time of Day VAX processor reg no */
char dstflg 1 ;  /*  daylight savings time flag */
char leap 0 ; /* leap-year flag */
char monda[] {
	31 , 28 , 31 , 30 , 31 , 30 , 31 , 31 , 30 , 31 , 30 , 31
	} ;
char *amonth[] {
	"Jan" , "Feb" , "Mar" , "Apr" , "May" , "Jun" , "Jul" ,
	"Aug" , "Sep" , "Oct" , "Nov" , "Dec"
	} ;
char ayear[] "1978 " ;
errcod.c# include "EMES.h"
RPE_print(ereg)
register int ereg ;
{
/*
*  Print meaningful RP06 error reg values from error
*  register argument.
*/
register int i ;
 
for (i = 0 ; i < 16 ; i++ , ereg =>>1)
	if (ereg&01)
		putstr(RPemes[i]) ;
putnl() ;
return(0) ;
}
 
/*		*/
 
MBAS_print(sreg)
register int sreg ;
{
/*
*  Print meaningful MBA status reg values from status
*  register argument.
*/
register int i ;
 
for (i = 0 ; i < 32 ; i++ , sreg =>>1)
	if (sreg&01)
		putstr(MBAsmes[i]) ;
putnl() ;
return(0) ;
}
 hxcnvt.cxhxcnvt(in,knt,out)
register char *in , *out ;
int knt ;
{
/*
*  Convert 'knt' bytes in char array 'in' to 'knt*2'
*  hex char's and store in char array 'out'.
*/
register unsigned int bit4 , byte ;
 
byte = 0 ;
while (knt--) {
	byte = (*in++) ;
	bit4 = (byte>>4) & 017 ;
	(*out++) = (bit4<10?bit4+0x30:bit4+0x57) ;
	bit4 = byte & 017 ;
	(*out++) = (bit4<10?bit4+0x30:bit4+0x57) ;
	}
return(0) ;
}
ina2l.c"pna2l(as)
register char *as ;
{
/*
*  Convert null-terminated ascii string to binary
*  and return value.
*  Base 10.
*/
register value , digit , base ;
 
digit = value = 0 ;
base = 10 ;  /* default base */
 
while (digit = (*as++)) {
	if (digit < '0') return(-1) ;
	if (digit > '9') return(-1) ;
	digit -= 060 ;
	value = (value * base) + digit ;
	}
return (value) ;
}
reloc.h}	asm("	.set	RELOC,0x50000") ;
	asm("	.text") ;
	asm("	.globl	_edata") ;
	asm("	.word	0") ;
	asm("	movl	$RELOC,sp") ;
	asm("	movl	$(_edata-RELOC),r2") ;
	asm("	movl	$RELOC,r1") ;
	asm("	clrl	r0") ;
	asm("move :") ;
	asm("	movq	(r0)+,(r1)+") ;
	asm("	acbl	$1,$-8,r2,move") ;
	asm("	jmp	*$begin") ;
	asm("	.align	2") ;
	asm("begin :") ;
	asm("	calls	$0,_main") ;
	asm("	brb	begin") ;
}