Google
 

Trailing-Edge - PDP-10 Archives - k20v7d - unsupported/status.ma1
There are no other files named status.ma1 in the archive.
;<UETP.LIB>STATUS.MAC.1, 11-Jul-79 11:01:45, Edit by F-S
;<UETP.LIB>STATUS.MAC.1, 4-JAN-82 12:14, EDIT BY MFG
TITLE STATUS - TOPS20 DEVICE STATISTICS
SUBTTL		B.EIBEN			JUL-11-79

;	ACCUMULATOR DEFINITIONS
;	=========== ===========

	A1=	1	;JSYS ARGUMENT AC 1
	A2=	2	;JSYS ARGUMENT AC 2
	A3=	3	;JSYS ARGUMENT AC 3
	A4=	4	;JSYS ARGUMENT AC 4
	T1=	5	;TEMPORARY AC 1
	T2=	6	;TEMPORARY AC 2
	T3=	7	;TEMPORARY AC 3
	T4=	10	;TEMPORARY AC 4
	CI=	11	;AOBJN POINTER TO CDB'S
	KI=	12	;AOBJN POINTER TO KDB'S (IF ANY)
	UI=	13	;AOBJN POINTER TO UDB'S
	P1=	14	;PRESERVED AC 1
	P2=	15	;PRESERVED AC 2
	MA=	16	;MAPPING ADDRESS
	P=	17	;PUSH-DOWN POINTER

	SALL
	.DIRECTIVE .XTABM

	.REQUIRE SYS:MACREL, SYS:MONSYM
	SEARCH MACSYM, MONSYM

; VERSION NUMBERS

	VMAJOR==2		;MAJOR VERSION
	VMINOR==0		;MINOR VERSION
	VWHO==0			;WHO LAST EDITED (0=DEC DEVELOPMENT)
	VEDIT==1		;EDIT NUMBER

	VSTATS== <VWHO>B2+<VMAJOR>B11+<VMINOR>B17+VEDIT
NPDL==140		;SIZE OF PDL

; MISCELLANEOUS SYMBOL DEFINITIONS

SLEEP==^D1000 * ^D600	;SLEEP TIME 10 MINUTES
JOBTTY==0		;JOBTTY TABLE OFFSET
JOBRT==1		;JOBRT TABLE OFFSET
TICKPS==2		;TICKPS TABLE OFFSET
JOBDIR==3		;JOBDIR TABLE OFFSET
TTYJOB==4		;TTYJOB TABLE OFFSET
NCPGS==5		;NCPGS  TABLE OFFSET
DEVNAM==6		;DEVNAM TABLE OFFSET
DEVCHR==7		;DEVCHR TABLE OFFSET
DEVUNT==10		;DEVUNT TABLE OFFSET
DSKERR==11		;DSKERR TABLE OFFSET
DRMERR==12		;DRMERR TABLE OFFSET
SYSVER==13		;SYSVER TABLE OFFSET
SYSTAT==14		;SYSTAT TABLE OFFSET
QTIMES==15		;QTIMES TABLE OFFSET
JOBNAM==16		;JOBNAM TABLE OFFSET
SNAMES==17		;SNAMES TABLE OFFSET
STIMES==20		;STIMES TABLE OFFSET
SPFLTS==21		;SPFLTS TABLE OFFSET
SSIZE==22		;SSIZE  TABLE OFFSET
SNBLKS==23		;SNBLKS TABLE OFFSET
DBUGSW==24		;DBUGSW TABLE OFFSET
LOGDES==25		;LOGDES TABLE OFFSET
PTYPAR==26		;PTYPAR TABLE OFFSET
SYMTAB==27		;SYMTAB TABLE OFFSET
DWNTIM==30		;DWNTIM TABLE OFFSET
JOBPNM==31		;JOBPNM TABLE OFFSET
SYSTAD==32		;SYSTAD TABLE OFFSET
LSTDRN==33		;LSTDRN TABLE OFFSET
APRID==34		;APRID  TABLE OFFSET
TBLENR==35		;KNOWN TABLES
MAXJOB==^D300		;MAX NR OF JOBS SUPPORTED
MAXFRK== 3*MAXJOB	;3 FORKS PER JOB
.TM02==4		;TM02 AS A DEVICE (KDB-TYP)
.TU45==3		;A DEVICE NOT DOING SEEKS
.cblk==1		;cdb-block type
.kblk==2		;kdb-block type
ks.act==1		;kdb is active
.ublk==3		;udb-block type
GENDEL=="."		;GENERATION DELIMITER
NCHPW==5		;NUMBER OF ASCII CHARACTERS PER WORD
BUFSIZ==200		;SIZE OF INPUT TEXT BUFFER
ATMSIZ==BUFSIZ		;SIZE OF ATOM BUFFER FOR COMND JSYS
GJFSIZ==.GJRTY+2	;SIZE OF GTJFN BLOCK USED BY COMND JSYS
PRIMRY== .PRIIN,,.PRIOU	;PRIMARY JFN'S
PAGSIZ== 1000		;SIZE OF A PAGE
MAXREP== ^D72		;MAXIMUM OF 72 CHARS IN REPLIES
REPSIZ== MAXREP/5+1	;SIZE OF USER'S REPLY BUFFER
GJFSIZ== 12		;SIZE OF BLOCK FOR GTJFN
MAXPRT== ^D20		;MAX # OF WORDS TO PRINT IN WEIRD BLKS
SUBTTL	SYMBOL AND DATA STRUCTURE DEFINITIONS

DEFSTR (CDBSTS,CDB+00,17,18)		;STATUS INFO CDB
DEFSTR (CDBPIA,CDB+00,28,3)		;CHANNEL PI ASSIGNMENT
DEFSTR (CDBTYP,CDB+00,35,5)		;CHANNEL TYPE
DEFSTR (CDBPAR,CDB+10,35,36)		;CHANNEL MEM PAR ERRORS
DEFSTR (CDBNXM,CDB+11,35,36)		;CHANNEL NXM'S
DEFSTR (CDBUDB,CDB+16,35,18)		;UDB/KDB ADRESSES

;STRUCTURE DEFINITION FOR KDB'S

DEFSTR (KDBSTS,KDB+00,29,30)		;FLAGS
DEFSTR (KDBTYP,KDB+00,35,5)		;KONTROLER TYPE
defstr (blktyp,kdb+00,30,5)		;block-type
DEFSTR (KDBUDB,KDB+04,35,18)		;UDB ADRESSES (MAX 8) or 16 on DX20/TX02
defstr (kdbact,kdb+00,1,1)		;KDB is active

