Google
 

Trailing-Edge - PDP-10 Archives - scratch - 10,7/unscsp/script/script.mac
There are 5 other files named script.mac in the archive. Click here to see a list.
	TITLE SCRIPT  --  FOLLOWS A SCRIPT ON N PSEUDO TTY'S -- V014
	SUBTTL TONY LAUCK/PFC		11 SEP 70


;COPYRIGHT (C) 1973,1978,1979 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.

	VSCRIP=014
	MLON

	;GLOBAL AC'S
	F=0		;FLAGS
	I=1		;PROCESS NUMBER AND PTY SOFTWARE CHAN
	N=2		;HIGHEST PROCESS NUMBER
	T=3		;LAST TIME OF DAY (MS)
	X=4		; NEXT EVENT TIME
	A=15		;NUMBER OF ACTIVE PROCESSES
	D=16		;IMPURE AREA BASE ADDRESS
	P=17		;PUSH DOWN POINTER
	;THE FOLLOWING NAMES ARE USED BY THE APPEND ROUTINE
	$S=0		;STACK POINTER
	$B=1		;BASE OF THE STACK
	$F=2		; REFERENCES FORMALS AND LOCALS
	$V=3		;VALUE REGISTER



	;AC'S AVAILABLE FOR PROCESS USE
	AC1=5
	AC2=6
	AC3=7
	AC4=10

	T1=11
	T2=12
	T3=13
	T4=14



	;OPTIONS

	IFNDEF	DEBUG,<DEBUG==1>	;INCLUDE DEBUGGING HACKS
	IFNDEF	CYCLSW,<CYCLSW==1>	;CYCLE CHANGES
	IFNDEF	HUWSW,<HUWSW==0>	;HOLDUP CHANGES
	;FLAGS IN F   RIGHT HALF  USED GLOBALLY

	F.LF==1		;LINE FEED SEEN LAST
	F.XCM==2	; ! SEEN ONCE AT START OF LINE
	F.SCN==4	; ; SEEN IN COMMAND LINE (DOUBLE ; DURING SCRIPT LOADING)
	F.WCH==10	;RESET IF NO PROCESS TO BE WATCHED
	F.RSP==20	;RESET IF NO PROCESS TO BE LOGGED FOR RESPONSE TIMES
	F.ERR==40	;MONITOR OUTPUT FOR ERRORS
	F.TTMN==100	;THE MONITOR DEVICE IS A TTY
	F.LZR==200	;PRINT LEADING ZEROS IF SET
	F.SSY1==400	;SLEEP SYNC -- PROCESS WAITING FOR RESPONSE
	F.SSY2==1000	;SLEEP SYNC -- PROCESS WOKEN BY RESPONSE
	F.SSY3==2000	;SLEEP SYNC -- WOKE UP AT T .GE. X
	F.SCN1==4000	; ; SEEN (LOAD)
	F.PCN==10000	; % SEEN (LOAD)
	F.SLF==20000	;SUPPRESS NEXT CHAR IF LF (LOAD)
	F.MCR==4000	;MONITOR OUTPUT C.RET. LAST (RUNNING)
	F.MLF==10000	;MONITOR OUTPUT L.FEED LAST (RUNNING)
	F.CTO==20000	;RECIEVE COMMENTS TO OPERATOR
	F.JST==40000	;JOBSTS UUO AVAILABLE IN THIS MONITOR
	F.DBG==100000	;DEBUG OUTPUT REQUESTED
IFN CYCLSW,<
	F.CYC==400000	;CYCLE MODE
	F.DOZ==200000	;SIGNAL TO SLEEP UNTIL NEXT TIME MARK
>
IFN HUWSW,<
	F.HUW==400000	;HOLDUP MODE(RUNNING)
>

	;FLAGS IN F  LEFT HALF   USED TEMORARILY BY A PROCESS

	P.LF==1		;LINE FEED SEEN LAST
	P.XCM==2	; ! SEEN ONCE AT START OF LINE
	P.DSH==4	; - SEEN
	P.NIP==10	;NUMBER BEING DECODED
	P.NRD==20	;NUMBER READY
	P.NONG==40	;LETTER COMMAND CAN NOT USE NEG ARG
	P.ARR==100	; ^ SEEN IN COLUMN 1 OF TEXT LINE (SET FOR COL. 2 ONLY)
	P.ARRL==200	; ^ SEEN IN COLUMN 1 OF TEXT LINE (SET FOR ENTIRE LINE)
	P.FACT==400	;MULTIPLY NUMBER BY FACTOR
	P.CTO==1000	;COMMENT TO OPERATOR
	P.SPL==2000	;SPECIAL HANDLING CODES
	P.WCHALL==4000	;SET IF ALL LINES TO BE WATCHED
	P.RSPALL==10000	;SET IF ALL LINES TO BE LOGGED FOR RESPONSE TIMES
	F.OLD==20000	;SET IF AN OLD BATCH JOB IS USING SCRIPT
	F.DWCH==40000	;SET IF WATCHING ON DEVICE DSK

	;FLAGS IN PFLAGS(D)   R.H. PERMANANT FOR EACH PROCESS

	P.LMOD==1	;PASS CR LF TO USER IF CLEAR
	P.UMOD==2	;CONVERT # INTO UNIT NUMBER IF SET
	P.MSYN==4	;OUTPUT SENT TO PTY, NO CHARS BACK YET
	P.OLD==10	;SET IF PROCESS ALREADY ACTIVE
	P.INT==20	;INTERRUPT ^C'S WERE SENT
	P.SSY==40	;LOST PT WAKE LIKELY
	P.ERR==100	;CURRENTLY IN AN ERROR LINE
	P.NFIR==200	;NEXT CHARACTER RECIEVED WILL NOT BE THE FIRST IN A LINE
	P.NNEW==400	;NOT NEW LINE OF PROCESS MONITORING
	P.QOK==1000	;QUESTION MARK RESPONSE OK
	P.FINT==2000	;FORCED INTERRUPT REQUESTED
	P.WCH==4000	;SET IF THIS PROCESS IS TO BE WATCHED
	P.RSP==10000	;SET IF THIS PROCESS IS TO BE LOGGED FOR RESPONSE TIMES
	JOBVER==137
	INTERN JOBVER
	EXTERN JOBSA,JOBFF,JOBHRL,JOBREN

	TWOSEG
	RELOC	400000



	;TTCALL UUO'S
	OPDEF	OUTCHR [TTCALL 1,]	;OUTPUT A CHARACTER
	OPDEF	OUTSTR [TTCALL 3,]	;OUTPUT A STRING
	OPDEF	INCHWL [TTCALL 4,]	;INPUT A CHARACTER & WAIT (LINE MODE)
	OPDEF	SKPINL [TTCALL 14,]	;CHECK FOR TTY INPUT


	;TTY CHARACTERS

	CONTC==3		;^C
	BEL==7			;BELL
	HT==11			;TAB
	LF==12			;LINE FEED
	VT==13			;VERTICAL TAB
	FF==14			;FORM FEED
	CR==15			;CARRIAGE RETURN
	CONTZ==32		;^Z
	ALT33==33		;ALTMODES OF VARIOUS FLAVORS
	ALT175==175
	ALT176==176
	RUBOUT==177		;RUBOUT
	;CONSTANTS

	NMAX==^D14		;MAX NUMBER OF PTY'S USED BY ONE PGM
	ERRORS==740000		;MASK FOR I/O ERRORS
	BUFSIZ==1600		;MINIMUM BUFFER SIZE FOR SCRIPT
	MAXSLP==^D5000		;LONGEST SLEEP PERIOD IS 5 SECONDS


	;SOFTWARE CHANNELS

	SCHN==1			;USED TO READ IN SCRIPT
	LOGCHN==16		;USED TO LOG RESULTS
	MONCHN==17		;USED TO WATCH RESULTS ON DEVICE TTY



	;PTY STATUS BITS

	MONMOD==1000		;IN MONITOR MODE.
	DOINP==2000		;PTY WANTS TO HAVE INPUT UUO DONE
	DOOUT==4000		;PTY WANTS TO HAVE OUTPUT UUO DONE



	;JOB STATUS UUO DEFINITION

	OPDEF	JOBSTS	[CALLI 61]

	;BITS IN LH----RH HAS JOB NUMBER

	JSTJAC==10000		;JACCT SET
	JSTNCC==10000		;CONTROL C WILL BE TRAPPED
	JSTOUT==20000		;PTY WANTS TO HAVE OUTPUT UUO DONE
	JSTINP==40000		;PTY WANTS TO HAVE INPUT UUO DONE
	JSTMON==100000		;IN MONITOR MODE
	JSTLOG==200000		;LOGGED IN (NOT STARTED LOGOUT)
	JSTJNA==400000		;JOB NUMBER ASSIGNED



	;DEVCHR BITS

	DEVDIR==4		;LEFT HALF -- DEVICE HAS A DIRECTORY
	DEVTTY==10		;LEFT HALF -- DEVICE IS A TTY
	DEVAVL==40		;LEFT HALF -- DEVICE IS AVAILABLE TO US
	DEVINI==200000		;RIGHT HALF-- DEVICE IS INITTED
	DEVDSK==200000		;LEFT HALF -- DEVICE IS DSK

	;MACROS

	;DO(FOO) PERFORMS I/O OPERATION OVER THE CURRENT PTY
	;IF FOO IS NULL, THE OPERATION MUST ALREADY BE SETUP IN T4

	DEFINE	DO (A),<
	XLIST
IFN<A>,<IFE <A>&777777,<MOVSI	T4,(A)>
	IFN <A>&777777,<MOVE	T4,[A]>>
	DPB	I,[POINT 4,T4,12]	;;INSERT CHANNEL
	XCT	T4
	LIST
>

	;JOBST (FOO) PERFORMS A JOBSTATUS UUO TO AC FOO
	;THE JOB STATUS BLOCK IS UPDATED

	DEFINE	JOBST (A),<
	MOVEI	A,(I)		;;GET CHANNEL NUMBER
	JOBSTS	A,		;;GET JOB STATUS FROM MONITOR
	  HALT	.+1		;;FAIL SO GIVE UP
	IFN DEBUG,<IFE A-T1,<PUSHJ P,OUTSTS>>
	MOVEM	A,JOBSB(I)	;;REMEMBER FOR CONDITIONAL SLEEP UUO
>


	;PJRST IS USED INSTEAD OF PUSHJ, POPJ

	OPDEF	PJRST [JRST]
	SUBTTL	INITIALIZATION
BEGIN:	HLLZS	JOBREN		;CLEAR REENTER ADDRESS
	MOVSI T1,ELOW		;SET LENGTH OF LOW SEG
	HLLM T1,JOBSA
	RESET			;RESET
	MOVEI	T1,VSCRIP	;GET VERSION NO.
	MOVEM	T1,JOBVER	;PUT IN LOCATION 137
	MOVEI 17,1		;ZERO AC'S
	SETZM 0
	BLT 17,17
	MOVE T1,[XWD BLOW,BLOW+1]	;ZERO LOW CORE
	SETZM BLOW
	BLT T1,EZER-1

	MOVE P,[IOWD PDLEN,PDLIST]	;SET UP PUSH DOWN LIST

	TRO	F,F.JST		;CHECK FOR JOB STATUS UUO
	SETO	T1,		;(ON JOB 1)
	JOBSTS	T1,
	  TRZ	F,F.JST		;NO--CLEAR FLAG
	SUBTTL	LOADING OF SCRIPT
	SKIPE	NAME		;SEE IF WE HAVE A SCRIPT LOADED
	JRST	NAMED		;YES
	OUTSTR	[ASCIZ /No script/]
	JRST	CHKSCP		;SEE IF USER WANTS TO LOAD?
NAMED:	OUTSTR	[ASCIZ /Script /]
	MOVE	T2,NAME		;TYPE FILE NAME
	PUSHJ	P,TYPSIX
	OUTSTR	[ASCIZ /./]
	MOVE	T2,NAME+1	;TYPE EXTENSION
	PUSHJ	P,TYPSIX
	SKIPE	T2,NAME+2	;TYPE VERSION
	OUTSTR	[ASCIZ /%/]
	PUSHJ	P,TYPSIX

CHKSCP:	OUTSTR	[ASCIZ / loaded
/]
	HRROI	T1,14		;SEE IF OUR HI-SEG IS SHARABLE
	GETTAB	T1,		;LOOK AT JBTSGN
	HALT	.+1		;ERROR IF NOT DEFINED
	SKIPE	NAME		;YES--SEE IF A SCRIPT ALREADY HERE
	JRST	ASKNUM		;YES--OK TO PROCEED
	JRST	ASKSCP		;NO, SO GET NAME FROM USER

ASKSCP:	MOVE T1,JOBFF		;SAVE JOBFF
	MOVEM T1,SVFF
	OUTSTR	[ASCIZ /Where to load a script? /]
	MOVSI AC3,(SIXBIT /DSK/)	;YES,ASK FOR FILE
	MOVSI	AC2,(SIXBIT /SCP/)
	PUSHJ P,GETFIL		;GET FILE ARGS
	  JRST	ASKNUM
	MOVEI T1,1
	MOVE T2,AC3		;DO OPEN
	MOVEI T3,SBUF
	OPEN SCHN,T1
	JRST ASKSC2		;FAILED
	SETZM AC3		;OK, DO LOOKUP
	LOOKUP SCHN,AC1
	JRST ASKSC3		;FAILED
	JRST RSCRPT		;OK, READ IN SCRIPT


ASKSC2: OUTSTR	NODEV	;COULDN'T GET DEVICE
	JRST ASKSC4

ASKSC3: OUTSTR	NOFIL	;COULDN'T LOOKUP FILE

ASKSC4:	MOVE T1,SVFF		;RESTORE JOBFF
	MOVEM T1,JOBFF
	RELEAS SCHN,
	JRST ASKSCP		;ASK OVER AGAIN

NODEV:	ASCIZ	/?No such device
/
NOFIL:	ASCIZ	/?File not found
/
RSCRPT:	MOVEI T1,0		;UNLOCK HI SEG SO WE CAN READ IN SCRIPT
	SETUWP	T1,
	JRST NOWRITE		;CAN'T
	MOVEM T1,HIUWP		;OK, SAVE STATE OF WRITE PROTECT BIT
	MOVEM	AC1,NAME	;SAVE NAME OF SCRIPT
	HLLZM	AC2,NAME+1

	HRRZ AC1,JOBHRL
	SUBI AC1,BUFFER-1	;GET SIZE OF BUFFER IN HI SEG ABOVE PROGRAM
	IMULI AC1,5
	SUBI AC1,1		;REDUCE BY 1 FOR FINAL NULL CHARACTER FILL
	MOVE AC2,[POINT 7,BUFFER]	;SET UP BYTE POINTER TO WRITE IN HI SEG
	SETZB	AC3,NAME+2	;CLEAR LINE COUNT AND VERSION
	MOVE	AC4,[POINT 6,NAME+2]
	TRO F,F.LF		;SET UP LINE FEED FLAG FOR SCANNER

RSCRP1:	SOSG SBUF+2		;COUNT -- IS THERE A CHAR?
	JRST RSCRP5		;NO, GO DO INPUT
RSCRP2:	ILDB	T1,SBUF+1	;GET NEXT CHAR
	TRNN	F,F.LF		;SEE IF START OF NEW LINE
	JRST	RSCR2A		;NO
	LDB	T2,[POINT 6,SBUF+1,5]  ;LOOK AT POINTER AND
	CAIE	T2,35		;SEE IF AT LEFT END OF WORD
	JRST	RSCR2A		;NO
	MOVE	T2,@SBUF+1	;GET WORD
	TRNN	T2,1		;SEE IF SEQUENCE
	JRST	RSCR2A		;NO
	AOS	SBUF+1		;YES--SKIP
	HRREI	T2,-6		;AND COUNT THE CHARS
	ADDB	T2,SBUF+2
	JUMPL	T2,RSCRP6	;IF NO MORE, BAD INPUT DATA
	ILDB	T1,SBUF+1	;AND GET THE NEXT CHAR
RSCR2A:	JUMPE	T1,RSCRP1	;IGNORE NULLS

	CAIN T1,"!"
	JRST RXCM		;DISPATCH IF "!"

	TRZ F,F.LF		;NOT "!", CLEAR LINE FEED FLAG
	CAIN T1,";"
	JRST RSCOLN		;DISPATCH IF ";"
	CAIN T1,CR
	JRST RCR		;DISPATCH IF CARRIAGE RETURN
	CAIL T1,LF
	CAILE	T1,FF
	TRZA	F,F.SLF		;NOT LF, CLEAR SUPPRESS BIT
	JRST RLF		;DISPATCH IF LINE FEED
RSCRP3:	TRC F,F.XCM+F.SCN
	TRCN F,F.XCM+F.SCN	;IGNORE CHARACTERS IF WE HAVE COMMAND LINE & ";"
	JRST RSCRPV
	SOJLE AC1,RSCRP7	;COUNT BUFFER SPACE. IF LOW, GO EXPAND HI SEG
RSCRP4:	IDPB T1,AC2		;STORE CHARACTER
	JRST RSCRP1		;GO BACK FOR MORE

RSCRP5:	IN SCHN,		;DO INPUT UUO ON SCRIPT FILE
	JRST RSCRP2		;OK
	STATZ SCHN,ERRORS	;ERRORS?
	JRST RSCRP6		;YES
	MOVEM	AC3,NAME+3	;SAVE SCRIPT'S LINE COUNT
	MOVEI T1,0		;NO, MUST BE EOF
	IDPB T1,AC2		;STORE NULL CHARACTER
	HRLZ	T2,AC2		;RELEASE ANY UNUSED CORE SPACE
	SUBI	AC2,400000	;REMOVE HI-SEG START
	HRLM	AC2,JOBHRL	;UPDATE USEFUL LENGTH FOR THE SAVE
	CORE	T2,
	  HALT			;IF ALL IS WELL, WE SHOULD NEVER GET HERE
	MOVE T1,HIUWP		;RESTORE HI SEG WRITE PROTECT STATUS
	SETUWP	T1,
	JFCL
	RELEAS SCHN,	;RELEASE SOFTWARE CHANNEL USED TO READ IN
	MOVE T1,SVFF		;RECLAIM BUFFER SPACE
	MOVEM T1,JOBFF
	MOVE	T2,NAME		;TELL USER OF NAME
	PUSHJ	P,TYPSIX
	OUTSTR	[ASCIZ /./]
	MOVE	T2,NAME+1
	PUSHJ	P,TYPSIX
	SKIPE	T2,NAME+2
	OUTSTR	[ASCIZ /%/]
	PUSHJ	P,TYPSIX
	OUTSTR	[ASCIZ / loaded /] ;TELL USER
	MOVE	T1,NAME+3	;TYPE LINE COUNT
	PUSHJ	P,TYPDEC
	OUTSTR	[ASCIZ / lines
/]
	MOVE	T1,NAME		;UPDATE NAME FOR SYSTAT
	SETNAM	T1,
	EXIT	1,		;MONRET SO USER CAN SAVE
	JRST ASKNUM


RSCRPV:	JUMPN	AC3,RSCRP1	;IGNORE IF NOT FIRST LINE
	CAIN	T1,"%"		;LOOK FOR THE % FOR VERSION
	TRCA	F,F.PCN
	TRNN	F,F.PCN		;SEE IF %-FLAG ON
	JRST	RSCRP1		;NO--RETURN
	CAIGE	T1,140		;CONVERT TO
	SUBI	T1,40		;SIXBIT
	TLNE	AC4,770000	;PROHIBIT OVERFLOW
	IDPB	T1,AC4		;SAVE VERSION
	JRST	RSCRP1		;AND OTHERWISE IGNORE
RSCRP6: OUTSTR	[ASCIZ /?Error while reading script
/]
	JRST RSCRP8

RSCRP7:	HRRZ T2,JOBHRL		;EXPAND CORE. GET CURRENT HI SEG SIZE
	ADDI T2,2000		;ADD A K
	HRLZS T2
	CORE T2,			;DO CORE UUO
	JRST NOCORE		;FAILED
	ADDI AC1,5*2000		;OK, INCREMENT CHARACTER COUNT OF SPARE
	JRST RSCRP4		;GO ON WITH LOADING


NOCORE: OUTSTR	[ASCIZ /?Not enough core available
/]

RSCRP8:	MOVE T1,HIUWP		;RESTORE HI SEG UWP STATUS
	SETUWP	T1,
	JFCL
	EXIT			;RETURN TO MONITOR. USER LOST

