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

econio.cJ# 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.csn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.cdr## 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