Google
 

Trailing-Edge - PDP-10 Archives - scratch - 10,7/unscsp/lodtst/lodtst.mac
There are 5 other files named lodtst.mac in the archive. Click here to see a list.
	TITLE	LODTST
	SEARCH	LODUNV
	SUBTTL	CONTROL PROGRAM FOR MONITOR TEST SIMULATION SYSTEM


;ACCUMULATORS

T1==1			;TEMPORARY ACS
T2==2
T3==3
T4==4
T5==5
A==6			;SEMI-PERMANENT ACS
B==7
C==10
D==11
CH==16
P==17


;I/O CHANNELS

DSK==0			;DISK CHANNEL FOR CONTROL FILE
PTY==2			;PTY CHANNEL FOR LOGGING IN JOBS


;PARAMETERS

SYSPRJ==1		;PROJECT NUMBER FOR SYSTATS
SYSPRG==2		;PROGRAMMER NUMBER FOR SYSTATS
			;THIS PPN MUST HAVE HPQ PRIVILEGES


;OPDEFS

OPDEF	PJRST	[JRST]


;ASSEMBLY SWITCHES

SPOOL==1		;SET SPOOL SWITCH NON-ZERO TO SPOOL SYSTATS INSTEAD OF
			;SENDING THEM TO HARDWARE LPT:
DEBUG==0		;SET DEBUG SWITCH NON-ZERO FOR ADDITIONAL INFO ON LOGIN FAILURE
KILL==0			;SET KILL SWITCH TO ZERO FOR STANDARD EXIT PROCEDURE
			;SET NON-ZERO TO KILL JOBS AT END OF TEST
			;THIS DEFAULT CAN BE OVERRIDED WITH /KILL AND /NOKILL COMMANDS
	SUBTTL	MAIN PROGRAM


LODTST:	JFCL			;ENTRY POINT
	MOVE	P,PDP		;SET UP PDL POINTER
	PUSHJ	P,INITL		;INITIALIZE VARIABLES

MAIN:	PUSHJ	P,GETDEV	;SELECT INPUT DEVICE
	PUSHJ	P,PARAM		;GET PROGRAM OPTIONS
	SKIPE	JOBOPT		;WHICH OPTION?
	JRST	DOMOD		;MODULO OPTION
	PUSHJ	P,CATEGY	;DO CATEGORY OPTION
	JRST	LOGDIN		;GO START UP THE TEST
DOMOD:	PUSHJ	P,MODULO	;DO MODULO OPTION
LOGDIN:	SKIPE	SYSTIM		;SYSTATS REQUESTED?
	PUSHJ	P,LOGSYS	;LOGIN SYSTAT JOB
	PUSHJ	P,DOWAKE	;WAKE UP ALL JOBS
	SETZM	INPIND		;RETURN INPUT TO TTY:
	PUSHJ	P,DAYTIM	;OUTPUT TIME OF DAY
	OUTSTR	[ASCIZ/SIMULATION STARTED.
/]

SYSLUP:	PUSHJ	P,SNOOZE	;SLEEP UNTIL ITS TIME TO DO SOMETHING
	PUSHJ	P,CHKSYS	;CHECK IF TIME TO QUIT OR TIME TO DO SYSTAT
	JRST	FINISH		;NON-SKIP RETURN IF TIME TO STOP THE SIMULATION
	PUSHJ	P,CHKTTY	;SEE IF ANY TTY COMMANDS ISSUED
	JRST	SYSLUP		;NORMAL RETURN IF NO EXIT COMMAND GIVEN
				;SKIP RETURN IF AN EXIT COMMAND WAS TYPED

FINISH:	PUSHJ	P,DAYTIM	;OUTPUT TIME OF DAY
	OUTSTR	[ASCIZ/END OF SIMULATION. STARTING EXIT PROCEDURE.
/]
	PUSHJ	P,DOSYS		;DO FINAL SYSTAT
	PUSHJ	P,KILSYS	;STOP ALL JOBS
	JRST	FINERR		;COULDN'T GET RID OF ALL JOBS
	PUSHJ	P,DAYTIM	;OUTPUT TIME
	OUTSTR	[ASCIZ/END OF EXIT PROCEDURE. ALL JOBS STOPPED.
/]
	JRST	DONE		;SUCCESS
FINERR:	PUSHJ	P,DAYTIM	;OUTPUT TIME
	OUTSTR	[ASCIZ/EXIT TIME LIMIT REACHED.
SOME LODTST JOBS MAY STILL BE RUNNING.
/]
DONE:	OUTSTR	[ASCIZ/LODTST EXITING.
/]
	EXIT
	SUBTTL	MAIN PROGRAM BLOCKS


;INITL	- ROUTINE TO INITIALIZE VARIABLES


INITL:	RESET			;RESET ALL DEVICES
	SETZM	INPIND		;SET INPUT DEVICE TO TTY
	SETZM	SYSFLG		;FLAG WHETHER SYSTAT JOB HAS BEEN LOGGED IN
	SETZM	NJOBS		;NUMBER OF JOBS LOGGED IN ON PTYS
	MOVEI	T1,1		;PUT JOB IN HPQ 1
	HPQ	T1,		;WITH HPQ UUO
	JFCL			;IGNORE ERROR
	POPJ	P,



;GETDEV	- ROUTINE TO READ DEVICE SPECIFICATION


GETDEV:	OUTSTR	[ASCIZ/ENTER INPUT FILE SPEC (DEFAULT IS TTY:)
/]
	PUSHJ	P,GETSPC	;GET FILE SPEC
	SKIPN	OPENBL+1	;TTY?
	POPJ	P,		;YES
	SETOM	INPIND		;INDICATE DISK INPUT
	OPEN	DSK,OPENBL	;OPEN DISK FILE
	JRST	OPNERR		;NO SUCH DEVICE
	INBUF	DSK,1		;SET UP ONE BUFFER
	LOOKUP	DSK,LOOKBL	;FIND FILE
	JRST	LOKERR		;NO SUCH FILE
	POPJ	P,		;RETURN
OPNERR:	OUTSTR	[ASCIZ/? FAILURE OPENING INPUT DEVICE.
/]
	JRST	ABEND		;TERMINATE RUN
LOKERR:	OUTSTR	[ASCIZ/? FAILURE ON LOOKUP FOR INPUT FILE.
/]
	JRST	ABEND		;GIVE UP
;PARAM	- READ TIME BETWEEN SYSTATS, LENGTH OF TEST, AND JOB OPTION