;STRUCTURE DEFINITION FOR UDB'S

DEFSTR (UDBSTS,UDB+00,17,18)		;STATUS INFO UNIT
DEFSTR (UDBTYP,UDB+00,35,5)		;UNIT TYPE
DEFSTR (UDBDSN,UDB+14,35,36)		;UNIT SERIAL NUMBER
DEFSTR (UDBSEK,UDB+15,35,36)		;TOTAL NR. OF SEEKS
DEFSTR (UDBRED,UDB+16,35,36)		;TOTAL NR. OF READS
DEFSTR (UDBWRT,UDB+17,35,36)		;TOTAL NR. OF WRITES
DEFSTR (UDBSRE,UDB+22,35,36)		;TOTAL NR. OF SOFT READ ERRORS
DEFSTR (UDBSWE,UDB+23,35,36)		;TOTAL NR. OF SOFT WRITE ERRORS
DEFSTR (UDBHRE,UDB+24,35,36)		;TOTAL NR. OF HARD READ ERRORS
DEFSTR (UDBHWE,UDB+25,35,36)		;TOTAL NR. OF HARD WRITE ERRORS

;GETTAB CONVENTIONS

DEFSTR (TABLEN,GETTAB+00,17,18)	;TABLE-LENGTH
DEFSTR (TABADR,GETTAB+00,35,18)	;MONITOR-TABLE ADRESS


;JOB - STATUS DEFINITIONS

DEFSTR (CONDIR,.JBDIR+00,17,18)		;CONNECTED DIR-NR
DEFSTR (LOGDIR,.JBDIR+00,35,36)		;LOGGED IN DIR-NR
DEFSTR (CONTTY,.JBTTY+00,17,18)		;CONTROLING TTY-NR
DEFSTR (TOPFRK,.JBTTY+00,35,18)		;TOP FORK THIS JOB
DEFSTR (WRKSET,.FKNR+00 ,35,18)		;WORKING SET THIS FORK
DEFSTR (JOBNAM,.JBPNM+00,35,36)		;SIXBIT JOB-NAME

;CDB - STATUS BITS

CDBSTAT:ASCII /OFFLN/			;1B0	OFFLINE
	ASCII /PR CM/			;1B1	PRIMARY COMMAND ACTIVE
	ASCII /SC CM/			;1B2	SECONDARY COMMAND ACTIVE
	ASCII /MAINT/			;1B3	MAINTENANCE MODE
	ASCII /MA RQ/			;1B4	MAINTENANCE MODE REQUESTED
	ASCII /RECOV/			;1B5	ERROR RECOVERY IN PROGRESS
	ASCII /CH ST/			;1B6	CHANNEN SUPPORTS STACK
	ASCII /ALT C/			;1B7	ALTERNATE CCW IS CURRENT
CSTSLN==.-CDBSTAT			;NUMBER OF BITS

; UDB - STATUS BITS

UDBSTAT:ASCII /OFFLN/			;1B0	OFFLINE
	ASCII /CHHOM/			;1B1	CHECK HOME-BLOCKS FIRST
	ASCII /POSIT/			;1B2	POSITIONING IN PROGRESS
	ASCII /ACTIV/			;1B3	ACTIVE
	ASCII /HSBAD/			;1B4	BAD BLOCKS ON THIS UNIT
	ASCII /LKBAD/			;1B5	LOCK BIT FOR THIS UNITS BAD BLOCKS
	ASCII /DUALP/			;1B6	DUAL PORT SWITCH ON
	ASCII /MAINT/			;1B7	UNIT IN MAINTENANCE MODE
	ASCII /MNTRQ/			;1B8	MAINT MODE REQUESTED
	ASCII /BOT  /			;1B9	UNIT IS AT BOT
	ASCII /REWND/			;1B10	UNIT IS REWINDING
	ASCII /WLOCK/			;1B11	UNIT IS WRITE LOCKED
	ASCII /MALLW/			;1B12	UNIT HAS MAINT ALLOWED
	ASCII /OPINT/			;1B13	UNIT NEEDS OPR INTERVENTION
	ASCII /1MIN /			;1B14	ONCE A MINUTE MESSAGE
	ASCII /POSRQ/			;1B15	POSITIONING REQUIRED
	ASCII /TAPE /			;1B16   TAPE TYPE DEVICE
	ASCII /TRANS/			;1B17	PSI online/offline/rewind done transition occurred
USTSLN==.-UDBSTAT			;NUMBER OF BITS

;CHANNEL - TYPES

CHNTYP:ASCII /UNDEF/			;0 = NOT DEFINED
	ASCII /RH10 /			;1 = RH10
	ASCII /RH20 /			;2 = RH20
	ASCII /RH11 /			;3 = RH11
CHNLN==.-CHNTYP			;NUMBER OF BITS

;UNIT - TYPES

UNITYP:	ASCII /?????/			;NOT LEGAL
	ASCII /RP04 /			;1 = RP04
	ASCII /RS04 /			;2 = RS04
	ASCII /TU45 /			;3 = TU45
	ASCII /TM02 /			;4 = TM02 *AS A UNIT*
	ASCII /RP05 /			;5 = RP05
	ASCII /RP06 /			;6 = RP06
	ASCII /RP07 /			;7 = RP07
	ASCII /RP08 /			;10= RP08
	ASCII /RM03 /			;11= RM03
	ASCII /TM03 /			;12= TM03
	ASCII /TU77 /			;13= TU77
	ASCII /TM78 /			;14= TM78
	ASCII /TU78 /			;15= TU78
	ASCII /DX20 /			;16= DX20
	ASCII /TU70 /			;17= TU70 (800/1600 200IPS 9TRACK)
	ASCII /TU71 /			;20= TU71 (200/556/800 200 IPS 7TRACK)
	ASCII /TU72 /			;21= TU72 (1600/6250 125 IPS 9TRACK)
	ASCII /TU73 /			;22= TU73 (1600/6250 200 IPS 9TRACK)
UNILN==.-UNITYP				;NUMBER OF BITS

;KONTROLLER - TYPES

KONTYP:ASCII /UNDEF/			;0 = UNDEFINED
	ASCII /TM02 /			;1 = TM02
SUBTTL	MACRO DEFINITIONS
DEFINE BUG(X,Y)<
	JRST [PUSH P,A1
		CRLF
		SAYCR <? STATUS - UNEXPECTED ERROR: Y>
		POP P,A1
	IFIDN <X> <HLT>,<HALTF>
		JRST .+1]>

