*DECK,SKEDULR 
          IDENT   SKEDULR 
          ENTRY   START 
          SYSCOM   B1 
          SST 
*CALL,ASSYTAG 
*IF DEF,NOSBE,1 
          IPARAMS 
          TITLE  SKEDULR - SUBMIT FILE SCHEDULER
  
*** 
*    AUTHOR 
*    ------ 
* 
*         J.E. SIPPER        79/06/07 
*         CONSULTANT, ENGINEERING SERVICES
*         SOUTHEAST REGION
* 
*         MODIFIED FOR NOS/BE OPERATION 
* 
*         D.M. ANDERSON      79/08/08 
*         SYSTEMS ENGINEER, ENGINEERING SERVICES
*         SOUTHEAST REGION
* 
*    OVERVIEW 
*    -------- 
* 
*IF DEF,NOS 
*         SKEDULR WILL SCHEDULE SUBMIT FILES FOR EXECUTION BASED ON 
*         THE CONTENTS OF AN INDIRECT ACCESS PERMENANT FILE CALLED
*         JOBS (IF SYMBOL  MMF  IS DEFINED, THE JOBS FILE WILL BE 
*         JOBSXX - XX IS CHARACTERS OBTAINED FROM THE OPERATING SYSTEM
*         MACHINE ID.  THIS ID IS A ONE OR TWO-CHARACTER DISPLAY-CODE 
*         VALUE.  IF THESE CHARACTERS WERE T1, THEN THE JOBS FILE 
*         WOULD BE JOBST1.  IF THE MACHINE ID WAS T, THEN THE JOBS
*         FILE WOULD BE JOBST.  IN A MULTI-MAINFRAME ENVIRONMENT, THIS
*         TECHNIQUE ALLOWS THE SKEDULR TO BE COMMON TO ALL SYSTEMS
*         WITH DIFFERENT JOBS FILES ESTABLISHED FOR EACH SYSTEM IN
*         THE NETWORK). 
*ENDIF
*IF DEF,NOSBE 
*         SKEDULR SUBMITS NOS/BE PERMANENT FILES FOR EXECUTION
*         BASED ON THE CONTENTS OF A PERMANENT FILE CALLED
*         JOBS. 
*ENDIF
* 
*         THE JOBS FILE MUST CONTAIN RUN DIRECTIVES THAT DEFINE 
*IF DEF,NOS 
*         SUBMIT FILES TO SCHEDULE PLUS THE DAY-OF-THE-WEEK AND 
*ENDIF
*IF DEF,NOSBE 
*         PERMANENT FILES TO EXECUTE PLUS THE DAY-OF-THE-WEEK AND 
*ENDIF
*         TIME-OF-THE-DAY THE FILE IS TO BE SUBMITTED.  THIS FILE 
*         IS IN 80 COLUMN LINE IMAGES, STARTING IN COLUMN 1, IN THE 
*         FOLLOWING FORMAT; 
* 
*            RUN LFN WHEN AT TIME,TIME,TIME.... 
*                --- ----    ---- ---- ---- 
* 
*         OR
* 
*            1RUN LFN WHEN AT TIME,TIME,TIME....
*                 --- ----    ---- ---- ----
* 
*IF DEF,NOS 
*            LFN  = INDIRECT ACCESS PERMANENT FILE NAME OF THE
*                   SUBMIT FILE TO BE SCHEDULED (1-7 CHARACTERS)
*ENDIF
*IF DEF,NOSBE 
*            LFN  = PERMANENT FILE NAME OF THE FILE 
*                   TO BE SUBMITTED(1-7 CHARACTERS) 
*ENDIF
* 
*            WHEN = DESCRIPTION OF THE DAY THE JOB IS TO BE SCHEDULED.
*                   A NUMBER OF SYNTAXS EXIST TO ALLOW A JOB TO BE RUN
*                   DAILY, WEEKLY, MONTHLY, YEARLY OR ANY COMBINATION 
*                   OF THESE.  THE FOLLOWING KEYWORDS ARE POSSIBLE; 
* 
*                     DAILY 
*                     WEEKDAYS      - (MONDAY-FRIDAY) 
*                     WEEKENDS      - (SATURDAY-SUNDAY) 
*                     SUNDAY - SATURDAY 
*                     MONTHLY (X)   - X = DAY OF THE MONTH 1-31 
*                     MONTHLY (Y Z) - Y = FIRST-FIFTH, Z=DAY OF THE 
*                                     WEEK (FIRST MONDAY) 
*                     MONTHLY (LAST DAY) - LAST DAY OF THE MONTH
*                     JANUARY-DECEMBER (X) - X = DAY OF THE MONTH 
*                                     EXAMPLE;  JUNE (15) 
*                     JANUARY-DECEMBER (Y Z) - Y = FIRST-FIFTH, Z = 
*                                     DAY OF THE WEEK (SECOND TUESDAY)
* 
*            TIME = TIME OF DAY THE JOB IS TO BE SUBMITTED (0000 -
*                   2359 - HOUR AND MINUTES WITH NO SEPERATION). IF 
*                   THE JOB IS TO BE SUBMITTED MORE THAN ONCE PER DAY,
*                   MULTIPLE TIMES CAN BE SPECIFIED.
* 
*         RUN DIRECTIVES WILL CAUSE SKEDULR TO ALLOW MULTIPLE RUNS OF 
*         THE SAME TASK NAME TO "CATCH UP" IN THE EVENT OF SYSTEM DOWN
*         TIME OR OTHER DELAYS. 
* 
*         1RUN DIRECTIVES WILL CAUSE SKEDULR TO ALLOW THE TASK TO ONLY
*         BE RUN ONCE DURING EACH SKEDULR SCAN CYCLE. THI IS USED IF
*         FOR EXAMPLE YOU HAVE A TASK THAT NEEDS TO BE RUN EVERY 30 
*         MINUTES DURING THE DAY SHIFT BUT DOES NOT NEED TO RUN SEVERAL 
*         TIMES IN A SHORT PERIOD TO CATCH UP.
* 
*         IT IS POSSIBLE TO MIX RUN AND 1RUN DIRECTIVES. THEY CONTINUE
*         TO BE SCANNED SEQUENTIALLY FOR PROPER SELECTION CRITERIA. IF
*         A RUN COMMAND IS ENTERED FRO A TASK FOLLOWED BY A 1RUN COMMAND
*         FOR THE SAME TASK THE 1RUN COMMAND WILL BE IGNORED IF THE TASK
*         WAS STARTED BECAUSE OF THE RUN COMMAND. 
* 
*    WARNING............... 
*         THIS CHANGE HAS A PROBLEM IF MORE THAN 100 DIFFERENT TASKS
*         ARE STARTED DURING THE SAME SKEDULR CYCLE. THE FIRST 99 
*         TASKS WILL BE CHECKED FOR A MATCH ALONG WITH THE LAST TASK
*         THAT WAS SKEDULED.
* 
*         SINGLE BLANKS, PERIODS OR COMMAS CAN BE USED AFTER EACH WORD
*         OR TIME ENTRY, BUT TWO BLANKS TERMINATE THE RUN DIRECTIVE.
*         REMAINING COLUMNS, IF ANY, CAN BE USED FOR DOCUMENTATION IF 
*         DESIRED.
* 
*         EXAMPLES: 
* 
*            RUN HPASUM DAILY AT 0830 
*            RUN REGEN01 DAILY AT 0800,1000,1200,1400,1600,1800,2000
*            RUN TASK1 WEEKDAYS AT 0300 
*            RUN TASK2 WEEKENDS AT 0900 
*            RUN D44020A MONDAY AT 1915   *RUN D44 ON EST 20
*            RUN HPAMON MONTHLY (15) AT 1000
*            RUN FTP015A MONTHLY (FIRST MONDAY) AT 1100 
*            RUN WRAPUP MONTHLY (LAST DAY) AT 2300
*            RUN CAMSRUN JULY (15) AT 0800
*            RUN CAMS JULY (FIRST WEDNESDAY) AT 0900
* 
*            1RUN PLOTMOV DAILY AT 0700,0730,0800,0830,0900,0930,1000 
*            1RUN PLOTMOV DAILY AT 1030,1100,1130,1200,1230,1300,1330 
*            1RUN PLOTMOV DAILY AT 1400,1430,1500,1530,1600,1630,1700 
* 
* 
*         THE JOB TO SUBMIT CAN BE IN TWO FORMATS.  IF THE FIRST CARD 
*         IMAGE OF THE FILE IS  /JOB  , SCHEDULR WILL CREATE A NEW
*         FILE TO BE SUBMITTED, ELIMINATING THE   /JOB  STATEMENT AND 
*         REPLACING ANY  /EOR  AND  /EOF  STATEMENTS WITH END-OF-RECORD 
*         OR END-OF-FILE.  SEQUENCE NUMBERS ARE NOT ALLOWED SINCE THEY
*         ARE NOT REMOVED.  HOWEVER, THE /NOSEQ CARD MAY BE USED, AND 
*         IF PRESENT, IT IS DISCARDED.
* 
*           NOTE:  THE /NOSEQ CARD SHOULD BE USED IF THE JOB IS TO BE 
*                  SUBMITTED BY SKEDULR AS WELL AS SUBMITTED TO THE 
*                  INPUT QUEUE WITH SYSTEM CONTROL CARDS.  WITHOUT
*                  THE /NOSEQ CARD, THE MANUAL SUBMIT COULD CAUSE DATA
*                  CARDS WITHIN THE JOB WHICH HAVE NUMBERS IN THE 
*                  FIRST FEW COLUMNS TO BE REARRANGED SUCH THAT THE 
*                  NUMBERS, THOUGHT TO BE SEQUENCE NUMBERS, WILL BE 
*                  REMOVED. 
* 
*         THE SECOND FORMAT DOES NOT CONTAIN THE  / CONTROL STATEMENTS
*         AND WILL BE SUBMITTED DIRECTLY FOR EXECUTION WITHOUT ANY
*         PROCESSING BY SKEDULR.
* 
* 
*    DESCRIPTION
*    -----------
* 
*IF DEF,NOS 
*         SKEDULR SPENDS MOST OF ITS TIME ROLLED OUT, WAITING FOR A 
*         CALCULATED PERIOD OF TIME TO EXPIRE BEFORE BEING ROLLED IN
*         TO PROCESS THE JOBS FILE.  AFTER SCHEDULING THE REQUESTED 
*         TASKS, SKEDULR ROLLS AGAIN FOR A PERIOD OF FIFTEEN
*         MINUTES OR UNTIL THE NEXT JOB NEEDS TO BE SCHEDULED, WHICH
*         EVER IS LESS.  BY HAVING A MAXIMUM ROLLOUT TIME OF FIFTEEN
*         MINUTES, A NEW OR MODIFIED JOBS FILE CAN BE PUT INTO EFFECT 
*         WITHIN 15 MINUTES OF BEING CREATED. 
*ENDIF
*IF DEF,NOSBE 
*         SKEDULR SHOULD BE PUT INTO EXECUTION AS A NORMAL JOB UNDER
*         THE CONTROL OF THE AUTOMATIC PROGRAM SEQUENCER (APR) OF THE 
*         NOSBE SYSTEM SUCH THAT IT IS EXECUTED EVERY 15 MINUTES. 
*         THIS INSURES THAT JOBS WILL BE SCHEDULED WITHIN 15 MINUTES
*         OF THE REQUESTED TIME, AND A NEW OR MODIFIED JOBS FILE CAN
*         BE PUT INTO EFFECT WITHIN 15 MINUTES OF BEING CREATED.
*ENDIF
* 
*         PRIOR TO EXECUTING SKEDULR, PERMANENT FILES MUST BE CREATED 
*         FOR THE FOLLOWING;
* 
*         . JOBS  - THE FILE THAT CONTAINS RUN DIRECTIVES OF JOBS TO BE 
*                   SCHEDULED BY SKEDULR. 
* 
*         . PERMANENT FILES OF JOBS TO SCHEDULE 
* 
*IF DEF,NOSBE 
* 
*         SINCE SKEDULR MUST ATTACH THE PERMENANT FILES THAT REPRESENT
*         JOBS TO BE EXECUTED, IT MUST KNOW THE PERMENANT FILE ID OF
*         THESE FILES.  THE DEFAULT ID USED BY SKEDULR IS   CDCCE  .
*         IF ANOTHER ID IS TO BE USED, REFER TO THE INSTALLATION
*         SECTION OF THIS DOCUMENT FOR INSTRUCTIONS.
* 
*         IN ORDER TO SCHEDULE JOBS AT THE PROPER TIME, SKEDULR MUST
*         KNOW THE DATE AND TIME SKEDULR WAS LAST RUN.  THIS IS DONE
*         USING A PERMANENT FILE WITH A DEFAULT NAME OF  TFILE  . 
*         THIS FILE IS INITIALLY CREATED BY SKEDULR AND IS MAINTAINED 
*         AUTOMATICALLY BY SKEDULR.  SHOULD THIS FILE NAME CONFLICT 
*         WITH EXISTING PERMANENT FILES, THE USER CAN USE A NEW NAME
*         FOR TFILE USING THE TECHNIQUE DESCRIBED IN THE INSTALLATION 
*         SECTION OF THIS DOCUMENT. 
* 
*         THE FOLLOWING REPRESENTS A TYPICAL RUN OF SKEDULR UNDER NOSBE.
*         THIS JOB WOULD NORMALLY ONLY HAVE TO BE EXECUTED ONCE AND 
*         IT WOULD AUTOMATICALLY BE RECOVERED IF DEADSTARTS ARE 
*         PERFORMED, EITHER WITH I/O QUEUES OR WITH OTHER APR JOBS. 
* 
*            JOB CARD.
*            ATTACH,JOBS,ID=(YOUR ID).
*            ATTACH,SKEDULR,ID=(YOUR ID). 
*            APR(1,001702)      (NOTE:  THE 02 INDICATES THE JOB NUMBER 
*            SKEDULR.                   FOR APR JOBS AND MAY HAVE TO BE 
*            6/7/8/9                    CHANGED TO A LEGAL EMPTY APR
*                                       JOB ENTRY)
* 
*ENDIF
*IF DEF,NOS 
* 
*         IF TWO OR MORE COPIES OF SKEDULR WERE IN OPERATION AT THE 
*         SAME TIME, JOBS WOULD BE SCHEDULED MULTIPLE TIMES.  TO
*         PREVENT MULTIPLE COPIES OF SKEDULR FROM RUNNING, AN INDIRECT
*         ACCESS PERMANENT FILE IS USED AS AN INTERLOCK (DIRECT ACCESS
*         FILE IS NOT USED SO THAT DISK SPACE CAN BE CONSERVED).  A 
*         DEFAULT FILE NAME OF  TFILE  IS USED AS THE INTERLOCK FILE. 
*         IF THE USER WISHES TO USE SOME OTHER NAME FOR THIS FILE, THE
*         PROCEDURE DESCRIBED IN THE INSTALLATION SECTION SHOULD BE 
*         USED. 
* 
*           CAUTION: TFILE OR THE FILE NAME SPECIFIED AS TFILE SHOULD 
*                    NEVER BE USED FOR ANY OTHER PURPOSE.  ANY USER 
*                    DATA PLACED ON THIS FILE WILL BE DESTROYED BY
*                    SKEDULR. 
* 
*         THE FOLLOWING REPRESENTS A TYPICAL RUN OF SKEDULR UNDER NOS.
*         THIS JOB WOULD NORMALLY BE EXECUTED AFTER EACH LEVEL 0
*         DEADSTART IF A PREVIOUS COPY OF SKEDULR WAS NOT RECOVERED 
*         IN THE QUEUES.  THE SKEDULR SHOULD NORMALLY BE RECOVERED
*         AUTOMATICALLY ON ALL OTHER LEVELS OF DEADSTART.  DUE TO THE 
*         PROTECTION PROVIDED TO INSURE MULTIPLE COPIES ARE NOT IN
*         EXECUTION AT THE SAME TIME, THE USER CAN NORMALLY START 
*         ANOTHER COPY OF SKEDULR AFTER A DEADSTART IF IN DOUBT ABOUT 
*         IT BEING RECOVERED IN THE QUEUES.  IF A COPY IS ALREADY IN
*         EXECUTION, THE SECOND COPY TERMINATES WITH A MESSAGE THAT 
*         INDICATES MULTIPLE COPIES EXISTED.
* 
*            JOB CARD.              (INSURE TIME LIMIT IS INFINITY) 
*            USER AND CHARGE CARDS AS NECESSARY.
*            GET,SKEDULR. 
*            SKEDULR. 
*            6/7/8/9
* 
*         IF THE NOS OPERATING SYSTEM IS NOS 1.6 OR GREATER, THE CHARGE 
*         CARD SHOULD INCLUDE A PARAMETER THAT CAUSES SKEDULR TO
*         EXECUTE IN THE SAME JOB CLASS AS THE NETWORK SUPERVISORS. 
*         THIS INSURES THAT SKEDULR HAS A HIGH PRIORITY AND ACCURATELY
*         SCHEDULES JOBS ON TIME.  FOR OLDER SYSTEMS, A HIGH QUEUE
*         PRIORITY AND SMALL FIELD LENGTH ARE USED TO INSURE ACCURATE 
*         SCHEDULING.  HOWEVER, IN A HEAVILY LOADED SYSTEM, SCHEDULING
*         WITHIN A FEW MINUTES OF THE REQUESTED TIME CANNOT BE
*         GUARENTEED ALTHOUGH ALL TESTING HAS BEEN SUCCESSFUL.
* 
*ENDIF
* 
*         ANY NUMBER OF JOBS CAN BE SCHEDULED BY SKEDULR SINCE THE JOBS 
*         FILE IS READ AND PROCESSED TO END-OF-INFORMATION. 
* 
* 
*    INSTALLATION 
*    ------------ 
* 
*         SKEDULR NEED NOT BE INSTALLED INTO THE CUSTOMER DEADSTART 
*         TAPE - IT CAN BE EXECUTED FROM A USER FILE.  THE SOURCE 
*         MUST BE EXTRACTED FROM THE CML TAPE USING UPDATE, ASSEMBLED 
*         INTO BINARY USING COMPASS AND SAVED FOR LATER EXECUTION 
*         EITHER AS A PERMANENT FILE OR ON PUNCHED CARDS.  THERE ARE
*         A NUMBER OF OPTIONS THAT CAN/MUST BE INVOKED DURING THE 
*         UPDATE RUN. 
* 
*         . SINCE SKEDULR EXECUTES ON BOTH NOS AND NOSBE, THE USER
*           MUST DEFINE THE TARGET SYSTEM AS FOLLOWS; 
* 
*               *DEFINE,NOS,(NOSVERSION)  (FOR NOS OPERATION SEE BELOW) 
*               *DEFINE,NOSBE,NOBE6       (FOR NOSBE OPERATION) 
* 
*         . IF SKEDULR IS TO BE USED IN NOS, THE USER MUST DEFINE 
*           WHICH VERSION OF NOS IS BEING USED (SKEDULR USES DIFFERENT
*           FEATURES OF THE SYSTEM BASED UPON THE SYSTEM LEVEL).
* 
*         . AS OF CML L179 SKEDULR MAKES A CALL TO COMMON DECK ASSYTAG
*           FOR THE ASSEMBLY DEFINES. THE FOLLOWING DEFINES MUST BE IN
*           THE CORRECT FORMAT TO GET THE PROPER BINARY COMPILED FOR
*           NOS. SEE DEFINE FOR NOSBE ABOVE.
* 
*               *DEFINE,NOS,(NOSVERSION)
*                           WHERE (NOSVERSION) =
*                           NOS1 (IF THE SYSTEM IS NOS 1.0 OR NOS 1.1.) 
*                           NOS2 (IF THE SYSTEM IS NOS 1.2) 
*                           NOS3 (IF THE SYSTEM IS NOS 1.3) 
*                           NOS4 (IF THE SYSTEM IS NOS 1.4) 
*                           NOS6 (IF THE SYSTEM IS NOS 2.0 THROUGH 2.2) 
*                           NOS23 (IF THE SYSTEM IS NOS 2.3)
*                           NOS24 (IF THE SYSTEM IS NOS 2.4)
*                           NOS25 (IF THE SYSTEM IS NOS 2.5)
*                           NOS26 (IF THE SYSTEM IS NOS 2.6)
* 
*         . IF THE USER WISHES TO USE A DIFFERENT FILE NAME FOR TFILE,
*           THE FOLLOWING UPDATE CORRECTION IS REQUIRED.
* 
*               *INSERT,SKEDULR.6 
*                TFPFN    MICRO  1,,*XXXXX*   (XXXXX= PFN FOR TFILE)
* 
*         . IF THE USER WISHES TO USE A PERMANENT FILE ID OTHER THAN
*           THE DEFAULT (CDCCE), THE FOLLOWING UPDATE CORRECTION IS 
*           REQUIRED (FOR NOSBE USE ONLY).
* 
*               *INSERT,SKEDULR.6 
*                PFILEID  MICRO  1,,*XXXXX*   (XXXXX= NEW ID) 
* 
*         . IF SKEDULR IS TO BE USED IN A NOS MULTI-MAINFRAME SYSTEM
*           AND SHARE A COMMON COPY OF THE SKEDULR BINARY BETWEEN THE 
*           SYSTEMS (BUT USE UNIQUE JOBS FILES FOR EACH SYSTEM) THE 
*           FOLLOWING UPDATE CORRECTION IS REQUIRED.
* 
*               *DEFINE,MMF 
* 
*         A TYPICAL NOS INSTALLATION DECK WOULD BE AS FOLLOWS (NOTE 
*         THAT YOUR UPDATE OPTIONS COULD BE DIFFERENT). 
* 
*           JOB AND ACCOUNT CARDS AS REQUIRED.
*           REQUEST CARD FOR CML TAPE AS FILE NAME CML. 
*           ATTACH CARD FOR SYSTEM OPL FILE.
*           UPDATE(Q,P=CML) 
*           RFL,60000.
*           COMPASS(I,X,S=NOSTEXT,B=SKEDULR)
*           SAVE,SKEDULR. 
*           7/8/9  (EOR)
*           *IDENT,$DEF$
*           *DEFINE,NOS,NOS1,MMF       (MULTI-MAINFRAME NOS 1.1 SITE) 
*           *INSERT,SKEDULR.6 
*            TFPFN    MICRO  1,,*ILOCK*    (NEW FILE NAME FOR TFILE)
*           *COMPILE,SKEDULR
*           6/7/8/9  (EOF)
* 
* 
*         A TYPICAL NOSBE INSTALLATION DECK WOULD BE AS FOLLOWS (NOTE 
*         THAT YOUR UPDATE OPTIONS COULD BE DIFFERENT). 
* 
*           JOB AND ACCOUNT CARDS AS REQUIRED.
*           REQUEST CARD FOR CML TAPE AS FILE NAME CML. 
*           REQUEST,SKEDULR,*PF.
*           UPDATE(Q,P=CML) 
*           RFL,100000. 
*           COMPASS(I,B=SKEDULR,S=SCPTEXT,S=PFMTEXT,S=IPTEXT) 
*           CATALOG(SKEDULR,ID=MYID,RP=999) 
*           7/8/9  (EOR)
*           *IDENT,$DEF$
*           *DEFINE,NOSBE,NOSBE6          (FOR NOSBE SITE)
*           *INSERT,SKEDULR.6 
*            TFPFN   MICRO  1,,*ILOCK*    (NEW FILE NAME FOR TFILE) 
*            PFILEID MICRO  1,,*MYID*     (NEW PERMANENT FILE ID) 
*           *COMPILE,SKEDULR
*           6/7/8/9  (EOF)
* 
* 
* 
*         THE FOLLOWING STEPS ARE PERFORMED BY SKEDULR TO ACCOMPLISH THE
*         DESIRED JOB SCHEDULING TASK.
  
          IFEQ   NOSBE,1
  