PARAM:	OUTSTR	[ASCIZ/ENTER INTERVAL BETWEEN SYSTATS (MINS)
/]
	PUSHJ	P,GETDEC	;GET DECIMAL NUMBER
	JUMPE	CH,SYSOK	;JUMP IF LEGAL TERMINATOR
	OUTSTR	[ASCIZ/? ILLEGAL SYSTAT INTERVAL.
/]
	PUSHJ	P,ABCHK		;CHECK FOR DSK INPUT
	JRST	PARAM		;TRY AGAIN
SYSOK:	IMULI	T4,^D60		;CONVERT TO SECONDS
	MOVEM	T4,SYSTIM	;STORE SYSTAT INTERVAL

TSTLEN:	OUTSTR	[ASCIZ/ENTER LENGTH OF TEST (MINS)
/]
	PUSHJ	P,GETDEC	;INPUT RESPONSE
	JUMPE	CH,TSTOK	;CHECK FOR LEGAL TERMINATOR
	OUTSTR	[ASCIZ/? ILLEGAL TEST LENGTH.
/]
	PUSHJ	P,ABCHK		;CHECK FOR DSK
	JRST	TSTLEN		;TRY AGAIN
TSTOK:	IMULI	T4,^D60		;CONVERT TO SECONDS
	SKIPG	T4		;ANY LENGTH SPECIFIED?
	MOVSI	T4,200000	;NO, USE INFINITE NUMBER
	MOVEM	T4,TESTIM	;LENGTH OF TEST

GETOPT:	SETZM	JOBOPT		;DEFAULT TO CATEGORY OPTION
	OUTSTR	[ASCIZ/ENTER JOB DATA OPTION (CATEGORY OR MODULO)
/]
	PUSHJ	P,GATOM		;READ RESPONSE
	JUMPN	CH,OPTERR	;ILLEGAL TERMINATOR
	MOVE	T1,[-NUMOPT,,TABOPT] ;POINTER TO OPTION TABLE
	PUSHJ	P,MATCH		;LOOK FOR A MATCH
	JUMPL	T2,@1(T2)	;BRANCH TO PROPER ROUTINE
OPTERR:	OUTSTR	[ASCIZ/? ILLEGAL FORMAT. TYPE EITHER CAT OR MOD.
/]
	PUSHJ	P,ABCHK		;TERMINATE IF FROM DISK
	JRST	GETOPT		;TRY AGAIN

MODOPT:	SETOM	JOBOPT		;NON-ZERO MEANS MODULO
CATOPT:	POPJ	P,		;RETURN

TABOPT:	SIXBIT/MODULO/
	MODOPT
	SIXBIT/CATEGO/
	CATOPT
NUMOPT==.-TABOPT
;CATEGY	- ROUTINE TO LOG IN JOBS BY SPECIFIED PPN FOR EACH CATEGORY


CATEGY:	OUTSTR	[ASCIZ/ENTER PPN AND NUMBER OF JOBS (PROJ,PROG:NUMBER) ONE PER LINE.
EXTRA CARR RET TO GO TO NEXT CATEGORY.
/]
	SKIPA	C,[-NUMCLS,,0]	;AOBJN WORD
CATAOB:	AOBJP	C,CPOPJ		;RETURN WHEN THRU WITH ALL JOB TYPES
CATLUP:	OUTSTR	@PRGNAM(C)	;TYPE PROGRAM NAME
	OUTSTR	[ASCIZ/: /]
	PUSHJ	P,GETOCT	;READ PROJECT
	JUMPE	CH,CATAOB	;GO TO NEXT CATEGORY IF CR
	CAIE	CH,","		;OTHERWISE DELIMITER MUST BE COMMA
	JRST	CATERR		;NO, ERROR
	MOVEM	T4,CURPRJ	;STORE PROJECT
	PUSHJ	P,GETOCT	;READ PROGRAMMER
	CAIE	CH,COLON	;MUST BE COLON
	JRST	CATERR		;NOT COLON
	MOVEM	T4,CURPRG	;STORE PROGRAMMER NUMBER
	PUSHJ	P,GETDEC	;READ NUMBER OF JOBS
	JUMPE	CH,CATOK	;OK IF CR OR ALT
CATERR:	OUTSTR	[ASCIZ/? ILLEGAL CATEGORY SPECIFICATION.
TYPE PROJ,PROG:NUMBER (PROJ,PROG IN OCTAL, NUMBER IN DECIMAL).
/]
	PUSHJ	P,ABCHK		;CHECK IF DISK
	JRST	CATLUP		;RETRY

CATOK:	SKIPG	D,T4		;NUMBER OF JOBS TO LOGIN
	JRST	CATAOB		;NONE
CATLOG:	PUSHJ	P,DOLOG		;LOGIN A JOB
	PUSHJ	P,DORUN		;START IT RUNNING
	SOJG	D,CATLOG	;LOGIN THE REST OF THE JOBS
	JRST	CATLUP		;DO MORE JOBS OF THIS CATEGORY
;MODULO	- ROUTINE TO GENERATE JOBS WITH PROGRAMMER NUMBER MODULO A SPECIFIED RANGE


MODULO:	OUTSTR	[ASCIZ/ENTER BASE PPN (PROJ,PROG)
/]
	PUSHJ	P,GETOCT	;READ AN OCTAL NUMBER
	CAIE	CH,","		;DELIMITER SHOULD BE COMMA
	JRST	PPNERR		;WRONG DELIMITER
	MOVEM	T4,BASPRJ	;STORE BASE PROJECT
	PUSHJ	P,GETOCT	;READ PROG NUMBER
	JUMPE	CH,PPNOK	;DELIMITER SHOULD BE CR OR ALT
PPNERR:	OUTSTR	[ASCIZ/? ILLEGAL PROJ,PROG NUMBER FORMAT.
/]
	PUSHJ	P,ABCHK		;CHECK FOR DISK INPUT
	JRST	MODULO		;TRY AGAIN
PPNOK:	MOVEM	T4,BASPRG	;BASE PROG NUMBER

MODGET:	OUTSTR	[ASCIZ/ENTER MODULO NUMBER (DECIMAL)
/]
	PUSHJ	P,GETDEC	;READ DECIMAL
	JUMPN	CH,MODERR	;BAD DELIMITER
	JUMPG	T4,MODOK	;JUMP IF POSITIVE
	AOJG	T4,MODOK	;MAKE ZERO DEFAULT TO ONE
MODERR:	OUTSTR	[ASCIZ/? ILLEGAL MODULO NUMBER.
/]
	PUSHJ	P,ABCHK		;CHECK FOR DISK
	JRST	MODGET		;RETRY

MODOK:	MOVEM	T4,MODNUM	;STORE MOD NUMBER
	SETOM	CLASS		;INITIALIZE MODULO COUNTER
	MOVSI	C,-NUMCLS	;SET UP AOBJN WORD