; FUNCTION DESCRIPTOR BLOCK FOR COMND JSYS
DEFINE CMFDB (TYPE,FLAGS,DATA,HELP,DEFLT,LST)
<	..XX== < FLD(TYPE,CM%FNC) + FLAGS + LST >
  IFNB <HELP>,< ..XX== ..XX+CM%HPP >
  IFNB <DEFLT>,< ..XX== ..XX+CM%DPP >
	..XX
  IFNB <DATA>,<DATA>
  IFB <DATA>,<0>
  IFNB <HELP>, <POINT 7,[ASCIZ\HELP\] >
  IFB <HELP>,  <0>
  IFNB <DEFLT>, <POINT 7,DEFLT >
  IFB <DEFLT>, <0>
>

DEFINE TXT(TEXT) <POINT 7,[ASCIZ\TEXT\]>

	DEFINE O.FLOAT (AC)
<	MOVE A1,OUTJFN
	XLIST
	MOVE A2,AC
	MOVEI A3,10200
	FLOUT
;	 ERCAL ERROR
	 Tmsg<******>		;Ignore overflow
	LIST
>

	DEFINE O.TIME (AC)
<	MOVE A2,AC
	XLIST
	MOVE A1,OUTJFN
	MOVSI A3,200000
	ODTIM
	 ERCAL ERROR
	LIST
>

	DEFINE O.TYP (AC)
<	HRROI A2,AC
	XLIST
	MOVEI A3,5
	MOVE A1,OUTJFN
	SETZ A4
	SOUT
	  ERCAL ERROR
	LIST
>

	DEFINE O.STR (STRING)
<	MOVE A1,OUTJFN
	XLIST
	HRROI A2,[ASCIZ\STRING\]
	SETZM A4
	SETZM A3
	SOUT
	LIST
>


	DEFINE O.OCT(NUM)
<	MOVE A1,OUTJFN
	XLIST
	MOVE A2,NUM
	MOVE A3,[1B2!7B17!10B35]
	NOUT
	  ERCAL ERROR
	LIST
>
;... CONTINUED
;... CONTINUED

	DEFINE O.OCTM (NUM)
<	MOVE A1,OUTJFN
	XLIST
	MOVE A2,NUM
	MOVE A3,[1B0+10]
	NOUT
	  ERCAL ERROR
	LIST
>


	DEFINE O.DEC (NUM)
<	MOVE A1,OUTJFN
	XLIST
	MOVE A2,NUM
	MOVE A3,[1B2!12b17!12B35]
	NOUT
	  ERCAL ERROR
	LIST
>
	DEFINE O.HEX (NUM)
<	MOVE A1,OUTJFN
	XLIST
	MOVE A2,NUM
	MOVE A3,[1B2!7B17!20B35]
	NOUT
	 ERCAL ERROR
	LIST
>

	DEFINE O.CRLF
<	MOVE A1,OUTJFN
	XLIST
	MOVEI A2,.CHCRT
	BOUT
	MOVEI A2,.CHLFD
	BOUT
	LIST
>
	DEFINE MAPTST (ADR)
<	MOVE MA,ADR
	XLIST
	CAML MA,MAPBOT
	CAMLE MA,MAPTOP
	CALL MAPDIR
	LIST
>


	DEFINE GETMPW (AC,LOC)
<	MAPTST LOC
	XLIST
	HRRZ AC,MA
	ADD AC,FDBOFS
	MOVE AC,(AC)
	LIST
>
;... CONTINUED
;... CONTINUED


	DEFINE GETSYM (AC,LOC)
<	HRRZ AC,LOC
	XLIST
	ADD AC,STBOFS
	MOVE AC,(AC)
	LIST
>


	DEFINE PUTSYM (AC,LOC)
<	HRRZ AC,LOC
	XLIST
	ADD AC,STBOFS
	MOVEM AC,(AC)
	LIST
>
	DEFINE TLOAD (AC,LOC,ADR)
<	MOVE MA,LOC
	XLIST
	CAML MA,MAPBOT
	CAMLE MA,MAPTOP
	CALL MAPDIR
	LOAD AC,LOC,ADR
	LIST
>
	DEFINE CRLF
<	MOVEI A1,.CHCRT
	XLIST
	PBOUT
	MOVEI A1,.CHLFD
	PBOUT
	LIST
>

	DEFINE SAY (STRING)
<	HRROI A1,[ASCIZ\STRING\]
	XLIST
	PSOUT
	LIST
>

;... CONTINUED
;... CONTINUED
	DEFINE SAYCR (STRING)
<	HRROI A1,[ASCIZ\STRING
\]
	XLIST
	PSOUT
	LIST
>


	DEFINE PUTOCT
<	MOVEI	A1, 101
	XLIST
	MOVE	A3, [1B0+^D8]
	NOUT
	  ERCAL ERROR
	LIST
>


	DEFINE CHEK (AC,ADR,LOC)
<	SKIPGE ADR
IFB <LOC>,<RET>
IFNB <LOC>,<JRST LOC>
	LOAD AC,DIRTOP
	CAMGE AC,ADR
IFB <LOC>,<RET>
IFNB <LOC>,<JRST LOC>
>



DEFINE	GDIF(AC,MEM),<
	PUSH	P,AC		;SAVE NEW VALUE
	SUB	AC,MEM		;GET DELTA
	POP	P,MEM		;SAVE THIS VALUE AS LAST 
				; VALUE
>

DEFINE	BITTXT(AC,BIT,TEXT),<
IFE AC-A1,<PRINTX ?ERROR IN BITTXT: CAN NOT USE A1>
	XLIST
	MOVE A1,OUTJFN
	MOVEI A3,5
	HRROI	A2,TEXT
	TRNE	AC,(BIT)
	JRST [	SOUT
		MOVEI A2," "
		BOUT
		JRST .+1]
	LIST
>
;... CONTINUED
;... CONTINUED

	DEFINE M.PEEK(WORDS,ADRESS,TO)
<	XLIST
	HRLI A1,WORDS	;NUMBER OF WORDS
	HRR A1,ADRESS	;MONITOR ADRESS
	HRRZI A2,TO	;USER ADRESS
	PEEK
	 ERJMP ERROR	;FAILED
	LIST
>
SUBTTL	MAIN ENTRY POINT AND INITIALIZATION