NOWRIT: OUTSTR	[ASCIZ /?Can not write in hiseg
/]
	EXIT			;RETURN TO MONITOR. USER LOST



RXCM:	TRZ	F,F.SLF		;CLEAR SUPPRESS LF BIT
	TRNE F,F.LF		;ARE WE AT START OF LINE (OR SEEN ONE "!")
	TRCE F,F.XCM		;YES, COMPLEMENT "!"FLAG, WAS IT CLEAR ALREADY?
	TRZ F,F.LF		;NO, WE ARE NO LONGER AT START OF LINE
	JRST RSCRP3		;GO ON. NOTICE THAT F.LF WILL BE CLEAR AND F. XCM SET


RSCOLN:	TRZ	F,F.SLF		;CLEAR SUPPRESS LF BIT
	TROE	F,F.SCN1	;SET FIRST SEMICOLON FLAG
	TRO F,F.SCN		;ONLY IF WE ARE IN COMMAND LINE
	JRST RSCRP3		;SET ";" FLAG TO SUPPRESS COMMENTS IF COMMAND LINE
RCR:	TRNE	F,F.SLF		;SEE IF LF BEING SUPPRESSED
	JRST	RSCRP1		;YES--IGNORE THIS CR
	TRC	F,F.SCN!F.XCM	;SEE IF AFTER COMMENT
	TRCE	F,F.SCN!F.XCM
	JRST	RCRR		;NO--JUST GO AHEAD
	PUSHJ	P,BACKUP	;YES--REMOVE THE ;
	LDB	T2,AC2		;SEE IF PRECEEDING !
	CAIE	T2,"!"
	JRST	RCRR		;NO--INCLUDE THE <CR>
	PUSHJ	P,BACKUP	;YES--REMOVE EXCLAMATION
	TRO	F,F.SLF		;SET TO REMOVE NEXT CHAR IF <LF>
	JRST	RSCRP1		;AND SUCK UP <CR>

RCRR:	TRZ F,F.SCN!F.SCN1	;CLEAR ";" FLAG SO CR WILL ALWAYS BE LOCKED
	JRST RSCRP3		;GO ON

RLF:	TRZ F,F.XCM!F.SCN!F.SCN1 ;NEW LINE, INITIALIZE FLAGS
	TRO F,F.LF
	TRZE	F,F.SLF		;SEE IF SUPPRESSING LF
	AOJA	AC3,RSCRP1	;YES--JUST COUNT LINE
	AOJA	AC3,RSCRP3	;GO ON


BACKUP:	SOS	AC2		;BACK-UP STORE BYTE POINTER ONE SPACE
	IBP	AC2
	IBP	AC2
	IBP	AC2
	IBP	AC2
	POPJ	P,
	SUBTTL	INITIALIZE APPROPRIATE NUMBER OF PTY'S
ASKNUM:	MOVE T1,JOBFF		;SAVE JOBFF
	MOVEM T1,SVFF
	OUTSTR	[ASCIZ /HOW MANY JOBS TO BE RUN(1): /]
	PUSHJ P,ASKDEC		;GET DECIMAL NUMBER
	MOVEI	T1,1	;DEFAULT IS 1 JOB
	CAIG T1,NMAX		;CHECK IT
	JUMPG T1,ASKNU1		;OK
	OUTSTR	[ASCIZ /?Must be decimal 1 to 14
/]
	JRST ASKNUM		;TRY AGAIN
ASKNU1:	MOVEI N,-1(T1)		;HIGHEST SOFTWARE CHANNEL USED BY PTY'S
	SETZB I,D		;CLEAR CHANNEL NUMBER, PROCESS ADDRESS OFFSET
	MOVEI AC4,0		;CLEAR PTY UNIT NUMBER
	MOVEI AC1,1		;ASCII LINE MODE FOR OPEN UUO

ASKNU3:	CAILE AC4,77		;HAVE WE USED UP ALL PTY UNITS POSSIBLE?
	JRST ASKNU6		;YES
	MOVE T3,AC4		;NO. GET PTY UNIT IN SIXBIT
	IDIVI T3,^D8
	MOVSI AC2,(SIXBIT /PTY/)
	MOVE AC3,[POINT 6,AC2,17]
	JUMPE T3,ASKNU4
	ADDI T3,20
	IDPB T3,AC3
ASKNU4:	ADDI T4,20
	IDPB T4,AC3
	SETZM	PTYUNT(D)
	MOVE	AC3,[POINT 6,PTYUNT(D)]
	TRO	T3,20
	IDPB	T3,AC3
	IDPB	T4,AC3

	HRRZ AC3,D		;SET UP BUFFER HEADER ADDRESSES IN IMPURE AREA
	HRLS AC3
	ADD AC3,[XWD PTYOBF,PTYIBF]	;DO OPEN UUO ON APPROPRIATE SOFTWARE CHANNEL
	MOVE	T4,[OPEN	AC1]
	DPB	I,[POINT 4,T4,12]
	XCT	T4
	AOJA AC4,ASKNU3		;FAILED, TRY NEXT UNIT NUMBER

	MOVEM AC2,PTYNAM(D)	;SAVE PTY NAME IN SIXBIT
	HRRM AC4,PTYUNT(D)	;SAVE PTY UNIT NUMBER IN BINARY
	DO	(INBUF 1)	;SINGLE BUFFERS, INPUT AND OUTPUT
	DO	(OUTBUF 1)
	DO	(OUTPUT)	;1ST OUTPUT TO INITIALIZE RING
	ADDI D,IMPSIZ		;GO ON TO NEXT IMPURE AREA
	ADDI AC4,1		;NEXT PTY UNIT
	CAMGE I,N		;HAVE WE DONE ALL?
	AOJA I,ASKNU3		;NO, COUNT CHANNEL NUMBER AND PROCEED
	JRST 	SETTMP		;YES, GO AHEAD
ASKNU6: OUTSTR	[ASCIZ /?Not enough PTY's. Try over.
/]
	MOVE I,N		;SET UP TO RELEASE ALL SO FAR


ASKNU7:	DO	(RELEAS)	;RELEASE CHANNEL
	SETZM	PTYNAM(D)	;CLEAR NAME
	SOJGE I,ASKNU7		;DONE WITH ALL CHANNELS? LOOP IF NOT
	MOVE T1,SVFF		;YES, RECLAIM BUFFERS
	MOVEM T1,JOBFF
	JRST ASKNUM		;ASK USER HOW MANY ONCE AGAIN

SETTMP:			;SET UP THE NAMES OF THE TEMPORARY WCH
			;AND RSP FILES TO BE SCPNNN
	MOVE	AC1,WCHFILE	;AC1_SIXBIT /SCP000/
	PJOB	AC2,		;GET JOB NO
	IDIVI	AC2,^D100	;GET FIRST DIGIT
	DPB	AC2,[POINT 3,AC1,23]
	IDIVI	AC3,^D10	;GET NEXT DIGIT
	DPB	AC3,[POINT 3,AC1,29]
	DPB	AC4,[POINT 3,AC1,35]
	MOVEM	AC1,WCHFILE	;STORE NAME
	MOVEM	AC1,RSPFILE	;STORE NAME
				;FALL INTO ASKMON
	SUBTTL	OPEN MONITOR CHANNEL IF DESIRED
ASKMON:	TRZ F,F.WCH		;CLEAR MONITOR FLAG
	OUTSTR	[ASCIZ /WATCH HOW MANY JOBS(/]
	MOVEI	T1,1(N)		;T1_# OF JOBS TO BE RUN
	PUSHJ	P,DECOUT	;OUTPUT
	OUTSTR	[ASCIZ /): /]	;CLOSE PAREN
	PUSHJ P,ASKDEC		;ASK HIM
	  MOVEI	T1,1(N)		;DEFAULT IS ALL JOBS
	MOVEM	T1,NOWATC	;SAVE NUMBER OF FIRST TO NOT WATCH
	JUMPE	T1,ASKLOG	;NO MONITERING
	MOVSI	AC3,(SIXBIT /DSK/)	;DEFAULT IS DSK
	MOVE	AC2,WCHMASTER+1	;DEFAULT EXT IS WCH
	MOVE	AC1,WCHMASTER	;SCRIPT.WCH FILE
	OUTSTR	[ASCIZ /WHERE(DSK:SCRIPT.WCH): /]
	PUSHJ	P,GETFIL	;GET USER'S ANSWER
	JRST	ASKMO4		;CARRIAGE RETURN,SO USE DEFAULTS

	MOVEM	AC1,WCHMASTER	;STORE NAME FOR LATER USE
	MOVEM	AC2,WCHMASTER+1	;STORE EXT FOR LATER USE
	MOVEM	AC3,WCHDEV	;SAVE DEVICE FOR LATER USE
	TRZ F,F.TTMN		;SET TTMN ONLY IF DEVICE TTY IS A REAL TTY
	TLZ	F,F.DWCH
	MOVE T1,AC3
	DEVCHR	T1,
	TLNE	T1,DEVDSK	;IS DEVICE DSK ?
	TLO	F,F.DWCH	;YES,SO SET FLAG
	TLNE T1,DEVTTY
	TRO F,F.TTMN

ASKMO4:	MOVEI	T1,1		;SETUP AND OPEN MON CHANNEL
	MOVE	T2,AC3		;DEVICE 
	MOVSI	T3,MONBUF
	TRO	F,F.WCH		;SET WATCH FLAG
	OPEN	MONCHN,T1
	JRST	ASKMO1		;FAILED TO GET DEVICE
	MOVE	AC1,WCHFILE	;NAME OF TMP WATCH FILE
	MOVE	AC2,WCHFILE+1	;EXT
	SETZB	AC3,AC4		;ZERO PROTECTION AND PPN
	ENTER	MONCHN,AC1
	JRST	ASKMO2		;FAILED
	JRST	ASKALL		;NEXT QUESTION
ASKMO1: OUTSTR	NODEV
	JRST ASKMON

ASKMO2: OUTSTR	NOENT
	RELEASE MONCHN,
	JRST ASKMON

ASKMO3:	OUTSTR	[ASCIZ \?No device/file specified
\]
	JRST	ASKMON

NOENT:	ASCIZ	/?Can not enter file SCRIPT.WCH
/

ASKALL:	TLO	F,P.WCHALL	;ASK IF ALL LINES TO BE WARCHED
	OUTSTR	[ASCIZ /WATCH EACH LINE OF SCRIPT(N,Y): /]
	HRROI	AC1,40		;PUT -1,,40 IN AC1
	GETTAB	AC1,		;GETTAB TO SEE IF BATCH JOB
	SETZM	AC1		;GETTAB FAILED,SO HOPE IT'S A NEW SCRIPT
	TLNE	AC1,200		;IS IT A BATCH JOB ?
	JRST	BATCH		;YES,SO TEST IF NEW OR OLD DIALOGUE
	PUSHJ	P,ASKYNO	;NOT BATCH SO ASK THE USER
	TLZ	F,P.WCHALL	;NO , SO RESET THE FLAG
	JRST	ASKLOG		;YES,SO NEXT Q.

BATCH:	PUSHJ	P,TTYIN		;GET USER'S ANSWER
	PUSHJ	P,GETWRD	;GET SIXBIT FIELD
	CAIN	T3,(SIXBIT /N/)	;IS IT  "N" ?
	JRST	NEWBAT		;YES,SO THIS IS NEW BATCH
	CAIN	T3,(SIXBIT /NO/);IS IT "NO" ?
	JRST	NEWBAT		;YES,SO THIS IS NEW BATCH
	CAIN	T3,(SIXBIT /Y/)	;IS IT "Y" ?
	JRST	NEWBA1		;YES
	CAIN	T3,(SIXBIT /YES/)	;IS IT "YES" ?
	JRST	NEWBA1		;YES
		;NONE OF ABOVE.SO IT MUST BE AN OLD BATCH JOB
		;REPLYING TO AN OLD QUESTION :
		;"WHERE TO LOG RESPONSE TIMES ? "
		;OLD QUESTIONS WILL HAVE TO BE ASKED FOR THIS JOB
	TLO	F,F.OLD		;SET FLAG THAT THIS IS AN OLD JOB
	MOVE	AC1,RSPMASTER	;DEFAULT FILE NAME = SCRIPT
	MOVE	AC2,RSPMASTER+1	;DEFAULT EXT =RSP
	MOVSI	AC3,(SIXBIT /DSK/)	;DEFAULT DEVICE
	SETZM	AC4
	PUSHJ	P,GETFI0	;SNEAK IN GETFIL ROUTINE
	JRST	NORSP		;<CR> WAS INPUT.SO NO RESP ASKED
	MOVEM	AC1,RSPMASTER	;STORE USER'S FILE NAME
	MOVEM	AC2,RSPMASTER+1	;STORE EXT FOR FUTURE USE
	TRO	F,F.RSP		;SET FLAG THAT RESPONSE IS TO BE GATHERED
	MOVEI	T1,1(N)		;RESP FOR ALL JOBS
	MOVEM	T1,NOLOG
	MOVEI	T1,1		;ASCII LINE MODE
	MOVE	T2,AC3		;USER-SUPPLIED DEVICE NAME
	MOVSI	T3,LOGBUF	;OUTPUT BUFFER
	OPEN	LOGCHN,T1
	JRST	OPNFAL		;OPEN-FAIL
	MOVE	AC1,RSPFILE	;NAME OF THE TMP RESPONSE FILE
	MOVE	AC2,RSPFILE+1	;EXT
	SETZB	AC3,AC4
	ENTER	LOGCHN,AC1
	JRST	ENTFAL		;ENTER-FAIL
	JRST	REPEAT		;NEXT QUESTION

OPNFAL:	OUTSTR	[ASCIZ /CANNOT OPEN RSP FILE
/]
	JRST	NORSP
ENTFAL:	OUTSTR	[ASCIZ /CANNOT ENTER RSP FILE
/]
	JRST	NORSP

NORSP:	TRZ	F,F.RSP		;NO RESP TO E GATHERED
	SETZM	NOLOG
	JRST	REPEAT		;NEXT Q.

NEWBAT:	TLZ	F,P.WCHALL	;DON'T WATCH ALL LINES
NEWBA1:	JRST	ASKLOG		;WATCH ALL LINES,NEXT Q.

	SUBTTL	OPEN LOG CHANNEL IF DESIRED
ASKLOG:	TRZ F,F.RSP		;CLEAR LOG FLAG
	OUTSTR	[ASCIZ /RESPONSE TIME FOR HOW MANY JOBS(/]
	MOVEI	T1,1(N)		;T1_# OF JOBS TO BE RUN
	PUSHJ	P,DECOUT		;OUTPUT
	OUTSTR	[ASCIZ	/): /] ;CLOSE PAREN
	PUSHJ	P,ASKDEC	;ASK USER
	MOVEI	T1,1(N)		;DEFAULT IS ALL JOBS
	MOVEM	T1,NOLOG	;NO. OF JOBS TO BE LOGGED
	JUMPE	T1,LOCK	;GO TO NEXT QUESTION IF 0
	
	SETZB	AC3,AC4		;ZERO PROTECTION AND PPN
	MOVE	AC2,RSPFILE+1	;EXT
	MOVE	AC1,RSPFILE	;NAME OF TMP RESP FILE
	TRO F,F.RSP		;YES SO SET FLAG
	MOVEI T1,1		;SET UP & OPEN LOG CHANNEL
	MOVSI	T2,(SIXBIT /DSK/)	;DEVICE DSK
	MOVSI T3,LOGBUF
	OPEN LOGCHN,T1
	JRST ASKLO1		;FAILED TO GET DEVICE
	ENTER LOGCHN,AC1
	JRST ASKLO2		;FAILED
	JRST	ASKRSP		;OK SO NEXT QUESTION

ASKLO1: OUTSTR	NODEV	;NO DEVICE
	JRST ASKLOG		;TRY OVER

ASKLO2: OUTSTR	[ASCIZ /CANNOT ENTER SCRIPT.RSP FILE	;COULDN'T ENTER FILE
/]
	RELEAS LOGCHN,		;RELEASE DEVICE
	JRST ASKLOG		;TRY OVER

ASKRSP:	OUTSTR	[ASCIZ /RESPONSE TIME FOR EACH LINE(N,Y): /]
	TLZ	F,P.RSPALL
	PUSHJ	P,ASKYNO
	JRST	LOCK		;NO,NEXT QUESTION
	OUTSTR	[ASCIZ /ARE YOU SURE(N,Y): /]
	PUSHJ	P,ASKYNO
	JRST	LOCK		;NO,NEXT Q.
	TLO	F,P.RSPALL	;YES, SO FALL INTO LOCK

LOCK:	OUTSTR	[ASCIZ /LOCK IN CORE(N,Y): /]
	PUSHJ	P,ASKYNO
	JRST	REPEAT		;NO,SO NEXT Q.
	MOVEI	T1,[1,,1]	;CODE FOR LOC UUO
	CALLI	T1,60		;LOCK UUO
	OUTSTR	[ASCIZ /CANNOT LOCK.PROCEEDING ANYWAY
/]
				;LOCK SUCCESSFUL
	SUBTTL	GET REPEAT COUNT AND DELAY FACTOR
REPEAT:	OUTSTR	[ASCIZ /REPEAT COUNT(1): /]
	PUSHJ	P,ASKDEC
	MOVEI	T1,1	;DEFAULT IS 1
	MOVEM	T1,COUNTO	;SAVE AS OPERATOR COUNT


	OUTSTR	[ASCIZ /DELAY FACTOR(1): /]
	PUSHJ	P,ASKDEC
	  MOVEI	T1,1		;DEFAULT IS AS IN SCRIPT
	MOVEM	T1,DELFAC


	OUTSTR	[ASCIZ /STAGGER TIME(20(SEC)): /]
	PUSHJ	P,ASKDEC
	  SKIPA	T1,[-1]		;DEFAULT IS AS IN SCRIPT
	IMULI	T1,^D1000	;CONVERT TO M-SEC
	ADDI	T1,1		;GUARANTEE NON-ZERO
	MOVEM	T1,STAGO


	OUTSTR	[ASCIZ /SEE COMMENTS TO OPERATOR(N,Y): /]
	TRO	F,F.CTO
	PUSHJ	P,ASKYNO
	TRZ	F,F.CTO


	IFN	DEBUG,<
	TRNN	F,F.WCH		;SEE IF MONITORING
	JRST	WATCH		;NO--THEREFORE NO DEBUGGING FEATURES
	OUTSTR	[ASCIZ /DEBUG(N,Y): /]
	TRO	F,F.DBG
	PUSHJ	P,ASKYNO
	TRZ	F,F.DBG
>


WATCH:	OUTSTR	[ASCIZ /WATCH FOR ERRORS(N,Y): /]
	TRO	F,F.ERR
	PUSHJ	P,ASKYNO
	TRZ	F,F.ERR
	TLNE	F,F.OLD		;IS AN OLD BATCH JOB USING US ?
	JRST	INIT		;YES,SO DON'T ASK NEW QUESTIONS
IFN HUWSW,<
	TRZ	F,F.HUW		;NORMALLY OFF
	OUTSTR	[ASCIZ/HOLDUP AND WAIT (Y,N) :   /]
	PUSHJ	P,ASKYNO	;ASK
	JRST	NEXTTH		;NO
	TRO	F,F.HUW		;YES
	OUTSTR	[ASCIZ/FIRST WAIT AFTER LINE NUMBER:  /]
	PUSHJ	P,ASKDEC
	MOVEI	T1,3		;TO PERMIT EVERYONE TO LOG IN
	MOVEM	T1,FSTLIN	;SAVE INITIAL LINE
	OUTSTR	[ASCIZ/OTHERS AT INTERVALS OF:  /]
	PUSHJ	P,ASKDEC
	MOVEI	T1,3		;DEFAULT
	MOVEM	T1,WLINCR	;SAVE INCREMENT
	SETZM	DELFAC		;NO DELAY WHILE INITIALIZING
	JRST	INIT
