TITLE BATCON -- GALAXY Batch Job Controller SUBTTL C.D.O'Toole/CDO 6 Mar 77 ;Copyright (C) 1974, 1975, 1976, 1977, ; Digital Equipment Corp., Maynard, MA. LSTING==0 ;NORMAL MODE IS LISTING ON BTNVER==102 ;MAJOR VERSION NUMBER BTNMIN==0 ;MINOR VERSION NUMBER BTNEDT==2067 ;EDIT NUMBER BTNWHO==0 ;WHO LAST PATCHED SEARCH QSRMAC ;QUASAR DATA BASE SYMBOLS PROLOGUE(BATCON) ;GENERATE THE REST OF THE SYMBOLS .REQUIRE CSPQSR ;COMPONENT TO QUASAR INTERFACE .REQUIRE CSPMEM ;MEMORY INTERFACE .REQUIRE SBSCOM ;COMMON ROUTINES SUBTTL Assembly Parameters IFN FTUUOS,< ;DEFINITIONS FOR TOPS10 IF1, DEFINE KJSTR,<[ASCIZ\KJOB/BATCH\]> DEFINE TIMSTR,<[ASCIZ/SET TIME /]> > ;END OF IFN FTUUOS IFN FTJSYS,< ;DEFINITIONS FOR TOPS20 IF1, DEFINE KJSTR,<[ASCIZ\LOGOUT\]> DEFINE TIMSTR,<[ASCIZ/SET TIME-LIMIT /]> OPDEF MONRT. [HALTF] ;RETURN TO THE MONITOR .FDSTR==.FDSTG ;REDEFINE SYMBOL IN FD AREA CTLBFR==4 ;MUST BE 4 SO THAT BUFFERS = 1 PAGE > ;END OF IFN FTJSYS SUBTTL Revision History COMMENT \ EDIT 1000 This was the version sent to In-House Q/A April 1974 EDIT 1001 Correct mixup in the channel allocator if the CTL file is not artifically preserved and DISPOSE:PRESERVE is set EDIT 1002 Have BACKTO give the correct error if the label was not found BEFORE the initiating BACKTO command EDIT 1003 Allow BACKTO and restart labels to skip over %FIN:: EDIT 1004 Allow NEXT command to select a job after the KSYS timer has expired EDIT 1005 Fix interaction of SILENCE & REVIVE commands with DIALOGUE mode & QUOTES (") EDIT 1006 Correct random little annoyances discovered by Q/A EDIT 1007 On a line with only the label (e.g. FOO::), the is NOT to be sent to the subjob. However, FOO::* gives a blank line to the subjob. Same for IF (cond) EDIT 1010 Reformat WHAT line for the operators EDIT 1011 Accept TELL, KILL, REQUEUE, etc... when a job is STOPped EDIT 1012 More of EDIT 1005, still a problem with SILENCE & REVIVE EDIT 1013 Reformat DIALOGUE mode output for the operator EDIT 1014 Include .MESSAGE for the Mini-Batch Standard It is the same as PLEASE EDIT 1015 Give more information when the user can't use the specified LOG file EDIT 1016 General cleanup of code and elimination of subroutines no longer needed EDIT 1017 Make more efficient use of old PTY channels. Big help when MJOB .GT. 5 EDIT 1020 Correct problem with REQUEUE labels EDIT 1021 This was the version sent to Field Test June 1974 EDIT 1022 A leading tab was changed into a blank, shouldn't do that EDIT 1023 Include /NAME:"" on the LOGIN line EDIT 1024 LOGIN error code 1 is the same as a warning message. Treat it as such. EDIT 1025 Plug a hole in the SFD code EDIT 1026 Can only force /RESTART:YES on Checkpoint EDIT 1027 Post-job disposal of the CTL file wasn't done if the job was cancelled because of LOGIN EDIT 1030 Provide some additional information in the CURRENT command output EDIT 1031 Some more general cleanup EDIT 1032 Routines that save and restore the CTL file position were being thrown off by "^" in strange places EDIT 1033 Include BTNxxx for all error messages the user receives EDIT 1034 Using "1H+" for Fortran overprinting would start at the time stamp, not at column 17 EDIT 1035 Implement several suggestions EDIT 1036 QTS was called from one place, remove lots of code and change all references to QTS0 to QTS EDIT 1037 A timing problem was introduced by EDIT 1024, correct it. EDIT 1040 Implement more suggestions EDIT 1041 This was the version released to the Field November 1974 Edits made to version 12 by Software Support that are also in version 100 EDIT 1051 GETSTS returns the status in the right half, Teach this to GETCTL. (SPR 15846) EDIT 1054 Suppress trailing blanks on lines destined for the monitor command decoder. This should avoid any problems associated with card input. EDIT 1055 With edit 477 of LOGIN, LOGMAX is now enforced. Invent error code 5 to mean requeue this job, shutdown Batch for NJNINT minutes. (SPR 16184) Edits made during the development of version 13 that are also in version 100 EDIT 1060 Separate old and new LOG files with a Form-Feed. Do this to more easily recognize when a LOG file is used more than once (SPR several suggestions) EDIT 1061 Invent a new reserved label %TERR::. Control is passed to this label if TIME LIMIT EXCEEDED is detected. It follows the same rules of precedence as %ERR:: with respect to %FIN::. The %EXTRA time is given but the CLOSE/DUMP is not sent, allowing REENTER to be used for program cleanup for intelligent jobs. EDIT 1063 De-implement the following: (maintained for 1 versions worth of compatability) The FORCE Command (use NEXT) The old style $ processing for CDRSTK (who?) EDIT 1064 The correct path wouldn't be sent to LOGIN if there were no SFD levels. Send it if the P,Pn's are different. EDIT 1070 Plug a security hole. EDIT 2000 Begin conversion of MPB BATCON (v12) to the GALAXY-10 system Major changes (aside from queueing protocol) include: Remove FTOPR options for a separate BATOPR Remove all code for LOGSWS conditionals, LOGIN v.57 is required De-implement edit 1017 Redefine AC usage to conform with QUASAR's Change ATOKJB to talk to LOGOUT v.100 CORE/MCORE parameters are P internally but K for the operators. Remove WHKSYS conditionals, Work is done by QUASAR At the request of our operators, the default value of PROMPT is 5 min. Remove all the BATCON assembly parameters that are now defined in the GALGEN dialogue. This was the version sent with GALAXY-10 Field Test, June 1975 EDIT 2001 Report the P,Pn of the user requesting the cancellation of a job (ABO.DI) EDIT 2002 Can get a job from QUASAR with EQ.RDE set, turn them around. EDIT 2003 Quotes (") output from LOGOUT should be typed to the operator. EDIT 2004 Fix all the code dealing with core limit enforcment. INPCOR, the default value of /CORE, is used to conditionally assemble the enforcement code. If defined = 0, code is not assembled since NO was answered to the GALGEN question concerning core enforcment. EDIT 2005 Take advantage of the new routine in CSPQSR. Call CSPPSI to enable terminal input interrupts, avoid lots of SKPINL's. General code cleanup. EDIT 2006 Become version 101 EDIT 2007 .EQPAT is optional, Check for it. EDIT 2010 Convert to TOPS20 style LOGIN, File handling, etc... EDIT 2011 Fix all the bugs caused by edit 2010 EDIT 2012 The TOPS10 code got broken by edits 2010 & 2011, fix that. EDIT 2013 Implement the new values for /OUTPUT, they are: /OUTPUT:NOLOG Don't print the LOG /OUTPUT:LOG Print it (default) /OUTPUT:ERROR Print it if an unhandled error occurred EDIT 2014 Some Code Cleanup and Bug Fixes, Specifically: Use the PROLOGUE macro to get SBSMAC Symbols. Calling sequence to CSPINI has changed. 6.03 Monitor uses 1B2 of the OPEN of a PTY to indicate that jobs on that PTY are Batch. A bug in the TOPS20 code that PMAP'ed away my addressing space is corrected (a real cute one). Another TOPS20 bug that left the Log file JFN hanging around. The CHECKPOINT/REQUEUE messages have changed. Remove the old MPB restriction of 5 character labels for CHKPNT and /TAG. EDIT 2015 On the -20, before logging a job out delete any spooled input files created by SPRINT for it. EDIT 2050 Become version 102. Begin to eliminate TOPS10 UUOs on TOPS20. EDIT 2051 More of Edit 2050. EDIT 2052 Add ROUTE operator command, tell QUASAR of operators request. EDIT 2053 Removed EDIT 2054 Start converting to the version 2 database format. EDIT 2055 Convert to TOPS20 release 2 JSYSes. EDIT 2056 Do some cleanup work on operator output. EDIT 2057 Rework LOG file logic to do "in-his-behalf" FILOP on the -10. EDIT 2060 Include jobname, user id, and sequence number on all messages to the operator. Fix a problem on the -20 where the LOGIN command was not always sent correctly. EDIT 2061 Remove angle brackets around user name on "cancelled" message on the -20. Fix some minor problems. EDIT 2062 Spooled card-reader files were not getting deleted on 20 due to a recently introduced bug in DELSPL. EDIT 2063 Fix a timing problem on -20 which caused BATCON to not realize a job had really logged out. ;;First field-test release of GALAXY release 2, Jan, 1977 EDIT 2064 Fix a bad symbol reference in -10 version when core enforcement is turned on (%NSMXM). QAR #3. EDIT 2065 Make log files work on device NUL on the -20. Don't CHKAC them and don't send to LPTSPL. EDIT 2066 Fix a bug caused by edit 2052 which let BATCON start processing jobs before a START command was typed. (qar #9). EDIT 2067 Edit 2066 caused some additional problems. Try again. \ SUBTTL Assembly Parameters (Define the Options) DEFINE PARMS< ;;TYPE 1 OPTIONS - DEFINE STATIC PARAMETERS X ONESEG,0 ;;NORMALLY A TWO SEGMENT PROGRAM X CTLBFR,2 ;;NUMBER OF CTL BUFFERS IN CORE X LOGBFR,2 ;;NUMBER OF LOG BUFFERS IN CORE X PTYBFR,1 ;;NUMBER OF PTY BUFFERS IN THE RING X PROMPT,5 ;;TIMER IN MINUTES FOR JOBS IN OPERATOR WAIT X JOBMSG,0 ;; 1 IF JOB STARTED/ENDED MESSAGES ARE DESIRED ;;TYPE 2 OPTIONS - DEFINE DEFAULTS AND RANGES FOR OPERATOR COMMANDS X DEFMJB,^D5 ;;DEFAULT VALUE OF 'MJOB' WHEN STARTED X REQTIM,^D10 ;;DEFAULT REQUEUE TIME IN MINUTES ;;TYPE 3 OPTIONS - DEFINE OTHER PARAMETERS X TPSIZE,50 ;;SIZE OF THE TOP LEVEL PUSH DOWN LIST X .JPSIZ,30 ;;SIZE OF THE STACK FOR EACH SUBJOB X NJNINT,^D4 ;;MINUTES TO WAIT IF JOB CAPACITY IS EXCEEDED X CH.LGI,"/" ;;CHARACTER SENT BETWEEN PROJ AND PROG NUMBERS X %EXTRA,^D10 ;;PERCENTAGE OF EXTRA TIME GIVEN TO A JOB > DEFINE X(A,B)> ;;DEFINE THE SYMBOL IF NOT ALREADY DEFINED PARMS ;EXPAND THE ASSEMBLY PARAMETERS MIN <^D14,INPNUM>,JOBMAX, ;SMALLEST OF 14 AND GALGEN BATCH STREAMS SYSPRM MONCHR,".","@" ;MONITOR PROMPT CHARACTER ;USED AS FIRST CHARACTER OF INPUT LINE TO ;DIRECT LINE TO THE MONITOR SYSPRM OPRPST,, ;OPR PROMPT STRING ;CONSISTENCY CHECK FOR ASSEMBLY PARAMETERS IFLE DEFMJB,< PRINTX DEFMJB.LT.1, 1 ASSUMED DEFMJB==1> IFG ,< PRINTX DEFMJB.GT.JOBMAX, JOBMAX ASSUMED DEFMJB==JOBMAX> IFN PROMPT,< IFL ,< PRINTX PROMPTING INTERVAL .LT. 1 MINUTE, 1 MINUTE ASSUMED PROMPT==1>> IFL ,< PRINTX NO JOB NUMBER WAIT .LT. 1 MINUTE, 1 MINUTE ASSUMED NJNINT==1> IFLE CTLBFR,< PRINTX CTLBFR.LT.1, 1 ASSUMED CTLBFR==1> IFLE LOGBFR,< PRINTX LOGBFR.LT.1, 1 ASSUMED LOGBFR==1> IFLE PTYBFR,< PRINTX PTYBFR.LT.1, 1 ASSUMED PTYBFR==1> IFL <%EXTRA-^D10>!<^D100-%EXTRA>,< PRINTX BAD VALUE FOR THE PERCENTAGE OF EXTRA TIME, 10% ASSUMED %EXTRA==^D10> IFLE REQTIM,< PRINTX REQUEUE TIMER .LT. 1 MINUTE, 1 MINUTE ASSUMED REQTIM==1> SUBTTL Other Definitions (Bits, AC's, Macros, etc...) ;ACCUMULATOR DEFINITIONS (MUST BE IN THE ORDER DISTRIBUTED) ;THESE DEFINITIONS PARALLEL QUASAR-10 DEFINITIONS ;AC BLOCK 0-13 IS SAVED FOR EACH STREAM IN .JREGS(R) ;AC 17 IS ALSO SAVED T1==1 ;TEMPORARY AC (QUASAR AC 'S1') T2==2 ; " " (QUASAR AC 'S2') ;AC'S (A - D) ARE QUASAR AC'S (T1 - T4) ;AND CAN BE SAVED BY CALLING CO-ROUTINE .SAVET IN CSPMEM A==3 ;BEGINNING OF 4 REGS FOR LOOKUP/ENTER AND THINGS B==4 ;CAN BE USED FOR OTHER THINGS IF UNDERSTOOD C==5 ;THAT THEY CAN BE CLOBBERED BY ANY I/O SELECT D==6 ;FOR THE PTY, CTL FILE, OR LOG FILE IO1==7 ;REGISTERS USED BY THE I/O HANDLER IO2==10 F==11 ;ONE OF THE FLAG WORDS FOR THE STREAM (AC R IS THE OTHER) J==12 ;JOBSTS FOR THE STREAM CH==13 ;RANDOM CHARACTER HOLDER (QUASAR AC 'AP') ;END OF SAVED AC'S FOR EACH STREAM G==14 ;GLOBAL BATCON FLAGS S==15 ;STREAM INDEX R==16 ;RELOCATION FOR THE STREAM (LH ARE STREAM FLAGS) P==17 ;PUSH DOWN LIST POINTER ;IS USED FOR BOTH TOP LEVEL PDL ;AND INDIVIDUAL STREAM LISTS ;DEFINE SOME CONSTANTS AFTER CONSISTENCY CHECKS (PS. DON'T EVER CHANGE THESE) DSKBLK==^D128 ;WORDS IN A DISK BLOCK PTYBLK==23 ;WORDS IN A PTY BUFFER CTLCHR==*CTLBFR ;NUMBER OF CHARACTERS BUFFERED FOR CTL FILE LOGCHR==*LOGBFR ;NUMBER OF CHARACTERS BUFFERED FOR LOG FILE HIBERP==260,,0 ;HIBERNATE UUO PARAMETER BITS IFN INPCOR, ;WATCH CORMAX EVERY MINUTE IFN FTJSYS, ;WATCH FOR INCOMING JOBS ON TOPS20 ;FLAG SETTINGS OF GLOBAL MEANING ;AC G (LH) GL.STA==400000 ;BATCH IS STARTED GL.SSH==200000 ;OPERATOR WANTS TO STOP SCHEDULING GL.NJN==100000 ;NO MONITOR JOB NUMBERS GL.STC==040000 ;SOMETHING CAUSED A STATUS CHANGE GL.ALL==020000 ;SUBJOB SPECIFIED WAS ALL GL.RMT==010000 ;THE MONITOR HAS REMOTE STATION FEATURE GL.PAG==004000 ;LAST MESSAGE WAS PAGED GL.EXI==002000 ;OPERATOR EXIT COMMAND IN EFFECT GL.CON==001000 ;CONTACT WITH QUASAR GL.UC0==000400 ;TURN OFF THE CHANNEL USURPER ;AC G (RH) ;INITIAL SETTINGS FOR G GL.INI==GL.ALL ;DEFAULT SUBJOB IS ALL GR.INI==0 ;NO RIGHT HALF FLAGS ;FLAGS SETTINGS FOR BATCH STREAMS ;AC R (LH FLAGS ONLY) RL.ACT==400000 ;STREAM IS ACTIVE (MUST BE THE SIGN BIT) RL.UST==200000 ;USETI/USETO NEEDED FOR CTL/LOG FILES RL.JNA==100000 ;JOB NUMBER IS EVER ASSIGNED RL.OPR==040000 ;WAITING FOR OPERATOR RESPONSE RL.TIM==020000 ;TIME STAMP IS NEEDED FOR THE LOG FILE RL.JIE==010000 ;JOB IS IN ERROR STATE RL.FCI==004000 ;FIRST CHARACTER OF INPUT FROM CTL FILE RL.KJB==002000 ;AUTO KJOB LINE HAS BEEN SENT RL.IGN==001000 ;DONT SAVE CHARS FOR THE OPERATOR LINE RL.DCT==000400 ;USER HAS PRIVS TO DELETE THE CTL FILE RL.CMT==000200 ;A COMMENT FROM THE OPERATOR IS READY RL.LGI==000100 ;JOB IS LOGGING IN NOW RL.EOL==000040 ;END OF LINE CHARACTER HAS BEEN SENT RL.QTS==000020 ;QUOTES SEEN RL.DIA==000010 ;USER IS IN DIALOGUE MODE RL.STP==000004 ;JOB IS STOPPED BY THE OPERATOR RL.NLG==000002 ;NO LOG FILE AVAILABLE ;INITIAL SETTINGS FOR R RL.INI==RL.ACT!RL.LGI ;FOR A NEW JOB SET ACTIVE, LOGIN IN PROGRESS ;AC F (LH) FL.PER==400000 ;MONITOR LEVEL LINE STARTED WITH A PERIOD FL.NER==200000 ;NOERROR IS IN EFFECT FL.PLS==100000 ;DOING A PLEASE COMMAND FL.SUP==040000 ;SUPPRESS THE NULL LINE (=MODE) FL.LUP==020000 ;LOG FILE HAS BEEN UPDATED, USETO POINTERS ARE CORRECT FL.LAB==010000 ;FOUND A LABEL ON THIS LINE FL.SIL==004000 ;SILENCE THE LOG FILE FL.UPA==002000 ;DOING UPARROW PROCESSING FL.ACC==001000 ;NEED TO CHECK READ PRIVLEGES FOR THE CTL FILE FL.TLE==000400 ;TIME LIMIT WAS EXCEEDED FL.%XT==000200 ;%EXTRA TIME HAS BEEN GIVEN FL.EXM==000100 ;OPERATOR WANT TO EXAMINE THE CTL FILE FL.KIL==000040 ;OPREATOR WANTS TO KILL THIS JOB FL.REQ==000020 ;OPERATOR WANTS TO REQUEUE THIS JOB FL.CRS==000010 ;CARRIAGE RETURN SEEN ;AC F (RH) FR.RSC==400000 ;WANT COMMAND SCANNER TO RE-GET LAST CHARACTER FR.%SG==200000 ;A % SIGN IS A LEGAL SIXBIT CHARACTER FR.FSI==100000 ;FORCED USETI IN GETCTL FR.BAK==040000 ;BACKTO IN PROGRESS FR.LSL==020000 ;LIST LINES SKIPPED IN LABEL SEARCHES FR.FIN==010000 ;THIS LABEL SEARCH CAN PASS A %FIN:: FR.ABU==004000 ;JOB CANCELLED BY USER /KILL COMMAND FR.FLL==002000 ;FIRST LOOK AT THE LOG FILE FR.UHE==001000 ;AN UNHANDLED ERROR OCCURRED FR.NBL==000400 ;IN GETRDX, A NON-BLANK HAS BEEN FOUND ;INITIAL SETTINGS FOR F FL.INI==FL.ACC ;FOR A NEW JOB NEED A CHECK FR.INI==FR.FLL ;FIRST LOOK AT THE LOG FILE ;FLAGS RETURNED BY THE JOBSTS UUO JL.UJA==400000 ;USER JOB NUMBER ASSIGNED JL.ULI==200000 ;USER LOGGED IN JL.UML==100000 ;USER IS AT MONITOR LEVEL JL.UOA==040000 ;USER OUTPUT IS AVAILABLE JL.UDI==020000 ;USER CAN DO INPUT JL.UJC==010000 ;USER HAS JACCT ;CHARACTERS CHR.CC==3 ;CONTROL C CHR.CG==7 ;CONTROL G CHR.HT==11 ;HORIZONTAL TAB CHR.LF==12 ;LINE FEED CHR.VT==13 ;VERTICAL TAB CHR.FF==14 ;FORM FEED CHR.CR==15 ;CARRIAGE RETURN CHR.CZ==32 ;CONTROL Z CHR.A1==33 ;STANDARD ALTMODE CHR.OA==74 ;OPEN ANGLE BRACKET CHR.CA==76 ;CLOSE ANGLE BRACKET ;GETTAB TABLES .GTSTS==0 ;USER JOB STATUS ST.RUN==1B0 ;JOB IS RUNNABLE NOW ST.CMW==1B1 ;COMMAND IS WAITING FOR CORE ST.SWP==1B7 ;JOB IS SWAPPED OR BEING SWAPPED ST.CLK==1B18 ;JOB HAS A CLOCK REQUEST ST.JDC==1B20 ;WAITING FOR DUMP ST.IRQ==1B22 ;WAITING FOR OPERATOR INTERVENTION .GTPRG==3 ;USER PROGRAM NAME .GTWSN==25 ;TABLE OF SIXBIT NAMES FOR WAIT CODES ;OPCODE DEFINITIONS OPDEF TXTLOG [001000,,0] ;BATCON UUO - TEXT TO THE LOG FILE OPDEF TXTJOB [002000,,0] ;BATCON UUO - TEXT TO THE JOB OPDEF SIXLOG [003000,,0] ;BATCON UUO - SIXBIT TEXT TO THE LOG FILE OPDEF SIXJOB [004000,,0] ;BATCON UUO - SIXBIT TEXT TO THE JOB OPDEF MSGTTY [005000,,0] ;BATCON UUO - AN ERROR MESSAGE TO THE TTY OPDEF MSGLOG [006000,,0] ;BATCON UUO - AN ERROR MESSAGE TO THE LOG FILE OPDEF IDENT [007000,,0] ;BATCON UUO - OUTPUT LINE IDENTIFIER IFN FTJSYS,< OPDEF OUTCHR [010000,,0] ;BATCON UUO - CHARACTER TO THE TTY OPDEF OUTSTR [011000,,0] ;BATCON UUO - STRING TO THE TTY > ;END OF IFN FTJSYS ;MACRO DEFINITIONS DEFINE LSTOFF< ;MACRO TO TURN OFF THE LISTING IFE LSTING,< .XCREF XLIST> LSTING==LSTING+1 ;COUNT XLIST DEPTH > DEFINE LSTON< ;MACRO TO TURN THE LISTING BACK ON LSTING==LSTING-1 ;DECREMENT XLIST LEVEL IFE LSTING,< ;DON'T TURN IT ON IF STILL NESTED .CREF LIST SALL> > ;SET UP FOR BALANCE OF ASSEMBLY IFE ONESEG, ;ASSEMBLING MULTI SEGMENT PROGRAM LOC 41 PUSHJ P,UUOCON ;UUO INTERRUPT LOC 137 BYTE (3)BTNWHO (9)BTNVER (6)BTNMIN (18)BTNEDT RELOC 0 IFE ONESEG, ;MULTI SEGMENT PROGRAM, START IN THE HIGH SEG SUBTTL BATCON Entry Section BATCON: JFCL ;NO CCL ENTRY POINT RESET MOVE P,[IOWD TPSIZE,TOPPDL] ZERO S1 ;WANT CSPQSR TO HANDLE THE INTERRUPT SYSTEM PUSHJ P,CSPINI## ;INITIALIZE THE CUSP - QUASAR INTERFACE MOVE G,[GL.INI,,GR.INI] ;SET INITIAL ENTRY FLAGS SETZM LOWDAT ;PREPARE TO CLEAR THE LOW SEG MOVE A,[LOWDAT,,LOWDAT+1] BLT A,LASLOW-1 ;CLEAR ALL THE LOW SEGMENT MOVEI A,DEFMJB ;GET DEFAULT VALUE OF MJOB MOVEM A,MJOB MOVEI A,777777 ;SET TIME VALUES VERY LARGE MOVEM A,UTIME ;AS SINGLE JOB MAXIMUM MOVEM A,ATIME ;AND TOTAL OF ALL BATCH MOVEM A,CORPHY ;SET UP PHYSICAL MEMORY MOVEM A,CORMAX ;AND SINGLE JOB LIMIT VERY LARGE PUSHJ P,CONTTY ;ENABLE THE COMMAND TERMINAL PUSHJ P,ONCECN ;SET UP ONCE ONLY CONSTANTS PUSHJ P,UPDADD ;SET UP SYSTEM DEFAULTS BEFORE STARTING PUSHJ P,OPRSTA ;PROMPT OPERATOR NOW SUBTTL Dispatch and Time slice Routines TOPLVL: PUSHJ P,OPRCOM ;ATTEND THE OPERATOR SKIPN STACTV ;ANY STREAMS ACTIVE JRST DISP.3 ;NO, SEE IF SCHEDULING HAS HAPPENED TOPDIS: PUSHJ P,GETMST ;GET CURRENT TIME (MS.) MOVEM T1,CURMST ;SAVE FOR TIME STAMPS, TIMERS, ETC.. MOVEI S,1 ;START AT THE BEGINNING DISP.1: SKIPGE R,BASTBL-1(S) ;IS THIS STREAM ACTIVE JSP A,CHKOPR ;YES, CHECK IF JOB IS IN OPERATOR WAIT JRST DISP.2 ;CANNOT PROCESS THIS STREAM MOVSI 17,.JREGS(R) ;SET TO RESTORE PROCESSOR REGS BLT 17,13 ;RESTORE 0-13 MOVE 17,.JREGS+14(R) ;AND RESTORE P POPJ P, ;RETURN TO INTERUPTED PROCESS ;RETURN FROM PROCESS IS BY PUSHJ P,QTS. WHICH SAVES THE REGS AND ;PROCEEDS TO NEXT PROCESS. QTS: MOVEM R,BASTBL-1(S) ;SAVE R FLAGS MOVEM 17,.JREGS+14(R) ;SAVE P MOVEI 17,.JREGS(R) ;SET TO SAVE THE PROCESSOR REGS BLT 17,.JREGS+13(R) ;SAVE THEM ALL TLNN R,RL.ACT ;DID STREAM BECOME INACTIVE JSP A,CLRACT ;YES, CLEAN UP THE STREAM DISP.2: CAMGE S,HIACTV ;PASSED ALL ACTIVE JOBS AOJA S,DISP.1 ;NO, SKIP TO NEXT MOVE P,[IOWD TPSIZE,TOPPDL] ;RESTORE TOP LEVEL PDL DISP.3: PUSHJ P,SCHED1 ;SEE IF SCHEDULING HAS OCCURRED SKIPN STACTV ;NOW ARE THERE STREAMS ACTIVE PUSHJ P,EXIRES ;NO, CHECK EXIT/RESET STATUS MOVX T1,HIBERP ;SET WAKE UP CONDITIONS SKIPN STACTV ;ANY STREAMS ACTIVE TLNE G,GL.NJN ;OR WAITING FOR JOBS HRRI T1,^D15*^D1000 ;YES, SET A TIMER FOR THE SLEEP HIBER T1, ;TAKE A NAP JFCL ;NICE TRY JRST TOPLVL ;REENTER TOP LEVEL LOOP EXIRES: TLNE G,GL.EXI ;A PENDING EXIT JRST DOEXIT ;YES, DO THE EXIT TLNN G,GL.SSH ;CEASE SCHEDULING (RESET) JRST M$CLNC## ;NONE PENDING, RETURN AFTER CLEAN UP TLNE G,GL.CON ;IN CONTACT WITH QUASAR PUSHJ P,TELQSR ;YES, SAY GOOD-BYE PUSHJ P,TTCRLF ;BLANK LINE OUTSTR [ASCIZ/[BATCON is now RESET]/] PUSHJ P,TTCRLF ;INFORM OF THE RESET JRST BATCON ;SO THE "/" ISN'T A SUPRISE DOEXIT: TLNE G,GL.CON ;IN CONTACT WITH QUASAR PUSHJ P,TELQSR ;YES, SAY GOOD-BYE JRST EXIT.. ;EXIT NOW SUBTTL Scheduling and Stream Control Routines SCHED1: PUSHJ P,NJNCHK ;CHECK FOR TIMER ON NO JOB NUMBERS JFCL ;IGNORE THE RETURN PUSHJ P,UPDADD ;UPDATE ANY ADDITIONAL PARMS BEFORE LOOP TLZE G,GL.STC ;DID MY STATUS CHANGE PUSHJ P,TELQSR ;YES, TELL QUASAR PUSHJ P,CSPRCV## ;CHECK FOR MESSAGES, RECEIVE ONE IF THERE JUMPE T1,CPOPJ ;NOPE, RETURN TO DISPATCH TXNE T1,1B0 ;IS IT A PAGED TYPE TLO G,GL.PAG ;YES, REMEMBER THAT MOVEI J,(T1) ;COPY MESSAGE ADDRESS PUSHJ P,WAKEME ;POKE THE DISPATCH LOOP LOAD T1,.MSTYP(J),MS.TYP ;GET THE MESSAGE TYPE CAIN T1,.QONEX ;A NEW JOB FOR ME TO RUN JRST SCHNXT ;YES, GO START IT CAIN T1,.QOABO ;CANCEL A JOB ALREADY RUNNING JRST SCHCAN ;YES, GO END IT CAIN T1,.QOCAN ;COUNT ANSWER JRST SCHCOU ;YES, DISPLAY COUNTS SCHRET: TLZN G,GL.PAG ;WAS THE MESSAGE PAGED POPJ P, ;NO, RETURN LSH J,-^D9 ;CONVERT TO A PAGE NUMBER MOVEI CH,(J) ;COPY INTO 'AP' JRST M$RELP## ;RETURN THE PAGE AND RETURN ; HERE TO START A NEW JOB, FIRST FIND A FREE STREAM SCHNXT: TLNN G,GL.CON ;ARE WE IN CONTACT NOW (IN CASE OF STATUS CHANGE) JRST SCHRET ;NO, IGNORE THE RECEIVE QUEUE LOAD S,.EQSEQ(J),EQ.RDE ;SEE IF THIS IS A REAL JOB JUMPN S,SCHN.3 ;JUMP IF REALLY NOT THERE MOVEI S,1 ;FIND A FREE STREAM SCHN.1: SKIPL BASTBL-1(S) ;LOOK FOR ONE WITH RL.ACT OFF JRST SCHN.2 ;FOUND ONE CAIGE S,JOBMAX ;OVER THE LIMIT AOJA S,SCHN.1 ;NO, KEEP LOOKING TLON G,GL.SSH!GL.STC ;SET A FEW PANIC FLAGS MSGTTY [ASCIZ/QUASAR sent too many jobs, BATCON will RESET/] JRST SCHRET ;DISMISS THE MESSAGE SCHN.2: PUSHJ P,FIREUP ;START UP A NEW STREAM FROM THE TOP LEVEL JRST SCHRET ;DISMISS THE MESSAGE ; HERE WHEN QUASAR SENT US A JOB WITH EQ.RDE SET, FORGET IT SCHN.3: MOVEI A,QSRMSG ;POINT TO THE MESSAGE BLOCK MOVX B, MOVEM B,.MSTYP(A) ;STORE LENGTH AND TYPE MOVE B,.EQITN(J) ;THE JOB NAME MOVEM B,REL.IT(A) ;FOR THE RELEASE PUSHJ P,SNDQSR## ;TURN THE JOB AROUND JRST SCHRET ;GET RID OF THE PAGE (IF ANY) ;HERE WHEN QUASAR REQUESTED US TO CANCEL A RUNNING JOB SCHCAN: MOVE T1,ABO.IT(J) ;GET THE ITN TO CANCEL MOVEI S,1 ;START AT STREAM 1 SCHC.1: SKIPGE R,BASTBL-1(S) ;STREAM INACTIVE CAME T1,Q.ITN(R) ;NO, IS THIS THE SAME ITN JRST SCHC.2 ;NOT THE ONE, TRY NEXT STREAM MOVEI F,FR.ABU ;GET THE CANCELLED FLAG IORM F,.JREGS+F(R) ;SET IN JOB PROCESSOR FLAGS MOVE F,ABO.ID(J) ;GET THE USER THAT REQUESTED THE CANCELLATION MOVEM F,.JKILR(R) ;SAVE SO WE CAN OUTPUT IT TLO R,RL.CMT ;SET INTERVENTION MOVEM R,BASTBL-1(S) ;STORE THE SETTING SCHC.2: CAMGE S,HIACTV ;PASS THE HIGHEST STREAM YET AOJA S,SCHC.1 ;NO, TRY ANOTHER JRST SCHRET ;DISMISS THE MESSAGE ;SUBROUTINE TO START UP A NEW JOB ( EXTRACT VARIABLES, SET RUNABLE) FIREUP: MOVEI T1,.JPAGS ;NUMBER OF PAGES NEEDED FOR THE DATA BASE PUSHJ P,M$AQNP## ;GET A PAGE FOR THE DATA BASE MOVEI R,(CH) ;PUT THE PAGE NUMBER IN R LSH R,^D9 ;CONVERT TO AN ADDRESS MOVEM R,BASTBL-1(S) ;SAVE FOR THE DISPATCHER SETZM (R) ;CLEAR JOB DATA BASE HRLI B,(R) ;SET UP FOR BLT HRRI B,1(R) BLT B,.JSIZE-1(R) ;CLEAR IT ALL FIRE.1: PUSHJ P,CHNPTY ;GET A PTY ASSIGNMENT SKIPA ;NONE, MUST GET A REAL PTY JRST [PUSHJ P,RELREL ;REMOVE IT JRST FIRE.1] ;CAUSE THE RING MAY HAVE MOVED JUMPE IO1,FIRE.E ;CANNOT GET A PTY CHANNEL (THIS IS A BUG) MOVSI A,(1B0!1B2) ;WANT ASCII MODE ON A REAL PTY MOVSI B,'PTY' ;GET GENERIC PTY HRLI C,.JPOUT(R) ;XWD OUTPUT,INPUT HRRI C,.JPINP(R) PUSHJ P,CHANIO ;TRY IT INIT THE DEVICE OPEN 0,A JRST FIRE.N ;CANNOT, RELEASE ASSIGNMENT AND RETURN HLRZ A,IO1 ;COPY CHANNEL NUMBER LSH A,-^D5 ;AS A NUMBER HRRM A,.JPCHN(R) ;SAVE FOR EASY USAGE HLLM IO1,.JPCHN(R) ;SAVE AS A CHANNEL FOR EASIER USE ;;; FIREUP IS CONTINUED ON THE NEXT PAGE IFN FTJSYS,< MOVE T1,[1,,A] ;ONE ARGUMENT IN "A" HRL A,.JPCHN(R) ;THE PTY CHANNEL NUMBER HRRI A,10 ;FUNCTION 10 = TOPS10 CHANNEL TO JFN COMPT. T1, ;CONVERT IT JRST FIRE.N ;BUG IN THE COMPATABILITY PACKAGE, RETURN CHANNEL MOVEM T1,.JPJFN(R) ;SAVE PTY JFN FOR LATER MOVEI T2,.MOBAT ;SET BATCH FUNCTION MOVEI A,.MOJCB ;A = T2 + 1 , SET THE BATCH PTY BIT MTOPR ;AFFECTS JOBS LOGGING IN ON THIS PTY > ;END OF IFN FTJSYS MOVSI A,400000 ;NOT IN USE BIT HRRI A,.JPTYO+1(R) ;FIRST IN RING MOVEM A,.JPOUT(R) ;SET FOR BUFFERED OUTPUT HRRI A,.JPTYI+1(R) ;SAVE FOR INPUT SIDE MOVEM A,.JPINP(R) MOVSI A,(POINT 7,0) ;BYTE SIZES MOVEM A,.JPINP+1(R) HRRI A,.JPTYO+3(R) ;COUNTS ARE ZERO FROM ABOVE BLT MOVEM A,.JPOUT+1(R) ;FOR INPUT AND OUTPUT MOVSI A,PTYBLK-2 ;PLACE SIZE-2 IN THE LEFT HALF IFE ,< ;ONLY 1 BUFFER EACH WAY HRRI A,.JPTYO+1(R) ;RING LOOPS ON ITSELF MOVEM A,.JPTYO+1(R) HRRI A,.JPTYI+1(R) ;SAME FOR INPUT MOVEM A,.JPTYI+1(R) > IFG ,< ;MULTIPLE BUFFERS MOVEI B,PTYBFR-1 ;LOOP COUNT HRRI A,.JPTYO+1+PTYBLK(R) ;POINT TO SECOND BUFFER JRST .+2 ;SKIP FOR THE FIRST BUFFER HRRI A,PTYBLK(A) ;POINT TO NEXT BUFFER MOVEM A,-PTYBLK(A) ;STORE ADDR INTO PREVIOUS BUFFER SOJG B,.-2 ;DO FOR ALL BUFFERS HRRI A,.JPTYO+1(R) ;POINT BACK TO FIRST MOVEM A,.JPTYO+1+<*PTYBLK>(R) ;LAST LINKS TO FIRST MOVEI B,PTYBFR-1 ;NOW DO THE SAME FOR INPUT SIDE HRRI A,.JPTYI+1+PTYBLK(R) ;AGAIN POINT TO SECOND BUFFER JRST .+2 ;SKIP FOR THE FIRST BUFFER HRRI A,PTYBLK(A) ;BUMP TO NEXT MOVEM A,-PTYBLK(A) ;STORE ADDRESS OF THIS IN PREVIOUS SOJG B,.-2 ;REPEAT PROCESS FOR ALL BUFFERS HRRI A,.JPTYI+1(R) ;FIRST BUFFER MOVEM A,.JPTYI+1+<*PTYBLK>(R) ;LINK LAST TO FIRST > ;;; FIREUP IS CONTINUED ON THE NEXT PAGE HRLI T1,.EQITN(J) ;GOING TO USE BLT TO MOVE LOTS OF DATA HRRI T1,Q.ITN(R) ;INTO THE INTERNAL DATA BASE.. BLT T1,Q.EBLT(R) ;SO WATCH ORDER IN QSRMAC AND LOW SEG LOAD B,.EQLEN(J),EQ.LOH ;GET LENGTH OF THE REQUEST HEADER IFN FTUUOS,< ;THE PATH IS OPTIONAL ON TOPS10, CHECK FOR IT CAIGE B,.EQPSZ ;ENOUGH ROOM FOR THE PATH SPEC JRST FIRE.2 ;NO, DON'T BOTHER COPYING IT HRLI T1,.EQPAT(J) ;WHERE IT IS IF PRESENT HRRI T1,Q.IDDI(R) ;INTO INTERNAL BLOCK BLT T1,Q.IDDI+5(R) ;MOVE IT ALL > ;END OF IFN FTUUOS FIRE.2: ADDI B,(J) ;FIND FILE PARAMETERS FOR THE CTL FILE DMOVE T1,.FPINF(B) DMOVEM T1,Q.CMOD(R) ;SAVE THE PARAMETERS AND STARTING POINT LOAD C,.FPSIZ(B),FP.FHD ;FIND THE FILE DESCRIPTOR ADDI C,(B) ;AS MESSAGE+LENGTH OF HEADER+LENGTH OF PARMS LOAD D,.FPSIZ(B),FP.FFS ;SIZE OF THE DESCRIPTOR ADDI D,Q.CSTR-1(R) ;END OF THE DATA MOVE HRLI A,.FDSTR(C) ;THE CTL FILE STRUCTURE HRRI A,Q.CSTR(R) ;WHERE FNDCTL WANTS IT BLT A,0(D) ;COPY ALL AND SFD'S IF THERE LOAD D,.FPSIZ(B),FP.FFS ;GET DESCRIPTOR SIZE AGAIN ADDI C,(D) ;C = LOG FILE PARAMETERS MOVE T1,.FPINF(C) ;GET INFO WORD MOVEM T1,Q.LMOD(R) ;AS THE LOG FILE MOD WORD LOAD D,.FPSIZ(C),FP.FHD ;SIZE OF LOG FILE PARM HEADER ADDI D,(C) ;POINT TO LOG FILE DESCRIPTOR LOAD C,.FPSIZ(C),FP.FFS ;SIZE OF LOG FILE DESCRIPTOR MOVEM C,.JLGFD(R) ;SAVE FOR RELEASE MESSAGE ADDI C,Q.LSTR-1(R) ;LAST LOCATION TO MOVE HRLI A,.FDSTR(D) ;THE LOG FILE NOW HRRI A,Q.LSTR(R) ;WHERE THE ROUTINES WANT IT BLT A,0(C) ;MOVE THE FULL SPEC HRLI T1,.EQCHK(J) ;CHECKPOINT/REQUEUE INFORMATION HRRI T1,.JINFO(R) ;KEEP IT IN THE JOB DATA BASE BLT T1,.JINFO+(R) ;GET ALL THE WORDS HRLI R,RL.INI ;SET THIS STREAM IS NOW ACTIVE MOVEM R,BASTBL-1(S) ;STORE NEW SETTING MOVE F,[FL.INI,,FR.INI] ;INITIALIZE THE OTHER FLAG REG MOVEM F,.JREGS+F(R) ;STORE NEW SETTINGS CAMLE S,HIACTV ;IS THIS NOW THE HIGHEST ACTIVE STREAM MOVEM S,HIACTV ;YES, SET NEW VALUE HRLI A,-.JPSIZ ;BUILD PDL FOR THE STREAM HRRI A,.JPLST-1(R) PUSH A,[NEWJOB] ;START STREAM AT 'NEWJOB' MOVEM A,.JREGS+14(R) ;SAVE AS PROCESSOR REGISTER P (17) AOS STACTV ;ADD ANOTHER JOB POPJ P, ;RETURN TO DISPATCHER ; HERE WHEN WE CANNOT GET A PTY FOR A JOB, GIVE IT BACK TO QUASAR ;AT FIRE.N IF ALREADY ACQUIRED A PTY CHANNEL BUT NO THE PTY ITSELF ; FIRE.E IF COULDN'T GET A PTY CHANNEL (A BUG IN THE CHANNEL ALLOCATOR) FIRE.N: PUSHJ P,RELREL ;RELEASE THE PTY ASSIGNMENT FIRE.E: SETZM .JAFTR(R) ;NO AFTER PARAMETER MOVE T1,.EQITN(J) ;THE ITN INVOLVED MOVEM T1,Q.ITN(R) ;FOR THE CALL TO FUNREQ TLO G,GL.NJN ;PRETEND NO JOB NUMBERS PUSHJ P,GETMST ;GET CURRENT TIME (MS.) MOVEM T1,NJNTIM ;SAVE WHEN NOTICED PUSHJ P,TELQSR ;INFORM OF STATUS CHANGE HRLI A,.EQCHK(J) ;CHECKPOINT/REQUEUE INFORMATION HRRI A,.JINFO(R) ;KEEP IT IN THE JOB DATA BASE BLT A,.JINFO+(R) ;SO REQUEUE PUTS IT BACK PUSHJ P,FUNREQ ;NOW REQUEUE THE JOB MOVEI CH,(R) ;DATA BASE ACQUIRED LSH CH,-^D9 ;TO A PAGE NUMBER MOVEI T1,.JPAGS ;NUMBER USED JRST M$RLNP## ;RELEASE THEM AND RETURN ;HERE WHEN QUASAR ANSWERED OUR REQUEST FOR COUNTERS SCHCOU: OUTSTR [ASCIZ/QUASAR Uptime /] SETZ T1, ;GET A ZERO EXCH T1,CAN.BL+$$NOW(J) ;GET TIME OF ANSWER SUB T1,CAN.BL+$$STAR(J) ;AND TIME QUASAR STARTED SETZM CAN.BL+$$STAR(J) ;SO DON'T TYPE THEM OUT LATER MULI T1,^D86400 ;TO SECONDS ASHC T1,^D17 ;BRING TOGETHER IMULI T1,^D1000 ;TO MILLISEC FOR TYPEOUT PUSHJ P,HMSTTY ;TYPE HH:MM:SS PUSHJ P,TTCRLF ;AND START A NEW LINE MOVEI B,CAN.BL(J) ;START OF ITEMS MOVE A,[-NUMITM,,ITMSTR] ;AND POINTER TO STRINGS TO TYPE SCHA.1: SKIPN T1,0(B) ;SOMETHING TO TYPE OUT JRST SCHA.2 ;NO, TRY ANOTHER OUTSTR @0(A) ;THE TYPE OF ITEM DISPLAYED OUTSTR [ASCIZ/ - /] ;ALIGN THE NEXT PART PUSHJ P,TTYDEC ;OUTPUT THE VALUE PUSHJ P,TTCRLF ;NEXT LINE SCHA.2: AOS B ;TO NEXT ITEM AOBJN A,SCHA.1 ;AND DO THEM ALL JRST SCHRET ;DONE PROCESSING THE MESSAGE DEFINE X(A,B), ;FOR $ITEM MACRO ITMSTR: $ITEM ;BUILD TABLE OF STRINGS NUMITM==.-ITMSTR ;NUMBER OF THEM FOR OUTPUT ;SUBROUTINE TO CHECK IF A SUBJOB IS WAITING FOR THE OPERATOR CHKOPR: TLNE R,RL.CMT ;IS A COMMENT READY JSP B,INTRVN ;PROCESS OPERATOR INTERVENTION TLNE R,RL.STP ;IS THE JOB STOPPED JRST (A) ;YES, GIVE CANNOT PROCESS THIS JOB RETURN TLNN R,RL.OPR ;IS THE WAITING BIT SET JRST 1(A) ;NO, GIVE OK TO RUN RETURN IFN PROMPT,< MOVE T1,CURMST ;GET NOW MOVE T2,T1 ;MAKE A COPY SUB T1,.JWAIT(R) ;HOW LONG HAS THE JOB BEEN WAITING MOVMS T1 ;JUST THE MAGNITUDE CAMGE T1,[PROMPT*^D60*^D1000] ;OVER THE INTERVAL REQUESTED JRST (A) ;NO, GIVE CANNOT PROCESS THIS JOB RETURN MOVEM T2,.JWAIT(R) ;STORE NEW TIME MOVE P,[IOWD TPSIZE,TOPPDL] ;MUST GET A VALID PUSH DOWN LIST PUSHJ P,TTYSJB ;TYPE SUBJOB NUMBER TO THE OPERATOR OUTSTR [ASCIZ/  waiting for response/] PUSHJ P,TTCRLF ;END THE LINE > JRST (A) ;GIVE CANNOT PROCESS THIS JOB RETURN ;SUBROUTINE TO PROCESS OPERATOR INTERVENTION INTRVN: MOVE P,[IOWD TPSIZE,TOPPDL] ;NEED A VALID PUSH DOWN LIST FIRST PUSH P,B ;SAVE RETURN ADDRESS PUSH P,A ;SAVE CHKOPR'S RETURN ADDRESS MOVE F,.JREGS+F(R) ;GET THE OTHER FLAG REGISTER TLZ R,RL.CMT ;CLEAR COMMENT IS READY TLZE F,FL.EXM ;WAS THE INTERVENTION FOR EXAMINE JRST INTR.E ;YES, DO THE EXAMINE COMMAND TLZE F,FL.KIL ;IS KILL SET JRST INTR.K ;YES, GO KILL THIS JOB TLZE F,FL.REQ ;OR IS REQUEUE SET JRST INTR.R ;YES, GO REQUEUE THIS JOB TRZE F,FR.ABU ;CANCELLED BY THE USER JRST INTR.C ;YES, GO HANDLE THAT PUSHJ P,LOGBLK ;OUTPUT A BLANK LINE IDENT [ASCIZ/ BAOPR /] ;IDENTIFY THE OPERATOR LINE SIXLOG .JWHO(R) ;PLUS THE OPERATOR COMMAND MOVEI CH," " ;NEED A BLANK TO LOOK PRETTY PUSHJ P,PUTLOG ;OUTPUT THE BLANK TXTLOG .JOPER(R) ;ADD THE COMMENT LINE PUSHJ P,LOGBLK ;OUTPUT A BLANK LINE MOVE T1,.JWHO(R) ;GET THE COMMAND THAT STARTED ALL THIS CAMN T1,[SIXBIT/STOP/] ;WAS IT STOP JRST INTR.S ;YES, TRY TO STOP THIS JOB INTR.X: MOVEM F,.JREGS+F(R) ;SAVE IN CASE IT CHANGED MOVEM R,BASTBL-1(S) ;MUST SAVE, RL.CMT IS NOW OFF POP P,A ;RESTORE CHKOPR RETURN ADDRESS POPJ P, ;RETURN 0(B) INTR.C: TLNN R,RL.LGI!RL.KJB ;ON THE WAY IN OR OUT JRST INTR.6 ;NO, CAN KILL IT NOW TLO R,RL.CMT ;RESET THE BITS TRO F,FR.ABU ;SO I CAN FIND IT IN THE NEXT PASS JRST INTR.X ;EXIT, WILL GET HERE AGAIN INTR.6: PUSH P,[CANCJB] ;ADDRESS OF CANCEL ROUTINE JRST INTR.4 ;ENTER COMMON CODE FOR KILL/REQUEUE/CANCEL INTR.K: PUSH P,[KILLJB] ;SAVE ADDRESS OF KILL PROCESSOR JRST INTR.4 ;SKIP OVER REQUEUE INTR.R: PUSH P,[REQUJB] ;SAVE ADDRESS OF REQUEUE PROCESSOR INTR.4: TLZ R,RL.OPR!RL.JIE!RL.DIA!RL.STP ;CLEAR SOME FLAGS TLZ F,FL.NER!FL.PLS!FL.SIL ;CLEAR SOME MORE HRLI A,-.JPSIZ ;REBUILD JOB PROCESSOR PUSH DOWN LIST HRRI A,.JPLST-1(R) ;SO SUBJOB HAS A FRESH START POP P,B ;GET THE PROCESS ADDRESS FOR KILL/REQUEUE PUSH A,B ;SAVE ON TOP OF THE LIST MOVEM A,.JREGS+14(R) ;SAVE AS PROCESSOR REGISTER 17 (P) JRST INTR.X ;RETURN TO DISPATCHER TO KILL/REQUEUE THIS JOB INTR.E: SKIPN .JCUSI(R) ;HAS THE FILE BEEN OPENED YET JRST INTR.X ;NO, SKIP THIS EXAMINE CALL JSP T1,SAVPOS ;SAVE CURRENT POSITION PUSHJ P,TTYALL ;TYPE OUT ALL SUBJOB INFORMATION INTR.1: SOSGE .JCCNT(R) ;IS THERE ANY LEFT IN THE BUFFER JRST INTR.3 ;NO, CAN ONLY EXAMINE WHAT'S IN CORE ILDB CH,.JCPTR(R) ;GET THE NEXT JUMPE CH,INTR.1 ;IGNORE NULLS OUTCHR CH ;OUTPUT IT CAIG CH,CHR.FF ;CHECK FOR END OF LINE CHARACTER CAIGE CH,CHR.LF ;SAVE AS CHECK FOR A TIME STAMP NEEDED JRST INTR.1 ;RESUME WITH THIS LINE SOSLE .JWHO(R) ;HAVE WE EXHAUSTED THE COUNT REQUESTED JRST INTR.1 ;NO, RESUME THE OUTPUT INTR.2: PUSHJ P,TTCRLF ;ADD A BLANK LINE ON THE OPERATORS CONSOLE JSP T1,REPOSI ;PUT THE COUNT AND POINTER BACK JRST INTR.X ;RESTORE THE REGS AND RETURN INTR.3: PUSHJ P,TTCRLF ;ANOTHER BLANK LINE OUTSTR [ASCIZ/***END OF BUFFER***/] ;TELL THE OPERATOR THATS ALL JRST INTR.2 ;RESTORE COUNTS AND EXIT INTR.S: PUSHJ P,GJBSTS ;GET THE CURRENT JOB STATUS BITS MOVEI B,STOPJB ;ADDRESS OF STOP PROCESSOR TLNN R,RL.LGI ;IS THE JOB JUST LOGGING IN TLNE J,JL.UDI!JL.UJC ;OR DOES THE JOB WANT INPUT OR HAVE JACCT MOVEI B,JUSTCL ;JUST IGNORE THE JOB REQUEST MOVE A,.JREGS+14(R) ;GET PROCESSOR REG 17 (P) PUSH A,B ;PUT PROCESSOR IN FRONT OF EVERYTHING MOVEM A,.JREGS+14(R) ;PUT AC 17 BACK IN PLACE JRST INTR.X ;LET THE DISPATCHER START THERE ;SUBROUTINE TO FIND NEW HIACTV IF INACTIVE STREAM WAS OLD HIACTV FHIACT: PUSH P,S ;SAVE CURRENT STREAM SKIPL BASTBL-1(S) ;IS THIS STREAM ACTIVE SOJG S,.-1 ;NO, LOOK FOR ONE BELOW MOVEM S,HIACTV ;FOUND 1 OR NONE BUT IS OK POP P,S POPJ P, ;SUBROUTINE TO WAKE ME UP FOR VARIOUS REASONS WAKEME: MOVNI A,1 ;JOB -1 IS ME WAKE A, ;ISSUE THE WAKE JFCL ;REALLY CAN'T FAIL POPJ P, ;SUBROUTINE TO CLEAR A STREAM THAT JUST WENT INACTIVE ;CALL BY JSP A,CLRACT FROM THE DISPATCH LOOP CLRACT: MOVE P,[IOWD TPSIZE,TOPPDL] ;GET TOP LEVEL PDL FIRST PUSH P,A ;SAVE RETURN ADDRESS SOS STACTV ;DECREMENT THE STREAM COUNT CAMN S,HIACTV ;WAS STREAM TO GO IDLE THE HIGHEST ACTIVE PUSHJ P,FHIACT ;YES, FIND NEW HIACTV HLLZ IO1,.JPCHN(R) ;GET PTY CHANNEL ASSIGNMENT PUSHJ P,RELREL ;RELEASE IT AND THE ASSIGNMENT MOVEI CH,(R) ;GET THE DATA BASE LSH CH,-^D9 ;CONVERT TO A PAGE NUMBER MOVEI T1,.JPAGS ;NUMBER TO RELEASE JRST M$RLNP## ;RELEASE IT AND RETURN ;SUBROUTINE TO INFORM QUASAR OR A STATUS CHANGE (OR ESTABLISH CONTACT) TELQSR: TLNE G,GL.CON ;IN CONTACT WITH QUASAR JRST TELQ.1 ;YES, SKIP EXIT/RESET CHECK TLNE G,GL.SSH!GL.EXI ;IS EXIT/RESET PENDING SKIPE STACTV ;YES, ARE WE ABOUT TO DO IT SKIPA ;NO, SET NEW STATUS POPJ P, ;JUST RETURN IF NOT IN CONTACT TELQ.1: MOVEI A,QSRMSG ;POINT TO THE MESSAGE BLOCK MOVX B, MOVEM B,.MSTYP(A) ;STORE HELLO MESSAGE LENGTH AND TYPE MOVE B,[SIXBIT/BATCON/] ;MY NAME MOVEM B,HEL.NM(A) ;INCLUDE NAME FIELD MOVSI B,'INP' ;QUEUE I WANT MOVEM B,HEL.SD(A) ;AS THE SCHEDULABEL DEVICE MOVE B,[SIXBIT/BATRUN/] MOVEM B,HEL.PD(A) ;A NICE LOOKING NAME HRL B,UTIME ;SINGLE JOB MAX IN LEFT HRR B,ATIME ;TOTAL FOR BATCH IN RIGHT MOVEM B,HEL.I1(A) ;AS INFO WORD 1 HRL B,MJOB ;NUMBER OF STREAMS HRR B,NXTJOB ;NEXT REQUEST MOVEM B,HEL.I2(A) ;AS INFO WORD 2 SKIPN C,UCORE ;IS THERE AN OPERATOR LIMIT MOVE C,CORMAX ;NO, USE CORMAX SKIPN B,ACORE ;DO THE SAME FOR SUM OF BATCH MOVE B,CORPHY ;USE PHYSICAL CORE HRL B,C ;SINGLE JOB LIMIT IF LEFT MOVEM B,HEL.I3(A) ;AS INFO WORD 3 MOVX B, ;GET QSRMAC VERSION NUMBER TLOE G,GL.CON ;ALREADY IN CONTACT TXO B,HELSTC ;YES, THIS IS A STATUS CHANGE TLNN G,GL.SSH!GL.NJN ;STOP SCHEDULING TXO B,HELSCH ;NO, SET SCHEDUABLE TLNE G,GL.SSH!GL.EXI ;ANOTHER EXIT/RESET CHECK SKIPE STACTV ;BUT THIS TIME WE ARE IN CONTACT JRST TELQ.2 ;JUST SET THE STATUS TXO B,HELBYE ;SAY GOOD-BYE QUASAR TLZ G,GL.CON ;CLEAR CONTACT TELQ.2: MOVEM B,HEL.ST(A) ;STORE STATUS BITS JRST SNDQSR## ;SEND IT AND RETURN TO CALLER SUBTTL Job Processor - Start the Stream ;ENTRY AT NEWJOB FOR FRESH START. HEADERS,LOGIN,SET COMMANDS... NEWJOB: IFN JOBMSG,< PUSHJ P,TTYSJB ;TYPE THE SUBJOB NUMBER PUSHJ P,TTYJPN ;TYPE OUT THE JOB NAME AND PPN OUTSTR [ASCIZ/ started/] PUSHJ P,TTCRLF ;END THE LINE > IDENT MYVERS ;OUTPUT BATCH VERSION INFORMATION IFN BTNMIN,< MOVEI CH,BTNMIN+100 ;MAKE A LETTER OUT OF THE MINOR VERSION NUMBER PUSHJ P,PUTLOG ;OUTPUT IT > TXTLOG MYVRS1 ;ADD EDIT AND WHO AND MORE TEXT SIXLOG Q.JOB(R) ;SEND THE JOB NAME TO THE LOG TXTLOG [ASCIZ/ sequence /] LOAD T1,Q.SEQ(R),EQ.SEQ ;GET THE SEQUENCE NUMBER CAMN T1,NXTJOB ;SAME AS LAST "NEXT" COMMAND SETZM NXTJOB ;YES, CLEAR CAUSE WE FOUND IT PUSHJ P,LOGDEC ;OUTPUT THE SEQUENCE NUMBER TXTLOG [ASCIZ/ in stream /] MOVE T1,S ;GET THE STREAM NUMBER PUSHJ P,LOGDEC ;OUTPUT THE STREAM NUMBER PUSHJ P,CTLSPC ;GET THE FILE SPEC FOR THE CTL FILE MOVEI T2,[ASCIZ/Input from /] ;STRING TO BE ADDED MOVEI T1,Q.CSTR(R) ;CTL FILE STRUCTURE PUSHJ P,LOGFIL ;PRINT FILE SPEC TO LOG FILE PUSHJ P,LOGSPC ;GET THE LOG FILE SPECIFICATION MOVEI T2,[ASCIZ/Output to /] MOVEI T1,Q.LSTR(R) ;LOG FILE STRUCTURE PUSHJ P,LOGFIL ;OUTPUT IT TO THE LOG FILE IDENT [ASCIZ/ BASUM Job parameters/] PUSHJ P,LGCMNT ;PREPARE FOR A COMMENT TXTLOG [ASCIZ/Time:/] HRRZ T1,Q.ILIM(R) ;GET THE JOBS TIME ESTIMATE IMULI T1,^D1000 ;TO MILLISECONDS TO USE LOGTIM PUSHJ P,LOGTI1 ;ENTER WITH TIME ALREADY IN T1 IFN INPCOR,< TXTLOG [ASCIZ/ Core:/] HLRZ T1,Q.ILIM(R) ;GET JOBS CORE ESTIMATE PUSHJ P,LOGDEC ;OUTPUT IT AS DECIMAL MOVEI CH,"P" ;ADD SUFFIX PUSHJ P,PUTLOG > TXTLOG [ASCIZ/ Unique:/] LOAD T1,Q.IDEP(R),EQ.UNI ;GET THE /UNIQUE VALUE CAIE T1,EQ.UNO ;IS IT UNIQUE TLOA T1,'YES' ;YES, SAY SO MOVSI T1,'NO ' ;NO PUSHJ P,LOGSIX ;OUTPUT THE PROPER RESPONSE TXTLOG [ASCIZ/ Restart:/] SKIPE T1,.JCHRQ(R) ;SEE IF CHECK POINT INFORMATION EXISTS CAMN T1,[-1] ;YES, -1 = A NON-RESTARTABLE JOB BEING RESTARTED SKIPL Q.IDEP(R) ;IS NOT RESTARTABLE BIT ON SKIPA T1,[SIXBIT/YES/] ;NO, SAY YES MOVSI T1,'NO ' ;YES, SAY NO PUSHJ P,LOGSIX ;PRINT PROPER RESPONSE TXTLOG [ASCIZ/ Output:/] LOAD T1,Q.IDEP(R),EQ.OUT ;GET /OUTPUT: VALUE CAIN T1,%EQOLE ;/OUT:ERROR MOVE T1,[SIXBIT/ERROR/] ;YES CAIN T1,%EQOLG ;/OUT:LOG MOVE T1,[SIXBIT/LOG/] ;YES TLNN T1,-1 ;ONE OF THE ABOVE MOVE T1,[SIXBIT/NOLOG/] ;NO, USE UNDEFINED CASE PUSHJ P,LOGSIX ;ADD IT TO THE LOG NEWJ.2: PUSHJ P,LGCLF2 ;END THE LINE AND ADD A BLANK ONE PUSHJ P,SNDUPC ;SEND A ^C PUSHJ P,IOWAIT ;WAIT FOR I/O, RETURN FOR MORE INPUT TLNE R,RL.TIM ;TIMESTAMP NEEDED? PUSHJ P,PUTPER ;YES, ALIGN OUTPUT TXTJOB [ASCIZ/LOGIN /] ;SEND THE LOGIN COMMAND IFN FTUUOS,< HLRZ T1,Q.PPN(R) ;PROJECT NUMBER PUSHJ P,SNDOCT ;SEND IT IN OCTAL MOVEI CH,CH.LGI ;CHARACTER TO SEND BETWEEN PROJECT AND PROGRAMMER PUSHJ P,SNDCHR ;SEND THE CHARACTER HRRZ T1,Q.PPN(R) ;PROGRAMMER NUMBER PUSHJ P,SNDOCT ;SEND IT IN OCTAL MOVEI D,Q.IDDI(R) ;GET THE LOGIN PATH SKIPN Q.IDDI(R) ;ANY PPN IN THE PATH SPEC JRST NEWJ.6 ;NO, AVOID SENDING BAD DATA PUSHJ P,SETSFD ;SET AS IF AN SFD SPEC TLNE D,-1 ;IS D A PPN JRST [CAMN D,Q.PPN(R) ;YES, ARE THE PPNS THE SAME JRST NEWJ.6 ;YES, SKIP THIS OUTPUT MOVEI D,SFDPAT-3 ;INSURE FINDING A ZERO JRST .+1] ;RESUME IN-LINE CODE MOVEM D,.JLABL(R) ;SAVE THE POINTER FOR NOW TXTJOB [ASCIZ/ [/] ;START OF SPEC MOVE T1,Q.IDDI(R) ;GET PATH PPN CAMN T1,Q.PPN(R) ;SAME AS LOGGED IN PPN JRST [PUSHJ P,SNDCMA ;YES, ADD A COMMA JRST NEWJ.4] ;GO STRAIGHT TO PATH SPEC HLRZ T1,Q.IDDI(R) ;GET PATH PROJECT NUMBER PUSHJ P,SNDOCT ;OUTPUT IT PUSHJ P,SNDCMA ;AND A COMMA HRRZ T1,Q.IDDI(R) ;GET THE PROGRAMMER NUMBER NOW PUSHJ P,SNDOCT ;OUTPUT THAT NEWJ.4: AOS T1,.JLABL(R) ;BUMP TO NEXT SFD LEVEL SKIPN T1,2(T1) ;IS THERE ANOTHER JRST NEWJ.5 ;NO, END OF THE SPEC PUSHJ P,SNDCMA ;SEND A COMMA PUSHJ P,SNDSIX ;SEND THE SFD NAME JRST NEWJ.4 ;CONTINUE FOR ALL LEVELS NEWJ.5: MOVEI CH,"]" ;END OF THE PATH PUSHJ P,SNDCHR ;SEND IT ;;;CODE IS CONTINUED ON THE NEXT PAGE AND STILL UNDER FTUUOS CONDITIONAL NEWJ.6: TXTJOB [ASCIZ\ /DEFER/SPOOL:ALL/TIME:\] HRRZ T1,Q.ILIM(R) ;GET THE TIME ESTIMATE PUSHJ P,SNDDEC ;OUTPUT IT FOR LOGIN IFN INPCOR,< TXTJOB [ASCIZ\/CORE:\] ;IF ENFORCING CORE ESTIMATES HLRZ T1,Q.ILIM(R) ;GET THE CORE ESTIMATE PUSHJ P,SNDDEC ;OUTPUT DECIMAL VALUE MOVEI CH,"P" ;GET SUFFIX PUSHJ P,SNDCHR ;INDICATE UNITS > TLNN G,GL.RMT ;THIS MONITOR HAVE REMOTE LOGIC JRST NEWJ.3 ;END THE LINE TXTJOB [ASCIZ\/LOCATE:\] LOAD T1,Q.SEQ(R),EQ.DSN ;GET THE STATION NUMBER FROM QUASAR PUSHJ P,SNDOCT ;SEND THE OCTAL STATION NUMBER NEWJ.3: PUSHJ P,REDUCE ;COUNT THE CHARACTERS IN THE USERS NAME JRST NEWJ.8 ;NULL, SKIP THIS SWITCH TXTJOB [ASCIZ\/NAME:"\] ;SEND THE SWITCH NAME MOVE T1,[POINT 6,Q.USER(R)] ;POINT TO THE STRING NEWJ.7: ILDB CH,T1 ;FETCH A CHARACTER, T2 IS COUNT OF REAL ONES MOVEI CH," "(CH) ;CONVERT TO ASCII CAIN CH,"""" ;DOES THE NAME HAVE A QUOTE IN IT PUSHJ P,SNDCHR ;YES, SEND 2 SO SCAN WONT COMPLAIN PUSHJ P,SNDCHR ;SEND THE CHARACTER SOJG T2,NEWJ.7 ;SEND ALL THE CHARACTERS MOVEI CH,"""" ;GET CLOSURE FOR THE QUOTED STRING PUSHJ P,SNDCHR ;SEND IT > ;END OF IFN FTUUOS IFN FTJSYS,< TXTJOB Q.USNM(R) ;SEND THE USER NAME TLO F,FL.SIL ;MUST PROVIDE PASSWORD FIELD TXTJOB [ASCIZ/ FOO/] ;EVEN THOUGH IT'S NOT VALIDATED TLZ F,FL.SIL ;SO DON'T LET USER SEE "FOO" TXTJOB [ASCIZ/ /] ;DELIMIT FIELDS MOVEI T1,Q.ACCT(R) ;POINT TO ACCOUNT STRING SKIPN (T1) ;ONE PROVIDED MOVEI T1,[ASCIZ/10300/] ;NO, USE MY OLD ONE TXTJOB (T1) ;SEND TO THE JOB > ;END OF IFN FTJSYS NEWJ.8: PUSHJ P,SNDCLF ;END THE LINE PUSHJ P,IOWAIT ;WAIT FOR NEXT INPUT REQUEST TLNE R,RL.JIE ;DID LOGIN FAIL PUSHJ P,ANALYZ ;YES, ANALYZE THE LOGIN ERROR PUSHJ P,CLSLOG ;FORCE OUT SOME OF THE LOG FILE NOW IFN FTJSYS,< MOVX T1,AC%CON+3 ;FLAGS,,LENGTH IN 1 MOVEI T2,A ;ADR IN 2 HRROI A,Q.CNDI(R) ;ADR POINTS TO STR-DIR STRING HRROI B,[ASCIZ / /] ;ADR+1 POINTS TO PSW (DUMMY) HRRZ C,J ;ADR+2 POINTS TO JOB NUMBER ACCES ;CONNECT THE JOB ERJMP NEWJ.9 ;DON'T WAIT IF IT FAILED PUSHJ P,IOWAIT ;GET RESPONSE FROM CNDIR JSYS NEWJ.9: HRRZ T1,J ;GET THE JOB NUMBER MOVEI T2,.SJDFS ;SET DEFAULT SPOOLING MOVEI A,.SJSPD ;A = T2 + 1, SET DEFERRED SETJB ;SET IT FOR THE JOB HRRZ C,Q.ILIM(R) ;GET JOBS TIME LIMIT PUSHJ P,SETTIM ;SET IT > ;END OF IFN FTJSYS TLZ R,RL.LGI ;CLEAR LOGIN SEQUENCE NOW SKIPN T1,.JCHRQ(R) ;IS THERE CHECKPOINT/REQUEUE INFO JRST NORM.2 ;FIRST TIME I SAW THIS JOB, SEE IF RESTARTABLE THERE CAME T1,[-1] ;CHKPNT = -1 MEANS RESTART OF NON-RESTARTABLE JOB JRST CKPNTS ;OK SO FAR, CHECK FOR CHKPNT START MOVEI T1,[ASCIZ/BTNJNR Job cancelled after a restart, it is not restartable./] NORM.1: PUSHJ P,LGEMSG ;OUTPUT THE ERROR MESSAGE PUSHJ P,LGCLF2 ;END THE LINE AND ADD A BLANK ONE TRO F,FR.LSL ;LIST LINES SKIPPED (THE WHOLE CTL FILE) JRST FINSRC ;GO TO %FIN:: NORM.2: SKIPL Q.IDEP(R) ;IS THIS JOB RESTARTABLE JRST CKPNTS ;YES, GO GET STARTING POINT SETOM .JCHRQ(R) ;FLAG TO MEAN FIRST TIME A NON-RESTARTABLE JOB PUSHJ P,FUNCHK ;HAS BEEN SCHEDULED, NEXT TIME HE'S DEAD SETZM .JCHRQ(R) ;IN CASE OF LATER REQUEUE OR CHECKPOINT CKPNTS: SKIPN T1,.JCHRQ(R) ;GET WHERE TO START PARAMETER MOVE T1,Q.CBIT(R) ;GET /TAG OR /START VALUE IF NO CHECKPOINT TLNN T1,777777 ;IS IT A RESTART LABEL JRST CKLINE ;NO, TRY A LINE NUMBER MOVEM T1,.JLABL(R) ;SAVE FOR LABFND PUSHJ P,LGCMNT ;PREPARE FOR A COMMENT TXTLOG [ASCIZ/BTNBLA Beginning processing at label /] SIXLOG .JLABL(R) ;OUTPUT THE LABEL PUSHJ P,LGCLF2 ;END THE LINE AND ADD A BLANK ONE TRO F,FR.FIN ;THIS SEARCH MAY SKIP A %FIN:: JRST LABSRC ;SEARCH FOR THE LABEL CKLINE: CAIG T1,1 ;IS STARTING LINE .G.1 JRST HONORJ ;NO, START THE JOB NOW MOVEM T1,.JLABL(R) ;SAVE THE COUNT OF LINES PUSHJ P,LGCMNT ;PREPARE FOR A COMMENT TXTLOG [ASCIZ/BTNBLI Beginning processing on line /] MOVE T1,.JLABL(R) ;RE-GET THE COUNT PUSHJ P,LOGDEC ;OUTPUT THAT PUSHJ P,LGCLF2 ;END THE LINE AND ADD A BLANK ONE CKLI.1: SOSG .JLABL(R) ;PASSED OVER ENOUGH YET JRST HONORJ ;YES, START HERE PUSHJ P,GETCTL ;GET A CHARACTER PUSHJ P,CMNT.3 ;USE THE SILENCED COPY COMMENT JRST CKLI.1 ;SKIP OVER JUST ENOUGH SUBTTL Job Processor - Honor Job's Input Request HONORJ: PUSHJ P,IOWAIT TLNN J,JL.UJA ;IS THERE A JOB STILL THERE JRST [PUSHJ P,CLSLOG ;NO, MUST HAVE DONE HIS OWN KJOB OR LOGOUT TLO R,RL.NLG ;SUPPRESS PRINTING OF THE LOG FILE JRST CLOS.1] ;SO JUST DISMISS THIS JOB TLNE F,FL.TLE ;DID THIS JOB EXCEED ITS TIME LIMIT JRST TIMERR ;YES, CANCEL OR GIVE EXTRA TIME TLNE R,RL.DIA ;DOES JOB WANT DIALOGUE MODE INPUT JRST REDOPR ;YES, READ NEXT LINE FROM THE OPERATOR HONO.1: TLZ F,FL.LAB ;CLEAR A LABEL FOUND FLAG TLO R,RL.FCI ;LOOKING FOR THE FIRST CHARACTER PUSHJ P,GETCTL ;GET THE FIRST CHARACTER OF THIS LINE HONO.2: TLZ R,RL.FCI!RL.EOL ;CLEAR SOME FLAGS PUSHJ P,CLASSF ;CLASSIFY THE CHARACTER WE HAVE JRST CNTLLI ;LINE TERMINATORS ARE ALSO SPEC. ACTION JRST CNTLLI ;SPECIAL ACTION CHARACTER JRST CPYLOP ;LINE STARTS WITH A NUMBER, IS USER DATA PUSHJ P,DECRBP ;A LETTER, CHECK FOR A LABEL JSP T1,SAVPOS ;SAVE CURRENT CTL FILE POSITION MOVE T1,[PUSHJ P,GETCTL] ;HOW TO GET A CHARACTER MOVEM T1,COMFIL PUSHJ P,GETSIX ;GET THE POSSIBLE LABEL TLON F,FL.LAB ;ALREADY FIND 1 LABEL ON THIS LINE CAIE CH,":" ;DID IT END WITH A COLON JRST NOTLAB ;NO, CANNOT BE A LABEL PUSHJ P,GETCTL ;GET THE NEXT CHARACTER CAIE CH,":" ;IS IT LABEL:: JRST NOTLAB ;NO, THAT IS THE ONLY KIND WE CAN 'FALL INTO' POP P,(P) ;CLEAN UP AFTER SAVPOS, WE ARE AT THE RIGHT PLACE POP P,(P) ;... MOVEM T1,(P) ;RE-USE ONE WORD TO SAVE THE LABEL IDENT [ASCIZ/ BLABL /] ;IDENTIFY THE LABELED LINE POP P,T1 ;RESTORE THE LABEL PUSHJ P,LOGSIX ;OUTPUT 'T1' (THE LABEL) PUSHJ P,PUTCOL ;ADD BOTH COLONS PUSHJ P,PUTCOL PUSHJ P,LOGCLF ;END THE LINE HONO.3: PUSHJ P,SKPBL1 ;SKIP ANY BLANKS AFTER THE LABEL HONO.4: TLO F,FL.LAB ;NO MORE LABELS ON THIS LINE CAIE CH,CHR.CR ;IS THIS A NULL STATEMENT JRST HONO.2 ;NO, TREAT THIS AS A LINE IDENTIFIER PUSHJ P,GETCTL ;CHEW UP THE LINE FEED TOO JRST HONO.1 ;NOW MAY HAVE A LABEL ;HERE WHEN A LINE DOES NOT BEGIN WITH A LABEL NOTLAB: TLNE J,JL.UML ;NOT A LABEL, IS USER AT MONITOR LEVEL JRST MONLIN ;YES, T1=MONIOR COMMAND OR BATCH COMMAND JSP T1,REPOSI ;REPOSITION THE POINTERS PUSHJ P,GETCTL ;GET THE FIRST CHARACTER OF THE LINE JRST CPYLOP ;COPY TO THE USER JOB ;HERE WHEN DIALOGUE MODE IS IN EFFECT, READ FROM THE OPERATOR REDOPR: PUSHJ P,TTCRLF ;OUTPUT A BLANK LINE PUSHJ P,TTYALL ;TYPE OUT SUBJOB INFORMATION OUTSTR [ASCIZ/OPR--Respond with /] MOVEI T1,[ASCIZ /OPERATOR Waiting... /] PUSHJ P,SJBLIN ;TYPE LINE WITH SJB NUMBER PUSHJ P,CLSLOG ;CLOSE OUT THE LOG FILE BEFORE WAITING PUSHJ P,OPRRES ;GET THE RESPONSE TLNN J,JL.UJA ;IS THERE A JOB STILL THERE JRST CLOS.1 ;NO, JUST DISMISS IT TLNE R,RL.DIA ;IS THE JOB STILL WAITING JRST REDOPR ;YES, OPERATOR MUST RESPOND IDENT [ASCIZ/ BAOPR OPERATOR /] ;IDENTIFY THE OPERATOR RESPONSE PUSH P,F ;SAVE F IN CASE SILENCE IS SET TLZ F,FL.SIL ;THIS LINE MUST GO TO THE LOG FILE TXTJOB .JOPER(R) ;SEND THE RESPONSE (INCLUDES TERMINATOR) POP P,T1 ;RESTORE OLD F TLNE T1,FL.SIL ;WAS SILENCE SET TLO F,FL.SIL ;YES, SET IT AGAIN PUSHJ P,PTYSND ;OUTPUT THE PTY BUFFER TLO R,RL.EOL ;INDICATE AN END OF LINE SENT TLZ R,RL.QTS ;CLEAR QUOTES FOR GOOD MEASURE JRST HONORJ ;END THIS DIALOGUE ;DEFINE MY VERSION MACROS AND GENERATE THE TEXT FOR THE LOG FILE DEFINE .VERSN(A)< LSTOFF ASCIZ \ BAJOB BATCON version A\ LSTON > MYVERS: .VERSN \BTNVER, ;GENERATE HEADER LINE FOR THIS VERSION DEFINE .VERSN(A,B)< LSTOFF IFB , IFNB , LSTON > MYVRS1: IFE BTNWHO,<.VERSN \BTNEDT,> IFN BTNWHO,<.VERSN \BTNEDT,\BTNWHO,> ;HERE IF LINE STARTS WITH A SPECIAL ACTION CHARACTER. DETERMINE WHICH ONE CNTLLI: TLZ F,FL.PER ;CLEAR A FLAG CAIE CH,CHR.FF ;IS IT VERTICAL PAPER MOTION IN CLOUMN 1 CAIN CH,CHR.VT ;LOOK FOR FORM FEED AND VERTICAL TAB JRST VERTMO ;YES, PRETEND COLUMN 2 IS COLUMN 1 CAIE CH,";" ;A COMMENT LINE CAIN CH,"!" ;AS DEFINED BY THE STANDARD JRST CMNTLI ;YES, COPY THE COMMENT LINE CAIN CH,"*" ;CUSP OR USER INPUT JRST USRINP ;YES, IS USER MODE INPUT CAIN CH,"=" ;SPECIAL USER LINES JRST EQUINP ;YES, IS USER MODE DATA CAIN CH,"%" ;ONE OF THE RESERVED LABELS JRST DECLAB ;YES, SET UP SEARCH FOR A DIGITAL LABEL CAIE CH,MONCHR ;MONITOR LEVEL ( . OR @ ) JRST CPYLOP ;IF NONE OF THE ABOVE SPECIALS, IS USER DATA TLO F,FL.PER ;REMEMBER A PERIOD WAS SEEN JSP T1,SAVPOS ;SAVE THE CURRENT POSITION MOVE T1,[PUSHJ P,GETCTL] ;HOW TO GET A CHARACTER MOVEM T1,COMFIL ;SAVE FOR THE SCANNERS PUSHJ P,GETSIX ;GET A COMMAND IFE ,< ;IF PROMPT IS A DOT, RESLVE THE AMBIGUITY OF .NUM JUMPN T1,MONLIN ;SOMETHING IS PRESENT, SEE IF A BATCH COMMAND CAIG CH,"9" ;SEE IF LINE IS .NUMBER CAIGE CH,"0" ;SEE IF THE TERMINATOR IS A VALID DIGIT JRST MONSND ;SEND THE LINE TO THE MONITOR JSP T1,REPOSI ;REPOSITION THE CTL FILE TLZ F,FL.PER ;CLEAR A FLAG MOVEI CH,MONCHR ;WILL SEND A PERIOD TO THE JOB JRST CPYLOP ;THIS LINE IS USER DATA > ;END OF IFE MONLIN: TLNN T1,007700 ;CANNOT BE A BATCH COMMAND IF 1 LETTER JRST MONSND ;SEND SINGLE LETTER COMMANDS TO THE MONITOR MOVE A,[-NBACMD,,BACMDS] ;AOBJN FOR TABLE LOOKUP PUSHJ P,TABSRC ;DO THE TABLE SEARCH FOR COMMAND IN T1 JRST MONSND ;NOT FOUND, GIVE TO THE MONITOR JRST MONSND ;GIVE AMBIGUOUS ONES TO THE MONITOR ALSO SKIPL C,BADISP(C) ;GET DISPATCH, SEE IF VALID IF JOB IS IN ERROR TLNN R,RL.JIE ;NOT VALID, IS THE JOB IN ERROR JRST (C) ;OK TO DO THE COMMAND MONSND: JSP T1,REPOSI ;REPOSITION THE FILE TLNE R,RL.JIE ;IS THE JOB IN ERROR NOW JRST USRERR ;YES, BUT NO .IF(XXXX) STUFF, LOOK FOR ERROR PACKETS PUSHJ P,INMONM ;MAKE SURE THE JOB'S IN MONITOR MODE TLNE F,FL.SIL ;IS THIS OUTPUT TO BE SILENCE TLZ F,FL.PER ;YES, CLEAR POSSIBLE PERIOD FLAG TLZE F,FL.PER ;DID THE LINE START WITH A PERIOD PUSHJ P,PUTPER ;YES, ECHO A PERIOD FOR CLEANLINESS JRST MONSUP ;COPY THE REST OF THE LINE (SUPPRESS TRAILING BLANKS) ;RULES FOR THE COMMAND TABLE ; 1)COMMANDS ARE UNIQUE IN 4 LETTERS ; 1.1)EXCEPT BACKTO AND BACKSPACE (MONITOR COMMAND TAKES PRECEDENCE) ; 2)IF THE SECOND ARGUMENT IS PRESENT, THE COMMAND CAN BE EXECUTED ; EVEN IF THE JOB IS IN ERROR ; 3)IF THE THIRD ARGUMENT IS PRESENT, IT IS THE DISPATCH ADDRESS DEFINE CMDTBL< LSTOFF X BACKSP,,MONSND ;SEND ANY ABBREVIATION OF BACKSP TO THE MONITOR X BACKTO, ;GOTO A PRIOR LABEL X CHKPNT, ;TAKE A CHECK POINT X ERROR, ;DEFINE AN ADDITIONAL ERROR CHARACTER X GOTO, ;PROCEED AT ANOTHER PLACE X IF,E ;ERROR TESTING X MESSAG, ;$MESSAGE FOR MINI-BATCH STANDARD X NOERRO, ;TURN OFF ALL ERRORS (EXCEPT TIME EST EXCEEDED) X NOOPER,E ;LEAVE DIALOGUE MODE X OPERAT, ;ENTER DIALOGUE MODE WITH A SPECIFIC CHARACTER X PLEASE, ;TRAP SYSTEM PLEASE COMMANDS X REQUEU, ;REQUEUE THIS JOB X REVIVE, ;RESUME NORMAL LISTING MODE X SILENC, ;TURN OFF ALL OUTPUT LSTON > DEFINE X(A,B,C)< > BACMDS: CMDTBL ;GENERATE THE COMMAND TABLE NBACMD==.-BACMDS ;NUMBER OF COMMANDS DEFINE X(A,B,C)< IFB ,< IFB , IFNB ,> IFNB ,< IFB , IFNB ,> > BADISP: CMDTBL ;GENERATE THE DISPATCH TABLE ;HERE IF LINE IS FOR USER LEVEL INPUT EQUINP: TLO F,FL.SUP ;SET SUPPRESSION OF FINAL CR-LF USRINP: JSP T1,ISCMNT ;SEE IF THIS LINE IS A COMMENT TO THE LOG FILE TLNN F,FL.SIL ;IS THE LOG FILE SILENCED PUSHJ P,PUTLOG ;NO, ECHO THE CHARACTER CPYLIN: PUSHJ P,GETCTL ;GET THE NEXT CHARACTER CPYL.1: TLNE F,FL.SUP ;WANT TO SUPPRESS THE CR-LF JRST CPYL.2 ;YES, SEE IF THIS IS THE LINE FEED CPYSND: PUSHJ P,CHKSND ;SEND IT TO THE JOB, CHECK RESULT CAIE CH,CHR.LF ;DID WE SEND THE LINE FEED JRST CPYLIN ;NO, CONTINUE COPY CPYOUT: TLO R,RL.EOL ;MARK END OF LINE SENT PUSHJ P,PTYSND ;SEND THE PTY BUFFER JRST HONORJ ;AND WAIT FOR NEXT INPUT REQUEST CPYL.2: CAIE CH,CHR.LF ;YES, SEE IF THIS IS THE LINE FEED CAIN CH,CHR.CR ;OR THE CARRIAGE RETURN SKIPA ;YES, SUPPRESS THEM JRST CPYSND ;NO, SEND THIS CHARACTER CAIE CH,CHR.LF ;ANOTHER CHECK JRST CPYLIN ;IGNORE THE CARRIAGE RETURN TLZ F,FL.SUP ;CLEAR SUPPRESSION ON THE LINE FEED JRST CPYOUT ;OUTPUT THE CURRENT BUFFERS VERTMO: JSP T1,ISCMNT ;SEE IF THIS LINE IS A COMMENT TO THE LOG FILE PUSHJ P,SNDCHR ;SEND THE FF OR VT JRST CPYOUT ;SEND THE BUFFER AND WAIT ;HERE TO SUPPRESS TRAILING BLANKS ON A MONITOR COMMAND LINE MONSUP: TLNE R,RL.TIM ;NEED A TIME STAMP TLNE F,FL.SIL ;YES BUT IS THE OUTPUT SILENCED SKIPA ;NEVER MIND THE STAMP PUSHJ P,LOGSTP ;OUTPUT ONE NOW SETZ T1, ;WILL COUNT BLANKS MONS.1: PUSHJ P,GETCTL ;GET A CHARACTER FROM THE CTL FILE CAIE CH,CHR.LF ;END OF THE LINE CAIN CH,CHR.CR ;THE CARRIAGE RETURN JRST CPYSND ;YES, SEND THAT, THE LINE FEED, AND DONE CAIN CH," " ;A BLANK TO SUPPRESS AOJA T1,MONS.1 ;YES, COUNT IT AND GET ANOTHER JUMPE T1,MONS.2 ;JUMP IF NO BLANKS PRECEEDED IT MOVE T2,CH ;SAVE THE CHARACTER MOVEI CH," " ;GET A BLANK PUSHJ P,CHKSND ;SEND IT TO THE JOB, CHECK RESULT SOJG T1,.-1 ;SEND AS MANY AS NEEDED, CLEAR THE COUNTER MOVE CH,T2 ;GET THE ORIGINAL BACK MONS.2: PUSHJ P,CHKSND ;SEND IT TO THE JOB, CHECK RESULT JRST MONS.1 ;GET ANOTHER ;HERE TO DETERMINE IF THIS LINE IS A COMMENT OR TO BE SENT AS USER DATA CPYLOP: MOVEI T1,CPYL.1 ;FAKE OUT A JSP ISCMNT: TLNN R,RL.JIE ;IS THE JOB IN ERROR STATE TLNE J,JL.UML ;OR IS THE JOB AT MONITOR LEVEL JRST CMNTLI ;YES, THIS LINE IS A COMMENT JRST (T1) ;NO, SEND THIS LINE TO THE USER JOB ;HERE TO COPY A COMMENT LINE TO THE LOG FILE (CH IS THE FIRST CHARACTER) CMNTLI: PUSHJ P,CPYCMT ;USE THE SUBROUTINE FOR THIS TLZ F,FL.SUP ;IF COPIED A COMMENT LINE, CLEAR SUPRESSION JRST HONO.1 ;RESUME READING THE CTL FILE ;HERE TO SEND A CHARACTER TO THE SUBJOB, CHECK IF JOB IS STILL AROUND CHKSND: PUSHJ P,SNDCHR ;FIRST, SEND THE CHARACTER, LOG IT TLNE J,JL.UJA ;IS THE JOB STILL THERE POPJ P, ;YES, RETURN FOR MORE DATA PUSHJ P,SNDUPC ;NO, ADD CONTROL C AND DUMP THE BUFFER PUSHJ P,IOWAIT ;WAIT FOR MONITOR TO TYPE "?" PUSHJ P,CLSLOG ;EMPTY THE LOG FILE BUFFERS JRST CLOS.1 ;AND DISMISS THE JOB SUBTTL Job Processor - Execute Batch Commands ;GOTO COMMAND - PROCEED AT ANOTHER PLACE BBGOTO: PUSHJ P,GETLAB ;GET A LABEL AND ECHO THE BATCH COMMAND LINE SKIPE .JLABL(R) ;WAS THERE ONE JRST LABSRC ;YES, GO LOOKING GOTO.1: MOVEI T1,[ASCIZ/BTNNLS No label specified or illegal syntax./] JRST NORM.1 ;OUTPUT ERROR AND GO TO %FIN:: ;BACKTO COMMAND - GOTO A PRIOR LABEL BBBACK: MOVN T1,.JCCNT(R) ;REMEMBER WHERE THIS COMMAND IS (APP.) HRL T1,.JCUSI(R) ;BLOCK NUMBER,,(- COUNT LEFT) TLZ T1,(1B0) ;IN CASE BLOCK IS END OF FILE MOVEM T1,.JBAKP(R) ;SAVE FOR LABEL SEARCH PUSHJ P,GETLAB ;GET A LABEL AND ECHO THIS LINE SKIPN .JLABL(R) ;WAS THERE ONE JRST GOTO.1 ;NO GIVE AN ERROR HRRZ T1,J ;GET THE MONITOR JOB NUMBER RUNTIM T1, ;GET AMOUNT OF CPU TIME USED CAMG T1,.JRUNT(R) ;USER MUST DO SOMETHING TO GET RUNTIME JRST BACK.1 ;OTHERWISE COULD BE A::.BACKTO A MOVEM T1,.JRUNT(R) ;SAVE FOR NEXT BACKTO COMMAND TRO F,FR.BAK!FR.FSI!FR.FIN ;SET SOME SEARCH FLAGS SETZM .JCUSI(R) ;CLEAR A BLOCK NUMBER SETZM .JCCNT(R) ;START AS A FRESH FILE JRST LABSRC ;GO FIND THE LABEL BACK.1: MOVEI T1,[ASCIZ/BTNBPL Your use of BACKTO has caused a possible loop./] JRST NORM.1 ;ISSUE ERROR AND GOTO %FIN:: ;CHKPNT COMMAND - TAKE A CHECKPOINT BBCHKP: PUSHJ P,GETLAB ;GET THE REQUEUE LABEL AND ECHO THIS LINE SKIPN T1,.JLABL(R) ;WAS THERE A LABEL JRST GOTO.1 ;NO, IS AN ERROR MOVEM T1,.JCHRQ(R) ;STORE THE RESTART LABEL PUSHJ P,FUNCHK ;PREFORM THE CHECKPOINT CALL PUSHJ P,CLSLOG ;EMPTY OUT THE LOG FILE JRST HONO.1 ;RESUME READING THE CTL FILE ;REQUEUE COMMAND - REQUEUE THIS JOB (OPTIONAL RESTART LABEL) BBREQU: PUSHJ P,GETLAB ;GET THE OPTIONAL LABEL, ECHO THIS LINE SKIPE T1,.JLABL(R) ;WAS THERE A LABEL MOVEM T1,.JCHRQ(R) ;STORE THE RESTART LABEL JRST ANLY.6 ;GIVE AN AFTER, LOGOUT, AND REQUEUE ;NOERROR COMMAND - TURN OFF ALL ERRORS (EXCEPT TIME EST EXCEEDED) BBNOER: TLO F,FL.NER ;SET NOERROR IN EFFECT BAEXIT: PUSHJ P,BALINE ;ECHO THE BATCH COMMAND JRST HONO.1 ;RESUME READING THE CTL FILE ;NOOPERATOR COMMAND - LEAVE DIALOGUE MODE BBNOOP: SETZ T1, ;CLEAR THE DIALOGUE CHARACTER DPB T1,LDOPCH ;CLEAR IT JRST BAEXIT ;AND EXIT THROUGH COMMON CODE ;ERROR COMMAND - DEFINE AN ADDITIONAL ERROR CHARACTER BBERRO: TLZ F,FL.NER ;CLEAR NOERROR MODE JSP T1,ER..OP ;CALL COMMON ROUTINE FOR ERROR/OPERATOR XWD 0,[ASCIZ/ERROR/] ;DEFAULT CHARACTER,,STRING NAME OF CALLER LDERCH: POINT 9,.JERCD(R),8 ;HOW TO LOAD/STORE THE CHARACTER ;OPERATOR COMMAND - ENTER DIALOGUE MODE WITH THE SPECIFIED CHARACTER BBOPER: JSP T1,ER..OP ;CALL THE COMMON PROCESS (IT WILL NO RETURN HERE) XWD "$",[ASCIZ/OPERATOR/] ;DEFAULT IS $,CALLER IS OPERATOR LDOPCH: POINT 9,.JERCD(R),17 ;HOW TO LOAD/STORE THE CHARACTER ;PLEASE COMMAND - OUTPUT A MESSAGE TO THE OPERATOR (OPTIONALLY WAIT) ;MESSAGE COMMAND - THE PLEASE COMMAND FOR THE MINI-BATCH STANDARD BBMESS: BBPLEA: TLO F,FL.PLS ;SET PLEASE IN PROGRESS PUSHJ P,TTYALL ;GIVE A HEADER TO THE OPERATOR PUSHJ P,BALINE ;ECHO LINE TO THE LOG AND TO THE OPERATOR TLZN F,FL.PLS ;IS PLEASE STILL SET JRST [PUSHJ P,TTCRLF ;END THE TTY LINE JRST HONO.1] ;RESUME READING THE CTL FILE OUTSTR [ASCIZ/OPR--Respond /] MOVEI T1,[ASCIZ /GO (or KILL) Waiting... /] PUSHJ P,SJBLIN ;TYPE #-STUFF PUSHJ P,CLSLOG ;UPDATE THE LOG FILE BEFORE WAITING PUSHJ P,OPRRES ;GET THE OPERATOR RESPONSE JRST HONORJ ;START AT THE BEGINNING ;SILENCE COMMAND - TURN OFF THE LOG FILE ;REVIVE COMMAND - TURN IT BACK ON BBSILE: TLOA F,FL.SIL ;SET SILENCE MODE BBREVI: TLZ F,FL.SIL ;CLEAR SILENCE MODE JRST BAEXIT ;END OF THESE COMMANDS ;IF COMMAND - DO SOME ERROR TESTING BBIF: PUSHJ P,SKPBLK ;SKIP OVER ANY BLANKS CAIE CH,"(" ;NEED THE OPENING PAREN JRST IF...E ;BAD IF COMMAND PUSHJ P,GETSIX ;GET THE ARGUMENT JUMPE T1,IF...E ;BAD COMMAND PUSHJ P,SKPBLK ;SKIP MORE BLANKS CAIE CH,")" ;BETTER BE THE CLOSURE JRST IF...E ;REAL BAD COMMAND MOVE A,[-NIFCMD,,IFCMDS] ;AOBJN FOR TABLE LOOKUP PUSHJ P,TABSRC ;LOOK FOR THE COMMAND IN T1 JRST IF...E ;NOT FOUND JRST IF...E ;AMBIGUOUS JRST @IFDISP(C) ;PROCESS THE IF COMMAND IF...E: PUSHJ P,BALINE ;OUTPUT THE LINE MOVEI T1,[ASCIZ/BTNIIC Illegal IF command argument or syntax error./] JRST NORM.1 ;GIVE ERROR AND GOTO %FIN:: ;DEFINE THE LEGAL ARGUMENTS FOR IF COMMANDS. RULES: ; 1)COMMANDS ARE UNIQUE IN 4 LETTERS DEFINE CMDTBL< LSTOFF X ERROR, ;TEST IF AN ERROR OCCURRED X NOERRO, ;TEST IF NO ERRORS HAVE OCCURRED LSTON > DEFINE X(A)< > IFCMDS: CMDTBL ;GENERATE THE ARGUMENT TABLE NIFCMD==.-IFCMDS ;NUMBER OF THEM DEFINE X(A)< EXP FF'A > IFDISP: CMDTBL ;GENERATE THE DISPATCH TABLE ;HERE TO PROCESS THE IF COMMAND ;FFERRO PROCESSES THE .IF(ERROR)statement FORM ;FFNOER PROCESSES THE .IF(NOERROR)statement FORM ;EXIT IS VIA IFTRUE IF THE CONDITION IS TRUE AND THE STATEMENT IS TO BE EXECUTED ;OR IFFALS IF THE CONDITION IS FALSE AND THE STATEMENT IS TO BE SKIPPED FFERRO: TLZN R,RL.JIE ;DID AN ERROR OCCUR JRST IFFALS ;NO, IF(ERROR) IS FALSE IFTRUE: IDENT [ASCIZ/ TRUE /] ;IDENTIFY TRUE LINE JSP T1,REPOSI ;BACK TO THE START OF THIS LINE TLZE F,FL.PER ;NEED A PERIOD PUSHJ P,PUTPER ;YES, ECHO ONE FOR CLEANLINESS IFTR.1: PUSHJ P,GETCTL ;CAN COPY EVERYTHING UP TO THE CLOSE PAREN PUSHJ P,PUTLOG ;OUTPUT THIS ONE CAIE CH,")" ;ALL AFTER THAT IS ANOTHER COMMAND JRST IFTR.1 ;CONTINUE PUSHJ P,LOGCLF ;END THIS LINE JRST HONO.3 ;FIND THE OBJECT STATEMENT AND EXECUTE IT FFNOER: TLZN R,RL.JIE ;DID AN ERROR OCCUR JRST IFTRUE ;NO, .IF(NOERROR) IS TRUE IFFALS: IDENT [ASCIZ/ FALSE /] ;IDENTIFY THE FALSE LINE JSP T1,REPOSI ;BACK UP THE LINE PUSHJ P,BALI.1 ;COPY THE ENTIRE LINE AS A COMMENT JRST HONO.1 ;PROCESS THE NEXT STATEMENT ;HERE TO GET A LABEL FOR COMMANDS LIKE GOTO (AND ECHO A BATCH COMMAND LINE) GETLAB: TRO F,FR.RSC ;ALREADY HAVE CH PUSHJ P,GETSIX ;GET A SIXBIT LABEL MOVEM T1,.JLABL(R) ;STORE IT (EVEN IF NONE) BALINE: IDENT [ASCIZ/ BATCH /] ;IDENTIFY THIS LINE POP P,TEMP1 ;SAVE RETURN CAUSE STACK HAS CTL FILE POINTERS JSP T1,REPOSI ;REPOSITION TO THE BEGINNING OF THE LINE PUSH P,TEMP1 ;PUT RETURN BACK ON BALI.1: TLZE F,FL.PER ;DID LINE START WITH A PERIOD PUSHJ P,PUTPER ;YES, ECHO ONE FOR CLEANLINESS PUSHJ P,GETCTL ;GET THE CHARACTER JRST CMNT.1 ;ECHO IT AND THE LINE, THEN RETURN ;HERE TO GET THE CHARACTER FOR .ERROR AND .OPERATOR ;CALL VIA JSP T1,ER..OP (DOES NOT RETURN TO CALLER) ; 0(T1) = XWD DEFAULT CHARACTER , [ASCIZ/CALLERS NAME/] ; 1(T1) = POINT STATEMENT TO STORE THE CHARACTER ER..OP: HLR T2,(T1) ;GET THE DEFAULT CHARACTER DPB T2,1(T1) ;STORE IT NOW PUSHJ P,SKPBLK ;SKIP OVER ANY BLANKS (TABS) CAIE CH,CHR.CR ;IS IT THE CARRIAGE RETURN PUSHJ P,COMTRM ;THIS IS THE SAME CHECK AS IN GETONE JRST BAEXIT ;YES, RETURN WITH DEFAULT SET CAIE CH,";" ;LINE HAVE A COMMENT CAIN CH,"!" ;OTHER COMMENT CHARACTER JRST BAEXIT ;YES, STOP NOW CAIG CH,40 ;ONLY VALID IF ABOVE 40 OCTAL JRST ER...1 ;BAD CHARACTER SPECIFIED DPB CH,1(T1) ;STORE THE SPECIFIED CHARACTER JRST BAEXIT ;AND RETURN THROUGH COMMON CODE ER...1: SETZ T2, ;ON ERROR, CLEAR ANY DEFAULT CHARACTER DPB T2,1(T1) ;STORE A NULL CHARACTER HRRZ T1,(T1) ;GET ADDRESS OF CALLERS NAME MOVEM T1,TEMP2 ;SAVE IN A TEMP PUSHJ P,BALINE ;ECHO THE BATCH COMMAND MSGLOG [ASCIZ/BTNICS Illegal character specified for /] TXTLOG @TEMP2 ;APPEND THE CALLERS NAME PUSHJ P,LGCLF2 ;COUPLE OF BLANK LINES JRST FINSRC ;GOTO %FIN:: ;HERE FOR THE FIRST LOOK AT DIGITAL RESERVED LABELS (%XXXXX::) USRERR: TLZE F,FL.PER ;ENTERED AT USRERR FROM MONSND DECLAB: PUSHJ P,DECRBP ;BACK UP OVER THE % SIGN (OR .) TRO F,FR.LSL ;LIST LINES SKIPPED TLNN R,RL.JIE ;IS THE JOB IN ERROR JRST FINSRC ;NO, LOOK FOR % FIN PUSHJ P,SYSPRG ;WHERE DID THE PROGRAM COME FROM SKIPA T1,[SIXBIT/%CERR/] ;SYS MOVE T1,[SIXBIT/%ERR/] ;USER MOVEM T1,.JLABL(R) ;SAVE THE LABEL JRST LABSRC ;NOW SEARCH FOR IT ;HERE TO SET UP FOR A SEARCH FOR %FIN:: OR %TERR:: TIMERR: TLOE F,FL.%XT ;TIME EST EXCEEDED GIVE EXTRA TIME JRST CLOSJB ;ALREADY DID, KLUNK THE JOB NOW TRO F,FR.LSL ;LIST LINES SKIPPED FOR TIME LIMIT EXCEEDED SKIPA T1,[SIXBIT/%TERR/] ;SET UP FOR SEARCH FINSRC: MOVE T1,[SIXBIT/%FIN/] ;LABEL WE WANT MOVEM T1,.JLABL(R) JRST LABSRC ;NOW SEARCH FOR IT ;HERE TO ACTUALLY DO THE LABEL SEARCH. .JLABL(R) HAS THE LABEL LABSRC: TRO F,FR.%SG ;INCLUDE % SIGNS IN LABELS TLO R,RL.FCI ;FAKE OUT CLOSJB IF WE NEVER FIND THE LABEL MOVE T1,[PUSHJ P,GETCTL] ;HOW TO GET A CHARACTER MOVEM T1,COMFIL ;STORE FOR GETONE LABS.0: TRNE F,FR.LSL ;LISTING SKIPPED LINES JSP T1,SAVPOS ;YES, SAVE OUT CURRENT POSITION PUSHJ P,GETONE ;GET THE FIRST CHARACTER OF THIS LINE JRST LABS.5 ;END OF LINE CHARACTER CAIE CH,"%" ;SPECIAL CHARACTER, IS IT % SIGN JRST LABS.4 ;A NUMBER OR OTHER SPECIAL, IS NOT A LABEL TRO F,FR.RSC ;LINE STARTS WITH A LETTER, RE-GET IT IN GETSIX PUSHJ P,GETSIX ;GET A POSSIBLE LABEL CAIN CH,":" ;FIELD END WITH A COLON JRST LABFND ;YES, FOUND A LABEL LABS.4: TRNE F,FR.LSL ;IS THE POSITION ON THE STACK JRST LABS.3 ;YES, LIST THE SKIPPED LINE SKIPA ;MIGHT ALREADY BE A TERMINATOR LABS.1: PUSHJ P,GETCTL ;GET THE NEXT CHARACTER CAIE CH,CHR.LF ;END OF THIS LINE YET JRST LABS.1 ;IGNORE MORE CHARACTERS LABS.2: TRNN F,FR.BAK ;END OF A LINE, DOING A BACKTO JRST LABS.0 ;NO, CHECK FOR A LABEL ON THIS LINE MOVN T1,.JCCNT(R) ;BUILD SAME TYPE OF POSITION AS BACKTO DID HRL T1,.JCUSI(R) ;TO SEE IF WE PASSED THE ORIGINAL BACKTO TLZ T1,(1B0) ;IN CASE BLOCK IN END OF FILE CAML T1,.JBAKP(R) ;PASS IT UP YET JRST CLOSJB ;YES, REPORT THE ERROR JRST LABS.0 ;NO, LOOK FOR A LABEL ON THIS LINE LABFND: TRNN F,FR.FIN ;CAN WE SKIP OVER A %FIN:: CAME T1,[SIXBIT/%FIN/] ;NO, IS THIS %FIN:: SKIPA ;SEE IF LABEL WE ARE SEARCHING FOR JRST FINFND ;FOUND A %FIN::, SEARCH IS COMPLETED CAME T1,.JLABL(R) ;IS IT THE ONE WE WERE LOOKING FOR JRST LABS.4 ;NO, CONTINUE SEARCH CAMN T1,[SIXBIT/%TERR/] ;LOOKING FOR TIME LIMIT RECOVERY JRST FINF.2 ;YES, AND THIS IS IT, GIVE %EXTRA LABF.1: TRNN F,FR.LSL ;IS THE CURRENT POSITION ON THE STACK JRST LABF.2 ;NO, LABEL THIS LINE POP P,(P) ;CLEAN UP AFTER SAVPOS, WE ARE AT THE RIGHT PLACE POP P,(P) ;... POP P,(P) ;... LABF.2: IDENT [ASCIZ/ BLABL /] ;IDENTIFY LABELED LINE SIXLOG .JLABL(R) ;OUTPUT THE LABEL FOUND PUSHJ P,PUTCOL ;ADD A COLON PUSHJ P,GETCTL ;GET THE NEXT CHARACTER (MAYBE ANOTHER COLON) PUSH P,CH ;SAVE IT FOR NOW CAIN CH,":" ;WAS IT A COLON PUSHJ P,PUTLOG ;YES, OUTPUT IT PUSHJ P,LOGCLF ;END THE LINE TRZ F,FR.%SG!FR.BAK!FR.LSL!FR.FIN ;CLEAR SEARCH TYPE FLAGS TLZ R,RL.JIE!RL.DIA ;AFTER A SUCCESSFUL FIND, CLEAR JOB IN ERROR POP P,CH ;RESTORE THAT CHARACTER CAIN CH,":" ;WAS IT THE SECOND COLON JRST HONO.3 ;YES, FIND THE OBJECT STATEMENT AND EXECUTE IT PUSHJ P,SKPBLK ;SKIP THIS IF A BLANK (AND ANY OTHERS) JRST HONO.4 ;NOW EXECUTE THE OBJECT STATEMENT LABS.3: JSP T1,REPOSI ;REPOSITION THE CTL FILE PUSHJ P,GETCTL ;GET THE FIRST CHARACTER PUSHJ P,CPYCMT ;COPY IT AND THE REST AS A COMMENT LINE JRST LABS.2 ;RETURN TO BACKTO CHECK LABS.5: CAIE CH,CHR.FF ;CHECK EOL CHARACTER FOR FORM FEED-VERTICAL TAB CAIN CH,CHR.VT ;CHARACTER AFTER THEM CAN START A NEW LABEL MOVEI CH,CHR.LF ;PRETEND A LINE FEED TO END THIS LINE JRST LABS.4 ;IF LISTING LINES, IT WILL COME OUT A FF OR VT ;HERE WHEN A %FIN:: HAS BEEN FOUND T1=SIXBIT/%FIN/ FINFND: CAMN T1,.JLABL(R) ;WERE WE SEARCHING FOR %FIN:: JRST FINF.1 ;YES, SKIP THE MESSAGE PUSHJ P,LOGBLK ;GET A BLANK LINE IN THE LOG FILE PUSHJ P,LGCMNT ;PREPARE A COMMENT LINE TXTLOG [ASCIZ/BTNFFS Found %FIN while searching for /] SIXLOG .JLABL(R) ;OUTPUT THE LABEL TXTLOG [ASCIZ/, proceeding from %FIN/] PUSHJ P,LGCLF2 ;ISOLATE THE MESSAGE FROM THE LABEL MOVE T1,[SIXBIT/%FIN/] ;NEED TO RESET THE LABEL SEARCHED FOR MOVEM T1,.JLABL(R) ;SO WE CAN PRINT IT OUT AT LABF.2 FINF.1: PUSHJ P,CHKCLS ;SEE IF A CLOSE/DUMP IS NEEDED FINF.2: TLZN F,FL.TLE ;DID THE JOB EXCEED THE TIME LIMIT JRST LABF.1 ;NO, RESUME NORMAL ROUTE PUSHJ P,INMONM ;MAKE SURE THE JOBS IN MONITOR MODE HRRZ C,Q.ILIM(R) ;GET THE JOBS TIME EST IMULI C,%EXTRA ;COMPUTE THE EXTRA TIME AVAILABLE IDIVI C,^D100 ;AS A PERCENTAGE OF THE ORIGINAL EST CAIGE C,%EXTRA ;BUT LETS BE REASONABLE ABOUT IT MOVEI C,%EXTRA ;USING %EXTRA HERE IS PROBABLY OK IFN FTUUOS,< MOVE A,[2,,B] ;SET UP FOR JBSET HRRZ B,J ;GET THE JOB NUMBER HRLI C,.STTLM ;SET TIME FUNCTION JBSET. A, ;TRY IT WITH THE UUO > ;END OF IFN FTUUOS PUSHJ P,SETTIM ;SEND THE COMMAND IF THAT FAILED JRST LABF.1 ;AND RETURN TO NORMAL SEARCH SUBTTL Job Processor - Perform Auto KJOB and Dismiss the Job CLOSJB: TLNE R,RL.KJB ;WHAT ARE WE DOING HERE JRST CLOS.3 ;IN LOTS OF TROUBLE, GO DISMISS THE JOB TRNN F,FR.%SG ;WAS A LABEL SEARCH IN PROGRESS JRST CLOS.0 ;NO, SKIP THE ERROR MESSAGE LDB T1,[POINT 6,.JLABL(R),5] ;GET THE FIRST SIXBIT CHARACTER CAIN T1,'%' ;WAS IT ONE OF THE % LABELS JRST CLOS.4 ;YES, GIVE A DIFFERENT MESSAGE MSGLOG [ASCIZ/BTNCNF Could not find label /] CLOS.5: SIXLOG .JLABL(R) ;OUTPUT THE LABEL WE COULDN'T FIND PUSHJ P,LGCLF2 ;ADD A FEW BLANKS CLOS.0: TLNE R,RL.FCI ;HIT EOF WHILE LOOKING FOR FIRST CHARACTER TLNN J,JL.UML ;IS JOB AT MONITOR LEVEL PUSHJ P,INMO.1 ;JUNK SENT OR AT USER LEVEL, GET TO THE MONITOR PUSHJ P,CHKCLS ;CHECK IF A CLOSE/DUMP IS NEEDED PUSHJ P,ATOKJB ;PERFORM THE AUTO KJOB CLOS.1: IFN JOBMSG,< PUSHJ P,TTYSJB ;TYPE OUT THE SUBJOB NUMBER OUTSTR [ASCIZ/finished/] PUSHJ P,TTCRLF > PUSHJ P,CTLDIS ;DISPOSE OF THE CTL FILE (MAYBE) CLOS.3: HRLI P,-.JPSIZ ;RESET JOB PROCESSOR PDL HRRI P,.JPLST-1(R) ;RESET IT BEFORE THE CALL TO QMANGR PUSHJ P,REMCTL ;REMOVE ANY OLD CTL FILE ASSIGNMENTS PUSHJ P,DELSPL ;REMOVE ANY SPOOLED FILES FOR THIS JOB MOVEI A,QSRMSG ;POINT TO THE MESSAGE BLOCK MOVX B, MOVEM B,.MSTYP(A) ;STORE LENGTH AND TYPE MOVE B,Q.ITN(R) ;TASK NAME GIVEN BY QUASAR MOVEM B,REL.IT(A) ;STORE IT MOVE B,.JJOBN(R) ;GET THE JOB NUMBER MOVE C,Q.LMOD(R) ;GET THE LOG FILE BITS TXNE C,FP.DEL ;TO BE DELETED TXO B,RL.DLG ;YES, SET A BIT LOAD C,Q.IDEP(R),EQ.OUT ;GET /OUTPUT: VALUE CAIE C,%EQOLG ;PRINT THE LOG CAIN C,%EQOLE ;OR PRINT IT IF AN UNHANDLED ERROR SKIPA ;ONE OF THE ABOVE JRST CLOS.8 ;NEITHER, DON'T REQUEST PRINTING TRNN F,FR.UHE ;AN UNHANDLED ERROR OCCUR CAIN C,%EQOLG ;NO, WANT IT ANYWAY TXO B,RL.PRL ;MUST PRINT THE LOG CLOS.8: MOVEM B,REL.BJ(A) ;STORE FLAGS AND JOB NUMBER TLNE R,RL.NLG ;WAS THERE A LOG FILE JRST CLOS.6 ;NO, CANCEL THE ABOVE WORK ;;; CLOSJB IS CONTINUED ON THE NEXT PAGE IFN FTUUOS,< MOVE B,Q.LSTR(R) ;GET THE LOG FILE STRUCTURE CAMN B,[SIXBIT/NUL/] ;HAVE I BEEN WRITING ON NUL: JRST CLOS.6 ;YES, SKIP THE SPEC MOVEI B,Q.LSTR(R) ;START AT THE STRUCTURE MOVEI C,REL.FD(A) ;MOVE TO RELEASE BLOCK CLOS.2: CAIG B,Q.LDIR(R) ;COPY EVERYTHING TO THE PATH JRST CLOS.7 ;ALWAYS INCLUDE THOSE CAIE B,Q.LMOD(R) ;LAST LOC TO TRY FOR SKIPN (B) ;OR STOP AT THE FIRST ZERO (IN THE PATH) JRST CLOS.6 ;END OF THE SPEC CLOS.7: MOVE D,(B) ;GET THE DATA MOVEM D,(C) ;STORE THE WORD LOAD D,.MSTYP(A),MS.CNT ;GET THE COUNT FOR AOS AOS D STORE D,.MSTYP(A),MS.CNT ;STORE ADJUSTED COUNT AOJA B,.+1 ;BUMP B AOJA C,CLOS.2 ;BUMP C AND GO > ;END OF IFN FTUUOS IFN FTJSYS,< MOVE B,.JLDEV(R) ;GET LOGFILE DEVICE CAMN B,[ASCII /NUL/] ;IS IT "NUL"? JRST CLOS.6 ;YES, IGNORE ALL OF THIS HRLI B,Q.LSTR(R) ;WHERE THE LOG FILE DESCRIPTOR IS HRRI B,REL.FD(A) ;FOR THE RELEASE MESSAGE MOVE C,.JLGFD(R) ;LENGTH OF THE FD ADDI C,REL.FD-1(A) ;LAST LOC TO MOVE INTO BLT B,0(C) ;APPEND THE LOG FILE TO THE RELEASE LOAD B,.MSTYP(A),MS.CNT ;GET THE CURRENT SIZE WITHOUT THE FD ADD B,.JLGFD(R) ;LENGTH JUST MOVED STORE B,.MSTYP(A),MS.CNT ;ADJUST FOR IT > ;END OF IFN FTJSYS CLOS.6: PUSHJ P,SNDQSR## ;SEND IT O QUASAR HRRZS R ;CLEAR ALL FLAGS PUSHJ P,QTS ;GO DORMANT, WILL NOT RETURN HERE CLOS.4: PUSHJ P,LOGBLK ;GET A BLANK LINE BEFORE THE MESSAGE PUSHJ P,LGCMNT ;PREPARE THE LOG FILE FOR A COMMENT TXTLOG [ASCIZ/BTNECF End of the Control File while searching for /] JRST CLOS.5 ;ADD THE LABEL AND AUTO KJOB THIS JOB ;HERE TO PROCESS OPERATOR REQUEST TO KILL THIS JOB KILLJB: PUSHJ P,INMO.1 ;FORCE JOB TO MONITOR MODE PUSHJ P,LOGBLK ;OUTPUT A BLANK LINE IDENT [ASCIZ/ BAOPR KILL /] ;IDENTIFY THIS LINE SIXLOG .JWHO(R) ;APPEND OPERATORS OPTION FOR KILL MOVEI CH," " ;APPEND A BLANK PUSHJ P,PUTLOG ;OUTPUT IT TXTLOG .JOPER(R) ;APPEND ANY OPERATOR COMMENT PUSHJ P,LOGBLK ;ANOTHER BLANK LINE TLO R,RL.JIE!RL.FCI ;SET ERROR IN JOB FLAG PLUS ANOTHER MOVE T1,.JWHO(R) ;GET THE OPERATORS OPTION FOR KILL CAMN T1,[SIXBIT/ERROR/] ;KILL WITH ERROR RECOVERY JRST HONORJ ;YES, JIE IS SET, RESUME WITH THE CTL FILE TLZ R,RL.JIE ;CLEAR THE FLAG TO AVOID CLOSE/DUMP TRO F,FR.UHE ;AN UNEXPECTED CONDITION JRST CLOSJB ;GO KILL THE JOB ;HERE TO PROCESS OPERATOR REQUEST TO REQUEUE THIS JOB REQUJB: PUSHJ P,INMO.1 ;FORCE JOB TO MONITOR MODE NOW PUSHJ P,LOGBLK ;OUTPUT A BLANK LINE IDENT [ASCIZ/ BAOPR REQUEUE /] ;IDENTIFY OPERATORS REQUEUE SKIPN T1,.JWHO(R) ;GET THE TIMER REQUESTED MOVEI T1,REQTIM ;USE THE DEFAULT IDIVI T1,^D60 ;HOURS IN T1, MINUTES IN T2 PUSH P,T2 ;SAVE MINUTES PUSHJ P,LGDEC2 ;OUTPUT HH PUSHJ P,PUTCOL ;ADD A COLON POP P,T1 ;RESTORE MINUTES PUSHJ P,LGDEC2 ;AND OUTPUT MM PUSHJ P,LOGBLK ;ADD ANOTHER BLANK LINE SKIPN A,.JWHO(R) ;GET THE REQUEUE TIME AGAIN JRST ANLY.6 ;SET UP THE DEFAULT JRST ANLY.2 ;GIVE IT AN AFTER AND REQUEUE THIS JOB ;HERE TO PROCESS OPERATOR REQUEST TO STOP THIS JOB STOPJB: PUSHJ P,INMO.1 ;FORCE THE JOB TO MONITOR MODE PUSHJ P,JUSTCL ;CLOSE LOG AND WAIT FOR GO IDENT [ASCIZ/ BATCH ./] ;LET THE USER KNOW WE'RE CONTINUING THE JOB TXTJOB [ASCIZ/CONTINUE/] ;TELL THE MONITOR CONTINUE JRST SNDCLF ;END THE LINE, SEND THE BUFFER, AND RETURN JUSTCL: PUSHJ P,CLSLOG ;CLOSE OUT THE LOG FILE TLO R,RL.STP ;INDICATE STOPPED JRST QTS ;RETURN TO PROCESS WHEN OPERATOR SAYS 'GO' ;HERE TO PROCESS USER REQUEST TO KILL THE JOB CANCJB: PUSHJ P,INMO.1 ;FORCE TO MONITOR LEVEL PUSHJ P,LOGBLK ;ALIGN THE OUTPUT IDENT [ASCIZ/ BAUSR Job Cancelled by User Request/] PUSHJ P,LGCMNT ;PREPARE FOR ANOTHER COMMENT TXTLOG [ASCIZ/ Requesting user was /] IFN FTUUOS,< MOVE T1,.JKILR(R) ;GET THE PPN WHO DID IT PUSHJ P,LOGF.2 ;OUTPUT IT TO THE LOG FILE > ;END OF IFN FTUUOS IFN FTJSYS,< HRROI T1,TEMP3 ;BLOCK FOR DIR TO NAME CONVERSION LOAD T2,.JKILR(R) ;DIRECTORY OF KILLER DIRST ;PLACE DIRECTORY NAME IN TEMP3 HALT . ;;;SHOULDN'T HAPPEN TXTLOG TEMP3 ;OUTPUT DIRECTORY TO THE LOG FILE > ;END OF IFN FTJSYS PUSHJ P,LOGBLK ;ISOLATE THAT LINE TLO R,RL.FCI ;SET A FLAG FOR CLOSJB TLZ R,RL.JIE ;AVOID THE CLOSE/DUMP PAIR TRO F,FR.UHE ;AN UNEXPECTED CONDITION JRST CLOSJB ;CANCEL IT NOW ;HERE IS THE ACTUAL SUBROUTINE TO DO THE AUTO KJOB ATOKJB: TLZ F,FL.SIL ;CLEAR SILENCE IF WE ARE GOING TO KJOB THIS JOB PUSHJ P,PREKJB ;SET UP FOR AUTO LOGOUT PUSHJ P,INMONM ;MAKE SURE THE JOBS IN MONITOR MODE TLNE R,RL.TIM ;NEED A TIME STAMP PUSHJ P,PUTPER ;YES, OUTPUT (SOMETHING), THAT WILL STAMP IT KJOB.K: TLNN J,JL.ULI ;IS THE JOB THERE NOW POPJ P, ;NO, THAT WAS EASY TLO R,RL.KJB ;MARK ON THE WAY OUT MOVEI T1,"""" ;GET A QUOTE DPB T1,LDOPCH ;SET AS DIALOGUE MODE SIGNAL TXTJOB KJSTR ;SEND THE KJOB STRING PUSHJ P,SNDCLF ;END THE LINE KJOB.1: PUSHJ P,IOWAIT ;WAIT FOR RETURN TO MONITOR MODE TLNN R,RL.NLG ;IS THERE A LOG FILE PUSHJ P,CLSLOG ;YES, CLOSE IT NOW TLNN J,JL.ULI ;DID THE JOB GO AWAY POPJ P, ;YES, RETURN IFN FTJSYS,< MOVE T2,CURMST ;GET CURRENT TIME SKIPN T1,.JLWAT(R) ;FIRST TIME THRU? MOVEM T2,.JLWAT(R) ;YES, SETUP THE TIMER SUB T2,T1 ;NO, SEE IF WAITED LONG ENOUGH MOVMS T2 ;IGNORE THE SIGN CAIL T2,^D14*^D1000 ;14 SECONDS YET? JRST KJOB.2 ;YES, GIVE UP PUSHJ P,QTS ;NO, CONTEXT SWITCH JRST KJOB.1 ;AND TRY AGAIN > ;END IFN FTJSYS KJOB.2: TLZ R,RL.DIA ;NO, CLEAR OUTPUT TO THE OPERATOR PUSHJ P,INMONM ;GET BACK TO MONITOR MODE PUSHJ P,TTCRLF ;A NEW LINE TO THE OPERATOR PUSHJ P,TTYALL ;TYPE SUBJOB NUMBER AND MONITOR JOB NUMBER MSGTTY [ASCIZ/BATCON unable to KJOB. OPR--Please attach to the job and kill it. Then respond /] MOVEI T1,[ASCIZ /GO Waiting.../] PUSHJ P,SJBLIN ;TYPE SJB NUMBER AND A LINE PUSHJ P,OPRRES ;WAIT FOR THE RESPONSE JRST KJOB.K ;SEE IF JOB IS STILL THERE (OR TRY AGAIN) SUBTTL Job Processor - Copy and Interrogate User Output IOW.01: SKIPE CH,.JUPLT(R) ;IS A LOG FILE UPDATE TIMER RUNNING TLNE R,RL.LGI!RL.KJB ;YES, BUT IS THE JOB ON THE WAY IN OR OUT JRST IOW.02 ;IGNORE THE TIMER REQUEST SUB CH,CURMST ;HOW LONG HAS IT BEEN RUNNING MOVMS CH ;IGNORE SIGN PROBLEMS CAML CH,[SPLMBC*^D60*^D1000] ;THE REQUESTED INTERVAL PUSHJ P,CLSLOG ;TIME TO FLUSH THE BUFFERS IOW.02: PUSHJ P,QTS ;WAIT FOR NEXT WAKE UP IOWAIT: PUSHJ P,GJBSTS ;GET THE STATUS OF THE JOB TLNN J,JL.UDI!JL.UOA ;JOB WANT INPUT OR HAS OUTPUT JRST IOW.01 ;NO, GO BACK AND WAIT TLNN J,JL.UOA ;WAS IT OUTPUT AVAILABLE JRST [TLNE F,FL.SIL ;JOB WANTS INPUT, IN SILENCE MODE TLO R,RL.TIM ;YES, KEEP THE OUTPUT ALIGNED POPJ P,] ;RETURN TO THE CALLER PUSHJ P,INPPTY ;INPUT THE BUFFER TLNE R,RL.DIA!RL.QTS!RL.NLG ;MORE DIALOGUE OUTPUT (OR COMMENTS) PUSHJ P,TTYALL ;YES, OUTPUT AN IDENTIFIER READPY: PUSHJ P,GETPTY ;GET A CHARACTER JRST READ.3 ;END OF THE BUFFER, LOOK FOR MORE DIALOGUE OUTPUT READ.0: TLZN R,RL.EOL ;HAS A LINE TERMINATOR BEEN SENT TLNE R,RL.TIM ;OR IS THIS THE FIRST CHARACTER OF A LINE PUSHJ P,ERRCHK ;YES, CHECK FOR ERROR INDICATORS TLNE R,RL.JIE ;DID ERRCHK FIND AN ERROR TLZ F,FL.SIL ;YES, CLEAR SILENCE FOR THIS JOB TLNE R,RL.QTS!RL.DIA ;SHOULD THE OPERATOR SEE THIS CHARACTER OUTCHR CH ;YES, TYPE IT OUT TLNE F,FL.SIL ;IS THE JOB OUTPUT TO BE SUPPRESSED JRST READ.2 ;YES, DON'T INCLUDE IN THE LOG FILE PUSHJ P,PUTLOG ;ECHO THE CHARACTER READ.1: TLNE R,RL.TIM ;END OF A LINE SENT TLZ R,RL.QTS ;YES, CLEAR QUOTES FLAG JRST READPY ;CONTINUE READING READ.2: TLZ R,RL.TIM ;CLEAR TIME STAMP NEEDED CAIG CH,CHR.FF ;DO VERTICAL PAPER MOTION CHECK HERE CAIGE CH,CHR.LF ;SO ERRCHK CAN BE CALLED EVEN IF SILENCE IS SET JRST READ.1 ;NOT ONE OF LF,VT,FF RESUME NORMAL PATH TLO R,RL.TIM ;SET TIME STAMP TO RECOGNIZE COLUMN 1 JRST READ.1 ;RESUME READ.3: TLNN R,RL.DIA!RL.QTS!RL.NLG ;JOB IN DIALOGUE MODE OR STILL NEED JRST IOWAIT ;NO, JUST GO TO SLEEP, LET WAKE GET US BACK MOVEI T1,1 ;TAKE A QUICK NAP SLEEP T1, ;LET THE SUBJOB GET ANOTHER BUFFER READY PUSHJ P,INPPTY ;TRY TO FILL A NEW BUFFER PUSHJ P,GETPTY ;SEE IF ANYTHING THERE JRST IOWAIT ;NO, GO BACK TO SLEEP JRST READ.0 ;GO FROM HERE ;HERE TO CHECK PTY OUTPUT FOR ERROR INDICATORS/QUOTES/DIALOGUE MODE ERRCHK: CAIE CH,"?" ;STANDARD ERROR CHARACTER JRST ERRC.2 ;NO, LOOK FOR ADDITIONAL CHARACTER TLNE R,RL.LGI ;HERE DURING LOGIN SEQUENCE JRST ERRLGI ;YES, GET LOGIN ERROR CODE PUSHJ P,GJTIML ;GET SUBJOBS REMAINING TIME LIMIT JUMPN T1,ERRC.1 ;JUMP IF NOT TIME LIMIT EXCEEDED TLOA F,FL.TLE ;SET THE TIME LIMIT FLAG ERRC.1: TLNN F,FL.NER ;IGNORE ERRORS ? TLO R,RL.JIE ;NOPE (OR TIME LIMIT EXCEEDED), SET ERROR IN JOB JRST ERRC.3 ;AVOID DUPLICATE WORK ERRC.2: TLNE F,FL.NER ;IGNORE ERRORS ? JRST ERRC.3 ;YES, LOOK FOR QUOTES, OPERATOR LDB T1,LDERCH ;LOAD THE ERROR CHARACTER INTO T1 CAIN CH,(T1) ;IS THIS THE ONE ERRC.4: TLO R,RL.JIE ;YES, SET ERROR FLAG ERRC.3: LDB T1,LDOPCH ;GET THE DIALOGUE MODE SIGNAL CAIN CH,(T1) ;IS THIS IT TLO R,RL.DIA!RL.QTS ;YES, SET JOB IN DIALOGUE MODE CAIN CH,"""" ;IS IT A COMMENT TO THE OPERATOR TLO R,RL.QTS ;YES, SET QUOTES MODE TLNN R,RL.QTS ;NEED TO IDENTIFY THE OUTPUT TO THE OPERATOR POPJ P, ;NO, RETURN PUSH P,CH ;SAVE A CHARACTER PUSHJ P,TTYALL ;TYPE OUT SUBJOB INFORMATION NOW POP P,CH ;RESTORE POPJ P, ;AND RETURN ;HERE TO GET THE ERROR CODE FROM LOGIN IN THE FORM ?(n)LGNxxx message ERRLGI: PUSHJ P,PUTLOG ;SEND THE ? SETZ T1, ;EVENTUAL ERROR CODE IFN FTUUOS,< PUSHJ P,NXTPTY ;GET THE NEXT CHARACTER CAIE CH,"(" ;ERROR CODE FOLLOWS? JRST ERRSTO ;NO, STORE 0 AND RETURN ERRL.1: PUSHJ P,PUTLOG ;OUTPUT THE ( PUSHJ P,NXTPTY ;GET THE CODE NUMBER MOVEI T2,-"0"(CH) ;CONVERT TO BINARY CAILE T2,^D9 ;WAS IT A DIGIT JRST ERRSTO ;NO, STORE ERROR SO FAR AND RETURN IMULI T1,^D10 ;POSITION OTHER DIGITS ADDI T1,(T2) ;INCLUDE THIS DIGIT JRST ERRL.1 ;ECHO THIS DIGIT AND GET MORE ERRSTO: CAIN T1,1 ;IS IT LOGIN ERROR # 1 POPJ P, ;YES, THATS A WARNING, EXIT NOW > ;END OF IFN FTUUOS TLO R,RL.JIE ;INDICATE JOB IN ERROR HRRM T1,.JERCD(R) ;STORE THE ERROR CODE POPJ P, ;RETURN TO INLINE CODE SUBTTL Job Processor - Error Analysis, Processing, and Reporting ;HERE TO INTERROGATE THE LOGIN FAILURE ANALYZ: IFN FTUUOS,< TLNE R,RL.JNA ;DID A JOB NUMBER EVER GET ASSIGNED JRST ANLY.1 ;YES, LOOK AT THE ERROR CODE ANLY.4: TLNE J,JL.ULI ;USER LOGGED IN NOW POPJ P, ;YES, THAT'S INCONSISTENT TLO G,GL.NJN ;SET NO MONITOR JOB NUMBERS PUSHJ P,GETMST ;GET TIME WHEN NOTICED (MS.) MOVEM T1,NJNTIM ;START THE TIMER RUNNING PUSHJ P,TELQSR ;QUICK, SEND A STATUS CHANGE JRST ANLY.3 ;GO REQUEUE THIS JOB ANLY.1: HRRZ T1,.JERCD(R) ;GET THE ERROR CODE FROM LOGIN CAIE T1,4 ;IS THE SYSTEM AVAILABLE JRST ANLY.5 ;YES, LOOK FURTHUR TLNE J,JL.ULI ;IS THE USER LOGGED IN NOW POPJ P, ;THAT TOO IS INCONSISTENT TLON G,GL.SSH!GL.STC ;GIVE MESSAGE ONLY ONCE MSGTTY [ASCIZ/Jobs cannot LOGIN. Stopping further scheduling/] JRST ANLY.6 ;GO REQUEUE THE JOB ANLY.5: CAIN T1,5 ;LOGMAX EXCEEDED JRST ANLY.4 ;YES, TREAT AS "JOB CAPACITY EXCEEDED" CAIN T1,2 ;IS IT JOB SEMI-FATAL JRST ANLY.6 ;YES, REQUEUE THE JOB > ;END OF IFN FTUUOS TLNE J,JL.ULI ;ALL OTHERS KLUNK THE JOB, IS IT LOGGED IN NOW JRST CLOSJB ;YES, LEAVE JIE SET AND KILL THE JOB MSGLOG [ASCIZ/BTNJBC Job has been cancelled/] PUSHJ P,LGCLF2 ;END THE LINE AND ADD A BLANK ONE PUSHJ P,CLSLOG ;CLOSE OUT THE LOG FILE JRST CLOS.1 ;AND DISMISS THE JOB ANLY.6: MOVEI A,REQTIM ;LOAD THE DEFAULT ANLY.2: MOVEM A,.JAFTR(R) ;STORE FOR REQUEUE BLOCK ANLY.3: PUSHJ P,LOGBLK ;GET A BLANK LINE ON THE LOG FILE PUSHJ P,LGCMNT ;GET READY FOR A COMMENT TXTLOG [ASCIZ/BTNJRQ Job requeued/] PUSHJ P,LGCLF2 ;END THE LINE AND ADD A BLANK ONE TLNN J,JL.ULI ;IS THE JOB LOGGED IN NOW PUSHJ P,CLSLOG ;NO, CLOSE THE LOG FILE NOW JRST REQUEU ;PERFORM THE REQUEUE SUBTTL Job Processor - Random Little Routines ;SUBROUTINE TO GET JOB STATUS AND SET BITS AS NEEDED GJBSTS: HRRZ J,.JPCHN(R) ;GET THE PTY CHANNEL NUMBER JOBSTS J, ;GET THE STATUS HALT . ;;;BUG HALT MOVEM J,.JSTAT(R) ;SAVE FOR BATOPR IF IT WANTS IT SKIPN .JJOBN(R) ;IS THERE A JOB NUMBER STORED HRRZM J,.JJOBN(R) ;NO, SAVE THIS ONE FOR RELEASE OPERATION TLNE J,JL.UJA ;USER JOB NUMBER ASSIGNED TLO R,RL.JNA ;YES, REMEMBER IT GOT AT LEAST THAT FAR POPJ P, ;RETURN TO CALLER ;SUBROUTINE TO SEND 'SET TIME N' TO THE JOB SETTIM: TLZ C,-1 ;CLEAR LEFT HALF PUSH P,C ;SAVE VALUE TLNE R,RL.TIM ;NEED TO ALIGN THE OUTPUT PUSHJ P,PUTPER ;YES, OUTPUT A DOT (OR SOMETHING) TXTJOB TIMSTR ;SEND THE SET TIME COMMAND POP P,T1 ;RESTORE NUMBER PUSHJ P,SNDDEC ;SEND DECIMAL VALUE PUSHJ P,SNDCLF ;SEND CR-LF AND FORCE BUFFER JRST IOWAIT ;WAIT FOR NEXT INPUT BEFORE RETURNING ;SUBROUTINE TO REQUEUE A JOB (UPDATE ANYTHING BEFORE CALL) REQUEU: TLNE J,JL.ULI ;IS THE JOB NOW LOGGED IN PUSHJ P,ATOKJB ;YES, AUTO KJOB THE JOB FIRST IFN JOBMSG,< PUSHJ P,TTYSJB ;TYPE OUT THE SUBJOB NUMBER OUTSTR [ASCIZ/requeued/] PUSHJ P,TTCRLF ;MENTION THAT THIS JOB IS GONE NOW > PUSHJ P,REMCTL ;REMOVE ANY OLD CTL FILE ASSIGNMENTS PUSHJ P,FUNREQ ;REQUEUE THIS JOB HRRZS R ;CLEAR FLAGS PUSHJ P,QTS ;GO DORMANT, WILL NOT RETURN HERE ;SUBROUTINE TO PLACE A JOB IN OPERATOR WAIT OPRRES: TLO R,RL.OPR ;MARK WAITING FOR THE OPERATOR IFN PROMPT,< MOVE CH,CURMST ;GET TIME WHEN OPERATOR WAIT STARTED MOVEM CH,.JWAIT(R) ;STORE FOR DISPATCH LOOP PROMPTING > PUSHJ P,QTS ;WAIT FOR HIS(HER) RESPONSE JRST GJBSTS ;GET THE STATUS AND RETURN ;SUBROUTINE TO COPY A COMMENT LINE TO THE LOG FILE CPYCMT: TLNE F,FL.SIL ;IS THE OUTPUT TO BE SUPPRESED JRST CMNT.3 ;YES, DONT OUTPUT COMMENT LINES EITHER CAIE CH,CHR.FF ;SEE IF THE FIRST CHARACTER IS FF OR VT CAIN CH,CHR.VT ;IF SO, THEN A ONE CHARACTER COMMENT LINE JRST [TLZ R,RL.TIM ;CLEAR TIME STAMP NEEDED JRST PUTLOG] ;OUTPUT FORM FEED OR VERTICAL TAB AND RETURN CMNT.0: PUSH P,CH ;SAVE FIRST CHARACTER PUSHJ P,LGCMNT ;PREPARE LOG FILE FOR A COMMENT POP P,CH CMNT.1: TLNE R,RL.TIM ;DID ONE OF THE CHARS MOVE THE PAPER JRST CMNT.0 ;YES, START A FRESH COMMENT LINE PUSHJ P,PUTLOG ;DEPOSIT INTO THE LOG FILE TLNN F,FL.PLS ;DOING A PLEASE COMMAND JRST CMNT.2 ;NO, AVOID THE FOLLOWING CAIE CH,CHR.A1 ;IS IT AN ALTMODE JRST CMNT.5 ;NO, JUST OUTPUT THIS CHARACTER TLZ F,FL.PLS ;YES, CLEAR PLEASE COMMAND MOVEI CH,"$" ;ECHO THE ALTMODE AS A $ CMNT.5: OUTCHR CH ;OUTPUT THIS CHARACTER TO THE OPERATOR CMNT.2: CAIN CH,CHR.LF ;END OF A LINE YET POPJ P, ;YES, RETURN TO READING OF CTL FILE PUSHJ P,GETCTL ;GET ANOTHER CHARACTER JRST CMNT.1 ;CONTINUE COPYING CMNT.3: CAIE CH,CHR.FF ;DOES THE LINE START WITH A FORM FEED CAIN CH,CHR.VT ;OR A VERTICAL TAB POPJ P, ;YES, THAT IS A ONE CHARACTER COMMENT LINE CMNT.4: CAIN CH,CHR.LF ;END OF THE COMMENT LINE YET POPJ P, ;YES, RETURN TO CALLER PUSHJ P,GETCTL ;GET ANOTHER CHARACTER TO IGNORE JRST CMNT.4 ;ANY SEE IF DONE YET ;SUBROUTINE TO PUT A JOB INTO MONITOR MODE INMONM: TLNE J,JL.UML ;IS IT ALREADY THERE POPJ P, ;YES, RETURN INMO.1: TLNN J,JL.UDI ;NO, IS IT IN INPUT WAIT PUSHJ P,SNDUPC ;NO, SEND 2 CONTROL C'S PUSHJ P,SNDUPC PUSHJ P,IOWAIT ;WAIT FOR RESPONSE TLNE J,JL.UML ;IS IT NOW AT MONITOR LEVEL POPJ P, ;YES, RETURN PUSHJ P,TTCRLF ;TELL THE OPERATOR PUSHJ P,TTYALL ;THAT WE COULDN'T DO IT MSGTTY [ASCIZ/Job cannot be put in monitor mode. OPR--Type /] MOVEI T1,[ASCIZ /GO to try again (or after you have killed the job) Waiting.../] PUSHJ P,SJBLIN ;AND TYPE IT PUSHJ P,OPRRES ;WAIT FOR OPERATOR RESPONSE TLNN J,JL.ULI ;IS THE JOB STILL THERE JRST CLOS.1 ;NO, DISMISS THE JOB JRST INMONM ;YES, TRY TO DO IT AGAIN ;SUBROUTINES TO INFORM QUASAR OF CHECKPOINT OR REQUEUE FUNCHK: MOVX B, SKIPA ;SKIP OVER REQUEUE FUNREQ: MOVX B, MOVEI A,QSRMSG ;THE MESSAGE MOVEM B,.MSTYP(A) ;STORE THE TYPE AND LENGTH MOVE B,Q.ITN(R) ;THE TASK NAME MOVEM B,REQ.IT(A) ;STORE HRLI B,.JINFO(R) ;CHECKPOINT/REQUEUE INFORMATION HRRI B,REQ.IN(A) ;INTO THE MESSAGE BLT B,REQ.IN+(A) ;MOVE ALL THE WORDS MOVE B,.JAFTR(R) ;GET AFTER PARAMETER IF THIS IS REQUEUE MOVEM B,REQ.AF(A) ;WILL NOT SEND IT IF THIS IS CHECKPOINT JRST SNDQSR## ;TELL QUASAR ;SUBROUTINE TO SKIP BLANKS(TABS) IN THE CTL FILE SKPBL1: PUSHJ P,GETCTL ;ENTER HERE IF CH IS NOT SET AT THE FIRST SKPBLK: CAIE CH," " ;A BLANK CAIN CH,CHR.HT ;OR A TAB JRST SKPBL1 ;SKIP OVER THEM POPJ P, ;RETURN WITH THE FIRST NON-BLANK CHARACTER SUBTTL Channel Allocation Routines ;ROUTINES TO GET CHANNEL ASSIGNMENT FOR LOG,CTL, OR PTY ;CALLED BY: PUSHJ P,CHN??? (WHERE ??? IS LOG,CTL,OR PTY ;RETURNS +1 IF CHANNEL ASSIGNMENT IS NEW ; +2 IF CHANNEL ASSIGNMENT IS OLD (PERMANENT) ;IN EITHER CASE AC 'IO1' HAS CHANNEL NUMBER IN AC FIELD ;IF GL.UC0 IS SET AT THE CALL, THE PRIORITY USURPER IS DISABLED USELOG==1B35 ;BIT INDICATING LOG FILE USAGE USECTL==1B34 ;BIT FOR CTL FILE USEPTY==1B33 ;BIT FOR PTY (PERMANENT ASSIGNMENT) IFN FTUUOS,< CHNLOG: HRRI IO2,USELOG ;ENTRY FOR LOG FILE JRST CHNGET CHNCTL: HRRI IO2,USECTL ;ENTRY FOR CTL FILE JRST CHNGET > ;END OF IFN FTUUOS CHNPTY: HRRI IO2,USEPTY ;ENTRY FOR PTY CHNGET: HRL IO2,S ;INCLUDE STREAM NUMBER SETZM CHNMAY ;CLEAR SOME WORDS SETZM CHNFRE MOVSI IO1,-20 ;NUMBER OF CHANNELS AVAILABLE CHNG.1: CAMN IO2,CHNTBL(IO1) ;LOOK FOR OLD ASSIGNMENT JRST [ANDI IO1,17 ;FOUND ONE, ISOLATE CHANNEL NUMBER LSH IO1,^D23 ;POSITION IN AC FIELD TLZ G,GL.UC0 ;CLEAR A FLAG JRST CPOPJ1] ;GIVE OLD FILE RETURN SKIPN D,CHNTBL(IO1) ;GET TABLE ENTRY HRRM IO1,CHNFRE ;FOUND A FREE CHANNEL JUMPLE D,CHNG.2 ;IF FREE OR RESERVED SKIP OTHER TESTS TRNN D,USEPTY ;USED BY SOME PTY HRLM IO1,CHNFRE ;NO, REMEMBER NON-PTY CHANNEL TRNE D,USECTL ;USED BY SOME CTL FILE HRRM IO1,CHNMAY ;YES, MAY BE FREE FOR PTY'S OR LOG CHNG.2: AOBJN IO1,CHNG.1 ;LOOK AT ALL CHANNELS TLZN G,GL.UC0 ;DOES CALLER WANT CHANNEL 0 INSTEAD JRST CHNG.7 ;NO, GO TAKE A FREE ONE FROM SOMBODY (MAYBE) SETZ IO1, ;RETURN CHANNEL 0 POPJ P, ;RETURN AS NEW ASSIGNMENT IFN FTJSYS,< CHNCTL: TLO R,RL.UST ;ALWAYS FORCE POSITIONING SKIPE .JCJFN(R) ;DOES THE CTL FILE JFN EXIST AOS (P) ;YES, GIVE OLD ASSIGNMENT RETURN JRST CHNXIT ;CLEAR SOME THINGS AND RETURN CHNLOG: SKIPE .JLJFN(R) ;LOG FILE JFN EXIST AOS (P) ;YES, GIVE OLD ASSIGNMENT RETURN CHNXIT: TLZ G,GL.UC0 ;CLEAR USURPER BIT SETZ IO1, ;NEVER RETURN A CHANNEL NUMBER POPJ P, ;RETURN TO CALLER > ;END OF IFN FTJSYS ;HERE WHEN NO CURRENT ASSIGNMENT EXISTS. ALLOCATE A FREE ONE CHNG.7: HRRZ IO1,CHNFRE ;ENCOUNTER ANY FREE CHANNELS JUMPE IO1,CHNG.3 ;NO, ONLY FREE WAS 0 (GUARANTEED) MOVEM IO2,CHNTBL(IO1) ;TAKE THE FREE CHANNEL LSH IO1,^D23 ;POSITION CHANNEL NUMBER POPJ P, ;GIVE NEW FILE RETURN ;HERE WHEN NO FREE CHANNELS WERE FOUND (EXCEPT CHANNEL 0) CHNG.3: TRNE IO2,USECTL ;ARE WE LOOKING FOR A CTL FILE POPJ P, ;YES, USE TEMPORARY CHANNEL HRRZ IO1,CHNMAY ;GET CHANNEL FOR OTHER CTL FILES JUMPN IO1,CHNG.5 ;TAKE IT AWAY FROM THE OTHER STREAM TRNE IO2,USELOG ;WANT IT FOR THE LOG FILE POPJ P, ;YES, ONLY FREE IS CHANNEL 0 HLRZ IO1,CHNFRE ;GET NON-PTY CHANNEL JUMPE IO1,CPOPJ ;IMPOSSIBLE (MEANS MJOB.GT.^D14) CHNG.5: MOVEM IO2,CHNTBL(IO1) ;TAKE THE CHANNEL AWAY LSH IO1,^D23 ;POSITION CHANNEL NUMBER RELCHN: PUSHJ P,CHANIO ;MUST CLOSE OLD FILE CLOSE 0,0 ;CHANIO EXECUTES THIS PUSHJ P,CHANIO RELEASE 0,0 ;GIVE THE OLD ASSIGNMENT BACK POPJ P, ;RETURN WITH NEW CHANNEL FOR THIS STREAM ;HERE TO RELEASE THE A CHANNEL AND ASSIGNMENT RELREL: PUSHJ P,CHANIO ;GIVE BACK TYPE CHANNEL RELEASE 0,0 RELASS: LSH IO1,-^D23 ;POSITION CHANNEL AS INDEX SETZM CHNTBL(IO1) ;RETURN ASSIGNMENT POPJ P, ;RETURN TO DISPATCHER SUBTTL I/O Handling Routines - Simulation and Specification Blocks ;ROUTINE TO EXECUTE I/O SELECT FOR A CHANNEL (IN AC 'IO1') ;CALLED BY: PUSHJ P,CHANIO ; IO SELECT INSTRUCTION ;RETURNS +2 IF NON-SKIP RETURN FROM I/O SELECT ; +3 IF SKIP RETURN CHANIO: JUMPE IO1,CPOPJ ;IF CHANNEL IS ZERO, DO INLINE INST. MOVE IO2,@(P) ;FETCH INSTRUCTION TO BE EXECUTED IOR IO2,IO1 ;INSERT CHANNEL NUMBER AOS (P) ;MUST SKIP IN LINE INST. XCT IO2 ;DO THE SELECT POPJ P, ;GIVE NON-SKIP RETURN AOS (P) ;SKIP RETURN POPJ P, ;RETURN TO CALLER ;SUBROUTINES TO GET THE LOG/CTL FILE SPECIFICATIONS INTO THE 4 WORD ; LOOKUP/ENTER FORMAT. 4 WORD BLOCK IS IN AC'S A-D IFN FTUUOS,< ;ROUTINE TO SET 4 WORD LOOKUP BLOCK FOR CTL FILE CTLSPC: SETZ C, MOVE A,Q.CNAM(R) ;REAL FILE NAME HLLZ B,Q.CEXT(R) ;AND EXTENSION MOVEI D,Q.CDIR(R) ;POINT TO THE PATH SPECIFICATION JRST SETSFD ;SET UP SFD POINTER OR PPN IF NONE ;ROUTINE TO GET 4 WORD LOOKUP BLOCK FOR THE LOG FILE LOGSPC: MOVE A,Q.LNAM(R) ;FILE NAME HLLZ B,Q.LEXT(R) ;EXTENSION SETZ C, MOVEI D,Q.LDIR(R) ;POINT TO THE LOG FILE SFD SPECIFICATION SETSFD: SKIPN 1(D) ;IS THERE ANY SFD SPECIFIED JRST [MOVE D,(D) ;NO, SET D TO THE PPN TLNN D,-1 ;IS PPN = XWD 0,# HRLOI D,377777 ;YES, SOMEBODY MADE A BAD QUE FILE POPJ P,] ;AND RETURN HRLI D,(D) ;SOURCE OF THE PATH HRRI D,SFDPAT+2 ;TO THE PATH BLOCK BLT D,SFDPAT+7 ;MOVE THE WHOLE SPEC MOVEI D,SFDPAT ;POINT TO IT FOR THE UUOS POPJ P, ;AND RETURN > ;END OF IFN FTUUOS IFN FTJSYS,< CTLSPC: LOGSPC: POPJ P, ;THESE ROUTINES ARE NOT NEEDED > ;END OF IFN FTJSYS SUBTTL I/O Handling Routines - The Control File ;SUBROUTINE TO GET A CHARACTER FROM THE CTL FILE GETCTL: SOSGE .JCCNT(R) ;ANY IN THIS BUFFER JRST GETCT1 ;NO, RE-FILL IT ILDB CH,.JCPTR(R) ;GET NEXT JUMPE CH,GETCTL ;IGNORE NULLS MOVE A,@.JCPTR(R) ;GET THE DATA WORD TRNN A,1 ;IS THIS A LINE NUMBERED FILE JRST GETCT4 ;NO, LOOK FOR UPARROWS AOS .JCPTR(R) ;BUMP TO NEXT DATA WORD MOVNI A,5 ;ADJUST COUNT FOR THE NEXT 5 CHARS TO BE ADDB A,.JCCNT(R) ;THROWN AWAY, CHECK IF CROSSED A BLOCK BOUNDRY JUMPGE A,GETCTL ;MORE LEFT, GET ONE AND RETURN TLO F,FL.UPA ;GET EXACTLY ONE CHARACTER FOR THE REFILL PUSHJ P,GETCTL ;BUFFER IS EMPTY, REFILL IT JRST GETCTL ;AND THROW AWAY ANOTHER CHAR TO KEEP COUNT RIGHT GETCT1: IFN FTUUOS,,< SKIPGE .JCUSI(R) ;END OF FILE HIT YET JRST CLOSJB ;YES, TIME TO CLOSE OUT THIS JOB SETZM .JCTLB(R) ;BEGIN TO CLEAR BUFFERS HRLI A,.JCTLB(R) ;SET UP BLT HRRI A,.JCTLB+1(R) BLT A,.JCTLB+-1(R) >> TRZE F,FR.FSI ;FORCE A USETI? TLOA R,RL.UST ;SET IT IS NEEDED TLZ R,RL.UST ;CLEAR FLAG PUSHJ P,CHNCTL ;CONNENT TO CTL CHANNEL PUSHJ P,FNDCTL ;NEW CHANNEL ASSIGNMENT, FIND THE FILE SKIPN A,.JCUSI(R) ;GOT A COUNT HRREI A,<1-CTLBFR> ;SET UP FOR FIRST INPUT ADDI A,CTLBFR ;FIRST BLOCK TO READ THIS TIME MOVEM A,.JCUSI(R) ;SAVE TLNE R,RL.UST ;NEED THE USETI PUSHJ P,POSCTL ;YES, POSITION THE FILE MOVE A,[POINT 7,.JCTLB(R)] MOVEM A,.JCPTR(R) ;SET NEW BYTE POINTER MOVEI A,CTLCHR ;AND COUNT MOVEM A,.JCCNT(R) IFN FTJSYS, ;RESUME READING IFN FTUUOS,< HRLI A,- HRRI A,.JCTLB-1(R) ;BUILD IOWD FOR INPUT SETZ B, PUSHJ P,CHANIO ;READ THE FILE IN 0,A SKIPA ;NORMAL RETURN JRST GETCT3 ;SOME SORT OF I/O ERROR JUMPN IO1,GETCTL ;IF NOT CHANNEL 0, RESUME READING PUSHJ P,RELCHN ;RELEASE CHANNEL 0 JRST GETCTL ;RESUME ;HERE IF IN UUO GAVE AN ERROR RETURN GETCT3: PUSHJ P,CHANIO ;FIND THE ERROR TYPE GETSTS 0,A TRNE A,740000 ;ANY ERROR BITS ON JRST CTLIOE ;YES, REPORT ERROR IFG ,< SETOM .JCUSI(R) ;MARK END OF FILE JRST GETCTL ;RESUME FROM THE BUFFER > IFE ,< JRST CLOSJB ;FINISH THE JOB NOW > > ;END OF IFN FTUUOS ;HERE TO CONVERT UPARROWS TO CONTROL CHARACTERS (MAYBE) GETCT4: TLZN F,FL.UPA ;HERE THE SECOND TIME FOR THIS CALL CAIE CH,"^" ;NO, IS THIS AN UPARROW POPJ P, ;RETURN WITH THIS CHARACTER TLO F,FL.UPA ;MARK RECURSIVE CALL PUSHJ P,GETCTL ;GET THE NEXT AFTER THE UPARROW CAIN CH,"^" ;TWO IN A ROW POPJ P, ;YES, RETURN ONLY ONE CAIG CH,172 ;CONVERT TO UPPER CASE CAIGE CH,141 SKIPA ;NOT A LOWER CASE LETTER SUBI CH," " ;MAKE UPPER CASE OUT OF IT CAIG CH,137 ;NOW SEE IF THIS CHAR CAN BE A CONTROL CHAR CAIGE CH,"A" JRST GETCT5 ;NO, MUST BACK SOME STUFF UP SUBI CH,100 ;MAKE A CONTROL CHARACTER POPJ P, ;RETURN WITH IT GETCT5: PUSHJ P,DECRBP ;BACK UP OVER THE OTHER CHARACTER MOVEI CH,"^" ;GET THE ORIGINAL UPARROW POPJ P, ;AND RETURN WITH IT ;SUBROUTINE TO POSITION THE CTL FILE TO THE CONTENTS OF .JCUSI ;CALLED WITH IO1 CONTAINING THE CTL FILE CHANNEL (FOR CHANIO) IFN FTUUOS,< POSCTL: PUSHJ P,CHANIO ;EXECUTE THE FOLLOWING USETI 0,@.JCUSI(R) ;POSITION THE FILE POPJ P, ;AND RETURN > ;END OF IFN FTUUOS IFN FTJSYS,< POSCTL: DMOVEM T1,C ;SAVE T1 AND T2 IN C AND D MOVE T1,.JCUSI(R) ;GET THE BLOCK NUMBER SOS T1 ;FOR MOD 4 ARITHMETIC IDIVI T1,CTLBFR ;CONVERT TO FILE PAGE NUMBER CAML T1,.JCPSZ(R) ;OFF THE END OF THE FILE JRST CLOSJB ;YES, END OF THE JOB HRL T1,.JCJFN(R) ;RH = PAGE NUMBER, LH = JFN MOVEI T2,.JCTLB(R) ;BUFFERS LSH T2,-^D9 ;CONVERT TO PAGE NUMBER HRLI T2,.FHSLF ;THIS FORK MOVX A,PM%RD ;A = T2 + 1, READ ACCESS PMAP ;MAP THE PAGE DMOVE T1,C ;RESTORE T1 AND T2 POPJ P, ;AND RETURN > ;END OF IFN FTJSYS ;SUBROUTINE TO PERFORM POST JOB DISPOSAL OF THE CTL FILE CTLDIS: TLNE F,FL.ACC ;HAVE WE EVER CHECKED THE ACCESS RIGHTS JRST CTLD.0 ;NO, LETS DO IT NOW TLNN R,RL.DCT ;USER HAVE PRIVS TO DELETE THE FILE POPJ P, ;NO, DONT EVEN TRY TO DO ANYTHING CTLD.0: LOAD T1,Q.CMOD(R),FP.DEL ;CHECK DELETE BIT JUMPE T1,CPOPJ ;DON'T BOTHER IF NOT DELETE TLO G,GL.UC0 ;USE CHANNEL 0 IF NONE ASSIGNED PUSHJ P,CHNCTL ;SEE IF ASSIGNMENT EXISTS PUSHJ P,FNDCTL ;USE EITHER 0 OR OLD CHANNEL ASSIGNMENT TLZN R,RL.DCT ;IN CASE THIS CALL DID THE CHKACC JRST RELREL ;NO PRIVS, GET OUT NOW IFN FTUUOS,< SETZB A,B ;CLEAR THE NAME SETZB C,D ;REALLY DELETE IT PUSHJ P,CHANIO ;EXECUTE THE IO SELECT RENAME 0,A ;DELETE THE FILE JFCL ;NICE TRY JRST RELREL ;RELEASE CHANNEL AND ASSIGNMENT AND RETURN > ;END OF IFN FTUUOS IFN FTJSYS,< PUSH P,.JCJFN(R) ;SAVE THE JFN MOVX T1,DF%NRJ ;"DON'T RELEASE JFN" BIT IORM T1,.JCJFN(R) ;FOR CLOSE PUSHJ P,REMCTL ;REMOVE THE CONTROL FILE POP P,T1 ;GET THE ORIGINAL JFN IN T1 TXO T1,DF%EXP ;REALLY DELETE IT DELF ;DELETE THE FILE JFCL ;IGNORE FAILURES POPJ P, ;AND RETURN > ;END OF IFN FTJSYS ;HERE TO REMOVE ANY OLD CTL FILE ASSIGNMENTS AT DISMISSAL OF THE JOB IFN FTUUOS,< REMCTL: TLO G,GL.UC0 ;WANT CHANNEL 0 IF NONE PUSHJ P,CHNCTL ;GET A CTL FILE ASSIGNMENT POPJ P, ;WAS NONE, RETURN JRST RELREL ;RETURN THE CHANNEL AND ASSIGNMENT, THE RETURN > ;END OF IFN FTUUOS IFN FTJSYS,< REMCTL: SKIPE T1,.JLJFN(R) ;GET ANY LOG FILE JFN HANGING AROUND CLOSF ;CLOSE IT IF THERE IS ONE JFCL ;IGNORE FAILURES MOVE T1,.JCJFN(R) ;GET THE FILE JFN JUMPE T1,CPOPJ ;RETURN IF NONE THERE SETO T1, ;INDICATE PMAPing THE PAGE AWAY MOVEI T2,.JCTLB(R) ;THE PAGE FOR THE CTL BUFFERS LSH T2,-^D9 ;CONVERT TO A PAGE NUMBER HRLI T2,.FHSLF ;FROM MY ADDRESSING SPACE SETZ A, ;A = T2 + 1, NO FLAGS PMAP ;GOOD-BYE PAGE MOVE T1,.JCJFN(R) ;GET THE JFN AGAIN CLOSF ;CLOSE THE FILE JFCL ;IGNORE THE ERROR SETZM .JCJFN(R) ;CLEAR THE JFN POPJ P, ;AND RETURN > ;END OF IFN FTJSYS ;ROUTINES TO SAVE THE CURRENT CTL FILE POSITION OR REPOSITION IT ;BOTH ARE CALLED BY JSP T1,ROUTINE ; 0(P) = .JCUSI(R) ; 1(P) = .JCPTR(R) ; 2(P) = .JCCNT(R) SAVPOS: SKIPN .JCUSI(R) ;HAS THE FILE BEEN STARTED YET JRST [PUSH P,T1 ;SAVE RETURN TLO F,FL.UPA ;GET EXACTLY ONE CHARACTER PUSHJ P,GETCTL ;GET THE FIRST CHARACTER (FILL THE BUFFERS) PUSHJ P,DECRBP ;BACK UP THE POINTERS BEFORE SAVING THEM POP P,T1 ;RESTORE RETURN JRST .+1] ;AND RETURN TO INLINE CODE PUSH P,.JCCNT(R) ;SAVE THE COUNT PUSH P,.JCPTR(R) ;AND THE BYTE POINTER PUSH P,.JCUSI(R) ;AND THE USETI WORD JRST (T1) ;RETURN REPOSI: POP P,CH ;RESTORE .JCUSI(R) CAMN CH,.JCUSI(R) ;IS THE BLOCK WE WANT IN CORE JRST REPO.1 ;YES, JUST RESTORE SUBI CH,CTLBFR ;ADJUST FOR ADD TO BE DONE BY GETCTL JUMPGE CH,.+2 ;BACK UP TOO FAR SETZ CH, ;YES, GET A ZERO MOVEM CH,.JCUSI(R) ;STORE TRO F,FR.FSI ;FORCE A USETI TO BE DONE PUSHJ P,GETCT1 ;GET A RANDOM CHARACTER BUT REFILL WITH PROPER BUFFER REPO.1: POP P,.JCPTR(R) ;RESTORE THE BYTE POINTER POP P,.JCCNT(R) ;AND THE COUNT JRST (T1) ;RETURN ;ROUTINE TO BACK UP THE CTL FILE POINTERS TO GET THE LAST CHARACTER OVER AGAIN ;ONLY BACKS UP THE POSITION FIELD OF THE BYTE POINTER AND CANNOT REALLY ;GO BACK OVER MORE THAN 1 CHARACTER DECRBP: AOS .JCCNT(R) ;ADJUST THE COUNT LDB CH,[POINT 6,.JCPTR(R),5] ;GET THE REMAINING BITS MOVEI CH,7(CH) ;ADJUST FOR THE CHARACTER DPB CH,[POINT 6,.JCPTR(R),5] ;STORE NEW POSITION POPJ P, ;ROUTINE TO OPEN CHANNEL AND LOOKUP CTL FILE IFN FTUUOS,< FNDCTL: MOVE A,[400000,,17] ;PHYSICAL ONLY,,DUMP MODE MOVE B,Q.CSTR(R) ;STRUCTURE FOR CTL FILE SETZ C, ;NO BUFFERS FOR DUMP MODE PUSHJ P,CHANIO OPEN 0,A ;OPEN THE CORRECT CHANNEL JRST CTLOER ;CTL FILE OPEN ERROR PUSHJ P,CTLSPC ;GET THE 4 WORD LOOKUP BLOCK PUSHJ P,CHANIO ;LOOKUP ON CORRECT CHANNEL LOOKUP 0,A JRST CTLLKE ;CTL FILE LOOKUP ERROR SKIPE .JCUSI(R) ;FIRST CALL FOR NEW LOOKUP TLO R,RL.UST ;NO, MARK USETI NEEDED TLZN F,FL.ACC ;NEED TO CHECK READ ACCESS POPJ P, ;NO, RETURN FOR NORMAL READING ;HERE TO CHECK USERS READ PRIVLEGES. ALSO NOTE WHETHER PRIVLEGES TO DELETE ;THE CTL FILE EXIST. FILE IS ALREADY LOOKED UP AND AC'S A-D ARE THE RETURNED ACS LOAD B,Q.SEQ(R),EQ.PRV ;GET PRIVS OF CREATOR AT CREATION OF REQUEST JUMPN B,CTLP.1 ;IF WHEELED, OPERATOR, ALLOW EVERYTHING LDB B,[POINT 9,C,8] ;GET THE FILE PROTECTION MOVE C,Q.CDIR(R) ;OWNER OF THE FILE MOVE D,Q.PPN(R) ;REQUESTOR CAMN C,D ;ARE THEY THE SAME PPN JRST CTLP.1 ;YES, DON'T NEED THE CHKACC HRLI B,.ACRED ;CHECK FOR READ ACCESS MOVEI A,B ;POINT TO THE ARGUMENT BLOCK CHKACC A, ;ASK THE FILE SYSTEM POPJ P, ;IF NO CHKACC, ASSUME READ BUT NO DELETE JUMPL A,[MOVEI B,2 ;NO READ ACCESS, FUDGE ERROR CODE 2 JRST CTLLKE] ;PRETEND IT WAS A LOOKUP ERROR MOVEI A,B ;RESET ARGUMENT POINTER HRLI B,.ACREN ;SEE IF CAN DELETE AT END OF JOB CHKACC A, ;ASK THE FILE SYSTEM AGAIN POPJ P, ;ASSUME NO JUMPL A,CPOPJ ;REALLY NO CTLP.1: TLO R,RL.DCT ;NOTE DELETE PRIVS POPJ P, ;RETURN TO READING LOOP > ;END OF IFN FTUUOS ;;;THE TOPS20 VERSION OF THIS ROUTINE IS ON THE NEXT PAGE IFN FTJSYS,< FNDCTL: DMOVEM T1,C ;SAVE T1 & T2 IN C & D MOVX T1, ;SHORT CALL, OLD FILE ONLY HRROI T2,Q.CSTR(R) ;FILE DESCRIPTOR GTJFN ;GET THE FILE JRST FNDC.E ;ERROR GETTING THE FILE MOVEM T1,.JCJFN(R) ;SAVE THE JFN ACQUIRED TLZN F,FL.ACC ;NEED TO CHECK READ ACCESS JRST CTLP.2 ;NO, AVOID THE ACCESS CHECKS LOAD B,Q.SEQ(R),EQ.PRV ;GET CALLERS PRIVS AT CREATE TIME JUMPN B,CTLP.1 ;IF WHEELED, OPERATOR, ALLOW ANYTHING MOVEM T1,TEMP3+.CKAUD ;STORE JFN MOVX T1,.CKARD ;ACCESS TYPE READ MOVEM T1,TEMP3+.CKAAC ;AS ACCESS WANTED HRROI T1,Q.USNM(R) ;POINT TO USER ID MOVEM T1,TEMP3+.CKALD ;SAVE AS LOGGED-IN USER HRROI T1,Q.CNDI(R) ;POINT TO CONNECTED DIRECTORY MOVEM T1,TEMP3+.CKACD ;SAVE IT SETZM TEMP3+.CKAEC ;NO ENABLE CAPABILITIES MOVX T1, ;FLAGS,,ARG-LENGTH MOVEI T2,TEMP3 ;WHERE THE ARGS ARE CHKAC ;CHECK FOR READ ACCESS BY THIS USER JRST FNDC.E ;OH WELL!! JUMPE T1,FNDC.N ;JUMP IF NO ACCESS ALLOWED MOVX T1,.CKAWT ;ACCESS WRITE (USE FOR DELETE) MOVEM T1,TEMP3+.CKAAC ;AS REQUESTED ACCESS MOVX T1, ;GIVEN A JFN,,NUMBER OF WORDS MOVEI T2,TEMP3 ;WHERE THE ARGS ARE CHKAC ;CHECK FOR RIGHTS TO DELETE THE FILE SETZ T1, ;PRETEND NO JUMPE T1,CTLP.2 ;JUMP IF CANNOT DELETE THE FILE CTLP.1: TLO R,RL.DCT ;MAY DELETE THE FILE IF REQUESTED CTLP.2: MOVE T1,.JCJFN(R) ;GET THE JFN FOR THE CONTROL FILE MOVX T2, ;READ A 36 BIT BYTE FILE OPENF ;OPEN THE FILE JRST FNDC.E ;ERROR OPENING THE FILE MOVE T1,.JCJFN(R) ;THE JFN AGAIN MOVX T2,<1,,.FBBYV> ;WANT THE FILE SIZE MOVEI A,B ;A = T2 + 1, GET DATA INTO B GTFDB ;GET THE FILE SIZE HRRZM B,.JCPSZ(R) ;SAVE FILE SIZE FOR POSCTL DMOVE T1,C ;RESTORE T1 AND T2 POPJ P, ;AND RETURN FOR NORMAL READING FNDC.N: MOVEI T1,OPNX4 ;ERROR FOR NO READ ACCESS FNDC.E: HRRZ B,T1 ;COPY GTJFN/OPENF ERROR CODE JRST CTLLKE ;SIMULATE A LOOKUP ERROR > ;END OF IFN FTJSYS ;HERE TO PROCESS LOOKUP ERRORS ON THE CTL FILE CTLLKE: TLNE R,RL.KJB ;HERE AFTER KJOB SENT JRST CLOSJB ;YES, GO KILL THE JOB HRRZS B ;ISOLATE THE LOOKUP ERROR CODE PUSH P,B ;SAVE IT FOR NOW MSGLOG [ASCIZ/BTNCFC Cannot find the CTL file. Error code = /] CTLI.1: POP P,T1 ;RESTORE STATUS PUSHJ P,LOGOCT ;OUTPUT THAT AS OCTAL CTLABJ: MOVEI T1,[ASCIZ/BTNJBC Job has been cancelled/] PUSHJ P,LGMSG1 ;ADDITIONAL COMMENT PUSHJ P,LGCLF2 ;END THE LINE ADD A BLANK ONE PUSHJ P,REMCTL ;REMOVE ANY OLD CTL FILE ASSIGNMENTS JRST CLOSJB ;AUTO KJOB THE JOB IFN FTUUOS,< ;HERE TO REPORT I/O ERROR WHILE READING THE CTL FILE ;GETSTS CHN,A WAS DONE PRIOR TO CALL CTLIOE: TLNE R,RL.KJB ;HERE AFTER KJOB SENT JRST CLOSJB ;YES, GO KILL THE JOB PUSH P,A ;SAVE IT FOR NOW MSGLOG [ASCIZ/BTNEWR Error while reading the CTL file. Status = /] JRST CTLI.1 ;OUTPUT ERROR CODE (0(P)) AND CANCEL THE JOB ;HERE TO PROCESS OPEN ERRORS OR ILLEGAL STRUCTURES FOR THE CTL FILE CTLOER: MOVEI T1,[ASCIZ/BTNCOD Cannot OPEN device /] TLNE R,RL.KJB ;HERE AFTER KJOB SENT JRST CLOSJB ;YES, GO KILL THE JOB PUSHJ P,LGEMSG ;OUTPUT THE ERROR SIXLOG Q.CSTR(R) ;INCLUDE STRUCTURE THAT WOULDN'T OPEN PUSHJ P,PUTCOL ;ADD A COLON JRST CTLABJ ;AND CANCEL THIS JOB > ;END OF IFN FTUUOS SUBTTL I/O Handling Routines - The LOG File ;ROUTINE TO OPEN CHANNEL AND GET LOG FILE IN UPDATE MODE IFN FTUUOS,< FNDLOG: MOVE A,IO1 ;GET IO CHANNEL LSH A,-5 ;RIGHT JUSTIFIED IN LH IOR A,[FO.PRV+.FOAPP] ;APPEND AND USE PRIVS MOVEM A,.JLFLB+.FOFNC(R) ;STORE FUNCTION WORD MOVX A, ;DUMP MODE AND PHYS ONLY MOVEM A,.JLFLB+.FOIOS(R) ;STORE IT MOVE A,Q.LSTR(R) ;GET STRUCTURE NAME MOVEM A,.JLFLB+.FODEV(R) ;SAVE IT SETZM .JLFLB+.FOBRH(R) ;NO BUFFER RING HEADERS SETZM .JLFLB+.FONBF(R) ;NO BUFFERS MOVE A,Q.PPN(R) ;GET THE PPN MOVEM A,.JLFLB+.FOPPN(R) ;MAKE THE UUO IN HIS BEHALF MOVEI A,.JLLEB(R) ;LOAD ADDRESS OF LOOKUP BLOCK MOVS B,A ;GET ADR,,0 HRRI B,1(A) ;GET ADR,,ADR+1 SETZM 0(A) ;CLEAR THE FIRST WORD BLT B,.RBSIZ(A) ;CLEAR THE REST MOVEI B,.RBSIZ ;GET BLOCK LENGTH MOVEM B,.RBCNT(A) ;STORE IT MOVE B,Q.LNAM(R) ;GET FILENAME MOVEM B,.RBNAM(A) ;SAVE IT HLLZ B,Q.LEXT(R) ;GET EXTENSION MOVEM B,.RBEXT(A) ;STORE IT AWAY MOVEI D,Q.LDIR(R) ;GET ADDRESS OF PATH PUSHJ P,SETSFD ;SETUP THE SFD MOVEM D,.RBPPN(A) ;AND STORE RIBPPN MOVEM A,.JLFLB+.FOLEB(R) ;STORE ADDRESS OF LOOKUP BLOCK MOVEI B,.JLFLB(R) ;LOAD THE ADDRESS HRLI B,.FOPPN+1 ;AND LOAD THE COUNT FILOP. B, ;ENTER THE LOG!! JRST LOGOER ;FAIL? TLO R,RL.UST ;FORCE POSITIONING MOVE A,.JLLEB+.RBSIZ(R) ;GET FILE SIZE ADDI A,DSKBLK-1 ;ROUND UP IDIVI A,DSKBLK ;AND CONVERT TO BLOCKS AOS A ;INCRMENT TLNN F,FL.LUP ;LOG UP DONE? MOVEM A,.JLUSI(R) ;NO, SET BLOCK NUMBER POPJ P, ;AND RETURN > ;END IFN FTUUOS ;;;THE TOPS20 VERSION OF THIS ROUTINE IS ON THE NEXT PAGE IFN FTJSYS,< FNDLOG: DMOVEM T1,C ;SAVE T1 AND T2 IN C AND D MOVX T1, ;SHORT CALL, OLD FILE ONLY HRROI T2,Q.LSTR(R) ;THE LOG FILE NAME GTJFN ;GET IT JRST FNDL.0 ;FAILED, MUST CREATE ONE MOVEI T2,^D10 ;SET FOR DMPLOG MOVEM T2,.JLUSI(R) ;SEE "DMPL.1" + a couple JRST FNDL.1 ;OK, OPEN IT FNDL.0: MOVX T1, ;SHORT, FOR OUTPUT HRROI T2,Q.LSTR(R) ;THE LOG FILE NAME GTJFN ;TRY THAT JRST FNDL.E ;BIG LOSER FNDL.1: MOVEM T1,.JLJFN(R) ;SAVE LOG FILE JFN TRNN F,FR.FLL ;FIRST LOOK AT THE LOG FILE JRST FNDL.2 ;NO, SKIP THE ACCESS CHECKS HRROI T1,.JLDEV(R) ;POINT TO BLOCK FOR LOG DEVICE MOVE T2,.JLJFN(R) ;GET THE JFN OF THE LOG MOVX A,1B2 ;DEVICE ONLY JFNS ;GET IT MOVE T1,.JLDEV(R) ;GET THE DEVICE NAME CAMN T1,[ASCII /NUL/] ;IS IT NUL? JRST FNDL.2 ;YES, IGNORE ACCESS CHECK LOAD B,Q.SEQ(R),EQ.PRV ;GET CALLERS PRIVS AT CREATE TIME JUMPN B,FNDL.2 ;IF WHEELED, OPERATOR, ALLOW ANYTHING MOVE T1,.JLJFN(R) ;GET THE JFN MOVEM T1,TEMP3+.CKAUD ;STORE JFN MOVX T1,.CKAAP ;ACCESS TYPE APPEND MOVEM T1,TEMP3+.CKAAC ;AS ACCESS WANTED HRROI T1,Q.USNM(R) ;POINT TO USER ID MOVEM T1,TEMP3+.CKALD ;SAVE AS LOGGED-IN USER HRROI T1,Q.CNDI(R) ;POINT TO CONNECTED DIRECTORY MOVEM T1,TEMP3+.CKACD ;SAVE IT SETZM TEMP3+.CKAEC ;NO ENABLE CAPABILITIES MOVX T1, ;FLAGS,,ARG-LENGTH MOVEI T2,TEMP3 ;WHERE THE ARGS ARE CHKAC ;CHECK USERS APPEND ACCESS JRST FNDL.E ;OH WELL!! JUMPE T1,FNDL.N ;JUMP IF NO ACCESS FNDL.2: MOVE T1,.JLJFN(R) ;GET THE LOG FILE JFN AGAIN MOVX T2, ;36 BIT APPEND MODE OPENF ;OPEN THE FILE JRST FNDL.E ;GIVE AN ERROR MESSAGE DMOVE T1,C ;RESTORE T1 AND T2 POPJ P, ;AND RETURN FNDL.N: MOVEI T1,OPNX4 ;ERROR IF NO ACCESS FNDL.E: MOVE B,T1 ;GET THE ERROR CODE IN B MOVEI IO2,[ASCIZ\GTJFN/OPENF failed\] JRST LGLKE1 ;GIVE APPROPRIATE ERROR > ;END OF IFN FTJSYS ;HERE TO REPORT VARIOUS LOG FILE ERRORS TO THE OPERATOR AND THEN CANCEL THE JOB IFN FTUUOS,< LOGOER: MOVEI IO2,[ASCIZ/OPEN failed/] JRST LGLKE1 ;CANCEL THE JOB LOGIOE: PUSHJ P,CHANIO ;GET THE LOG STATUS BITS GETSTS 0,B ;GET INTO B FOR OUTPUT MOVEI IO2,[ASCIZ/OUTPUT failed/] JRST LGLKE1 ;REPORT THE ERROR AND CANCEL THE JOB > ;END OF IFN FTUUOS LGLKE1: MOVEM IO2,TEMP1 ;SAVE ERROR MESSAGE ADDRESS PUSHJ P,TTYALL ;TYPE OUT ALL SUBJOB INFORMATION OUTSTR @TEMP1 ;APPEND THE ERROR MESSAGE OUTSTR [ASCIZ/ for the LOG file. Error code - /] HRRZ T1,B ;GET THE ERROR CODE PUSHJ P,TTYOCT ;OUTPUT IT AS AN OCTAL NUMBER ILLO.2: PUSHJ P,TTCRLF ;END THIS LINE MSGTTY [ASCIZ/Cancelling this job. No output generated./] TLZ R,RL.OPR!RL.DIA ;CLEAR SOME POSSIBLE FLAGS TLZ F,FL.SIL ;CLEAR SILENCE MODE TLO R,RL.NLG ;INDICATE NO LOG FILE OUTPUT (THERE'S NO LOG FILE) PUSHJ P,RELREL ;GET RID OF THE ASSIGNMENT (IO1 HAS THE CHANNEL) PUSHJ P,SNDUPC ;SEND A ^C PUSHJ P,SNDUPC ;SEND ANOTHER ^C FOR GOOD MEASURE PUSHJ P,KJOB.K ;SEND A SIMPLE KJOB STRING TO GET RID OF THE JOB JRST CLOS.1 ;AND DISMISS IT ;SUBROUTINE TO DEPOSIT A CHARACTER INTO THE LOG FILE PUTLOG: CAIL CH,40 ;IS THIS A CONTROL CHARACTER JRST PUTL.0 ;NO, OUTPUT AS IS CAIG CH,CHR.CR ;CODES 011-015 ARE IMAGE OUTPUT ALSO CAIGE CH,CHR.HT ;LINE PRINTERS KNOW ABOUT THOSE SKIPA ;NOT ONE OF THOSE, PRINT ^CHAR JRST PUTL.0 ;OUTPUT THEM AS IMAGE ALSO HRLM CH,(P) ;SAVE THE ORIGINAL MOVEI CH,"^" ;GET AN UPARROW PUSHJ P,PUTL.0 ;OUTPUT IT HLRZ CH,(P) ;GET THE ORIGINAL MOVEI CH,100(CH) ;MAKE THE APPROPRIATE CHARACTER PUSHJ P,PUTL.0 ;AND OUTPUT IT HLRZ CH,(P) ;GET THE ORIGINAL AGAIN FOR THE CALLER POPJ P, ;AND RETURN PUTL.0: TLZN F,FL.CRS ;WAS LAST CHARACTER A CARRIAGE RETURN JRST PUTL.3 ;NO, JUST OUTPUT IT CAIG CH,CHR.FF ;CHECK FOR CR NOT FOLLOWED BY VERTICAL MOTION CAIGE CH,CHR.LF ;SAME CHECK AS BELOW FOR TIME STAMP SKIPA ;NOT VERTICAL MOTION, OUTPUT 2 TABS JRST PUTL.3 ;OUTPUT THE MOTION CHARACTER HRLM CH,(P) ;SAVE THE CHARACTER ON THE STACK PUSHJ P,PUT2TB ;OUTPUT 2 TABS HLRZ CH,(P) ;RESTORE THE CHARACTER AND OUTPUT IT PUTL.3: TLNE R,RL.NLG ;IS THERE A LOG FILE JRST [OUTCHR CH ;NO, GIVE THIS TO THE OPERATOR POPJ P,] ;AND RETURN TLNE R,RL.TIM ;NEED A TIME STAMP PUSHJ P,LOGSTP ;YES, DO IT SOSL .JLCNT(R) ;ROOM IN THIS BUFFER JRST PUTL.4 ;YES, GO STUFF THE CHARACTER PUSHJ P,DMPLOG ;NO, MAKE SOME SOS .JLCNT(R) ;NOW ADJUST FOR THE CHARACTER PUTL.4: CAIN CH,CHR.CR ;IS THIS A CARRAIGE RETURN TLO F,FL.CRS ;YES, MARK IT FOR OVERPRINTING CHECK IDPB CH,.JLPTR(R) ;STORE THE CHARACTER CAIG CH,CHR.FF ;CHECK IF IT WAS VERTICAL PAPER MOTION CAIGE CH,CHR.LF ;THOSE CAUSE A TIME STAMP JRST PUTL.1 ;WAS NOT, SAVE THIS CHAR IN THE OPER LINE TLO R,RL.TIM ;YES, NEXT LINE NEEDS A TIME STAMP SETZM .JOUTC(R) ;SET TO REFILL THE OPERATOR LINE NEXT POPJ P, PUTL.1: TLNE R,RL.IGN ;SKIP SAVING THESE CHARACTERS POPJ P, ;YES, RETURN TO CALLER SOSL .JOUTC(R) ;ANY ROOM LEFT JRST PUTL.2 ;YES, SAVE THIS CHARACTER HRLM CH,(P) ;SAVE CALLERS CH SETZM .JOUTL(R) ;CLEAR THE LINE SO BATOPR CAN OUTSTR IT HRLI CH,.JOUTL(R) ;SET UP FOR THE BLT HRRI CH,.JOUTL+1(R) ;CLEAR THE OLD LINE BUFFER BLT CH,.JOUTL+^D19(R) ;CLEAR THE LINE MOVEI CH,^D98 ;RESET COUNT (ADJUST FOR THE ONE ABOUT TO STORE) MOVEM CH,.JOUTC(R) ;STORE MOVE CH,[POINT 7,.JOUTL(R)] ;REBUILD BYTE POINTER TOO MOVEM CH,.JOUTP(R) ;STORE THAT TOO HLRZ CH,(P) ;NOW GET THE CHARACTER BACK PUTL.2: IDPB CH,.JOUTP(R) ;STORE THE CHARACTER FOR THE OPERATOR POPJ P, ;AND RETURN TO CALLER ;HERE TO DUMP THE CURRENT BUFFERS TO THE LOG FILE DMPLOG: SKIPN .JLUSI(R) ;WAS LOG FILE EVER STARTED JRST DMPL.3 ;NO, START IT NOW (JUST THE BUFFERS) TLZ R,RL.UST ;CLEAR A FLAG PUSHJ P,CHNLOG ;FIND THE CHANNEL ASSIGNED TO THIS LOG FILE PUSHJ P,FNDLOG ;WAS NEW ASSIGNMENT, FIND THE FILE TLNN R,RL.UST ;NEED A USETO JRST DMPL.1 PUSHJ P,CHANIO ;POSITION THE LOG FILE USETO 0,@.JLUSI(R) DMPL.1: TRZN F,FR.FLL ;FIRST TIME WE'VE TOUCHED THE LOG FILE JRST DMPL.4 ;SO, SKIP THIS MESS ; THE FOLLOWING IS IN RESPONSE TO SEVERAL SUGGESTIONS TO SEPARATE THE ; NEW LOG FILE FROM ANY OLD ONE CREATED DURING A PREVIOUS ; INCARNATION OF THIS JOB. NEWJOB STARTS THE LOG WITH A ; (INDIRECTLY WITH IDENT UUO) WHICH COULD GET REPLACED WITH A MOVE A,.JLUSI(R) ;WHAT IS THE CURRENT SIZE OF THE LOG FILE CAIG A,2 ;INITIAL CREATE OR SMALL ONE FROM SPRINT-10 JRST DMPL.4 ;YES, IS ALL THAT IS NEEDED MOVSI A,(BYTE (7)177,177,0) ;MASK FOR 2 ASCII CHARACTERS ANDCAM A,.JLOGB(R) ;CLEAR PAIR MOVSI A,(BYTE (7)0,CHR.FF,0) ;INSERT NULL, FORM FEED INSTEAD IORM A,.JLOGB(R) ;TO SEPARATE OLD FROM NEW RUN OF SAME JOB DMPL.4: PUSHJ P,DMPOUT ;OUTPUT THE BUFFERS ; IF CALLED BY CLSLOG, THERE IS MORE ROOM IN THE BUFFERS ; SO DON'T UPDATE THE INTERNAL BUFFER POINTERS AND COUNTS DMPL.2: SKIPL .JLCNT(R) ;IS THERE STILL SOME ROOM POPJ P, ;YES, RETURN TO CLSLOG TLZ F,FL.LUP ;CLEAR ANY PENDING UPDATES MOVE A,.JLUSI(R) ;GET THE BLOCK ADDI A,LOGBFR ;ADJUST FOR NEXT TIME MOVEM A,.JLUSI(R) MOVE A,[POINT 7,.JLOGB(R)] MOVEM A,.JLPTR(R) ;SET NEW BYTE POINTER MOVEI A,LOGCHR ;FULL BUFFER SIZE MOVEM A,.JLCNT(R) ;AS COUNT SETZM .JLOGB(R) ;CLEAR THE BUFFERS HRLI A,.JLOGB(R) HRRI A,.JLOGB+1(R) BLT A,.JLOGB+-1(R) ;CLEAR ALL THE BUFFERS POPJ P, ;RETURN TO STORE THE NEW CHARACTER DMPL.3: HRREI A,<1-LOGBFR> ;FAKE BLOCK 1 MOVEM A,.JLUSI(R) JRST DMPL.2 ;SET UP INITIAL BUFFERS ;SUBROUTINE TO OUTPUT THE INTERNAL LOG FILE BUFFERS IFN FTUUOS,< DMPOUT: IFG ,< ;AVOID EXTRA BLOCKS IF MORE THAN 1 BUFFER MOVEI A,LOGCHR ;LARGEST COUNT SUB A,.JLCNT(R) ;COMPUTE CHARACTERS STORED ADDI A,^D4 ;COMPUTE MODULO 5 IDIVI A,^D5 ;CONVERT TO WORDS MOVNS A ;GET - COUNT HRLS A ;WANT COUNT IN LEFT HALF SKIPGE .JLCNT(R) ;AS WITH ALL GOOD COUNTERS, ARE WE OFF BE A FEW > HRLI A,- ;YES, GET COUNT FOR FULL BUFFERS HRRI A,.JLOGB-1(R) SETZ B, PUSHJ P,CHANIO ;OUTPUT THE CURRENT BUFFER OUT 0,A SKIPA ;NORMAL RETURN JRST LOGIOE ;LOG FILE I/O ERROR JUMPN IO1,CPOPJ ;PROCEED IF NOT CHANNEL 0 JRST RELCHN ;RELEASE THE TEMP CHANNEL AND RETURN > ;END OF IFN FTUUOS IFN FTJSYS,< DMPOUT: DMOVEM T1,C ;SAVE T1 AND T2 IN C AND D MOVEI A,LOGCHR ;LARGEST COUNT SUB A,.JLCNT(R) ;COMPUTE CHARACTERS STORED JUMPE A,DMPO.0 ;RARE, BUT COULD HAPPEN ADDI A,^D4 ;COMPUTE MODULO 5 IDIVI A,^D5 ;CONVERT TO WORDS MOVNS A ;GET - COUNT SKIPGE .JLCNT(R) ;AS WITH ALL GOOD COUNTERS, ARE WE OFF BE A FEW HRROI A,- ;YES, GET COUNT FOR FULL BUFFERS MOVE T1,.JLJFN(R) ;THE LOG FILE JFN MOVSI T2,(POINT 36,0) ;36 BIT BYTES HRRI T2,.JLOGB(R) ;WHERE THEY ARE, A = T2 + 1, -WORD COUNT SOUT ;APPEND TO THE FILE SKIPGE .JLCNT(R) ;BUFFERS FILLED OR WAS IT CLSLOG JRST DMPO.1 ;FILLED, LEAVE THE FILE OPENED DMPO.0: SETZ T1, ;GET A ZERO EXCH T1,.JLJFN(R) ;GET JFN, INDICATE CLOSED CLOSF ;CLOSE THE FILE JFCL ;IGNORE FAILURES SETOM .JLCNT(R) ;RE-PRIME THE BUFFERS DMPO.1: DMOVE T1,C ;RESTORE T1 AND T2 POPJ P, ;AND RETURN > ;END OF IFN FTJSYS SUBTTL I/O Handling Routines - Random PTY and LOG File things ;SUBROUTINES TO DO INPUT/OUTPUT FROM/TO THE PTY/LOG ;THESE ROUTINES TEND TO BE VERY SMALL AND SPECIALIZED ;A SINGLE CHARACTER MUST PASS THROUGH MANY ROUTINES TO FINALLY ;GET TO/FROM THE JOB AND ECHO'ED TO THE LOG FILE ;SUBROUTINE TO INPUT A BUFFER FROM THE PTY INPPTY: HLLZ IO1,.JPCHN(R) ;GET THE PTY CHANNEL NUMBER PUSHJ P,CHANIO INPUT 0,0 ;INPUT A BUFFER POPJ P, ;SUBROUTINE TO OUTPUT A BUFFER TO THE JOB SNDUPC: MOVEI CH,CHR.CC ;SET A ^C PUSHJ P,PUTPTY ;SEND THE ^C AND FALL INTO FORCE THE BUFFER PTYSND: HLLZ IO1,.JPCHN(R) ;GET THE CHANNEL NUMBER PUSHJ P,CHANIO OUTPUT 0,0 ;OUTPUT IT POPJ P, ;SUBROUTINE TO GET A SINGLE CHARACTER FROM THE PTY INPUT BUFFER GETPTY: SOSGE .JPINP+2(R) ;IS THERE A CHARACTER POPJ P, ;NO, GIVE NON SKIP RETURN ILDB CH,.JPINP+1(R) ;GET THE NEXT JUMPN CH,CPOPJ1 ;NOT A NULL, GIVE GOOD RETURN JRST GETPTY ;IGNORE NULLS ;SUROUTINE TO PUT A SINGLE CHARACTER INTO THE OUTPUT PTY BUFFER PUTPTY: SOSGE .JPOUT+2(R) ;IS BUFFER FULL JRST PUTP.1 ;YES, SEND THE BUFFER IDPB CH,.JPOUT+1(R) ;STORE IT POPJ P, PUTP.1: PUSHJ P,PTYSND ;SEND THIS BUFFER TO THE JOB TLO R,RL.EOL ;FAKE AN EOL SENT SO ANY ERRORS CAN BE FOUND PUSH P,CH ;SAVE THE CHARACTER I WANT TO SEND PUSH P,T1 ;SAVE OTHER REGS ALSO PUSH P,T2 ;... PUSHJ P,IOWAIT ;AND WAIT UNTIL THE JOB WANT'S MORE INPUT TLNE R,RL.TIM ;IS THERE A TIME STAMP NEEDED TLNE F,FL.SIL ;YES, BUT ARE WE SILENCED SKIPA ;DON'T OUTPUT A TIME STAMP PUSHJ P,LOGSTP ;OUTPUT ONE BEFORE RESTORING T1 AND T2 TLZ R,RL.EOL ;CLEAR THE FLAG JUST IN CASE IT'S LEFT ON POP P,T2 ;RESTORE POP P,T1 ;... POP P,CH ;RESTORE THE CHARACTER TO SEND JRST PUTPTY ;NOW STORE IT INTO THE BUFFER ;SUBROUTINE TO SEND A STRING POINTED TO BY 'T1' TO THE JOB UUOSND: HRR T1,.JBUUO## ;ENTER HERE IF FROM UUO CALL SNDSTR: HRLI T1,(POINT 7,0) ;MAKE A BYTE POINTER OUT OF IT ILDB CH,T1 ;GET ONE JUMPE CH,CPOPJ ;IS AN ASCIZ STRING PUSHJ P,SNDCHR ;SEND IT AND ECHO JRST SNDSTR+1 ;LOOP ON THE STRING ;SUBROUTINE TO SEND - AND FORCE OUT THE BUFFER SNDCLF: MOVEI CH,CHR.CR ;A CARRIAGE RETURN PUSHJ P,SNDCHR ;SEND THE CHARACTER MOVEI CH,CHR.LF ;A LINE FEED PUSHJ P,SNDCHR ;SEND IT TOO JRST PTYSND ;SEND THE BUFFER AND RETURN ;SUBROUTINE TO SEND 'T1' AS A DECIMAL NUMBER TO THE JOB SNDDEC: IDIVI T1,^D10 ;STANDARD BINARY TO DECIMAL CONVERSION HRLM T2,(P) ;SAVE A WORD ON THE PDL JUMPE T1,.+2 ;ALL DONE? PUSHJ P,SNDDEC ;NO, KEEP GOING HLRZ CH,(P) ;RETRIEVE CHARACTER SNDBIN: MOVEI CH,"0"(CH) ;MAKE ASCII SNDCHR: PUSHJ P,PUTPTY ;PUT INTO THE OUTPUT BUFFER CAIN CH,CHR.LF ;WAS THAT THE LINE FEED I SENT TLO R,RL.EOL ;YES, SET A FLAG FOR ERROR CHECKING TLNE F,FL.SIL ;IS THE LINE TO BE SILENCED POPJ P, ;YES, EXIT NOW JRST PUTLOG ;ECHO IN THE LOG FILE ;SUBROUTINE TO SEND 'T1' AS AN OCTAL NUMBER TO THE JOB SNDOCT: LSHC T1,-^D3 ;BREAK IT APART HLLM T2,(P) ;PUT IT ON THE STACK JUMPE T1,.+2 PUSHJ P,SNDOCT ;DO THE REST HLRZ CH,(P) ;GET THE CHARACTER LSH CH,-^D15 ;POISTION IT JRST SNDBIN ;MAKE ASCII AND SEND IT ;SUBROUTINE TO SEND SIXBIT AC T1 TO THE JOB UUOSN6: MOVE T1,@.JBUUO## ;ENTER HERE IF FROM UUO CALL SNDSIX: MOVE T2,[POINT 6,T1] ;POINT TO THE TEXT ILDB CH,T2 ;GET A CHARACTER JUMPE CH,CPOPJ ;STOP ON A NULL MOVEI CH," "(CH) ;MAKE ASCII PUSHJ P,SNDCHR ;SEND THE CHARACTER TLNN T2,770000 ;GET ALL SIX YET POPJ P, ;YES, RETURN JRST SNDSIX+1 ;LOOP FOR ALL CHARACTERS ;LITTLE ROUTINES TO SEND SINGLE CHARACTERS TO THE JOB SNDCMA: SKIPA CH,[","] ;A COMMA SNDCOL: MOVEI CH,":" ;A COLON JRST SNDCHR ;SEND IT ;ROUTINE TO PUT A TIME STAMP ON THE LINE OF OUTPUT LOGTIM: MOVE T1,CURMST ;GET CURRENT TIME SKIPN .JUPLT(R) ;NEED TO RE-START THE TIMER MOVEM T1,.JUPLT(R) ;YES, MARK TIME OF CHANGE TLZ R,RL.TIM ;CLEAR THE NEEDED FLAG TLO R,RL.IGN ;DON'T SAVE THE TIME STAMP FOR THE OPERATOR LOGTI1: IDIVI T1,^D60000 ;BREAK INTO COMPONENTS PUSH P,T2 IDIVI T1,^D60 ;HOURS IN T1, MINUTES IN T2 PUSH P,T2 ;SAVE MINUTES PUSHJ P,LGDEC2 ;DECIMAL TO LOG FILE (MIN. 2 CHARS) PUSHJ P,PUTCOL ;OUTPUT A COLON POP P,T1 ;RESTORE SECONDS PUSHJ P,LGDEC2 ;OUTPUT IT TOO PUSHJ P,PUTCOL ;ANOTHER COLON POP P,T1 ;RESTORE MILLISECONDS IDIVI T1,^D1000 PUSHJ P,LGDEC2 ;OUTPUT IN 2 DIGITS TLZ R,RL.IGN ;RESUME SAVING FOR THE OPERATOR POPJ P, ;LET HIM (HER) SEE THE LINE IDENTIFIER ;SUBROUTINE TO OUTPUT T1 AS A DECIMAL NUMBER ONTO THE LOG FILE ;ENTER AT LGDEC2 IF 2 CHARACTERS MINIMUM. WILL SUPPLY A LEADING ZERO LGDEC2: MOVEI CH,"0" ;DO WE NEED A LEADING ZERO CAIG T1,^D9 PUSHJ P,PUTLOG ;YES, SEND LEADING ZERO LOGDEC: IDIVI T1,^D10 ;ANOTHER BINARY TO DECIMAL ROUTINE HRLM T2,(P) JUMPE T1,.+2 ;ALL DONE PUSHJ P,LOGDEC ;GET THE WHOLE NUMBER HLRZ CH,(P) ;RESTORE THE BINARY VALUE LOGBIN: MOVEI CH,"0"(CH) ;TO ASCII JRST PUTLOG ;DEPOSIT INTO THE LOG FILE ;SUBROUTINE TO SEND AN ASCIZ STRING TO THE LOG FILE UUOIDN: TLNN R,RL.TIM ;NEED TO END THE PREVIOUS LINE PUSHJ P,LOGCLF ;YES, DO SO PUSHJ P,LOGTIM ;ADD A TIME STAMP AND FALL INTO UUOTXT UUOTXT: HRR T1,.JBUUO## ;ENTER HERE IF FROM UUO CALL LOGSTR: HRLI T1,(POINT 7,0) ;MAKE A BYTE POINTER ILDB CH,T1 JUMPE CH,CPOPJ ;IS AN ASCIZ STRING PUSHJ P,PUTLOG ;DEPOSIT THIS CHARACTER JRST LOGSTR+1 ;COPY THE WHOLE STRING ;SUBROUTINE TO PUT A CARRIAGE RETURN - LINE FEED ON THE LOG FILE LOGBLK: TLNN R,RL.TIM ;NEED TO END THE PREVIOUS LINE LGCLF2: PUSHJ P,LOGCLF ;OUTPUT A CR-LF TLZ R,RL.TIM ;CLEAR FLAG TO ADD ANOTHER ONE LOGCLF: MOVEI CH,CHR.CR ;THE CARRIAGE RETURN PUSHJ P,PUTLOG ;OUTPUT IT MOVEI CH,CHR.LF ;AND THE LINE FEED JRST PUTLOG ;AND EXIT THROUGH PUTLOG ;SUBROUTINE TO SEND T1 AS AN OCTAL NUMBER TO THE LOG FILE LOGOCT: LSHC T1,-^D3 ;SAME AS SNDOCT FOR PTY HLLM T2,(P) JUMPE T1,.+2 ;GET IT ALL YET PUSHJ P,LOGOCT ;NO, CONTINUE FOR ALL DIGITS HLRZ CH,(P) ;RESTORE CHARACTER LSH CH,-^D15 ;POSITION DIGIT JRST LOGBIN ;CONVERT TO ASCII AND RETURN ;SUBROUTINE TO SEND SIXBIT IN AC T1 TO THE LOG FILE UUOSIX: MOVE T1,@.JBUUO## ;ENTER HERE IF FROM UUO CALL LOGSIX: MOVE T2,[POINT 6,T1] ;GET A BYTE POINTER ILDB CH,T2 ;GET A CHARACTER JUMPE CH,CPOPJ ;PUT ALL SIX OR STOP ON A BLANK MOVEI CH," "(CH) ;MAKE ASCII PUSHJ P,PUTLOG ;OUTPUT IT TLNN T2,770000 ;GOT IT ALL POPJ P, ;YES, RETURN JRST LOGSIX+1 ;GET THE NEXT ;LITTLE ROUTINES TO OUTPUT SINGLE CHARACTERS PUTCMA: SKIPA CH,[","] ;A COMMA PUTCOL: MOVEI CH,":" ;A COLON JRST PUTLOG ;SEND THE CHARACTER ;SUBROUTINE TO PREPARE FOR A COMMENT LINE LGCMNT: TLNN R,RL.TIM ;NEED TO END THE PREVIOUS LINE PUSHJ P,LOGCLF ;YES, DO IT TLZ R,RL.TIM ;NO TIME STAMP NEEDED PUT2TB: PUSHJ P,PUTTAB ;OUTPUT A TAB PUTTAB: SKIPA CH,[CHR.HT] ;AND ANOTHER ONE PUTPER: MOVEI CH,MONCHR ;A PERIOD (OR SOMETHING LIKE THAT) JRST PUTLOG ;SUBROUTINE TO CLOSE OUT THE LOG FILE CLSLOG: TLO G,GL.UC0 ;USE 0 IF NONE, WE ARE GOING TO CLOSE IT ANYWAY PUSHJ P,DMPLOG ;OUTPUT THE PARTIAL BUFFER SETZM .JUPLT(R) ;CLEAR UPDATE TIMER REQUEST TLO F,FL.LUP ;SET LOG FILE HAS BEEN UPDATED JUMPE IO1,CPOPJ ;DONE IF THE LOG FILE ON A TEMP CHANNEL PUSHJ P,RELCHN ;NO, CLOSE AND RELEASE THE FILE JRST RELASS ;NOW RELEASE THE ASSIGNMENT ;SUBROUTINE TO TIME STAMP THE LOG FILE AND IDENTIFY USER OR MONITOR OUTPUT LOGSTP: PUSH P,CH ;SAVE NEXT CHARACTER TO STORE PUSHJ P,LOGTIM ;PUT TIME STAMP IN LOG FILE MOVEI T1,[ASCIZ/ MONTR /] TLNN J,JL.UML ;WAS JOB AT MONITOR LEVEL MOVEI T1,[ASCIZ/ USER /] ;NO, SAY USER MODE PUSHJ P,LOGSTR ;SEND STRING TO LOG FILE POP P,CH ;RESTORE CHARACTER POPJ P, ;NOW OUTPUT IT ;SUBROUTINE TO OUTPUT AN ERROR MESSAGE TO THE LOG FILE UUOMLG: HRR T1,.JBUUO## ;ENTER HERE IF FROM UUO CALL LGEMSG: PUSHJ P,LOGBLK ;ISOLATE THE ERROR MESSAGE LGMSG1: PUSHJ P,LGCMNT ;PREPARE A COMMENT LINE MOVEI CH,"?" ;OUTPUT A QUESTION MARK PUSHJ P,PUTLOG ;OUTPUT IT MOVEI CH," " ;AND A SPACE PUSHJ P,PUTLOG JRST LOGSTR ;OUTPUT STRING AND RETURN ;SUBROUTINE TO OUTPUT A FILE SPECIFICATION TO THE LOG FILE ;ENTER WITH AC'S A-D THE 4 WORD LOOKUP/ENTER BLOCK ; T1 = ADDRESS OF THE STRUCTURE ; T2 = ADDRESS OF A STRING TO APPEND AFTER 'BAFIL' IFN FTUUOS,< LOGFIL: PUSH P,D ;SAVE PPN PUSH P,B ;EXTENSION PUSH P,A ;FILE NAME PUSH P,T1 ;STRUCTURE PUSH P,T2 ;MESSAGE IDENT [ASCIZ/ BAFIL /] ;IDENTIFY LINE POP P,T1 ;GET MESSAGE PUSHJ P,LOGSTR ;SEND IT ALSO POP P,T1 ;RESTORE STRUCTURE ADDRESS LOGF.3: SIXLOG 0(T1) ;SEND IT AS SIXBIT PUSHJ P,PUTCOL ;ADD A COLON POP P,T1 ;GET FILE NAME PUSHJ P,LOGSIX ;IS SIXBIT ALSO PUSHJ P,PUTPER ;ADD A PERIOD POP P,T1 ;GET EXTENSION PUSHJ P,LOGSIX ;SIXBIT AGAIN MOVEI CH,"[" ;BEGINNING OF PPN PUSHJ P,PUTLOG EXCH J,(P) ;GET PPN OR POINTER, SAVE J TLNE J,-1 ;IS IT A PPN JRST LOGF.1 ;JUST OUTPUT THE PPN MOVE T1,2(J) ;GET THE REAL PPN PUSHJ P,LOGF.2 ;OUTPUT THAT PART LOGF.0: MOVE T1,3(J) ;GET NEXT SFD SPECIFICATION JUMPE T1,LOGF.E ;END OF THE FILE SPEC PUSHJ P,PUTCMA ;OUTPUT A COMMA PUSHJ P,LOGSIX ;AND ADD THE SFD NAME AOJA J,LOGF.0 ;CONTINUE FOR ALL LEVELS LOGF.E: POP P,J ;RESTORE J MOVEI CH,"]" ;GET CLOSURE OF PPN JRST PUTLOG ;OUTPUT THAT AND RETURN TO CALLER LOGF.1: MOVE T1,J ;COPY THE PPN TO T1 PUSHJ P,LOGF.2 ;OUTPUT IT JRST LOGF.E ;CLEAN UP AND RETURN LOGF.2: HRLM T1,(P) ;SAVE PROGRAMMER NUMBER HLRZS T1 ;POSITION PROJECT NUMBER PUSHJ P,LOGOCT ;OUTPUT AN OCTAL NUMBER PUSHJ P,PUTCMA ;ADD A COMMA HLRZ T1,(P) ;RETREIVE PROGRAMMER NUMBER JRST LOGOCT ;OUTPUT THAT AND RETURN > ;END OF IFN FTUUOS ;;;TOPS20 COUNTERPART OF THIS ROUTINE IS ON THE NEXT PAGE ;SUBROUTINE TO OUTPUT A FILE SPECIFICATION TO THE LOG FILE ; T1 = THE ADDRESS OF THE FILE STRING ; T2 = ADDRESS OF A STRING TO APPEND AFTER 'BAFIL' IFN FTJSYS,< LOGFIL: PUSH P,T1 ;STRING ADDRESS PUSH P,T2 ;MESSAGE IDENT [ASCIZ/ BAFIL /] ;IDENTIFY LINE POP P,T1 ;GET MESSAGE PUSHJ P,LOGSTR ;SEND IT ALSO POP P,T1 ;RESTORE FILE SPEC ADDRESS JRST LOGSTR ;APPEND IT AND RETURN > ;END OF IFN FTJSYS SUBTTL Operator Communications Section OPRCOM: MOVE T1,TTYFLG ; 0 = HAVE AN INTERRUPT SYSTEM, -1 = DON'T EXCH T1,TTYINT ;CLEAR INTERRUPT, GET OLD STATUS JUMPE T1,CPOPJ ;NO INTERRUPT, RETURN SKPINL ;IS THERE INPUT TO READ POPJ P, ;NO, RETURN MOVE T1,[INCHWL CH] ;HOW TO GET A CHARACTER MOVEM T1,COMFIL ;INTO THE FILLER WORD SETZ F, ;CLEAR FLAGS USED BY GETXXX ROUTINES BAOP.2: PUSHJ P,GETONE ;GET THE FIRST CHARACTER OF THE COMMAND JRST COMC.2 ;A TERMINATOR, IGNORE THE LINE JRST [CAIE CH," " ;IGNORE LEADING SPACES JRST COMERR ;WASN'T, IS COMMAND ERROR JRST BAOP.2] ;TRY THE NEXT CHARACTER JRST BAOP.N ;IS IS A NUMBER CAIE CH,"B" ;IT WAS A LETTER, WAS IT MY NAME (FROM OPSER) JRST [TRO F,FR.RSC ;NO, MAYBE A COMMAND, ALREADY HAVE THE LETTER JRST BAOP.C] ;TRY TO FIND IT IN THE COMMAND TABLE PUSHJ P,GETONE ;WHAT'S AFTER THE B JRST COMERR ;STILL CAN'T BE A TERMINATOR JRST BAOP.S ;SPECIAL, CAN BE A DASH OR SPACE JRST BAOP.N ;A SUBJOB NUMBER CAIE CH,"A" ;ANOTHER LETTER, WAS IT AN A JRST COMERR ;NO, COMPLAIN DDALL: TLO G,GL.ALL ;SET THE 'ALL' FLAG TRO F,FR.RSC ;ALREADY HAVE A CH BAOP.3: PUSHJ P,GETONE ;FIND THE DASH OR SPACE AFTER ALL JRST COMERR ;CAN'T BE A TERMINATOR JRST BAOP.S ;A SPECIAL JFCL ;IGNORE NUMBERS JRST BAOP.3 ;KEEP LOOKING BAOP.N: TRO F,FR.RSC ;ALREADY HAVE CH PUSHJ P,GETNUM ;GET THE NUMERIC VALUE JRST ILLNUM ;BAD FORMAT JUMPE T1,ILLSJB ;0 IS AN ILLEGAL NUMBER CAILE T1,JOBMAX ;SO IS ANYTHING OVER JOBMAX JRST ILLSJB MOVEM T1,DEFSJB ;STORE THE DEFAULT SUBJOB NUMBER TLZ G,GL.ALL ;CLEAR THE ALL FLAG BAOP.S: CAIE CH," " ;ONLY VALID TERMINATORS HERE CAIN CH,"-" ;ARE SPACE AND DASH SKIPA ;DELIMITOR IS OK JRST COMERR ;GIVE AN ERROR PUSHJ P,GETONE ;WHAT IS THE NEXT CHAR JRST COMCLR ;A NULL COMMAND SKIPA ;A SPECIAL JRST BAOP.N ;NUMBER, COULD BE B-L-COMMAND TRO F,FR.RSC ;ALREADY HAVE CH, LOOK UP THE COMMAND BAOP.C: PUSHJ P,GETSIX ;GET THE COMMAND JUMPE T1,COMCLR ;A NULL COMMAND, IGNORE IT MOVE A,[-NCMDS,,OPRCMD] ;AOBJN FOR TABLE SEARCH PUSHJ P,TABSRC ;SEARCH FOR THE COMMAND IN T1 JRST COMERR ;BAD COMMAND JRST OPRD.2 ;TELL THE OPERATOR IT IS NOT UNIQUE JRST @DISCMD(C) ;DISPATCH TO THE COMMAND COMERR: MSGTTY [ASCIZ/Unknown BATCON command/] COMCLR: TRO F,FR.RSC ;ALREADY HAVE A CH COMC.1: PUSHJ P,GETONE ;GET A CHARACTER JRST COMC.2 ;TERMINATOR JFCL JFCL JRST COMC.1 ;CONTINUE UNTIL A LINE TERMINATOR COMC.2: SETOM TTYINT ;FORCE ANOTHER LOOK AT THE TERMINAL JRST OPRSTA ;RE-PROMPT AND RETURN OPRD.2: MSGTTY [ASCIZ/Command is ambiguous/] JRST COMCLR ;CONSUME THE REST OF THE INPUT LINE ILLNUM: MSGTTY [ASCIZ/Illegal number format/] JRST COMCLR ;CONSUME THE REST OF THE LINE ARGERR: MSGTTY [ASCIZ/Missing argument or illegal delimiter/] JRST COMCLR ;CANCEL THE INVALID LINE RANGER: MSGTTY [ASCIZ/Argument is out of range/] JRST COMCLR ;FLUSH THE RESET OF THE COMMAND ILLSJB: MSGTTY [ASCIZ/Illegal subjob specified/] JRST COMCLR ;CANCEL THE REST OF THE LINE ;RULES FOR THE COMMAND TABLE ; 1)NO COMMANDS BEGIN WITH THE LETTER "A" (EXCEPT ALL) ; 2)NO COMMANDS BEGIN WITH THE LETTER "B" (OPSER'S NAME FOR BATCON) ; 3)COMMANDS ARE UNIQUE IN 4 LETTERS OR LESS DEFINE CMDTBL< LSTOFF X ALL, ;ALL IS A POSSIBLE COMMAND (MUST BE THE FIRST COMMAND) IFN INPCOR, X CURREN,