e a2l.c r a2l(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 X blnkit(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.c 8 # 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.s x # # 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.c O # 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.c x } 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 2 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 " ; 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.h x # 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.c x 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 " p na2l(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") ; }