.TITLE BATREST .IDENT /V1.3/ ;******************************************************************* ; ; BATREST.TSK BATCH QUEUE RESTORE PROGRAM ; ; THIS PROGRAM IS RUN TO RESTORE ; THE STATE OF THE BATCH SYSTEM QUEUE FROM THE ; QUEUE SAVE FILE, LB0:[1,54]BATQUEUE.BAT PRODUCED BY ; BATSAVE.TSK. THE BATCH QUEUE IS RESTORED WITH THE ; COMMAND: ; ; RUN LB0:[10,25]BATREST ; ; ; D.J. STEINFELD, JULY 1980 ; ;******************************************************************* .MCALL SPWN$,DIR$,EXST$,QUEDF$,EXST$S .MCALL STSE$S, QIOW$ .MCALL OPEN$R, OPEN$W, CLOSE$, GET$, PUT$, DELET$ .MCALL FSRSZ$, FDBDF$, FDAT$A, FDRC$A, FDOP$A .MCALL FDBF$A, FINIT$ .MCALL FDAT$R, FDRC$R, FDOP$R, FDBF$R QUEDF$ ; DEFINE JOB PACKET OFFSETS ;****** SYMBOLS IN COMMON WITH BATCH AND BATMAN ; ; DO NOT CHANGE THESE SYMBOLS WITHOUT A CORRESPONDING CHANGE IN BATCH ; AND BATMAN!!! ; P$$ARM= 10. ;IF THIS SYMBOL IS DEFINED, BATREST ;WILL RECONSTRUCT PARAMETER LISTS. ;THE VALUE OF THE SYMBOL IS THE MAXIMUM ;LENGTH OF EACH PARAMETER. THIS VERSION ;SUPPORTS FOUR PARAMETERS ;****** END OF COMMON SYMBOLS CR = 15 ; CARRIAGE RETURN LF = 12 ; LINE FEED ESC = 33 ; ESCAPE SPA = 40 ; SPACE TIOEFN = 1 ; EVENT FLAG FOR TI: I/O QFLEFN = 2 ; EVENT FLAG FOR BATCH QUEUE FILE READS BATEFN = 3 ; EVENT FLAG FOR SPAWN WAIT BTMEFN = 4 ; EVENT FLAG FOR BATCH TEMP FILE I/O TIOLUN = 1 ; TI: LOGICAL UNIT NUMBER QFLLUN = 2 ; QUEUE FILE LUN BTMLUN = 3 ; BATCH TEMP FILE LUN TKPS = 60. ; TICKS PER SECOND ; ; MACROS ; .MACRO PRINT$ MSG,MSGSZ,VFC MOV MSG,TERMIO+Q.IOPL MOV MSGSZ,TERMIO+Q.IOPL+2 .IF B VFC MOV #40,TERMIO+Q.IOPL+4 .IFF MOV VFC,TERMIO+Q.IOPL+4 .ENDC DIR$ #TERMIO .ENDM ;CARRIAGE CONTROL ARGS FOR PRINT$ NOCR= 0 ; NO CARRIAGE RETURN .MACRO ERROR$ ERR,ERRA MOVB F.ERR(R0),R1 MOV ERRA,R0 CALL $FCSER SUB ERR,R0 PRINT$ ERR,R0 .ENDM ; ; FORMAT OF THE FOLLOWING STORAGE ALLOCATIONS MUST BE THE SAME ; AS DEFINED BY THE QUEDF$ MACRO ; LNK: .BLKW 1 ; STORAGE FOR LINK WORD UCB: .BLKW 1 ; UCB ADDRESS OF BATCH STREAM JOBN: .BLKW 1 ; JOB NUMBER LUIC: .BLKW 1 ; LOGON UIC DUIC: .BLKW 1 ; COMMAND FILE DIRECTORY MASK: .BLKW 1 ; JOB MASK WORD DEVN: .BLKW 1 ; ASCII JOB FILE DEVICE NAME DEVU: .BLKW 1 ; BINARY JOB FILE DEVICE NUMBER FNAM: .BLKW 3 ; RADIX 50 JOB FILE NAME FTYP: .BLKW 1 ; RADIX 50 JOB FILE TYPE FVER: .BLKW 1 ; BINARY JOB FILE VERSION NUMBER PSWD: .BLKW 3 ; ASCII PASSWORD TIME: .BLKW 2 ; TIME LIMIT (FORMAT DEPENDS ON JOB ; STATUS) HOLD: .BLKW 2 ; HOLD TIME PARM: .BLKW 2 ; PARAMETER PACKETS LISTHEAD LINE: .BLKW 1 ; CURRENT OUTPUT COUNT MXLN: .BLKW 1 ; MAXIMUM ALLOWED OUTPUT COUNT .BLKW 10. ; EXTRA SPACE IN CASE JUNK IN FILE BUFLN= .-LNK ; LENGTH OF PACKET BUFFER PLUS SLOP NUMQ: .BLKW 1 ; NUMBER OF JOBS IN QUEUE NUMQLN= .-NUMQ NUMJ: .BLKW 1 ; NUMBER OF CURRENT JOB (IE NUMBER FOR /NEXTJOB) NUMJLN= .-NUMJ SKIPJ: .WORD 0 ; NO. EXECUTING JOBS NOT RESUBMITTED .IF DF P$$ARM PARBF: .BLKB
; ENOUGH ROOM FOR 4 PARAMETERS P$$ARM BYTES
; LONG, PLUS 3 SEPARATING COLONS AND A NULL
.BLKW 10. ; EXTRA SPACE IN CASE PARAMETER PACKET IS
; LONGER THAN EXPECTED.
PARBLN= .-PARBF ; LENGTH OF ENTIRE BUFFER
.ENDC ; DF P$$ARM
; BUFFER FOR GTIM$ FORMAT BLOCK FROM QUEUE SAVE FILE
DATBLK: .WORD 0 ; YEAR SINCE 1900
.WORD 0 ; MONTH (1-12)
.WORD 0 ; DAY (1-31)
TIMBLK: .WORD 0 ; HOUR (0-23)
.WORD 0 ; MINUTE (0-59)
.WORD 0 ; SECOND (0-59)
.WORD 0 ; TICK OF SECOND
.WORD 0 ; TICKS PER SECOND
DATBLN= .-DATBLK
;
; THE FOLLOWING BIT DEFINITIONS MUST BE THE SAME AS THOSE IN THE
; SOURCE LISTING FOR BAT.TSK
;
EXMASK = 20 ; /EX
TRMASK = 40 ; /TR
DEMASK = 100 ; /DE
HFMASK = 200 ; /HF
HUMASK = 400 ; /HU
LNMASK = 1000 ; /LN
RSMASK = 2000 ; /RS
KEMASK = 4000 ; /KE
NOMASK = 10000 ; /NO
MRKEXE = 40000 ; JOB IN EXECUTION
MRKABO = 100000 ; JOB MARKED FOR ABORT
.EVEN
;DIRECTIVE PARAMETER BLOCKS
SPWN: SPWN$ MCR...,,,1,54,BATEFN,,,CMD0,3,0
TERMIO: QIOW$ IO.WVB,TIOLUN,TIOEFN,,,,<0,0,40>
EXST: EXST$ EX$SUC ; EXIT WITH STATUS DPB
;FILE I/O DEFINITIONS SECTION
FSRSZ$ 2
;FDB AND OTHER BLOCKS FOR QUEUE SAVE FILE
$QFLDB: FDBDF$ ;FDB FOR QUEUE SAVE FILE
FDAT$A R.VAR ;VARIABLE LENGTH RECORDS
FDRC$A ;RECORD MODE
FDOP$A QFLLUN, QFLNAM,, FO.RD ;OPEN FOR READING
FDBF$A QFLEFN,,1. ;EVENT FLAG, NO MULTIBUFFERING
QFLNAM: .WORD DEVLN, DEVNM
.WORD UICLN, UICNM
.WORD QFLLN, QFLNM
.NLIST BEX
.ENABL LC
DEVNM: .ASCII /LB0:/
DEVLN= .-DEVNM
UICNM: .ASCII /[1,54]/
UICLN= .-UICNM
QFLNM: .ASCII /BATQUEUE.BAT/
QFLLN= .-QFLNM
;FDB AND ASSOCIATED BLOCKS FOR BATCH TEMP FILES
.LIST BEX
TMPFDB: FDBDF$
FDAT$A R.VAR
FDRC$A
FDOP$A BTMLUN, BTFILE,, FO.WRT ;OPEN FOR WRITING
FDBF$A BTMEFN,, 1. ;NO MULTIBUFFERING
.NLIST BEX
BTMNM: .ASCII /BATCHTEMP.CMD;*/
BTMLN= .-BTMNM
.EVEN
BTFILE: .WORD DEVLN, DEVNM
.WORD UICLN, UICNM
.WORD BTMLN, BTMNM
BTFIL1: .WORD DEVLN, DEVNM
.WORD UICLN, UICNM
.WORD BTM1LN, BTMNM1
BTMNM1: .ASCII /BATCHTEMP.CMD;1/
BTM1LN= .-BTMNM1
FILHED: .ASCII /BATREST -- /
FHDSZ= .-FILHED
FILBUF: .BLKB 85. ;TEMP FILE I/O BUFFER
;
; TEXT MESSAGES
;
SPE: .ASCII /BATREST -- Spawn error/
SPESZ=.-SPE
OPNER: .ASCII /BATREST -- Open failure file: BATQUEUE.BAT, FCS: /
OPNE1: .BLKB 6
TMPOP: .ASCII /BATREST -- Open failure on temp file, FCS: /
TMPO1: .BLKB 6
TIMER: .ASCII /BATREST -- Error reading time and date, FCS: /
TIME1: .BLKB 6
NUMER: .ASCII /BATREST -- Error reading number of jobs in queue, FCS: /
NUME1: .BLKB 6
NXTER: .ASCII /BATREST -- Error reading number of next job, FCS: /
NXTE1: .BLKB 6
PKREA: .ASCII /BATREST -- Error reading batch job packet, FCS: /
PKRE1: .BLKB 6
PKBAD: .ASCII /BATREST -- Invalid batch job packet/
PKBSZ= .-PKBAD
.IF DF P$$ARM
PARER: .ASCII /BATREST -- Error reading parameter block, FCS: /
PARE1: .BLKB 6
PARIN: .ASCII /BATREST -- Invalid parameter block for job:/
PARNSZ= .-PARIN
.ENDC ; DF P$$ARM
PUTTM: .ASCII /BATREST -- Error writing temp file, FCS: /
PUTT1: .BLKB 6
CLSTM: .ASCII /BATREST -- Error closing temp file, FCS: /
CLST1: .BLKB 6
DELTM: .ASCII /BATREST -- Error deleting temp file, FCS: /
DELT1: .BLKB 6
DELER: .ASCII /BATREST -- Error deleting all temp files, FCS: /
DELE1: .BLKB 6
NUMBR: .ASCII /BATREST -- Number of jobs in queue at time of save = /
NUMBR1: .ASCII /0000/
NSKIP: .ASCII /BATREST -- Number of executing jobs not resubmitted = /
NSKIP1: .ASCII /0000/
NXJX: .ASCII /BATREST -- /
CQRSZ=.-NXJX
NXJ: .ASCII %BAT /NEXTJOB:%
NXJ1: .ASCII /0000000/
SETX: .ASCII /BATREST -- /
SET0: .ASCII %SET /UIC=%
SET1: .ASCII /[GGG,MMM]/
CMDX: .ASCII /BATREST -- /
CMDXLN= .-CMDX
CMD0: .ASCII /BAT /
CMD0LN= .-CMD0
CMD1: .BLKB 200. ;ENOUGH ROOM FOR A LONG BATCH COMMAND
CMD2: .ASCII /BAT @LB:[1,54]BATCHTEMP/ ; CHECK LENGTH
BLOS 155$ ; LENGTH OK
PRINT$ #PARIN, #PARNSZ ; PRINT PARAMETER ERROR
153$: SUB #CMD1,R4 ; R4 HAS LENGTH OF COMMAND PROCESSED SO FAR
PRINT$ #CMD1,R4 ; PRINT THE ERROR
RETURN ; DON'T SUBMIT
155$: MOV R4,R0 ; RESTORE BUFFER POINTER
MOV #PARBF,R1 ; POINTER TO PARAMETER STRING
160$: MOVB (R1)+,(R0)+ ; COPY A BYTE
BNE 160$ ; IF NOT NULL, COPY ANOTHER BYTE
DEC R0 ; REMOVE NULL
.ENDC ; DF P$$ARM
180$: ;
;
; OUTPUT LIMITS
;
BIT #LNMASK,MASK ; /LN SPECIFIED?
BEQ 190$ ; NO
MOVB #'/,(R0)+ ; YES, INSERT /LN:
MOVB #'L,(R0)+ ;
MOVB #'N,(R0)+ ;
MOVB #':,(R0)+ ;
MOV MXLN,R1 ; GET LINE COUNT
CALL $DECML ; FORMAT AS DECIMAL
190$: MOVB #33,(R0)+ ; FINISH WITH A ESCAPE
;
; SPAWN BAT TO SUBMIT THE JOB
;
SUB #CMD0,R0 ; CALCULATE COMMAND LINE LENGTH
CMP R0, #70. ; COMPARE TO MAX (ALMOST) COMMAND LEN FOR SPWN
BHI 191$ ; TOO LONG, WRITE TO TEMP FILE
195$: MOV #SPWN,R4 ; GET SPAWN DPB ADDRESS
MOV R0,S.PWCL(R4) ; SET UP COMMAND LINE LENGTH
MOV #CMD0,S.PWCA(R4) ; AND ADDRESS
MOVB LUIC+1,S.PWUG(R4) ; SET GROUP CODE FOR SPAWN
MOVB LUIC,S.PWUM(R4) ; AND MEMBER CODE
ADD #CQRSZ,R0 ; UPDATE COMMAND LENGTH
PRINT$ #CMDX,R0 ; AND TYPE IT OUT
DIR$ R4 ; RESUBMIT THIS JOB
199$: BCC 200$ ; OK
PRINT$ #SPE,#SPESZ ;
BR 201$ ;
200$: STSE$S #BATEFN ;
201$: JMP RSJOBR ; AND RETURN
;
; BREAK THE LONG COMMAND LINE INTO SHORTER LINES WITH CONTINUATION DASHES.
; WRITE THESE LINES TO A TEMP FILE, AND SUBMIT AS INDIRECT FILE TO BAT
;
191$: MOV R0,R4 ; SAVE LENGTH OVER CALLS
DEC R4 ; REMOVE TERMINATING ESCAPE
;SINCE THE COMMAND LINE IS LONGER THAN THE LIMIT (79. CHARS), WE MUST
;DIVIDE THE LINE UP INTO SMALLER SEGMENTS, WRITE THEM TO A FILE, AND
;THEN FEED THIS FILE TO BAT AS AN INDIRECT COMMAND FILE.
MOV #TMPFDB,R0 ; FDB ADDRESS
FDAT$R R0 ; REINITIALIZE FDB
FDRC$R R0
FDOP$R R0, #BTMLUN, #BTFIL1,, #FO.WRT ;OPEN FOR WRITING
FDBF$R R0, #BTMEFN,, #1. ;NO MULTIBUFFERING
OPEN$W R0 ; OPEN A NEW TEMP FILE
BCC 194$ ; SUCCESSFUL OPEN
ERROR$ #TMPOP, #TMPO1 ; PRINT ERROR ON OPEN
PRINT$ #CMD0,R4 ; PRINT THE COMMAND THAT GOT THE ERROR
RETURN ; FORGET THIS JOB
194$: MOV #CMD1,R1 ; ADDRESS OF LONG COMMAND
CLR R5 ; FIRST COMMAND LINE FLAG
290$: TST R4 ; ANY CHARS LEFT TO MOVE?
BPL 295$ ; YES, MOVE THEM
JMP 400$ ; NO, ISSUE COMMAND
295$: MOV #FILBUF,R2 ; ADDRESS OF LINE BUFFER
MOV #60.,R3 ; MAX NUMBER OF CHARACTERS TO MOVE
SUB R3,R4 ; SUBTRACT 1 LINES WORTH OF CHARS FROM TOTAL
BPL 300$ ; WE HAVE 60 CHARS TO MOVE
ADD R4,R3 ; LESS THAN 60 CHARS, GET BACK ORIG. NUMBER
;LOOP TO MOVE R3 CHARACTERS FROM (R1) TO (R2)
300$: MOVB (R1)+,(R2)+ ; MOVE A BYTE
SOB R3,300$ ; DECREMENT COUNT AND LOOP IF MORE
MOVB #'-,(R2)+ ; APPEND A DASH TO INDICATE CONTINUATION
MOVB #CR,(R2) ; AND A CARRIAGE RETURN (NO + FOR PROPER LEN)
SUB #FILBUF,R2 ; NUMBER OF CHARACTERS IN LINE
PRINT$ #BATRLF,#BATRLN,#NOCR ; PRINT BATREST --
TST R5 ; FIRST LINE?
BNE 302$ ; NO, PRINT LINE
INC R5 ; YES, SHOW FIRST LINE PRINTED
PRINT$ #CMD0,#CMD0LN,#NOCR ; PRINT BAT
302$: PRINT$ #FILBUF, R2, #NOCR ; PRINT THE LINE
PUT$ #TMPFDB, #FILBUF, R2 ;WRITE LINE TO FILE
BCC 290$ ; WRITE OK, DO NEXT LINE
ERROR$ #PUTTM, #PUTT1 ; ERROR, PRINT TEXT AND ERROR CODE
305$: CLOSE$ #TMPFDB ; CLOSE FILE, DELETE IT AND EXIT
BCC 320$ ; CLOSE OK
310$: ERROR$ #CLSTM, #CLST1 ; ERROR ON CLOSE AS WELL
320$: DELET$ #TMPFDB ; DELETE FILE
BCC 330$ ; DELETED OK
ERROR$ #DELTM, #DELT1 ; ERROR ON DELETE AS WELL
330$: RETURN ; DONE WITH THIS JOB
;DONE WRITING COMMAND TO TEMP FILE. APPEND A CR, CLOSE IT, AND SUBMIT IT
; AS AN INDIRECT FILE TO BATCH. THIS IS DONE BY SPAWNING THE MCR,
; AND LETTING THE MCR SPAWN BATCH
400$: MOVB #CR,FILBUF ; PUT IN A CARRIAGE RETURN AT END
PUT$ #TMPFDB, #FILBUF, #1 ;WRITE OUT THE CHARACTER
BCC 401$ ; WRITE OK
ERROR$ #PUTTM, #PUTT1 ; OUTPUT ERROR
BR 305$ ; CONTINUE ERROR PROCESSING
401$: CLOSE$ #TMPFDB ; CLOSE THE TEMP FILE
BCS 310$ ; CLOSE ERROR
410$: MOV #SPWN,R4 ; SPAWN DPB
MOV #CMD2LN, S.PWCL(R4) ;LENGTH OF COMMAND
MOV #CMD2, S.PWCA(R4) ;ADDRESS OF COMMAND
MOVB LUIC+1, S.PWUG(R4) ;SPAWN GROUP CODE
MOVB LUIC+2, S.PWUM(R4) ;SPAWN MEMBER CODE
DIR$ R4 ; RESUBMIT JOB
BCC 420$ ; SPAWN OK
PRINT$ #SPE,#SPESZ ; PRINT ERROR
BR 430$ ; GO DELETE TEMP FILE
420$: STSE$S #BATEFN ; WAIT FOR BATCH TO COMPLETE
430$: DELET$ #TMPFDB ; DELETE BATCH TEMP FILE
BCC RSJOBR ; DELETED OK
ERROR$ #DELTM,#DELT1 ; ERROR ON DELETE, PRINT IT
RSJOBR: RETURN ; AND EXIT
.SBTTL TIME FORMAT ROUTINE
;+
; *** $TFRMT
;
; THIS ROUTINE CONVERTS A TIME IN BINARY TICKS TO
; ASCII MINUTES FOR JOB RESUBMISSION.
;
; INPUTS:
; R0 BUFFER POINTER
; R1 POINTER TO BINARY TIME
;
; OUTPUTS:
; R0 UPDATED
; R1,R2 USED
;
;-
$TFRMT: MOV R0,-(SP) ; SAVE R0
MOV 2(R1),R2 ; GET LOW ORDER TIME
MOV (R1),R1 ; AND HIGH ORDER
MOV #<60.*TKPS>,R0 ; GET NUMBER OF TICKS PER MINUTE
CALL $DDIV ; FIND TIME IN MINUTES
TST R2 ; WAS IT ZERO?
BNE 10$ ; NO
INC R2 ; YES, MAKE IT ONE
10$: MOV (SP)+,R0 ; RESTORE BUFFER POINTER
MOV R2,R1 ; COPY RESULT TO R1
BNE 15$ ; IF NON-ZERO OK
INC R1 ; ELSE MAKE SURE ITS AL LEAST 1
15$: CALLR $DECML ; AND FORMAT IT
.SBTTL FCS ERROR CODE FORMAT ROUTINE
;
; *** $FCSER
;
; THIS ROUTINE FORMATS THE FCS ERROR CODE
;
; INPUTS:
; R0 BUFFER POINTER
; R1 ERROR CODE
;-
$FCSER: CLR R2 ; SET NO LEADING ZEROES
CALL $CBDSG ; CONVERT TO DECIMAL (SIGNED)
MOVB #'.,(R0)+ ; INSERT DECIMAL POINT
RETURN ;
.END $CQREP