* 
*         EQUATES AND MICROS FOR NOS/BE 
  
*         TFPFN    -  PERMANENT FILE NAME FOR TIME FILE 
  
          IF -MIC,TFPFN,1 
 TFPFN    MICRO  1,,*TFILE* 
  
*         PERMANENT FILE ID FOR ALL SKEDULR PERMANENT FILES 
  
          IF -MIC,PFILEID,1 
 PFILEID  MICRO  1,,*CDCCE* 
  
*         ORDER OF NOSBE DATE ENTRY MADE BY THE OPERATOR (MDY)
  
 D1       MICRO  1,1, "IP.YMD"
 D2       MICRO  2,1, "IP.YMD"
 D3       MICRO  3,1, "IP.YMD"
  
*         FDBS FOR FILES
  
TASKFDB   FDB    DUMMY,DUMMY,ID="PFILEID" 
TFFDB     FDB    TFILE,"TFPFN",ID="PFILEID" 
  
*         REQUEST PARAMETER BLOCKS FOR FILES
  
REQPAR    VFD    42/7CQUEFILE,18/0
          VFD    3/0,3/2,24/0,3/2,27/0
          BSSZ   2
TFREQ     VFD    30/5CTFILE,30/0
          VFD    30/2,3/2,27/0
          BSSZ   2
  