START:
	RESET
	MOVE P,[IOWD NPDL,PDL]		;SET PDL UP
	MOVEI A1,.FHSLF			;OUR ID
	RPCAP				;READ OUR CAPABILITIES
	 ERCAL ERROR
	DMOVEM A2,SAVCAP		;SAVE THEM FOR EXIT
	TLNN A2,(1B0)			;CAN WE ENABLE CONTROL-C ?
;	  BUG(HLT,<CANNOT ENABLE FOR CONTROL-C INTERCEPT>)
	MOVEI A1,.FHSLF			;US
	MOVE A3,A2			;ENABLE ALL OF THEM
	EPCAP				;DO IT
	 ERCAL ERROR
	SETZM ZERBEG
	MOVE A1,[ZERBEG,,ZERBEG+1]
	BLT A1,ZEREND			;CLEAR IMPURE STORAGE
	MOVEI A1,.FHSLF			;US
	 DIR				;TURN PI-SYSTEM OFF
	MOVE A2,[LEVTAB,,CHNTB]		;SET IT UP
	 SIR
	EIR				;ENABLE INTERRUPTS
	MOVE A2,[1B0]
	AIC				;ENABLE CHAN 0
	MOVE A1,["C"-100,,0]
;	ATI				;ASSIGN CONTROL-C FOR INTERRUPTING
	MOVSI T1,-SYMTBL
SYMFND:	MOVEI A1,.SNPSY			;TRANSFORM SYMBOL TO ADRESS
	MOVE A2,SYMOCT(T1)
	MOVE A3,SYMOCT+1(T1)
	SNOOP
	 ERCAL ERROR
	MOVE A3,SYMOCT+2(T1)		;GET LABEL WHERE TO STICK ADRESS
	HRRM A2,(A3)
	ADD T1,[2,,2]
	AOBJN T1,SYMFND
	MOVE A1,NJOBS			;MAX JOB-NR THE SYSTEM SUPPORTS
	CAIL A1,MAXJOB			;DO WE HAVE ENOUGH ROOM
	 BUG(HLT,<RECOMPILE WITH MAXJOB SET HIGHER>)
	

TYPANO:MOVE A1,[SIXBIT/JOBRT/]
	SYSGT
	 ERCAL ERROR
	HLRE A1,A2
	GJINF
	 ERCAL ERROR
	MOVEM A3,OURJOB				;OUR JOB-NR
	HRROI A2,[ASCIZ /MONITR.STS/]		;OUR OUTPUT-FILE
	MOVEM A2,OURFIL				;SAVE FOR POSIBBLE RETRY
	hrrz a1,ourjob
	caie a1,0				;under SYSJOB ?
	jrst [MOVEI A1,101
		MOVEM A1,OUTJFN			;TO TTY ONLY
		jrst typanp]
	MOVE A1,[1B2!1B6!1B17]
	GTJFN
	 JRST [MOVE A2,OURFIL
		MOVE A1,[1B1!1B6!1B17]
		GTJFN				;TRY NEW FILE
		 ERCAL ERROR
		JRST .+1]
	MOVEM A1,OUTJFN				;REMEMBER JFN
	MOVE A2,[7B5!1B20!1B22]			;WRITE 7BIT,UPDATE
	OPENF
	 ERCAL ERROR
	MOVE A1,OUTJFN
	RFPTR				;READ FILE-POINTER NOW
	 ERCAL ERROR
	MOVEM A2,FILPOS			;AND SAVE IT
TYPANP:	CALL MONSTS			;DO MONITOR STATUS
;	CALL JOBSTS			;.. AND SYSTAT
	CALL CHNFND			;STEP THRU DDB'S
	HRRZ A1,OUTJFN			;CLOSE OUTPUT-FILE
	TXO A1,1B0			;BUT KEEP JFN
	CLOSF
	 ERCAL ERROR
;	MOVE A1,OUTJFN			;OPEN IT FOR WRITE ONLY
;	MOVE A2,[7B5!1B19!1B20]		;WRITE 7 BIT,UPDATE
;	OPENF
;	 ERCAL ERROR
;	MOVE A1,[1B2!1B6!1B17]
;	MOVE A2,OURFIL
;	GTJFN
;	 ERCAL ERROR
	jrst loop1			;sleep or not to ( thats the question )
	SUBTTL MAIN LOOP AND END-HANDLING ( CONTROL-C INTERCEPT)
LOOP:	CALL MONSTS			;DO MONITOR THINGIES
;	CALL JOBSTS			;... AND SYSTAT
	CALL CHNFND			;STEP THRU CDB'S
	HRRZ A1,OUTJFN			;CLOSE OUTPUT-FILE
	TXO A1,1B0			;BUT KEEP JFN
	CLOSF
	 ERCAL ERROR
loop1:	hrrz a1,ourjob
	caie a1,0		;if under SYSJOB go to sleep , otherwise finish
	jrst	[HALTF
		JRST START ]		;in case he types continue
	MOVE A1,[SLEEP]			;SLEEP 
WAITPC:	DISMS			;	A WHILE
	MOVE A1,OUTJFN			;OPEN IT FOR WRITE ONLY
	MOVE A2,[7B5!1B19!1B20]		;READ AND WRITE 7 BIT
	OPENF
	 ERCAL ERROR
	MOVE A1,OUTJFN			;RESET FILE POINTER
	MOVE A2,FILPOS
	SFPTR
	 ERCAL ERROR
	JRST LOOP			;AND KEEP GOING
ABORT:	MOVEM A1,SAVEIT			;SAVE AC1
	HRRZ A1,IPC1
	CAIE A1,WAITPC+1		;CAME FROM REQUESTED WAIT?
	JRST .+2			;NO RESUME
	MOVEI A1,ABRT1			;RESUME TO END
INTR1:	HRRM A1,IPC1
	MOVE A1,SAVEIT			;RESTORE A1
	DEBRK

ABRT1:	MOVE A1,OUTJFN
	RLJFN
	 ERCAL ERROR
	HRROI A1,[ASCIZ /
ABORTED.
/]
	PSOUT
	MOVEI A1,.FHSLF
	DMOVE A2,SAVCAP			;GET ORIGINAL CAPS
	EPCAP
	 ERCAL ERROR
	HALTF
	SUBTTL GET MONITOR-STATUS