NEXTTH:
>
IFN CYCLSW,<
CYCLE:	TRZ	F,F.CYC		;NORMALLY OFF
	OUTSTR	[ASCIZ /CYCLIC MODE(N,Y): /]
	PUSHJ	P,ASKYNO
	JRST	INIT		;NO CYCLE
	TRO	F,F.CYC		;SET CYCLE FLAG
	OUTSTR	[ASCIZ/THE TIME IS /]
	SETZB	T,T1
	MSTIME	T,
	PUSHJ	P,TYPTIM
	PUSHJ	P,TYPCRL
	OUTSTR	[ASCIZ /CYCLE INTERVAL IN MINUTES(10): /]
	PUSHJ	P,ASKDEC
	MOVEI	T1,^D10		;DEFAULT IS 10 MINUTES
	IMULI	T1,^D60*^D1000		;CONVERT TO MILLISEC
	MOVEM	T1,INTERV		;SAVE INTERVAL
	OUTSTR	[ASCIZ /CYCLE COUNT(10): /]
	PUSHJ	P,ASKDEC
	MOVEI	T1,10
	MOVEM	T1,CYCLCT
	OUTSTR	[ASCIZ /START RUN ON FIRST TIME MARK(N,Y): /]
	TRO	F,F.DOZ		;USUALLY YES
	PUSHJ	P,ASKYNO
	TRZ	F,F.DOZ		;NO,IMMEDIATELY
>
	JRST	INIT
	SUBTTL	PROCESS CONTROL
PRET:	MOVEM T4,PCWORD(D)	;RETURN FROM PROCESS TO MAIN LOOP
	POPJ P,			;JSP T4,PRET



;REENTER POINT -- KILL OFF JOBS WITH ALTERNATE SCRIPT
;THEN CLOSE MONITOR AND LOG FILES

REE:	MOVE	P,[IOWD PDLEN,PDLIST] ;RESTORE PUSH-DOWN LIST
	MOVEI	T,DEFAUR	;SET REENTER DEFAULTS
	MOVEM	T,DEFAUP
	MOVE	T,RNAME+3	;SET LINE COUNT
	MOVEM	T,SLNCNT
	TRZ	F,F.RSP		;STOP LOGGING
	SETZM	COUNTO		;CLEAR REPEAT COUNT
	SETZM	STAGO		;CLEAR STAGGER TIME
	PUSHJ	P,INITR		;GO RUN SCRIPT
	OUTSTR	[ASCIZ /
Jobs aborted/]

	TRNN	F,F.TTMN	;DON'T CLOSE IF TTY MONITOR

EXT:	CLOSE MONCHN,		;CLOSE MONITOR & LOG CHANNELS
	HLLZS	JOBREN		;CLEAR REENTER ADDRESS
	CLOSE LOGCHN,
	MOVEM	F,SAVACS	;SAVE FLAGS FOR FUTURE USE
	HRRZI	$B,EZER		;BASE OF THE STACK
	HRLI	$S,-767		;LENGTH OF STACK
	HRRZI	$F,11($B)	;FORMALS REGISTER
	HRR	$S,$F		;SET UP STACK POINTER
	HRLZI	4,F.DWCH
	TDNE	4,SAVACS	;WAS WATCHING DEVICE DSK ?
	SKIPG	T1,NOWATC	;YES,BUT WAS ANYTHING WATCHED ?
	JRST CLORSP		;NO,NO. SO DON'T APPEND
	PUSH	WCHMASTER+4	;PUSH POINTER TO MASTER-WCH FILE
	PUSH	WCHFILE+4	;PUSH POINTER TO NEW WCH FILE
	PUSH	[MONCHN]	;CHNL TO BE USED BY APPEND
	PUSH	[LOGCHN]	;CHNL TO BE USED BY APPEND
	PUSHJ	FILEAPPEND	;APPEND NEW FIE TO MASTER FILE
	SUB	$S,DSKI.L+15	;RESET STACK POINTER
CLORSP:	MOVE	T1,NOLOG	;# OF JOBS MEASURED
	JUMPE	T1,RES		;RESPONSE TIME FOR NO JOBS
	PUSH	RSPMASTER+4	;PUSH POINTER TO MASTER-RSP FILE
	PUSH	RSPFILE+4	;PUSH POINTER TO NEW RSP FILE
	PUSH	[MONCHN]
	PUSH	[LOGCHN]	;CHNL'S USED BY APPEND
	PUSHJ	FILEAPPEND	;APPEND NEW FILE TO MASTER FILE
	SUB	$S,DSKI.L+15	;RESET STACK POINTER
RES:	RESET			;RELEASE PTY'S ETC.
	EXIT			;RETURN TO MONITOR
INIT:	TIMER T4,		;DETERMINE POWER FREQ
	MSTIME T1,
	JUMPE T4,INIT
	MOVEM T1,TSTART		;ESTABLISH TIME ORIGIN

	IDIV T1,T4		;MILLISECONDS/JIFFY
	CAIL T1,^D18
	JRST T50HZ

T60HZ:	MOVEI T1,^D751		;751*60=4(MOD 4096)
	MOVEI T2,^D16666
	JRST TFUDG1

T50HZ:	MOVEI T1,^D2130		;2130*50=4(MOD 4096)
	MOVEI T2,^D20000

TFUDG1:	MOVEM T1,MAGIC		;MAGIC NUMBER TO SLEEP 4 JIFFIES
	MOVEM T2,USJIF		;MICROSECONDS PER JIFFY

	TRNN	F,F.RSP		;SEE IF RESPONSE TIME ENABLED
	JRST	STSCR		;NO
	MOVEI	AC1,SNEAK	;YES,PUT TITLE ON RESPONSE LOG
	PUSHJ	P,TITLE
	MOVEI	T2,TITMSR	;ADD DESCRIPTIVE JUNK
	PUSHJ	P,LSTSTR

	TRNN	F,F.WCH		;SEE IF MONITORING
	JRST	STSCR		;NO--GO START
	MOVEI	AC1,OUTMOT	;PUT TITLE ON MONITOR FILE
	TRNN	F,F.TTMN	;UNLESS TTY MONITOR
	PUSHJ	P,TITLE
STSCR:	OUTSTR	[ASCIZ /Starting
/]
	MOVEI	T,DEFAUL	;SET REGULAR DEFAULTS
	MOVEM	T,DEFAUP
	MOVE	T,NAME+3	;SET LINE COUNT
	MOVEM	T,SLNCNT
	TRO	F,F.MCR!F.MLF
	MOVEI	T,REE		;SET RE-ENTER ADDRESS
	HRRM	T,JOBREN
IFN CYCLSW,<
	TRNN	F,F.CYC		;CYCLE MODE?
	JRST	CYCLGO		;NO
	OUTSTR	[ASCIZ /NOW CCONT AND DETACH JOB FOR CYCLING
/]
	EXIT	1,		;RETURN SAVING STATE FOR CCONT
	TRZE	F,F.DOZ		;DELAY FIRST CYCLE TIL TIME MARK?
	PUSHJ	P,DOZE		;SLEEP TIL MARK
CYCLGO:
>
	MSTIME	T,		;RE-GET START TIME TO ENSURE CONSISTENCY IF POSSIBLE
	MOVEM	T,TSTART
	PUSHJ	P,INITR		;START SCRIPT
	OUTSTR	[ASCIZ /All jobs done/]
	JRST	EXT		;ALL DONE

INITR:	MSTIME T,			;GET TIME OF DAY SINCE RUN STARTED
	SUB T,TSTART
	SKIPGE T		;KEEP POSITIVE IN CASE OF MIDNIGHT
	ADD T,[^D24*^D60*^D60*^D1000]
	MOVE X,T		;SET LIMIT ON WAKEUP TIME
	ADDI X,MAXSLP
	PUSHJ	P,OPRET
	SETZB I,D		;CLEAR CHANNEL NUMBER, PROCESS ADDRESS OFFSET
	SETZ	A,		;CLEAR COUNT OF ACTIVE PROCESSES
	CAILE	N,NMAX-1	;CHECK FOR REASONABLE N
	MOVEI	N,NMAX-1	;NO--SET TO MAX

IFN HUWSW,<
	TRNE	F,F.HUW		;HOLDUP MODE?
	MOVEM	N,RCTR		;YES, SAVE COUNT OF RUNNING JOBS
>
INIT1:	PUSHJ P,PINI		;SET UP PROCESS
	ADDI D,IMPSIZ		;NEXT IMPURE AREA
	CAMGE I,N		;ARE WE DONE WITH ALL PROCESSES?
	AOJA I,INIT1		;NO, NEXT ONE & LOOP
LOOP:	MSTIME T,		;GET TIME OF DAY SINCE RUN STARTED
	SUB T,TSTART
	SKIPGE T		;KEEP POSITIVE IN CASE OF MIDNIGHT
	ADD T,[^D24*^D60*^D60*^D1000]

	CAMGE T,X		;DID WE WAKE UP EARLY
	TRZ F,F.SSY3		;YES CLEAR LOST PTWAKE POSSIBLE

LOOP1:	PUSHJ	P,OPER		;GO CHECK UP ON THE OPERATOR
	SETZB I,D		;CLEAR CHANNEL NUMBER, PROCESS ADDRESS OFFSET
	MOVE X,T		;SET LIMIT ON WAKE UP TIME
	ADDI X,MAXSLP

LOOP2:	PUSHJ P,@PCWORD(D)	;DO THE PROCESS
	ADDI D,IMPSIZ		;NEXT IMPURE AREA
	CAMGE I,N		;ARE WE DONE WITH ALL PROCESSES?
	AOJA I,LOOP2		;NO, NEXT ONE & LOOP

	JUMPE A,CPOPJ		;ARE ANY PROCESSES ACTIVE? IF NOT WE ARE DONE.

	TRZ F,F.SSY3		;CLEAR LOST PTWAKE POSSIBLE

IFN CYCLSW,<
	TRZE	F,F.DOZ		;TIME TO SLEEP TIL NEXT TIME MARK?
	TRNN	F,F.WCH+F.RSP	;SKIP IF NOT BOTH ZERO
	JRST	LOOP3		;DO NOT APPEND
		; THE APPEND ROUTINE BEGINS HERE
	CLOSE	MONCHN,
	CLOSE	LOGCHN,
	MOVEM	P,SAVACS+17	;SAVE ALL AC'S IN SAVACS TO SAVACS+17
	MOVEI	P,SAVACS
	BLT	P,SAVACS+16
	HRRZI	$B,EZER		;BASE OF THE STACK
	HRLI	$S,-767		;LENGTH OF STACK
	HRRZI	$F,11($B)	;FORMALS REGISTER
	HRR	$S,$F		;SET UP STACK POINTER
	HRLZI	4,F.DWCH
	TDNN	4,SAVACS	;WAS WATCHING DEVICE DSK ?
	JRST	APPRSP		;NO SO DON'T APPEND
	PUSH	WCHMASTER+4	;PUSH POINTER TO MASTER-WCH FILE
	PUSH	WCHFILE+4	;PUSH POINTER TO NEW WCH FILE
	PUSH	[MONCHN]	;CHNL TO BE USED BY APPEND
	PUSH	[LOGCHN]	;CHNL TO BE USED BY APPEND
	PUSHJ	FILEAPPEND	;APPEND NEW FIE TO MASTER FILE
	SUB	$S,DSKI.L+15	;RESET STACK POINTER
APPRSP:	PUSH	RSPMASTER+4	;PUSH POINTER TO MASTER-RSP FILE
	PUSH	RSPFILE+4	;PUSH POINTER TO NEW RSP FILE
	PUSH	[MONCHN]
	PUSH	[LOGCHN]	;CHNL'S USED BY APPEND
	PUSHJ	FILEAPPEND	;APPEND NEW FILE TO MASTER FILE
	SUB	$S,DSKI.L+15	;RESET STACK POINTER
	HRLZI	P,SAVACS
	BLT	P,P		;RESTORE AC'S
		; END OF APPEND BRANCH

		;REOPEN THE WCH AND RSP CHNLS
	TRNN	F,F.WCH		;WAS WATCHING ON ?
	JRST	LOOP4		;NO
	MOVEI	T1,1		;ASCII LINE MODE
	MOVE	T2,WCHDEV	;WATCHING DEVICE 
	MOVSI	T3,MONBUF	;OUTPUT BUFFER
	OPEN	MONCHN,T1
	JRST	LOOP5		;ERROR
	MOVE	AC1,WCHFILE	;NAME OF WCH FILE
	MOVE	AC2,WCHFILE+1	;EXT
	SETZB	AC3,AC4
	ENTER	MONCHN,AC1
	JRST	LOOP6		;ERROR
LOOP4:	TRNN	F,F.RSP		;WAS RSP FLAG ON ?
	JRST	LOOP7		;NO,SO DON'T OPEN RSP CHNL
	MOVEI	T1,1		;ASCII LINE MODE
	MOVE	T2,DSKI.L+14	;DEVICE DSK
	MOVSI	T3,LOGBUF	;OUTPUT BUFFER
	OPEN	LOGCHN,T1
	JRST 	LOOP5
	MOVE	AC1,RSPFILE	;NAME OF RSP FILE
	MOVE	AC2,RSPFILE+1	;EXT
	SETZB	AC3,AC4
	ENTER	LOGCHN,AC1
	JRST	LOOP8		;ERROR
LOOP7:	PUSHJ	P,DOZE		;SLEEP UNTIL NEXT TIME MARK
	JRST	LOOP3		;START AGAIN

LOOP5:	OUTSTR	[ASCIZ /CANNOT OPEN WATCHING  DEVICE/]
	CALLI	1,12		;EXIT

LOOP6:	OUTSTR	[ASCIZ /CANNOT ENTER WCH FILE/]
	CALLI	1,12		;EXIT

LOOP8:	OUTSTR	[ASCIZ /CANNOT ENTER RSP FILE/]
	CALLI	1,12		;EXIT

>
LOOP3:	TRC F,F.SSY1+F.SSY2	;IS A PROCESS WAITING ON PTY & WAS ONE WOKEN UP
	TRZN F,F.SSY1+F.SSY2
	JRST LOOP		;YES, TRY IMMEDIATELY IN CASE HE IS FAST
	MSTIME T,		;GET TIME OF DAY SINCE RUN STARTED
	SUB T,TSTART
	SKIPGE T		;KEEP POSITIVE IN CASE OF MIDNIGHT
	ADD T,[^D24*^D60*^D60*^D1000]
	MOVE T1,X		;GET EXCESS TILL WAKE UP TIME
	SUB T1,T
	JUMPLE T1,LOOP1		;NONE, SO DON'T SLEEP

	HRLI	T1,40		;HIBER CODE FOR PTY WAKE
	HIBER	T1,
	JRST	NOHBR		;HIBER UUO NOT WORKING
	JRST LOOP		;GO RUN THROUGH PROCESS AGAIN

NOHBR:	
	IMULI T1,^D1000		;WE SLEEP. GET TIME TO MICROSECONDS
	IDIV T1,USJIF		;GET TIME TO JIFFIES
	TRO T1,3		;ROUND UP TO MULTIPLE OF 4
	ADDI T1,1
	ASH T1,-2		;DIVIDE BY FOUR
	IMUL T1,MAGIC		;MULTIPLY BY MAGIC NUMBER
	SLEEP T1,		;SLEEP APPROPRIATE MULTIPLE OF 4 JIFFIES
	TRO F,F.SSY3		;SET FLAG THAT LOST PT WAKE POSSIBLE

	JRST	LOOP		;GO,RUN THROUGH THE PROCESS AGAIN

	SUBTTL	PROCESS INITIALIZATION & START OF NEW SCRIPT LINE
PINI:	HRLZI T1,CLPINI(D)	;INITIALIZE PROCESS
	HRRI T1,CLPINI+1(D)	;ZERO IMPURE AREA
	SETZM CLPINI(D)
	BLT T1,LCPINI-1(D)

	AOS A			;COUNT NUMBER ACTIVE
	MOVE	T,PTYNAM(D)	;CHECK NAME OF PTY
	JUMPE	T,RELPTY	;IF BLANK, GO RELEASE CHANNEL
	DEVCHR	T,		;CHECK AVAILABLITY
	TLNE	T,DEVAVL	;SEE IF AVAILABLE TO US
	TRNN	T,DEVINI	;SEE IF INITED
	JRST	RELPTY		;IF NO TO EITHER, RELEASE CHANNEL

	JSP T4,PRET		;STOW PCWORD & RETURN TO CONTROL LOOP


BEGSCP:	SETZM	CLBEGS(D)	;CLEAR IMPURE AREA
	MOVEI T1,DLBEGS(D)	;SET UP DEFAULTS
	HRL T1,DEFAUP
	BLT T1,LDBEGS-1(D)
	MOVE	T1,DELFAC	;APPLY DELAY FACTOR
	IMULM	T1,DELTI(D)
	IMULM	T1,DELTO(D)
	IMULM	T1,DELTR(D)
	IMULM	T1,DELTF(D)
	TLNN	F,P.WCHALL	;ALL LINES TO BE WATCHED?
	JRST	BEGSC1		;NO
	CAML	I,NOWATC	;YES,WATCH THIS PROCESS?
	JRST	BEGSC1		;NO, SO NEXT FLAG
	PUSHJ	P,OUTMO6	;YES,ENSURE START OF LINE
	MOVEI	T1,P.WCH
	IORM	T1,PFLAGS(D)	;SET FLAG TO WATCH THIS PROCESS

BEGSC1:	TLNN	F,P.RSPALL	;SEE IF RESP TIME FOR ALL LINES
	JRST	BEGSC2		;NO
	CAML	I,NOLOG		;SEE IF RESP TIME FOR THIS PROCESS
	JRST	BEGSC2		;NO
	MOVEI	T1,P.RSP
	IORM	T1,PFLAGS(D)	;YES, SO SET FLAG

BEGSC2:	IFN	DEBUG,<
	TRNN	F,F.JST		;SEE IF JOB STATUS UUO WORKS
	JRST	BEGLIN		;NO
	JOBST	(T1)		;GET STATUS FOR DEBUGGER
>
IFN HUWSW,<
	TRNN	F,F.HUW		;HOLDUP MODE?
	JRST	BEGLIN		;NO
	MOVE	T1,WLINCR	;GET HOLDUP LINE INCREMENT
	IMUL	T1,I		;MULTIPLY BY JOB INDEX
	ADD	T1,FSTLIN	;ADD INITAIL LINE
	MOVEM	T1,HLNCNT(I)	;SAVE LINE COUNT BEFORE HOLDUP
>

BEGLIN:	HRLZI T1,CLBEGL(D)	;START LINE. CLEAR STATISTIC AREA
	HRRI T1,CLBEGL+1(D)
	SETZM CLBEGL(D)
	BLT T1,LCBEGL-1(D)
	MOVEI T1,P.MSYN!P.INT!P.SSY!P.QOK ;INITIALIZE FLAG BITS
	ANDCAM T1,PFLAGS(D)
	MOVEI	T1,P.FINT	;SEE IF FORCED INTERRUPT REQUESTED
	TDNE	T1,PFLAGS(D)
	JRST	FINTRP		;YES--GO DO FORCED INTERRUPT

SSCRPL:	TLZ F,P.XCM!P.DSH!P.NIP!P.NRD!P.NONG!P.ARR!P.ARRL!P.CTO
	TRZ	F,F.SCN
	TLO F,P.LF
IFN CYCLSW,<
	TRNE	F,F.DOZ		;TIME TO SLEEP?
	JSP	T4,PRET		;YES,RETURN TO CONTROL LOOP TO DOZE
>
	MOVEI T3,0		;ZERO NUMBER BEING SCANNED
	AOS	LINCNT(D)	;COUNT LINES PROCESSED

	;FALL INTO SSCRPT
	SUBTTL	SCRIPT TEXT PROCESSING