*         ROUTE PARAMETER BLOCK FOR TASK FILES
  
ROUTPAR   VFD    42/7CQUEFILE,18/0
          VFD    24/0,12/2CIN,24/400120B
          BSSZ   3
          ENDIF 
*         FETS FOR FILES
  
          IFEQ   NOS,1
          IF -MIC,TFPFN,1 
 TFPFN    MICRO 1,,*TFILE*   PERMANENT FILE NAME FOR TIME FILE
* 
 LIST     FILEC  OUTBUF,LOUTB,(WSA=CLINE,LCLINE)
 JOBS     FILEC  BUFIN,LIN,XL,(WSA=KEY,LKEY)
 TASK     FILEC  BUFTASK,LTASK,XL,(WSA=CLINE,LCLINE)
 TASKA    FILEC  BUFOUT,LBOUT,XL,(WSA=CLINE,LCLINE) 
 TFILE    FILEC  TBUF,LTBUF,XL,PFN="TFPFN",(WSA=CLINE,LCLINE) 
* 
 OPL      XTEXT  COMCMAC
 OPL      XTEXT  COMCQFM
 OPL      XTEXT  COMCSYS
 OPL      XTEXT  COMSEVT
          IFEQ   NOS+NOS1,1,1 
 OPL      XTEXT  COMCCMD
          ENDIF 
          IFEQ   NOSBE,1
 OUTPUT   FILEC  OUTBUF,LOUTB,(WSA=CLINE,LCLINE)
JOBS      FILEC  BUFIN,LIN,(WSA=KEY,LKEY) 
TASK      FILEC  BUFTASK,LTASK,(WSA=CLINE,LCLINE) 
 QUEFILE  FILEC  BUFQUE,LQUE,(WSA=CLINE,LCLINE) 
TFILE     FILEB  BUFIN,LIN
          ENDIF 
          EJECT 
  
          IFEQ   NOS,1
***    1. ON INITIAL ENTRY, GET THE TIME OF DAY FROM THE SYSTEM AND 
*         CONVERT IT TO MINUTES PAST MIDNIGHT.  SAVE THIS TIME AS THE 
*         CURRENT TIME AS WELL AS THE PREVIOUS TIME.  GET THE MACHINE 
*         ID AND ADD IT TO THE JOBS FILE NAME TO CREATE THE TRUE
*         JOBS FILE NAME (JOBSXX) IF SYMBOL  MMF  IS DEFINED. 
* 
*         VERIFY THAT ANOTHER COPY OF SKEDULR IS NOT RUNNING.  THIS IS
*         PERFORMED BY CREATING AN INDIRECT ACCESS PERMANENT FILE WITH
*         THE CURRENT DATE AND TIME STAMP, WAITING 30 MINUTES TO ALLOW
*         ANOTHER COPY OF SKEDULR TO MODIFY THE STAMP, READING THE
*         FILE AND DETERMINING IF IT HAS BEEN CHANGED.  IF IT HAS,
*         THIS COPY IS TERMINATED.  OTHERWISE, IT IS ASSUMED THAT WE
*         ARE THE MASTER COPY AND ALL OTHER COPIES WILL TERMINATE 
*         THEMSELVES DUE TO OUR CHANGING THE TIME STAMP.
          ENDIF 
          IFEQ   NOSBE,1
***    1. ATTEMPT TO ATTACH THE TIME FILE AND READ THE LAST DATE AND
*         TIME SKEDULR WAS EXECUTED.  IF THE FILE IS NOT AVAILABLE, 
*         OR IF IT HAS BEEN MORE THAN ONE HOUR SINCE SKEDULR WAS
*         EXECUTED (TIME FILE PROBABLY NOT CURRENT), SET THE PREVIOUS 
*         TIME TO THE CURRENT TIME.  IF THE FILE IS AVAILABLE AND THE 
*         SKEDULR WAS EXECUTED WITHIN THE PAST HOUR, SET THE PREVIOUS 
*         TIME TO THE TIME INDICATED FROM THE TIME FILE.
          ENDIF 
  
 START    SB1    1
          IFEQ   NOSBE,1
          ATTACH TFFDB,RC    GET THE TIME FILE
          SA1    TFFDB+2     ISOLATE RETURN STATUS
          MX0    9
          LX1    59-17
          BX1    X0*X1
          NZ     X1,STEP1B   IF ATTACH WAS NOT SUCCESSFUL 
          READ   TFILE,RECALL    PRIME THE TFILE BUFFER 
          SA1    BUFIN       GET THE PREVIOUS TIME
          BX7    X1 
          SA7    PTIME       AND SAVE IT
          JDATE  JDAY        GET JULIAN DATE
          RJ     TIME        GET CURRENT TIME PAST MIDNIGHT 
          SA1    JDAY        CURRENT DATE 
          SA2    BUFIN+1     LAST DAY SKEDULR WAS RUN 
          IX1    X1-X2
          ZR     X1,STEP1    IF SAME DAY
          SX1    X1-1 
          NZ     X1,STEP1B   IF MORE THAN ONE DAY DIFFERENCE
 STEP1    SA1    BUFIN       LAST TIME SKEDULR WAS RUN
          IX2    X6-X1       CURRENT TIME - LAST RUN TIME 
          PL     X2,STEP1A   IF NO CLOCK WRAP ARROUND 
          SX6    X6+1439     CURRENT TIME + 23 HOURS AND 59 MINUTES 
          IX2    X6-X1
 STEP1A   SX2    X2-180 
          NG     X2,STEP2    IF SKEDULR WAS RUN WITHIN LAST 3 HOURS 
 STEP1B   BSS    0
          ENDIF 
          RJ     TIME        GET CURRENT TIME TO X6 
          SA6    CTIME       SAVE AS CURRENT TIME 
          SA6    PTIME       SAVE AS PREVIOUS TIME
  
          IFEQ   NOS,1
          GETJN  JSN         SAVE THIS JSN
          SA1    JSN
          BX6    X1 
          SA6    CLINE+2
          IFEQ   NOS+NOS1+NOS2+NOS3+NOS4,2,1
          SETQP  0           SET QUEUE PRIORITY TO MAXIMUM
          SETPR  100B        SET CPU PRIORITY TO MAXIMUM
*IF DEF,MMF,15
          MACHID  ID
          SA1    ID 
          SA2    TFILE
          SX0    7777B       MACHINE ID MASK
          BX6    X0*X1
          LX6    18 
          BX7    X6+X2
          SA7    A2          SAVE NEW TFILE NAME
          SA2    TFILE+10B
          BX7    X6+X2
          SA7    A2          SAVE NEW PFN TFILE NAME
          SA2    JOBS 
          LX6    6
          BX6    X6+X2
          SA6    A2          SAVE NEW JOBS FILE NAME
* 
          REWIND TFILE,RECALL 
          CLOCK  PDAY        CURRENT TIME 
          DATE   CLINE+1     CURRENT TIME 
          SA1    PDAY 
          BX6    X1 
          SA6    CLINE
          WRITEC TFILE,CLINE,9  RECORD THE CURRENT DATE/TIME
          WRITER TFILE,RECALL 
          REPLACE TFILE 
          SX7    30*60       ROLLOUT FOR 30 MINUTES 
          SA1    OUTTIME
          MX0    48 
          BX1    X0*X1
          BX7    X1+X7
          SA7    A1 
          ROLLOUT OUTTIME 
          GET    TFILE       DETERMINE IF TIME HAS BEEN CHANGED 
          READ   TFILE,RECALL 
          READC  TFILE,CLINE,9
          SA1    PDAY 
          SA2    CLINE
          BX1    X1-X2
          NZ     X1,STEP1    SKIP IF NOT ALONE
          SA1    JSN         CHECK FOR SAME JSN 
          SA2    CLINE+2
          BX1    X1-X2
          ZR     X1,STEP2    SKIP IF ALONE
 STEP1    BSS    0
          MESSAGE MSG3,3,RECALL  REPORT MULTIPLE COPIES RUNNING 
          ENDRUN
  
          ENDIF 
  
***    2. GET THE CURRENT TIME OF DAY, CONVERT IT TO MINUTES PAST MID-
*         NIGHT AND SAVE IT AS THE CURRENT TIME.
  
 STEP2    RJ     TIME        GET CURRENT TIME TO X6 
          SA1    PTIME
          MX7    0
          SA7    WRAP        CLEAR CLOCK WRAP AROUND FLAG 
          SA7    JCOUNT      SET JOB COUNT TO ZERO
          IX2    X6-X1
          PL     X2,STEP2A   IF CLOCK HAS NOT WRAPPED 
          MX7    1
          SA7    WRAP        SET CLOCK WRAP AROUND FLAG 
 STEP2A   SA6    CTIME       SAVE AS CURRENT TIME 
          IFEQ   NOS,1
          SX6    24*60
          SA6    TTIME       SET TARGET TIME FOR NEXT ROLLIN HIGH 
          ENDIF 
  