MONSTS:O.CRLF
	O.STR <MONITOR-STATUS AT:	>
	SETO T1,			;TYPE TIME OF DAY
	O.TIME T1			;
	O.CRLF
	O.CRLF
	M.PEEK TBLENR,GTTAB,GETTAB	;GET LENGTH,ADRESS
	M.PEEK 1,GETTAB+APRID,T1	;..FIRST APR-ID
	O.STR <APR-NR. : >
	O.DEC T1			;TYPE APR-NR.
	O.STR <	>
	M.PEEK 50,GETTAB+SYSVER,TMPDAT
	HRROI A2,TMPDAT
	MOVE A1,OUTJFN
	SOUT				;TYPE SYSTEM VERSION
	 ERCAL ERROR
	O.CRLF
	O.STR <			BUILT AT : >
	M.PEEK 1,GETTAB+SYSTAD,T1
	O.TIME T1
	O.CRLF
	O.STR <   UPTIME : >
	M.PEEK 1,TODCLK,T1
	M.PEEK 1,GETTAB+TICKPS,T2
	DMOVE A1,T1			;MOVE TIME OVER FOR TYPTIM
	IDIV A1,A2
	PUSHJ P,TYPTIM			;AND PRINT UPTIME
	O.STR <	LOAD AV: >
	M.PEEK TBLENR,GETTAB+SYSTAT,TMPDAT;GET SYSTAT TABLE
	MOVE T1,TMPDAT+14
	O.FLOAT T1
	O.STR <	>
	MOVE T1,TMPDAT+15
	O.FLOAT T1
	O.STR <	>
	MOVE T1,TMPDAT+16
	O.FLOAT T1
	O.CRLF
	MOVE A1,NTMS			;NR OF TICKS PER  MS
	IMULI A1,^D600			;MAKE IT DIVISOR
	MOVEM A1,NTMS			;AND STORE
	O.STR <IDLE-TIME : >
	MOVE A1,TMPDAT		;IDLE TIME
	MOVE A2,T2			;DIVISOR
	IDIV A1,A2			;FOR TYPTIM
	CALL TYPTIM			;PRINT IT
	O.STR <	LOST-TIME : >
	MOVE A1,TMPDAT+1		;LOST TIME
	MOVE A2,T2			;DIVISOR
	IDIV A1,A2			;FOR TYPTIM
	CALL TYPTIM			;PRINT IT
	O.STR <	SCHED-USE : >
	MOVE A1,TMPDAT+2		;SCHED OVERHEAD
	MOVE A2,T2			;DIVISOR
	IDIV A1,A2			;FOR TYPTIM
	CALL TYPTIM			;PRINT IT
	M.PEEK 1,GETTAB+NCPGS,T1	;GET USER PAGES
	O.CRLF
	O.DEC T1			;PRINT THEM
	O.STR < PAGES PHYSICAL USER CORE (PAGEABLE) >
	M.PEEK 2,GETTAB+DWNTIM,TMPDAT	;GET CEASE VALUES
	MOVE T1,TMPDAT
	JUMPE T1,NOCEAS			;NO VALUE SET
	O.CRLF
	O.STR <SHUTDOWN AT: >
	O.TIME T1
	MOVE T1,TMPDAT+1
	JUMPE T1,NOCEAS			;NO VALUE SET
	O.STR <	UP AGAIN AT: >
	O.TIME T1
NOCEAS:O.CRLF
	RET				;FINISHED
	SUBTTL GETTING THRU CDB'S => KDB'S => UDB'S
CHNFND:O.CRLF
	O.CRLF
	O.STR < DEVICE STATUS: >
	O.CRLF
	O.CRLF
	M.PEEK 8,CHNADR,CDBADR		;GET CDB-ADRESSES
	M.PEEK 1,MAXCHN,CI		;GET MAX CHANNELS IN CI
	MOVNS CI,CI
	HRLZ CI,CI			;MAKE IT AOBJN-POINTER
CHNLOP:SKIPN ,CDBADR(CI)		;THIS CHANNEL USED?
	JRST CHNMOR			;TRY NEXT ONE
	O.STR <CHANNEL: >
	HRRZ T1,CI			;GET CHANNEL NR.
	O.OCT T1			;AND TYPE IT
	O.STR <	TYPE: >			;
CDBFND:M.PEEK 50,CDBADR(CI),CDB	;GET CDB
	LOAD T1,CDBTYP			;CDB-TYPE
	O.TYP CHNTYP(T1)		;AND TYPE IT
;	O.STR <	PI: >			;PI-ASSIGNMENT
;	LOAD T1,CDBPIA			;GET PI-ASSIGNMENT
;	O.OCT T1			;AND TYPE IT
	O.CRLF				;NEXT LINE
	O.STR <STATUS: >
	CLEAR T2,			;INDEX INTO CDBSTA
	LOAD T1,CDBSTS			;GET CDB STATUS
	MOVEI T3,400000			;BIT - MASK
	MOVEI T4,CSTSLN			;COUNTER
CDBOUT:BITTXT T1,T3,CDBSTA(T2)	;TYPE IT
	SOS T4
	JUMPE T4,CDBDON			;DONE WITH STATUS
	LSH T3,-1			;NEXT BIT
	AOS T2
	JRST CDBOUT			;NEXT BIT
CDBDON:O.CRLF
	HRLZI KI,-10			;MAKE IT AOBJN-POINTER
	HRRZ T4,CDB+16(KI)		;GET KDB/UDB ADRESS
	JUMPN T4,KDBFND			;A REAL ADRESS?
CDBMOR:AOBJN KI,.-2			;KEEP LOOKING
	JRST CHNMOR			;ALL DONE
KDBFND:M.PEEK 50,T4,KDB		;GET UDB/KDB
	LOAD T1,blkTYP			;KDB ?
	cain t1,.ublk			;is it UDB?
	JRST UDBFND
	JRST FNDUDB			;FIND UDB'S FOR THIS KDB
UDBFND:MOVE UI,KI			;GET INDEX AOBJN-POINTER
	M.PEEK 50,T4,UDB		;GET UDB
	CALL UDBPNT			;PRINT UDB-VALUES
	JRST CDBMOR			;FIND NEXT ONE

FNDUDB:HRLZI UI,-4			;MAKE AOBJN-POINTER
	HRRZ T1,KDB+4(UI)		;CHECK IF UDB USED
TEMP:	PUSHJ P,MTC			;FIND A VALID TAPE(MTCUTB)
	JRST NXTUDB			;NOPE,TRY NEXT ONE
	M.PEEK 50,FX#,UDB		;GET UDB
	CALL UDBPNT			;PRINT UDB-VALUES
NXTUDB:AOBJN UI,FNDUDB+1		;NEXT ONE
	JRST CDBMOR			;AND NEXT CDB-ENTRY