SSCRPT:	ILDB T1,PSCRPT(D)	;GET CHARACTER
	JUMPE T1,CKCNT		;IF NULL, AT END OF SCRIPT
	PUSH	P,T1
	PUSHJ	P,OUTMON	;MONITOR INPUT
	POP	P,T1
	TRNE	F,F.SCN		;SEE IF IN A COMMENT
	JRST	COMCMD		;YES--PROCESS
	TLNE	F,P.CTO		;SEE IF IN A COMMENT TO OPERATOR
	JRST	CTO		;YES

	CAIN T1,"!"		;DISPATCH ON "!"
	JRST EXPROC
	CAIN T1,"^"		;DISPATCH ON"^"
	JRST ARROW

	TLZ F,P.LF		;NEITHER. SO CLEAR LF FLAG
	TLNN F,P.XCM		;IS THIS COMMAND LINE?
	JRST SCNTXT		;NO, GO HANDLE TEXT LINE

	CAIN	T1,";"		;CHECK FOR COMMENTS
	JRST	SCNCMD		;YES
	CAIN T1,CR		;DISPATCH ON CR
	JRST CRCMD
	CAIL T1,LF		;DISPATCH ON LF
	CAILE	T1,FF
	JRST	.+2
	JRST LFCMD

	CAIL T1,"0"		;IS IT A DIGIT?
	CAILE T1,"9"
	SKIPA
	JRST NUMCMD		;YES
	CAIE T1,HT		;IS IT A SPACE OR TAB?
	CAIN T1," "
	JRST STBCMD		;YES
	CAIN T1,"-"		;DISPATCH ON "-"
	JRST DSHCMD

	CAIL	T1,"A"+40	;CHECK FOR LOWER CASE
	CAILE	T1,"Z"+40
	JRST	.+2
	SUBI	T1,40
	PUSHJ P,CKARG		;MUST BE A LETTER OR BAD. CLOSE OUT NUMBERS IN PROGRESS

	CAIN	T1,"W"		;START WATCHING?
	JRST	WCMD
	CAIN	T1,"D"		;W-MODE OFF?
	JRST	DCMD
	CAIN	T1,"P"		;START RECORDING PERFORMANCE ?
	JRST	PCMD
	CAIN	T1,"E"		;P-MODE OFF?
	JRST	ECMD
	CAIN T1,"L"		;DISPATCH ON LETTERS THAT DON'T TAKE NUMBER ARGS
	JRST LCMD
	CAIN T1,"N"
	JRST NCMD
	CAIN T1,"U"
	JRST UCMD
	CAIN T1,"V"
	JRST VCMD
	CAIN	T1,"Q"
	JRST	QCMD
	CAIN	T1,"X"
	JRST	XCMD

	TLO	F,P.FACT
	MOVEI T2,0		;CLEAR STORAGE ADDRESS FOR OTHER LETTERS
	CAIN T1,"I"		;PICK UP STORAGE ADDRESS FOR LETTERS WITH +-ARGS
	MOVEI T2,DELTI(D)
	CAIN T1,"O"
	MOVEI T2,DELTO(D)
	JUMPN T2,LETTER		;GO HANDLE THESE

	TLO F,P.NONG		;SET FLAG - NEGATIVE ARGS NOT ALLOWED
	CAIN T1,"F"
	MOVEI T2,DELTF(D)
	CAIN T1,"R"
	MOVEI T2,DELTR(D)
	SKIPN	T2		;IF NOT FOUND,
	TLZ	F,P.FACT	;CLEAR MULTIPLIER
	CAIN T1,"C"		;PICK UP STORAGE ADDRESS FOR LETTERS WITH + ARGS
	MOVEI T2,DELTC(D)
	CAIN T1,"S"
	MOVEI T2,DELTS(D)
	CAIN T1,"T"
	MOVEI T2,COUNT(D)

	JUMPN T2,LETTER		;DID WE GET AN ADDRESS
	JRST SYNERR		;NO, ILLEGAL CHARACTER. RETURN ERROR
SCNTXT:	CAIL T1,LF		;TEXT LINE. DISPATCH ON LF
	CAILE	T1,FF
	JRST	.+2
	JRST LFTXT
	CAIN T1,CR		;DISPATCH ON CR
	JRST CRTXT
	CAIN T1,"#"		;DISPATCH ON "#"
	JRST NUMTXT
	JRST HVCHR		;PROCESS CHARACTER



EXPROC:	TLCN F,P.LF+P.XCM	;"!" SEEN. CHECK START OF LINE, "!" FLAG, AND
	TLZA F,P.LF+P.XCM
	TLNN F,P.LF+P.XCM
	JRST HVCHR		;RETURN CHAR IF TEXT LINE ("!" FLAG NOW CLEAR)
	TLON F,P.LF
	JRST SSCRPT		;EAT CHARACTER IF 1ST "!" IN LINE ("!" FLAG NOW SET)
	JRST SYNERR		;ERROR IF "!" ELSEWHERE IN COMMAND LINE



ARROW:	TLOE	F,P.SPL		;"^" SEEN,SPECIAL HANDLING
	JRST	HVARR		;P.SPL WAS ALREADY SET
				;SO WE JUST HAVE AN ARROW
	TLNE F,P.XCM		;YES. "!" ALREADY AT START OF LINE?
	JRST SYNERR		;YES. "^" ILLEGAL IN COMMAND LINE
	TLO F,P.ARR+P.ARRL+P.SPL	;SET "^" FLAG TO COMPLEMENT BIT 100
	JRST SSCRPT		;GO PROCESS NEXT CHAR

LFTXT:	TLO F,P.LF		;RESET FLAGS ON LINE FEED
	TLZN	F,P.ARRL	;BUT IF ^ LINE, DON'T SEND CR/LF

CRTXT:	TLNE	F,P.ARRL	;DON'T SEND CR ON A ^ LINE
	JRST	CRTXT1
	MOVEI	T2,P.LMOD	
	TDNN	T2,PFLAGS(D)	;ON CR OR LF SEE IF WE RETURN THEM
	JRST	HVCHR		;NO; MUST BE CR SO SEND IT TO PTY
CRTXT1:	TLNN F,P.LF		;NO. L MODE WAS SET. LINE FEED?
	JRST SSCRPT		;NO EAT CR & GO ON
	PUSHJ	P,OUTLOG	;OUTPUT LF ON RSP FILE
	JRST HVLIN		;YES GO HANDLE COMPLETE TEXT LINE


NUMTXT:	MOVEI T2,P.UMOD		;# IN TEXT. UMODE SET?
	TDNE T2,PFLAGS(D)
	JRST HVCHR		;NO, RETURN "#"
	MOVE T3,[POINT 6,PTYUNT(D)]	;YES. SET FLAG. WAS IT SET?
NUMTX1:	ILDB T1,T3		;NO. PICK UP BYTE POINTER TO STRING OF SIXBIT DIGITS
	JUMPE T1,SSCRPT		;GET DIGIT
	ADDI	T1,40		;CONVERT TO SIXBIT
	PUSHJ	P,SNDPTY	;SEND TO JOB
	JRST	NUMTX1		;LOOP FOR NEXT



DSHCMD:	TLON F,P.DSH		;"-" SEEN IN COMMAND. SET FLAG
	TLNE F,P.NIP+P.NRD	;LEGAL?
	JRST SYNERR		;TWO "-" OR A "-" IN OR AFTER NUMBER ILLEGEL
	JRST SSCRPT		;OK, GO SCAN NEXT CHAR.


NUMCMD:	TLNE F,P.NRD		;DIGIT SEEN IN COMMAND. NUMBER ALREADY DONE?
	JRST SYNERR		;YES. ILLEGAL
	TLON F,P.NIP		;NO. SAY WE ARE IN MIDDLE OF NUMBER. WERE WE?
	MOVEI T3,0		;NO. SO ZERO COUNT
	IMULI T3,^D10		;RADIX CONVERSIONS - DECIMAL
	ADDI T3,-"0"(T1)
	JRST SSCRPT		;GO SCAN NEXT SCRIPT CHARACTER


STBCMD:	PUSHJ P,CKARG		;SPACE OR TAB. CLOSE OUT NUMBER IN PROGRESS, IF ANY
	JRST SSCRPT		;GO SCAN NEXT SCRIPT CHARACTER
WCMD:	TRNN	F,F.WCH		;WATCHING ANYTHING AT ALL ?
	JRST	CKNON		;NO , SO IGNORE
	CAML	I,NOWATC	;IS THIS PROCESS TO BE WATCHED ?
	JRST	CKNON		;NO,SO IGNORE
	MOVEI	T1,P.WCH	;YES,SO SET THE FLAG
	JRST	LUSET

DCMD:	TLNE	F,P.WCHALL	;SEE IF ALL LINES TO WATCH
	JRST	CKNON		;YES,IGNORE THIS COMMAND
	MOVEI	T1,P.WCH	;RESET WATCH FLAG
	JRST	NVCLR


PCMD:	TRNN	F,F.RSP		;RESP TIME FOR ANYTHING AT ALL ?
	JRST	CKNON		;NO,SO IGNORE
	CAML	I,NOLOG		;RESP TIME FOR THIS PROCESS ?
	JRST	CKNON		;NO,SO IGNORE
	MOVEI	T1,P.RSP	;YES,SO SET FLAG
	JRST	LUSET

ECMD:	TLNE	F,P.RSPALL	;SEE IF RESP TIME FOR ALL LINES
	JRST	CKNON		;YES,IGNORE THIS COMMAND
	MOVEI	T1,P.RSP	;RESET THE FLAG
	JRST	NVCLR

CRCMD:	ILDB T1,PSCRPT(D)	;CR SEEN IN COMMAND LINE.
	PUSHJ	P,OUTMON	;MONITOR OUTPUT
	CAIL T1,LF		;NEXT CHARACTER MUST BE LF
	CAILE	T1,FF
	JRST SYNERR		;IF NOT AN ERROR.

LFCMD:	TLNE F,P.NIP+P.NRD+P.DSH
	JRST SYNERR		;LF SEEN IN COMMAND LINE. NUMBER LEFT OVER?
	JRST SSCRPL		;GO SCAN NEXT LINE


SCNCMD:	TRO	F,F.SCN		;SEMI-COLON SEEN
	JRST	SSCRPT

COMCMD:	CAIL	T1,LF		;COMMENT LINE--CHECK FOR LF
	CAILE	T1,FF
	JRST	SSCRPT		;NO
	JRST	LFCMD		;YES

LCMD:	MOVEI T1,P.LMOD		;L COMMAND. SET L MODE
	JRST LUSET

NCMD:	MOVEI T1,P.LMOD		;N COMMAND. CLEAR L MODE
	JRST NVCLR

VCMD:	MOVEI T1,P.UMOD		;V COMMAND. CLEAR U MODE

LUSET:	IORM T1,PFLAGS(D)
	JRST CKNON

UCMD:	MOVEI T1,P.UMOD		;U COMMAND. SET U MODE

NVCLR:	ANDCAM T1,PFLAGS(D)

CKNON:	TLNE F,P.NRD		;WAS A NUMBER SUPPLIED BEFORE "L","N","U","V"?
	JRST SYNERR		;YES, AN ERROR
	JRST SSCRPT		;NO, GO SCAN NEXT SCRIPT CHARACTER


LETTER:	TLZE F,P.NONG		;LETTER COMMAND. CHECK LEGALITY OF NEGATIVE NUMBERS
	JUMPL T3,SYNERR
	MOVE	T1,T3
	TLZE	F,P.FACT	;SEE IF MULTIPLIER APPLICABLE
	IMUL	T1,DELFAC	;YES--INCLUDE IT
	MOVEM T1,(T2)		;SET NUMBER INTO STORAGE LOCATION
	TLZ F,P.NRD		;CLEAR NUMBER READY FLAG
	JRST SSCRPT		;SCAN NEXT SCRIPT CHARACTER
QCMD:	TLZ	F,P.NRD
	JUMPE	T3,Q0CMD	;Q COMMAND.  IF 0 ARGUMENT, OPEN ENDED
	JUMPL	T3,SYNERR
	MOVEM	T3,QCOUNT(D)	;SAVE POSITIVE ARGUMENT
	JRST	SSCRPT

Q0CMD:	MOVEI	T1,P.QOK	;0Q COMMAND.  SET ERRORS OK
	JRST	LUSET

