CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C C JOB.NN -- BATCH JOB STARTUP PROCESSOR. C C COPYRIGHT (C) 1976 C DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. C C THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY C ON A SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH C THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS C SOFTWARE, OR ANY OTHER COPIES THEREOF, MAY NOT BE PRO- C VIDED OR OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON C EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO AGREES TO C THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE C SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC. C C THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE C WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A COM- C MITMENT BY DIGITIAL EQUIPMENT CORPORATION. C C DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY C OF ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C C 01 2-AUG-76 (EAG) INITIAL VERSION FOR XVM/RSX C MULTIACCESS. C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C C THIS PROGRAM USES THE FOLLOWING LUNS, WHICH HAVE BEEN C PREVIOUSLY ASSIGNED APPROPRIATELY BY THE BATCH HANDLER: C C 4 USED TO PRINT MESSAGES TO THE OPERATOR C TERMINAL. C C 12 USED TO READ INFORMATION LINES FROM THE C BATCH HANDLER. THESE LINES, DESCRIBED C BELOW, CONTAIN VARIOUS ACCOUNTING AND C JOB IDENTIFICATION INFORMATION. C C 13 USED TO ACCESS BATCH ACCOUNTING FILE. C C 16 USED TO PRINT MESSAGES TO THE LISTING C DEVICE. C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C C DECLARE VARIABLES INTO WHICH WE WILL READ THE BEGINNING C OF JOB INFORMATION: C INTEGER BEGTIM(4),JOBNUM,RUNBEG LOGICAL JOBCRD C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C C DECLARE VARIABLES INTO WHICH WE WILL READ THE C INFORMATION FROM THE JOB QUEUE NODE: C INTEGER FILTIM(4) DOUBLE INTEGER JBNAM1,JBNAM2 INTEGER JBID LOGICAL DLTFLG,OPRFLG,FRCFLG,SEQFLG LOGICAL HLDFLG,CCLFLG,UFDFLG INTEGER TIMEST,CLASS,MEMSIZ,SUBTIM(4) INTEGER INDEV,LSTDEV,LGNDEV INTEGER INUNT,LSTUNT,LGNUNT DOUBLE INTEGER INUFD,LSTUFD,LGNUFD C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C C DECLARE VARIABLE INTO WHICH WE WILL READ THE $JOB C CARD AND THE VARIABLE WHICH WILL HOLD THE ACCOUNT C NUMBER: C INTEGER JOBLIN(132),ACCNT C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C C DECLARE VARIABLES STORED IN BATCH ACCOUNTING FILE: C INTEGER JPDATE(6),ACTNUM DOUBLE INTEGER JOBS(100),RUNTIM(100) C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C C DECLARE OTHER VARIABLES: C LOGICAL UNUSED INTEGER I,J,K,L,M,N INTEGER HOUR,MIN1,MIN10,SEC1,SEC10 DOUBLE INTEGER MONTHS(12),FILNAM(2) DATA MONTHS / 'JAN', 'FEB', 'MAR', 'APR', 1 'MAY', 'JUN', 'JUL', 'AUG', 2 'SEP', 'OCT', 'NOV', 'DEC' / DATA FILNAM / 'USERS',' RSX' / C C FILNAM CONTAINS THE NAME OF THE BATCH ACCOUNTING C FILE. NOTE THAT THE FILE NAME (EXCLUDING THE FILE C EXTENSION) MUST BE FIVE OR FEWER CHARACTERS. THIS C MEANS THAT THE FIRST CHARACTER IN THE SECOND ENTRY C OF FILNAM MUST BE A SPACE. C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C C READ IN LINE CONTAINING BEGINNING OF JOB INFORMATION. C READ (12,200) BEGTIM,JOBNUM,RUNBEG,JOBCRD 200 FORMAT ((I3,I2,I2,I5),I5,I6,L1) C C THE VALUES READ IN ARE AS FOLLOWS: C C BEGTIM TIME & DATE AT BEGINNING OF JOB (I.E., C WHEN JOB... WAS CALLED). (SEE FORMAT C BELOW.) C C JOBNUM THE NUMBER OF THIS JOB WITHIN THE C CURRENT JOB FILE. THE FIRST JOB IN C A JOB FILE HAS JOBNUM=1. JOBNUM IS C INCREMENTED BY ONE FOR EACH SUBSEQUENT C JOB. C C RUNBEG ACCUMULATED JOB FILE RUN TIME WHEN THIS C JOB BEGAN. C C JOBCRD TRUE IF AND ONLY IF A $JOB CARD WAS C FOUND TO BEGIN THE JOB. C C RUNBEG IS SUBTRACTED FROM RUNEND (READ IN AS PART OF C JOB TERMINATION MESSAGE) TO DETERMINE THE NET JOB RUN C TIME. C C JOBCRD IS USED TO DETERMINE WHETHER OR NOT A $JOB CARD C MAY BE READ IN BY JOB.... IF JOBCRD IS TRUE, JOB... C READS IN THE $JOB CARD TO DETERMINE THE ACCOUNT C NUMBER TO WHICH THIS JOB WILL BE CHARGED. C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C C READ IN INFORMATION FROM JOB QUEUE NODE: C READ (12,300) FILTIM,JBNAM1,JBNAM2,JBID,DLTFLG,OPRFLG, 1 FRCFLG,SEQFLG,UNUSED,HLDFLG,CCLFLG, 2 UFDFLG,TIMEST,CLASS,MEMSIZ,SUBTIM,INDEV, 3 INUNT,INUFD,LSTDEV,LSTUNT,LSTUFD,LGNDEV, 4 LGNUNT,LGNUFD 300 FORMAT ((I3,I2,I2,I5),2A3,I6,8L1,I4,I1,I3, 1 (I3,I2,I2,I5),3(A2,A2,A3)) C C THE VALUES READ IN ARE AS FOLLOWS: C C FILTIM TIME & DATE WHEN BATCH SELECTED THIS C JOB FILE FOR EXECUTION. I.E., TIME C & DATE AT BEGINNING OF JOB FILE. C (SEE FORMAT BELOW.) C C JBNAM1 JOB FILE NAME. TWO WORDS, THREE C JBNAM2 CHARACTERS EACH. C C JBID JOB FILE SEQUENCE NUMBER OR JOB C ID (ASSIGNED BY QJOB DIRECTIVE). C C DLTFLG IF TRUE, JOB FILE WILL BE DELETED C AFTER IT IS EXECUTED. C C OPRFLG IF TRUE, AN OPERATOR MUST BE ON DUTY C WHEN THIS JOB IS RUN. C C FRCFLG IF TRUE, THIS JOB'S EXECUTION WAS C FORCED BY THE OPERATOR. C C SEQFLG IF TRUE, THIS JOB HAS BEEN SEQUENCED. C C UNUSED RESERVED C C HLDFLG SHOULD ALWAYS BE FALSE. C C CCLFLG SHOULD ALWAYS BE FALSE. C C UFDFLG IF TRUE, AN EXPLICIT LOGIN DISK, UNIT, C AND UFD WAS SPECIFIED. C C TIMEST JOB FILE TIME ESTIMATE OR TIME LIMIT. C ZERO IMPLIES THE DEFAULT (ASSEMBLY C PARAMETER TO BDRES) WILL BE USED. C C CLASS JOB CLASS. C C MEMSIZ MINIMUM CORE REQUIRED. 0 => 1K, C 127 => 128K. C C SUBTIM TIME & DATE WHEN JOB WAS SUBMITTED. C (SEE FORMAT BELOW.) C C INDEV JOB INPUT FILE DEVICE, UNIT, AND UFD. C INUNT INCLUDES TWO CHARACTER DEVICE NAME, C INUFD TWO DIGIT UNIT NUMBER, AND THREE C CHARACTER UFD NAME. C C LSTDEV JOB LISTING FILE DEVICE, UNIT, AND C LSTUNT UFD. INCLUDES TWO CHARACTER DEVICE C LSTUFD NAME, TWO DIGIT UNIT NUMBER, AND C THREE CHARACTER UFD NAME. C C LGNDEV LOGIN DEVICE, UNIT, AND UFD (IF C LGNUNT SPECIFIED). INCLUDES TWO CHARACTER C LGNUFD DEVICE NAME, TWO DIGIT UNIT NUMBER, C AND THREE CHARACTER UFD NAME. C C THE MAJORITY OF THE INFORMATION IN THIS MESSAGE IS C USED TO CALCULATE THE JOB PRIORITY (FOR SCHEDULING C PURPOSES), AND IS OF NO USE TO US HERE. C C JBID AND SUBTIM, TAKEN TOGETHER, CONSTITUTE A UNIQUE C IDENTIFIER FOR THE JOB FILE. THE JOB FILE SEQUENCE C NUMBER (JBID) IS ONE FOR THE FIRST JOB SUBMITTED C ON EACH DAY, AND IS INCREMENTED BY ONE FOR EACH C SUBSEQUENT JOB ON THE SAME DAY. C C IF UFDFLG IS FALSE, INDEV, INUNT, AND INUFD WILL BE C TO LOGIN TO TDV. IF THIS RESULTS IN AN ERROR, THE C SYSTEM DEFAULTS WILL BE USED (I.E., RESPOND TO TDV'S C LOGIN PROMPT WITH A NULL LINE). IF UFDFLG IS TRUE, C AN EXPLICIT LOGIN DEVICE, UNIT, AND UFD HAS BEEN C SPECIFIED, AND THEREFORE LGNDEV, LGNUNT, AND LGNUFD C WILL BE USED. IT THIS RESULTS IN AN ERROR, THE C JOB WILL BE TERMINATED. C C IF LSTDEV IS '@@', THE DEFAULT LISTING DEVICE (THE LINE C PRINTER) WILL BE USED. C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C C THROUGHOUT THIS PROGRAM, TIME & DATE IS REPRESENTED C IN A COMMON FORMAT. THE TIME & DATE IS CONTAINED C IN A 4 ELEMENT INTEGER ARRAY. ITS ENTRIES HAVE THE C FOLLOWING MEANING: C C ***TIM(1) YEARS SINCE 1900 (I.E., ZERO C MEANS 1900). C C ***TIM(2) MONTH (RANGE 1 TO 12). C C ***TIM(3) DAY (RANGE 1 TO 31). C C ***TIM(4) SECONDS SINCE MIDNIGHT (RANGE C 0 TO 86399). C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C C READ IN $JOB CARD (IF AVAILABLE) AND DETERMINE JOB C ACCOUNT NUMBER: C ACCNT=100 IF (.NOT. JOBCRD) GO TO 499 READ (12,400) JOBLIN 400 FORMAT (132A1) I=0 410 I=I+1 J=JOBLIN(I)[0:6] IF (J .NE. #40 .AND. J .NE. #11) GO TO 410 420 I=I+1 J=JOBLIN(I)[0:6] IF (J .EQ. #40 .OR. J .EQ. #11) GO TO 420 IF (J .LT. #60 .OR. J .GT. #71) GO TO 499 ACCNT=0 430 IF (ACCNT .LT. 100) ACCNT=ACCNT*10+J-#60 I=I+1 J=JOBLIN(I)[0:6] IF (J .GE. #60 .AND. J .LE. #71) GO TO 430 IF (J .NE. #40 .AND. J .NE. #11 .AND. 1 J .NE. #15 .AND. J .NE. #175) ACCNT=100 499 IF (ACCNT .LT. 1 .OR. ACCNT .GT. 100) ACCNT=100 C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C C CHECK IF THIS IS THE FIRST JOB IN A JOB FILE AND, C IF IT IS, PRINT THE "BEGIN JOB FILE" MESSAGE ON C THE OPERATOR'S TERMINAL. C IF (JOBNUM .NE. 1) GO TO 599 HOUR=FILTIM(4)/3600 MIN10=MOD(FILTIM(4),3600)/600 MIN1=MOD(FILTIM(4),600)/60 SEC10=MOD(FILTIM(4),60)/10 SEC1=MOD(FILTIM(4),10) I=SUBTIM(4)/3600 J=MOD(SUBTIM(4),3600)/600 K=MOD(SUBTIM(4),600)/60 L=MOD(SUBTIM(4),60)/10 M=MOD(SUBTIM(4),10) WRITE (4,500) HOUR,MIN10,MIN1,SEC10,SEC1,FILTIM(3), 1 MONTHS(FILTIM(2)),FILTIM(1),JBNAM1, 2 JBNAM2,SUBTIM(3),MONTHS(SUBTIM(2)), 3 SUBTIM(1),I,J,K,L,M,JBID 500 FORMAT (' ',/, 1 ' ',I2,':',2I1,':',2I1,' ',I2,'-',A3,'-',I2, 2 ' BATCH -- BEGIN JOB FILE " ',2A3, 3 ' JOB ".',/, 4 ' ',29X,'SUBMITTED ON ',I2,'-',A3,'-',I2, 5 ' AT ',I2,':',2I1,':',2I1,'.',/, 6 ' ',29X,'JOB FILE SEQUENCE NUMBER =',I6,'.') 599 CONTINUE C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C C PRINT "BEGIN JOB" MESSAGE ON OPERATOR'S TERMINAL. C HOUR=BEGTIM(4)/3600 MIN10=MOD(BEGTIM(4),3600)/600 MIN1=MOD(BEGTIM(4),600)/60 SEC10=MOD(BEGTIM(4),60)/10 SEC1=MOD(BEGTIM(4),10) IF (JOBCRD .AND. ACCNT .NE. 100) 1 WRITE (4,600) HOUR,MIN10,MIN1,SEC10,SEC1, 2 BEGTIM(3),MONTHS(BEGTIM(2)), 3 BEGTIM(1),ACCNT 600 FORMAT (' ',I2,':',2I1,':',2I1,' ',I2,'-',A3,'-',I2, 1 ' BATCH -- BEGIN JOB. ACCOUNT NUMBER =', 2 I3,'.') IF (JOBCRD .AND. ACCNT .EQ. 100) 1 WRITE (4,610) HOUR,MIN10,MIN1,SEC10,SEC1, 2 BEGTIM(3),MONTHS(BEGTIM(2)), 3 BEGTIM(1) 610 FORMAT (' ',I2,':',2I1,':',2I1,' ',I2,'-',A3,'-',I2, 1 ' BATCH -- BEGIN JOB. ***** ILLEGAL ', 2 'ACCOUNT NUMBER *****') IF (.NOT. JOBCRD) 1 WRITE (4,620) HOUR,MIN10,MIN1,SEC10,SEC1, 2 BEGTIM(3),MONTHS(BEGTIM(2)), 3 BEGTIM(1) 620 FORMAT (' ',I2,':',2I1,':',2I1,' ',I2,'-',A3,'-',I2, 1 ' BATCH -- BEGIN JOB. NO $JOB CARD.') C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C C PRINT JOB HEADER PAGE ON LISTING DEVICE: C WRITE (16,700) 700 FORMAT ('1',5(' XVM/RSX MULTIACCESS BATCH'), 1 15(/,' ',5(' XVM/RSX MULTIACCESS BATCH'))) HOUR=FILTIM(4)/3600 MIN10=MOD(FILTIM(4),3600)/600 MIN1=MOD(FILTIM(4),600)/60 SEC10=MOD(FILTIM(4),60)/10 SEC1=MOD(FILTIM(4),10) IF (JOBNUM .EQ. 1) 1 WRITE (16,710) HOUR,MIN10,MIN1,SEC10,SEC1, 2 FILTIM(3),MONTHS(FILTIM(2)), 3 FILTIM(1),JBNAM1,JBNAM2 710 FORMAT (4(' ',/), 1 ' ',I2,':',2I1,':',2I1,' ',I2,'-',A3,'-',I2, 2 ' BEGIN JOB FILE " ',2A3,' JOB ".') IF (JOBNUM .NE. 1) WRITE (16,799) HOUR=BEGTIM(4)/3600 MIN10=MOD(BEGTIM(4),3600)/600 MIN1=MOD(BEGTIM(4),600)/60 SEC10=MOD(BEGTIM(4),60)/10 SEC1=MOD(BEGTIM(4),10) WRITE (16,720) HOUR,MIN10,MIN1,SEC10,SEC1,BEGTIM(3), 1 MONTHS(BEGTIM(2)),BEGTIM(1), 2 JOBNUM,JBNAM1,JBNAM2 720 FORMAT (4(' ',/), 1 ' ',I2,':',2I1,':',2I1,' ',I2,'-',A3,'-',I2, 2 ' BEGIN JOB NUMBER',I5,' IN JOB FILE " ', 3 2A3,' JOB ".') IF (ACCNT .NE. 100) WRITE (16,730) ACCNT 730 FORMAT (4(' ',/), 1 ' ',20X,'ACCOUNT NUMBER',I3) IF (ACCNT .EQ. 100) WRITE (16,740) 740 FORMAT (4(' ',/), 1 ' ',20X,'***** ILLEGAL ACCOUNT NUMBER *****') WRITE (16,750) JBID 750 FORMAT (4(' ',/), 1 ' ',20X,'JOB FILE SEQUENCE NUMBER',I6) HOUR=SUBTIM(4)/3600 MIN10=MOD(SUBTIM(4),3600)/600 MIN1=MOD(SUBTIM(4),600)/60 SEC10=MOD(SUBTIM(4),60)/10 SEC1=MOD(SUBTIM(4),10) WRITE (16,760) SUBTIM(3),MONTHS(SUBTIM(2)),SUBTIM(1), 1 HOUR,MIN10,MIN1,SEC10,SEC1 760 FORMAT (4(' ',/), 1 ' ',20X,'JOB FILE SUBMITTED ON ',I2,'-', 2 A3,'-',I2,' AT ',I2,':',2I1,':',2I1,'.') IF (DLTFLG) WRITE (16,770) 770 FORMAT (4(' ',/), 1 ' ',20X,'JOB FILE WILL BE DELETED AFTER ', 2 'EXECUTION.') IF (.NOT. DLTFLG) WRITE (16,799) WRITE (16,790) 790 FORMAT (4(' ',/), 1 10(' ',5(' XVM/RSX MULTIACCESS BATCH'),/), 2 '1') 799 FORMAT (4(' ',/),' ') C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C C DETERMINE IF BATCH ACCOUNTING FILE EXISTS, ACCESS C THE ACCOUNTING FILE, THEN STORE THE CURRENT JOB'S C ACCOUNT NUMBER. C TEMP=' ' TEMP[0:20]=FILNAM(2)[7:27] CALL SEEK(13,FILNAM(1),TEMP,I) CALL WAITFR(I) IF (I .NE. -#13) GO TO 820 WRITE (4,810) 810 FORMAT (' ',20X,'BATCH -- NO ACCOUNTING FILE.') GO TO 899 820 CALL DEFINE (13,407,1,FILNAM,J,0,0,0,I) CALL WAITFR(I) IF (I .GT. 0) GO TO 840 I=-I WRITE (4,830) I WRITE (16,830) I 830 FORMAT (' ',19('*'),' BATCH -- ACCOUNTING FILE', 1 ' ACCESS ERROR ',10('*'),/, 2 ' ',19('*'),10X,'DEFINE EV = -',O6,10X, 3 10('*')) GO TO 899 840 READ (13'1,ERR=850) JPDATE,ACTNUM,JOBS,RUNTIM ACTNUM=ACCNT WRITE (13'1,ERR=870) JPDATE,ACTNUM,JOBS,RUNTIM GO TO 899 850 WRITE (4,860) WRITE (16,860) 860 FORMAT (' ',19('*'),' BATCH -- ACCOUNTING FILE', 1 ' READ ERROR ',10('*')) GO TO 899 870 WRITE (4,880) WRITE (16,880) 880 FORMAT (' ',19('*'),' BATCH -- ACCOUNTING FILE', 1 ' WRITE ERROR ',10('*')) 899 CONTINUE C C THE VALUES READ/WRITTEN FROM/TO THE ACCOUNTING C FILE ARE AS FOLLOWS: C C JPDATE TIME & DATE WHEN ACCOUNTING FILE C WAS LAST INITIALIZED, IN FORMAT C RETURNED BY LIBRARY SUBROUTINE C "DATE". C C ACTNUM THE ACCOUNT NUMBER OF THE CURRENTLY C RUNNING JOB. C C JOBS THE NUMBER OF JOBS WHICH HAVE BEEN C RUN UNDER EACH ACCOUNT NUMBER. C C RUNTIM THE TOTAL RUN TIME FOR ALL JOBS RUN C UNDER EACH ACCOUNT NUMBER. C C JOBS AND RUNTIM ARE BOTH ARRAYS WHICH USE THE ACCOUNT C NUMBER FOR A SUBSCRIPT. ACCOUNT NUMBER 100 IS USED C WHENEVER THE $JOB CARD HAS AN ILLEGAL ACCOUNT NUMBER C OR THE ACCOUNT NUMBER IS OTHERWISE UNAVAILABLE. C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C END