CHNMOR:O.CRLF
	O.CRLF
	AOBJN CI,CHNLOP			;GO THRU CHANNELS
	RET				;AND RETURN
 SUBTTL COMMON SUBROUTINES

UDBPNT:O.CRLF
	O.STR <		DEVICE: >
	LOAD T1,UDBTYP			;DEVICE-TYP
	O.TYP UNITYP(T1)
UDVDON:O.STR <	SER. NR. : >
	LOAD T1,UDBDSN			;DRIVE SERIAL-NR
	MOVEM T1,DEVTYP			;CHECK IF MAGTAPE
	LOAD T2,udbsts			;IS IT MAGTAPE?
	trne t2,2			;is it tape?
	jrst udvdn1			;it is
	O.HEX T1			;RM03'S ANMD RP06'S
	JRST UDVDN2			;GO AROUND
UDVDN1:	cain t1,40431			;serial # NOT cut ?
	jrst [ o.typ unityp		;type ????? to him
		jrst udvdn2]
	O.DEC T1			;MAGTAPES (TU45)
UDVDN2:	LOAD T2,blkTYP			;KDB ?
	caiN T2,.ublk			;is it UDB?
	JRST TMN
	HRRZ T3,KDB+10(UI)		;GET TM NO.
	HRRZ T1,FXN#			;GET SLAVE-NR
	O.STR <  TM:>
	O.OCT T3
TMN:	caiN T2,.ublk			;is it UDB?
	HRRZ T1,UI			;GET SLAVE-NR
	O.STR < UNIT: >
	O.OCT T1
	O.CRLF
	O.STR <		STATUS: >
	LOAD T1,UDBSTS			;STATUS OF UDB
	CLEAR T2,			;INDEX INTO TRANSLATION TABLE
	MOVEI T3,400000			;FIRST BIT TO TEST
	MOVEI T4,USTSLN			;TABLE LENGTH
UDBOUT:	BITTXT T1,T3,UDBSTA(T2)		;TYPE IT
	SOS T4
	JUMPE T4,UDBDON			;DONE WITH STATUS
	LSH T3,-1			;NEXT BIT
	AOS T2
	JRST UDBOUT			;TYPE NEXT BIT
UDBDON:	O.CRLF
	troe t1,400000			;unit off-line?
	popj p,				;then done
	O.STR <		FUNCTION       UNITS      SOFT-ERR   HARD-ERR >
	O.CRLF
	O.STR <		-------------------------------------------------------- >
	LOAD T2,UDBSEK			;SEEK COUNT
	JUMPE T2,UDBNSK			;NO SEEK'S--NO TYPEOUT
	O.CRLF
	O.STR <		SEEKS :   >
	O.DEC T2
UDBNSK:O.CRLF
	O.STR <		READ  :   >
	LOAD T1,UDBRED			;READ COUNT
	O.DEC T1
	O.STR < >
	LOAD T1,UDBSRE			;SOFT READ ERROR COUNT
	O.DEC T1
	O.STR < >
	LOAD T1,UDBHRE			;HARD READ ERROR COUNT
	O.DEC T1
	LOAD T4,UDBsts			;UNIT A TAPE?
	trne t4,2			;is it tape?
	JRST	[ O.STR <	(FRAMES)>
		  JRST .+2 ]
	JRST	[ O.STR <	(BLOCKS or 4608. Bits)>
		  JRST .+1 ]
	O.CRLF
	O.STR <		WRITE :   >
	LOAD T1,UDBWRT			;WRITE COUNT
	O.DEC T1
	O.STR < >
	LOAD T1,UDBSWE			;SOFT WRITE ERROR COUNT
	O.DEC T1
	O.STR < >
	LOAD T1,UDBHWE			;HARD WRITE ERROR COUNT
	O.DEC T1
	LOAD T4,UDBsts			;UNIT A TAPE?
	trne t4,2			;is it tape?
	JRST	[ O.STR <	(FRAMES)>
		  JRST .+2  ]
	JRST	[ O.STR <	(BLOCKS or 4608. Bits)>
		  JRST .+1 ]
	O.CRLF
	POPJ P,				;AND GO BACK

;SUBROUTINE TO DO SYSTAT-LIKE OUTPUT

JOBSTS:O.CRLF
	O.STR <      JOB   TTY PROGRM  RUNTIME        LOGGED CONNECTED >
	O.CRLF
;	M.PEEK MAXJOB,GETTAB+JOBDIR,.JBDIR ;FIRST GET THE DATA-TABLES
;	M.PEEK MAXJOB,GETTAB+JOBTTY,.JBTTY
;	M.PEEK MAXJOB,GETTAB+JOBRT ,.JBRT
;	M.PEEK MAXJOB,GETTAB+TTYJOB,.TTYJB
;	M.PEEK MAXJOB,GETTAB+JOBPNM,.JBPNM
;	M.PEEK MAXFRK,GETTAB+DEVUNT,.DVUNT
;	M.PEEK MAXFRK,GETTAB+DEVNAM,.DVNAM
	MOVN T3,NJOBS			;AOBJN-POINTER
	HRLZ T3,T3			;
JOBLOP:	hrrz a1,t3			;this job now
	move a2,[xwd -20,jobinf]		;this job now
	setzm a3				;all of it
	getji
	JRST JOBNXT			;FIND NEXT JOB
	move t2,jobinf+1		;is he logged in?
	camn t2,[-1,,-1]		;skip is he is
	jrst jobnxt			;next one
	o.crlf
	move a1,outjfn			;our output
	move t2,jobinf			;job-nr
	o.dec t2
	o.str <	>	
	move t2,jobinf+1		;terminal number
	cain t2,-1			;job detached?
	jrst dtchd			;say so
	o.oct t2
ndtchd:	o.str <	>
	move t4,jobinf+5		;jobs program name
	call sixpnt			;print it
	o.str <	>
	m.peek 1,gettab+tickps,a2	;get divisor
	move a1,jobinf+6		;runtime
	idiv a1,a2			;convert
	call typtim
	o.str <	>
	move a2,jobinf+17		;logged in directory number
	movem a2,dirnum			;for compare
	dirst
	 CALL error			;
	o.str <	>
	move a2,jobinf+3		;connected directory
	camn a2,dirnum			;same as logged in?
	jrst jobnxt			;don't print then
	dirst
	 call error
JOBNXT:AOBJN T3,JOBLOP			;KEEP LOOPING
	POPJ P,				;AND RETURN

DTCHD:	O.STR <DET>
	JRST NDTCHD			;AND KEEP GOING


