Google
 

Trailing-Edge - PDP-10 Archives - AP-4171F-BM - uetp/lib/uetp.mac
There is 1 other file named uetp.mac in the archive. Click here to see a list.
;<UETP.LIB>UETP.MAC.51, 12-Jun-78 09:52:40, Edit by ENGEL
;GET RID OF VERSION NUMBER PRINTING
;<UETP.LIB>UETP.MAC.30, 25-Apr-78 09:24:15, Edit by ENGEL
;update help text
TITLE UETP



;COPYRIGHT (C) 1977 BY
;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
;
;
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED
;ONLY  IN  ACCORDANCE  WITH  THE  TERMS  OF  SUCH LICENSE AND WITH THE
;INCLUSION OF THE ABOVE COPYRIGHT NOTICE.  THIS SOFTWARE OR ANY  OTHER
;COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY
;OTHER PERSON.  NO TITLE TO AND OWNERSHIP OF THE  SOFTWARE  IS  HEREBY
;TRANSFERRED.
;
;
;THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT  NOTICE
;AND  SHOULD  NOT  BE  CONSTRUED  AS A COMMITMENT BY DIGITAL EQUIPMENT
;CORPORATION.
;
;DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY  OF  ITS
;SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL.
	SEARCH MONSYM, MACSYM
	.REQUIRE SYS:MACREL
	SALL

; ACCUMULATOR DEFINITIONS

	T1=1		;TEMPORARY
	T2=2		;TEMPORARY
	T3=3		;TEMPORARY
	T4=4		;TEMPORARY
	Q1=5		;PRESERVED
	Q2=6		;PRESERVED
	Q3=7		;PRESERVED
	P1=10		;PRESERVED
	P2=11		;PRESERVED
	P3=12		;PRESERVED
	P4=13		;PRESERVED
	P5=14		;PRESERVED
	P6=15		;PRESERVED (CAUTION, USED BY SOME MACROS IN MACSYM)
	CX=16		;RESERVED FOR SUPPORT CODE
	P=17		;PUSH-DOWN POINTER

; VERSION NUMBER DEFINITIONS

VMAJOR==1		;MAJOR VERSION OF UETP
VMINOR==0		;MINOR VERSION NUMBER
VEDIT==16		;EDIT NUMBER
VWHO==0			;GROUP WHO LAST EDITED PROGRAM (0=DEC DEVELOPMENT)

VUETP== <VWHO>B2+<VMAJOR>B11+<VMINOR>B17+VEDIT

NCHPW==5		;NUMBER OF ASCII CHARACTERS PER WORD
BUFSIZ==1000		;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
FDBSIZ==.CMDEF+2	;SIZE OF FUNCTION DESCRIPTOR BLOCK
NAMSIZ==200		;ALLOW UP TO 200 (OCTAL) TESTS
WRKSIZ==200		;SIZE OF GENERAL PURPOSE BUFFER
PDLEN==150		;PUSH-DOWN STACK LENGTH
CORSIZ==200000		;SIZE IN WORDS OF CORE TABLE
		SUBTTL		FLAG AND SYMBOL DEFENITIONS

DELETE=1		;DELETE AN ENABLED TEST FROM TABLE (SCHED)
CREATE=2		;ADD AN ENTRY TO THE TABLE (SCHED)
MODIFY=3		;CHANGE A VALUE OF AN ENTRY IN A TABLE (SCHED)
STARTM=4		;START (SUBMIT) ALL ENABLED JOBS
READ=5			;READ AN ENTRY OFF ENABLED TABLE (SCHED)
STRMSG=6		;START MESSAGE FOR ENABLED TEST RCV'D (SCHED)
ENDMSG=7		;END   MESSAGE FOR ENABLED TEST RCV'D (SCHED)
ERRMSG=10		;ERROR MESSAGE FOR ENABLED TEST RCV'D (SCHED)
ABORT=11		;ABORT THE SPECIFIED JOB

;  LOCAL FLAGS

SC%EOT=400000			;FLAG FROM SCHED - END OF ENABLED TABLE REACHED
NT%QUE=200000,,0		;SCHED FLAG - TEST IS QUEUED IN GALAXY
NT%RUN=100000,,0		;SCHED FLAG - TEST RUNNING
NT%END=40000,,0		;SCHED FLAG - TEST ENDED
NT%ABR=20000,,0		;SCHED FLAG - TEST WAS ABORTED
NT%ENA=10000,,0		;SCHED FLAG - TEST ENABLED
NT%ERR=4000,,0		;SCHED FLAG - ERRORS IN THIS RUN OF TEST
NT%SUP=400000		;FLAG INDICATING A SUPERFICIAL DEPTH
NT%INT=200000		;FLAG INDICATING AN INTERMEDIATE DEPTH
NT%MAX=100000		;FLAG INDICATING AN INTERMEDIATE DEPTH
NT%CON=40000		;FLAG TO SHOW /CYCLE IS CONTINUOUS
NT%NUM=20000		;FLAG TO SHOW /CYCLE IS A REPETITION COUNT
NT%TYM=10000		;FLAG TO SHOW /CYCLE IS TIME VALUE
PR%ALL=400000		;PARSE SWITCH INDICATING USER TYPED "ALL"
PR%ONE=200000		;PARSE SWITCH INDICATING USER WANTED 1 OPTION
				SUBTTL  LOCAL MACRO'S

;   TXT MACRO - TAKES ARGUMENT AND CREATES A POINTER TO IT AS AN ASCIZ STRING
;
DEFINE TXT(TEXT) <POINT 7,[ASCIZ\TEXT\]>
;
; RITMSG - MACRO TO CALL SNDMSG, WHICH PRINTS OUT THE MSG ON TTY AND/OR TAKE
;		LOG FILE.
;
	DEFINE	RITMSG(STR)<
	HRROI	T1,[ASCIZ\STR\]		;POINT TO STRING
	CALL	SNDMSG			;GO TYPE THE MSG
>
;
; ERRSND - MACRO TO CALL SNDERR, WHICH PRINTS THE ERROR MSG ON TTY AND/OR TAKE
;		LOG FILE.
;
	DEFINE	ERRSND(MSG)<
	HRROI	T1,[ASCIZ\MSG\]		;POINT TO STRING
	CALL	SNDERR			;GO TYPE THE MSG
>
; THIS MACRO IS USED TO CREATE TBLUK JSYS TYPE ENTRIES
DEFINE TB(RTN,TXT)
<	[ASCIZ/TXT/] ,, RTN
>
; THIS MACRO SAVES THE ACS 1-4 IN STACK FROM P
;
	DEFINE	SAVE<
	PUSH	P,T1
	PUSH	P,T2
	PUSH	P,T3
	PUSH	P,T4>
;
; THIS MACRO RESTORES TOP FOUR ITEMS ON P STACK
;
	DEFINE	RESTOR<
	POP	P,T4
	POP	P,T3
	POP	P,T2
	POP	P,T1>
;THE W,X,Y,Z ARE CALCULATED BY THE MACRO LIKE THIS:

;W - THE NUMBERICAL VALUE OF VMAJOR
;
;X - THE LETTER CORRESPONDING TO THE VALUE OF VMINOR.  @=0, A=1...
;
;Y - THE NUMERICAL VALUE OF VEDIT
;
;Z - THE NUMERICAL VALUE OF VWHO

	DEFINE	.CLNAM<
	  DEFINE  .CLNM(LETTER,WHO)<
	    IRPC LETTER,<
	      IFE "A"-"'LETTER'"+VMINOR-1,<
		STOPI
		IFIDN <LETTER><@>,<
		  IFE VWHO,< .NAME(\VMAJOR,,\VEDIT,)>
		  IFN VWHO,< .NAME(\VMAJOR,,\VEDIT,-WHO)>>
		IFDIF <LETTER><@>,<
		  IFE VWHO,< .NAME(\VMAJOR,LETTER,\VEDIT,)>
		  IFN VWHO,< .NAME(\VMAJOR,LETTER,\VEDIT,-WHO)>>>>>
	IFGE VMINOR-^D26,< VMINOR==0
	  PRINTX %MINOR VERSION TOO LARGE - IGNORED>
	IFGE VWHO-7,< VMINOR== 
	  PRINTX %VWHO IS TOO LARGE - IGNORED>
	.CLNM(@ABCDEFGHIJKLMNOPQRSTUVWXYZ,\VWHO)
>

;DEFINE A .NAME MACRO TO GEN THE TEXT STRING

	DEFINE	.NAME(V,M,E,W)<
ASCIZ /V'M'('E')'W/>

VTXT:	.CLNAM			;GENERATE VERSION STRING
SUBTTL	MAIN ENTRY POINT AND INITIALIZATION

START:	RESET			;RESET THE UNIVERSE
	MOVE P,[IOWD PDLEN,PDL]	;SET UP STACK
	SETZM TAKFLG		;MARK THAT TAKE FILE NOT BEING PROCESSED
	MOVE	T1,[POINT 7,WRKBUF]	;POINT TO WHERE DATE AND TIME WILL GO
	MOVEI	T3,"["			;BRACKET THE TIME AND DATE
	IDPB	T3,T1
	MOVX	T3,OT%SCL		;AVOID LEADING SPACES
	HRROI	T2,-1			;CURRENT DATE AND TIME
	ODTIM
	SETZ	T3,
	HRROI	T2,[ASCIZ/      User Environment Test Package /]
	SOUT
;	HRROI	T2,VTXT		;NOW PUT VERSION NUMBER IN
;	SOUT
	HRROI	T2,[ASCIZ/]


/]
	SOUT
	HRROI	T1,WRKBUF	;POINT TO HEADER
	CALL	SNDMSG		;WRITE IT OUT
; ACTIVATE THE CHANNELS
	MOVEI	T1,.FHSLF	;ACTIVATE OUR CHANNELS
	MOVE	T2,[LEVTAB,,CHNTAB]	;CHANNEL TABLES
	SIR			;TELL SYSTEM ABOUT THEM
	EIR			;ENABLE THE CHANNEL SYSTEM
	CALL	ENAALL		;GO ENABLE ALL
	CALL	STSWCH		;START IPCF HANDLER FORK
	HALTF
	CALL	STPTYI		;GO START PTY I/O HANDLER
	JRST	 [HALTF
		 JRST	START]
	CALL	TSTBLD			;GO BUILD TABLE OF POSSIBLE TESTS
	JRST	[RITMSG<
?ERROR INITIALIZING THE TESTS
>
		HALTF]			;AND STOP
	CALL	ENWAKE			;TURN ON CTL/C TRAPPING
	JFCL
	CALL	ABRTIM			;GO START ABORT TIMER
	;..
SUBTTL	COMMAND PARSER AND DISPATCH

	;..

	HRROI T1,PROMPT		;GET POINTER TO PROMPT STRING
	MOVEM T1,CMDBLK+.CMRTY	;PUT RE-TYPE PROMPT POINTER IN STATE BLOCK
	HRROI T1,BUFFER		;GET POINTER TO INPUT TEXT BUFFER
	MOVEM T1,CMDBLK+.CMPTR	;SAVE POINTER TO COMMAND STRING
	MOVEM T1,CMDBLK+.CMBFP	;SAVE POINTER TO START-OF-BUFFER
	MOVE T1,[.PRIIN,,.PRIOU] ;GET PRIMARY INPUT,, OUTPUT JFN'S
	MOVEM T1,CMDBLK+.CMIOJ	;SAVE PRIMARY JFN'S
	MOVEI T1,PARSE1		;GET RE-PARSE ADDRESS
	MOVEM T1,CMDBLK+.CMFLG	;SAVE RE-PARSE ADDRESS
	SETZM CMDBLK+.CMINC	;INITIALIZE # OF CHARACTERS AFTER POINTER
	MOVEI T1,BUFSIZ*NCHPW	;GET # OF CHARACTERS IN BUFFER AREA
	MOVEM T1,CMDBLK+.CMCNT	;SAVE INITIAL # OF FREE CHARACTER POSITIONS
	HRROI T1,ATMBFR		;GET POINTER TO ATOM BUFFER
	MOVEM T1,CMDBLK+.CMABP	;SAVE POINTER TO LAST ATOM INPUT
	MOVEI T1,ATMSIZ*NCHPW	;GET # OF CHARACTERS IN ATOM BUFFER
	MOVEM T1,CMDBLK+.CMABC	;SAVE COUNT OF SPACE LEFT IN ATOM BUFFER
PARSE:	SKIPE	TAKFLG		;COMMANDS COMING FROM FILE?
	JRST	[HRRZ	T1,OUTJFN	;FIND OUT IF IT'S  DISK (THEN NO OUTPUT)
		 DVCHR
		 LDB	T2,[POINTR (2,DV%TYP)]	;ISOLATE DEVICE TYPE BITS
		 CAIN	T2,.DVTTY		;SKIP IF NOT TTY - I.E. DUPLICATE MSG
		 JRST	.+1			;NO NEED TO DUPLICATE
		 CALL	TSTCOL			;NOT EOF - SEE IF CR/LF NEEDED
		 HRROI	T1,PROMPT		;PUT PROMPT TO TERMINAL
		 PSOUT
		 JRST	.+1]			;RETURN TO MAIN LINE CODE
	HRROI T1,PROMPT		;GET POINTER TO PROGRAM'S PROMPT STRING
	CALL CMDINI		;OUTPUT THE PROMPT

PARSE1:	MOVE P,[IOWD PDLEN,PDL]	;SET UP STACK AGAIN
	MOVE	T1,[CZ%NIF+CZ%NSF+CZ%NCL+.FHSLF]	;CLEAR THIS
	CLZFF			; PPOCESSES EXTRA JFN'S
	ERJMP	.+1		;IGNORE CLZFF FAILERES
	CALL CLRGJF		;GO CLEAR GTJFN BLOCK

	MOVEI T1,GJFBLK		;GET ADDRESS OF GTJFN BLOCK
	MOVEM T1,CMDBLK+.CMGJB	;STORE POINTER TO GTJFN BLOCK
	MOVEI T1,CMDBLK		;GET POINTER TO COMMAND STATE BLOCK
	MOVEI T2,[FLDDB. (.CMKEY,,CMDTAB)] ;GET FUNCTION BLOCK
	COMND			;DO INITIAL PARSE
	 ERJMP [HRROI	T1,[ASCIZ/COMND JSYS ERRORS AT PARSE1:/]
		 JRST	CMDERR]		;error, go check for eof on take file
	TXNN T1,CM%NOP		;VALID COMMAND ENTERED ?
	JRST PARSE5		;YES, GO DISPATCH TO PROCESSING ROUTINE
	HRROI	T1,BUFFER	;GET READY TO PRINT COMMAND IF TAKING
	SKIPE	TAKFLG		;SKIP IF NOT TAKING
	CALL	SNDMSG		;TAKING - TYPE OUT COMMAND
	CALL TSTCOL		;TEST COLUMN POSITION, NEW LINE IF NEEDED
	RITMSG <? UETP: No such UETP command as ">
	MOVE T1,CMDBLK+.CMABP	;GET POINTER TO ATOM BUFFER
	CALL	SNDMSG		;OUTPUT STRING ENTERED BY USER
	RITMSG <"