MODLUP:	OUTSTR	@PRGNAM(C)	;TYPE PROGRAM NAME
	OUTSTR	[ASCIZ/: /]
	PUSHJ	P,GETDEC	;NUMBER OF JOBS TO LOG IN
	JUMPE	CH,NUMOK	;JUMP IF CR OR ALT
	OUTSTR	[ASCIZ/? ILLEGAL NUMBER OF JOBS.
/]
	PUSHJ	P,ABCHK		;TERMINATE IF DISK
	JRST	MODLUP		;RETRY
NUMOK:	SKIPG	D,T4		;ANY JOBS REQUESTED?
	JRST	MODAOB		;NO
MODLOG:	AOS	A,CLASS		;BUMP MODULO COUNTER
	IDIV	A,MODNUM	;GET MODULO IN B
	ADD	B,BASPRG	;ADD IN BASE PROG NUMBER
	MOVEM	B,CURPRG	;CURRENT PROG NUMBER
	MOVE	T1,BASPRJ	;BASE PROJECT
	MOVEM	T1,CURPRJ	;INTO CURRENT PROJECT
	PUSHJ	P,DOLOG		;LOGIN A JOB
	PUSHJ	P,DORUN		;START IT RUNNING
	SOJG	D,MODLOG	;LOGIN THE REST OF THE JOBS OF THIS TYPE
MODAOB:	AOBJN	C,MODLUP	;DO THE NEXT TYPE
	POPJ	P,		;RETURN
;LOGSYS	- LOGIN THE SYSTAT JOB UNDER 1,2


LOGSYS:	SETOM	SYSFLG		;FLAG THAT SYSTAT JOB HAS BEEN LOGGED IN
	MOVEI	T1,SYSPRJ	;PROJECT FOR SYSTAT
	MOVEM	T1,CURPRJ	;INTO CURRENT PORJECT
	MOVEI	T1,SYSPRG	;PROGRAMMER NUMBER FOR SYSTAT
	MOVEM	T1,CURPRG	;INTO CURRENT PROG
	PUSHJ	P,DOLOG		;LOG IT IN
	MOVEI	T1,[ASCIZ/SET HPQ 1
/]
	PUSHJ	P,PTYMSG	;PUT IT IN HPQ
	PUSHJ	P,CHKLOG	;WAIT TIL IT GETS BACK TO MONITOR LEVEL
	JFCL			;IGNORE ANY ERRORS
IFN SPOOL,<
	MOVEI	T1,[ASCIZ/SET SPOOL LPT
/]
	PUSHJ	P,PTYMSG	;USE SPOOLED PRINTER
	PUSHJ	P,CHKLOG	;WAIT FOR DOT TO COME BACK
	JFCL			;IGNORE ERRORS
>
	POPJ	P,		;RETURN
	POPJ	P,		;RETURN



;DOWAKE	- WAKE UP ALL JOBS


DOWAKE:	MOVE	T2,[20,,12]
	GETTAB	T2,		;GET HIGHJB
	MOVEI	T2,^D511	;IF ERROR ASSUME 511 JOBS
	MOVEM	T2,HIGHJB	;SAVE HIGHEST JOB LOGGED IN NOW
WAKLUP:	HRRZ	T1,T2		;SET UP FOR WAKE UUO
	WAKE	T1,		;WAKE UP THE JOB
	JFCL			;IGNORE ERRORS
	SOJG	T2,WAKLUP	;WAKE ALL JOBS
	MSTIME	T1,		;GET TIME IN MILLISEC
	IDIVI	T1,^D1000	;CONVERT TO SEC
	ADDM	T1,TESTIM	;ADD CURRENT TIME TO LENGTH OF TEST FOR EXIT TIME
	SKIPG	SYSTIM		;ANY SYSTAT INTERVAL?
	MOVSI	T1,200000	;NO, USE BIG NUMBER
	MOVEM	T1,NEXTIM	;TIME FOR FIRST SYSTAT
	POPJ	P,		;RETURN
;SNOOZE	- SLEEP UNTIL TIME TO PROCESS NEXT EVENT


SNOOZE:	MSTIME	A,		;GET TIME IN MILLISEC
	IDIVI	A,^D1000	;CHANGE TO SEC
	MOVEI	B,1(A)		;ADD ONE SEC AND STORE IN B FOR COMPARES
	MOVE	T1,TESTIM	;END OF TEST TIME
	CAMLE	T1,NEXTIM	;EARLIER THAN NEXT SYSTAT TIME?
	MOVE	T1,NEXTIM	;NO, USE SYSTAT TIME
	SUB	T1,A		;TIME INTERVAL TO NEXT EVENT
	JUMPLE	T1,CPOPJ	;RETURN IF ITS ALREADY TIME
	CAILE	T1,^D60		;GREATER THAN MAXIMUM SLEEP INTERVAL?
	MOVEI	T1,^D60		;MAKE IT 60
	MOVE	T2,T1		;HIBER INTERVAL
	IMULI	T2,^D1000	;IN MILLISEC
	TLO	T2,(1B13)	;WAKE ON TTY ACTIVITY (LINE MODE)
	HIBER	T2,		;TRY HIBER
	SLEEP	T1,		;IF IT FAILS TRY SLEEP
	POPJ	P,		;RETURN TO PROCESS ANY EVENT



;CHKSYS	- ROUTINE TO SEE IF TIME FOR SYSTAT OR EXIT (NON-SKIP RETURN IF EXIT)


CHKSYS:	CAMGE	B,TESTIM	;TIME FOR NORMAL EXIT?
	JRST	CHKNXT		;NO
	MOVE	A,KILLSW	;CURRENT VALUE OF END OF TEST FLAG
	POPJ	P,		;AND GIVE NON-SKIP RETURN

CHKNXT:	CAMGE	B,NEXTIM	;TIME FOR A SYSTAT?
	JRST	CPOPJ1		;NO - GIVE GOOD RETURN
	PUSHJ	P,DOSYS		;YES - WITHIN ONE SECOND
	SKIPG	T1,SYSTIM	;TIME BETWEEN SYSTATS
	MOVSI	T1,200000	;NO AUTO SYSTATS, USE LARGE NUMBER
	ADDM	T1,NEXTIM	;UPDATE TIME FOR NEXT SYSTAT
CPOPJ1:	AOS	(P)		;GIVE SKIP RETURN
CPOPJ:	POPJ	P,		;RETURN
;CHKTTY	- ROUTINE TO MONITOR TTY FOR COMMANDS (SKIP RETURN IF EXIT COMMAND)


