Trailing-Edge
-
PDP-10 Archives
-
bb-x130a-sb
-
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