***    3. GET THE CURRENT JULIAN DATE AND CALCULATE THE CURRENT 
*         DAY OF THE WEEK (SUNDAY - SATURDAY) AND SAVE IT.
  
          JDATE  JDAY 
          SA1    JDAY        JULIAN DATE
          SB1    1
          MX0    -18         DAY MASK 
          BX1    -X0*X1      GET RID OF JULIAN YEAR 
          SX2    333333B
          IX1    X1-X2       CONVERT DISPLAY CODED DECIMAL TO OCTAL 
          SX0    77B         MASK 
          BX2    X1*X0       THIRD DIGIT
          AX1    6
          BX3    X1*X0       SECOND DIGIT 
          AX1    6
          BX4    X1*X0       FIRST DIGIT
          SX1    100
          IX4    X4*X1       CONVERT DECIMAL TO OCTAL 
          SX1    10 
          IX3    X3*X1
          IX6    X2+X3
          IX6    X6+X4       JULIAN DAY IN OCTAL
          SA1    JDAY        CONVERT JULIAN YEAR TO OCTAL 
          SX2    3333B
          AX1    18 
          IX1    X1-X2
          BX4    X1*X0       SECOND DIGIT 
          AX1    6
          BX1    X1*X0       FIRST DIGIT
          SX2    10 
          IX1    X1*X2
          IX3    X4+X1       JULIAN YEAR (YEAR-1900) IN OCTAL 
          SX0    3
          SX7    28          NUMBER OF DAYS NORMALLY IN FEBRUARY
          BX4    X0*X3
          NZ     X4,STEP3    IF THIS IS NOT LEAP YEAR 
          SX7    X7+B1       INDICATE 29 DAYS IN FEBRUARY 
 STEP3    SA7    FEB         STORE CORRECT NUMBER OF DAYS IN FEBRUARY 
          SX3    X3-77       YEAR - 77 (LAST LEAP YEAR + 1) 
          SX4    X3+5        ADD 1977 FIRST DAY OF THE YEAR BIAS
          AX3    2           (YEAR-77)/4 = NUMPER OF LEAP YEARS 
          IX4    X4+X3       ADJUSTED DAY RELATIVE TO 1977
          IX4    X4+X6       ADD CURRENT DAY OF YEAR
          SB5    7
          SB4    X4 
 STEP3A   LT     B4,B5,STEP3B  IF DAY FOUND 
          SB4    B4-B5
          EQ     STEP3A 
  
 STEP3B   SX6    B4+B1       DAY OF WEEK = 1-7
          SA5    WRAP 
          ZR     X5,STEP3E   IF CLOCK HAS NOT WRAPPED 
          SA1    BDAY 
          SX7    X1-1        SET PREVIOUS DAY OF MONTH
          NZ     X7,STEP3D   IF MONTH HAS NOT WRAPPED 
          SA2    BMONTH 
          SX7    X2-1        SET PREVIOUS MONTH 
          NZ     X7,STEP3C   IF YEAR HAS NOT WRAPPED
          SX7    12 
 STEP3C   SA7    A2          SET PREVIOUS MONTH 
          SB2    X7-1 
          SA2    NDAYS+B2    DETERMINE PREVIOUS DAY 
          BX7    X2 
 STEP3D   SA7    A1          STORE PREVIOUS DAY 
          SX6    B4          SET PREVIOUS DAY OF THE WEEK 
          NZ     X6,STEP3E
          SX6    B5 
 STEP3E   BSS    0
          SA6    CDAY        SAVE AS CURRENT DAY
  
          IFEQ   NOS,1
***    4. RETURN THE JOBS FILE, GET IT AGAIN AND READ IT TO THE JOBS
*         BUFFER.  THIS STEP ALLOWS THE JOBS FILE TO BE MODIFIED AT 
*         ANY TIME AND PUT INTO EFFECT IMMEDIATELY. 
  
          GET     JOBS
          ENDIF 
          IFEQ   NOSBE,1
***    4. READ THE JOBS FILE INTO THE JOBS BUFFER.
  
          ENDIF 
          REWIND  JOBS,RECALL 
          READ  JOBS,RECALL  PRIME THE BUFFER 
          SX6    B0 
          SA6    EMPTY       SET JOBS FILE EMPTY FLAG 
  
***    5. PROCESS EACH RUN DIRECTIVE TO DETERMINE IF IT IS TIME TO
*         SUBMIT ANY FILES.  SUBMIT ALL JOBS WHOSE DATE AGREES WITH 
*         THE CURRENT DAY OF THE WEEK AND WHOSE TIME FALLS WITHIN THE 
*         BOUNDARY OF PREVIOUS TIME TO CURRENT TIME.
*         IF AN INVALID ENTRY IS FOUND IN THE JOBS FILE, IT IS PRINTED
*         AS AN ILLEGAL RUN DIRECTIVE AND THE NEXT DIRECTIVE IS 
*         PROCESSED.
* 
*           NOTE:  SINCE SKEDULR ONLY PROCESSES A RUN DIRECTIVE TO
*                  THE POINT REQUIRED TO DETERMINE IF THE JOB IS TO 
*                  BE SCHEDULED TODAY OR NOT, SOME ILLEGAL SYNTAXS
*                  WILL NOT BE REPORTED UNTIL THE MONTH OR DAY THEY 
*                  SHOULD BE SCHEDULED.  FOR EXAMPLE, JANUARY(32) 
*                  WOULD NOT BE REPORTED UNTIL JANUARY.  MONDAY AT
*                  2500 WOULD NOT BE REPORTED AN ERROR UNTIL MONDAY.
*                  IN ADDITION, DUE TO THE LEFT TO RIGHT SCANNING 
*                  TECHNIQUE USED BY SKEDULR, AN INVALID TIME ENTRY ON
*                  A RUN DIRECTIVE TERMINATES ANY FURTHER SCANNING OF 
*                  THAT DIRECTIVE.  HOWEVER, VALID TIME ENTRIES THAT
*                  APPEAR TO THE LEFT OF THE INVALID ENTRY WILL BE
*                  SCHEDULED NORMALLY.
  
          IFEQ   NOS,1
 STEP5    READC  JOBS,KEY,9  READ A LINE FROM THE JOBS FILE 
          ENDIF 
          IFEQ   NOSBE,1
 STEP5    READIN JOBS 
          ENDIF 
          ZR     X1,STEP5AA  IF NOT EOR/EOF ON JOBS FILE
          SA1    WRAP 
          ZR     X1,STEP6    IF CLOCK HAS NOT WRAPPED 
          SX6    B0 
          SA6    A1          CLEAR CLOCK WRAP FLAG
          SA6    PTIME       SET PREVIOUS TIME TO MIDNIGHT
          EQ     STEP2       PERFORM SECOND CYCLE 
 STEP5AA  BSS    0
          RJ     CRACK       CRACK THE RUN DIRECTIVE JUST READ
          MX6    48 
          SA6    EMPTY       INDICATE JOBS FILE NOT EMPTY 
          SA1    CRKBUF      FIRST ITEM 
          MX6    0           PRESET SWITCH TO ZERO FOR 1RUN 
          SA2    D1RUN       CHECK FOR 1RUN 
          BX3    X1-X2
          ZR     X3,STEP5AB  SKIP IF 1RUN 
          SX6    X3          SET SWITCH TO NON-ZERO FOR RUN 
          SA2    DRUN 
          BX3    X1-X2
          NZ     X3,STEP5Z   IF NOT A RUN DIRECTIVE 
 STEP5AB  SA6    SWITCH      SET THE SWITCH 
          SA1    A1+B1       SECOND ITEM
          ZR     X1,STEP5Z   IF ILLEGAL FILE NAME 
          MX0    42 
          BX1    -X0*X1 
          NZ     X1,STEP5Z   IF FILE NAME IS TOO LONG 
          SA1    A1+B1       THIRD ITEM 
* 
*         DETERMINE IF JOB IS TO BE RUN DAILY OR ON A SPECIFIC
*         DAY OF THE WEEK (SUNDAY-SATURDAY), WEEKDAYS OR WEEKENDS.
* 
          SB2    B0 
          SB3    LDAYS
 STEP5A   SA2    B2+DAYS
          BX3    X2-X1
          ZR     X3,STEP5K   IF VALID DAY 
          SB2    B2+B1
          NE     B2,B3,STEP5A  IF ALL DAYS NOT SCANNED
* 
*         NOT DAILY OR A SPECIFIC DAY OF THE WEEK.  DETERMINE IF IT 
*         IS TO BE RUN MONTHLY. 
* 
          SA2    DMONTH 
          BX3    X2-X1
          ZR     X3,STEP5D   IF MONTHLY 
* 
*         NOT MONTHLY.  DETERMINE IF A SPECIFIC MONTH IS SPECIFIED. 
* 
          SB2    B0 
          SB3    LMONTHS
 STEP5B   SA2    B2+MONTHS
          BX3    X2-X1
          ZR     X3,STEP5C   IF JANUARY - DECEMBER
          SB2    B2+B1
          NE     B2,B3,STEP5B  IF ALL MONTHS NOT SCANNED
          EQ     STEP5Z      IF ILLEGAL SYNTAX
  
* 
*         IT IS TO BE RUN ON A SPECIFIC MONTH.  DETERMINE IF IT IS
*         THIS MONTH. 
* 
 STEP5C   SA2    BMONTH      CURRENT MONTH IN BINARY
          SB2    B2+B1
          SB7    X2 
          SB2    B7-B2
          NE     B2,B0,STEP5  IF MONTHS DO NOT MATCH
* 
*         IT IS TO BE RUN THIS MONTH.  DETERMINE IF THE DAY OF THE
*         MONTH IS SPECIFIED AS FIRST-FIFTH SUNDAY-SATURDAY.
* 
 STEP5D   SA1    A1+B1       NEXT ITEM FROM CRKBUF
          SX1    X1-1R( 
          NZ     X1,STEP5Z   IF NOT ( 
          SA1    A1+B1       NEXT ITEM FROM CRKBUF
          SB2    B0 
          SB3    LWEEKS 
 STEP5E   SA2    B2+WEEKS 
          BX3    X2-X1
          ZR     X3,STEP5G   IF FIRST-FIFTH 
          SB2    B2+B1
          NE     B2,B3,STEP5E  IF ALL WEEKS NOT SCANNED 
* 
*         DETERMINE IF THE JOB IS TO BE RUN MONTHLY (LAST DAY). 
* 
          SA2    DLAST
          BX3    X2-X1
          NZ     X3,STEP5EA  IF NOT LAST
          SA1    A1+B1       NEXT ITEM FROM CRKBUF
          SA2    DDAY 
          BX3    X2-X1
          NZ     X3,STEP5Z   ILLEGAL SYNTAX IF NOT DAY
          SA2    BMONTH      DETERMINE THE NUMBER OF DAYS IN THIS MONTH 
          SB2    X2-1 
          SA3    NDAYS+B2 
          EQ     STEP5FA     GO SEE IF TODAY IS THE DAY 
* 
*         THE JOB IS TO BE RUN THIS MONTH, BUT THE DAY IS NOT 
*         SPECIFIED AS FIRST-FIFTH SUNDAY-SATURDAY OR AS LAST DAY.
*         DETERMINE IF A SPECIFIC DAY OF THE MONTH IS SPECIFIED.
* 
 STEP5EA  SX0    77B
          LX1    6
          BX2    X1*X0       FIRST DIGIT OF DAY OF THE MONTH
          SX3    X2-33B 
          NG     X3,STEP5Z   IF NOT A NUMBER
          SX4    X2-45B 
          PL     X4,STEP5Z   IF NOT 0-9 
          LX1    6
          BX2    X1*X0
          ZR     X2,STEP5F   IF ONLY ONE DIGIT
          SX2    X2-33B 
          NG     X2,STEP5Z   IF NOT A NUMBER
          SX5    X2-10
          PL     X5,STEP5Z   IF GREATER THAN 9
          SX5    10 
          IX3    X3*X5       CONVERT DECIMAL TO OCTAL 
          LX1    6
          BX1    X1*X0
          NZ     X1,STEP5Z   IF DAY IS .GT. 2 DIGITS
* 
*         A SPECIFIC DAY OF THE MONTH IS SPECIFIED.  DETERMINE IF IT
*         IS TODAY. 
* 
 STEP5F   IX3    X2+X3       DAY OF THE MONTH IN OCTAL
          ZR     X3,STEP5Z   IF DAY=0, IT IS ILLEGAL
          SA2    BMONTH 
          SB4    X2-1 
          SA2    NDAYS+B4    NUMBER OF DAYS IN THIS MONTH 
          IX2    X3-X2
          ZR     X2,STEP5FA  IF LAST DAY OF THE MONTH 
          PL     X2,STEP5Z   IF DAY REQUESTED .GT. DAYS IN MONTH
 STEP5FA  SA2    BDAY 
          BX2    X2-X3
          NZ     X2,STEP5    IF DAY OF THE MONTH DOES NOT MATCH 
          EQ     STEP5J 
  
* 
*         THE JOB IS TO BE RUN THIS MONTH ON SOME FIRST-FIFTH DAY OF
*         THE WEEK.  DETERMINE WHICH DAY OF THE WEEK. 
* 
 STEP5G   SB4    B1 
          SB5    LDAYS-2
          SA1    A1+B1       NEXT ITEM FROM CRKBUF
 STEP5H   SA2    B4+DAYS
          BX3    X2-X1
          ZR     X3,STEP5I   IF DAY OF THE WEEK FOUND 
          SB4    B4+B1
          NE     B4,B5,STEP5H  IF ALL DAYS OF THE WEEK NOT SCANNED
          EQ     STEP5Z       IF ILLEGAL SYNTAX 
  
* 
*         THE SPECIFIC FIRST-FIFTH DAY OF THE WEEK HAS BEEN FOUND.
*         DETERMINE IF TODAY IS THE DAY.
* 
 STEP5I   SA2    CDAY 
          SB7    X2 
          SB4    B7-B4
          NE     B4,B0,STEP5  IF DAY DOES NOT MATCH CURRENT DAY 
          SX3    B2           FIRST-FIFTH 
          SX4    7
          IX5    X3*X4
          SB2    X5+B1
          SB3    B2+6 
          SA2    BDAY         BINARY DAY OF THE MONTH 
          SB4    X2 
          LT     B4,B2,STEP5  IF NOT IN THE RANGE OF FIRST-FIFTH
          GT     B4,B3,STEP5  IF NOT IN THE RANGE OF FIRST-FIFTH
* 
*         THE JOB IS TO BE RUN TODAY.  VERIFY THAT THE TERMINATION
*         SYNTAX IS CORRECT.
* 
 STEP5J   SA1    A1+B1        NEXT ITEM FROM CRKBUF 
          SX2    X1-1R) 
          ZR     X2,STEP5L    IF NEXT ITEM IS ) 
          EQ     STEP5Z       IF ILLEGAL SYNTAX 
  