CHKTTY:	SKPINL			;SKIP IF ANY TTY INPUT READY
	POPJ	P,		;NONE - RETURN
	PUSHJ	P,GATOM		;READ A COMMAND
	JUMPN	CH,CHKERR	;ILLEGAL TERMINATOR
	MOVE	T1,[-NUMTTY,,TABTTY] ;POINTER TO TTY COMMAND TABLE
	PUSHJ	P,MATCH		;FIND A MATCH
	JUMPL	T2,@1(T2)	;IF SUCCESSFUL, BRANCH TO ROUTINE
CHKERR:	OUTSTR	[ASCIZ *? ILLEGAL COMMAND. COMMANDS ARE:
SYSTAT
EXIT
KILL
/EXIT
/KILL
/NOKILL (SAME AS /EXIT)
*]
	CLRBFI			;CLEAR ANY TYPE AHEAD
	JRST	CHKTTY		;LOOK FOR MORE INPUT

TABTTY:	SIXBIT/SYSTAT/
	CHKTTS
	SIXBIT/EXIT/
	CHKTTE
	SIXBIT/KILL/
	CHKTTK
	SIXBIT/:EXIT/
	CHKTTX
	SIXBIT/:KILL/
	CHKTTL
	SIXBIT/:NOKIL/
	CHKTTX
NUMTTY==.-TABTTY

CHKTTS:	PUSHJ	P,DOSYS		;DO A SYSTAT NOW
	JRST	CHKTTY		;LOOK FOR MORE

CHKTTE:	TDZA	A,A		;DO NORMAL EXIT CODE
CHKTTK:	SETO	A,		;DO KILL CODE
	PJRST	CPOPJ1		;GIVE SKIP RETURN

CHKTTL:	SETOM	KILLSW		;SET END OF TEST FLAG TO KILL
	JRST	CHKTTY		;CHECK FOR MORE COMMANDS

CHKTTX:	SETZM	KILLSW		;SET END OF TEST FLAG TO EXIT
	JRST	CHKTTY		;CHECK FOR MORE

;KILSYS	- TELL LODTST JOBS TO STOP


KILSYS:	MOVE	B,['ENDTST']
	JUMPE	A,KILA		;JUMP IF REGULAR EXIT
	HRLI	B,'KIL'		;CHANGE TO KJOB EXIT
	SKIPN	SYSFLG		;IS A SYSTAT JOB LOGGED IN?
	JRST	KILA		;NO
	MOVEI	T1,[ASCIZ/R LOGOUT
/]
	PUSHJ	P,PTYMSG	;FORCE A LOGOUT COMMAND
	PUSHJ	P,CHKJOB	;WAIT TILL IT GETS KJOBED
	JFCL			;IGNORE ERROR RETURN
KILA:	SETNAM	B,		;CHANGE PROGRAM NAME
	SOSLE	T1,NJOBS	;ANY LODTST JOBS LOGGED IN?
	JRST	KILC		;YES, GO WAIT FOR THEM TO EXIT
	JUMPL	T1,KILB		;IF NO JOBS LOGGED IN JUST SLEEP A MIN
	SKIPN	SYSFLG		;IF THERES ONE JOB AND ITS NOT THE SYSTAT JOB...
	JRST	KILC		;...GO WAIT FOR IT
KILB:	MOVEI	T1,^D60		;OTHERWISE SLEEP 60 SEC
	SLEEP	T1,		;SINCE WE DON'T KNOW WHO WE'RE WAITING FOR
	SLEEP	T1,		;AND ANOTHER MINUTE FOR GOOD MEASURE
	POPJ	P,		;ERROR RETURN
KILC:	IMULI	T1,^D10000	;NUMBER OF JOBS TIMES 10 SEC EACH
	ADDI	T1,^D60000	;PLUS 60 SEC
	MSTIME	C,		;CURRENT TIME
	ADD	C,T1		;TIME TO GIVE UP TRYING TO STOP JOBS
KILOOP:	MOVEI	T1,^D15		;FIRST SLEEP FOR 15 SEC
	SLEEP	T1,		;TO GIVE JOBS TIME TO EXIT
	SETZ	T4,		;COUNT OF JOBS FOUND
	MOVE	B,HIGHJB	;GET NUMBER OF JOBS ON SYSTEM
KILTST:	PUSHJ	P,BITMSK	;GET MASK AND ADDRESS IN BIT TABLE
	TDNN	T2,BITABL(T1)	;WAS THIS JOB LOGGED IN BY ME?
	JRST	KILE		;NO
	AOJ	T4,		;COUNT A JOB FOUND
	HRLZ	T3,B		;JOB NUMBER,,TABLE 0
	GETTAB	T3,		;GET JOBS STATUS WORD
	JRST	KILD		;HE'S GONE
	TLNN	T3,40004	;IS THIS JOB LOGGED IN?
	JRST	KILD		;NO, DELETE HIM FROM TABLE
	JUMPN	A,KILE		;IF KILL OPTION HE MUST ACTUALLY BE GONE
	HRLZ	T3,B		;JOB NUMBER IN LEFT HALF
	HRRI	T3,3		;3 IN RIGHT HALF
	GETTAB	T3,		;TO GET PROGRAM NAME
	JRST	KILD		;JOB DISAPPEARED
	HLRZ	T3,T3		;LOOK AT LEFT HALF OF JOB NAME
	CAIE	T3,'END'	;DID HE CHANGE HIS NAME TO ENDXXX?
	JRST	KILE		;NO, KEEP WAITING
KILD:	ANDCAM	T2,BITABL(T1)	;CLEAR TABLE ENTRY IF JOB HAS EXITED GRACEFULLY
	SOJ	T4,		;DISCOUNT THE JOB THAT WAS FOUND
KILE:	SOJG	B,KILTST	;TRY ALL JOBS
	JUMPLE	T4,CPOPJ1	;RETURN IF ALL JOBS STOPPED
	MSTIME	T1,		;GET TIME
	CAMGE	T1,C		;TIME LIMIT EXCEEDED?
	JRST	KILOOP		;NO, TRY AGAIN
	POPJ	P,		;GIVE UP
;ABCHK	- ABANDON TEST IF INPUT IS FROM DISK


ABCHK:	SKIPE	INPIND		;IS INPUT FROM DISK
	JRST	ABEND		;YES
	;PJRST	FLUSH		;OTHERWISE FLUSH THE REST OF THE LINE

FLUSH:	JUMPE	CH,CPOPJ	;RETURN IF CR OR ALT
	PUSHJ	P,GETCHR	;GET ANOTHER CHARACTER
	JRST	FLUSH		;LOOP UNTIL BREAK CHAR


ABEND:	OUTSTR	[ASCIZ/SIMULATION TERMINATED.
/]
	EXIT
	SUBTTL	MAIN SUBROUTINES