XCMD:	TLO	F,P.CTO		;X COMMAND.  START OF COMMENT TO OPERATOR
	TRNN	F,F.CTO
	JRST	CKNON
	OUTSTR	[ASCIZ /(/]
	PUSHJ	P,ERRMPF
	JRST	CKNON

CTO:	TRNE	F,F.CTO
	OUTCHR	T1	;CHARACTER WITHIN A COMMENT TO OPERATOR
	CAIE	T1,LF
	JRST	SSCRPT
	JRST	LFCMD

CKARG:	TLZE F,P.NIP		;CHECK FOR NUMBER IN PROGRESS. CLEAR FLAG
	JRST CKARG1		;YES
	TLNE F,P.DSH		;NO, WAS "-" SEEN
	JRST SYNERR		;YES. AN ERROR
	POPJ P,			;NO, RETURN


CKARG1:	TLO F,P.NRD		;NUMBER IS NOW READY
	TLZE F,P.DSH		;CLEAR "-" FLAG
	MOVNS T3		;COMPLEMENT SIGN IN CASE OF "-"
	POPJ P,			;RETURN


SYNERR: OUTSTR	[ASCIZ /
?Syntax error in script at line /]
	MOVE	T1,LINCNT(D)
	PUSHJ	P,TYPDEC
	OUTSTR	[ASCIZ / of process /]
	MOVEI	T1,1(I)
	PUSHJ	P,TYPDEC
	OUTSTR	[ASCIZ /
/]
	EXIT			;RETURN ON ERROR
CKCNT:	AOS T1,NDONE(D)		;AT END OF SCRIPT. COUNT TIMES WE DID IT
	SKIPN	T2,COUNTO	;GET OPERATOR REQUESTED REPEAT COUNT
	MOVE	T2,COUNT(D)	;NONE REQUESTED--GET SCRIPT'S
	CAMGE T1,T2		;ARE WE DONE?
	JRST BEGSCP		;NO, START OVER AGAIN

IFN CYCLSW,<
	TRNN	F,F.CYC		;CYCLE SWITCH ON?
	JRST	RELPTY		;NO
	SOSG	T1,CYCLCT	;COUNT DOWN NUMBER OF CYCLES
	JRST	RELPTY		;DONE
	TRO	F,F.DOZ		;SET SLEEP FLAG
	JRST	BEGSCP		;START SCRIPT OVER AGAIN
>

RELPTY:	DO	(RELEAS)	;YES--RELEASE PTY
	SETZM	PTYNAM(D)	;FLAG THE RELEASE
	SETZM	JOBSB(I)	;CLEAR AREA IN JOB STATUS BLOCK
	SOS A			;COUNT DOWN NUMBER OF ACTIVE PROCESSES
	JSP T4,PRET		;RETURN TO CONTROL LOOP. SET PC TO POPJ
	POPJ P,			;IDLE THIS PROCESS.
HVARR:	TLZ F,P.ARR+P.ARRL+P.SPL	;"^^" SEEN, IGNORE SPECIAL HANDLING

HVCHR:	TLZE	F,P.SPL		;SEE IF SPECIAL HANDLING CODE BIT SET
	PUSHJ	P,SPECIAL
	PUSHJ	P,SNDPTY	;SEND IT TO THE JOB
	PUSHJ	P,OUTLOG	;OUTPUT ON RSP FILE
	TLNN F,P.LF		;SEE IF WE ENDED A LINE
	JRST SSCRPT		;NO, GO HANDLE NEXT CHARACTER

HVLIN:	SKIPG NUMCHS(D)		;YES, WAS IT NULL?
	JRST SYNERR		;IF SO, AN ERROR.
	MOVEI	T1,P.NFIR	;FLAG THAT NEXT RESPONSE COUNTS AS START OFLINE
	ANDCAM	T1,PFLAGS(D)
	MOVEI T1,P.OLD		;WE HAVE A COMPLETE SCRIPT LINE
	TDNE T1,PFLAGS(D)	;IS THIS 1ST LINE EVER?
	JRST ADDIND		;NO
	IORM T1,PFLAGS(D)	;YES, SET FLAG, NO LONGER VIRGIN
	SKIPN	T1,STAGO	;SEE IF OPERATOR SAID TO STAGGER
	MOVE T1,DELTS(D)	;NO--USE STAGGER FROM SCRIPT
	IMUL T1,I		;COMPUTE STAGGER INTERVAL AS INITIAL FREE TIME
	MOVEM T1,FREE(D)

ADDIND:	SKIPL T1,DELTI(D)	;INPUT DELAY OR RATE?
	JRST ADDIN1		;DELAY
	IMUL T1,NUMCHS(D)	;RATE. COMPUTE DELAY BASED ON NUMBER OF CHARACTERS
	MOVNS T1

ADDIN1:	ADD T1,FREE(D)		;TOTAL DELAY=FREE PLUS INPUT DELAY
	ADD T1,T
	MOVEM T1,TNEXT(D)	;SET EVENT TIME

IFN HUWSW,<
	TRNN	F,F.HUW		;HOLDUP MODE?
	JRST	OLOOP		;NO
	SOSLE	HLNCNT(I)	;DECREMENT LINE COUNT. DONE?
	JRST	OLOOP		;NO
	MOVSI	T1,377777	;SET UP INFINITY TIME
	MOVEM	T1,TNEXT(D)	;CAUSE WAIT FOREVER(HOLDING)
	SOSL	RCTR		;DECREMENT JOBS INITIALIZING. DONE?
	JRST	OLOOP		;NOT YET
	OUTSTR	[ASCIZ /JOBS WAITING. ENTER DELAY(SEC).  /]
	PUSHJ	P,ASKDEC
	MOVEI	T1,1		;DEFAULT IS 1 SEC.
	IMULI	T1,^D1000	;CONVERT TO MILLISEC
	MSTIME	T,		;GET THE TIME
	SUB	T,TSTART	;GET TIME FROM STARTUP
	SKIPGE	T
	ADD	T,[^D24*^D60*^D60*^D1000]
	ADD	T1,T		;SET UP WAKE TIME
	SETZM	DELFAC		;ZERO DELFAC
	AOS	DELFAC		;MAKE DELFAC=1
	SETZB	T2,T3
	TRZ	F,F.HUW		;TURN OFF FLAG-ALL NORMAL NOW
XLOOP:	MOVEM	T1,TNEXT(T3)	;SET UP WAKE TIME
	ADDI	T3,IMPSIZ	;INCREMENT INDEX
	CAMGE	T2,N		;DID LAST JOB?
	AOJA	T2,XLOOP	;NO INCREMENT AND LOOP BACK
>
OLOOP:	CAML T,TNEXT(D)		;IS IT TIME YET TO SEND ON PTY?
	JRST OUTLIN		;YES
	CAMLE X,TNEXT(D)	;NO, UPDATE SKIP TIME IF .GT. EVENT TIME
	MOVE X,TNEXT(D)
	JSP T4,PRET		;RETURN TO PROCESS CONTROL (TO STOP)
	JRST OLOOP		;LOOP
OUTLIN:	MOVE T1,T		;IT IS TIME TO OUTPUT OVER PTY?
	SUB T1,TNEXT(D)		;COMPUTE TYPE IN DELAY DUE TO POOR SCRIPT RESPONSE
	ADDM T1,INPSKW(D)

	DO	(OUTPUT)	;DO OUTPUT UUO
	MOVEI T1,P.MSYN		;CLEAR FLAG THAT PTY INPUT SEEN AFTER OUTPUT DONE
	ANDCAM T1,PFLAGS(D)
	PUSHJ P,CLOMON		;FLUSH MONITOR BUFFER IN CASE ITS A TTY & PROCESS 0

	MOVSI T1,377777		;INFINITY TIME
	SKIPN T2,DELTC(D)	;^C^C TIME OUT SPECIFIED?
	JRST SINT1		;NO
	MOVE T1,T2		;YES. PICK UP T + DELTC
	ADD T1,T

SINT1:	MOVEM T1,TINTR(D)	;STORE INTERRUPT TIME
	MOVEM T,TSTLIN(D)	;STORE TIME WE STARTED LINE TO MEASURE RESPONSE
	MOVE	T1,JOBNO(D)	;GET STORED JOB NO
	RUNTIM	T1,		;GET RUNTIME FOR THE PTY JOB
	MOVEM	T1,TCPUST(D)	;STORE CPU TIME AT START OF LINE
	JRST RLOOP		;GO WAIT FOR RESPONSE
SPECIAL: CAIN 	T1,"$"		;SEE IF ^$ IN SCRIPT
	JRST	OUTALT		;YES. OUTPUT ALTMODE
	CAIN	T1,"C"		;IS IT CONTROL-C ?
	JRST	CNTRL
;PUT HERE ALL OTHER CONTROL-CHARACTERS WHICH
;REQUIRE SUPRESSION OF CR,LF AT THE END OF LINE
	TRC	T1,100		;MAKE CONTROL-CHARACTER
	POPJ	P,

OUTALT:	MOVEI	T1,175		;ASCII OCTAL CODE FOR ALTMODE
	POPJ	P,

CNTRL:	TRC	T1,100
	TLO	F,P.ARRL	;SUPRESS CR,LF AT END OF LINE
	POPJ	P,

RLOOP1:	TRO F,F.SSY1		;SET FLAG PROCESS WAITING FOR RESPONSE
	JSP T4,PRET		;RETURN TO CONTROL LOOP (SLEEP)

RLOOP:	CAML T,TINTR(D)		;IS IT INTERRUPT TIME?
	JRST INTRPT		;YES
	CAMLE X,TINTR(D)	;NO. UPDATE SLEEP TIME IF GT INTERRUPT TIME
	MOVE X,TINTR(D)

	TRNE	F,F.JST		;SEE IF THIS MONITOR HAS JOBSTS
	JRST	RLOOPN		;YES!!!!!!!!

	DO	(GETSTS T1)	;GET PTY STATUS
	TRNN T1,MONMOD+DOINP+DOOUT	;MONITOR MODE INPUT OR OUTPUT NEEDED?
	JRST RLOOP1		;NO WE WAIT. LOOP
	TRNE T1,DOINP		;YES. DOES PTY NEED INPUT?
	JRST INLIN		;YES
	TRNE T1,DOOUT		;NO, DOES PTY NEED OUTPUT?
	JRST LINDON		;YES, WE ARE READY FOR NEXT LINE
	MOVEI T2,P.MSYN	;NO. MUST BE MONITOR MODE. FINISHED?
	TDNN T2,PFLAGS(D)
	JRST RLOOP1		;NO, SINCE NO PTY DATA SEEN, LOOP
	JRST	LINDON

RLOOPN:	JOBST	(T1)		;GET JOB STATUS
	TLNN	T1,JSTINP!JSTOUT ;SEE IF INPUT OR OUTPUT NEEDED
	JRST	RLOOP1		;NO--GO TO SLEEP
	TLNE	T1,JSTINP	;YES--SEE IF INPUT
	JRST	INLIN		;YES--GO GET IT
	MOVEI	T2,2
	TLNN	T1,JSTLOG	;SEE IF LOGGED IN
	SLEEP	T2,		;NO, SLEEP FOR A FEW SECONDS
	TLNN	T1,JSTLOG	;LOGGED IN ?
	JRST	LINDON		;NO,SO NO RUNTIME MEASUREMENTS
	HRRZS	T1,T1		;JOB NO IN RIGHT HALF
	MOVEM	T1,JOBNO(D)	;STORE JOB NO
	RUNTIM	T1,
	SUB	T1,TCPUST(D)	;SUBTRACT TIME AT START
	SKIPLE	T1		;DON'T ACCEPT -VE RUN TIME
	MOVEM	T1,TCPU(D)	;STORE CPU TIME FOR THIS LINE
				;YES--FALL INTO LINDON TO OUTPUT
LINDON:	TRO F,F.SSY2		;READY FOR NEXT LINE. SET WOKEN UP FLAG
	MOVEI T1,P.SSY		;SET LOST PT WAKE FLAG IF SLEPT TOO LONG
	TRNE F,F.SSY3
	IORM T1,PFLAGS(D)
	MOVE T1,T		;TOTAL RESPONSE
	SUB T1,TSTLIN(D)
	ADDB T1,RESPON(D)
	SUB T1,DELTR(D)		;COMPARE WITH LEGAL RESPONSE (NEG)
	SKIPLE T1
	MOVEI T1,0		;TWO LONG?
	SUB T1,DELTF(D)		;YES. WAIT ONLY FREE TIME
	MOVNM T1,FREE(D)	;TOTAL WAIT INCLUDES FREE TIME FROM SCRIPT
				;STORE FOR NEXT LINE INPUT DELAY.

	TRNN	F,F.RSP		;SEE IF RESP TIME FOR ANYTHING AT ALL ?
	JRST	LINDO1		;NO SO IGNORE
	MOVEI	T1,P.RSP	;SEE IF RESP TIME FOR THIS PROCESS
	TDNE	T1,PFLAGS(D)	
	PUSHJ P,LOGRES		;YES. GO FORM UP LINE OF RESULTS
LINDO1:	TRNE	F,F.ERR		;NO,SEE IF ERROR MONITOR
	SKIPG	QCOUNT(D)	;YES--SEE IF TOO FEW QUESTION LINES BACK
	JRST BEGLIN		;NO--GO HANDLE NEXT LINE.
	OUTSTR	[ASCIZ /??(/] ;YES--ISSUE PREFIX
	PUSHJ	P,ERRMPF
	OUTSTR	[ASCIZ /----too few errors----
/]
	JRST	BEGLIN		;GO HANDLE NEXT LINE
INLIN:	TRO F,F.SSY2		;PTY HAS OUTPUT. SET WOKEN UP FLAG
	AOS NUMOUT(D)		;COUNT BUFFERS
	MOVEI T1,P.SSY		;SET LOST PTY TIME
	TRNE F,F.SSY3
	IORM T1,PFLAGS(D)
	MOVE T1,T		;TOTAL REPONSE TIME
	SUB T1,TSTLIN(D)
	ADDM T1,RESPON(D)

	SKIPGE T1,DELTO(D)	;OUTPUT DELAY OR RATE?
	JRST ILIV		;RATE
	ADD T1,T		;DELAY, GET NEXT EVENT TIME
	MOVEM T1,TNEXT(D)

ILOPF:	CAML T,TINTR(D)		;DELAY. INTERRUPT TIME?
	JRST INTRPT		;YES
	CAML T,TNEXT(D)		;END OF OUTPUT DELAY?
	JRST ILOPFD		;YES
	CAMLE X,TINTR(D)	;NO, UPDATE SLEEP TIME IF LESS THAN
	MOVE X,TINTR(D)		; INTERRUPT OR EVENT TIME
	CAMLE X,TNEXT(D)
	MOVE X,TNEXT(D)
	JSP T4,PRET		;RETURN TO CONTROL LOOP (SLEEP)
	JRST ILOPF		;LOOP


ILIV:	PUSHJ P,INPTY		;OUTPUT RATE. READ PTY
	IMUL T3,DELTO(D)	;COMPUTE DELAY BASED ON NUMBER OF CHARS
	MOVNS T3
	ADD T3,T
	MOVEM T3,TNEXT(D)	;GET NEXT EVENT TIME

ILOPV:	CAML T,TINTR(D)		;INTERRUPT TIME?
	JRST INTRPT		;YES
	CAML T,TNEXT(D)		;END OF OUTPUT DELAY?
	JRST ILOPVD
	CAMLE X,TNEXT(D)	;YES
	MOVE X,TNEXT(D)		;NO. UPDATE SLEEP TIME IF LESS THAN
	CAMLE X,TINTR(D)	;INTERRUPT OR EVENT TIME
	MOVE X,TINTR(D)
	JSP T4,PRET		;RETURN TO CONTROL LOOP (SLEEP)
	JRST ILOPV		;LOOP


ILOPFD:	PUSHJ P,INPTY		;FIXED DELAY DONE. READ PTY

ILOPVD:	MOVE T1,T		;RECORD DELAY IN OUTPUT DUE TO POOR SCRIPT RESPONSE
	SUB T1,TNEXT(D)
	ADDM T1,OUTSKW(D)
	MOVEM T,TSTLIN(D)	;SET TIME WE GOT LINE TO MEASURE RESPONSE
	JRST RLOOP		;GO WAIT FOR RESPONSE
FINTRP:	TRNN	F,F.JST		;FORCED INTERRUPT--SEE IF JOB STATUS UUO AVAILABLE
	JRST	INTRPT		;NO--PLOW AHEAD
	JOBST	(T1)		;YES--SEE IF A JOB THERE
	JUMPGE	T1,RELPTY	;NO--RELEASE PTY
	TLNN	T1,JSTINP	;YES--SEE IF IN INPUT NEEDED STATE
	JRST	INTRPT		;NO--SEND ^C^C AT IT
	TLNE	T1,JSTMON	;YES--SEE IF ALREADY AT MONITOR LEVEL
	AOS	PSCRPT(D)	;YES--BUMP SCRIPT BEYOND ^C
	MOVEI	T1,P.FINT	;MARK THAT WE HAVE PROCESSED INTERRUPT
	ANDCAM	T1,PFLAGS(D)
	JRST	LINDON		;GO ALLOW INPUT

INTRPT:	TRO F,F.SSY2		;TIMED OUT. SET WOKEN UP FLAG
	MOVE T1,T		;RECORD DELAY IN INTERRUPT DUE TO POOR SCRIPT RESPONSE
	SUB T1,TINTR(D)
	ADDM T1,INPSKW(D)

	MOVE T1,TINTR(D)	;TOTAL RESPONSE TIME UP TO INTERRUPT POINT
	SUB T1,TSTLIN(D)
	ADDM T1,RESPON(D)
	MOVEM T,TSTLIN(D)	;SET TIME WE STARTED HERE FOR FUTURE MEASUREMENTS

	MOVEI T1,CONTC		;CONTROL C
	PUSHJ	P,SNDPTY	;SEND ONE TO JOB
	PUSHJ	P,SNDPTY	;SEND ANOTHER
	PUSHJ P,OUTMON
	PUSHJ P,OUTMON		;MONITOR CONTROL C'S IF PROCESS O
	PUSHJ P,CLOMON		;FLUSH OUT MONITOR BUFFER IN CASE MONITORING ON TTY

	TRNE	F,F.JST		;SEE IF WE HAVE JOBSTS
	JRST	INTRP1		;YES--SKIP KLUDGE
	DO	(SETSTS MONMOD+1)	;FORCE PTY STATUS TO MON MODE (PTY BUG!)
INTRP1:	DO	(OUTPUT)
	MOVSI T1,377777
	MOVEM T1,TINTR(D)	;SET INTERRUPT TIME TO INFINITY
	MOVEI T1,P.MSYN!P.FINT!P.NNEW
	ANDCAM T1,PFLAGS(D)	;CLEAR FLAG PTY DATA SEEN AFTER OUTPUT
	MOVEI T1,P.INT
	IORM T1,PFLAGS(D)	;SET FLAG THAT ^C^C'S DONE FOR LOG FILE
	AOS	PSCRPT(D)	;BUMP SCRIPT BEYOND ^C
	JRST RLOOP		;GO WAIT FOR RESPONSE TO ^C^C
	SUBTTL	COMMUNICATE WITH THE JOB
	;ROUTINE TO SEND ONE CHARACTER TO THE PTY
	;CALL MOVE T1,CHARACTER
	;     PUSHJ P,SNDPTY
	;USES NO ACS.  MAINTAINS CHARACTER COUNT.

SNDPTY:	AOS	NUMCHS(D)	;COUNT CHARACTERS SENT
SNDPTC:	SOSG	PTYOBF+2(D)	;COUNT PTY OUTPUT SPACE
	JRST	SNDPTB		;IF NO SPACE LEFT
	IDPB	T1,PTYOBF+1(D)	;STORE CHARACTER
	POPJ	P,		;RETURN

SNDPTB:	DO	(OUTPUT)	;IF FULL, SEND IT TO JOB AND PROCEED
	JRST	SNDPTC
	;SUBROUTINE TO GET PTY INPUT (TTY OUTPUT)

INPTY:	MOVEI T2,P.MSYN		;SUBROUTINE TO READ PTY.
	DO	(INPUT)		;DO INPUT UUO
	MOVE T3,PTYIBF+2(D)	;ADD COUNT TO TOTAL CHAR RECEIVED
	ADDM T3,NUMCHR(D)
	JUMPE T3,NULBUF		;IGNORE BUFFERS WITH ZERO WORD COUNT
	TRNE	F,F.ERR!F.WCH	;SEE IF ERROR MONITORING OR WATCHING REQUESTED
	JRST	INPTY3		;YES--MUST EXAMINE ALL OUTPUT

INPTY1:	SOSGE PTYIBF+2(D)	;NO. WE LOOK FOR NON NULL CHAR.
	JRST NULBUF		;NOT FOUND
	ILDB T1,PTYIBF+1(D)	;GET CHAR.
	JUMPE T1,INPTY1		;LOOP IF NULL

	IORM T2,PFLAGS(D)	;NON NULL SEEN. SET DATA SEEN AFTER OUTPUT FLAG
	POPJ P,			;RETURN

INPTY3:	MOVEI	T4,P.WCH
	TDNN	T4,PFLAGS(D)	;SEE IF WATCH THIS PROCESS
	JRST	INPTY1		;NO
				;YES,SO FALL INTO IMPMON


INPMON:	SOSGE PTYIBF+2(D)	;WE MONITOR
	JRST INPTY2		;DONE?
	ILDB T1,PTYIBF+1(D)	;NO. GET CHAR.
	JUMPE T1,INPMON		;EAT NULLS
	PUSHJ P,OUTMON		;MONITOR THE NON-NULL CHARACTER
	IORM T2,PFLAGS(D)
	CAIN	T1,RUBOUT	;SEE IF RUBOUT
	JRST	INPMON		;YES--DON'T AFFECT MONITORING
	TRNE	F,F.ERR		;IS ERROR MONITOR REQUESTED?
	PUSHJ	P,ERRMON	;YES--GO TO ERROR MONITOR
	JRST INPMON		;GO ON WITH NEXT CHARACTER


INPTY2:	TDNE T2,PFLAGS(D)	;DONE. DID WE SEE ANY NON-NULLS?
	JRST CLOMON		;YES GO FLUSH MONITOR BUFFER & RETURN


NULBUF:	MOVNS T3		;ALL NULLS. FIX UP COUNT TO WHAT IT WAS
	ADDM T3,NUMCHR(D)	;RESTORE T3 TO ZERO, NO CHARS WERE RECEIVED.
	MOVEI T3,0
	POPJ P,		;RETURN
	SUBTTL	TELETYPE I/O ROUTINES
	;SUBROUTINE TO GET "YES" OR "NO" ANSWER
	;CALL	PUSHJ P,ASKYNO
	;	NO RETURN
	;	YES RETURN

ASKYNO:	PUSHJ P,TTYIN
	PUSHJ P,GETWRD
	MOVEI T1,0
JUMPE	T3,YNOK		; <CR> MEANS NO
	CAMN T3,[SIXBIT /N/]
	JRST YNOK
	CAMN T3,[SIXBIT /NO/]
	JRST YNOK

	MOVEI T1,1
	CAMN T3,[SIXBIT /Y/]
	JRST YNOK
	CAMN T3,[SIXBIT /YES/]
	JRST YNOK

	OUTSTR	[ASCIZ /? Y or N, please
/]
	JRST ASKYNO

YNOK:	JUMPN T1,CPOPJ1
	POPJ P,
	;SUBROUTINE TO RETURN POSITIVE DECIMAL INTEGER
	;CALL	PUSHJ P,ASKDEC
	;	NON-SKIP RETURN IF NULL (DEFAULT)  T1=0
	;	SKIP RETURN NUMBER IN T1

ASKDEC:	PUSHJ P,TTYIN
	MOVEI T1,0
	ILDB T3,T2
	JUMPE T3,CPOPJ

ASKDE1:	CAIL T3,"0"
	CAILE T3,"9"
	JRST ASKDE2
	IMULI T1,^D10
	ADDI T1,-"0"(T3)
	ILDB	T3,T2
	JUMPN	T3,ASKDE1
	JRST	CPOPJ1

ASKDE2: OUTSTR	[ASCIZ /?Positive decimal numbers please
/]
	JRST ASKDEC



;SUBROUTINE TO GET AN OCTAL INTEGER
;MOVE T2, BYTE POINTER FOR INPUT
;PUSHJ P,GETOCT
;RETURN WITH FIELD IN T3
;BREAKS ARE ANY NON-OCTAL DIGIT, RETURNED IN T1

GETOCT:	SETZ	T3,
GETOC1:	ILDB	T1,T2		;GET NEXT CHAR
	CAIL	T1,"0"		;COMPARE IF OCTAL DIGIT
	CAILE	T1,"7"
	POPJ	P,		;NO--RETURN
	TLNE	T3,700000	;OK--CHECK FOR OVERFLOW
	POPJ	P,		;YES--RETURN
	ASH	T3,3		;MULT RESULT BY 8
	ADDI	T3,-"0"(T1)	;ADD IN THIS DIGIT
	JRST	GETOC1		;LOOP
	;SUBROUTINE TO RETURN DEVICE, FILE NAME & EXTENSION
	;SET UP DEFAULTS IN AC1,AC2, AC3
	;NON-SKIP RETURN IF NULL RESPONSE
	;UPON SKIP RETURN DEFAULTS OR VALUES IN AC1, AC2, AC3, AC4
	;AC1=FILE NAME, AC2=EXT, AC3=DEVICE, AC4=DIRECTORY

GETFIL:	SETZM	AC4		;CLEAR  DIRECTORY
	PUSHJ P,TTYIN		;GET TTY LINE
	PUSHJ P,GETWRD		;GET SIXBIT FIELD
GETFI0:	CAIE T1,":"		;BREAK ":"?
	JRST GETFI1		;NO
	JUMPE	T3,.+2		;NULL--LEAVE DEFAULT
	MOVE AC3,T3		;GET DEVICE
	PUSHJ P,GETWRD		;GET SIXBIT FIELD

GETFI1:	CAIN T1,"."		;WAS BREAK "." ?
	JRST	GETFI5		;YES,GOT FILENAME
	CAIN	T1,"["		;NO,WAS IT "[" THEN ?
	JRST	GETFI5		;YES,GOT FILENAME
	CAIE	T1,00		;WAS IT <LF> ?
	JRST	GETFI2		;NONE OF ABOVE,LEAVE DEFAULT
	JUMPE	T3,.+2		;SKIP IF NULL;LEAVE DEFAULT
	MOVE	AC1,T3		;YES,GET FILENAME AND RETURN
	JRST	GETFI3		;SKIP RETURN
GETFI5:	JUMPE	T3,.+2		;NULL--LEAVE DEFAULT
	MOVE AC1,T3		;SET FILE NAME
	PUSHJ P,GETWRD		;GET SIXBIT FIELD
	TRNE	T3,-1
	JRST	GETFIX
	HLLZ AC2,T3		;STORE EXT

GETFI2:	CAIE	T1,"["		;CHECK FOR DIRECTORY TYPED
	JRST	GETFI3		;NO--RETURN
	PUSHJ	P,GETOCT	;INPUT PROJECT NUMBER
	CAIN	T1,","		;MUST END WITH A COMMA
	CAILE	T3,377777	;MUST BE SMALL
	JRST	GETFIX		;NO--ERROR
	HRLZM	T3,AC4		;OK--SAVE
	PUSHJ	P,GETOCT	;INPUT PROGRAMMER NUMBER
	CAIN	T1,"]"		;MUST END WITH RIGHT BRACKET
	CAILE	T3,377777	;MUST BE SMALL
	JRST	GETFIX		;NO-- ERROR
	HRRM	T3,AC4		;OK--SAVE
	ILDB	T1,T2		;SUCK UP NEXT CHAR
GETFI3:	JUMPE	AC1,GETFIN	;FILE NAME IS REQUIRED IF DIRECTORY
GETFI4:	PUSHJ	P,ALPH
	JRST	CPOPJ1		;SKIP RETURN

GETFIX:	OUTSTR	[ASCIZ /?File format error--type dev:file.ext[p,pn]
/]
	JRST	GETFIL		;TRY AGAIN

GETFIN:	MOVE	T2,AC3		;NO FILE NAME--SEE IF DIRECTORY DEVICE
	DEVCHR	T2,		;ASK MONITOR
	TLNN	T2,DEVDIR
	JRST	GETFI4		;NO--LET IT PASS
	JRST	GETFIX		;YES--NAME REQUIRED
	;SUBROUTINE TO RETURN NEXT SIX BIT FIELD
	;MOVE T2, BYTE POINTER FOR INPUT
	;PUSH, P, GETWRD
	;RETURN WITH FIELD IN T3
	;BREAKS ARE NON-ALPHANUMERIC OR GT 6 CHARS

GETWRD:	MOVE T4,[POINT 6,T3]
	MOVEI T3,0

GETWR1:	ILDB T1,T2
	PUSHJ	P,ALPH		;GET ALPHANUMERIC
	POPJ	P,		;BREAK FOUND
	TRC T1,40
	TRNE T3,77
	POPJ	P,		;RETURN IF GT 6 CHARS
	IDPB T1,T4
	JRST GETWR1


;SUBROUTINE TO CHECK CHARACTER
;RETURNS IF NON-ALPHANUMERIC
;SKIP-RETURNS IF ALPHA-NUMERIC
;ENTER WITH CHARACTER IN T1
;DISTURBS NO REGISTER

ALPH:	CAIL	T1,"0"
	CAILE	T1,"Z"
	POPJ	P,
	CAILE	T1,"9"
	CAIL	T1,"A"
	JRST	CPOPJ1
	POPJ	P,
	;SUBROUTINE TO GET COMMAND LINE
	;CALL PUSHJ P, TTYIN
	;RETURNS ASCIZ STRING. BYTE POINTER IN T2
	;EATS TABS, SPACES, CR, BREAK IS LF, VT, FF, ^Z, ALT, OR 81 RESULTANT CHARS

TTYIN:	MOVE T2,[POINT 7,COMLIN]
	MOVEI	T3,20*5		;SET MAX LINE LENGTH

TTYIN1:	PUSHJ P,TTYGET
	JRST TTYIN2
	SOJL	T3,TTYIN2	;PROTECT LENGTH OF LINE
	IDPB T1,T2
	JRST TTYIN1

TTYIN2:	MOVEI T1,0
	IDPB T1,T2
	MOVE T2,[POINT 7,COMLIN]
	POPJ P,



	;SUBROUTINE TO GET NEXT TTY CHAR
	;CALL PUSH, P,TTYGET
	;     BREAK RETURN
	;     NO BREAK RETURN
	;EATS TABS, SPACES, CR, RUBOUT, BREAK IS LF

TTYGET: INCHWL	T1
	JUMPE T1,TTYGET
	CAIL T1,"a"	;LOWER CASE
	CAILE T1,"z"
	SKIPA
	SUBI T1,40
	CAIE T1,HT
	CAIN T1," "
	JRST TTYGET
	CAIE	T1,RUBOUT
	CAIN T1,CR
	JRST TTYGET
	CAIE	T1,CONTZ
	CAIN	T1,ALT33
	POPJ	P,
	CAIE	T1,ALT175
	CAIN	T1,ALT176
	POPJ	P,
	CAIL	T1,LF
	CAILE	T1,FF
CPOPJ1:	AOS (P)
CPOPJ:	POPJ P,
	;SUBROUTINE TO TYPE-OUT A SIXBIT WORD
	;ENTERRED WITH T2=WORD
	;USES T1, T2

TYPSX1:	LSHC	T1,6		;GET NEXT CHARACTER
	ADDI	T1,40		;CONVERT TO ASCII
	OUTCHR	T1		;SEND TO TTY

TYPSIX:	MOVEI	T1,0		;CLEAR CHARACTER
	JUMPN	T2,TYPSX1	;LOOP UNTIL REST IS BLANK
	POPJ	P,		;RETURN


	;TYPE CARRIAGE RETURN-LINE FEED

TYPCRL:	OUTSTR	[ASCIZ /
/]
	POPJ	P,


	;TYPE DECIMAL OR OCTAL NUMBER
	;NUMBER IN T1; USES T1, T2, T3

TYPDEC:	MOVEI	T3,^D10
	JRST	TYPRDX
TYPOCT:	MOVEI	T3,10

TYPRDX:	IDIV	T1,T3
	HRLM	T2,(P)
	SKIPE	T1
	PUSHJ	P,TYPRDX
	HLRZ	T1,(P)
	ADDI	T1,"0"
	OUTCHR	T1
	POPJ	P,
	;TYPE OUT CURRENT TIME AS HH:MM:SS (TRUNCATED)
	;PRESERVES T=TIME
	;USES T1, T2, T3, T4

TYPTIM:	MOVE	T1,T		;GET TIME
	IDIVI	T1,^D1000	;CONVERT TO SECONDS
	IDIVI	T1,^D3600	;GET HOURS
	JUMPE	T1,TYPTI1	;SKIP IF 0 HOURS
	PUSHJ	P,TYPTWO	;OUTPUT HOURS
	OUTSTR	[ASCIZ /:/]
TYPTI1:	MOVE	T1,T2		;RETRIEVE MIN/SEC
	IDIVI	T1,^D60		;GET MINUTES
	PUSHJ	P,TYPTWO	;OUTPUT MINUTES
	OUTSTR	[ASCIZ /:/]
	MOVE	T1,T2		;RETRIEVE SEC
				;FALL INTO TYPTWO TO OUTPUT SECONDS

	;TYPE TWO DECIMAL DIGITS FROM T1
	;USES T3, T4

TYPTWO:	MOVE	T3,T1		;GET NUMBER
	IDIVI	T3,^D10		;GET TENS
	ADDI	T3,"0"		;CONVERT TO ASCII
	OUTCHR	T3
	ADDI	T4,"0"		;CONVERT UNITS TO ASCII
	OUTCHR	T4
	POPJ	P,
	SUBTTL	INTERACTIVE OPERATOR HANDLING
OPER:
OPRET:	POPJ	P,	;TEMP**********
	SUBTTL	OUTPUT HEADERS
	;SEND TITLE LINE TO A FILE
	;CALL:	MOVEI	AC1,OUTCHAR ROUTINE
	;	PUSHJ	P,TITLE
	;USES AC2-4, T1-2

TITLE:	TRZ	F,F.LZR		;SUPPRESS LEADING ZEROES
	MOVEI	T2,[ASCIZ /	S I M U L A T E D   S Y S T E M   R U N

	Monitor: /]
	PUSHJ	P,LSTSTR
	MOVSI	T2,-5		;OUTPUT SYSTEM NAME
TITLE1:	MOVEI	T1,11
	HRLI	T1,(T2)
	GETTAB	T1,
	  MOVEI	T1,0
	MOVEM	T1,CONFIG(T2)
	AOBJN	T2,TITLE1
	MOVEI	T2,CONFIG
	PUSHJ	P,LSTSTR
	MOVEI	T2,[ASCIZ /
	Script: /]
	PUSHJ	P,LSTSTR
	MOVE	T2,NAME
	PUSHJ	P,LSTSIX	;OUTPUT SCRIPT NAME.EXT%VER
	MOVEI	T1,"."
	PUSHJ	P,(AC1)
	MOVE	T2,NAME+1
	PUSHJ	P,LSTSIX
	MOVEI	T1,"%"
	SKIPE	T2,NAME+2
	PUSHJ	P,(AC1)
	PUSHJ	P,LSTSIX
	MOVEI	T2,[ASCIZ /    Number of Jobs: /]
	PUSHJ	P,LSTSTR
	MOVEI	AC3,1(N)
	PUSHJ	P,LSTNUM
	MOVEI	T2,[ASCIZ /
	Date: /]
	PUSHJ	P,LSTSTR
	DATE	AC2,
	IDIVI	AC2,^D31
	ADDI	AC3,1
	PUSHJ	P,LSTNUM	;OUTPUT DAY
	IDIVI	AC2,^D12
	MOVEI	T2,[ASCIZ /-Jan/
		    ASCIZ /-Feb/
		    ASCIZ /-Mar/
		    ASCIZ /-Apr/
		    ASCIZ /-May/
		    ASCIZ /-Jun/
		    ASCIZ /-Jul/
		    ASCIZ /-Aug/
		    ASCIZ /-Sep/
		    ASCIZ /-Oct/
		    ASCIZ /-Nov/
		    ASCIZ /-Dec/] (AC3)
	PUSHJ	P,LSTSTR	;OUTPUT MONTH
	MOVEI	T1,"-"
	PUSHJ	P,(AC1)
	MOVEI	AC3,^D64(AC2)
	PUSHJ	P,LSTNUM	;OUTPUT YEAR

	MOVEI	T2,[ASCIZ /    Time: /]
	PUSHJ	P,LSTSTR
	MOVE	AC2,TSTART
IFN CYCLSW,<
	TRNE	F,F.CYC
	MSTIME	AC2,
>
	IDIVI	AC2,^D1000
	CAIL	AC3,^D500
	ADDI	AC2,1
	IDIVI	AC2,^D3600
	EXCH	AC2,AC3
	PUSHJ	P,LSTNUM	;OUTPUT HOURS
	TRO	F,F.LZR		;PRINT LEADING ZEROES
	MOVEI	T1,":"
	PUSHJ	P,(AC1)
	IDIVI	AC2,^D60
	EXCH	AC2,AC3
	PUSHJ	P,LSTNUM	;OUTPUT MINUTES
	MOVEI	T1,":"
	PUSHJ	P,(AC1)
	MOVE	AC3,AC2
	PUSHJ	P,LSTNUM	;OUTPUT SECONDS
	MOVEI	T2,[ASCIZ /

/]
				;FALL INTO LSTSTR

	;LIST STRING TERMINATED BY NULL
	;CALL:	MOVEI	AC1,OUTCHAR ROUTINE
	;	MOVEI	T2,STRING
	;	PUSHJ	P,LSTSTR
	;USES T1,T2

LSTSTR:	TLOA	T2,440700	;CONVERT TO POINTER
LSTST1:	PUSHJ	P,(AC1)		;OUTPUT CHARACTER
	ILDB	T1,T2		;FETCH NEXT CHARACTER
	JUMPN	T1,LSTST1	;LOOP TO END
	POPJ	P,


	;LIST A TWO DIGIT DECIMAL NUMBER--WITH OPTIONAL SUPPRESSION
	;CALL:	MOVEI	AC3,NUMBER (0-99)
	;	MOVEI	AC1,OUTCHAR ROUTINE
	;	PUSHJ	P,LSTNUM
	;USES AC3-4,T1

LSTNUM:	IDIVI	AC3,^D10	;SEPARATE DIGITS
	MOVEI	T1,"0"(AC3)	;GET TENS
	TRNN	F,F.LZR		;UNLESS LEADING ZEROES REQUESTED
	CAIE	T1,"0"		;SUPPRESS FIRST ZERO
	PUSHJ	P,(AC1)		;OUTPUT
	MOVEI	T1,"0"(AC4)	;GET UNITS
	PJRST	(AC1)		;OUTPUT AND RETURN


	;LIST SIXBIT WORD
	;CALL:	MOVEI	AC1,OUTCHAR ROUTINE
	;	MOVE	T2,SIXBIT WORD
	;	PUSHJ	P,LSTSIX
	;USES T1,T2

LSTSX1:	LSHC	T1,6		;GET NEXT CHARACTER
	ADDI	T1,40		;CONVERT TO ASCII
	PUSHJ	P,(AC1)		;SEND IT TO FILE

LSTSIX:	MOVEI	T1,0		;CLEAR CHARACTER
	JUMPN	T2,LSTSX1	;LOOP IF NOT DONE
	POPJ	P,		;RETURN
TITMSR:	ASCIZ /( * indicates job interrupted by ^C^C after timeout )
( + indicates response time may be lower than measured )

     Time  Job  Ch in  Out Buffers Cpu-time Response  Delay in    Out

/
SUBTTL	MONITOR PROCESSES
	;MONITOR PROCESSES ON A DEVICE
	;EACH LINE SENT OR RECIEVED IS PRECEEDED BY THE PROCESS NUMBER

	;CALL:	MOVIE	T1,CHAR
	;	PUSHJ	P,OUTMON
	;USES T1,T4		PREFIXES NEW LINES

	;CALL:	MOVEI	T4,CHAR
	;	PUSHJ	P,OUTMO2
	;PRESERVES ACS		SUPPRESSES EXTRA <CR>,<LF>

	;CALL:	MOVEI	T4,CHAR
	;	PUSHJ	P,OUTMOC
	;PRESERVES ACS		JUST SENDS

	;CALL:	MOVEI	T1,CHAR
	;	PUSHJ	P,OUTMOT
	;SAME AS OUTMOC EXCEPT FROM T1, USES T4

OUTMON:	TRNN	F,F.WCH		;RETURN IF NOT WATCHING AT ALL
	POPJ	P,
	MOVEI	T4,P.WCH	
	TDNN	T4,PFLAGS(D)	;RETURN IF NOT WATCHING THIS PROCESS
	POPJ	P,
	PUSH	P,T1		;PRESERVE CHARACTER
	CAME	I,LASMON	;SEE IF SAME PROCESS AS LAST MONITORED
	PUSHJ	P,OUTMO6	;NO--PRETEND IT IS A NEW LINE
	POP	P,T1		;RESTORE CHARACTER
	MOVEM	I,LASMON	;REMEMBER THIS MONITORING

	CAIL	T1,LF		;SEE IF AT END OF A LINE YET
	CAILE	T1,FF		;LF, VT, FF
	JRST	.+2		;NO
	JRST	OUTMO6		;YES--SEND LINE FEED
	MOVEI	T4,P.NNEW	;SEE IF AT START OF A LINE
	AND	T4,PFLAGS(D)
	JUMPN	T4,OUTMO7	;NO--JUST TYPE CHARACTER
	MOVE	T4,NOWATC	;YES--SEE IF WATCHING MORE THAN ONE
	TRNN	T4,-2
	JRST	OUTMO7		;NO--JUST TYPE CHARACTER

	PUSH	P,T3
	MOVE	T3,I		;INDENT AS FCTN OF PROCESS
	LSH	T3,1		;2*I SPACES
	TRNE	F,F.TTMN	;EXCEPT IF TTY MONITOR
	MOVEI	T3,0		;DON'T
	MOVEI	T4," "
	PUSHJ	P,OUTMO2
	SOJGE	T3,.-1
	POP	P,T3		;RESTORE 
	MOVEI	T4,"("		;YES--PRECEED LINE BY (NN)
	PUSHJ	P,OUTMO2
	MOVEI	T4,^D10		;CHECK MAX NUMBER
	CAMLE	T4,NOWATC
	JRST	OUTMO9
	MOVEI	T4,"0"
	CAIL	I,^D9
	MOVEI	T4,"1"
	PUSHJ	P,OUTMO2
OUTMO9:	MOVEI	T4,"1"(I)
	CAILE	T4,"9"
	SUBI	T4,^D10
	PUSHJ	P,OUTMO2
	MOVEI	T4,")"
	PUSHJ	P,OUTMO2
	MOVEI	T4," "
	PUSHJ	P,OUTMO2
OUTMO7:	MOVEI	T4,P.NNEW	;FLAG MIDDLE OF LINE
	ORM	T4,PFLAGS(D)
	MOVE T4,T1		;COPY CHAR

	CAIGE T4,40		;CONTROL?
	JRST OUTMO1		;YES

	CAIE T4,ALT175		;NO. ALTMODES?
	CAIN T4,ALT176
OUTMO5:	MOVEI T4,"$"		;YES. PICK UP DOLLAR SIGN
	JRST OUTMO2		;OUTPUT THE CHAR

OUTMO1:	CAIE	T4,BEL
	CAIN T4,HT		;OK TO OUTPUT TAB,
	JRST OUTMO2
	CAIN T4,CR		;CARRIAGE RETURN
	JRST OUTM10
	CAIN T4,ALT33		;IS IT ALTMODE?
	JRST OUTMO5		;IF SO, GO SEND "$"

	PUSH P,T4		;SAVE CHAR
	MOVEI T4,"^"		;OUTPUT "^"
	PUSHJ P,OUTMO2		;RETURN CHAR
	POP P,T4		;MAKE PRINTING
	TRC T4,100
OUTMO2:	TRNN F,F.WCH		;OUTPUT CHAR. IS WATCHING ENABLED AT ALL ?
	POPJ P,			;NO, RETURN
	PUSH	P,T1		;SAVE T1
	MOVEI	T1,P.WCH
	TDNN	T1,PFLAGS(D)	;SEE IF WATCHING THIS PROCESS
	JRST	T1POP		;NO
	POP	P,T1		;YES,RESTORE T1 AND PROCEED
	CAIL	T4,LF		;SEE IF NEW LINE
	CAILE	T4,CR
	JRST	OUTMOC		;NO
	CAIN	T4,CR		;YES--SEE IF CRET
	TRNN	F,F.MCR		;YES--CHECK IF CRET LAST
	TRNE	F,F.MLF		;NO--SEE IF LF LAST
	POPJ	P,		;YES--IGNORE
OUTMOC:	SOSG MONBUF+2		;YES, BUFFER SPACE?
	JRST OUTMO4		;NO
OUTMO3:	IDPB T4,MONBUF+1	;STORE CHAR
	TRZ	F,F.MCR!F.MLF
	CAIN	T4,CR		;SEE IF CRET SENT
	TRO	F,F.MCR
	CAIN	T4,LF		;SEE IF LFEED SENT
	TRO	F,F.MLF
	POPJ P,			;RETURN

OUTMO4:	OUT MONCHN,		;DO OUTPUT ON MONITOR DEVICE
	JRST OUTMO3		;OK
	JRST MONERR		;ERROR

	IFN	DEBUG,<
OUTM10:	TRNN	F,F.DBG		;SEE IF DEBUG MODE
	JRST	OUTMO8		;NO--JUST SEND <CR>
				;YES--SEND <CR><LF>
>

OUTMO6:	MOVEI	T4,CR		;GIVE A FREE CARRIAGE RETURN
	PUSHJ	P,OUTMO2
	MOVEI	T1,LF		;ISSUE AS A LINE FEED

	IFE	DEBUG,<OUTM10:>
OUTMO8:	MOVEI	T4,P.NNEW	;NEW LINE--SET FLAG
	ANDCAM	T4,PFLAGS(D)
	MOVE	T4,T1		;RESTORE CHARACTER
	JRST	OUTMO2		;GO OUTPUT IT


OUTMOT:	MOVE	T4,T1
	PJRST	OUTMOC

T1POP:	POP	P,T1		;RESTORE T1
	POPJ	P,		;RETURN
CLOMON:	CAML	I,NOWATC	;FLUSH BUFFERS IF PROCESS MONITORED
	POPJ	P,
	TRC F,F.WCH+F.TTMN	;IF WE ARE MONITORING AND IF DEVICE TTY IS A TTY
	TRCN F,F.WCH+F.TTMN
	OUT MONCHN,
	POPJ P,

MONERR: OUTSTR	[ASCIZ /?Error on device. Monitoring stopped
/]
	CLOSE MONCHN,		;CLOSE OUT MONITORING.
	TRZ F,F.WCH		;CLEAR FLAG TO SURPRESS FUTURE MONITORING
	POPJ P,			;RETURN


	;OUTPUT PTY STATUS
	;ENTERRED WITH PTY (JOBSTS) STATUS IN T1
	;USES T3,T4
	;IF MONITORING AND STATUS CHANGED, THEN SEND "[\NN\]"
	;WHERE NN IS THE HIGH SIXBITS FROM JOBSTS UUO

	IFN	DEBUG,<
OUTSTS:	MOVEI	T3,P.WCH
	TDNN	T3,PFLAGS(D)	;SEE IF WATCHING THIS PROCESS
	POPJ	P,		;NO,SO RETURN
	TRC	F,F.WCH!F.DBG
	TRCN	F,F.WCH!F.DBG	;SEE IF MONITORING AND DEBUGGING
	CAMN	T1,JOBSB(I)	;SEE IF DIFFERENT
	POPJ	P,		;RETURN IF NO TO EITHER
	PUSH	P,T1		;SAVE
	MOVEI	T1,"["		;SEND PREFIX
	PUSHJ	P,OUTMON
	MOVEI	T1,"\"
	PUSHJ	P,OUTMON
	LDB	T1,[POINT 3,(P),2] ;SEND STATUS BITS
	ADDI	T1,"0"
	PUSHJ	P,OUTMON
	LDB	T1,[POINT 3,(P),5]
	ADDI	T1,"0"
	PUSHJ	P,OUTMON
	MOVEI	T1,"\"		;SEND SUFFIX
	PUSHJ	P,OUTMON
	MOVEI	T1,"]"
	PUSHJ	P,OUTMON
	POP	P,T1		;RESTORE
	POPJ	P,
>
	SUBTTL	MONITOR JOB OUTPUT FOR ERRORS (LOG ON TTY)
	;SUBROUTINE TO MONITOR OUTPUT FOR ERRORS
	;ENTERRED FOR EACH NON-NULL, NON-RUBOUT CHARACTER RECIEVED
	;T1=CHARACTER,  ALTERS  T4
	;AN ERROR LINE IS DEFINED AS A LINE WHICH STARTS WITH
	;A "?".  START OF LINE IS THE FIRST NON-NULL OR RUBOUT
	;FOLLOWING A LF,VT,FF, OR TTY INPUT

ERRMON:	MOVE	T4,PFLAGS(D)	;GET PROCESS FLAGS
	CAIL	T1,LF		;CHECK FOR END-OF-LINE
	CAILE	T1,FF
	JRST	ERRMCH		;NO--PROCESS CHARACTER
	TRZE	T4,P.ERR	;YES--CLEAR ERROR LINE FLAG
	OUTCHR	[LF]	;IF END OF ERROR LINE, SEND LINE-FEED
	TRZ	T4,P.NFIR	;FLAG FOR START OF LINE
ERRMRT:	MOVEM	T4,PFLAGS(D)	;RESTORE FLAGS TO MEMORY
	POPJ	P,		;RETURN TO CALLER

ERRMCH:	TROE	T4,P.NFIR	;SEE IF FIRST CHARACTER--FLAG SUBSEQUENT
	JRST	ERRMNF		;NOT FIRST--SEE IF ALREADY AN ERROR LINE
	CAIN	T1,"?"		;FIRST--SEE IF ERROR LINE
	TRNE	T4,P.QOK	;YES--SEE IF ? IS UNEXPECTED
	JRST	ERRMRT		;NO--RESTORE FLAGS AND RETURN
	SOSL	QCOUNT(D)	;YES--SEE IF ANY PREDICTED
	JRST	ERRMRT		;YES--RESTORE FLAGS AND RETURN
	TRO	T4,P.ERR	;NO--FLAG THE LINE AS AN ERROR
	MOVEM	T4,PFLAGS(D)	;RESTORE FLAGS
	OUTSTR	[ASCIZ /?(/] ;TELL OPERATOR

ERRMPF:	MOVEI	T4,"1"(I)	;GET PROCESS NUMBER (1-14)
	CAIG	T4,"9"		;CHECK FOR TWO DIGITS NEEDED
	JRST	ERRMNE		;NO--JUST ONE DIGIT
	SUBI	T4,^D10		;YES--DECREASE SECOND DIGIT
	OUTCHR	["1"]	;SEND THE 10
ERRMNE:	OUTCHR	T4	;SEND THE UNITS DIGIT
	OUTSTR	[ASCIZ /) /] ;SEND REST OF PREFIX
	POPJ	P,		;RETURN

ERRMNF:	TRNE	T4,P.ERR	;SEE IF ERROR LINE
	OUTCHR	T1	;SEND CHARACTER
	POPJ	P,		;RETURN
	SUBTTL	LOG RESULTS
	;SUBROUTINE TO SUM UP 1 LINE OF LOG FILE

LOGRES:	MOVEI T1," "		;BLANK OR * IF PROCESS WAS INTERRUPTED
	MOVEI T2,P.INT
	TDNE T2,PFLAGS(D)
	MOVEI T1,"*"
	PUSHJ P,OUTLOG

	MOVEI T1," "		;+  IF PT WAKE MAY HAVE BEEN LOST
	MOVEI T2,P.SSY
	TDNE T2,PFLAGS(D)
	MOVEI T1,"+"
	PUSHJ P,OUTLOG

	MOVE T1,T		;TIME
	PUSHJ P,PSEC

	MOVEI	T1,1(I)		;PROCESS NUMBER
	MOVEI T3,2
	PUSHJ P,PINTEG

	MOVE T1,NUMCHS(D)
	MOVEI T3,3		;NUMBER CHARS WE SENT
	PUSHJ P,PINTEG

	MOVE T1,NUMCHR(D)	;NUMBER CHARS WE GOT BACK
	MOVEI T3,5
	PUSHJ P,PINTEG

	MOVE T1,NUMOUT(D)	;NUMBER OF BUFFERS
	MOVEI T3,4
	PUSHJ P,PINTEG
	
	MOVE	T1,TCPU(D)	;CPU TIME FOR THE LINE
	PUSHJ	P,PSEC

	MOVE T1,RESPON(D)	;RESPONSE TIME
	PUSHJ P,PSEC

	MOVE T1,INPSKW(D)	;DELAY IN OUR SENDING
	PUSHJ P,PSEC

	MOVE T1,OUTSKW(D)	;DELAY IN OUR OUTPUT
	PUSHJ P,PSEC

	MOVEI T1,CR		;CR LF
	PUSHJ P,OUTLOG
	MOVEI T1,LF
	JRST OUTLOG		;RETURN
	;PRINT INTEGER WITH LEADING BLANKS, PLUS 2 SPACES

PINTEG:	PUSHJ P,DECPNB
	JRST TWOSPC


	;PRINT F4.3 FORMAT TIME IN SECONDS

PSEC:	IDIVI T1,^D1000		;GET SEC, MEC
	PUSH P,T2		;SAVE MS
	MOVEI T3,4		;SECONDS, LEADING BLANKS
	PUSHJ P,DECPNB
	MOVEI T1,"."		;"."
	PUSHJ P,OUTLOG		;RESTORE MS
	POP P,T1
	MOVEI T3,3		;MILLISECONDS, LEADING ZEROS
	PUSHJ P,DECPNZ

	;PRINT TWO SPACES

TWOSPC:	MOVEI T1," "
	PUSHJ P,OUTLOG
	JRST OUTLOG

IFN CYCLSW,<
;SUBROUTINE TO SLEEP UNTIL NEXT TIME MARK:  0 MOD INTERVAL
;CALL:	PUSHJ	P,DOZE
;READS INTERVAL, USES T1,T2,T3.

DOZE:	MSTIME	T1,		;GET THE TIME
	IDIV	T1,INTERV	;COUNT INTERVALS AND GET RESIDUE
	SUB	T2,INTERV	;SUBTRACT RESIDUE
	MOVN	T1,T2		;MAKE WAIT POSITIVE
	HIBER	T1,
	SKIPA			;HIBER NOT WORKING
	POPJ	P,		;RETURN
	IDIVI	T1,^D60*^D1000	;MILLISEC IN ONE MINUTE
	JUMPE	T1,LNAP		;TO LNAP IF NOT A MINUTE
	MOVEI	T1,^D56		;SET 56 SECONDS IN AC
	SLEEP	T1,		;SLEEP ALMOST ONE MINUTE
	JRST	DOZE		;LOOP BACK
LNAP:	IMULI	T2,^D1000 	;CONVERT TO MICROSEC
	IDIV	T2,USJIF	;CONVERT TO JIFFIES
	TRO	T2,3		;ROUND UP TO
	ADDI	T2,1		;MULTIPLE OF 4
	ASH	T2,-2		;DIVIDE BY 4
	IMUL	T2,MAGIC	;DIV BY MAGIC NUMBER
	SLEEP	T2,		;SLEEP A FEW MS
	POPJ	P,

>
	;ROUTINES TO PRINT DECIMAL INTEGERS
	;CALL MOVE T1, VALUE
	;     MOVE T3, NUMBER OF DIGITS
	;     PUSHJ P,DECPNZ OR DECPNB
	;DECPNZ IS FOR LEADING ZEROS, DECPNB LEADING BLANKS

DECPNZ:	TROA F,F.LZR		;SET FLAG TO PRINT ZEROS

DECPNB:	TRZ F,F.LZR		;CLEAR FLAG TO PRINT ZEROS

	IDIVI T1,^D10		;1ST DIVIDE BY 10
	TROA T2,200		;FOOL 1ST CHAR INTO BEING FUNNY "0"

DECPNT:	IDIVI T1,^D10		;DIVIDE BY 10
	HRLM T2,(P)		;SAVE RESULTS ON PDL
	SOJLE T3,DECPN1
	PUSHJ P,DECPNT		;RECURR UNTIL FIELD FULL
DECPN1:	HLRZ T1,(P)		;PICK UP CHAR FROM PDL
	JUMPE T1,DECPN2		;ZERO?
	TROA F,F.LZR		;NO, SET FLAG TO PRINT ZEROS
DECPN2:	TRNE F,F.LZR		;ZERO? ADD IN SPACE OR "0" APPROPRIATELY
	ADDI T1,"0"-" "
	ADDI T1," "


	;SUBROUTINE TO OUTPUT 1 CHAR ON LOG FILE
	;CALL	MOVE T1,CHARACTER
	;	PUSHJ P,OUTLOG

OUTLOG:	TRNN F,F.RSP		;RETURN IF LOGGING NOT ENABLED
	POPJ P,
	PUSH	P,T2		;SAVE T2
	MOVEI	T2,P.RSP
	TDNN	T2,PFLAGS(D)	;SEE IF RESP TIME FOR THIS PROCESS
	JRST	T2POP		;NO,SO RESTORE T2 AND RETURN
	POP	P,T2		;RESTORE T2 AND PROCEED
SNEAK:				;THIS ENTRY POINT IS USED ONLY BY TFUDG1 TO PUT TITLE ON RSP FILE
				;THIS SHOULD NOT BE USED ANYWHERE ELSE IN THE PROGRAM
	SOSG LOGBUF+2		;SPACE?
	JRST OUTLO2		;DO OUTPUT
OUTLO1:	IDPB T1,LOGBUF+1	;STORE CHAR
	POPJ P,			;RETURN

OUTLO2:	OUT LOGCHN,		;DO OUTPUT
	JRST OUTLO1		;OK, SO STORE CHAR

	OUTSTR	[ASCIZ /?Error on log device. Logging stopped.
/]
	CLOSE LOGCHN,		;CLOSE LOG CHANNEL IF POSSIBLE
	TRZ F,F.RSP		;INHIBIT FURTHER LOGGING
	POPJ P,			;RETURN

T2POP:	POP	P,T2		;RESTORE T2
	POPJ	P,		;RETURN


	;SUBROUTINE TO OUTPUT A DECIMAL NUMBER
	;BETWEEN 0 AND 99
	;CALL	MOVE	T1,VALUE
	;	PUSHJ	P,DECOUT
	;USES T1 AND T2

DECOUT:	CAIGE	T1,12		;IS NUMBER .GE. 10
	JRST	ONED		;NO, SO ONLY ONE DIGIT
	IDIVI	T1,12		;DIVIDE BY 10
	ADDI	T1,"0"		;MAKE CHARACTER
	OUTCHR	T1		;OUTPUT
	MOVE	T1,T2
ONED:	ADDI	T1,"0"		;MAKE CHARACTER
	OUTCHR	T1
	POPJ	P,

WRITE::

	JSP	12,.ENT.1			;00000		EXTERNAL
	MOVE	04,-3($F)			;00001	0034	FORMAL
	HLRZ	05,DSKI.G+4(04)			;00002	
	SOSLE	06,2(05)			;00003	
	JRST	$S,L.1				;00004	
	LSH	04,27				;00005	
	ADD	04,DSKI.L+0			;00006	
	MOVE	17,4				;00007	
	MOVEI	$V,1				;00010	
	XCT	$S,17				;00011	
	SETZ	$V,0				;00012	
;BLISS-10 3(43)	6/14/73 15:54.15		SCRIO.BLI		PAGE 1-2

	TRNN	$V,1				;00013	0035
	JRST	$S,L.1				;00014	
	SETZ	$V,0				;00015	
	JRST	$S,L.2				;00016	
L.1:	MOVE	$V,-3($F)			;00017	0037	FORMAL
	HLRZ	10,DSKI.G+4($V)			;00020	
	MOVE	11,-2($F)			;00021		FORMAL
	IDPB	11,1(10)			;00022	
	MOVEI	$V,1				;00023	0040
L.2:	JRST	$S,.EXT.1			;00024		EXTERNAL

READ::

	JSP	12,.ENT.1			;00000		EXTERNAL
	MOVE	04,-2($F)			;00001	0046	FORMAL
	HRRZ	05,DSKI.G+4(04)			;00002	
	SOSLE	06,2(05)			;00003	
	JRST	$S,L.3				;00004	
	LSH	04,27				;00005	0050
	ADD	04,DSKI.L+1			;00006	
	MOVE	17,4				;00007	
	MOVEI	$V,1				;00010	
	XCT	$S,17				;00011	
	SETZ	$V,0				;00012	
	TRNN	$V,1				;00013	0051
	JRST	$S,L.3				;00014	
	MOVE	10,-2($F)			;00015		FORMAL
	LSH	10,27				;00016	
	ADD	10,DSKI.L+2			;00017	
	MOVE	17,10				;00020	
	MOVEI	$V,1				;00021	
	XCT	$S,17				;00022	
	SETZ	$V,0				;00023	
	TRNN	$V,1				;00024	0052
	JRST	$S,L.4				;00025	
	SETO	$V,0				;00026	
	JRST	$S,L.5				;00027	
L.4:	MOVNI	$V,2				;00030	
	JRST	$S,L.5				;00031	0055
L.3:	MOVE	$V,-2($F)			;00032	0057	FORMAL
	HRRZ	10,DSKI.G+4($V)			;00033	
	ILDB	11,1(10)			;00034	
;BLISS-10 3(43)	6/14/73 15:54.16		SCRIO.BLI		PAGE 1-3

	MOVE	$V,11				;00035	0060
L.5:	JRST	$S,.EXT.1			;00036		EXTERNAL


;	0061    GLOBAL ROUTINE OUTSA(Z)=TTCALL(3,.Z);

OUTSA::

	JSP	12,.ENT.0			;00000		EXTERNAL
	MOVE	04,-2($F)			;00001		FORMAL
	TTCALL	$V,0(04)			;00002	
	JRST	$S,.EXT.0			;00003	0062	EXTERNAL


;	0062    GLOBAL ROUTINE OPEN(CHNL,STATUS,LDEV,BUF)=(BUFH[.CHNL]_.BUF;EXECUTE(MAKEOP(#50,.CHNL,STATUS<0,0>)));

OPEN::

	JSP	12,.ENT.1			;00000		EXTERNAL
	MOVE	04,-5($F)			;00001		FORMAL
	MOVE	05,-2($F)			;00002		FORMAL
	MOVEM	05,DSKI.G+4(04)			;00003	
	LSH	04,27				;00004	
	ADD	04,DSKI.L+3			;00005	
	ADDI	04,-4($F)			;00006		FORMAL
	MOVE	17,4				;00007	
	MOVEI	$V,1				;00010	
	XCT	$S,17				;00011	
	SETZ	$V,0				;00012	
	JRST	$S,.EXT.1			;00013	0063	EXTERNAL


;	0063    GLOBAL ROUTINE LOOKUP(CHNL,HEAD)=EXECUTE(MAKEOP(#76,.CHNL,HEAD<0,0,0,1>));

LOOKUP::

	JSP	12,.ENT.1			;00000		EXTERNAL
	MOVE	04,-3($F)			;00001		FORMAL
	LSH	04,27				;00002	
	HRRZI	05,-2($F)			;00003		FORMAL
	HRLI	05,20				;00004	
	ADD	04,5				;00005	
	ADD	04,DSKI.L+4			;00006	
	MOVE	17,4				;00007	
	MOVEI	$V,1				;00010	
	XCT	$S,17				;00011	
	SETZ	$V,0				;00012	
	JRST	$S,.EXT.1			;00013	0064	EXTERNAL


;	0064    GLOBAL ROUTINE ENTER(CHNL,HEAD)=EXECUTE(MAKEOP(#77,.CHNL,HEAD<0,0,0,1>));

ENTER::

	JSP	12,.ENT.1			;00000		EXTERNAL
	MOVE	04,-3($F)			;00001		FORMAL
	LSH	04,27				;00002	
;BLISS-10 3(43)	6/14/73 15:54.17		SCRIO.BLI		PAGE 1-4

	HRRZI	05,-2($F)			;00003		FORMAL
	HRLI	05,20				;00004	
	ADD	04,5				;00005	
	ADD	04,DSKI.L+5			;00006	
	MOVE	17,4				;00007	
	MOVEI	$V,1				;00010	
	XCT	$S,17				;00011	
	SETZ	$V,0				;00012	
	JRST	$S,.EXT.1			;00013	0065	EXTERNAL


;	0065    GLOBAL ROUTINE CLOSE(CHNL)=(EXECUTE(MAKEOP(#70,.CHNL,0));EXECUTE(MAKEOP(#71,.CHNL,0)));

CLOSE::

	JSP	12,.ENT.1			;00000		EXTERNAL
	MOVE	04,-2($F)			;00001		FORMAL
	LSH	04,27				;00002	
	ADD	04,DSKI.L+6			;00003	
	MOVE	17,4				;00004	
	MOVEI	$V,1				;00005	
	XCT	$S,17				;00006	
	SETZ	$V,0				;00007	
	MOVE	05,-2($F)			;00010		FORMAL
	LSH	05,27				;00011	
	ADD	05,DSKI.L+7			;00012	
	MOVE	17,5				;00013	
	MOVEI	$V,1				;00014	
	XCT	$S,17				;00015	
	SETZ	$V,0				;00016	
	JRST	$S,.EXT.1			;00017	0066	EXTERNAL


;	0066    GLOBAL ROUTINE USETI(CHNL,BNO)=(EXECUTE(MAKEOP(#74,.CHNL,BNO<0,0,0,1>)));

USETI::

	JSP	12,.ENT.1			;00000		EXTERNAL
	MOVE	04,-3($F)			;00001		FORMAL
	LSH	04,27				;00002	
	HRRZI	05,-2($F)			;00003		FORMAL
	HRLI	05,20				;00004	
	ADD	04,5				;00005	
	ADD	04,DSKI.L+10			;00006	
	MOVE	17,4				;00007	
	MOVEI	$V,1				;00010	
	XCT	$S,17				;00011	
	SETZ	$V,0				;00012	
	JRST	$S,.EXT.1			;00013	0067	EXTERNAL


;	0067    GLOBAL ROUTINE USETO(CHNL,BNO)=(EXECUTE(MAKEOP(#75,.CHNL,BNO<0,0,0,1>)));
;	0070    
;BLISS-10 3(43)	6/14/73 15:54.18		SCRIO.BLI		PAGE 2-1

;	0071    

USETO::

	JSP	12,.ENT.1			;00000		EXTERNAL
	MOVE	04,-3($F)			;00001		FORMAL
	LSH	04,27				;00002	
	HRRZI	05,-2($F)			;00003		FORMAL
	HRLI	05,20				;00004	
	ADD	04,5				;00005	
	ADD	04,DSKI.L+11			;00006	
	MOVE	17,4				;00007	
	MOVEI	$V,1				;00010	
	XCT	$S,17				;00011	
	SETZ	$V,0				;00012	
	JRST	$S,.EXT.1			;00013	0070	EXTERNAL

;	0072    GLOBAL ROUTINE FILEAPPEND(TOFILE,FROMFILE,INCHNL,OUTCHNL)=
;	0073    BEGIN
;	0074    %<
;	0075    	THIS ROUTINE APPENDS THE FILE POINTED TO BY .FROMFILE
;	0076    	AT THE END OF THE FILE POINTED TO BY .TOFILE.
;	0077    	IT USES .INCHNL AND .OUTCHNL WHICH ARE SUPPLIED BY
;	0100    	THE CALLING PROGRAM IN ORDER TO AVOID CLASHES !
;	0101    
;	0102    >%
;	0103    
;	0104    
;	0105    LOCAL NAMETO[4],NAMEFROM[4],BLKPNTR,OBUFH[3],IBUFH[3];
;	0106    BIND
;	0107    OUTBUF=#65,
;	0110    RENAMEOP=#55,		!OP CODE FOR RENAME
;	0111    EOF=-1,			! READ RETURNS -1 ON EOF
;	0112    BLKSIZE=128,		! 128 WORDS IN A BLOCK
;	0113    TEMP=VREG,		! VALUE IS RETURNED IN VREG
;	0114    ASCIILINE=1;		! ASCII LINE MODE
;	0115    
;	0116    MACRO SETUPNAME(NAME,PNTR)=
;	0117    BEGIN
;	0120    	REGISTER QQ;
;	0121    	QQ<LEFTHALF>_PNTR<0,0>;
;	0122    	QQ<RIGHTHALF>_NAME<0,0>;
;	0123    	BLT(QQ,(NAME+3));
;	0124    END $,
;	0125    
;	0126    EGGSIT=CALLI(0,#12) $,	! EXIT FROM THE PROGRAM
;	0127    
;	0130    POSTVLH(Z)=(REGISTER QQW;
;	0131    	    QQW_-Z;
;	0132    	    HLRZS(QQW,QQW);
;	0133    	    .QQW
;	0134    	   ) $;		! THIS MACRO RETURNS THE POSITIVE OF THE LEFT HALF
;	0135    
;	0136    
;	0137    
;	0140    SETUPNAME(NAMETO,.TOFILE);	! SET UP THE BLOCK REQUIRED BY LOOKUP
;BLISS-10 3(43)	6/14/73 15:54.20		SCRIO.BLI		PAGE 2-2

;	0141    IF NOT OPEN(.OUTCHNL,ASCIILINE,SIXBIT 'DSK',OBUFH<0,0>^18+IBUFH<0,0>)
;	0142    	THEN ( MSG('CANNOT OPEN "TO" FILE ');EGGSIT);
;	0143    
;	0144    
;	0145    IF NOT LOOKUP(.OUTCHNL,NAMETO)
;	0146    	THEN  BEGIN		! "TO" FILE DOESN'T EXIST.
;	0147    				! SO JUST RENAME "FROM" FILE
;	0150    		SETUPNAME(NAMETO,.TOFILE);
;	0151    		SETUPNAME(NAMEFROM,.FROMFILE);
;	0152    		IF NOT LOOKUP(.OUTCHNL,NAMEFROM)
;	0153    		   THEN ( MSG('FILE "FROM" ALSO DOESN"T EXIST');
;	0154    			  EGGSIT
;	0155    			);
;	0156    		EXECUTE(MAKEOP(RENAMEOP,.OUTCHNL,NAMETO<0,0>));
;	0157    	      END
;	0160    	ELSE  BEGIN
;	0161    		BLKPNTR_(IF .(NAMETO+3) LEQ 0
;	0162    			   THEN POSTVLH(.(NAMETO+3))/BLKSIZE+1
;	0163    			   ELSE  .(NAMETO+3)<LEFTHALF>
;	0164    		        );
;	0165    		USETI(.OUTCHNL,.BLKPNTR);
;	0166    		SETUPNAME(NAMETO,.TOFILE);
;	0167    		IF NOT ENTER(.OUTCHNL,NAMETO)
;	0170    		   THEN (MSG('CANNOT ENTER "TO" FILE');EGGSIT);
;	0171    		USETO(.OUTCHNL,.BLKPNTR);
;	0172    		READ(.OUTCHNL) ;	! DO A READ TO POSITION FILE FOR USETO
;	0173    
;	0174    		SETUPNAME(NAMEFROM,.FROMFILE);
;	0175    		IF NOT OPEN(.INCHNL,ASCIILINE,SIXBIT 'DSK',IBUFH<0,0>)
;	0176    		   THEN (MSG('CANNOT OPEN "FROM" FILE');EGGSIT);
;	0177    		IF NOT LOOKUP(.INCHNL,NAMEFROM)
;	0200    		   THEN (MSG('CANNOT LOOKUP "FROM" FILE');EGGSIT);
;	0201    		WHILE (TEMP_READ(.INCHNL)) NEQ EOF
;	0202    		  DO  WRITE(.OUTCHNL,.TEMP);
;	0203    	      END;
;	0204    CLOSE(.OUTCHNL);
;	0205    CLOSE(.INCHNL);
;	0206    END;

FILEAPPEND::

	JSP	12,.ENT.1			;00000		EXTERNAL
	ADD	$S,DSKI.L+12			;00001	0074
	HRL	17,-5($F)			;00002	0106	FORMAL
	HRRI	17,2($F)			;00003		LOCAL
	BLT	17,5($F)			;00004		LOCAL
	PUSH	$S,-2($F)			;00005	0142	FORMAL
	PUSH	$S,DSKI.L+13			;00006	
	PUSH	$S,DSKI.L+14			;00007	
	HRLZI	$V,13($F)			;00010	0143	LOCAL
	ADDI	$V,16($F)			;00011		LOCAL
	PUSH	$S,3				;00012	
	PUSHJ	$S,OPEN				;00013	
	SUB	$S,DSKI.L+15			;00014	
	TRNE	$V,1				;00015	
	JRST	$S,L.6				;00016	
	PUSH	$S,DSKI.C+0			;00017	
	PUSHJ	$S,OUTSA			;00020	
;BLISS-10 3(43)	6/14/73 22:10.52		SCRIO.BLI		PAGE 2-3

	SUB	$S,DSKI.L+16			;00021	
	CALLI 	$S,12				;00022	
	JRST	$S,L.6				;00023	0144
L.6:	PUSH	$S,-2($F)			;00024		FORMAL
	HRRZI	04,2($F)			;00025	0147	LOCAL
	HRLI	04,4400				;00026	
	PUSH	$S,4				;00027	
	PUSHJ	$S,LOOKUP			;00030	
	SUB	$S,DSKI.L+17			;00031	
	TRNE	$V,1				;00032	
	JRST	$S,L.7				;00033	
	HRL	17,-5($F)			;00034	0150	FORMAL
	HRRI	17,2($F)			;00035		LOCAL
	BLT	17,5($F)			;00036		LOCAL
	HRL	17,-4($F)			;00037	0152	FORMAL
	HRRI	17,6($F)			;00040		LOCAL
	BLT	17,11($F)			;00041		LOCAL
	PUSH	$S,-2($F)			;00042	0153	FORMAL
	HRRZI	05,6($F)			;00043	0154	LOCAL
	HRLI	05,4400				;00044	
	PUSH	$S,5				;00045	
	PUSHJ	$S,LOOKUP			;00046	
	SUB	$S,DSKI.L+17			;00047	
	TRNN	$V,1				;00050	
	JRST	$S,L.10				;00051	
	MOVE	06,-2($F)			;00052		FORMAL
	LSH	06,27				;00053	
	ADD	06,DSKI.L+20			;00054	
	ADDI	06,2($F)			;00055		LOCAL
	MOVE	17,6				;00056	
	MOVEI	$V,1				;00057	
	XCT	$S,17				;00060	
	SETZ	$V,0				;00061	
	JRST	$S,L.10				;00062	0156
L.7:	SKIPLE	05,5($F)			;00063	0160	LOCAL
	JRST	$S,L.11				;00064	
	MOVN	17,5($F)			;00065		LOCAL
	HLRZS	17,17				;00066	
	MOVE	$V,17				;00067	
	ASH	$V,-7				;00070	0162
	AOJ	$V,0				;00071	
	JRST	$S,L.12				;00072	
L.11:	HLRZ	$V,5($F)			;00073		LOCAL
L.12:	MOVEM	$V,12($F)			;00074	0164	LOCAL
	PUSH	$S,-2($F)			;00075		FORMAL
	PUSH	$S,12($F)			;00076		LOCAL
	PUSHJ	$S,USETI			;00077	
	SUB	$S,DSKI.L+17			;00100	
	HRL	17,-5($F)			;00101	0165	FORMAL
	HRRI	17,2($F)			;00102		LOCAL
	BLT	17,5($F)			;00103		LOCAL
	PUSH	$S,-2($F)			;00104	0166	FORMAL
	HRRZI	07,2($F)			;00105	0167	LOCAL
	HRLI	07,4400				;00106	
	PUSH	$S,7				;00107	
	PUSHJ	$S,ENTER			;00110	
	SUB	$S,DSKI.L+17			;00111	
;BLISS-10 3(43)	6/14/73 22:10.52		SCRIO.BLI		PAGE 2-4

	TRNE	$V,1				;00112	
	JRST	$S,L.13				;00113	
	PUSH	$S,DSKI.C+1			;00114	
	PUSHJ	$S,OUTSA			;00115	
	SUB	$S,DSKI.L+16			;00116	
	CALLI 	$S,12				;00117	
	JRST	$S,L.13				;00120	0170
L.13:	PUSH	$S,-2($F)			;00121		FORMAL
	PUSH	$S,12($F)			;00122		LOCAL
	PUSHJ	$S,USETO			;00123	
	SUB	$S,DSKI.L+17			;00124	
	PUSH	$S,-2($F)			;00125	0171	FORMAL
	PUSHJ	$S,READ				;00126	
	SUB	$S,DSKI.L+16			;00127	
	HRL	17,-4($F)			;00130	0172	FORMAL
	HRRI	17,6($F)			;00131		LOCAL
	BLT	17,11($F)			;00132		LOCAL
	PUSH	$S,-3($F)			;00133	0174	FORMAL
	PUSH	$S,DSKI.L+13			;00134	
	PUSH	$S,DSKI.L+14			;00135	
	HRRZI	10,16($F)			;00136	0175	LOCAL
	PUSH	$S,10				;00137	
	PUSHJ	$S,OPEN				;00140	
	SUB	$S,DSKI.L+15			;00141	
	TRNE	$V,1				;00142	
	JRST	$S,L.14				;00143	
	PUSH	$S,DSKI.C+2			;00144	
	PUSHJ	$S,OUTSA			;00145	
	SUB	$S,DSKI.L+16			;00146	
	CALLI 	$S,12				;00147	
	JRST	$S,L.14				;00150	0176
L.14:	PUSH	$S,-3($F)			;00151		FORMAL
	HRRZI	11,6($F)			;00152	0177	LOCAL
	HRLI	11,4400				;00153	
	PUSH	$S,11				;00154	
	PUSHJ	$S,LOOKUP			;00155	
	SUB	$S,DSKI.L+17			;00156	
	TRNN	$V,1				;00157	
	JRST	$S,L.10				;00160	
L.15:	PUSH	$S,-3($F)			;00161		FORMAL
	PUSHJ	$S,READ				;00162	
	SUB	$S,DSKI.L+16			;00163	
	CAMN	$V,DSKI.L+21			;00164	0201
	JRST	$S,L.10				;00165	
	PUSH	$S,-2($F)			;00166		FORMAL
	PUSH	$S,3				;00167	
	PUSHJ	$S,WRITE			;00170	
	SUB	$S,DSKI.L+17			;00171	
	JRST	$S,L.15				;00172	0202
L.10:	PUSH	$S,-2($F)			;00173		FORMAL
	PUSHJ	$S,CLOSE			;00174	
	SUB	$S,DSKI.L+16			;00175	
	PUSH	$S,-3($F)			;00176	0204	FORMAL
	PUSHJ	$S,CLOSE			;00177	
	SUB	$S,DSKI.L+16			;00200	
	SETZ	$V,0				;00201	0205
	SUB	$S,DSKI.L+12			;00202	
;BLISS-10 3(43)	6/14/73 22:10.53		SCRIO.BLI		PAGE 2-5

	JRST	$S,.EXT.1			;00203	0206	EXTERNAL

;PLIT AREA

DSKI.P::
XWD	000000,000005	;00000
XWD	416031,647236	;00001
XWD	521011,750212	;00002
XWD	471004,252236	;00003
XWD	211010,644630	;00004
XWD	425000,000000	;00005
XWD	000000,000005	;00006
XWD	416031,647236	;00007
XWD	521010,547250	;00010
XWD	426444,021250	;00011
XWD	475044,043222	;00012
XWD	462120,000000	;00013
XWD	000000,000005	;00014
XWD	416031,647236	;00015
XWD	521011,750212	;00016
XWD	471004,243244	;00017
XWD	476324,220214	;00020
XWD	446310,500000	;00021


;CONSTANT POINTERS

DSKI.C::
XWD	004400,DSKI.P+1	;00000
XWD	004400,DSKI.P+7	;00001
XWD	004400,DSKI.P+15	;00002

;LITERALS
;BLISS-10 3(43)	6/14/73 22:10.54		SCRIO.BLI		PAGE 2-6


DSKI.L::

XWD	057000,000000	;00000
XWD	056000,000000	;00001
XWD	063000,740000	;00002
XWD	050000,000000	;00003
XWD	076000,000000	;00004
XWD	077000,000000	;00005
XWD	070000,000000	;00006
XWD	071000,000000	;00007
XWD	074000,000000	;00010
XWD	075000,000000	;00011
XWD	000017,000017	;00012
XWD	000000,000001	;00013
XWD	446353,000000	;00014
XWD	000004,000004	;00015
XWD	000001,000001	;00016
XWD	000002,000002	;00017
XWD	055000,000000	;00020
XWD	777777,777777	;00021

.ENT.0:: PUSH	$S,$F		;SET UP STACK POINTER AND FORMALS REGISTER

	HRRZ	$F,0
	JRST	$S,0(12)	;RETURN TO CALLING POINT

.ENT.1:: PUSH	$S,$F
	HRRZ	$F,0
	PUSH	$S,17		;SAVE REGISTER 17
	JRST	$S,0(12)	;RETURN TO CALLING POINT

.EXT.1:: POP	$S,17		;RESTORE REGISTER 17
.EXT.0:: POP	$S,$F		;RESTORE FORMALS REGISTER
	 POPJ	$S,0		;RETURN FROM SUBROUTINE

	SUBTTL	DEFAULT SCRIPT PARAMETERS
DEFAUL:			;DEFAULT VALUES (REGULAR)
	-^D300		;DELTI
	-^D100		;DELTO
	^D10000		;DELTR
	^D7000		;DELTF
	^D20000		;DELTS
	^D0		;PFLAGS
	POINT	7,BUFFER ;PSCRPT


DEFAUR:			;DEFAULT VALUES (REENTER)
	0		;DELTI
	0		;DELTO
	0		;DELTR
	0		;DELTF
	0		;DELTS
	P.FINT		;PFLAGS
	POINT	7,BUFFR	;PSCRPT



	;IMPURE DATA AREA

	RELOC

BLOW:

PTYNAM:	BLOCK 1		;SIX BIT PTY NAME
PTYUNT:	BLOCK 1		;PTY UNIT NUMBER:  LH IN SIXBIT, RH IN OCTAL
PTYIBF:	BLOCK 3		;INPUT BUFFER HEADER OF PTY
PTYOBF:	BLOCK 3		;OUTPUT BUFFER HEADER OF PTY
PCWORD:	BLOCK	1	;PC FOR PROCESS
JOBNO:	BLOCK 	1	;JOB NO FOR THIS PROCESS

CLPINI:			;CLEARED AT PROCESS INITIALIZATION
NDONE:	BLOCK 1		;NUMBER OF TIMES SCRIPT HAS BEEN COMPLETED
COUNT:	BLOCK	1	;NUMBER OF PASSES THROUGH THE SCRIPT

TNEXT:	BLOCK 1		;TIME TO WAKE UP AFTER SIMULATING SLOW TTY OR USER
TINTR:	BLOCK 1		;TIME TO INTERRUPT
TCPUST:	BLOCK	1	;CPU TIME AT START OF LINE
TSTLIN:	BLOCK 1		;TIME WAIT FOR RESPONSE BEGAN
FREE:	BLOCK 1		;FREE TIME LEFT FROM THE LAST LINE
LCPINI:

CLBEGL:			;CLEARED EACH LINE
NUMCHS:	BLOCK 1		;NUMBER CHARS SENT IN CURRENT LINE
NUMCHR:	BLOCK 1		;NUMBER CHARS RECEIVED IN CURRENT LINE
NUMOUT:	BLOCK 1		;NUMBER OF BUFFERS OF OUTPUT RECIEVED
TCPU:	BLOCK 1		;CPU TIME FOR THE LINE
RESPON:	BLOCK 1		;RESPONSE TIME (TOTAL COMPUTER DELAY)
INPSKW:	BLOCK 1		;SKEW DUE TO POOR RESONSE TO SCRIPT PROGRAM
OUTSKW:	BLOCK 1		;SKEW DUE TO POOR RESPONSE TO SCRIPT PROGRAM
QCOUNT:	BLOCK	1	;NUMBER OF ERRORS EXPECTED
DELTC:	BLOCK	1	;TIME-OUT BEFORE FORCED ^C'S
LCBEGL:

DLBEGS:			;RESET AT SCRIPT INITIALIZATION
DELTI:	BLOCK 1		;INPUT DELAY OR RATE
DELTO:	BLOCK 1		;OUTPUT DELAY OR RATE
DELTR:	BLOCK	1	;MAX RESPONSE TIME ALLOWABLE
DELTF:	BLOCK 1		;FREE TIME ALLOWED
DELTS:	BLOCK 1		;TIME JOBS TO BE STAGGERED AT START
PFLAGS:	BLOCK	1	;FLAG BITS FOR PROCESS
PSCRPT:	BLOCK	1	;POINTER TO SCRIPT
LDBEGS:

CLBEGS:			;CLEARED AT SCRIPT INITIALIZATION
LINCNT:	BLOCK	1	;NUMBER OF LINES PROCESSED
LCBEGS:

	IMPSIZ=.-BLOW
	BLOCK <IMPSIZ*<NMAX-1>>	;FILL UP LOWSEG WITH TABLES FOR ALL JOBS
IFN CYCLSW,<
	PDLEN=30
>
	PDLEN=20
PDLIST:	BLOCK PDLEN+1
LASTOP:	BLOCK	1	;TIME OF LAST CHECK FOR OPERATOR
SLNCNT:	BLOCK	1	;SCRIPT LINE COUNT
NOWATC:	BLOCK	1	;NUMBER OF JOBS TO BE WATCHED
NOLOG:	BLOCK	1	;NUMBER OF JOBS TO BE LOGGED FOR RESPONSE TINE
LASMON:	BLOCK	1	;NUMBER OF PROCESS LAST MONITORED
DEFAUP:	BLOCK	1	;ADDRESS OF DEFAULTS
COUNTO:	BLOCK 1		;REPEAT COUNT FROM OPERATOR
STAGO:	BLOCK	1	;STAGGER TIME REQUESTED BY OPERATOR
DELFAC:	BLOCK 1		;MULTIPLIER OF ALL DELAY COUNTS
TSTART:	BLOCK 1		;TIME PROGRAM STARTED
USJIF:	BLOCK 1		;MICROSECONDS PER JIFFY
MAGIC:	BLOCK 1		;MAGIC NUMBER TO SLEEP 4 JIFFIES
SVFF:	BLOCK 1		;JOBFF SAVED HERE
SBUF:	BLOCK 3		;BUFFER HEADER TO READ SCRIPT
MONBUF:	BLOCK 3		;BUFFER HEADER TO WATCH JOBS
LOGBUF:	BLOCK 3		;BUFFER HEADER TO LONG RESPONSES
HIUWP:	BLOCK 1		;STATE OF UWP FLAG SAVED HERE
COMLIN:	BLOCK 20	;TTY COMMAND BUFFER
JOBSB:	BLOCK	20	;BLOCK WITH LAST JOB STATUS OF EACH CHANNEL
CONFIG:	BLOCK	5	;HOLDS SYSTEM NAME
IFN CYCLSW,<
INTERV:	BLOCK 1
CYCLCT:	BLOCK 1
>

IFN HUWSW,<
FSTLIN:	BLOCK 1		;FIRST SCRIPT  LINE TO HOLD UP
WLINCR:	BLOCK 1		;INCREMMENT FOR EACH SCRIPT
RCTR:	BLOCK 1		;COUNT -1 OF SCRIPTS NOT YET HOLDING UP
HLNCNT:	BLOCK 20	;LINES TO GO IN SCRIPT BEFORE HOLDING UP
>
EZER:			;END+1 OF AREA TO BE ZEROED
	BLOCK	100	;STACK FOR THE BLISS APPEND ROUTINE

SAVACS:	BLOCK	20	;AREA TO STORE AC'S TEMPORARILY
WCHDEV:	BLOCK 1		;DEVICE FOR WATCH FILE
WCHMASTER:	SIXBIT /SCRIPT/		; NAME OF THE MASTER WCH FILE
		SIXBIT /WCH/		; EXT OF MASTER WCH FILE
		0
		0
		4400000000+.-4		;POINTER TO MASTER WCH FILE

RSPMASTER:	SIXBIT /SCRIPT/		;NAME OF THE MASTER RSP FILE
		SIXBIT /RSP/		;EXT OF MASTER RSP FILE
		0
		0
		4400000000+.-4		;POINTER TO MASTER RSP FILE
WCHFILE:	SIXBIT /SCP000/		;NAME OF NEW WCH FILE
		SIXBIT /WCH/		;EXT OF NEW WCH FILE
		0
		0
		4400000000+.-4		;POINTER TO NEW WCH FILE

RSPFILE:	SIXBIT /SCP000/		;NAME OF NEW RSP FILE
		SIXBIT /RSP/		;EXT OF NEW RSP FILE
		0
		0
		4400000000+.-4		;POINTER TO NEW RSP FILE
			;A GOOD PLACE TO PUT PATCH SPACE IF NEEDED
DSKI.G::	BLOCK 24	;GLOBAL AREA FOR APPEND

ELOW:			;END+1 OF LOW SEGMENT

	RELOC
	;END IMPURE AREA
	XLIST	;LITERALS
	LIT
	LIST
	;HERE IS WHERE THE SCRIPT IS STORED IN HI SEGMENT

RNAME:	SIXBIT	/[KJOB]/
	SIXBIT	/SCP/
	SIXBIT	/004/
	5

NAME:	0		;FILE NAME OF SCRIPT
	0		;EXT OF SCRIPT
	0		;VERSION OF SCRIPT
	0		;LINE COUNT OF SCRIPT

IFNDEF TENEX, <
BUFFR:	ASCII	/^C ^C
/
	ASCIZ	/K
!Q
K
!XOUT
/
>

IFDEF TENEX,<
BUFFR:	ASCII  /^C ^C
/
ASCIZ / DEL *.*;*
	EXP
	LOGOUT
!XOUT
/
>
BUFFER:	BLOCK BUFSIZ
	END BEGIN