* 
*         THE JOB IS TO BE RUN DAILY, ON A SPECIFIC DAY OF THE WEEK,
*         WEEKDAYS OR WEEKENDS.  DETERMINE IF TODAY IS THE DAY. 
* 
 STEP5K   EQ     B0,B2,STEP5L  IF JOB TO BE RUN DAILY 
          SA2    CDAY        CURRENT DAY OF THE WEEK
          SX3    B2 
          BX3    X2-X3
          ZR     X3,STEP5L   IF IT IS TO BE RUN TODAY 
          SB2    B2-8 
          SX2    X2-1 
          EQ     B0,B2,STEP5KA  IF WEEKDAYS REQUESTED 
          NE     B2,B1,STEP5    IF NOT WEEKEND, TRY NEXT JOB
          ZR     X2,STEP5L   IF WEEKENDS AND TODAY IS SUNDAY
          SX2    X2-6 
          ZR     X2,STEP5L   IF WEEKENDS AND TODAY IS SATURDAY
          EQ     STEP5       TODAY IS NOT THE DAY 
  
 STEP5KA  ZR     X2,STEP5    IF WEEKDAYS AND TODAY IS SUNDAY
          SX2    X2-6 
          ZR     X2,STEP5    IF WEEKDAYS AND TODAY IS SATURDAY
  
* 
*         THE JOB IS TO BE RUN TODAY.  DETERMINE IF IT IS TIME TO 
*         RUN IT. 
* 
 STEP5L   SA1    A1+B1
          SA2    DAT
          BX3    X1-X2
          NZ     X3,STEP5Z   IF NEXT ITEM IS NOT -AT- 
          SA2    A1+B1       NEXT ITEM FROM CRKBUF
          ZR     X2,STEP5Z   IF NO TIME SPECIFIED 
 STEP5M   SA1    A1+B1       GET TIME TO RUN
          ZR     X1,STEP5    IF NO MORE TIMES SPECIFIED 
          LX1    24 
          SX0    77B         DIGIT MASK 
          BX2    X1*X0       LAST DIGIT 
          SX3    X2-33B 
          NG     X3,STEP5Z   IF ILLEGAL DIGIT 
          SX7    X2-45B 
          PL     X7,STEP5Z   IF ILLEGAL DIGIT 
          AX1    6
          BX2    X1*X0       THIRD DIGIT
          SX4    X2-33B 
          NG     X4,STEP5Z   IF ILLEGAL DIGIT 
          SX7    X2-45B 
          PL     X7,STEP5Z   IF ILLEGAL DIGIT 
          AX1    6
          BX2    X1*X0       SECOND DIGIT 
          SX5    X2-33B 
          NG     X5,STEP5Z   IF ILLEGAL DIGIT 
          SX7    X2-45B 
          PL     X7,STEP5Z   IF ILLEGAL DIGIT 
          AX1    6
          BX2    X1*X0       FIRST DIGIT
          SX6    X2-33B 
          NG     X6,STEP5Z   IF ILLEGAL DIGIT 
          SX7    X2-45B 
          PL     X7,STEP5Z   IF ILLEGAL DIGIT 
          AX1    6
          NZ     X1,STEP5Z   IF ILLEGAL TIME
          SX2    10 
          IX4    X4*X2
          IX4    X4+X3       MINUTES
          IX6    X6*X2
          IX6    X6+X5       HOURS
          SX2    X6-24
          PL     X2,STEP5Z   IF ILLEGAL HOUR
          SX2    X4-60
          PL     X2,STEP5Z   IF ILLEGAL MINUTES 
          SX2    60 
          IX6    X6*X2       CONVERT HOURS TO MINUTES 
          IX6    X6+X4       ADD MINUTES
          NZ     X6,STEP5N   IF NOT 0000 HOURS
          SX6    24*60       SET TIME TO 2400 HOURS 
 STEP5N   SA2    PTIME       PREVIOUS ROLLIN TIME 
          SA3    CTIME       CURRENT TIME 
          SA4    WRAP 
          IX2    X2-X6       PREVIOUS ROLLIN TIME - REQUESTED TIME
          ZR     X4,STEP5N1  IF NO CLOCK WRAP AROUND SINCE LAST RUN 
          NG     X2,STEP5N2  REQUESTED TIME .GT. PREVIOUS, SCHEDULE 
          IX5    X3-X6       CURRENT TIME - REQUESTED RUN TIME
          PL     X5,STEP5N2  REQUESTED TIME .LE. CURRENT, SCHEDULE
          EQ     STEP5M      NOT TIME TO SCHEDULE YET 
  
          IFEQ   NOS,1
 STEP5N1  ZR     X2,STEP5M   IF JOB WAS SCHEDULED LAST TIME 
          PL     X2,STEP5W   IF NOT IN TIME RANGE TO EXECUTE
          IX5    X3-X6       CURRENT TIME - REQUESTED RUN TIME
          NG     X5,STEP5W   IF NOT IN TIME RANGE TO EXECUTE
          ENDIF 
          IFEQ   NOSBE,1
 STEP5N1  PL     X2,STEP5M   JOB WAS SCHEDULED PREVIOUSLY 
          IX5    X3-X6       CURRENT TIME - REQUESTED TIME
          NG     X5,STEP5M   NOT TIME TO SCHEDULE YET 
          ENDIF 
* 
*         IT IS TIME TO SCHEDULE THIS JOB, SO DO IT.
* 
 STEP5N2  SA2    CRKBUF+1    SUBMIT FILE NAME 
          SX3    B1 
          BX6    X2+X3
          SA6    TASK        STORE FILE NAME
          IFEQ   NOS+NOS1,1,3 
          MX0    42 
          BX6    X0*X6
          SA6    ROUTEP      SAVE FILE NAME IN ROUTE PARAMETER BLOCK
* 
*         DETERMINE IF THIS JOB HAS BEEN PREVIOUSLY ROUTED TO THE INPUT 
*         QUEUE DURING THIS TIME CYCLE OF SKEDULR.
* 
          SA2    JCOUNT      GET COUNT OF JOBS ROUTED FOR THIS CYCLE
          SB1    1
          SB3    X2 
          ZR     B3,STEP5N4  FIRST JOB TO BE ROUTED 
          SB4    B3          HOLD JOB COUNT 
 STEP5N3  SA3    JTABLE-1+B4 GET NEXT JOB NAME
          SB4    B4-B1
          BX3    X6-X3
          ZR     X3,STEP5N6  MATCH FOUND.. GO CHECK 1RUN SWITCH 
          NZ     B4,STEP5N3  SEARCH NOT COMPLETE YET
 STEP5N4  SB3    B3+B1       INCREMENT JOB COUNTER
          SX7    B3 
          SB4    99          CHECK TABLE LIMIT
          GT     B3,B4,STEP5N5   QUIT INCREMENTING TABLE INDEX
          SA7    A2 
 STEP5N5  SA6    B3+JTABLE-1 SAVE NEW JOB NAME SENT 
          EQ     STEP5N7     GO START THE TASK
 STEP5N6  SA2    SWITCH      CHECK 1RUN SWITCH
          ZR     X2,STEP5M   TASK ALREADY RUN ON THIS CYCLE SO SKIP TASK
 STEP5N7  BSS    0
          ENDIF 
          IFEQ   NOSBE,1
          SA2    CRKBUF+1    SUBMIT FILE NAME 
          BX6    X2          FILE NAME MINUS COMPLETE BIT 
          SA6    ROUTPAR+3   JOB NAME TO ROUTE PARAMETER BLOCK
          SA6    TASKFDB     LOGICAL FILE NAME TO FDB 
          SA6    TASKFDB-4   PERMANENT FILE NAME TO FDB 
          SX7    BUFTASK     SET IN = OUT FOR ... 
          SA7    TASK+2      TASK FILE
          SA7    A7+B1
          SX7    BUFQUE 
          SA7    QUEFILE+2   AND QUEFILE
          SA7    A7+B1
          ENDIF 
          SX6    A1 
          SA6    SAVEA1      SAVE CURRENT POINTER TO CRKBUF 
          IFEQ   NOS,1
          GET    TASK,TASK
* 
*         SET THE JOB ORIGIN OF THE SUBMIT FILE TO SYSTEM OR LOCAL
*         BATCH BASED ON THE ORIGIN OF SKEDULR. 
* 
          GETJO  ORIGIN 
          SB1    1
          SA1    ORIGIN 
          SX6    B1 
          NZ     X1,STEP5O   IF NOT SYSTEM ORIGIN 
          SX6    B0 
 STEP5O   SA6    TASK+6      SET FILE TYPE TO SYSTEM OR LOCAL BATCH 
          SA6    TASKA+6
