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, ;INCLUDE DEBUGGING HACKS IFNDEF CYCLSW, ;CYCLE CHANGES IFNDEF HUWSW, ;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,&777777, IFN &777777,> 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,> 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 PUSHJ P,BACKUP ;YES--REMOVE EXCLAMATION TRO F,F.SLF ;SET TO REMOVE NEXT CHAR IF JRST RSCRP1 ;AND SUCK UP 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 ; 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 ; 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 ? 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 , ;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 ;YES--SEND > OUTMO6: MOVEI T4,CR ;GIVE A FREE CARRIAGE RETURN PUSHJ P,OUTMO2 MOVEI T1,LF ;ISSUE AS A LINE FEED IFE DEBUG, 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_PNTR<0,0>; ; 0122 QQ_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) ; 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 > ;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