;SIXPNT TRANSLATES 6-BIT WORD IN T4 TO OUTJFN

SIXPNT:MOVEI A4,6		;6 CHARACTERS
	MOVE A1,OUTJFN		;OUR OUTPUT
	MOVE A3,[POINT 6,T4]	;POINTER TO IT

SIXPUT:ILDB A2,A3		;GET A BYTE
	ADDI A2,40		;MAKE IT ASCII
	BOUT
	 ERCAL ERROR
	SOJG A4,.-4		;COUNT 6 OF THEM
	POPJ P,			;RETURN TO CALLER

;SUBROUTINE TO PRINT THE TIME
;CALL WITH:
;	A1 = TIME IN SECONDS
;	A2 = MILLISECONDS
;	PUSHJ	P,TYPTIM
;
;

TYPTIM:	push p,a1
	push p,a2
	push p,a3
	move a2,a1
	move a1,outjfn
TYPTM2: idivi a2,^D3600
	push p,a3
	move a3,[ 1b0+1b2+1b5+3B17+^D10]
	nout			;hours
	jfcl
	movei a2,":"
	bout
	pop p,a2
	idivi a2,^D60
	push p,a3
	move a3,[ 1b2+1b3+1b5+2b17+^D10]
	nout			;minutes
	jfcl
	movei a2,":"
	bout
	pop p,a2
	nout			;seconds
	jfcl
	jrst [pop p,a3
	      pop p,a2
	      pop p,a1
	      ret ]


; SAVACS - ROUTINE TO SAVE ALL 16 ACCUMULATORS.
;
; CALL:		CALL SAVACS
;		RETURN


SAVACS:	MOVEM 0,SAVE0		;SAVE ACCUMULATOR 0
	MOVE 0,[A1,,SAVEA1]	;SET UP FOR BLT
	BLT 0,SAVEA1+16		;SAVE NEXT 15 ACCUMULATORS
	RET			;RETURN TO WHENCE WE CAME ...



; RESACS - ROUTINE TO RESTORE ALL 16 ACCUMULATORS
;
; CALL:		CALL RESACS
;		RETURN


RESACS:	MOVE 0,[SAVEA1,,A1]	;SET UP FOR BLT
	BLT 0,17		;RESTORE AC'S 1-17
	MOVE 0,SAVE0		;RESTORE AC 0
	RET			;RETURN TO WHENCE WE CAME ...
; MAPDIR - ROUTINE TO MAP PAGES FROM THE DIRECTORY FILE INTO THE
;	   ADDRESS SPACE OF THIS PROCESS.
;
; CALL:		[JFN FOR DIRECTORY FILE IS IN DIRJFN]
;		MOVE MA,REQUIRED ADDRESS
;		CALL MAPDIR
;		RETURN

MAPDIR:	CALL SAVACS		;GO SAVE ALL AC'S
	HRLZ A1,DIRJFN		;GET DIRECTORY JFN
	MOVE T1,MA		;COPY ADDRESS REQUIRED
	LSH T1,-^D9		;CONVERT ADDRESS TO PAGE #
	HRR A1,T1		;GET PAGE # IN FILE
	MOVSI A2,.FHSLF		;GET OUR FORK HANDLE
	MOVEI T1,MAPPGS		;GET CORE ADDRESS OF DIR PAGE
	LSH T1,-^D9		;CONVERT ADDRESS TO PAGE #
	HRR A2,T1		;COPY ADDRESS TO ARG AC FOR PMAP
	MOVX A3,PM%RD!PM%CNT	;READ ACCESS ONLY, ITERATION CNT
	HRRI A3,FDBPGS		;GET # OF PAGES TO MAP
;	LOAD T1,DIRFRE		;GET HIGHEST ADDRESS+1 FOR FDB'S
	SUBI T1,1		;COMPUTE HIGHEST ADR FOR FDB'S
	LSH T1,-^D9		;CONVERT ADDRESS TO PAGE #
	MOVE T2,MA		;GET DESIRED ADDRESS
	LSH T2,-^D9		;CONVERT ADDRESS TO A PAGE #
	SUB T1,T2		;COMPUTE # OF PAGES TO MAP-1
	ADDI T1,1		;COMPUTE # OF PAGES TO MAP
	CAIG T1,FDBPGS		;LESS THAN # OF MAPPING PAGES ?
	HRR A3,T1		;YES, USE LESSER # OF PAGES
	HRREI A4,-1(A3)		;SAVE # OF PAGES TO MAP-1
	PMAP			;MAP THE PAGES
	MOVE T1,MA		;GET REQUIRED ADDRESS
	TRZ T1,777		;COMPUTE LOWEST ADDRESS MAPPED
	MOVEM T1,MAPBOT		;SAVE LOWEST ADDRESS MAPPED
	LSH T1,-^D9		;CONVERT LOWEST ADR TO PAGE #
	ADD T1,A4		;COMPUTE HIGHEST PAGE MAPPED
	LSH T1,^D9		;CONVERT PAGE # TO ADDRESS
	TRO T1,777		;COMPUTE HIGHEST ADR MAPPED
	MOVEM T1,MAPTOP		;SAVE HIGHEST ADR MAPPED
	MOVEI T1,MAPPGS		;GET ADDRESS OF MAPPED AREA
	HRRZ T2,A1		;GET PAGE # IN FILE
	LSH T2,^D9		;COMPUTE ADDRESS IN FILE
	SUB T1,T2		;COMPUTE MAPPED ADDRESS OFFSET
	MOVEM T1,FDBOFS		;SAVE OFFSET TO MAPPED ADDRESSES
	CALL RESACS		;GO RESTORE ALL THE AC'S
	RET			;RETURN TO WHENCE WE CAME ...
; ECHOFF - ROUTINE TO TURN OFF ECHOING FOR ESCAPES
;
; CALL:		CALL ECHOFF
;		RETURN


ECHOFF:	MOVEI A1,.PRIOU		;GET PRIMARY OUTPUT JFN
	RFCOC			;READ ECHOING BITS
	TRZ A3,3B19		;TURN OFF ESCAPE ECHOING
	SFCOC			;TELL MONITOR
	RET			;RETURN TO WHENCE WE CAME ...


ERROR:	MOVEI A1,.PRIIN
	HRLOI A2,.FHSLF
	SETZ A3,
	ERSTR
	JFCL
	JFCL
	HALTF
	JRST START
	SUBTTL PURE STORAGE