;DOLOG	- LOG IN A JOB ON A PTY


DOLOG:	PUSHJ	P,INTPTY	;INIT A PTY
	MOVEI	T1,LOGMSG	;START OF LOGIN MESSAGE
	PUSHJ	P,PTYSTR	;OUTPUT IT
	PUSHJ	P,PTYPPN	;OUTPUT PPN TO PTY
	MOVEI	T1,LOGTXT	;REMAINDER OF LOGIN MESSAGE
	PUSHJ	P,PTYMSG	;FORCE OUTPUT
	PUSHJ	P,CHKLOG	;SEE IF LOGGED IN
	JRST	LOGERR		;TIME LIMIT EXCEEDED
	MOVE	B,CURJOB	;JOB NUMBER CURRENTLY ON PTY
	PUSHJ	P,BITSET	;LIGHT THE BIT IN THE JOB TABLE
	AOS	NJOBS		;BUMP COUNT OF JOBS LOGGED IN
	POPJ	P,		;RETURN

LOGERR:	OUTSTR	[ASCIZ/? TIME LIMIT EXCEEDED LOGGING IN JOB UNDER PPN /]
	PUSHJ	P,TTYPPN	;OUTPUT PPN
	OUTSTR	[BYTE (7)".",15,12] ;OUTPUT CRLF
	POPJ	P,		;RETURN

PTYPPN:	SKIPA	T3,[PTYCHR]	;PRINT TO PTY
TTYPPN:	MOVEI	T3,TTYCHR	;PRINT TO TTY
	MOVE	T1,CURPRJ	;PROJ #
	PUSHJ	P,PRIOCT	;OUTPUT IN OCTAL
	MOVEI	T2,","		;COMMA
	PUSHJ	P,(T3)		;OUTPUT A CHAR
	MOVE	T1,CURPRG	;PROG #
	PJRST	PRIOCT		;OUTPUT OCTAL NUMBER
;DORUN	- CAUSE THE JOB ON THE PTY TO RUN THE PROGRAM SPECIFIED BY INDEX C


DORUN:	MOVEI	T1,[ASCIZ/RUN TST:/]
	PUSHJ	P,PTYSTR	;SEND RUN COMMAND
	MOVE	T1,PRGNAM(C)	;ADDRESS OF JOB NAME
	PUSHJ	P,PTYSTR	;OUTPUT ASCII JOB NAME
	MOVEI	T1,AREA		;AREA TO RUN FROM
	PUSHJ	P,PTYMSG	;FORCE OUT THE MESSAGE
	PUSHJ	P,CHKRUN	;CHECK IF RUNNING
	JRST	RUNERR		;TIME LIMIT EXCEEDED
RUNOK:	MOVEI	T1,1		;SLEEP A SECOND
	SLEEP	T1,		;DO SLEEP
	INPUT	PTY,		;INPUT ANY STUFF
	RELEAS	PTY,		;RELEASE PTY AND DETACH JOB
	POPJ	P,		;RETURN

RUNERR:	OUTSTR	[ASCIZ/? TIME LIMIT EXCEEDED TRYING TO RUN /]
	OUTSTR	@PRGNAM(C)	;OUTPUT THE PROGRAM NAME
	OUTSTR	[ASCIZ/ UNDER PPN /]
	PUSHJ	P,TTYPPN	;OUTPUT PPN TO TTY
	OUTSTR	[BYTE (7)".",15,12] ;OUTPUT CRLF
	JRST	RUNOK		;THEN IGNORE ERROR AND CONTINUE
;CHKLOG	- MAKE SURE JOB IS LOGGED IN AND AT MONITOR LEVEL (SKIP RETURN IF OK)
;CHKRUN	- MAKE SURE JOB IS LOGGED IN AND RUNNING (SKIP RETURN IF OK)
;CHKJOB	- MAKE SURE JOB IS LOGGED OUT (SKIP RETURN IF OK)


CHKJOB:	MOVEI	A,120000	;STATUS BITS FOR LOGGED OUT
	JRST	CHKALL		;GO CHECK
CHKRUN:	SKIPA	A,[600000]	;STATUS BITS FOR RUN
CHKLOG:	MOVEI	A,720000	;STATUS BITS FOR LOGGED IN AND MONITOR LEVEL
CHKALL:	MSTIME	T1,		;TIME IN MILLISEC
	ADDI	T1,^D60000	;PLUS 60 SEC
	MOVEM	T1,PTYLIM	;TIME LIMIT FOR RESPONSE FROM PTY
GETOUT:	MOVEI	T1,PTY		;CHECK PTY
	JOBSTS	T1,		;JOB STATUS
	JRST	STSERR		;NO JOBSTS UUO
	TLZ	T1,7777		;CLEAR ANY UNDEFINED BITS
				;(MIGHT GET ADDED IN FUTURE MONITORS)
	HRRZM	T1,CURJOB
	TLNN	T1,(1B3)	;OUTPUT READY?
	JRST	NOOUT		;NO
	INPUT	PTY,		;YES, GET IT
	SKIPN	IBUF+2		;ANY CHARACTERS IN BUFFER?
	JRST	GETOUT		;NO
	ILDB	T1,IBUF+1	;GET FIRST CHAR FROM TEXT
	CAIN	T1,"?"		;IS IT PART OF AN ERROR MESSAGE?
	OUTSTR	@IBUF+1		;IF SO LET OPERATOR SEE THE ACTUAL MESSAGE
	JRST	GETOUT		;WAIT FOR MORE PTY ACTIVITY

NOOUT:	HLRZ	T1,T1		;GET LEFT HALF OF STATUS
	CAIN	T1,(A)		;IS IT IN THE STATE WE DESIRE?
	JRST	CPOPJ1		;YES, GIVE SUCCESSFUL RETURN
	MSTIME	T2,		;NOT READY YET
	MOVE	T1,PTYLIM	;GET TIME LIMIT
	SUB	T1,T2		;MINUS CURRENT TIME
	JUMPLE	T1,CPOPJ	;ERROR RETURN IF LIMIT EXCEEDED
	CAILE	T1,^D60000	;GREATER THAN MAX SLEEP TIME?
	MOVEI	T1,^D1000	;CHECK STATUS ONCE A SECOND
	TLO	T1,(1B12)	;WAKE ON PTY ACTIVITY
	MOVEI	T2,1		;1 SECOND
	HIBER	T1,		;HIBER UNTIL PTY ACTIVE OR LIMIT EXCEEDED
	SLEEP	T2,		;SLEEP 1 SEC IF HIBER NOT IMPLEMENTED
	JRST	GETOUT		;GO CHECK AGAIN