>				;OUTPUT END-OF-MESSAGE
	JRST PARSE		;GO TRY TO GET A COMMAND AGAIN

PARSE5:	HRRZ T1,(T2)		;GET DISPATCH ADDRESS
	CALL (T1)		;PERFORM REQUESTED FUNCTION
	JRST PARSE		;GO PARSE NEXT COMMAND
			SUBTTL  ABORT (TEST) NAME/ALL /DEPTH:SUP/INT/MAX

.ABORT:	STKVAR	<ABRHLD>		;WHERE TO SAVE NAME OF TEST
	HRROI	T2,[ASCIZ/TEST/]	;TEST NAME
	CALL	SKPNOI			;PARSE THE NOISE
	RET
	CALL	ENABLD			;GO BUILD KEYWORD TABLE OF ENABLED TESTS
	MOVEI	T1,ENATBL		;TELL PARSKY WHERE KEYWORDS ARE
	CALL	PARSKY			;GO PARSE KEYWORDS
	RET				;ERROR RETURN - RETURN
	MOVE	P3,T2			;MOVE THE "ALL" OR KEYWORD INDICATOR
	MOVEM	T1,ABRHLD		;SAVE THE POINTER TO THE NAME
	MOVEI	T1,SWDEP		;PARSE /DEPTH ONLY
	CALL	PARSSW			;GET THE DEPTH TO ABORT
	RET
	HRRZ	T3,(T1)			;ADDRESS OF /CYCLE: VALUE
	HRRZ	T4,(T2)			;WHERE /DEPTH: VALUE IS STORED
	MOVE	T4,(T4)			;DEPTH VALUE
	MOVE	T2,ABRHLD		;NOW TO ABORT THE JOB
	MOVEI	P4,ENATBL		;POINT TO TABLE OF NAMES
	HLRZ	P5,(P4)			;LENGTH OF TABLE
	DMOVE	Q1,T1			;SAVE THE FIRST FOUR AC'S
	DMOVE	Q3,T3
	TXNE	P3,PR%ALL		;ARE WE DOING THIS FOR ALL THE TESTS
	SETOM	PRTOFF			;TURN OFF PRINTIN WHILE IN ABORT ALL
	TXNE	P3,PR%ALL		;ARE WE DOING THIS FOR ALL THE TESTS
	SETOM	ABRALL			;FLAG - WE LOOP THROUGH ALL TWICE (RACE
					; CONDITIONS.
	TXNE	P3,PR%ALL		;ARE WE DOING THIS FOR ALL THE TESTS
ABRNAM:	JRST	[CALL	ALLNMS		;YES - GO GET A NAME
		 JRST	[SKIPN	ABRALL	;SKIP IF FIRST TIME THRU
			 JRST	ABRRET	;NO MORE NAMES
			 SETZM	ABRALL	;CLEAR LOOP FLAG
			 MOVEI	T2,ENATBL	;START FROM SCRATCH
			 HLRZ	P5,0(P4)
			 JRST	ABRNAM]
		 MOVEM	Q1,T1		;RESTORE THE FIRST AC
		 DMOVEM	Q3,T3
		 JRST	.+1]		;GO DO THE SCHED ACTION
	TXNN	P3,PR%ALL		;SKIP IF  DOING AN ALL KEYWORD
	JRST	ABRGO			;GO DO THE DISABLE
	DMOVE	T3,Q3			;GET SWITCH VALUES
	MOVEI	T1,READ			;GO GET HIS TCB
	CALL	SCHED
	RET
	MOVE	T1,TCBSTA(T2)		;GET THE STATUS BITS
	DMOVE	T3,Q3			;GET SWITCH VALUES
	TXNE	T1,NT%END		;DON'T GET RID OF THESE
	JRST	ABRNAM			;DON'T DO THE DISABLE
ABRGO:	MOVEI	T1,ABORT		;FUNCTION CODE FOR SCHED
	CALL	SCHED			;GO ADD ENTRY TO TABLE
	JRST	ABRRET			;GO RETURN
	DMOVE	T1,Q1			;GET THE FIRST FOUR AC'S
	DMOVE	T3,Q3
	TXNE	P3,PR%ALL		;DID USER WANT 'ALL' EVENTS?
	JRST	ABRNAM			;YES
ABRRET:	CALL	TSTCOL			;PUT OUT CR/LF IF NEEDED
	SETZM	PRTOFF			;ALLOW PRINTING
	HRROI	T1,[ASCIZ/ABORT COMPLETED/]
	CALL	CONMSG			;GO SEND CONFIRMATION
	RET	
			SUBTTL BEGIN (UETP RUN AFTER) <HH:MM>
.BEGIN:	HRROI	T2,[ASCIZ/UETP RUN AFTER/]
	CALL	SKPNOI			;PARSE THE NOISE
	RET
	CALL	PARSTM			;GO PARSE TIME
	RET
	EXCH	T2,T1			;MOVE TIME TO PARAM REG
	JUMPN	T1,BEGTYP		;JUMP IF WE DIDN'T GET A TIME VALUE
	CALL	ENDCOM			;GO GET CONFIRMATION
	RET
BEGTYP:	MOVEI	T1,STARTM		;FUNCTION CODE TO START JOBS
	SETZM	BEGFLG			;ZERO JOBS STARTED FLAG
	CALL	SCHED			;GO START THE JOBS
	RET				;ERROR RETURN
	CALL	TSTCOL			;PUT OUT CR/LF IF NEEDED
	SKIPN	BEGFLG			;SKIP IF JOBS STARTED
	JRST	NOSTR			;NO JOBS STARTED
	HRROI	T1,[ASCIZ/BEGIN COMPLETED/]
	CALL	CONMSG			;GO SEND CONFIRMATION
	RET
NOSTR:	RITMSG <
%NO JOBS STARTED.
>
	RET
		SUBTTL		DEFAULTS - SET SWITCH DEFAULTS
.DEFAU:	HRROI	T2,[ASCIZ/VALUES FOR SWITCHES/]	;NOISE FIELD
	CALL	SKPNOI			;PARSE IT
	RET
	MOVEI	Q2,DEFCYC		;POINT TO DEFAULT CYCLE VALUE
	MOVEI	Q3,DEFDEP		;POINT TO DEFAULT DEPTH VALUE
	SETOM	CURENT			;TURN ON ALL BITS IN CURRENT JOB PTR
	MOVEI	T1,SWBOTH		;PARSE /CYCLE AND /DEPTH 
	CALL	PARSSW			;GO PARSE SWITCHES (/CYCLE,/DEPTH)
	RET				;ERROR - RETURN
	MOVE	T3,DEFCYC		;POINT TO DEFAULT VALUE POINTER
	EXCH	T3,(T1)			;EXCHANGE WITH NEW ONE (OR ITSELF)
	EXCH	T3,DEFCYC		;EXCHANGE AGAIN - FOR  NEW DEFAULT
	MOVE	T3,DEFDEP		;NOW DO THE SAME FOR DEPTH VALUE
	EXCH	T3,(T2)			;Q2&Q3 POINT TO DEFCYC,DEFDEP,TDEFCY, OR
	EXCH	T3,DEFDEP		; TDEFDP. THEREBY SWITCHING WITH BACK UP 
	RET
			SUBTTL  DISABLE (TEST) NAME /DEPTH:
.DISAB:	STKVAR	<SAVNAM>
	HRROI	T2,[ASCIZ/TEST/]	;NOISE FIELD
	CALL	SKPNOI			;PARSE IT
	RET
	CALL	ENABLD			;GO BUILD TABLE OF ENABLED TESTS
	MOVEI	T1,ENATBL		;TELL PARSKY WHERE KEYWORDS ARE
	CALL	PARSKY			;GO PARSE THE TEST TYPE
	RET
	MOVE	P3,T2			;MOVE THE "ALL" OR KEYWORD INDICATOR
	MOVEM	T1,SAVNAM		;SAVE THEN NAME
	MOVEI	T1,SWDEP		;PARSE /DEPTH ONLY
	CALL	PARSSW			;GO PARSE SWITCHES (,/DEPTH)
	RET				;ERROR - RETURN
	HRRZ	T3,(T1)			;ADDRESS OF /CYCLE: VALUE
	HRRZ	T4,(T2)			;WHERE /DEPTH: VALUE IS STORED
	MOVE	T4,(T4)			;DEPTH VALUE
	MOVE	T2,SAVNAM		;GET NAME OF TEST
	MOVEI	P4,ENATBL		;POINT TO TABLE OF NAMES
	HLRZ	P5,(P4)			;LENGTH OF TABLE
	DMOVE	Q1,T1			;SAVE THE FIRST FOUR AC'S
	DMOVE	Q3,T3
	TXNE	P3,PR%ALL		;ARE WE DOING THIS FOR ALL THE TESTS
DISNAM:	JRST	[CALL	ALLNMS		;YES - GO GET A NAME
		 JRST	DISRET		;NO MORE NAMES
		 MOVEM	Q1,T1		;RESTORE THE FIRST AC
		 DMOVEM	Q3,T3
		 JRST	.+1]		;GO DO THE SCHED ACTION
	TXNN	P3,PR%ALL		;SKIP IF  DOING AN ALL KEYWORD
	JRST	DISGO			;GO DO THE DISABLE
	DMOVE	T3,Q3			;GET SWITCH VALUES
	MOVEI	T1,READ			;GO GET HIS TCB
	CALL	SCHED
	RET
	MOVE	T1,TCBSTA(T2)		;GET THE STATUS BITS
	DMOVE	T3,Q3			;GET SWITCH VALUES
	TXNN	T1,NT%END+NT%ABR+NT%ENA	;GET RID OF THESE
	JRST	DISNAM			;DON'T DO THE DISABLE
DISGO:	MOVEI	T1,DELETE		;TELL SCHED IT'S A DELETE
	CALL	SCHED			;GO DELETE ENTRY TO TABLE
	RET
	DMOVE	T1,Q1			;GET THE FIRST FOUR AC'S
	DMOVE	T3,Q3
	TXNE	P3,PR%ALL		;DID USER WANT 'ALL' EVENTS?
	JRST	DISNAM			;YES
DISRET:	CALL	TSTCOL			;PUT OUT CR/LF IF NEEDED
	HRROI	T1,[ASCIZ/DISABLE COMPLETED/]
	CALL	CONMSG			;GO SEND CONFIRMATION
	RET	
			SUBTTL  ENABLE (TEST) NAME /CYCLE:/DEPTH:
.ENABL:	STKVAR	<HLDNAM>
	HRROI	T2,[ASCIZ/TEST/]	;NOISE FIELD
	CALL	SKPNOI			;PARSE IT
	RET
	MOVEI	T1,TSTTBL		;TELL PARSKY WHERE KEYWORDS ARE
	CALL	PARSKY			;GO PARSE THE TEST TYPE
	RET				;ERROR - RETURN
	MOVE	P3,T2			;MOVE THE "ALL" OR KEYWORD INDICATOR
	MOVEM	T1,HLDNAM		;SAVE THEN NAME
	MOVEI	T1,SWBOTH		;PARSE /CYCLE AND /DEPTH 
	CALL	PARSSW			;GO PARSE SWITCHES (/CYCLE,/DEPTH)
	RET				;ERROR - RETURN
	HRRZ	T3,(T1)			;ADDRESS OF /CYCLE: VALUE
	HRRZ	T4,(T2)			;WHERE /DEPTH: VALUE IS STORED
	MOVE	T4,(T4)			;DEPTH VALUE
	MOVE	T2,HLDNAM		;GET NAME OF TEST
	MOVEI	T1,CREATE		;TELL SCHED IT'S A CREATE
	MOVEI	P4,TSTTBL		;POINT TO TABLE OF NAMES
	HLRZ	P5,(P4)			;LENGTH OF TABLE
	DMOVE	Q1,T1			;SAVE THE FIRST FOUR AC'S
	DMOVE	Q3,T3
	TXNE	P3,PR%ALL		;ARE WE DOING THIS FOR ALL THE TESTS
MORNAM:	JRST	[CALL	ALLNMS		;YES - GO GET A NAME
		 JRST	ENARET		;NO MORE NAMES
		 MOVEM	Q1,T1		;RESTORE FIRST  AC
		 DMOVE	Q3,T3		;RESTORE T3 AND T4
		 JRST	.+1]		;GO DO THE SCHED ACTION
	CALL	SCHED			;GO ADD ENTRY TO TABLE
	JRST	[TXNN	P3,PR%ALL	;ARE WE DOING THIS FOR ALL THE TESTS
		 RET			;RETURN ON ERRORS IF ONLY NOT 'ALL'
		 JRST	.+1]		;GO DO THE SCHED ACTION
	DMOVE	T1,Q1			;GET THE FIRST FOUR AC'S
	DMOVE	T3,Q3
	TXNE	P3,PR%ALL		;DID USER WANT 'ALL' EVENTS?
	JRST	MORNAM			;YES
ENARET:	CALL	TSTCOL			;PUT OUT CR/LF IF NEEDED
	HRROI	T1,[ASCIZ/ENABLE COMPLETED/]
	CALL	CONMSG			;GO SEND CONFIRMATION
	RET	
			SUBTTL  EXIT (TO MONITOR)

.EXIT:	HRROI T2,[ASCIZ/TO MONITOR/] ;GET NOISE PHRASE
	CALL SKPNOI		;GO PARSE NOISE FIELD
	 RET			;FAILED, RETURN FAILURE
	CALL ENDCOM		;GO PARSE END OF COMMAND
	 RET			;BAD CONFIRMATION, RETURN

;FIRST SEE IF ANYTHING IS RUNNING
	HRROI	T2,-1			;TELL SCHED WE WANT HIS FIRST NAME
EXTLOP:	MOVEI	T1,READ			;WE WANT TO READ THE TABLE
	CALL	SCHED			;GO GET NEXT ENABLED NAME
	JRST	DOEXIT			;GO TAKE ERROR EXIT
	TXNE	T3,SC%EOT		;ARE WE AT END OF TABLE
	JRST	DOEXIT			;GO TAKE NORMAL EXIT
	MOVE	T2,T1			;PLACE IN BASE FOR FUTURE USE
	MOVE	T3,TCBSTA(T2)		;GET THE STATUS VECTOR
	TXNN	T3,NT%RUN+NT%QUE	;IS THIS TEST ACTIVE
	JRST	EXTLOP			;NO - THEN KEEP LOOKING
	RITMSG <
%YOU STILL HAVE TESTS RUNNING. "ABORT ALL" BEFORE EXITING.
>
	RET				;GO PARSE COMMANDS
DOEXIT:	CALL	EXIT		;GO EXIT
	HALTF
	JRST	START
SUBTTL	HELP  COMMANDS

; HELP COMMAND

.HELP:	HRROI T2,[ASCIZ/WITH UETP/] ;GET NOISE WORDS
	CALL SKPNOI		;GO PARSE NOISE FIELD
	 RET			;FAILED, RETURN FAILURE
	CALL ENDCOM		;GO PARSE END OF COMMAND
	 RET			;BAD CONFIRMATION, RETURN
	HRROI T1,HLPMSG		;GET POINTER TO HELP MESSAGE
	CALL	SNDMSG		;OUTPUT HELP MESSAGE
	RET			;GO PARSE NEXT COMMAND
			SUBTTL  MODIFY (TEST) NAME /DEPTH: (TO) /DEPTH;/CYCLE:
.MODIF:	STKVAR <MODSAV>
	HRROI	T2,[ASCIZ/TEST/]	;NOISE FIELD
	CALL	SKPNOI			;PARSE IT
	RET
	CALL	ENABLD			;GO BUILD TABLE OF POSSIBLE TESTS
	MOVEI	T1,ENATBL		;TELL PARSKY WHERE KEYWORDS ARE
	CALL	PARSKY			;GO PARSE THE TEST TYPE
	RET
	MOVE	P3,T2			;MOVE THE "ALL" OR KEYWORD INDICATOR
	MOVEM	T1,MODSAV		;SAVE THEN NAME
	HRROI	T1,SWDEP		;GO GET DEPTH TO CHANGE
	CALL	PARSSW			;PARSE THE /DEPTH SWITCH
	RET
	HRRZ	P2,(T2)			;WHERE /DEPTH: VALUE IS STORED
	MOVE	P2,(P2)			;DEPTH VALUE
	HRROI	T2,[ASCIZ/TO/]		;NOISE FIELD
	CALL	SKPNOI
	RET
	MOVEI	Q1,DEFCYC		;NEED TO KNOW WHAT VALUES WERE ENTERED
	MOVEI	Q2,DEFDEP		;WHERE /DEPTH: VALUE IS STORED
	MOVEI	T1,SWBOTH		;PARSE /DEPTH OR /CYCLE
	CALL	PARSSW			;GO PARSE SWITCHES (/CYCLE,/DEPTH)
	RET				;ERROR - RETURN
	HRRZ	T3,(T1)			;GET NEW /CYCLE VALUE
	CAMN	T1,Q1			;SKIP IF NEW VALUE ENTERED
	SETZM	T3			;NO NEW VALUE - DON'T CHANGE CYCLE
	MOVE	Q1,T3			;SET THE SWITCH VALUE
	HRRZ	T3,(T2)			;WHERE /DEPTH: VALUE IS STORED
	MOVE	T3,(T3)			;GET THE DEPTH VALUE
	CAMN	T2,Q2			;SKIP IF NEW VALUE ENTERED
	SETZM	T3			;NO NEW VALUE - DON'T CHANGE DEPTH
	MOVE	Q2,T3			;SET THE SWITCH VALUE
	MOVEI	P4,ENATBL		;POINT TO TABLE OF NAMES
	HLRZ	P5,(P4)			;LENGTH OF TABLE
	; ...
	;...
MODLOP:	TXNE	P3,PR%ALL		;ARE WE MODIFYING ALL TESTS
	JRST	[MOVE	T4,P2		;GET THE DEPTH VALUE
		 CALL	ALLNMS		;GO GET NEXT NAME
		 JRST	MODRET		;ALL DONE - RETURN
		 MOVEM	T2,MODSAV	;SET-UP THE NEW NAME
		 JUMPE	Q2,.+1		;JUMP IF DEPTH NOT CHANGING
		 TLNN	T2,(Q2)		;IS NEW DEPTH LEGAL?
		 JRST	MODLOP		;NO - KEEP LOOKING
		 JRST	.+1]
	DMOVE	T3,Q1			;GET SWITCH VALUES
	MOVE	T2,MODSAV		;GO SEE IF DEPTH IS ENABLED
	MOVEI	T1,READ			;GO GET HIS TCB
	CALL	SCHED
	RET
	TDNE	P2,TCBSTA(T2)		;SEE IF HE IS ENABLED FOR GIVEN DEPTH
	JRST	GOMOD			;YES - THEN GO MODIFY HIM
	TXNE	P3,PR%ALL		;SKIP IF NOT DOING AN ALL KEYWORD
	JRST	MODLOP			;KEEP MODIFYING ALL THE ENTRIES
	RITMSG <
?TEST NOT ENABLED FOR SPECIFIED DEPTH.
>
	RET
GOMOD:	DMOVE	T3,Q1			;MOVE PARMS INTO PARM REGS
	MOVE	T2,MODSAV		;GET NAME OF TEST
	MOVEI	T1,MODIFY		;TELL SCHED IT'S A MODIFY
	CALL	SCHED			;GO ADD ENTRY TO TABLE
	RET				;ERROR RETURN
MODCON:	TXNE	P3,PR%ALL		;SKIP IF NOT DOING AN ALL KEYWORD
	JRST	MODLOP			;KEEP MODIFYING ALL THE ENTRIES
MODRET:	CALL	TSTCOL			;PUT OUT CR/LF IF NEEDED
	HRROI	T1,[ASCIZ/MODIFY COMPLETED/]
	CALL	CONMSG			;GO SEND CONFIRMATION
	RET
;ROUTINE TO PUSH DOWN TO A LOWER EXEC

.PUSH:	HRROI	T2,[ASCIZ/TO EXEC LEVEL/]
	CALL	SKPNOI		;PARSE THE NOISE FIELD
	 RET
	CALL	ENDCOM		;GO PARSE CONFIRMATION
	 RET
	MOVSI	T1,(1B2!1B17)	;GET A JFN FOR THE EXEC
	HRROI	T2,[ASCIZ/SYSTEM:EXEC.EXE/]
	GTJFN
	  JRST	NOEXEC		;NO EXEC FOUND
	PUSH	P,T1
	MOVSI	T1,(1B1)	;CREATE A LOWER FORK FOR EXEC
	CFORK
	  JRST	NOFORK
	HRLZS	T1
	HRR	T1,0(P)
	GET			;NOW GET THE EXEC INTO THE LOWER FORK
	HLRZS	T1
	PUSH	P,T1		;SAVE LOWER FORK NUMBER
	MOVEI	T1,.FHSLF	;DONT ALLOW LOWER FORK TO LOG OUT
	RPCAP
	TXZ	T2,SC%LOG
	SETZ	T3,		;NO PRIVS ENABLED
	MOVE	T1,0(P)		;GET LOWER FORK HANDLE
	EPCAP			;SET ITS CAPABILITIES
	SETO	T1,		;REMEMBER OUR NAME TO RESTORE IT LATER
	MOVE	T2,[-2,,NAMES]	;GET BOTH NAMES	
	MOVEI	T3,.JISNM
	GETJI
	  JFCL
	MOVEI	T1,.FHSLF	;TURN OFF PANIC CHANNEL
	MOVX	T2,1B<ICHIFT-ICH000>
	DIC
	POP	P,T1		;GET BACK FORK NUMBER
	SETZ	T2,
	SETOM	PUSHF		;MARK THAT WE ARE PUSHED DOWN
	SETOM	PRTOFF		;NO PRINTING WHILE IN EXEC
	SFRKV			;START THE EXEC
	WFORK			;AND WAIT FOR IT TO HALT
	SETZM	PRTOFF		;CONTINUE PRINTING
	SETZM	PUSHF		;OUT OF EXEC
	KFORK			;KILL THE LOWER FORK
	MOVEI	T1,.FHSLF	;TURN OFF PANIC CHANNEL
	MOVX	T2,1B<ICHIFT-ICH000>
	AIC
PUSHE1:	DMOVE	T1,NAMES
	SETSN			;RESTORE NAME OF PROGRAM
	  JFCL
	POP	P,T1			;GET BACK JFN OF EXEC
	RLJFN			;RELEASE JFN
	  JFCL
	RET
NOEXEC:	RITMSG <
?NO EXEC - CAN'T DO A PUSH FOR YOU.
>
	RET

NOFORK:	RITMSG<
?NO LOWER FORKS AVAILABLE.
>
	RET
			SUBTTL  STATUS (INFORMATION)

.STATU:	HRROI	T2,[ASCIZ/INFORMATION/]
	CALL	SKPNOI			;GO PARSE NOISE
	RET				;ERROR - RETURN
	CALL	ENDCOM			;PARSE CR/LF
	RET				;ERROR - RETURN 
	CALL	STATUS			;GO DO STATUS STUFF
	RET
	RET
SUBTTL	TAKE (COMMANDS FROM) FILE-SPEC (LOGGING OUTPUT ON) FILE-SPEC

.TAKE:	HRROI T2,[ASCIZ/COMMANDS FROM/] ;GET NOISE TEXT
	CALL SKPNOI		;GO PARSE NOISE FIELD
	 RET			;FAILED, RETURN FAILURE
	CALL CLRGJF		;GO CLEAR GTJFN BLOCK
	MOVX T1,GJ%OLD		;GET EXISTING FILE FLAG
	MOVEM T1,GJFBLK+.GJGEN	;STORE GTJFN FLAGS
	HRROI T1,[ASCIZ/CMD/]	;GET DEFAULT FILE TYPE FIELD
	MOVEM T1,GJFBLK+.GJEXT	;STORE DEFAULT EXTENSION
	MOVEI T1,CMDBLK		;GET ADDRESS OF COMMAND STATE BLOCK
	MOVEI T2,[FLDDB. (.CMFIL)] ;GET FUNCTION DESCRIPTOR BLOCK ADDRESS
	COMND			;PARSE INPUT FILE SPEC
	 ERJMP [HRROI	T1,[ASCIZ/COMND JSYS ERRORS AT TAKE10:/]
		 JRST	CMDERR]		;error, go check for eof on take file
	TXNN T1,CM%NOP		;PARSED FILE-SPEC OK ?
	JRST TAKE10		;YES, GO ON AND SAVE INPUT JFN
	HRROI	T1,BUFFER	;GET READY TO PRINT COMMAND IF TAKING
	SKIPE	TAKFLG		;SKIP IF NOT TAKING
	CALL	SNDMSG		;TAKING - TYPE OUT COMMAND
	CALL TSTCOL		;ISSUE NEW LINE IF NEEDED
	RITMSG <? UETP: Invalid file specification, >
	CALLRET PUTERR		;OUTPUT ERROR STRING TO TERMINAL

; HERE ON A GOOD INPUT FILE SPEC

TAKE10:	MOVEM T2,INJFN		;SAVE INPUT JFN FOR COMMANDS
	HRROI T2,[ASCIZ/LOGGING OUTPUT ON/] ;GET NOISE TEXT
	CALL SKPNOI		;GO PARSE NOISE FIELD
	 RET			;FAILED, RETURN FAILURE
	CALL CLRGJF		;GO CLEAR GTJFN BLOCK USED BY COMND JSYS
	MOVX T1,GJ%FOU		;GET FLAG SAYING FILEIS FOR OUTPUT USE
	MOVEM T1,GJFBLK+.GJGEN	;SAVE GTJFN FLAGS
	SETZM NAMBUF		;INITIALIZE FILENAME BUFFER
	HRROI T1,NAMBUF		;GET POINTER TO WHERE FILENAME IS TO GO
	MOVE T2,INJFN		;GET INPUT JFN
	MOVX T3,<FLD(.JSAOF,JS%NAM)> ;GET FLAG BITS SAYING OUTPUT NAME ONLY
	JFNS			;GET FILE NAME OF INPUT FILE
	SKIPE NAMBUF		;ANY FILENAME ?
	HRROI T1,NAMBUF		;YES, GET A POINTER TO THE FILE NAME FOR INPUT
	MOVEM T1,GJFBLK+.GJNAM	;STORE DEFAULT NAME OF OUTPUT FILE
	HRROI T1,[ASCIZ/LOG/]	;GET DEFAULT FILE TYPE OF OUTPUT FILE
	MOVEM T1,GJFBLK+.GJEXT	;STORE DEFAULT EXTENSION
	MOVEI T1,CMDBLK		;GET ADDRESS OF COMMAND STATE BLOCK
	MOVEI T2,[FLDDB. (.CMFIL)] ;GET FILE-SPEC FUNCTION BLOCK ADDRESS
	COMND			;PARSE OUTPUT FILE SPEC
	 ERJMP [HRROI	T1,[ASCIZ/COMND JSYS ERRORS AT TAKE20:/]
		 JRST	CMDERR]		;error, go check for eof on take file
	TXNN T1,CM%NOP		;FILE SPEC PARSED OK ?
	JRST TAKE20		;YES, GO ON TO SAVE JFN
	; ...
	;...
	HRROI	T1,BUFFER	;GET READY TO PRINT COMMAND IF TAKING
	SKIPE	TAKFLG		;SKIP IF NOT TAKING
	CALL	SNDMSG		;TAKING - TYPE OUT COMMAND
	CALL TSTCOL		;NO, ISSUE NEW LINE IF NEEDED
	RITMSG <? UETP: Invalid file specification, >
	CALLRET PUTERR		;GO OUTPUT CORRECT MESSAGE AND RETURN

; HERE TO SAVE OUTPUT JFN AND GET COMMAND CONFIRMATION

TAKE20:	MOVEM T2,OUTJFN		;SAVE LOGGIN FILE JFN
	CALL ENDCOM		;GO PARSE COMMAND CONFIRMATION
	 RET			;RETURN, BAD CONFIRMATION

; OPEN INPUT AND OUTPUT FILES

	MOVE T1,INJFN		;GET INPUT JFN
	MOVE T2,[7B5+OF%RD]	;7 BIT BYTES, READ ACCESS
	OPENF			;OPEN INPUT FILE
	 JRST [	CALL TSTCOL	;ERROR, ISSUE NEW LINE IF NEEDED
		RITMSG <? UETP: Cannot OPEN command file, >
		CALLRET PUTERR]	;GO ISSUE REST OF MESSAGE AND RETURN

	MOVE T1,OUTJFN		;GET OUTPUT JFN
	CAIN T1,.PRIOU		;STILL PRIMARY OUTPUT JFN ?
	JRST TAKE30		;NO OUTPUT JFN, GO ON
	MOVE T2,[7B5+OF%WR]	;7 BIT BYTES, WRITE ACCESS
	OPENF			;OPEN OUTPUT FILE
	 JRST [	CALL TSTCOL	;ERROR, ISSUE NEW LINE IF NEEDED
		MOVE T1,INJFN	;GET INPUT JFN AGAIN
		CLOSF		;CLOSE INPUT FILE
		 JFCL		;IGNORE ERRORS HERE
		RITMSG <? UETP: cannot OPEN logging file, >
		CALLRET PUTERR]	;GO OUTPUT REST OF MESSAGE

; NOW SAVE NEW JFN'S AND RETURN TO PARSER

TAKE30:	HRLZ T1,INJFN		;GET INPUT JFN
	HRR T1,OUTJFN		;GET OUTPUT JFN
	MOVEM T1,CMDBLK+.CMIOJ	;SAVE NEW JFN'S
	SETOM TAKFLG		;MARK THAT COMMANDS ARE COMING FROM FILE
	HRRZ	T1,OUTJFN	;GET OUTPUT JFN
	HRROI	T2,BUFFER	;POINT TO COMMAND BUFFER
	SETZ	T3,		;WRITE WHOLE ASCIZ STRING
	SETZ	T4,
	SOUT			;WRITE TAKE COMMAND INTO THE LOG FILE
	RET			;RETURN TO PARSER
		SUBTTL		WAIT - COMMAND TO WAIT N SECONDS
;
; THIS COMMAND IS IMPLEMENTED TO BE ABLE TO RUN UETP UNDER BATCH.
; IT SIMPLY DOES A DISMS FOR HHH:MM SO THAT BATCH WON'T KICK US OFF
; IT OPTIONALY CAN EXECUTE A STATUS COMMAND WHILE IN THE SLEEP CYCLE.

.WAIT:	HRROI	T2,[ASCIZ/FOR HHH:MM/]
	CALL	SKPNOI			;GO PARSE THE NOISE FIELD
	 RET				;ERROR RETURN
	CALL	PARSHR			;GO PARSE TIME QUANTITY HHH:MM
	RET
	SKIPE	T2			;SKIP IF WE GOT A TIME VALUE
	RET				;GOT CR/LF - JUST RETURN
	MOVE	Q1,T1			;SAVE THE WAIT TIME
	HRROI	T2,[ASCIZ/WITH STATUS EVERY/]
	CALL	SKPNOI			;GO PARSE THE NOISE
	RET
	CALL	PARSHR			;GO PARSE STATUS INTERVAL
	RET
	SKIPN	T2			;SKIP IF WE DIDN'T GET CR/LF (GOT TIME)
	JRST	DOWAIT			;GOT FIRST FDB - STATUS TIME
	SETOM	INWAIT			;FOR CTL/C CODE
	MOVE	T1,Q1			;NO STATUS JUST STRAIGHT WAITING
	DISMS				;NO STATUS - JUST WAIT
	SETZM	INWAIT			;TURN OFF CTL/C CHECKING
	RET				;RETURN TO CALLER
DOWAIT:	MOVE	Q2,T1			;SAVE STATUS INTERVAL
	CAMLE	Q1,Q2			;WAIT MUST BE LARGER THAN STATUS INTERVAL
	JRST	GOWAIT			;WAIT OK GO DO THE WAITING  LOOP
	RITMSG	<
?WAIT INTERVAL MUST BE LARGER THAN STATUS INTERVAL.
>
	RET
GOWAIT:	SETOM	INWAIT			;FOR CTL/C CODE
	MOVE	T1,Q2			;WAIT FOR THE STATUS INTERVAL
	DISMS
	SETZM	INWAIT			;TURN OFF CTL/C CHECKING
	CALL	STATUS			;GO DO THE STATUS
	 RET				;ERROR - RETURN
	SUB	Q1,Q2			;SUBTRACT INTERVAL WAITED FROM
	JUMPG	Q1,GOWAIT		;RET
	RET				;AND NOW RETURN
		SUBTTL	ABRTIM - ROUTINE TO END /CYCLE:HHH:MM TYPES JOBS
;
; THIS ROUTINE USES TIMER JSYS TO GET A TIMER INTERVAL EVERY MINUTE.  ON 
; INTERRUPT IT LOOKS AT ALL JOBS FOR A NT%TYM JOB THAT HAS OVER RUN IT'S
; TCBMAX TIME.  THOSE TYPES OF JOBS WILL BE STOPPED.
;
ABRTIM:	MOVE	T1,[.FHSLF,,1]		;INTERRUPT OURSELVES 
	MOVEI	T2,^D60000		;        AFTER ONE MINUTE
	MOVEI	T3,^D23			;		ON CHANNEL 23
	TIMER
	 JRST	[RITMSG<
%YOU ARE NOT ON RELEASE 3. JOBS WITH /CYCLE:HHH:MM WILL END ONLY IF THEY
  RETURN CONTORL TO UETP.
>
		 RET]
	RET
TIMTIC:	SAVE				;HERE ON INTERRUPT
	GTAD				;GET THE TIME FOR COMPARISONS
	MOVE	T4,T1			;SAVE FOR LATER COMPARISONS
	HRROI	T2,-1			;START READING FROM THE START
TIMLOP:	MOVEI	T1,READ			;GO READ A TCB
	CALL	SCHED
	JRST	TIMRET			;SCHED HAD PROBLEMS - GET OUT 
	TXNE	T3,SC%EOT		;DID WE READ ALL OF THEM
	JRST	TIMRET			;YES - GET OUT
	MOVE	T2,T1			;MOVE ADDRESS OF TCB
	MOVE	T1,TCBSTA(T2)		;GET THE STATUS VECTOR
	TXNN	T1,NT%TYM		;IS THIS JOB OF FORM /CYCLE:HHH:MM
	JRST	TIMLOP			;NO - KEEP LOOKING
	TXNN	T1,NT%RUN+NT%QUE	;ONLY CONSIDER RUNNING OR QUEUED JOBS
	JRST	TIMLOP			;NEITHER - KEEP LOOKING
	MOVE	T1,TCBMAX(T2)		;GET MAX RUN TIME
	ADD	T1,TCBTYM(T2)		;ADD TO HIS START TIME
	CAMGE	T4,T1			;HAS HIS PROJECTED END TIME PASSED
	JRST	TIMLOP			;NO - KEEP LOOKING
	TXNE	T1,NT%RUN		;SKIP IF JOB IS QUEUED
	AOS	TCBRUN(T2)		;BUMP RUN COUNT
	MOVEI	T1,ABORT		;GO KILL THE JOB
	PUSH	P,T2			;SAVE THE TCB ADDRESS
	CALL	SCHED
	JRST	TIMRET			;SCHED PROBLEMS - GET OUT
	POP	P,T2			;GET BACK THE TCB ADDRESS
	MOVE	T1,TCBSTA(T2)		;RESET ABORTED FLAG
	TXZ	T1,NT%ABR
	IORX	T1,NT%END		;TO ENDED
	MOVEM	T1,TCBSTA(T2)		;SAVE STATUS VECTOR
	JRST	TIMLOP			;DONE WITH HIM - KEEP LOOKING
TIMRET:	CALL	ABRTIM
	RESTOR
	DEBRK
		SUBTTL		ALLNMS - ROUTINE TO PICK NEXT NAME OF TBLUK TABLE
;
;ACCEPTS:	P4/ADDRESS OF TABLE
;		P5/MAX LENGTH OF TABLE
;
;RETURNS:	T2/NEXT ENTRY IN TABLE
;		P4/UPDATED TO POINT TO NEXT ENTRY
;		P5/DECREMENTED MAX COUNT
ALLNMS:	SAVEAC	<T3,T4>
ALLOOP:	SOJL	P5,ALLEOT		;ARE WE THRU
	AOJ	P4,			;POINT TO NEXT TABLE ENTRY
	HRRZ	T1,(P4)			;GET THE ENABLED ENTRY
	HLRO	T2,(P4)			;POINTER FOR NEXT ENTRY
	TDNN	T1,T4			;T4 HAS REQUEST - SKIP IF IT'S OFF
	JRST	ALLOOP			;KEEP LOOKING
	MOVEI	T1,READ			;GO GET TCB TO FIND CURRENT STATE
	CALL	SCHED			;TCB HANDLING ROUTINE
	RET
	MOVE	T1,TCBSTA(T2)		;NO - THEN GET ENTRIES STATUS
	MOVS	T2,(P4)			;POINTER FOR NEXT ENTRY
	RETSKP				;NORMAL RETURN
ALLEOT:	RET				;EOT RETURN
	
	SUBTTL SUBAOK		- ROUTINE TO ACCEPT SHIPPR'S RUNNING OK MSG
;
; IT BUMPS THE PC BY ONE AND DEBRAKES
;
SUBAOK:	SAVE
	AOS	RETPC1			;BUMP TO GET OUT OF THE WAIT
	MOVE	T1,[3,,PANIC]		;RESTORE INFERIOR DYING CHANNEL
	MOVEM	T1,ICHIFT		;SAVE
	RESTOR
	DEBRK

SUBERR:	HALTF
			SUBTTL  BOSTAK - ROUTINE TO TAKE UETP MSG'S FROM SWITCH

BOSTAK:	SAVE
	CALL	SNDTTY		;GO SEND MESSAGE TO LOGS IF NEEDED
	HRROI	T2,TNAME	;POINT TO NAME OF TEST SENDING MSG (FOR SCHED:)
	MOVE	T1,DEFTYP	;GET TYPE OF MESSAGE FIELD
	CAME	T1,[ASCII/START/]	;IS IT A START MSG
	JRST	TRYEND		;NO - TRY AN 'END' MSG
	MOVEI	T1,STRMSG	;SIGNAL SCHED THAT A JOB STARTED
	CALL	SCHED
	JRST	BSOUT		;EXIT
	JRST	BSOUT		;EXIT
TRYEND:	CAME	T1,[ASCII/END  /]	;WAS IT AN END MESSAGE
	JRST	TRYERR		;NO - TRY ERROR MESSAGES
	MOVEI	T1,ENDMSG	;SIGNAL END MESSAGE TO SCHED
	CALL	SCHED
	JRST	BSOUT		;EXIT
	JRST	BSOUT		;GO EXIT
TRYERR:	CAME	T1,[ASCII/ERROR/]	;IS IT AN ERROR MESSAGE
	JRST	BSOUT		;NO - GO EXIT
	MOVEI	T1,ERRMSG	;TELL SCHED JOB GOT AN ERROR
	CALL	SCHED		;GO HANDLE ERROR MESSAGES
	JFCL			;EVEN ON ERRORS WE NOTIFY INFERIOR
BSOUT:	MOVX	T2,<1B25>	;TELL SWITCH WE ARE DONE WITH MESSAGE
	MOVE	T1,SWHNDL	;SWITCHES HANDLE
	IIC
	RESTOR
	DEBRK
	RESTOR			;RESTOR THE REGS
	SUBTTL  BLKFIL	- ROUTINE TO REPLACE NULLS IN BUFFER WITH BLANKS

BLKFIL:	SAVEAC <T1,T2,T3,T4>
	MOVE	T1,[POINT 7,BASERC]	;START OF BUFFER AREA TO FILL
	MOVE	T2,[POINT 7,MSGREC]	;ENDING ADDRESS
	IBP	T2			;FIX-UP MACRO'S STRANGE SET-UP
	MOVEI	T3," "			;FILL WITH BLANKS
BLKLOP:	ILDB	T4,T1			;BUMP AND LOAD NEXT BYTE
	CAMN	T1,T2			;ARE WE AT END OF TABLE?
	RET				;YES - THEN RETURN
	SKIPN	T4			;KEEP LOOPING IF NOT ZERO
	DPB	T3,T1			;REPLACE ZERO WITH BLANK
	JRST	BLKLOP			;KEEP FILLING
		SUBTTL		CONMSG - TYPE THE CONFIRMATION MESSAGES
;
;ACCEPTS:	T1/POINTER TO THE CONFIRMATION MESSAGE
;RETURNS	+1,ALWAYS
;
CONMSG:	SAVEAC	<T1,T2,T3,T4>
	MOVE	T4,T1			;SAVE THE MESSAGE POINTER
	MOVE	T3,[ASCII/     /]	;PUT LEADING SPACE IN
	MOVEM	T3,WRKBUF		;BLANK OUT FIRST WORD
	MOVE	T1,[POINT 7,WRKBUF,6]	;WHERE MSG IS BEING BUILT
	HRROI	T2,-1			;CURRENT TIME ONLY
	MOVX	T3,OT%NDA+OT%SCL		;ONLY TIME - NO LEADING SPACES
	ODTIM
	MOVEI	T3," "				;SPACE BETWEEN TIME AND MSG
	IDPB	T3,T1
	MOVEI	T3,"["				;NOW BRACKET THE MESSAGE
	IDPB	T3,T1				;INTO WORK BUFFER
	SETZ	T3,				;WRITE WHOLE RECORD
	MOVE	T2,T4				;GET THE MESSAGE
	SOUT					;INTO THE BUFFER
	 ERJMP	[ERRSND<ERROR WITH SOUT AT CONMSG:>
		 RET]
	MOVEI	T3,"]"				;BRACKET END OF MESSAGE
	IDPB	T3,T1
	SETZ	T3,				;MAKE SURE A NULL IS AT THE END
	IDPB	T3,T1
	HRROI	T1,WRKBUF			;POINT TO MSG
	CALL	SNDMSG				;SEND THE MESSAGE
	RITMSG <
>						;AND SEND CR/LF
	RET
		SUBTTL		DIWAKE - DISABLE WAKE ROUTINE
;  THIS ROUTINE TURNS OFF THE CTL/C INTERRUPT FOR WAIT COMMAND
;RETURNS:	+1,ERRORS
;		+2,OTHERWISE
DIWAKE:	MOVEI	T1,.TICCC			;DISABLE CTL/C ON CHANNEL 35
	DTI
	 ERJMP	[ERRSND<ERROR WITH DTI JSYS AT DIWAKE:>
		 RET]
	MOVEI	T1,.FHSLF			;DISABLE OUT CHANNEL 35
	MOVE	T2,[1B35]			; TO NOT ACCEPT THE ASSIGNED CTL/C
	DIC
	 ERJMP	[ERRSND<ERROR WITH DIC JSYS IN DIWAKE:>
		 RET]
	RETSKP
		SUBTTL  ENAALL - ENABLE ALL THE CHANNELS
;RETURNS	+1,ALWAYS
ENAALL:	SAVEAC	<T1,T2>
	MOVEI	T1,.FHSLF	;ACTIVATE OUR CHANNELS
	MOVE	T2,[1B19!1B23!1B24!1B26!1B27!1B33!1B34]
	AIC			;ACTIVATE THEM
	RET
		SUBTTL ENABLD - BUILD TBLUK TYPE TABLE OF ENABLED TESTS
;
;ACCEPTS:	NO ARGUMENTS
;RETURNS:	NO ARGUMENTS
;
ENABLD:	SETZ	T1,			;RESET THE TABLE
	HLLM	T1,ENATBL		;ENATBL IS THE TBLUK TYPE TABLE
	HRROI	T2,-1			;INDICATES TO SCHED TO READ FIRST ONE
ENLOOP:	MOVEI	T1,READ			;FUNCTION CODE FOR SCHED - READ ENABLED
	CALL	SCHED			; TEST OFF MASTER TABLE
	RET
	TXNE	T3,SC%EOT		;END OF TABLE?
	RET				;YES
	MOVE	T4,T1			;SAVE TABLE POINTER FOR LOOP
	MOVEI	T1,ENATBL		;POINT TO TBLUK TYPE TABLE
	MOVE	T2,TCBDEP(T4)		;GET THE STATUS BITS AVAILABLE
	HRLI	T2,TCBNAM(T4)		;POINT TO TEST NAME
	TBADD				;GO ADD TO TABLE
	 ERJMP	[ERRSND <DUPLICATE ENTRIES IN SCHED'S TABLE. AT ENLOOP:>
		 RET]
	MOVE	T2,T4			;INDICATE TO SCHED WHICH ONE WE READ
	JRST	ENLOOP			;KEEP READING
		SUBTTL		ENWAKE - ENABLE THE CTL/C WAKE FEATURE FOR .WAIT
;
;RETURNS:	+1,ERROR
;		+2,OTHERWISE
ENWAKE:	HRROI	T1,-1				;CAN'T ENABLE CTL/C IF UNDER BATCH
	HRROI	T2,3				;BATCH WORD INTO AC3 ONLY
	MOVX	T3,.JIBAT			;THIS WORD WILL TELL US
	GETJI					;IF WE ARE UNDER BATCH
	 ERJMP	[ERRSND<ERROR WITH GETJI AT ENWAKE:>
		 RET]
	SKIPE	T3				;SKIP IF NOT UNDER BATCH
	RETSKP					;UNDER BATCH - FORGET CTL/C STUFF
	MOVEI	T1,.FHSLF			;FIRST ENABLE CTL/C CAPABLITIES
	MOVX	T3,SC%CTC
	EPCAP					;GO ENABLE THE CTL/C CAPABILITIES
	 ERJMP	[ERRSND<ERROR WITH EPCAP JSYS AT ENWAKE:>
		 RET]
	MOVE	T1,[.TICCC,,<ICH035-CHNTAB>]	;TAKE CTL/C ON CHANNEL 35
	ATI
	MOVEI	T1,.FHSLF			;ENABLE OUT CHANNEL 35
	MOVE	T2,[1B35]			; TO ACCEPT THE ASSIGNED CTL/C
	AIC
	 ERJMP	[ERRSND<ERROR WITH AIC JSYS IN ENWAKE:>
		 RET]
	RETSKP
;
;HERE IF CTL/C WHILE IN SLEEP ROUTINE

WAKEUP:	SKIPN	INWAIT				;SKIP IF IN COMMAND WAIT
	JRST	TRYEXC				;NO - TRY EXEC LEVEL
	SETZM	INWAIT				;TURN OFF CTL/C CHECKING
CTLRET:	MOVEI	T1,PARSE			;WE WILL RETURN PROCESS TO PARSE:
	HLL	T1,RETPC3			;ADD PC BITS
	MOVEM	T1,RETPC3			;SET-UP THE NEW RETURN FOR DEBRK
	DEBRK
TRYEXC:	RITMSG<
%TO GET TO EXEC LEVEL USE PUSH COMMAND.  TO EXIT PROGRAM USE EXIT COMMAND.
>
	JRST	CTLRET
		SUBTTL	EXIT - ROUTINE TO CLEAN-UP FOR ENDING UETP
;RETURNS:	+1,ALWAYS
;
EXIT:	HRROI	T1,[ASCIZ/LOGOUT /]
	CALL	XEQEXC		;GO LOGOFF FROM THE PTY
	JRST	LOGERR		;ERRORS ENCOUNTERED
	SETOM T1		;INDICATE ALL FILES SHOULD BE CLOSED
	CLOSF			;CLOSE ALL OPEN FILES
	 JRST	[ERRSND<ERROR WITH CLOSF AT .EXIT:>
		 JRST	.+1]	;UNEXPECTED ERROR
	HRROI	T1,-1		;NOW RELEASE ALL JFN'S
	RLJFN
	 JRST	[ERRSND<ERROR WITH RLJFN JSYS AT .EXIT:>
		 JRST	.+1]
	MOVEI	T1,.FHSLF
	DIR			;DISABLE THE SOFTWARE INTERRUPT SYSTEM
	MOVEI	T1,.FHINF	;NOW LET'S KILL ALL INFERIORS
	KFORK
	 ERJMP	[ERRSND<ERROR WITH KFORK AT .EXIT:>
		 JRST	.+1]
	RET
LOGERR:	RITMSG <
?ERRORS ENCOUNTERED IN LOGGING OFF FROM PTY.
>
	HALTF
	JRST	.-1
		SUBTTL  GETPTY	- ROUTINE TO GET PTY AND ASSOCIATED TTY FOR EXEC
;ROUTINE TO GET A PTY JFN
GETPTY:	SAVEAC	<Q1,Q2,Q3>
	MOVE	T1,[SIXBIT/PTYPAR/]	;GET # OF PTYS IN SYSTEM
	SYSGT			;...
	 ERJMP	[ERRSND<UNEXPECTED PROBLEMS WITH JSYS SYSGT AT GETPTY:>
		 HALTF]
	HRRZM	T1,Q1		;STORE TTY CORRESPONDENCE FOR PTY'S
	HLRZ	T4,T1		;ISOLATE PTY COUNT
	MOVN	T4,T4		;GET # OF PTYS IN SYSTEM
	HRLZS	T4
GETPT1:	MOVSI T1,600013		;GET PTY DESIGNATOR
	HRRI T1,(T4)		;TRY TO GET NEXT PTY
	DVCHR			;GET CHARACTERISTICS OF THIS PTY
	 ERJMP	[ERRSND<UNEXPECTED PROBLEMS WITH JSYS DVCHR AT GETPT1:>
		 HALTF]
	TLNN T2,(1B5)		;IS IT AVAILABLE?
	JRST   GETPT2		;NO
	MOVE T2,T1
	HRROI T1,WRKBUF		;TURN IT INTO AN ASCII STRING
	DEVST
	JRST	GETPT2
	MOVEI T2,":"		;TERMINATED BY A COLON
	IDPB T2,T1
	MOVEI T2,0
	IDPB T2,T1		;ENDED WITH A 0 BYTE
	MOVSI T1,1		;SHORT FORM GTJFN
	HRROI T2,WRKBUF
	GTJFN
	JRST	GETPT2		;NOT AVAILABLE
	MOVE T2,[7B5+1B19+1B20]	;NOW TRY TO OPEN IT
	PUSH P,T1
	OPENF
	JRST	GETPT3		;NOT AVAILABLE
	POP P,T1			;GET BACK JFN
	ADD T4,Q1		;TURN PTY UNIT # INTO TTY #
	TRO T4,(1B0)		;MAKE LEGAL TERMINAL DESIGNATOR
	HRRZM T4,TTYJFN		;STORE TTY DESIGNATOR
	HRRZM T1,PTYJFN		;STORE JFN ALSO
	MOVEI T1,100
	GTTYP			;FIND OUT WHAT TYPE OF TERMINAL WE'RE ON.
	 ERJMP	[ERRSND<UNEXPECTED PROBLEMS WITH JSYS GTTYP AT GETPTY:>
		 HALTF]
	MOVE T1,TTYJFN
	STTYP			;AND SET PTY TO SAME TYPE.
	 ERJMP	[ERRSND<UNEXPECTED PROBLEMS WITH JSYS STTYP AT GETPT1:>
		 HALTF]
	; ...
	;...
	MOVE	T1,PTYJFN	;NOW ASSIGN PTY INPUT TO CHANNEL  33
	MOVE	T2,[MO%WFI+MO%OIR+.MOAPI+<FLD (^D33,MO%SIC)>]
	MTOPR			;MAKE THE ASSIGNMENT
	 ERJMP	[ERRSND<MTOPR ERROR AT GETERR:>
		 HALTF]
	JRST	GOTPTY		;AND SET INTERRUPT SYSTEM
GETPT3:	POP P,T1			;GET BACK JFN
	RLJFN			;AND RELEASE IT
	  JFCL
GETPT2:	AOBJN T4,GETPT1		;TRY FOR ANOTHER PTY
GETRET:	RET			;ERROR - RETURN - NO PTY
GOTPTY:	RETSKP			;NORMAL - RETURN
		SUBTTL		PARSHR	- ROUTINE TO PARSE NUMBER OF HOURS
;
;RETURNS:	+1,ERRORS
;		+2,WITH T1/NUMBER OF HOURS IN INTERNAL UNIVERSAL TIME
;		        T2/0  - IF TIME WAS PARSED
;			  /-1 - IF CR/LF WAS PARSED
;
PARSHR:	SAVEAC	<T3,T4>
	MOVEI	T1,CMDBLK			;COMND STATE BLOCK
	MOVEI	T2,[FLDDB. (.CMNUM,,12,<TIME IN HHH:MM FORMAT, WHERE HHH & MM ARE>,,[FLDDB. (.CMCFM)])]	;PARSE NUMBER OF SECONDS
	COMND	
	 ERJMP [HRROI	T1,[ASCIZ/COMND JSYS ERRORS AT .PARSHR:/]
		 JRST	CMDERR]		;error, go check for eof on take file
	TXNN	T1,CM%NOP		;NO PARSE?
	JRST	GETHR			;NO - SEE IF WE GOT A ':'
TYMERR:	HRROI	T1,BUFFER		;GET READY TO PRINT COMMAND IF TAKING
	SKIPE	TAKFLG			;SKIP IF NOT TAKING
	CALL	SNDMSG			;TAKING - TYPE OUT COMMAND
	RITMSG <
?INVALID TIME VALUE, MUST BE OF FORM HHH:MM, WHERE HHH & MMM ARE NUMERIC.
>
	RET
GETHR:	MOVS	T4,T3			;SEE IF WE PARSE A NUMBER?
	CAMN	T4,T3			;SKIP IF WE GOT A CR/LF
	JRST	MINGET			;GET HOURS - GO GET MINUTES
	HRROI	T2,-1			;INDICATE THE CR/LF TO CALLER
	JRST	HOURET
MINGET:	MOVE	T1,CMDBLK+.CMPTR	;GETTING THE DELIMETER
	ILDB	T4,T1			;FIRST NUMERIC MUST END WITH :
	CAIE	T4,":"			;WAS IT TIME VALUE?
	JRST	TYMERR			;NO - MUST BE AN ERROR
	MOVEM	T2,T4			;SAVE THE WAIT HOURS
	IMULI	T4,^D60			;CONVERT TO MINUTES
	IBP	CMDBLK+.CMPTR		;BUMP PAST THE COLON
	SOS	CMDBLK+.CMINC		;AND DECREMENT BYTE COUNT
	MOVEI	T2,[FLDDB. (.CMNUM,,^D10)]	;NEXT FIELD MUST BE A NUMBER
	MOVEI	T1,CMDBLK		;POINT TO STATE BLOCK
	COMND
	 ERJMP [HRROI	T1,[ASCIZ/COMND JSYS ERRORS AT GETHR:/]
		 JRST	CMDERR]		;error, go check for eof on take file
	TXNE	T1,CM%NOP		;GOOD PARSE?
	JRST	TYMERR			;NO - ERROR - GO TELL USER
	CAILE	T2,^D60			;MINUTES ARE 0-60
	JRST	TYMERR			;ERROR - TYPE MESSAGE
	ADD	T2,T4			;GRAND TOTAL
	IMULI	T2,^D60000		;CONVERT MINUTES TO MILLISECONDS
	MOVE	T1,T2			;INTO THE PARM REG
	SETZ	T2,			;INDICATE WE GOT A TIME VALUE
HOURET:	RETSKP
		SUBTTL PARSKY - SUBROUTINE TO PARSE KEYWORDS
;
;ACCEPTS:	T1/ADDRESS OF TBLUK FORMAT TABLE OF KEYWORDS
;
;RETURNS:	+1, ERROR
;
;		+2,T1/FLAGS,,ADDR OF ASCII KEYWORD
;		   T2/PR%ALL - IF ALL WAS TYPED
;		      PR%ONE - IF  A PARTICULAR KEYWORD WAS CHOSEN
;
PARSKY:	MOVEI	T2,[FLDDB. (.CMKEY,,ALLTAB,,,[FLDDB. (.CMKEY)])]
	HRRZ	T3,.CMFNP(T2)		;GET ADDRESS OF THE SECOND FDB ABOVE
	MOVEM	T1,.CMDAT(T3)		; PLACE KEYWORD TABLE ADDRESS INTO IT
	MOVEI	T1,CMDBLK		;COMND STATE BLOCK
	COMND				;GO PARSE A KEYWORD (TEST NAME) OR "ALL"
	 ERJMP [HRROI	T1,[ASCIZ/COMND JSYS ERRORS AT PARSKY:/]
		 JRST	CMDERR]		;error, go check for eof on take file
	TXNN	T1,CM%NOP		;NO PARSE?
	JRST	PAPARM			;NO - GO RETURN THE PARAMS
	HRROI	T1,BUFFER		;GET READY TO PRINT COMMAND IF TAKING
	SKIPE	TAKFLG			;SKIP IF NOT TAKING
	CALL	SNDMSG			;TAKING - TYPE OUT COMMAND
	RITMSG <
?NO SUCH TEST AVAILABLE.
>
	RET
PAPARM:	MOVS	T1,T3			;IF BOTH HALVES THERE THE SAME WE GOT A
	CAME	T1,T3			; "ALL" KEYWORD AND WILL SKIP.
	JRST	[MOVS	T1,(T2)		;KEYWORD - GET TABLE ENTRY TO RETURN
		 MOVX	T2,PR%ONE	;INDICATE THAT WE GOT A KEYWORD
		 JRST	PARSAV]		;AND TAKE NORMAL RETURN
	MOVS	T1,(T2)		;KEYWORD - GET TABLE ENTRY TO RETURN
	MOVX	T2,PR%ALL		;INDICATE USER TYPED "ALL"
PARSAV:	MOVEM	T1,CURENT	;SAVE CURRENT PARSED KEYWORD VECTOR
	RETSKP				;NORMAL RETURN
		SUBTTL PARSSW - PARSE SWITCHES /CYCLE AND\OR /DEPTH
;
; THIS ROUTINE HAS TWO SUBROUTINES (GTCYCL AND GTDPTH).  THESE SUBROUTINES
; GET THE ACTUAL VALUE ASSOCIATED WITH EACH SWITCH.  ACCUMULATORS Q2 AND Q3
; ARE USED BY THEM TO SHOW THAT A VALUE WAS RETURNED.  INITIALLY THEY POINT
; TO THE ENTRIES FOR THE DEFAULT VALUES, IF NEW VALUES ARE ENTERED THEN
; THEIR POINTERS ARE PLACED IN THERE. AFTER CR/LF THE POINTERS ARE SWITCHED
; WITH THE TEMPORARY SET THEREBY CREATING NEW DEFAULTS.
;
; ACCEPTS:	T1/ADDRESS OF TBLUK TYPE TABLE OF SWITCHES TO GET
;RETURNS:	T1/CYCLE VALUE
;		T2/FLAGE INDICATING DEPTH WANTED
;
PARSSW:	SAVEAC <Q1,Q2,Q3>
	MOVEI	Q2,DEFCYC		;POINT TO DEFAULT CYCLE VALUE
	MOVEI	Q3,DEFDEP		;POINT TO DEFAULT DEPTH VALUE
	MOVE	Q1,T1			;SAVE T1
SWLOOP:	MOVEI	T2,[FLDDB. (.CMSWI,,,,/DEPTH,[FLDDB. (.CMCFM)])]
	HRRZM	Q1,.CMDAT(T2)		;PUT ADDRESS OF KEYWORD TABLE IN FDB
	MOVEI	T1,CMDBLK		;POINT TO COMND STATE BLOCK
	COMND				;GET THE SWITCH
	 ERJMP [HRROI	T1,[ASCIZ/COMND JSYS ERRORS AT SWLOOP:/]
		 JRST	CMDERR]		;error, go check for eof on take file
	TXNN	T1,CM%NOP		;NO PARSE?
	JRST	SWVAL			;NO - GO PARSE THE SWITCH VALUE
	HRROI	T1,BUFFER		;GET READY TO PRINT COMMAND IF TAKING
	SKIPE	TAKFLG			;SKIP IF NOT TAKING
	CALL	SNDMSG			;TAKING - TYPE OUT COMMAND
	RITMSG <
?INVALID SWITCH 
>
	RET
SWVAL:	MOVS	T1,T3			;IF BOTH HALVES ARE NOT THE SAME WE GOT A
	CAME	T1,T3			; A CR/LF AND WILL TAKE THE DEFAULTS
	JRST	[TLNN	Q1,400000	;BIT ON MEANS DON'T LOOP FOR CR/LF
		 JRST	SWRET		;NO CR/LF WANTED - RETURN
		 RITMSG<
%NO FUNCTION PERFORMED
>
		 RET]
	HRRZ	T1,(T2)			;GET ADDR OF SUBR TO PARSE VALUE
	CALL	(T1)			;CALL GTCYCL OR GTDPTH TO GET RIGHT VAL
	RET				;ERROR - RETURN
	TLNE	Q1,400000		;BIT ON MEANS DON'T LOOP FOR CR/LF
	JRST	SWRET			;NO CR/LF WANTED - RETURN
	TXNN	T1,CM%EOC		;DID WE GET CR/LF
	JRST	SWLOOP			;NO - KEEP GETTING SWITCHES
	; ...
	;...
SWRET:	HRRZ	T1,(Q3)			;CHECK THAT PROPER DEPTH IS INDICATED
	MOVS	T1,(T1)			;/DEPTH VALUE FOR THIS COMMAND
	TDNN	T1,CURENT		;SEE IF HE CAN DO THIS
	JRST	[RITMSG<
?NON-EXISTANT DEPTH REQUESTED.
>
		 RET]
	HRROI	T1,BUFFER		;GET READY TO PRINT COMMAND IF TAKING
	SKIPE	TAKFLG			;SKIP IF NOT TAKING
	CALL	SNDMSG			;TAKING - TYPE OUT COMMAND
	MOVE	T1,Q2			;RETURN POINTER TO /CYCLE VALUES TABLE
	MOVE	T2,Q3			;RETURN POINTER TO /DEPTH VALUES TABLE
	RETSKP				;  AND EXIT NORMALLY
		SUBTTL PARSTM - ROUTINE TO PARSE A TIME FIELD
;
; RETURNS: +1,ERROR
;	   +2,T1/UNIVERSAL TIME
;	      T2/-1, IF NO TIME WAS PARSED, JUST A CR/LF
;	          0, IF TIME WAS PARSED

PARSTM:SAVEAC <T3,T4>
	MOVEI	T2,[FLDDB. (.CMNUM,CM%SDH,12,<TIME QUANTITY OF FORM HHH:MM>,,[FLDDB. (.CMCFM)])]
	MOVEI	T1,CMDBLK		;COMND STATE BLOCK 
	COMND				;GO PARSE TIME OR CR/LF
	 ERJMP [HRROI	T1,[ASCIZ/COMND JSYS ERRORS AT PARSTM:/]
		 JRST	CMDERR]		;error, go check for eof on take file
	TXNN	T1,CM%NOP		;NO PARSE?
	JRST	TMVAL			;NO - GO RETURN THE TIME VALUE
	HRROI	T1,BUFFER		;GET READY TO PRINT COMMAND IF TAKING
	SKIPE	TAKFLG			;SKIP IF NOT TAKING
	CALL	SNDMSG			;TAKING - TYPE OUT COMMAND
	RITMSG <
?BAD TIME VALUE. ONLY VALUES OF FORMAT HHH:MM ALLOWED.
>
	RET
TMVAL:	MOVE	P1,T2			;PUT TIME VALUE IN HOLD REG
	MOVS	T4,T3			;IF BOTH HALVES NOT EQUAL THEN WE
	CAME	T4,T3			;  GOT A CR/LF
	JRST	TMOUTL			;YES - GO TYPE OUT THE LINE IF TAKING
	MOVE	T1,CMDBLK+.CMPTR	;GET LAST PARSE BYTE POINTER
	ILDB	T4,T1			;IF IT WAS A ":" THEN TIME PARSE 
	CAIE	T4,":"			;WAS OF FORM ":MM" AND WE ASSUME
	JRST	[RITMSG<
?BAD TIME VALUE. ONLY VALUES OF FORMAT HHH:MM ALLOWED.
>
		 RET]
	IBP	CMDBLK+.CMPTR		;BUMP PAST THE COLON
	SOS	CMDBLK+.CMINC		;AND DECREMENT BYTE COUNT
	MOVEI	T2,[FLDDB. (.CMNUM,CM%SDH,^D10,<MINUTES>)]	;NEXT FIELD MUST BE A NUMBER
	MOVEI	T1,CMDBLK		;POINT TO STATE BLOCK
	COMND
	 ERJMP [HRROI	T1,[ASCIZ/COMND JSYS ERRORS AT TMVAL:/]
		 JRST	CMDERR]		;error, go check for eof on take file
	TXNN	T1,CM%NOP		;GOOD PARSE?
	JRST	MACTYM			;YES - GO DO COMPUTATION
BADTYM:	HRROI	T1,BUFFER		;GET READY TO PRINT COMMAND IF TAKING
	SKIPE	TAKFLG			;SKIP IF NOT TAKING
	CALL	SNDMSG			;TAKING - TYPE OUT COMMAND
	RITMSG<
?BAD TIME VALUE. ONLY VALUES OF FORMAT HHH:MM ALLOWED.
>
	RET
MACTYM:	CAILE	T2,^D60			;MINUTES ARE 0-60
	JRST	BADTYM			;ERROR - TYPE MESSAGE
	MOVE	P2,T2			;SAVE THE MINUTES
	HRLZI	T1,1			;UNIVERSAL DAY 1,,0
	IDIVI	T1,^D24			; T1/^D24 GIVES UNIVERSAL HOUR	;
	IMUL	P1,T1			;NUMBER OF UNIVERSAL HOURS
	IDIVI	T1,^D60			;T1/^D60 GIVES UNIVESAL MINUTE
	IMUL	P2,T1			;NUMBER OF UNIVERSAL MINUTES
	ADD	P1,P2			;GRAND TOTAL
	SETZ	T2,			; ZERO HOURS. HERE IF NO 'HH' GIVEN
	GTAD				;GET CURRENT TIME
	ADD	T1,P1			;PUT TIME IN PROPER REG
	RETSKP
TMOUTL:	HRROI	T1,BUFFER		;GET READY TO PRINT COMMAND IF TAKING
	SKIPE	TAKFLG			;SKIP IF NOT TAKING
	CALL	SNDMSG			;TAKING - TYPE OUT COMMAND
	HRROI	T2,-1			;INDICATE THAT WE GOT NO TIME VALUE
	GTAD				;GET CURRENT TIME SINCE NO TIME ENTERED
	RETSKP
	SUBTTL SCHED - CENTRAL SCHEDULER ROUTINE
;
;ACCEPTS:	T1/FUNCTION CODE
;		T2/-1 OR  POINTER TO TEST NAME IN ASCIZ
;		T3/CYCLE SWITCH VALUE OR ZERO
;		T4/DEPTH SWITCH VALUE OR ZERO
;RETURNS:	T1/ADDRESS OF NEXT TCB BLOCK
;		T2/ADDRESS OF CURRENT BLOCK (FOR READ ONLY)
;		T3/FLAGS
SCHED:	SAVEAC	<Q1,Q2,Q3,Q3+1>
	DMOVEM	T2,Q2		;SAVE PARMS
	MOVEM	T4,Q3+1		;SAVE PARM REGS
	CAIN	T1,READ		;READ FROM TCB TABLE?
	JRST	DOREAD		;YES
	PUSH	P,T1		;SAVE T1
	MOVEI	T1,.FHSLF	;THIS NONSENSE IS BECAUSE: WE WANT TO RUN 
	MOVEI	T2,<1B<ICH027-CHNTAB>>	;DISABLED IN SCHED AND HAVE PTY'S ENABLED
	IIC			;TOPS-20 WON'T ALLOW THAT WITHOUT LOOSING
	WAIT			; SOME OF THE INTERRUPTS...SO WE RUN IN LEVEL
				; TWO WITH PTY STUFF HIGHER AND ALL ELSE LOWER
SCHINT:	DMOVE	T2,Q2		;RESTORE PARMS
	POP	P,T1
	CAIN	T1,STRMSG	;DID WE RECEIVE A START MESSAGE
	JRST	DOSTMS		;YES
	CAIN	T1,ENDMSG	;WAS IT AN END MESSAGE
	JRST	DOENMS		;YES
	CAIN	T1,ERRMSG	;WAS IT AN ERROR MESSAGE
	JRST	DOERMS		;YES
	CAIN	T1,ABORT	;SHOULD WE ABORT THE JOB
	JRST	DOABRT		;YES
	CAIN	T1,DELETE	;SHOULD WE DELETE A TCB
	JRST	DODEL		;YES
	CAIN	T1,CREATE	;SHOULD WE CREATE A TCB
	JRST	DOCREA		;YES
	CAIN	T1,MODIFY	;SHOULD WE MODIFY A TCB
	JRST	DOMOD		;YES
	CAIN	T1,STARTM	;SHOULD WE START UP ALL ENABLED TESTS
	JRST	DOSTRT		;YES
	RITMSG <
?ERROR IN UETP.EXE:BAD FUNCTION CODE AT SCHED:
>
	HALTF
	JRST	.-1
DOREAD:	CALL	FNDBLK		;GO FIND NAMED BLOCK
	JRST	ERRET		;ERROR - RETURN
	SETZ	T3,		;CLEAN THE FLAG REG
	CAMN	T2,[-1]		;IS THERE A NEXT BLOCK
	JRST	[MOVX	T3,SC%EOT	;NO - THEN FLAG THAT IT'S EOT
		 JRST	.+1]	;AND EXIT NORMALLY
	EXCH	T1,T2		;GIVE HIM NEXT BLOCK
	JRST	OKRET		;AND EXIT NORMALLY
	; ...
	;...
DOSTMS:	CALL	FNDBLK		;FIND NAMED TCB
	JRST	SCHERR		;ERROR - RETURN
	CAMN	T3,[SC%EOT]	;EOT MEANS JOB NOT FOUND
	JRST	NOJOB		;UNKNOWN JOB
	MOVE	T2,TCBSTA(T1)	;GET STATUS VECTOR
	TXZN	T2,NT%QUE	;NO LONGER QUEUED
	JRST	BADJOB		;ERROR ON THIS JUMP
	IORX	T2,NT%RUN	;SHOW STATUS IS RUNNING
	MOVEM	T2,TCBSTA(T1)	;AND SAVE
	JRST	SCHEOK		;AND EXIT NORMALLY
DOERMS:	CALL	FNDBLK		;FIND NAMED TCB
	JRST	SCHERR		;ERROR - RETURN
	CAMN	T3,[SC%EOT]	;EOT MEANS JOB NOT FOUND
	JRST	NOJOB		;UNKNOWN JOB
	AOS	TCBERR(T1)	;BUMP ERROR COUNT
	MOVE	T3,TCBSTA(T1)	;LOAD THE STATUS VECTOR
	TXO	T3,NT%ERR	;FLAG AS HAVING ERRORS
	MOVEM	T3,TCBSTA(T1)	;AND SAVE
	JRST	SCHEOK		;AND EXIT NORMALLY
DOENMS:	CALL	FNDBLK		;GET NAMED BLOCK
	JRST	SCHERR		;ERROR - RETURN
	CAMN	T3,[SC%EOT]	;EOT MEANS JOB NOT FOUND
	JRST	NOJOB		;UNKNOWN JOB
	AOS	TCBRUN(T1)	;BUMP NUMBER OF TIMES RUN COUNT
	MOVE	T2,TCBSTA(T1)	;GET MAX TIMES TO RUN
	TXNE	T2,NT%CON	;SKIP IF JOB IS NOT CONTINUOUS
	JRST	STRTJ		;YES - CONTINUOUS RUNNING
	TXNE	T2,NT%TYM	;SKIP IF NOT A TIME VALUE
	JRST	[MOVE	T3,T1	;SAVE THE TCB ADDRESS
		 GTAD		;GET CURRENT TIME AND DATE
		 EXCH	T1,T3	;EXCHANGE FOR JUMPING
		 MOVE	T2,TCBMAX(T1)	;GET THE MAX RUN TIME
		 ADD	T2,TCBTYM(T1)	;PLUS THE START TIME GIVES END TIME
		 CAMGE	T3,T2		;ARE WE PAST END TIME FOR THIS TEST
		 JRST	STRTJ	;NO - THEN START IT UP
		 JRST	ENDJ]	;YES - THEN TURN IT OFF
	TXNN	T2,NT%NUM	;ERROR IF NOT A NUMBER VALUE
	JRST	[RITMSG<
?LOGIC ERROR IN UETP.EXE AT DOENMS:, UNKNOWN BITS IN TCBSTA FOR /CYCLE: TYPE
>
		 JRST	SCHERR]	;ERROR - RETURN
	MOVE	T2,TCBMAX(T1)	;GET NUMBER OF /CYCLE:'S
	SUB	T2,TCBRUN(T1)	;<MAX ALLOWED>-<ALREADY COMPLETED>
	JUMPG	T2,STRTJ	;JUMP IF COUNT NOT EXHAUSTED
ENDJ:	MOVE	T2,TCBSTA(T1)	;RESET STATUS BIT TO SHOW IT'S ALL OVER
	TXZN	T2,NT%RUN
	JRST	BADJOB		;BAD FLAG VALUE
	TXO	T2,NT%END	;FLAG TEST AS ENDED
	MOVEM	T2,TCBSTA(T1)
	JRST	SCHEOK		;AND EXIT NORMALLY
	; ...
	;...
STRTJ:	MOVE	T2,TCBSTA(T1)	;RESET STATUS BIT TO SHOW IT'S GOING AGAIN
	TXZN	T2,NT%RUN+NT%ABR
	JRST	BADJOB		;BAD FLAG VALUE
	TXZE	T2,NT%ERR	;RESET ERROR  (ON LAST RUN) - SKIP IF NONE
	CALL	SAVLOG		;GO SAVE THE LOG FILE
	CALL	DELLOG		;DELETE THE LOG FILE
	IORX	T2,NT%QUE	;FLAG AS QUEUED AND JUST STARTED
	MOVEM	T2,TCBSTA(T1)	;AND SAVE
	MOVE	T2,T1		;MOVE THE TCB POINTER TO PARM REG
	CALL	STARTJ		;GO START THE JOB
	JRST	SCHERR		;ERROR - RETURN
	JRST	SCHEOK		;AND EXIT NORMALLY
DOABRT:	CALL	FNDBLK		;GET NAMED TCB
	JRST	SCHERR		;ERROR - RETURN
	MOVE	T2,TCBSTA(T1)	;GET THE STATUS BITS
	TDNN	T2,T4		;ABORT ONLY ABORTS SPECIFIED DEPTHS
	JRST	SCHEOK		;EXIT NORMALLY
	TXZ	T2,NT%QUE+NT%RUN+NT%END+NT%ABR+NT%ENA	;CLEAR PERTINENT BITS
	IORX	T2,NT%ABR	;SET ABORT'ED STATE
	MOVEM	T2,TCBSTA(T1)	;SAVE NEW STATUS VECTOR
	CALL	KILJOB		;GO KILL THE JOB
	JRST	SCHERR		;ERROR - RETURN
	JRST	SCHEOK		;AND EXIT NORMALLY
DODEL:	CALL	FNDBLK		;GET NAMED TCB
	JRST	SCHERR		;ERROR - RETURN
	MOVE	T2,TCBSTA(T1)	;IS JOB ENABLED
	TDNN	T2,T4		;DELETE ONLY DELETES SPECIFIED DEPTHS
	JRST	SCHEOK		;EXIT NORMALLY
	TXNN	T2,NT%ENA+NT%ABRT+NT%END	;IS IT?
	JRST	[RITMSG<
?ONLY ENDED,ENABLED AND/OR ABORTED TESTS CAN BE DISABLED
>
	 	JRST	SCHERR]	;ERROR - RETURN
	CALL	FREBLK			;GO FRE THE BLOCK
	JRST	SCHEOK		;AND EXIT NORMALLY
DOCREA:	CALL	FNDBLK		;GO SEE IF WE ALREADY HAVE ONE
	JRST	SCHERR		;ERROR - RETURN
	TXNN	T3,SC%EOT	;END OF TABLE MEANS IT WASN'T THERE
	JRST	[MOVE	T2,T1		;SAVE THE NAME ADDRESS
		 RITMSG<
?>					;THIS IS AN ERROR MSG
		 HRRO	T1,T2		;WRITE OUT OFFENDING NAME
		 CALL	SNDMSG
		 RITMSG< IS ALREADY ENABLED.>
		 JRST	SCHERR]
	CALL	GETBLK		;GET AN EMPTY TCB
	MOVE	T4,T1		;SAVE THE ADDRESS
	MOVE	T1,(Q3)		;GET THE VALUE FOR /CYCLE:
	MOVEM	T1,TCBMAX(T4)	;SET THE MAX NUMBER OF RUNS
	SETZM	TCBTYM(T4)	;CLEAN OUT START TIME
	OR	Q3+1,1(Q3)	;NOW MERGE THE FLAG BITS
	IORX	Q3+1,NT%ENA	;FLAG AS ENABLED
	MOVEM	Q3+1,TCBSTA(T4)	;SET THE DEPTH OF THIS RUN
	HLRM	Q2,TCBDEP(T4)	;SAVE ALL AVAILABLE DEPTH FLAGS
	MOVNI	T3,6		;NOW MOVE THE NAME STRING
	HRROI	T1,TCBNAM(T4)	;WHERE NAME IS TO GO
	HRRO	T2,Q2		;NAME POINTER
	SOUT
	 ERJMP [ERRSND<UNEXPECTED SOUT ERROR AT DOCREA:>
		 HALT
		 JRST	.-1]
	MOVE	T1,T4		;POINT TO BLOCK FOR RETURN
	JRST	SCHEOK		;AND EXIT NORMALLY
	; ...
	;...
DOMOD:	CALL	FNDBLK		;GET NAMED BLOCK
	JRST	SCHERR		;ERROR - RETURN
	MOVE	T2,TCBSTA(T1)	;GET STATUS BITS
	AND	T2,[-1-<NT%SUP+NT%INT+NT%MAX>]
	OR	T2,Q3+1		;SET THE NEW BITS
	SKIPE	Q3+1		;ZERO MEANS NO CHANGE
	MOVEM	T2,TCBSTA(T1)	;SAVE THE BITS
	JUMPE	Q3,DOMRET	;JUMP TO RETURN IF NO /CYCLE CHANGE
	MOVE	T2,(Q3)		;GET NEW /CYCLE VALUE
	MOVEM	T2,TCBMAX(T1)	;AND INTO CONTROL BLOCK
	MOVE	T2,TCBSTA(T1)	;NOW GET  THE STATUS BITS
	AND	T2,[-1-<NT%CON+NT%TYM+NT%NUM>] ;AND CLEAN OUT/CYCLETYPE
	OR	T2,1(Q3)	;NOW BRING IN NEW /CYCLE TYPE
	MOVEM	T2,TCBSTA(T1)	;AND SAVE IT
DOMRET:	JRST	SCHEOK		;AND EXIT NORMALLY
DOSTRT:	MOVEM	T2,STRTIM	;SAVE RUN START TIME
	HRROI	T2,-1		;START ALL JOBS - GET FIRST
DOSTLP:	CALL	FNDBLK
	JRST	SCHERR		;ERROR - RETURN
	CAMN	T2,[-1]		;ARE WE AT END OF TABLE
	JRST	SCHEOK		;AND EXIT NORMALLY
	MOVE	T1,TCBSTA(T2)	;GET STATUS VECTOR
	TXZN	T1,NT%ENA+NT%ABR	;DOUBLE CHECK THAT IT'S ENABLED OR ABORTED
	JRST	DOSTLP		;MUST HAVE BEEN MUNGED BEFORE
	IORX	T1,NT%QUE	;SHOW HE IS RUNNING
	MOVEM	T1,TCBSTA(T2)	;RESET THE STATUS VECTOR
	MOVE	T1,STRTIM	;WE WANT TO STAMP THE START TIME
	MOVEM	T1,TCBTYM(T2)	;AND INTO THE TCB
	CALL	STARTJ
	JRST	[RITMSG<
?ERROR IN STARTING BATCH JOB :>
		 HRROI	T1,TCBNAM(T2)	;POINT TO BAD NAME
		 CALL	SNDMSG		;WRITE IT OUT
		 MOVE	T1,TCBSTA(T2)	;CHANGE STATUS TO  NT%ABR
		 TXZ	T1,NT%QUE	;TURN OFF QUEUED BIT
		 IORX	T1,NT%ABR	;AND SHOW HE'S ABORTED
		 MOVEM	T1,TCBSTA(T2)	;AND PUT IT AWAY
		 JRST	.+1]
	JRST	DOSTLP			;KEEP STARTING THEM
BADJOB:	MOVE	T4,T1			;SAVE TCB POINTER
	RITMSG<
%ERROR IN IPCF TRAFFIC. UNRECOGNISED STATE OF JOB : >
	HRROI	T1,TCBNAM(T4)		;POINT TO UNKNOWN STATE OF JOB
	CALL	SNDMSG			;SHIP OUT THE NAME
	HRROI	T1,[ASCIZ/
/]
	CALL	SNDMSG
	JRST	SCHERR		;ERROR - RETURN
NOJOB:	RITMSG<
%ERROR IN IPCF TRAFFIC. UNRECOGNISED JOB : >
	MOVE	T1,Q2			;GET POINTER TO NAME OF UNKNOWN JOB
	CALL	SNDMSG			;SHIP OUT THE NAME
	HRROI	T1,[ASCIZ/
/]
	CALL	SNDMSG
	JRST	SCHERR			;ERROR - RETURN
SCHERR:	MOVEI	Q1,ERRET		;POINT TO ERROR DEBRK EXIT
	MOVEM	Q1,RETPC2		;RESET RETURN ADDRESS
	DEBRK				;RETURN TO PREVIOUS LEVEL AND RETURN

SCHEOK:	MOVEI	Q1,OKRET		;POINT TO ERROR DEBRK EXIT
	MOVEM	Q1,RETPC2		;RESET RETURN ADDRESS
	DEBRK				;RETURN TO PREVIOUS LEVEL AND RETURN
ERRET:	RET			;ERROR RETURN AFTER THE DEBRK
OKRET:	RETSKP			;NORMAL RETURN AFTER THE DEBRK
		SUBTTL  SCHED SUBROUTINES
;ACCEPTS:	T1/ADDRESS OF TCB WHOSE LOG IS TO BE DELETED
;RETURNS:	+1,ALWAYS
;
DELLOG:	SAVEAC	<T1,T2,T3>
	HRROI	T1,DELBUF		;POINT TO WHERE WE'LL BUILD FILE SPEC
	HRROI	T2,TNAME		;PUT THE  NAME IN THERE
	SETZ	T3,			;TEST NAME ENDS IN NULL
	SOUT				;PUT INTO WORK AREA
	 ERJMP	[ERRSND<PROBLEMS WITH SOUT JSYS AT DELLOG:>
		 RET]
	HRROI	T2,[ASCIZ/.LOG/]	;WE WILL DELETE LOG FILES
	SETZ	T3,			;MOVE ALL THE BYTES
	SOUT
	 ERJMP	[ERRSND<PROBLEMS WITH SECOND SOUT AT DELLOG:>
		 RET]
	MOVE	T1,[GJ%OLD+GJ%SHT]	;GET SHORT FILE JFN
	HRROI	T2,DELBUF		;POINT TO FILE SPEC
	GTJFN
	 RET				;ERROR - JUST RETURN
	HRRZ	T1,T1			;DELETE
	DELF
	 JRST	.+1
	HRROI	T1,-1			;GET OUR DIRECTORY NUMBER
	MOVE	T2,[-1,,T4]		; TO EXPUNGE IT
	MOVEI	T3,.JIDNO		;TAKE ONE WORD ONLY
	GETJI
	 JRST	[ERRSND<ERROR WITH GETJI AT DELLOG:>
		 RET]
	MOVE	T2,T4			;GET THE DIRECTORY NUMBER
	SETZM	T1			;DELETE FILES
	DELDF
	 ERJMP	[ERRSND<ERROR WITH DELDF AT DELLOG:>
		 RET]
	RET
;ACCEPTS:	T1/ADDRESS OF ASCII NAME STRING
;RETURNS:	T1/ADDRESS OF TCB FOR NAMED STRING
;		T2/ADDRESS OF NEXT TCB IN LIST
;
FNDBLK:	SAVEAC	<T4,Q1,Q2>
	MOVEI	T3,STRTCB-TCBSIZ	;POINT TO START OF TCB TABLE
	MOVE	T4,[POINT 1,BITTCB]	;POINT TO START OF BIT TABLE FOR TCB
	CAMN	T2,[-1]			;FIRST BLOCK REQUEST
	JRST	[CALL	NXTBLK		;YES - GO GET IT
		 EXCH	T1,T2		;SWAP NEXT AND CURRENT BLOCK VALUES
		 RETSKP]		;NORMAL RETURN
	MOVE	Q1,T2			;NO - SAVE THE NAME ADDRESS
FNDNXT:	CALL	NXTBLK			;GET NEXT TCB
	CAMN	T1,[-1]			;ARE WE AT END OF TABLE
	JRST	[MOVX	T3,SC%EOT	;YES - SHOW JOB NOT FOUND
		 RETSKP]		;AND GIVE AN ERROR RETURN
	MOVE	Q2,T1			;SAVE ADDRESS OF BLOCK JUST GOTTEN
	HRRO	T1,T1			;DROP FLAGS AND MAKE INTO POINTER
	HRRO	T2,Q1			;GET STRING WE'RE TRYING TO FIND
	STCMP				;COMPARE THE STRINGS
	JUMPN	T1,FNDNXT		;JUMP IS THEY ARE NOT EQUAL
	MOVE	T2,Q2			;BLOCK WE GOT IS PARAMETER FOR NEXT
	CALL	NXTBLK			;AND GET THE ONE AFTER
	EXCH	T1,T2			;T1/THIS BLOCK; T2/NEXT BLOCK (OR -1)
	SETZ	T3,			;ZERO OUT THE FLAG REG
	RETSKP

NXTBLK:	MOVEI	T3,TCBSIZ(T3)		;POINT TO NEXT BLOCK
	CAIGE	T3,ENDTCB		;ARE WE AT END OF TABLE?
	JRST	NXTINC			;NO - KEEP LOOKING
	HRROI	T1,-1			;YES - SHOW THAT WE'RE AT END
	RET				;NORMAL RETURN
NXTINC:	ILDB	T1,T4			;GET NEXT BIT FROM BIT TABLE
	JUMPE	T1,NXTBLK		;ZERO MEANS BLOCK NOT IN USE
	MOVE	T1,T3			;FOUND A BLOCK - PUT ADDRESS IN T1
	RET				;NORMAL - RETURN
FREBLK:	CAIGE	T1,STRTCB		;VERIFY THE ADDRESS
	JRST	[RITMSG<
?LOGIC ERROR IN UETP.EXE, INCORRECT TCB ADDRESS AT FREBLK:
>
		 HALTF
		 JRST	.-1]
	CAIL	T1,ENDTCB		;VERIFY UPPER BOUND
	JRST	[ERRSND<BAD TCB ADDRESS AT FREBLK:>
		 HALTF
		 JRST	.-1]
	SUBI	T1,STRTCB		;PTR-START ADD = OFFSET
	IDIVI	T1,TCBSIZ		;COMPUTE BLOCK NUMBER OFFSET
	ADJBP	T1,[POINT 1,BITTCB,0]	;INDEX INTO CORE BIT TABLE
	SETZ	T2,			;SET TO ZERO THE BIT
	DPB	T2,T1			;ZERO THE BIT
	RET
;
;GETBLK ROUTINE
;
GETBLK:	SAVEAC <T2,T3>
	MOVE	T1,[POINT 1,BITTCB,0]	;LOOK THRU BIT TABLE FOR A ZERO BIT
	MOVE	T2,[POINT 1,<BITTCB+<<<CORSIZ/TCBSIZ>/^D36>>>,35] ;SEARCH TO END
	SETZ	T3,			;CLEAN THE BYTE  REG
	LDB	T3,T1			;GET A BIT
	JUMPE	T3,FNDTCB		;BIT IS OFF - GO HANDLE
	IBP	T1			;BUMP TO NEXT BIT
	CAME	T1,T2			;ARE WE AT END
	JRST	.-4			;NO - KEEP LOOKING
	RITMSG	<
?LOGIC ERROR IN UETP.EXE CORE TABLE FULL. AT GETBLK:
>
	RET
FNDTCB:	MOVEI	T3,-1			;SET THE BIT TO ONE
	DPB	T3,T1			;BLOCK NOW TAKEN
	HRRZ	T2,T1			;ISOLATE THE WORD ADDRESS
	SUBI	T2,BITTCB		;COMPUTE WORD OFFSET
	IMULI	T2,^D36			;COMPUTE BIT OFFSET
	LSH	T1,^D-30		;GET BITS INTO THIS WORD
	MOVEI	T3,^D35			;SUBTRACT BYTE POINT P FROM MAX SIZE
	SUB	T3,T1			;TO CALCULATE NUMBER BITS INTO WORD
	ADD	T3,T2			;BIT OFFSET FOR THIS BLOCK
	IMULI	T3,TCBSIZ		;BLOCK OFFSET FOR THIS BLOCK
	MOVEI	T1,STRTCB(T3)		;MOVE TO PARM REG
	SETZM	(T1)			;NOW ZERO OUT THE NEW BLOCK
	HRL	T2,T1
	HRRI	T2,1(T1)
	BLT	T2,TCBSIZ-1(T1)		;ZERO TO LAST WORD
	RET				;AND RETURN
 SUBTTL	SAVLOG	-	ROUTINE TO RENAME LOG FILE
;
;RETURNS	+1,ALWAYS
;
SAVLOG:	SAVEAC <T1,T2,T3,T4,Q1,Q2>
	HRROI	T1,DELBUF		;POINT TO WHERE WE'LL BUILD FILE SPEC
	HRROI	T2,[ASCIZ/APPEND /]	;PUT THE  NAME IN THERE
	SETZ	T3,			;TEST NAME ENDS IN NULL
	SOUT				;PUT INTO WORK AREA
	 ERJMP	[ERRSND<PROBLEMS WITH SOUT JSYS AT SAVLOG:>
		 RET]
	HRROI	T2,TNAME		;PUT THE  NAME IN THERE
	SETZ	T3,			;TEST NAME ENDS IN NULL
	SOUT				;PUT INTO WORK AREA
	 ERJMP	[ERRSND<PROBLEMS WITH SOUT JSYS AT SAVLOG:>
		 RET]
	HRROI	T2,[ASCIZ/.LOG   /]	;WE WILL RENAME LOG FILES
	SETZ	T3,			;MOVE ALL THE BYTES
	SOUT
	 ERJMP	[ERRSND<PROBLEMS WITH SECOND SOUT AT SAVLOG:>
		 RET]
	HRROI	T2,TNAME		;PUT THE  NAME IN THERE
	SETZ	T3,			;TEST NAME ENDS IN NULL
	SOUT				;PUT INTO WORK AREA
	 ERJMP	[ERRSND<PROBLEMS WITH SOUT JSYS AT SAVLOG:>
		 RET]
	HRROI	T2,[ASCIZ/.ERRORS-LOG/]	;WE WILL SAVE LOGS WITH ERRORS
	SETZ	T3,			;MOVE ALL THE BYTES
	SOUT
	 ERJMP	[ERRSND<PROBLEMS WITH SECOND SOUT AT SAVLOG:>
		 RET]
	HRROI	T1,DELBUF		;HAVE EXEC COPY THE FILE
	CALL	XEQEXC
	RET
	RET
  SUBTTL	STATUS - ROUTINE TO PRINT OUT CURRENT STATUS
;
;RETURNS:	+1,ERROR
;		+2,OTHERWISE
STATUS:	SAVEAC<T1,T2,T3,T4,Q1,Q2>
	MOVX	T1,.FHSLF		;NO INTERRUPTIONS WHILE WE'RE DOING THIS
	DIR				;DISABLE THE INTERRUPT SYSTEM
	RITMSG<
>					;SPACE THE TERMINAL
	MOVE	T1,[POINT 7,WRKBUF]	;POINT TO WHERE DATE AND TIME WILL GO
	MOVEI	T3,"["			;BRACKET THE TIME AND DATE
	IDPB	T3,T1
	HRROI	T2,-1			;CURRENT DATE AND TIME
	ODTIM
	MOVEI	T3,"]"			;BRACKET THE TIME AND DATE
	IDPB	T3,T1
	MOVEI	T3,15			;PUT A CR INTO STRING
	IDPB	T3,T1
	MOVEI	T3,12			;AND A LINE FEED
	IDPB	T3,T1
	SETZ	T3,
	IDPB	T3,T1
	HRROI	T1,WRKBUF		;NOW WRITE OUT THE STRING
	CALL	SNDMSG
	RITMSG <    TEST  NAME   STATUS  TIMES TO  TIMES  ERROR     START
>
	RITMSG <    (FILE NAME)          BE RUN    RUN    COUNT     TIME
>
	RITMSG <    ===========  ======= ========  =====  ======  ========
>
	; ...
	;...
	HRROI	T2,-1			;TELL SCHED WE WANT HIS FIRST NAME
STLOOP:	MOVEI	T1,READ			;WE WANT TO READ THE TABLE
	CALL	SCHED			;GO GET NEXT ENABLED NAME
	JRST	ERROUT			;GO TAKE ERROR EXIT
	TXNE	T3,SC%EOT		;ARE WE AT END OF TABLE
	JRST	OKOUT			;GO TAKE NORMAL EXIT
	MOVE	Q2,T1			;PLACE IN BASE FOR FUTURE USE
	MOVE	T1,[ASCII/     /]
	MOVEM	T1,WRKBUF		;FILL WRKBUF WITH BLANKS
	MOVE	T1,[WRKBUF,,WRKBUF+1]
	BLT	T1,WRKBUF+<WRKSIZ-1>
	MOVEI	T1,^D4			;START LINE IN COLUMN 5
	ADJBP	T1,[POINT 7,WRKBUF]	;AND CREATE THE BYTE POINTER
	HRROI	T2,TCBNAM(Q2)		;POINT TO NAME
	SETZ	T3,			;MOVE WHOLE NAME INTO BUFFER
	SOUT				;MOVE THEM
	 ERJMP	[ERRSND <ERROR AT LABEL STLOOP. ERROR WITH SOUT>
		 JRST	ERROUT]
	MOVEI	T4," "			;SOUT MOVES THE NULL WE WILL OVERLAY IT
	MOVE	T2,T1			;MUST SAVE T1 FOR FUTURE SOUT'ING
	IDPB	T4,T2			;MAKE IT A BLANK
	MOVE	T4,TCBSTA(Q2)		;GET STATE VECTOR
	HRROI	T2,[ASCIZ/.SUP/]	;ADD DEPTH INDICATOR TO NAME
	TXNE	T4,NT%SUP		;SUPERFICIAL DEPTH?
	JRST	STSOUT			;YES - ADD TO BUFFER
	HRROI	T2,[ASCIZ/.INT/]	;MAYBE INTERMEDIATE
	TXNE	T4,NT%INT
	JRST	STSOUT			;YES - THEN OUTPUT
	HRROI	T2,[ASCIZ/.MAX/]	;MUST BE MAXIMUM DEPTH
	TXNE	T4,NT%MAX
	JRST	STSOUT			;YES - WRITE IT OUT
	RITMSG <
?LOGIC ERROR IN UETP.EXE:UNKNOWN STATE OF ENABLED ENTRY (AT STSOUT:)
>					;ERROR - DROPS THRU HERE
	HRROI	T2,[ASCIZ/.UNKNOWN/]
	; ...
	;...
STSOUT:	SETZ	T3,			;WRITE WHOLE LINE
	SOUT
	 ERJMP [ERRSND <UNEXPECTED ERRO IN SOUT AT STSOUT>
		 JRST	ERROUT]
	MOVEI	T3," "			;SOUT MOVES THE NULL WE WILL OVERLAY IT
	MOVE	T2,T1			;WE'LL NEED THE ORIGINAL POINTER
	IDPB	T3,T2			;MAKE IT A BLANK
	HRROI	T2,[ASCIZ/QUEUED/]	;THIS NAME IF HE IS QUEUED
	TXNE	T4,NT%QUE		;IS FLAG ON
	JRST	STSTAT			;YES - THEN PLACE THIS IN BUFFER
	HRROI	T2,[ASCIZ/RUNNING/]
	TXNE	T4,NT%RUN		;IS JOB RUNNING
	JRST	STSTAT			;YES - MOVE TO BUFFER
	HRROI	T2,[ASCIZ/ENDED/]
	TXNE	T4,NT%END		;IS IT DONE
	JRST	STSTAT			;YES - THEN MOVE INTO BUFFER
	HRROI	T2,[ASCIZ/ABORTED/]
	TXNE	T4,NT%ABR		;WAS IT ABORTED
	JRST	STSTAT			;YES - THEN ABORT MSG INTO BUFFER
	HRROI	T2,[ASCIZ/ENABLED/]
	TXNE	T4,NT%ENA		;IS IT JUST ENABLED
	JRST	STSTAT			;YES - PLACE IN BUFFER
	RITMSG<
?LOGIC ERROR IN UETP.EXE AT LABEL STSTAT:. STATUS BITS IN TCB WRONG.
>
	HRROI	T2,[ASCIZ/UNKNOWN/]
	; ...
	;...
STSTAT:	MOVEI	T1,^D17			;STARTING COLUMNS IN WRKBUF
	ADJBP	T1,[POINT 7,WRKBUF]	;WHERE TO STORE FIELD
	SETZ	T3,			;SETTING UP FOR A SOUT LATER
	SOUT				;WRITE THE STUFF OUT
	 ERJMP	[ERRSND <ERROR AT LABEL STSTAT. SOUT ERROR.>
		JRST	ERROUT]
	MOVEI	T4," "			;SOUT MOVES THE NULL WE WILL OVERLAY IT
	IDPB	T4,T1			;MAKE IT A BLANK
	MOVE	T2,TCBMAX(Q2)		;NOW FOR THE /CYCLE FIELD
	CAME	T2,[-1]			;-1 MEANS CONTINUOUS
	JRST	TYMNUM			;MAYBE IT'S A TIME VALUE OR COUNT
	HRROI	T2,[ASCIZ/CONTIN/]
	MOVEI	T1,^D26			;STARTING COLUMNS IN WRKBUF
	ADJBP	T1,[POINT 7,WRKBUF]	;WHERE TO STORE FIELD
	SOUT
	 ERJMP	[ERRSND<UNEXPCTED ERROR WITH SOUT AT TYMNUM:>
		 JRST	ERROUT]
	MOVEI	T4," "			;SOUT MOVES THE NULL WE WILL OVERLAY IT
	IDPB	T4,T1			;MAKE IT A BLANK
	JRST	STRUN			;GO FIX-UP  TIMES ALREADY RUN
TYMNUM:	MOVE	T1,TCBSTA(Q2)			;MAYBE IT'S A TIME FIELD
	TXNN	T1,NT%TYM		;SKIP IF TIME VALUE
	JRST	STANUM			;NO - THEN MUST BE NUMBER
	MOVE	T2,TCBMAX(Q2)		;GET THE TIME VALUE
	IDIV	T2,[<1,,0>/<^D24>]		;CALCULATE # OF HOURS (TRUNC MINUTES)
	MOVE	T4,T3			;SAVE THE REMAINDER (MINUTES)
	MOVEI	T1,^D27			;STARTING COLUMNS IN WRKBUF
	ADJBP	T1,[POINT 7,WRKBUF]	;WHERE TO STORE FIELD
	MOVE	T3,[NO%LFL+NO%AST+<FLD (3,NO%COL)>!^D10]	;3 COLUMSN BASE 10
	NOUT				;PUT IN BUFFER
	 ERJMP	[ERRSND<ERROR IN NOUT IN TYMNUM>
		 JRST	ERROUT]
	MOVEI	T2,":"			;COLON FOR SEPRATOR (HHH:MM)
	IDPB	T2,T1			;AND SAVE IT
	MOVE	T2,T4			;T4 HAD REMIAINDER FROM LAST IDIV (:MM)
	IDIV	T2,[<<1,,0>/<^D24>>/<^D60>]	;ACTUAL NUMBER OF MINUTES
	MOVE	T3,[NO%ZRO+NO%LFL+NO%AST+<FLD (2,NO%COL)>!^D10]	;TWO COLS BASE 10 MINUTES
	NOUT
	 ERJMP	[ERRSND<UNEXPECTED ERROR WITH NOUT JSYS AT TYMNUM>
		 JRST	ERROUT]
	MOVEI	T4," "			;SOUT MOVES THE NULL WE WILL OVERLAY IT
	MOVE	T2,T1			;MUST SAVE T1 FOR FUTURE SOUT'ING
	IDPB	T4,T2			;MAKE IT A BLANK
	JRST	STRUN			;CONTINUE
	; ...
	;...
STANUM:	TXNN	T1,NT%NUM		;WAS IT REALLY A NUMBER
	JRST	[RITMSG<
?LOGIC ERROR IN STATUS ROUTINE AT STANUM: (IN UETP.EXE).
>
		 JRST	ERROUT]
	MOVEI	T1,^D27			;STARTING COLUMNS IN WRKBUF
	ADJBP	T1,[POINT 7,WRKBUF]	;WHERE TO STORE FIELD
	MOVE	T2,TCBMAX(Q2)		;NUMBER OF TIMES TO RUN
	MOVE	T3,[NO%AST+NO%LFL+<6,,0>+^D10]	;FILL WITH *'S IF OVERFLOW
	NOUT					;OUTPUT CYLCE COUNT
	 ERJMP	[ERRSND<BEFORE LABEL STRUN. ERROR IN NOUT.>
		 JRST	STRUN]			;GO PROCESS RUN MSG
	MOVEI	T4," "			;SOUT MOVES THE NULL WE WILL OVERLAY IT
	MOVE	T2,T1			;MUST SAVE T1 FOR FUTURE SOUT'ING
	IDPB	T4,T2			;MAKE IT A BLANK
STRUN:	MOVE	T2,TCBRUN(Q2)			;GET NUMBER OF RUNS 
	MOVEI	T1,^D34			;STARTING COLUMNS IN WRKBUF
	ADJBP	T1,[POINT 7,WRKBUF]	;WHERE TO STORE FIELD
	MOVE	T3,[NO%AST+NO%LFL+<6,,0>+^D10]	;FILL WITH *'S IF OVERFLOW
	NOUT					;OUTPUT CYLCE COUNT
	 ERJMP	[ERRSND<JUST AFTER LABEL STRUN. ERROR IN NOUT.>
		 JRST	STRUN]			;GO PROCESS RUN MSG
	MOVEI	T4," "			;SOUT MOVES THE NULL WE WILL OVERLAY IT
	MOVE	T2,T1			;MUST SAVE T1 FOR FUTURE SOUT'ING
	IDPB	T4,T2			;MAKE IT A BLANK
	MOVE	T2,TCBERR(Q2)			;GET NUMBER OF ERRORS 
	MOVEI	T1,^D42			;STARTING COLUMNS IN WRKBUF
	ADJBP	T1,[POINT 7,WRKBUF]	;WHERE TO STORE FIELD
	MOVE	T3,[NO%AST+NO%LFL+<6,,0>+^D10]	;FILL WITH *'S IF OVERFLOW
	NOUT					;OUTPUT CYLCE COUNT
	 ERJMP	[ERRSND<JUST AFTER LABEL STRUN. ERROR IN NOUT.>
		 JRST	STRUN]			;GO PROCESS RUN MSG
	MOVEI	T4," "			;SOUT MOVES THE NULL WE WILL OVERLAY IT
	MOVE	T2,T1			;MUST SAVE T1 FOR FUTURE SOUT'ING
	IDPB	T4,T2			;MAKE IT A BLANK
	MOVEI	T1,^D50			;ADD CR/LF AND NULL
	ADJBP	T1,[POINT 7,WRKBUF]	;POINT TO THE SLOT
	MOVE	T2,TCBTYM(Q2)		;PUT OUT THE START TIME
	JUMPE	T2,STCRLF		;NO OUTPUT IF ZERO TIME
	SETZ	T3,
	ODTIM
	 ERJMP	[ERRSND<ODTIM ERROR AT STSTAT:>
		 JRST	ERROUT]
STCRLF:	MOVEI	T1,^D68			;ADD CR/LF AND NULL
	ADJBP	T1,[POINT 7,WRKBUF]	;POINT TO THE SLOT
	HRROI	T2,[ASCIZ/
/]
	SETZ	T3,			;MOVE WHOLE STRING
	SOUT
	 ERJMP	[ERRSND<SOUT ERROR AT STSTAT:>
		 JRST	ERROUT]
	HRROI	T1,WRKBUF		;POINT TO BUILT LINE
	CALL	SNDMSG			;OUTPUT THE BUFFER WE BUILT
	MOVE	T2,Q2			;PARAMTER FOR SCHED (ADD OF BLOK)
	JRST	STLOOP			;GET NEXT ITEM ON TABLE
ERROUT:	MOVX	T1,.FHSLF		;MUST TURN INTERRUPT SYSTEM ON
	EIR