* 
*         DETERMINE IF THE SUBMIT FILE CONTAINS /JOB, /NOSEQ, /EOR
*         OR /EOF STATEMENTS.  IF SO, REMOVE THEM.
* 
          OPEN   TASK,READ,RECALL 
          REWIND TASK,RECALL
          READ   TASK,RECALL   PRIME THE BUFFER 
          READC  TASK,CLINE,9  READ FIRST LINE
          SA1    CLINE
          SA2    DJOB 
          MX0    24          FOUR CHARACTER MASK
          BX1    X0*X1
          BX2    X2-X1
          NZ     X2,STEP5S   IF FIRST CARD IS NOT /JOB
          OPEN   TASKA,WRITE,RECALL 
 STEP5P   READC  TASK,CLINE,9 
          NG     X1,STEP5R   IF EOR/EOF 
          NZ     X1,STEP5R   IF END OF RECORD 
          SA1    CLINE
          SA2    DEOR 
          SA3    DEOF 
          SA4    DNOSEQ 
          MX0    36 
          BX1    X0*X1
          BX4    X1-X4
          ZR     X4,STEP5P   SKIP THIS CARD IF /NOSEQ CARD
          MX0    24          FOUR CHARACTER MASK
          BX1    X0*X1
          BX4    X1-X2
          ZR     X4,STEP5Q   IF /EOR
          BX4    X1-X3
          ZR     X4,STEP5R   IF /EOF
          WRITEC TASKA,CLINE,9   WRITE THE LINE AS-IS 
          EQ     STEP5P      CONTINUE TO END-OF-RECORD/FILE 
  
 STEP5Q   WRITER TASKA,RECALL   WRITE AN END-OF-RECORD
          EQ     STEP5P      CONTINUE TO END-OF-RECORD/FILE 
  
 STEP5R   WRITEF TASKA,RECALL   WRITE AN END-OF-FILE
          REWIND TASKA,RECALL 
          IFEQ   NOS+NOS1,2,8 
          SUBMIT TASKA       SUBMIT THE ALTERNATE TASK FILE 
          SA1    TASKA+6
          BX6    X1 
          SA6    TASK+6      SAVE JOB NAME ASSIGNED TO THE TASK 
          EQ     STEP5T 
  
 STEP5S   REWIND TASK,RECALL
          SUBMIT TASK 
          IFEQ   NOS+NOS1,1,5 
          SA1    TASKA
          MX0    42 
          BX6    X0*X1
          SA6    ROUTEP      SAVE FILE NAME IN ROUTE PARAMETER BLOCK
 STEP5S   SX0    1S11        FORCED ORIGIN FLAG 
          SA1    ROUTEP      ROUTE PARAMETER
          BX6    X0+X1       ADD FLAG 
          SA6    ROUTEP      RESTORE PARAM
          ROUTE  ROUTEP,RECALL  ROUTE JOB TO INPUT QUEUE
          ENDIF 
          IFEQ   NOSBE,1
          ATTACH TASKFDB     GET THE TASK PERMANENT FILE
          REQUEST  REQPAR,RECALL  GET A FILE ON THE QUE SET 
          REWIND  TASK,RECALL 
          READ   TASK,RECALL FILL THE BUFFER FROM THE TASK FILE 
          READIN TASK        FILL THE WORKING BUFFER
          SA1    CLINE
          SA2    DJOB 
          MX0    24 
          BX1    X0*X1       MASK FIRST 4 CHARACTERS READ 
          BX6    X2-X1
          SA6    JOBFLAG     SET/CLEAR THE /JOB FLAG
          ZR     X6,STEP5NB  IF FIRST CARD IS /JOB, READ NEXT CARD
 STEP5NA  WRITOUT QUEFILE    WRITE WHAT WAS READ TO THE QUEFILE 
 STEP5NB  READIN TASK 
          NG     X1,STEP5ND  IF END OF INFORMATION
          NZ     X1,STEP5NC  IF END OF RECORD 
          SA1    JOBFLAG
          NZ     X1,STEP5NA  IF NOT TESTING FOR /EOR OR /EOF CARDS
          SA1    CLINE
          SA2    DEOR 
          SA3    DEOF 
          SA4    DNOSEQ 
          MX0    36 
          BX1    X0*X1
          BX4    X1-X4
          ZR     X4,STEP5NB  SKIP THIS CARD IF /NOSEQ CARD
          MX0    24 
          BX1    X0*X1
          BX4    X1-X3
          ZR     X4,STEP5ND  IF /EOF CARD 
          BX4    X1-X2
          NZ     X4,STEP5NA  IF NOT /EOR CARD 
 STEP5NC  WRITER QUEFILE,,RECALL  WRITE AN END-OF-RECORD ON QUEFILE 
          EQ     STEP5NB     READ NEXT RECORD FROM TASK FILE
  
 STEP5ND  WRITEF QUEFILE,RECALL  WRITE THE EOF ON QUEFILE 
          CLOSE  TASK,RETURN,RECALL  RETURN THE TASK FILE 
          ROUTE  ROUTPAR,RECALL  SEND THE TASK TO THE INPUT QUE 
          ENDIF 
          IFEQ   NOS,1,1
 STEP5T   SA1    TASK        FILE NAME SUBMITTED
          MX0    42 
          BX1    X0*X1       FILE NAME LESS COMPLETE BIT AND STATUS 
          SX2    55B         BLANK
          SB1    1
          SB2    B0 
          SB3    10          NUMBER OF CHARACTERS/WORD
          SX0    77B         CHARACTER MASK 
 STEP5U   LX1    6
          BX3    X1*X0
          NZ     X3,STEP5V   IF A NON-ZERO CHARACTER
          BX1    X1+X2       CONVERT 00 CHARACTERS TO BLANKS
 STEP5V   SB2    B2+B1
          NE     B2,B3,STEP5U   IF ALL CHARACTERS NOT DONE
          LX1    54 
          BX6    X1 
          SA6    MSG1+3      SAVE NAME OF JOB SUBMITTED 
          DATE   MSG1        ADD CURRENT DATE TO MESSAGE
          CLOCK  MSG1+1      ADD CURRENT TIME OF DAY TO MESSAGE 
          IFEQ   NOS,1
          IFEQ   NOS+NOS1,2,1 
          SA1    TASK+6      GET JOB NAME ASSIGNED TO THE TASK
          IFEQ   NOS+NOS1,1,1 
          SA1    ROUTEP      GET JOB NAME ASSIGNED TO TASK
          ENDIF 
          IFEQ   NOSBE,1
          SA1    ROUTPAR     GET JOB NAME ASSIGNED TO THE TASK
          ENDIF 
          SA2    MSG1+4 
          MX0    42 
          BX1    X0*X1       MASK FILE NAME 
          MX0    18 
          BX2    X0*X2       MASK FILLER
          LX1    60-18       POSITION FILE NAME TO LOWER WORD 
          BX6    X1+X2       FORM TOTAL ENTRY 
          SA6    A2          SAVE ENTRY IN MESSAGE
          SA1    MSG1 
          RJ     PRINT       PRINT MSG1 
          IFEQ   NOSBE,1
          SA1    REQPAR      MASK OFF COMPLETE BIT FROM...
          MX0    42 
          BX6    X1*X0
          SA6    A1          REQUEST PARAMETER BLOCK
          SA6    ROUTPAR     AND ROUTE PARAMETER BLOCK
          ENDIF 
          SA1    SAVEA1      RESTORE POINTER TO CRKBUF
          SA1    X1 
          SB1    1
          EQ     STEP5M      CONTINUE SCANNING THE CURRENT ENTRY
          IFEQ   NOS,1
  
 STEP5W   SA4    TTIME       NEXT CALCULATED ROLLIN TIME
          IX5    X6-X3       REQUESTED TIME - CURRENT TIME
          NG     X5,STEP5M   IF CURRENT TIME IS .GT. REQUEST
          IX5    X4-X6       ROLLIN TIME - REQUESTED TIME 
          NG     X5,STEP5M   IF CURRENT ROLLIN TIME IS STILL SMALLEST 
          SA6    A4          SAVE CURRENT REQUEST AS NEW ROLLIN TIME
          EQ     STEP5M      PROCESS NEXT TIME ENTRY FOR THIS TASK
          ENDIF 
  
 STEP5Z   DATE   MSG2 
          CLOCK  MSG2+1 
          SA1    MSG2 
          RJ     PRINT       PRINT MSG2 - INVALID RUN MESSAGE 
          SA1    XKEY 
          RJ     PRINT       PRINT THE INVALID DIRECTIVE
          SX6    77B
          SA6    ERRFLAG     INDICATE ERRORS REPORTED TO OUTPUT 
          EQ     STEP5       READ NEXT LINE FROM JOBS FILE
  
*IF DEF,NOS 
***   6. SET PREVIOUS TIME TO CURRENT TIME AND WRITE DATE/TIME STAMP
*        ON TFILE TO TERMINATE ANY OTHER COPIES OF SKEDULR THAT MIGHT 
*        BE EXECUTING.  PRINT THE OUTPUT FILE IF ERRORS OCCURRED ON 
*        THIS PASS.  THEN ROLLOUT FOR 15 MINUTES OR THE TIME
*        BETWEEN NOW AND THE NEXT REQUEST, WHICHEVER IS SMALLEST. 
*        WHEN EXECUTION IS RESUMED, GO TO STEP 2. 
*ENDIF
*IF DEF,NOSBE 
***    6. RECORD THE CURRENT TIME AND DATE ON THE TIME FILE.  CALL
*         APR TO KILL THE OUTPUT FOR THIS JOB IF NO ERRORS REPORTED 
*         TO THE DAYFILE. 
*ENDIF
  
 STEP6    SA1    EMPTY       JOBS FILE EMPTY FLAG 
          NZ     X1,STEP6AA  IF JOBS FILE IS NOT EMPTY
          SA1    MSG4 
          RJ     PRINT       INDICATE NO JOBS TO BE SCHEDULED 
          MX6    48 
          SA6    ERRFLAG     SET ERROR FLAG TO FORCE PRINTING OUTPUT
 STEP6AA  SA1    CTIME
          BX6    X1 
          SX1    X1-1440
          NZ     X1,STEP6A   IF NOT 2400 HOURS
          SX6    B0          SET IT TO 0000 HOURS 
          IFEQ   NOS,1
 STEP6A   SA6    PTIME
          NZ     X6,STEP6B   IF NOT MIDNIGHT
          SX7    2*60        SET TO ROLLIN IN 2 MINUTES 
          EQ     STEP6C 
  
 STEP6B   SA1    TTIME       NEXT CALCULATED ROLLIN TIME
          IX1    X1-X6       ROLLIN TIME - CURRENT TIME 
          SX2    X1-15
          SX7    15*60       PREPARE FOR 15 MINUTES LATER ROLLIN
          PL     X2,STEP6C   IF ROLLIN TIME .GT. 15 MINUTES 
          SX7    60 
          IX7    X7*X1       CONVERT TIME TO SECONDS
 STEP6C   SA1    OUTTIME
          MX0    48 
          BX1    X0*X1       SAVE ALL BUT THE TIME
          BX7    X1+X7
          SA7    A1          SAVE NEW ROLLOUT TIME
          REWIND  TFILE,RECALL
          DATE    CLINE 
          CLOCK   CLINE+1 
          WRITEC  TFILE,CLINE,9   PUT NEW DATE/TIME STAMP ON TIME FILE
          WRITER  TFILE,RECALL
          REPLACE TFILE 
          SA1    ERRFLAG
          ZR     X1,STEP6D   IF NO ERRORS RECORDED ON OUTPUT
          CLOSE  LIST,NR,RECALL 
          IFEQ   NOS+NOS1,2,1 
          RELEASE  LIST,PRINT 
          IFEQ   NOS+NOS1,1,5 
          SA1    ROUTEL 
          MX0    48 
          BX6    X0*X1       CLEAR COMPLETION BIT 
          SA6    ROUTEL 
          ROUTE  ROUTEL,RECALL  ROUTE LIST FILE TO OUTPUT 
* 
          OPEN  LIST,WRITE,RECALL 
 STEP6D   ROLLOUT OUTTIME 
          MX6    0
          SA6    ERRFLAG     CLEAR ERROR FLAG 
          EQ     STEP2
          ENDIF 
          IFEQ   NOSBE,1