STSERR:	OUTSTR	[ASCIZ/? JOBSTS UUO FAILED.
/]
	JRST	ABEND		;TERMINATE RUN
;DOSYS	- ROUTINE TO DO A SYSTAT


DOSYS:	SKIPN	SYSFLG		;IS SYSTAT JOB LOGGED IN YET?
	PUSHJ	P,LOGSYS	;NO, LOG IT IN
	OUTSTR	[BYTE (7)7,"*",7]
	MOVEI	T1,[ASCIZ *SYS/L
*]
	PUSHJ	P,PTYMSG	;SEND SYS/L OVER PTY
	MOVEI	T1,^D10		;SLEEP FOR 10 SEC
	SLEEP	T1,		;TO ALLOW SYSTAT TO COME OUT
	PUSHJ	P,CHKLOG	;WAIT TIL WE GET THE DOT BACK
	JFCL			;IGNORE ERROR RETURN
	POPJ	P,		;RETURN
;GETSPC	- READ A FILE SPEC FROM TTY AND MAKE DEFAULT ASSUMPTIONS


GETSPC:	SETZM	OPENBL		;CLEAR OPEN AND LOOKUP AREAS
	MOVE	T1,[OPENBL,,OPENBL+1]
	BLT	T1,LOOKBL+3	;ZERO THRU LOOKUP AREA
	MOVEI	T1,DSKBUF	;DSK BUFFER HEADER
	MOVEM	T1,OPENBL+2	;SET UP IN OPEN BLOCK

GETSPL:	PUSHJ	P,GATOM		;READ AN ATOM
	CAIN	CH,COLON	;COLON?
	JRST	GETSPD		;GET DEVICE
	JUMPE	T4,GETSPT	;NO NAME SPECIFIED
	SKIPE	LOOKBL		;FILE NAME SEEN YET?
	JRST	GETSPR		;YES, ERROR
	MOVEM	T4,LOOKBL	;NO, STORE FILE NAME
GETSPT:	JUMPE	CH,GETSPX	;END OF LINE
	CAIN	CH,"."		;PERIOD?
	JRST	GETSPE		;YES, GET EXTENSION
	CAIN	CH," "		;SPACE?
	JRST	GETSPL		;GET MORE
	CAIN	CH,"["		;LEFT BRACKET?
	JRST	GETSPP		;GET PPN
GETSPR:	OUTSTR	[ASCIZ/? ILLEGAL FILE SPEC.
/]
	JRST	ABEND		;BOMB AND MAKE HIM RERUN THE PROGRAM

GETSPD:	SKIPE	OPENBL+1	;SEEN DEVICE YET?
	JRST	GETSPR		;YES
	MOVEM	T4,OPENBL+1	;STORE DEVICE NAME
	JRST	GETSPL		;LOOP FOR MORE
GETSPE:	PUSHJ	P,GATOM		;READ EXTENSION
	SKIPE	LOOKBL+1	;SEEN EXTENSION YET?
	JRST	GETSPR		;YES
	HLLZM	T4,LOOKBL+1	;STORE EXTENSION
	JRST	GETSPT		;CHECK FOR MORE

GETSPP:	SKIPE	LOOKBL+3	;SEEN PPN YET?
	JRST	GETSPR		;YES
	PUSHJ	P,GETOCT	;READ OCTAL PROJECT
	CAIE	CH,","		;DELIMITER MUST BE COMMA
	JRST	GETSPR		;ERROR
	HRLZM	T4,LOOKBL+3	;STORE PROJECT
	PUSHJ	P,GETOCT	;READ PROGRAMMER NUMBER
	HRRM	T4,LOOKBL+3	;STORE IT
	JUMPE	CH,GETSPX	;CARRIAGE RETURN IS LEGAL HERE
	CAIN	CH,"]"		;ONLY OTHER LEGAL CHAR IS RIGHT BRACKET
	JRST	GETSPL		;OK, GET NEXT ATOM
	JRST	GETSPR		;BAD DELIMITER

GETSPX:	SKIPN	T1,OPENBL+1	;ANY DEVICE SPECIFIED?
	JRST	GETSPY		;NO
	CAMN	T1,['TTY   ']	;YES, IS IT TTY?
	SETZM	OPENBL+1	;YES, CLEAR DEVICE
	POPJ	P,		;AND RETURN
GETSPY:	MOVSI	T1,'DSK'	;SIXBIT DSK
	SKIPE	LOOKBL		;FILE NAME SPECIFIED?
	MOVEM	T1,OPENBL+1	;YES, MUST BE DSK
	POPJ	P,		;RETURN
	SUBTTL	UTILITY SUBROUTINES


;GATOM	- READ A SIXBIT ATOM (WORD IN T4, MASK IN T5, TERMINAL CHAR IN T1)
;GETDEC	- READ DECIMAL (NUMBER IN T4, TERMINAL CHAR IN T1)
;GETOCT	- READ OCTAL (NUMBER IN T4, TERMINAL CHAR IN T1)


GATOM:	MOVEI	T5,1		;ONE IS FLAG FOR SIXBIT
	MOVE	T3,[POINT 6,T4]	;BYTE POINTER FOR BUILDING SIXBIT
	PJRST	GETNUM		;GO READ IT

GETDEC:	TDZA	T5,T5		;ZERO IS FLAG FOR DECIMAL
GETOCT:	MOVNI	T5,2		;MINUS TWO IS FLAG FOR OCTAL
GETNUM:	SETZ	T4,		;RESULT GOES INTO T4
	MOVEI	T2,6		;MAXIMUM OF SIX CHARS

GATOMA:	PUSHJ	P,GETCHR	;READ A CHAR
	JUMPE	CH,GATOMX	;DONE IF BREAK CHAR
	CAIN	CH," "		;SPACE?
	CAIE	T2,6		;AND NO CHARS SEEN YET?
	SKIPA			;NO
	JRST	GATOMA		;IGNORE LEADING SPACE
	CAIG	CH,"9"(T5)	;GREATER THAN 9 (7 FOR OCTAL)?
	CAIGE	CH,"0"		;OR LESS THAN 0?
	JRST	GATOMB		;YES, CANNOT BE A NUMBER
	SOJL	T2,GATOMA	;IGNORE ANY CHARS AFTER THE 6TH
	JUMPG	T5,GATOMC	;GO PROCESS SIXBIT IF ENTRY WAS GATOM
	IMULI	T4,^D10(T5)	;MULTIPLY BY 10 (8 FOR OCTAL)
	ADDI	T4,-"0"(CH)	;ADD IN NEW DIGIT
	JRST	GATOMA		;READ NEXT CHAR

