e conio.c J # 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() ; char *ocs; ocs=cs; inloop : c = getc() ; /* get 1 char from terminal */ putc(c) ; /* echo char */ if (c==CDEL) { cs--; goto inloop; } if (c==LDEL) {putc(CR);putc(0);putc(NL);cs=ocs;goto inloop;} 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") ; } /* */ getval(sp) char *sp ; { /* * Print prompt string 'sp' on console. * Return decimal value of user response. */ char ctmp[130] ; putstr(sp) ; putstr(" : ") ; getcon(ctmp) ; return(a2l(ctmp)) ; } /* */ pdstr(sp,ival) char *sp ; { /* * Convert integer 'ival' to ascii base 10 and print on * console. * Then print string 'sp' on console. */ char ctmp[130] ; l2a(ival,ctmp) ; putstr(ctmp) ; putlin(sp) ; } sdio.c sn 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) ; } tapio.c |Cv N # include "TM.h" taprew(tp) register int *tp ; { /* * Function to rewind TM2/TE16 drive */ *(tp+TM_cs1) = TM_RWND | TM_GO ; twait(tp) ; if (terror(tp)) return(-1) ; return(0) ; } /* */ tapfil(tp,nf) int *tp ; { /* * Space forward 'nf' files on TM02 unit whose MBA register * set is pointed to by 'tp'. */ register int i ; while (nf--) { loop : if (tapfsp(tp,1)) return(-1) ; if ((i = tapstat(tp))&TM_TM) { /* tape mark */ continue ; } if (i&TM_EOT) { TMS_print(i) ; /* end of tape */ return(-1) ; } goto loop ; } return(0) ; } /* */ tapfsp(tp,fblk) register int *tp ; { /* * Function to space forward 'fblk' blocks on TM2/TE16 drive */ if (fblk) { *(tp+TM_fc) = (-fblk) ; /* no. blocks */ *(tp+TM_cs1) = TM_SFWD | TM_GO ; /* space forward */ twait(tp) ; if (terror(tp)) return(-1) ; } return(0) ; } /* */ twait(tp) register int *tp ; { /* * Function to wait until TM2/TE16 is not busy */ while ((*(tp+TM_ds) & TM_DRDY) == 0) ; } /* */ terror(tp) register int *tp ; { /* * Function to check for TM2 error * Return error reg if error, * else return (0). */ if (*(tp+TM_ds) & TM_ERR) return(*(tp+TM_er)&0xffff) ; return(0) ; } /* */ tapstat(t) int *t ; { /* * Return TM02 status for unit pointed to by MBA reg set * pointer 't'. */ return(*(t+TM_ds)&0xffff) ; } /* */ tapbsp(tp,fblk) register int *tp ; { /* * Function to space backward 'fblk' blocks on TM2/TE16 drive */ if (fblk) { *(tp+TM_fc) = (-fblk) ; /* no. blocks */ *(tp+TM_cs1) = TM_SREV | TM_GO ; /* space backward */ twait(tp) ; if (terror(tp)) return(-1) ; } return(0) ; } flio.c ,4 g # include "FL.h" # include "CON.h" fltwait() { /* Wait for TXCS ready on floppy function. */ while (!(mfpr(TXCS) & TXCS_RDY)) ; } /* */ flrwait() { /* Wait for RXCS done on floppy data transfer */ while (!(mfpr(RXCS) & RXCS_DONE)) ; } /* */ fldone() { register int j ; /* check for floppy function complete & check errors */ flrwait() ; j = mfpr(RXDB) ; if ((j & 0xfff) == FL_PERR) { return(-1) ; /* protocol error */ } if ((j & 0xf00) != FL_FFC) { return(-1) ; } if (j & FL_ERR) return(-1) ; /* error */ return(0) ; } /* */ flrs(blk,bp) int blk ; char *bp ; { /* * Read 128-byte block from floppy into buffer 'bp[]'. * First convert logical 128-byte block no.(starts at 0) * to floppy track and sector. * Return (-1) for error, else return (0) . */ register int j , s , t ; /* compute start track & sector from logical block 'blk'. */ t = blk/RXSTRK ; /* track no. */ s = blk%RXSTRK + 1 ; /* sector */ fltwait() ; mtpr(TXDB,FL_RS) ; /* Floppy Read Sector command */ fltwait() ; mtpr(TXDB,s|FL_DATA) ; /* supply sector no. to floppy interface */ fltwait() ; mtpr(TXDB,t|FL_DATA) ; /* track no. */ /* wait for read to complete */ if (fldone()) return(-1) ; /* loop to read sector bytes from interface */ for (j = 0 ; j < RXBYSEC ; j++) { flrwait() ; /* wait till ready */ (*bp++) = mfpr(RXDB) ; /*get data byte-assume from floppy*/ } return(0) ; } kerrcod.c dr # # include "EMES.h" RPE_print(ereg) { /* * Print meaningful RP06 error reg values from error * register argument. */ putstr("RP06 err reg : ") ; diag16(RPemes,ereg) ; } /* */ MBAS_print(sreg) { /* * Print meaningful MBA status reg values from status * register argument. */ putstr("MBA status : ") ; diag32(MBAsmes,sreg) ; } /* */ TME_print(ereg) { /* TM02 error reg message */ putstr("TM02 err reg : ") ; diag16(TMemes,ereg) ; } /* */ TMS_print(e) { /* TM02 status reg */ putstr("TM02 status : ") ; diag16(TMsmes,e) ; } /* */ diag16(sp,err) char *sp[] ; { register int i ; for (i=0;i<16;i++,err=err>>1) if (err&01) putstr(sp[i]) ; putnl() ; } /* */ diag32(sp,err) char *sp[] ; { register int i ; for (i=0;i<32;i++,err=err>>1) if (err&1) putstr(sp[i]) ; putnl() ; } B