STEP6A    SA6    BUFIN       PUT THE TIME IN THE BUFFER 
          PURGE  TFFDB,RC    PURGE THE OLD TIME FILE
          CLOSE  TFILE,RETURN,RECALL
          SX7    BUFIN
          SA7    TFILE+3     SET OUT = FIRST
          SX7    X7+2        SET IN = FIRST + 2 
          SA7    TFILE+2
          JDATE  BUFIN+1     PUT CURRENT DATE INTO TIME FILE BUFFER 
          REQUEST  TFREQ,RECALL  GET A PERM FILE FOR TIME FILE
          WRITEF  TFILE,RECALL   WRITE THE TIME TO THE NEW TIME FILE
          CATALOG  TFFDB     AND CATALOG IT 
          MX0    -1 
 STEP6A1  SA1    TFFDB       WAIT FOR COMPLETE BIT TO SET 
          BX1    -X0*X1 
          ZR     X1,STEP6A1  IF NOT COMPLETE
          CLOSE  TFILE,RETURN,RECALL   RETURN PERMANENT FILES 
          CLOSE  JOBS,RETURN,RECALL 
          SA1    ERRFLAG
          NZ     X1,STEP6B   SAVE THE OUTPUT IF DAYFILE ENTRIES 
          SYSTEM  APR,,,9    KILL THE OUTPUT AND DAYFILE
 STEP6B   ENDRUN             AND GO AWAY
          ENDIF 
          TITLE  COMMON SUBROUTINES 
          EJECT 
**
*         CRACK - CRACK CHARACTER STRING
* 
*         J.E. SIPPER  76/12/08.
* 
*         CRACK A CHARACTER STRING INTO A WORD STRING.  THE 
*         FOLLOWING ARE CONSIDERED DELIMITERS, TERMINATE A
*         STRING AND ARE CONSIDERED SEPERATE DATA ITEMS.
* 
*           +  -  *  /  (  )  $  =
* 
*         THE FOLLOWING ARE CONSIDERED DELIMETERS FOR A STRING, 
*         BUT ARE DISCARDED THEMSELVES. 
* 
*                 BLANK   COMMA    PERIOD 
* 
*         TWO BLANKS IN A ROW OR A ZERO BYTE TERMINATE THE CRACK. 
*         CRACK WILL ALSO TERMINATE AFTER 9 SOURCE WORDS HAVE BEEN
*         CRACKED.
* 
*         DELIMITERS THAT ARE STORED AS DATA ITEMS THEMSELVES ARE 
*         RIGHT JUSTIFIED ZERO FILLED IN THE WORD STRING EXCEPT FOR 
*         THE + AND - WHICH ARE LEFT JUSTIFIED.  ALL OTHER DELIMITER
*         ITEMS ARE LEFT JUSTIFIED, ZERO FILLED.
* 
*         ENTRY   DATA STRING TO BE CRACKED IS IN KEY BUFFER. 
* 
*         EXIT    WORD STRING IS IN CRKBUF WITH A ZERO WORD AT THE END
*                 OF THE STRING.
* 
*         ROUTINES CALLED - NONE
* 
*         DATA AREAS USED - KEY    - INPUT LINE IMAGE 
*                           CRKBUF - STORAGE FOR CRACKED DATA 
* 
*         USES    A - 1, 4, 5, 6, 7 
*                 X - 1, 2, 3, 4, 5, 6, 7 
*                 B - 1, 2, 3, 5, 6, 7
* 
*         MESSAGES -  NONE
* 
*         THE FOLLOWING REGISTERS ARE USED THROUGHOUT CRACK FOR THE 
*         FOLLOWING FUNCTIONS;
* 
*                                     X4 = CHARACTER MASK.
*           B5 = BLANK COUNTER.       X5 = CHARACTER CTR(SHIFT CNT) 
*           B6 = COMMA/PERIOD COUNTER X6 = ACCUMULATED DATA WORD. 
*           B7 = INDEX TO CRKBUF.     X7 = DATA MODE FLAG.
* 
* 
*       STEP 1 - CLEAR/SET COUNTERS, THEN STEP 2. 
* 
* 
 CRACK    DATA   0           ENTRY/EXIT 
          SB1    1
          SB2    KEY         FWA OF DATA TO CRACK 
          SB3    B0          SHIFT COUNT TO POSITION 1ST WORD 
          SB4    20          NUMBER OF WORDS TO CRACK 
          SX7    B2+8        SAVE TERMINATING SOURCE ADDRESS
          SA7    CRKA 
          SB5    B0          CLEAR BLANK COUNTER
          SB6    B0          CLEAR COMMA/PERIOD COUNTER 
          SB7    CRKBUF      SET INDEX TO CRKBUF
          SX4    77B         SET CHARACTER MASK 
          SX5    54          SET CHARACTER SHIFT COUNTER
          MX6    0           CLEAR DATA WORD
          MX7    0           CLEAR DATA MODE FLAG 
          SA1    B2          GET FIRST DATA WORD
  
* 
*       STEP 2 - GET A CHARACTER. GO TO STEP 6 IF A SPECIAL TERMINATOR
*                TO STEP 9 IF A BLANK TERMINATOR, TO STEP 3 IF A COMMA
*                OR PERIOD, OR TO STEP 5 IF DATA. 
* 
 CRK1     SB3    B3+6 
          SX3    B3-66
          NZ     X3,CRK2     IF ALL CHARACTERS NOT USED FROM THIS WORD
          SB3    6           RESET SHIFT COUNT FOR FIRST CHARACTER
          SB2    B2+B1       INCREMENT POINTER TO DATA
          SA1    B2          GET NEXT DATA WORD 
          SA3    CRKA 
          SX2    B2 
          BX3    X3-X2
          NZ     X3,CRK2     IF TERMINAL ADDRESS HAS NOT BEEN REACHED 
          SB4    B1          SET TERMINAL COUNT 
          EQ     CRK3        STORE CURRENT WORD AND EXIT
  
 CRK2     LX2    B3,X1
          BX2    X2*X4       GET A CHARACTER
          ZR     X2,CRK11    IF A ZERO CHARACTER THE SAME AS A BLANK
          SX3    X2-1R+ 
          NG     X3,CRK10    IF NOT A TERMINATOR
          SX3    X2-1R
          ZR     X3,CRK11    IF A BLANK 
          NG     X3,CRK6     IF A SPECIAL TERMINATOR
          SX3    X2-1R.-1 
          PL     X3,CRK10    IF NOT A TERMINATOR
  
*       STEP 3 - BUMP COMMA/PERIOD COUNTER, AND CLEAR BLANK COUNTER.
*                THEN STEP 10 IF NOT TWO OR MORE IN A ROW, ELSE STEP 4. 
* 
          SB6    B6+B1       BUMP COMMA/PERIOD COUNTER
          SB5    B0          CLEAR BLANK COUNTER
          EQ     B6,B1,CRK12 IF NOT TWO OR MORE IN A ROW
          SX6    1R0         DATA = 0 
          LX6    59-5 
  
*       STEP 4 - STORE DATA WORD AND BUMP POINTERS. CLEAR DATA MODE AND 
*                THE DATA WORD. 
* 
 CRK3     SA6    B7          STORE DATA WORD
          SB7    B7+B1       BUMP POINTER TO CRKBUF 
          MX7    0           CLEAR DATA MODE FLAG 
          MX6    0           CLEAR DATA WORD
          SX5    54          RESET SHIFT COUNT
  
*       STEP 5 - DETERMINE IF ALL WORDS REQUESTED HAVE BEEN CRACKED OR
*                IF CRKBUF IS FULL. IF NEITHER, THEN STEP 2 TO GET NEXT 
*                CHARACTER. 
* 
 CRK4     SB4    B4-B1
          LE     B4,B0,CRK5  IF ALL DONE
          SX3    B7-CRKBUF-LCRKBUF
          NG     X3,CRK1     IF BUFFER IS NOT FULL
  
*       STEP 6 - ZERO NEXT WORD IN CRKBUF AND EXIT. 
* 
 CRK5     MX6    0
          SA6    B7 
          EQ     CRACK
  
*       STEP 7 - A SPECIAL TERMINATOR HAS BEEN DETECTED. STORE CURRENT
*                WORD IF DATA MODE AND BUMP POINTERS. 
* 
 CRK6     ZR     X7,CRK7     IF NOT DATA MODE 
          SA6    B7 
          SB7    B7+B1       INCREMENT CRKBUF POINTER 
          MX6    0           CLEAR DATA WORD
          SX5    54          RESET SHIFT COUNT
          SB4    B4-B1       DECREMENT WORDS TO CRACK 
 CRK7     SX3    X2-1R+ 
          ZR     X3,CRK8     IF + 
          SX3    X2-1R- 
          NZ     X3,CRK9     IF NOT - 
 CRK8     LX2    59-5        POSITION + OR - TO UPPER BYTE
 CRK9     BX6    X6+X2
          SA6    B7          STORE CHARACTER
          SB7    B7+B1       ADVANCE P
          MX7    0           CLEAR DATA MODE
          SB5    B0          CLEAR BLANK COUNTER
          SB6    B0          CLEAR COMMA/PERIOD COUNTER 
          MX6    0           CLEAR DATA WORD
          EQ     CRK4        TO DETERMINE IF ALL WORDS ARE DONE 
  
*      STEP 8 -  A NORMAL CHARACTER HAS BEEN FOUND.  CLEAR BLANK AND
*                COMMA/PERIOD CTR, SET DATA MODE, AND ADD CHARACTER TO
*                DATA STRING. IF THE DATA WORD IS NOT FULL, THEN STEP 2 
*                TO GET NEXT CHARACTER. OTHERWISE, STEP 4 TO STORE DATA 
*                ITEM.
* 
 CRK10    SB5    B0          CLEAR BLANK CTR
          SB6    X5          CHARACTER SHIFT COUNT
          SX7    B1          SET DATA MODE
          LX2    B6,X2       POSITION CHARACTER 
          SB6    B0          CLEAR COMMA/PERIOD COUNTER 
          BX6    X6+X2       ADD CHARACTER TO STRING
          SX5    X5-6        DECREMENT CHARACTER COUNTER
          PL     X5,CRK1     IF NOT FULL WORD 
          SX5    54          RESET CHARACTER SHIFT COUNT
          EQ     CRK3        TO STORE DATA WORD 
  
*      STEP 9 -  A BLANK HAS BEEN DETECTED.  BUMP THE BLANK CTR.
* 
 CRK11    SB5    B5+B1
  
*      STEP 10 - IF DATA MODE THEN STEP 4 TO STORE DATA WORD. IF NOT
*                STEP 5 IF TWO BLANKS IN A ROW, OTHERWISE, STEP 2 
*                TO GET NEXT CHARACTER. 
* 
 CRK12    NZ     X7,CRK3     IF DATA MODE 
          SX3    B5-2 
          NG     X3,CRK1     IF NOT TWO OR MORE BLANKS
          EQ     CRK5        TO ZERO FILL LAST WORD AND EXIT
  
          IFEQ   NOSBE,1
          EJECT 
**
*         CV6 - CONVERT TWO DIGIT DECIMAL DISPLAY CODED NUMBER
*               TO BINARY.
* 
*         ENTRY  X1 = DIGITS TO CONVERT(BITS 53-42) 
* 
*         EXIT   X6 = BINARY NUMBER 
*                X1 = SHIFTED LEFT EIGHTEEN PLACES
* 
*         REGISTERS USED
*         X - 0,1,2,3,6 
*         A - NONE
*         B - NONE
* 
CV6       DATA   0
          MX0    6
          LX0    6
          LX1    12 
          SX3    1R0
          BX2    X1*X0       TENS DIGIT TO X2 
          IX6    X2-X3       REMOVE DISPLAY CODE BIAS 
          SX2    10 
          IX6    X2*X6       MULTIPLY BY 10 
          LX1    6
          BX2    X1*X0       ONES DIGIT TO X2 
          IX2    X2-X3       REMOVE DISPLAY CODE BIAS 
          IX6    X6+X2       ADD ONES AND TENS
          EQ     CV6         EXIT 
          ENDIF 
          EJECT 
  