GATOMB:	JUMPLE	T5,GATOMX	;ALL DONE IF DECIMAL OR OCTAL
	CAIG	CH,"Z"		;ALPHABETIC?
	CAIGE	CH,"A"		;(A THRU Z)
	JRST	GATOMX		;NOT ALPHA, MUST BE DELIMITER
	SOJL	T2,GATOMA	;IGNORE CHARS AFTER THE 6TH
GATOMC:	MOVEI	T1,-40(CH)	;CONVERT TO SIXBIT
	IDPB	T1,T3		;DEPOSIT INTO T4
	JRST	GATOMA		;READ ANOTHER CHAR

GATOMS:	PUSHJ	P,GETCHR	;READ ANOTHER CHAR UNTIL WE HIT NON-SPACE
GATOMX:	CAIN	CH," "		;IS DELIMITER A SPACE?
	JRST	GATOMS		;YES, IGNORE TRAILING SPACES
	JUMPLE	T5,CPOPJ	;ALL DONE IF OCTAL OR DECIMAL
	SETO	T5,		;SET UP TO BUILD MASK
	SKIPLE	T2		;SKIP IF ALL SIX CHARS SEEN
	LSH	T5,6		;SHIFT IN SIX ZERO BITS
	SOJG	T2,.-1		;LOOP UNTIL ALL SIX CHARS ACCOUNTED FOR
	POPJ	P,		;NOW RETURN
;MATCH	- ROUTINE TO FIND MATCH BETWEEN SIXBIT WORD IN T4
;	  AND TABLE POINTED TO BY T1. MASK IS IN T5.


MATCH:	HRRZ	T2,T1		;PRESET RESULT TO ZERO,,TABLE ADDR FOR NOMATCH
MATCHL:	MOVE	T3,(T1)		;GET NEXT WORD TO COMPARE WITH
	XOR	T3,T4		;SEE WHICH BITS MATCH
	TDNE	T3,T5		;CHECK MASKED BITS
	JRST	MATCHC		;NOT A MATCH
	JUMPGE	T2,MATCHB	;FIRST MATCH
	HRRZS	T2		;MORE THAN ONE MATCH FOUND
	POPJ	P,		;RETURN
MATCHB:	MOVE	T2,T1		;SAVE THE INDEX OF THE MATCH
MATCHC:	AOBJP	T1,.+1		;BUMP COUNTER PAST SECOND TABLE ENTRY
	AOBJN	T1,MATCHL	;LOOK THRU THE REST OF THE TABLE
	POPJ	P,		;RETURN




;BITMSK	- GENERATE A BIT MASK AND OFFSET INTO BIT TABLE OF JOBS LOGGED IN
;	  (JOB NUMBER IN B, MASK IN T2, OFFSET IN T1)


BITMSK:	MOVE	T1,B		;PUT JOB NUMBER IN T1
	IDIVI	T1,^D31		;MODULO 31
	HRLI	T2,400000	;SET UP BIT 0
	LSH	T2,-^D35(T2)	;SHIFT INTO PROPER POSITION AND CLEAR REMAINDER
	POPJ	P,		;RETURN

BITSET:	PUSHJ	P,BITMSK	;GET MASK
	IORM	T2,BITABL(T1)	;SET THE PROPER BIT
	POPJ	P,		;RETURN
;GETCHR	- READ A CHARACTER FROM TTY OR DISK, RETURN IN T1


	COLON=="/"		;CODE FOR A COLON
	SLASH==":"		;CODE FOR A SLASH
	COLASH==SLASH^!COLON	;MASK FOR INTERCHANGING SLASH AND COLON

GETCHR:	SKIPE	INPIND		;DISK OR TTY?
	JRST	CHRDSK		;DISK
	INCHWL	CH		;READ FROM TTY
	JUMPE	CH,.-1		;SHOULD NEVER HAPPEN

GETTST:	CAIN	CH,15		;CARRIAGE RETURN?
	JRST	GETCHR		;IGNORE IT
	CAIN	CH,12		;LINE FEED?
	JRST	CONLF		;CONVERT LINE FEED TO ZERO
	CAIE	CH,14		;FORM FEED?
	CAIN	CH,33		;OR ATLMODE?
	JRST	CONALT		;CONVERT TO LINE FEED
	CAIN	CH,11		;TAB?
	MOVEI	CH," "		;CONVERT TO SPACE
	CAIE	CH,"/"		;INTERCHANGE CODES FOR SLASH
	CAIN	CH,":"		;AND COLON
	TRC	CH,COLASH	;BY CHANGING DIFFERENCE BITS
	CAIG	CH,"z"		;LOWER CASE Z
	CAIGE	CH,"a"		;LOWER CASE A
	POPJ	P,		;NOT LOWER CASE
	SUBI	CH,40		;CONVERT LOWER CASE TO UPPER CASE
	POPJ	P,		;RETURN

CONALT:	OUTSTR	[BYTE (7)15,12]	;ECHO CRLF
CONLF:	MOVEI	CH,0		;ZERO FOR BREAK CHAR
	POPJ	P,		;RETURN
;CHRDSK	- READ A CHARACTER FROM DISK


CHRDSK:	SOSG	DSKBUF+2	;ANY CHARS LEFT?
	PUSHJ	P,INDSK		;NO, GET ANOTHER BUFFER
	ILDB	CH,DSKBUF+1	;GET NEXT CHAR
	JUMPE	CH,CHRDSK	;IGNORE NULL CHAR
	OUTCHR	CH		;ECHO CHAR ON TTY
	JRST	GETTST		;RETURN TO PROCESS CHARACTER

INDSK:	IN	DSK,		;INPUT A BUFFER
	POPJ	P,		;NO ERRORS
	OUTSTR	[ASCIZ/? INPUT ERROR ON CONTROL FILE.
/]
	JRST	ABEND		;TAKE ABNORMAL EXIT




;INTPTY	- INIT A PTY


INTPTY:	MOVEI	T1,PTY		;PTY CHANNEL
	RESDV.	T1,		;RESET THE CHANNEL
	JFCL			;IGNORE ERROR
	OPEN	PTY,PTYBLK	;OPEN PTY CHANNEL
	JRST	PTYERR		;INIT FAILURE
	INBUF	PTY,1		;ONE INPUT BUFFER
	OUTBUF	PTY,1		;ONE OUTPUT BUFFER
	POPJ	P,		;RETURN
PTYERR:	OUTSTR	[ASCIZ/? OPEN FAILURE ON PTY.
/]
	JRST	ABEND		;TERMINATE RUN