;ENTRY VECTOR DEFINITION
ENTVEC:	JRST START		;MAIN ENTRY POINT
	JRST START		;REENRTY ADRESS
	EXP VSTATS		;VERSION OF STATUS

LEVTAB:	XWD 0,IPC1
	XWD 0,IPC2
	XWD 0,IPC3

IPC1:	BLOCK 1
IPC2:	BLOCK 1
IPC3:	BLOCK 1

CHNTB:	XWD 1,ABORT
	REPEAT ^D19-^D1,<0
		XLIST>
SAVJFN:777777
	LIST
	REPEAT ^D35-^D19,<0
		XLIST>
	LIST

SYMOCT:	RADIX50 0,MTCUTB		;NUMBER OF TICKS PER MS
	RADIX50 0,STG
	MTCADR

	RADIX50 0,NTMS		;NUMBER OF TICKS PER MS
	RADIX50 0,APRSRV
	NTMS
	RADIX50 0,MAXCHN	;SYMBOL NAME
	RADIX50 0,STG		;MODULE NAME
	MAXCHN			;WHERE WE KEEP MONITOR-ADRESS
	RADIX50 0,CHNTAB
	RADIX50 0,STG
	CHNADR
	RADIX50 0,GTTAB
	RADIX50 0,MEXEC
	GTTAB			;WHERE WE KEEP IT
	RADIX50 0,TODCLK
	RADIX50 0,STG
	TODCLK
	RADIX50 0,NJOBS
	RADIX50 0,STG
	NJOBS

SYMTBL==.-SYMOCT
SUBTTL IMPURE STORAGE

ZERBEG::
FDBOFS:	BLOCK 1		;JUST FOR NOW
NTMS:	BLOCK 1			;NUMBER OF TICKS PER MS
PDL:		BLOCK NPDL	;PUSH DOWN LIST
SAVEIT:	BLOCK 1		;A1 DURING CONTROL-C HANDLING
SAVE0:		BLOCK 1		;SAVED AC0
SAVEA1:	BLOCK 17	;OTHER 17 SAVED AC'S
FILPOS:	BLOCK 1		;OUR FILE-POSITION
NJOBS:		BLOCK 1		;NUMBER OF JOBS ,THIS MONITOR
OURFIL:	BLOCK 2		;OUR FILE-NAME STRING
OURJOB:	BLOCK 1		;OUR JOB-NR (TEST FOR SYSJOB)
SAVCAP:	BLOCK 2			;OUR CAPABILTIES
DIRNUM:	BLOCK 1		;LOGGED IN DIRECTORY
GTTAB:		BLOCK 1		;ADRESS OF LNGTH,,GETTAB TABLES
TODCLK:	BLOCK 1		;ADRESS OF TODCLK
DIRJFN:	BLOCK 1		;JFN FOR PMAP
FDBPGS:	BLOCK 1		;NUMBER OF PAGES TO MAP
MAPTOP:	BLOCK 1		;HIGHEST ADRESS MAPPED
MAPBOT:	BLOCK 1		;LOWEST ADRESS MAPPED
MAPPGS:	BLOCK 1		;MAPPING AREA (PAGE-NR)
OUTJFN:	BLOCK 1		;OUTPUT-JFN
MAXCHN:	BLOCK 1		;ADRESS OF SAME
CHNADR:	BLOCK 1		;ADRESS OF CHNTAB
CHNTAB:	BLOCK 10	;	""
CDBADR:	BLOCK 10	;ADRESSES OF CDB'S
UDBADR:	BLOCK 10	;ADRESSES OF UDB'S
KDBADR:	BLOCK 10	;ADRESSES OF KDB'S
UDB:		BLOCK 50	;CONTENTS OF A UDB
CDB:		BLOCK 50	;CONTENTS OF A CDB
KDB:		BLOCK 50	;CONTENTS OF A KDB
TMPDAT:	BLOCK MAXFRK	;TEMPORARY STORAGE
GETTAB:	BLOCK TBLENR	;CONTENTS OF GTTAB-TABLE (LENGTH,,ADRESS)
.JBDIR:	BLOCK MAXJOB	;LH:CONN-DIR, RH:LOGD-DIR
.JBTTY:	BLOCK MAXJOB	;LH: CON-TTY, RH:TOP FRK-NR
.JBRT:		BLOCK MAXJOB	;JOB RUNTIME
.TTYJB:	BLOCK MAXJOB	;LH: JOB-NR , RH: JOB WAITING (IF NOT -1)
.JBPNM:	BLOCK MAXJOB	;SIXBIT NAME OF PROGRAM RUNNING
.FKJOB:	BLOCK MAXFRK	;LH: JOB-NR , RH: JSB-ADRESS
.FKNR:		BLOCK MAXFRK	;LH: 2 AGES , RH: WORKING SET SIZE
.DVUNT:	BLOCK MAXFRK	;LH: JOB ASS, RH: UNIT-NR
.DVNAM:	BLOCK MAXFRK	;SIXBIT DEVICE NAME
DEVTYP:	BLOCK 1		;DEV-TYP OF UDB
jobinf:	block 20	;job info for getji
ZEREND::.-1			;END OF IMPURE STORAGE
MTC:	MOVEM T1,FX#		;SAVE UDB ADDRESS
	SETZM FXN#		;LOGICAL COUNT ON TM
	PUSH P,T1		;SAVE AC
	M.PEEK 10,MTCADR,MTCUTB	;TAPE STATUS BLOCK
	MOVE T2,FX#		;GET UDB ADDRESS
	HRLZI T1,-7		;MAX TAPE COUNT
FZ:	HRR T3,MTCUTB(T1)	;MAGTAPE UDB ADDRESS
	SKIPN T3		;DO WE HAVE A TAPE ?
	JRST .+4		;NO
	AOS  FXN#		;SAVE LOGICAL UNIT
	CAMN T2,T3		;IS IT THE ONE WE WANT?
	JRST FZT		;YES
	AOBJN T1,FZ		;NO KEEP LOOKING
FZE:	POP P,T1		;RESTORE AC
	 POPJ P,		;RETURN NO MORE TAPES HERE
FZT:	SKIPN T2		;BAD ADDRESS
	JRST FZE		;RETURN FALSE
	SOS FXN#		;LOGICAL
	POP P,T1		;GOOD - RESTORE AC 
	AOS (P)			;SKIP RETURN FOR VALID TAPE
	 POPJ P,		;RETURN

MTCUTB: BLOCK 10
MTCADR: Z
PATCH:	BLOCK 100
	END <3,,ENTVEC>