**
*         PRINT SUBROUTINE
* 
*         J.E. SIPPER     79/06/07
* 
*         SEND THE MESSAGE POINTED TO BY (A1) TO THE OUTPUT FILE. 
* 
*         ENTRY - (A1) POINTS TO MESSAGE TO BE PRINTED. 
* 
*         EXIT  - MESSAGE PRINTED.
* 
*         ROUTINES CALLED - NONE
* 
*         USES  - A - 1, 7
*                 X - 1, 7
*                 B - 1, 2, 3 
* 
 PRINT    BSSZ   1
          SB1    1
          SB2    CLINE
          SB3    CLINE+9
 PRINT1   BX7    X1 
          SA7    B2          MOVE MESSAGE TO CLINE BUFFER 
          SB2    B2+B1
          SA1    A1+B1
          NE     B2,B3,PRINT1  IF ALL WORDS NOT MOVED 
          IFEQ   NOS,1,2
          WRITEC LIST,CLINE,9 
          WRITER LIST,RECALL  WRITE LINE TO LIST FILE 
          IFEQ   NOSBE,1,2
          WRITOUT OUTPUT
          WRITER OUTPUT,,RECALL  WRITE LINE TO OUTPUT 
          EQ     PRINT       EXIT 
          EJECT 
  
**
*         TIME SUBROUTINE 
* 
*         J.E. SIPPER     79/06/07
* 
*IF DEF,NOS 
*         GET THE BINARY TIME-OF-DAY FROM THE SYSTEM AND CONVERT IT 
*         TO MINUTES PAST MIDNIGHT.  SAVE CURRENT BINARY DAY OF 
*         THE MONTH AND MONTH.
*ENDIF
*IF DEF,NOSBE 
*         GET THE TIME AND DATE FROM THE SYSTEM AND CONVERT THEM
*         TO THE BINARY DAY, MONTH, AND MINUTES PAST MIDNIGHT 
*ENDIF
* 
*         ENTRY  - NONE 
* 
*         EXIT   - (X6)     = MINUTES PAST MIDNIGHT 
*                  (BDAY)   = BINARY DAY OF THE MONTH 
*                  (BMONTH) = BINARY MONTH OF THE YEAR
* 
*IF DEF,NOS 
*         ROUTINES CALLED - NONE
*ENDIF
*IF DEF,NOSBE 
*         ROUTINES CALLED - CV6 
*ENDIF
* 
*         USES    A - 1, 7
*                 X - 0, 1, 2, 3, 6, 7
*                 B - NONE
* 
 TIME     BSSZ   1
          IFEQ   NOS,1
          PDATE  DAYTIME
          SA1    DAYTIME
          SX0    77B         TIME MASK
          AX1    6           GET RID OF SECONDS 
          BX2    X1*X0       MINUTES
          AX1    6           GET RID OF MINUTES 
          BX3    X1*X0       HOURS
          SX6    60 
          IX6    X6*X3       CONVERT HOURS TO MINUTES 
          IX6    X6+X2       TOTAL MINUTES PAST MIDNIGHT
          AX1    6
          BX7    X0*X1
          SA7    BDAY        SAVE BINARY DAY OF THE MONTH 
          AX1    6
          BX7    X0*X1
          SA7    BMONTH      SAVE BINARY MONTH OF THE YEAR
          ENDIF 
          IFEQ   NOSBE,1
          DATE   DAYTIME     GET THE DATE 
          SA1    DAYTIME
          RJ     CV6         CONVERT FIRST PARAMETER
          SA6    "D1"        AND SAVE IT IN YEAR, MONTH OR DAY
          RJ     CV6         CONVERT SECOND PARAMETER 
          SA6    "D2"        AND SAVE IT IN YEAR, MONTH OR DAY
          RJ     CV6         CONVERT THIRD PARAMETER
          SA6    "D3"        AND SAVE IT IN YEAR, MONTH OR DAY
          CLOCK  DAYTIME     GET THE TIME OF DAY FROM THE SYSTEM
          SA1    DAYTIME
          RJ     CV6         CONVERT HOURS
          BX7    X6          SAVE HOURS IN X7 
          RJ     CV6         CONVERT MINUTES
          SX3    60 
          IX7    X7*X3       CONVERT HOURS TO MINUTES 
          IX6    X6+X7       TOTAL MINUTES PAST MIDNIGHT
          ENDIF 
          EQ     TIME        EXIT WITH TIME IN X6 
          EJECT 
         TITLE  BUFFERS AND DEFINED DATA ITEMS
  
*         BUFFERS 
  
 BUFIN    BSSZ   65          INPUT BUFFER FOR JOBS
 LIN      EQU    *-BUFIN
 XKEY     VFD    60/10L             BLANKS FOR PRINTING KEY BUFFER
 KEY      BSSZ   9           WORKING STORAGE BUFFER FOR JOBS
 LKEY     EQU    *-KEY
 BUFTASK  BSSZ   65          BUFFER FOR SUBMIT FILES
 LTASK    EQU    *-BUFTASK
          IFEQ   NOSBE,1,2
 BUFQUE   BSSZ   65          BUFFER FOR SUBMIT FILES
 LQUE     EQU    *-BUFQUE 
 BUFOUT   BSSZ   65          BUFFER FOR ALTERNATE TASK FILE 
 LBOUT    EQU    *-BUFOUT 
 OUTBUF   BSSZ   65          BUFFER FOR OUTPUT FILE 
 LOUTB    EQU    *-OUTBUF 
          IFEQ   NOS,1,2
 TBUF     BSSZ   65          BUFFER FOR TFILE 
 LTBUF    EQU    *-TBUF 
 CLINE    BSSZ   9           WORKING STORAGE FOR SUBMIT FILE
 LCLINE   EQU    *-CLINE
 BDAY     BSSZ   1           BINARY DAY OF THE MONTH
 BMONTH   BSSZ   1           BINARY MONTH OF THE YEAR 
 BYEAR    BSSZ   1           BINARY YEAR
 D        EQU    BDAY 
 M        EQU    BMONTH 
 Y        EQU    BYEAR
 CDAY     BSSZ   1           CURRENT DAY-OF-THE-WEEK
 CRKBUF   BSSZ   20 
 LCRKBUF  EQU    *-CRKBUF    LENGTH OF CRACK BUFFER 
 CRKA     BSSZ   1           BUFFER FOR TERMINATING ADDRESS 
 CTIME    BSSZ   1           CURRENT TIME (MINUTES PAST MIDNIGHT) 
 DAYTIME  BSSZ   1           CURRENT DATE AND TIME IN BINARY
 EMPTY    BSSZ   1           JOBS FILE EMPTY FLAG 
 ERRFLAG  BSSZ   1            ERRORS REPORTED TO OUTPUT FLAG
 ID       BSSZ   1           SYSTEM ID
 JDAY     BSSZ   1           CURRENT JULIAN DATE
          IFEQ   NOS,1,1
 JSN      BSSZ   1           JSN OF THIS JOB
          IFEQ   NOSBE,1,1
 JOBFLAG  BSSZ   1           FLAG TO INDICATE /JOB CARD PRESENT 
          ENDIF 
          IFEQ   NOS,1
 ORIGIN   BSSZ   1           ORIGIN FLAG FOR SKEDULR
          IFEQ   NOS+NOS1,1,6 
 ROUTEP   BSSZ   1           ROUTE PARAMETER BLOCK (RETAIN ORDER) 
          VFD    24/0,12/2RIN,6/2,18/400422B     OPTIONS
          BSSZ   3           END OF PARAMETER BLOCK 
 ROUTEL   VFD    48/4LLIST,12/0  ROUTE PARAM. BLOCK (RETAIN ORDER)
          VFD    24/0,12/2RLP,6/2,18/422B    OPTIONS
          BSSZ   3            END OF PARAMETER BLOCK FOR LIST 
* 
 PDAY     BSSZ   1           CURRENT DAY/TIME STAMP 
          ENDIF 
          IFEQ   NOS+NOS1+NOS2+NOS3+NOS4+NOSBE+NOSBE4+NOSBE5+NOSBE6,2,1 
 OUTTIME  VFD    30/0,12/7700B,18/60*2    ROLLOUT TIME
          IFEQ   NOS+NOS1+NOS2+NOS3+NOS4,1,1
 OUTTIME  VFD    30/0,18/EXTM,12/60*2   ROLLOUT TIME
 PTIME    BSSZ    1          PREVIOUS TIME SKEDULR WAS EXECUTED 
 SAVEA1   BSSZ    1          SAVE BUFFER FOR A1 
          IFEQ   NOS,1
 TTIME    BSSZ    1          TARGET ROLLIN TIME 
          ENDIF 
 WRAP     BSSZ   1           CLOCK WRAP AROUND FLAG 
 DAT      VFD    60/2LAT
 DDAY     VFD    60/3LDAY 
 DEOF     VFD    60/4L/EOF
 DEOR     VFD    60/4L/EOR
 DJOB     VFD    60/4L/JOB
 DLAST    VFD    60/4LLAST
 DMONTH   VFD    60/7LMONTHLY 
 DNOSEQ   VFD    60/6L/NOSEQ
 DRUN     VFD    60/3LRUN 
 D1RUN    VFD    60/4L1RUN
* 
*         THE FOLLOWING TABLES (DAYS, MONTHS AND WEEKS) MUST
*         BE KEPT IN ORDER. 
* 
 DAYS     VFD    60/5LDAILY 
          VFD    60/6LSUNDAY
          VFD    60/6LMONDAY
          VFD    60/7LTUESDAY 
          VFD    60/9LWEDNESDAY 
          VFD    60/8LTHURSDAY
          VFD    60/6LFRIDAY
          VFD    60/8LSATURDAY
          VFD    60/8LWEEKDAYS
          VFD    60/8LWEEKENDS
 LDAYS    EQU    *-DAYS 
  
 MONTHS   VFD    60/7LJANUARY 
          VFD    60/8LFEBRUARY
          VFD    60/5LMARCH 
          VFD    60/5LAPRIL 
          VFD    60/3LMAY 
          VFD    60/4LJUNE
          VFD    60/4LJULY
          VFD    60/6LAUGUST
          VFD    60/9LSEPTEMBER 
          VFD    60/7LOCTOBER 
          VFD    60/8LNOVEMBER
          VFD    60/8LDECEMBER
 LMONTHS  EQU    *-MONTHS 
  
 WEEKS    VFD    60/5LFIRST 
          VFD    60/6LSECOND
          VFD    60/5LTHIRD 
          VFD    60/6LFOURTH
          VFD    60/5LFIFTH 
 LWEEKS   EQU    *-WEEKS
  
 NDAYS    DATA   31          NUMBER OF DAYS IN EACH MONTH (JAN-DEC) 
 FEB      DATA   28 
          DATA   31 
          DATA   30 
          DATA   31 
          DATA   30 
          DATA   31 
          DATA   31 
          DATA   30 
          DATA   31 
          DATA   30 
          DATA   31 
  
 MSG1     DIS    ,* XX/XX/XX. XX.XX.XX. SUBMITTED XXXXXXXXX = XXXXXXX*
 MSG2     DIS    ,* XX/XX/XX. XX.XX.XX. SKIPPED INVALID RUN DIRECTIVE*
          IFEQ   NOS,1,1
 MSG3     DIS   ,* MULTIPLE COPIES OF SKEDULR - THIS ONE TERMINATED*
 MSG4     DIS    ,* WARNING- JOBS FILE EMPTY- NO JOBS TO SCHEDULE*
          DATA   0
 SWITCH   BSS    1           1RUN SWITCH SET FOR EACH DIRECTIVE 
*                            ZERO = 1RUN AND NON-ZERO = RUN 
 JCOUNT   BSSZ   1
 JTABLE   BSS    100
          END    START