;PTYSTR	- OUTPUT ASCII TEXT TO PTY (ADDRESS IN T1)
;PTYMSG	- SAME AS PTYSTR BUT ALSO FORCES AN OUTPUT
;PTYCHR	- OUTPUT CHAR IN T2 TO PTY


PTYMSG:	PUSHJ	P,PTYSTR	;OUTPUT TEXT TO PTY
	OUTPUT	PTY,		;DO THE OUTPUT
	POPJ	P,		;RETURN


PTYSTR:	HRLI	T1,(POINT 7,0)		;SET UP BYTE POINTER
PTYBYT:	ILDB	T2,T1		;GET A CHAR
	JUMPE	T2,CPOPJ	;RETURN ON NULL CHAR
	PUSHJ	P,PTYCHR	;OUTPUT IT
	JRST	PTYBYT		;GET NEXT CHAR


PTYCHR:	PUSHJ	P,PTYCHK	;SEE IF ROOM FOR NEXT CHAR
	IDPB	T2,OBUF+1	;STASH CHAR
	POPJ	P,		;RETURN

PTYCHK:	SOSG	OBUF+2		;ANY ROOM?
	OUTPUT	PTY,		;NO, DUMP A BUFFER
	POPJ	P,		;RETURN




;PRIOCT	- OUTPUT OCTAL NUMBER IN T1 TO EITHER PTY OR TTY (ADDR IN T3)


PRIOCT:	IDIVI	T1,10		;CONVERT TO OCTAL
	HRLM	T2,(P)		;STORE FOR LATER
	SKIPE	T1		;ALL DONE?
	PUSHJ	P,PRIOCT	;NO
	HLRZ	T2,(P)		;GET LAST DIGIT
	ADDI	T2,"0"		;IN ASCII
	PJRST	(T3)		;BRANCH TO CHARACTER OUTPUT ROUTINE

TTYCHR:	OUTCHR	T2		;OUTPUT A CHAR TO TTY
	POPJ	P,		;RETURN



;PRDEC2 - PRINT A 2 DIGIT DECIMAL NUMBER IN T1


PRDEC2:	IDIVI	T1,^D10		;GET 2 DIGITS
PRDEC:	ADDI	T1,"0"		;CHANGE TO CHARACTER
	OUTCHR	T1		;OUTPUT IT
	ADDI	T2,"0"		;SAME WITH UNITS DIGIT
	OUTCHR	T2		;PRINT IT
	POPJ	P,		;RETURN



;DAYTIM - OUTPUT TIME OF DAY


DAYTIM:	OUTSTR	[ASCIZ/[/]
	MSTIME	T1,		;GET CURRENT TIME
	IDIVI	T1,^D1000	;IN SECONDS
	IDIVI	T1,^D3600	;GET HOURS
	IDIVI	T2,^D60		;GET MINS AND SECS
	PUSH	P,T2		;SAVE MINS
	IDIVI	T1,^D10		;GET TENS AND UNITS
	SKIPN	T1		;LEADING ZERO?
	MOVEI	T1,<" ">-<"0">	;CHANGE TO SPACE
	PUSHJ	P,PRDEC		;PRINT HOURS
	OUTSTR	[ASCIZ/:/]	;DELIMITER
	POP	P,T1		;GET BACK MINS
	PUSHJ	P,PRDEC2	;PRINT 2 DIGIT DECIMAL
	OUTSTR	[ASCIZ/:/]	;DELIMITER
	MOVE	T1,T3		;GET SECS
	PUSHJ	P,PRDEC2	;PRINT IT
	OUTSTR	[ASCIZ/] /]	;END BRACKET
	POPJ	P,		;RETURN
;DATA BASE


;INSTALATION DEPENDENT DATA


AREA:	ASCIZ/
/				;AREA PROGRAMS ARE STORED UNDER

PRGNAM:	[ASCIZ/LODIO/]		;PROGRAM NAMES
	[ASCIZ/LODCPU/]
	[ASCIZ/LODAVE/]
	[ASCIZ/LODPQ1/]
	[ASCIZ/LODSLP/]
	[ASCIZ/LODCOR/]
	[ASCIZ/LODOPN/]
NUMCLS==.-PRGNAM


;PARAMETERS


INPIND:	BLOCK	1		;0 IF INPUT FROM TTY, -1 IF FROM DISK
JOBOPT:	BLOCK	1		;OPTION, 0=CATEGORY, -1=MODULO
SYSTIM:	BLOCK	1		;TIME BETWEEN SYSTATS
NEXTIM:	BLOCK	1		;TIME OF NEXT SYSTAT
TESTIM:	BLOCK	1		;LENGTH OF TEST/TIME TO STOP TEST
MODNUM:	BLOCK	1		;MODULO NUMBER FOR MOD OPTION
CLASS:	BLOCK	1		;JOB COUNT FOR MODULO
BASPRJ:	BLOCK	1		;BASE PROJECT
BASPRG:	BLOCK	1		;BASE PROGRAMMER
CURPRJ:	BLOCK	1		;CURRENT PROJECT
CURPRG:	BLOCK	1		;CURRENT PROGRAMMER
CURJOB:	BLOCK	1	;JOB NUMBER OF JOB ON PTY
PTYLIM:	BLOCK	1		;TIME TO WAIT FOR PTY
SYSFLG:	BLOCK	1		;-1 WHEN SYSTAT JOB GETS LOGGED IN
KILLSW:	KILL			;SWITCH SET TO NON-ZERO TO KILL JOBS AT NORMAL EXIT
NJOBS:	BLOCK	1		;NUMBER OF JOBS LOGGED IN ON PTYS
HIGHJB:	BLOCK	1		;HIGHEST JOB NUMBER LOGGED IN WHEN WAKING JOBS


;DATA BLOCKS


PDL:	BLOCK	20		;PUSHDOWN LIST
PDP:	IOWD	20,PDL		;INITIAL PUSHDOWN POINTER
DSKBUF:	BLOCK	3		;DISK INPUT BUFFER HEADER
IBUF:	BLOCK	3		;PTY INPUT BUFFER HEADER
OBUF:	BLOCK	3		;PTY OUTPUT BUFFER HEADER
PTYBLK:	0			;PTY OPEN BLOCK
	'PTY   '
	OBUF,,IBUF
OPENBL:	BLOCK	3		;DISK OPEN BLOCK
LOOKBL:	BLOCK	4		;DISK LOOKUP BLOCK (MUST FOLLOW OPENBL)
BITABL:	BLOCK	21		;BIT TABLE FOR UP TO 512 JOBS
LOGMSG:	ASCIZ/LOG /		;START OF LOGIN MESSAGE
LOGTXT:	ASCIZ */NOOPTION/NOTICE:NEVER
*				;REST OF LOGIN MESSAGE



	END	LODTST