.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/ CMD2LN= .-CMD2 BATRLF: .ASCII /BATREST -- / BATRLN= .-BATRLF DATIME: .ASCII /BATREST -- Restore of batch queue saved on / DATBF: .ASCII / / .ASCII / at / TIMBF: .ASCII /00:00:00/ DATILN= .-DATIME .EVEN .SBTTL PRELIMINARY QUEUE RESTORE PROCESSING $CQREP: FINIT$ ;INIT FCS OPEN$R #$QFLDB ; OPEN QUEUE SAVE FILE BCC 5$ ; SUCCESSFUL OPEN ERROR$ #OPNER, #OPNE1 ; PRINT OPEN ERROR BR 14$ ; EXIT WITH SEVERE ERROR 5$: GET$ #$QFLDB, #DATBLK, #DATBLN ; READ GTIM$ DATE/TIME BLOCK BCC 7$ ; SUCCESSFUL READ ERROR$ #TIMER, #TIME1 ; PRINT ERROR BR 13$ ; CLOSE FILE AND EXIT 7$: MOV #DATBF,R0 ; ADDRESS FOR DATE STRING MOV #DATBLK,R1 ; ADDRESS OF DATE IN GTIM$ BLOCK CALL $DAT ; CONVERT TO DD-MMM-YY MOV #TIMBF,R0 ; ADDRESS FOR TIME STRING MOV #TIMBLK,R1 ; ADDRESS OF TIME IN GTIM$ BLOCK MOV #3,R2 ; CONVERT HOURS, MINUTES, SECONDS CALL $TIM ; CONVERT TO HH:MM:SS PRINT$ #DATIME, #DATILN ; PRINT QUEUE SAVE DATE AND TIME 10$: GET$ #$QFLDB, #NUMQ, #NUMQLN ;READ THE NUMBER OF JOBS IN QUEUE BCC 15$ ; OK ERROR$ #NUMER, #NUME1 ; PRINT NUMJOBS READING ERROR 13$: CLOSE$ #$QFLDB ; TRY TO CLOSE FILE--IGNORE ANY ERROR 14$: EXST$S #EX$SEV ; EXIT WITH SEVERE ERROR 15$: MOV NUMQ,R1 ; NUMBER OF JOBS IN QUEUE TO R1 MOV #NUMBR1,R0 ; GET BUFFER ADDRESS OF MESSAGE CALL $DECML ; FORMAT AS DECIMAL SUB #NUMBR,R0 ; CALCULATE MESSAGE SIZE PRINT$ #NUMBR,R0 ; AND TYPE IT OUT TST NUMQ ; WERE THERE ANY JOBS IN THE QUEUE? BNE 20$ ; IF NE YES DIR$ #EXST ; NO JOBS, EXIT WITH SUCCESS 20$: MOV #TMPFDB,R0 ; FDB ADDRESS FOR BATCH TEMP FILE MOV #F.FNB,R1 ; OFFSET TO FNB ADD R0,R1 ; ACTUAL FNB ADDRESS CLR R3 ; NO DEFAULT FNB CALL DELETE ; DELETE ALL OLD BATCH TEMP FILES CMP #IS.SUC,R2 ; DELETE SUCCESSFUL? BEQ 24$ ; YES MOV R2,F.ERR(R0) ; PUT ERROR CODE IN FDB FOR ERROR$ ERROR$ #DELER, #DELE1 ; OUTPUT AN ERROR BR 13$ ; EXIT WITH SEVERE ERROR 24$: GET$ #$QFLDB, #NUMJ, #NUMJLN ;READ THE NEXTJOB NUMBER BCC 25$ ; OK ERROR$ #NXTER, #NXTE1 ; PRINT NEXTJOB NUMBER ERROR BR 14$ ; EXIT WITH SEVERE ERROR 25$: MOV NUMJ,R1 ; NEXTJOB NUMBER TO R1 ADD #100,R1 ; BUMP JOB NUMBER UP A BIT MOV #NXJ1,R0 ; GET BUFFER ADDRESS FOR THIS MESSAGE CALL $OCTAL ; FORMAT AS OCTAL SUB #NXJ,R0 ; CALCULATE COMMAND LENGTH MOV #SPWN,R4 ; GET SPAWN DPB ADDRESS MOV R0,S.PWCL(R4) ; SET COMMAND LENGTH MOV #NXJ,S.PWCA(R4) ; AND ADDRESS ADD #CQRSZ,R0 ; INCLUDE LEADING CHARACTER COUNT PRINT$ #NXJX,R0 ; TYPE IT ALL OUT DIR$ R4 ; SPAWN IT BCC 21$ ; OK PRINT$ #SPE,#SPESZ ; SPAWN ERROR BR 22$ ; KEEP GOING 21$: STSE$S #BATEFN ; WAIT FOR IT 22$: GET$ #$QFLDB, #LNK, #BUFLN ;READ IN A JOB DESCRIPTOR PACKET BCC 30$ ; OK, KEEP GOING CMPB F.ERR(R0),#IE.EOF ;CHECK END OF FILE BNE 29$ ; ERROR OTHER THAN EOF MOV SKIPJ,R1 ; GET NUMBER OF EXECUTING JOBS NOT RESUBMITTED BEQ 28$ ; NO MESSAGE IF ALL SUBMITTED MOV #NSKIP1,R0 ; BUFFER ADDRESS FOR ASCII NUMBER CALL $DECML ; FORMAT AS DECIMAL SUB #NSKIP,R0 ; CALCULATE MESSAGE LENGTH PRINT$ #NSKIP, R0 ; TYPE IT OUT 28$: MOV #SET1,R0 ; GET BUFFER ADDRESS FOR UIC MOV #454,R3 ; SYSTEM UIC CALL $FUIC ; FORMAT IT SUB #SET0,R0 ; CALC COMMAND LENGTH MOV #SPWN,R4 ; SPAWN DPB ADDRESS MOV R0,S.PWCL(R4) ; SET UP COMMAND LENGTH MOV #SET0,S.PWCA(R4); AND COMMAND ADDRESS ADD #CQRSZ,R0 ; ADD IN "BATREST --" LENGTH PRINT$ #SETX,R0 ; TYPE OUT COMMAND MOV #454,S.PWUM(R4) ; SET SYSTEM UIC FOR MCR DIR$ R4 ; DO THE SET /UIC=[1,54] BCC 31$ ; SPAWN OK PRINT$ #SPE,#SPESZ ; SPAWN ERROR 31$: DIR$ #EXST ; EXIT WITH SUCCESS 29$: ERROR$ #PKREA, #PKRE1 ; PRINT ERROR MESSAGE BR 22$ ; TRY AGAIN 30$: CMP F.NRBD(R0),#Q.LGTH ; CHECK THAT THE PACKET SIZE IS CORRECT BEQ 35$ ; PACKET LENGTH CORRECT--ASSUME GOOD PRINT$ #PKBAD, #PKBSZ ; PRINT BAD PACKET MESSAGE BR 22$ ; TRY AGAIN 35$: CALL $RSJOB ; RESUBMIT THE JOB BR 22$ ; DO NEXT PACKET .SBTTL JOB RESUBMISSION ROUTINE ;+ ; *** $RSJOB ; ; THIS ROUTINE IS CALLED TO CONSTRUCT A BAT COMMAND ; TO RESUBMIT A JOB TO THE BATCH SYSTEM. ; ; INPUTS: ; NONE ; ; OUTPUTS: ; ALL REGISTERS CHANGED ; ;- $RSJOB: BIT #MRKABO,MASK ; WAS JOB MARKED FOR ABORT? BEQ 5$ ; NO 4$: INC SKIPJ ; COUNT JOBS NOT SUBMITTED JMP RSJOBR ; YES, FORGET IT 5$: BIT #MRKEXE,MASK ; WAS IT EXECUTING? BEQ 10$ ; NO, ALWAYS RESTORE IT BIT #RSMASK,MASK ; YES, WAS IT RESTARTABLE? BEQ 4$ ; NO TST TIME ; YES, TIME TO GO LESS THAN 18.2 MINS? BLE 4$ ; YES, DON'T RESUBMIT IT BIS #EXMASK,MASK ; SET IT EXPRESS IF NOT ALREADY 10$: MOV #SET1,R0 ; GET BUFFER ADDRESS FOR UIC MOV LUIC,R3 ; GET UIC TO SET CALL $FUIC ; FORMAT IT SUB #SET0,R0 ; CALCULATE COMMAND LENGTH MOV #SPWN,R4 ; GET SPAWN DPB ADDRESS MOV R0,S.PWCL(R4) ; SET UP COMMAND PARAMETERS MOV #SET0,S.PWCA(R4) ; ADD #CQRSZ,R0 ; UPDATE BYTE COUNT PRINT$ #SETX,R0 ; TYPE OUT COMMAND MOV #454,S.PWUM(R4) ; SET SYSTEM UIC DIR$ R4 ; SET THE UIC BCC 15$ ; OK PRINT$ #SPE,#SPESZ ; SPAWN ERROR BR 16$ ; 15$: STSE$S #BATEFN ; WAIT FOR SET 16$: MOV #CMD1,R0 ; GET COMMAND BUFFER ADDRESS ; ; INSERT DEVICE NAME ; MOVB DEVN,(R0)+ ; INSERT FIRST BYTE OF DEVICE NAME MOVB DEVN+1,(R0)+ ; AND SECOND BYTE MOV DEVU,R1 ; GET UNIT NUMBER CALL $OCTAL ; FORMAT AS OCTAL MOVB #':,(R0)+ ; INSERT DEVICE/UFD SEPARATOR ; ; INSERT DIRECTORY ; MOV DUIC,R3 ; GET DIRECTORY UIC CALL $FUIC ; FORMAT IT AS [G,M] ; ; INSERT FILENAME, FILETYPE AND VERSION NUMBER ; MOV #FNAM,R5 ; POINT R5 TO FILENAME STRING CALL $RAD50 ; CONVERT TO ASCII, CHARS. 1-3 CALL $RAD50 ; CHARS. 4-6 CALL $RAD50 ; CHARS. 7-9 MOVB #'.,(R0)+ ; NAME/TYPE SEPARATOR CALL $RAD50 ; CONVERT FILETYPE TO ASCII MOVB #';,(R0)+ ; TYPE/VERSION SEPARATOR MOV (R5),R1 ; GET VERSION NUMBER CALL $OCTAL ; FORMAT IT AS OCTAL ; ; INSERT PASSWORD SWITCH ; MOVB #'/,(R0)+ ; INSERT /PA: MOVB #'P,(R0)+ ; MOVB #'A,(R0)+ ; MOVB #':,(R0)+ ; MOV #PSWD,R1 ; POINT R1 TO PASSWORD MOV #6,R2 ; SET MAXIMUM BYTES TO MOVE 40$: MOVB (R1)+,(R0)+ ; MOVE A BYTE BEQ 45$ ; IF EQ, END OF PASSWORD DEC R2 ; ANY MORE BYTES TO MOVE? BNE 40$ ; YES, DO IT BR 50$ ; GO INSERT TIME LIMIT 45$: DEC R0 ; REMOVE NULL BYTE 50$: ; REF. LABEL ; ; INSERT TIME LIMIT ; MOVB #'/,(R0)+ ; INSERT /TL SWITCH MOVB #'T,(R0)+ ; MOVB #'L,(R0)+ ; MOVB #':,(R0)+ ; BIT #MRKEXE,MASK ; WAS JOB EXECUTING? BEQ 60$ ; NO MOV #TIME,R1 ; YES, POINT R1 TO TIME CALL $TFRMT ; AND FORMAT IT (MINUTES) BR 70$ ; CONTINUE 60$: MOV TIME+2,R1 ; GET TIME LIMIT IN MINUTES CALL $DECML ; FORMAT AS DECIMAL 70$: ; REF. LABEL ; ; INSERT HOLD TIME ; BIT #HFMASK!HUMASK,MASK ; WAS JOB IN HOLD? BEQ 80$ ; NO MOVB #'/,(R0)+ ; INSERT /HF: MOVB #'H,(R0)+ ; MOVB #'F,(R0)+ ; MOVB #':,(R0)+ ; MOV #HOLD,R1 ; POINT R1 TO HOLD TIME CALL $TFRMT ; FORMAT IT IN MINUTES 80$: ; REF. LABEL ; ; EXPRESS JOB ; BIT #EXMASK,MASK ; EXPRESS JOB? BEQ 90$ ; IF EQ NO MOVB #'/,(R0)+ ; INSERT /EX MOVB #'E,(R0)+ ; MOVB #'X,(R0)+ ; 90$: ; REF. LABEL ; ; DELETE COMMAND FILE AT END OF JOB ; BIT #DEMASK,MASK ; WAS /DE SPECIFIED? BEQ 100$ ; NO MOVB #'/,(R0)+ ; YES, INSERT /DE MOVB #'D,(R0)+ ; MOVB #'E,(R0)+ ; 100$: ; REF. LABEL ; ; TRACE COMMAND FILE EXECUTION ; BIT #TRMASK,MASK ; WAS /TR SPECIFIED? BEQ 110$ ; NO MOVB #'/,(R0)+ ; YES, INSERT /TR MOVB #'T,(R0)+ ; MOVB #'R,(R0)+ ; 110$: ; REF. LABEL ; ; RESTARTABLE JOBS ; BIT #RSMASK,MASK ; WAS JOB RESTARTABLE? BEQ 120$ ; IF EQ NO MOVB #'/,(R0)+ ; IF YES, INSERT /RS MOVB #'R,(R0)+ ; MOVB #'S,(R0)+ ; 120$: ; REF. LABEL ; ; LOG FILE DISPOSITION ; BIT #KEMASK,MASK ; WAS /KE SPECIFIED? BEQ 130$ ; IF EQ NO MOVB #'/,(R0)+ ; INSERT /KE MOVB #'K,(R0)+ ; MOVB #'E,(R0)+ ; 130$: BIT #NOMASK,MASK ; HOW ABOUT /NO BEQ 140$ ; NO (/NO?) MOVB #'/,(R0)+ ; THIS IS GETTING BORING MOVB #'N,(R0)+ ; MOVB #'O,(R0)+ ; 140$: ; YAWN .IF DF P$$ARM ; ; NOW THE DIFFICULT BIT (PARAMETER LISTS) ; TST PARM ; ANY PARAMETERS? BEQ 180$ ; NO IF EQ MOVB #'/,(R0)+ ; INSERT /PM: MOVB #'P,(R0)+ ; MOVB #'M,(R0)+ ; MOVB #':,(R0)+ ; MOV R0,R4 ; SAVE R0 OVER CALL GET$ #$QFLDB, #PARBF, #PARBLN ; READ THE PARAMETERS FROM ; QUEUE SAVE FILE BCC 150$ ; SUCCESSFUL READ ERROR$ #PARER, #PARE1 ; PRINT ERROR AND ERROR CODE BR 153$ ; PRINT THE JOB WITH THE ERROR AND RETURN 150$: CMP F.NRBD(R0),# ; 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