.TITLE START .IDENT /S1.4/ ;Derived from DECUS version M02 ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* * ;* General permission to copy (but not for profit) is hereby * ;* granted, provided that reference is made to the fact that * ;* reproduction privileges were granted by DECUS. * ;* * ;* The information in this document is subject to change with- * ;* out notice and should not be construed as a commitment by * ;* the contributor(s), DECUS or Digital Equipment Corporation. * ;* * ;* These parties make no warranty as to the suitability of this * ;* material for use by the recipient, nor as to the accuracy or * ;* functioning of the software or related material, and no * ;* responsibility is assumed in connection therewith. * ;* * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; RUNOFF START-UP INITIALIZATION ; ; AUTHOR: L. WADE 1-JUN-72 ; ; MODIFIED BY ; ; E. POLLACK U. OF W. 19-DEC-73 ; ; D. N. CUTLER 27-JUL-75 ; ; C. H. Spalding, Adept Technology, Jan. '83 ; ; MODIFICATIONS ; ; SIG01 CLEAN UP WAIT FUNCTION ; SIG02 RSTS CHANGES ; chs05 Make page size settings available to task build ; chs20 Add optional-text commands (added txtf flag) ; chs38 Don't output blank page at end of output ; chs39 Add PAGE FORMAT and related switches ; chs40 Expand HEADER ; chs45 Add optional-text command-line switches ; chs49 Allow multiple input files & appending to output ; chs50 Have task extend itself when index/footnote buffer full ; chs66 Check validity of /UL value ; chs72 Make sure empty output file not left around ; chs78 Add text queue & BLOCK ; revamp footnote processing ; chs81 Add /ID command line switch ; chs84 Add exit status ; ; MACRO LIBRARY CALLS ; .MCALL CLOSE$,CSI$,CSI$1,CSI$2,EXIT$S,GCMLD$ .MCALL GCML$,GPRT$S,GTSK$S,OPEN$A,OPEN$R,OPEN$W,PRINT$ .IIF NZ EXTEND, .MCALL EXTK$S ;chs50 .IIF NZ EXITST, .MCALL EXST$S ;chs84 CSI$ ;DEFINE CSI CONTROL BLOCK OFFSETS GCMLD$ ; ; LOCAL MACROS ; ; Error message output ; .MACRO MSGPUT NAM CALL $ERMSG .IRP R, ;chs84+ .WORD MG'R .ENDM ;chs84- .ENDM MSGPUT ; LOCAL DATA ; CSI control block .IF Z MULTIN ;PUT IN ROOT SEGMENT FOR ... ;chs49 CSIBLK: .BLKB C.SIZE ; ; Task memory limits LIMIT: .LIMIT ;SIG02 .ENDC ; Z MULTIN ; ... MULTIPLE INPUT FILES ;chs49 ; START-UP INITIALIZATION $START::MOV SP,SPSAV ;SAVE INITIAL STACK POINTER OPEN$W #TTBLK ;OPEN COMMAND OUTPUT FILE CLR TTBLK+F.NRBD ;CLEAR OUTPUT BUFFER ;chs62 RUNOFF::MOV SPSAV,SP ;RESET STACK POINTER .IIF NZ EXTEND, EXTK$S ;REDUCE TASK TO INSTALLED SIZE ;chs50 CALL $INITL ;INITIALIZE VARIABLES .IF NZ OPTXSW ;chs20+ MOV #INCL1,R0 ;POINT TO SWITCH VALUES MOV #NOPVAL,R1 ;NUMBER OF WORDS 5$: CLR (R0)+ ;CLEAR THEM ALL SOB R1,5$ .ENDC ; NZ OPTXSW ;chs20- .IF NZ MULTIN ;chs49 .ENABL LSB ;chs49 10$: ;RETURN HERE ON COMMAND ERROR ;chs49 .IF NZ DELOF ;chs72+ TSTEQB DELFLG,12$ ;NEED TO DELETE OUTPUT FILE? MOV #LSTBLK,R0 ; YES, DO IT CALL .DLFNB CLRB DELFLG ;ASSUME NO DELETION NEXT TIME 12$: .ENDC ; NZ DELOF ;chs72- CLRB INPUTN ;CLEAR MULTIPLE-INPUT COUNT ;chs49 RUNOF2: ;LOOP TO HERE FOR 2ND... INPUT FILE ;chs49 .IFTF ;chs49 CLOSE$ #TTLDMY ;CLOSE INPUT FILE .IFT ;chs49 TSTNEB INPUTN,35$ ;SKIP IF ANOTHER INPUT FILE ;chs49 .ENDC ; NZ MULTIN ;chs49 CLOSE$ #LSTBLK ;CLOSE LISTING FILE GCML$ #TTIBLK ;GET A COMMAND BCC 30$ CMPNEB #GE.EOF,G.ERR(R0),20$ ;NOT TOP LEVEL EOF CLOSE$ #TTBLK CLOSE$ #TTIBLK .IF NZ EXITST ;chs84+ MOV #1,R0 ;ASSUME SUCCESS STATUS MOVB EXSTAT,R1 ;GET INTERNAL STATUS BIC #177770,R1 ;CLEAR ALL EXTRA BITS BEQ 15$ ;DONE IF ZERO DEC R0 ;ASSUME WARNING STATUS ASR R1 ;SHIFT OUT LSB BEQ 15$ ;DONE IF NOW ZERO MOV #2,R0 ;ASSUME ERROR STATUS ASR R1 ;SHIFT AGAIN BEQ 15$ ;OKAY IF ZERO ASL R0 ;CHANGE STATUS TO 4 15$: EXST$S R0 ;EXIT WITH STATUS .IFF ;chs84- EXIT$S .ENDC ; -NZ EXITST ;chs84 20$: MSGPUT CMDE ;COMMAND ERROR BR 10$ 30$: MOV G.CMLD(R0),R1 ;GET BYTE COUNT BEQ 10$ CSI$1 #CSIBLK,TTIBLK+G.CMLD+2,R1 ;CHECK SYNTAX BCS 20$ .IF NZ MULTIN ;chs49+ CSI$2 #CSIBLK,OUTPUT,#SWTBL ;GET OUTPUT SPECIFICATION BCC 32$ 31$: MSGPUT ;OUTPUT FILE SPEC ERROR ;chs84 BR 10$ 32$: BITNEB #CS.MOR!CS.WLD,C.STAT(R0),31$ ;MORE OUTPUT FILES? .IF NZ IDSWCH ;chs81+ BITEQ #IDSW,$SWTCH,325$ ;SKIP IF NOT REQUEST FOR VERSION CALL $ERMSG ;OUTPUT STORED STRING LIKE ERROR .WORD VERSN BR RUNOFF ;RETURN TO START 325$: .ENDC ; NZ IDSWCH ;chs81- .IF NZ APNDSW ;chs49a+ BITEQ #APNSW,$SWTCH,33$ ;APPEND TO EXISTING FILE? OPEN$A #LSTBLK,,#CSIBLK+C.DSDS ; YES, OPEN WITH APPEND ACCESS BR 34$ .ENDC ; NZ APNDSW ;chs49a- 33$: OPEN$W #LSTBLK,,#CSIBLK+C.DSDS ;OPEN NEW FILE .IIF NZ DELOF, INCB DELFLG ;SET POSSIBLE DELETION ;chs72 34$: BCC 35$ MSGPUT ;OUTPUT FILE OPEN ERROR ;chs84+ .IF NZ EXITST BR 45$ .IFF ;chs84- BR 10$ .ENDC ; -NZ EXITST ;chs84 .IFTF ;chs49- 35$: CSI$2 #CSIBLK,INPUT,#SWTBL BCC 50$ 40$: MSGPUT ;INPUT FILE SPEC ERROR ;chs84 45$: .IF NZ IDSWCH ;chs81+ JMP 10$ .IFF ;chs81- BR 10$ .ENDC ; -NZ IDSWCH ;chs81 50$: .IFT ;chs49+ INCB INPUTN ;COUNT INPUT FILE BITNEB #CS.WLD,C.STAT(R0),40$ ;WILDCARD IN SPEC? CLRB LOOP ;ASSUME NO MORE INPUT FILES BITEQB #CS.MOR,C.STAT(R0),55$ ;MORE INPUT FILES? INCB LOOP ; YES, SET FLAG 55$: ; NO, LEAVE FLAG CLEAR .IFF ;chs49- BITNEB #CS.MOR!CS.WLD,C.STAT(R0),40$ ;MORE INPUT FILES? .IFTF ;chs49 OPEN$R #TTLDMY,,#CSIBLK+C.DSDS BCC 60$ MSGPUT ;INPUT FILE OPEN ERROR ;chs84 JMP 10$ ;chs49 60$: .IFF ;chs49 CSI$2 #CSIBLK,OUTPUT,#SWTBL BCC 80$ 70$: MSGPUT ;OUTPUT FILE SPEC ERROR ;chs84 BR 10$ 80$: BITNEB #CS.MOR!CS.WLD,C.STAT(R0),70$ ;MORE OUTPUT FILES? OPEN$W #LSTBLK,,#CSIBLK+C.DSDS BCC 100$ MSGPUT ;OUTPUT FILE OPEN ERROR ;chs84 BR 10$ 100$: .IFT ;chs49 .IIF NZ DELOF, CLRB DELFLG ;INPUT OKAY, PREVENT DELETION ;chs72 .IF NZ SAVPS ;chs49b+ CMPEQB #1,INPUTN,101$ ;ASSUME SWITCH USED ON FIRST INPUT FILE BITEQ #PSZSW,$SWTCH,106$ ;/PS USED? BIC #PSZSW,$SWTCH ;ERASE EVENT 101$: .ENDC ; NZ SAVPS ;chs49b- .ENDC ; NZ MULTIN ;chs49 MOV PRMRG,RMARG ;SET RIGHT MARGIN .IIF NZ EXTHDR, MOV PRMRG,HRMARG ;INITIALIZE HEADER RIGHT MARGIN ;chs40 .IIF NZ XHDRSW, MOV HDRLEN,$HDRSW ;TURN ON HEADERS ;chs40a .IF NZ PFCMD ;chs39+ MOV PNLPG,R3 ;GET PAGE LENGTH BNE 102$ ;SKIP IF NOT /PS::N CASE MOV #INLPG$,R3 ;REINITIALIZE INITIAL PAGE LENGTH 102$: .IF NZ TXLTST ;chs78e+ CALL SETNLP ;SET LINES PER PAGE .IFF ;chs78e- MOV R3,PNLPG ;STORE AS PERMANENT VALUE MOV R3,NLPG ; AND PAGE LENGTH .ENDC ; -NZ TXLTST ;chs78e .IFF ;chs39- TST PNLPG ;SEE IF /PS::N GIVEN BNE 105$ MOV #INLPG$,PNLPG ;REINITIALIZE INITIAL PAGE LENGTH ;chs05 105$: MOV PNLPG,NLPG ;AND PAGE LENGTH .ENDC ; -NZ PFCMD ;chs39 .IF NZ OPTXSW ;chs45+ 106$: BITEQ #OPTSW,$SWTCH,108$ ;SKIP IF NO OPTIONS SPECIFIED MOV #INCL1,R2 ;POINT TO TABLE OF INCLUDE VALUES MOV #1,R0 ;SET REAL OPTIONS TO THIS CALL OPTSET ;SET OPTIONS ACCORDING TO SWITCHES BCS 45$ ;QUIT IF ERROR (STACK OKAY) MOV #EXCL1,R2 ;POINT TO TABLE OF EXCLUDE VALUES CLR R0 ;SET REAL OPTIONS TO THIS CALL OPTSET ;SET OPTIONS ACCORDING TO SWITCHES BCS 45$ ;QUIT IF ERROR (STACK OKAY) 108$: .ENDC ; NZ OPTXSW ;chs45- .IIF NZ MULTIN, CLRB $ULMSW ;ASSUME NOT BACKSPACE MODE ;chs49 CMPNEB #'B,ULSWT,110$ ;NOT BACKSPACE MODE? COMB $ULMSW ;SET BACKSPACE MODE BR 130$ 110$: .IIF NZ MULTIN, CLRB $ULSSW ;ASSUME NOT SIMULATE MODE ;chs49 CMPNEB #'S,ULSWT,120$ ;NOT SIMULATE MODE? COMB $ULSSW ;SET SIMULATE SWITCH BR 130$ 120$: .IIF NZ MULTIN, CLRB $ULNSW ;ASSUME NOT DISABLED ;chs49 CMPEQB #'L,ULSWT,130$ ;LINE MODE? .IF NZ CKULSW ;chs66+ CMPEQB #'N,ULSWT,125$ ;NO UNDERLINING? MSGPUT ULSW ;OUTPUT ERROR 125$: ; AND DISABLE UNDERLINING .ENDC ; NZ CKULSW ;chs66- COMB $ULNSW ;SET NO UNDERLINE SWITCH 130$: .IF NZ MULTIN ;chs49+ CMPB INPUTN,#1 ;FIRST INPUT FILE? BGT 140$ ; NO, SKIP GTSK$S #LINBF ;GET TASK PARAMETERS MOV LINBF+G.TSTS,R4 ;GET SIZE OF TASK IN BYTES GPRT$S ,#LINBF ;GET STARTING VIRTUAL ADDRESS .IFF ;chs49- GTSK$S #CSIBLK ;GET TASK PARAMETERS MOV CSIBLK+G.TSTS,R4 ;GET SIZE OF TASK IN BYTES GPRT$S ,#CSIBLK ;GET STARTING VIRTUAL ADDRESS .ENDC ; -NZ MULTIN ;chs49 ADD $DSW,R4 ;CALCULATE ENDING VIRTUAL ADDRESS .IF NZ EXTND2 ;chs50a+ MOV R4,R0 ;ROUND UPPER LIMIT UP TO EVEN VALUE ADD #-1,R0 ; (TO TAKE ADVANTAGE OF MAXIMUM BIC #-1,R0 ; MEMORY SPACE AVAILABLE) SUB R4,R0 ;WHAT IS THE DIFFERENCE? MOV R0,-(SP) ;SAVE INCREMENT MOV #64.,R1 ;DETERMINE NUMBER OF 32W BLOCKS CALL $DIV ; TO EXPAND EXTK$S R0 ;PERFORM THE EXPANSION BCS 135$ ;USE ORIGINAL LIMIT IF EXPANSION FAILED ADD (SP),R4 ;SET NEW UPPER LIMIT 135$: TST (SP)+ ;CLEAN STACK .ENDC ; NZ EXTND2 ;chs50a- MOV R4,XTOP ;INITIAL INDEX POINTERS ;SIG01-2 MOV R4,XBOT ;SIG01-2 MOV LIMIT+2,R2 ;GET START OF FOOTNOTE AREA ;SIG01-2 .IF NZ TXTQUE ;chs78+ MOV R2,QSTART ;STORE IN QUEUE POINTERS MOV R2,QEND ; TO MAKE QUEUE EMPTY CLR (R2) .IFF ;chs78- DEC R2 ;SIG01-2 MOV R2,FOOTP1 ;STORE IN WORKING POINTERS ;SIG01-2 MOV R2,FOOTP2 ;SIG01-2 MOV R2,FOOTP3 ;SIG01-2 .ENDC ; NZ TXTQUE ;chs78 CALL FFEED ;START AT TOP OF NEW FORM ;SIG01-2 CALL OPRWAT ;WAIT FOR OPERATOR IF REQUESTED TO ;SIG01-2 ;;chs CLR TTBLK+F.NRBD ;CLEAR OUTPUT BUFFER ;SIG01-2 140$: CALL LINSET ;SET UP FOR LINE ;SIG01-2 JMP LGO ;AND INTO MAIN LOOP, LINE INPUT ;SIG01-2 .IIF NZ MULTIN, .DSABL LSB ;chs49 ENDFIL::CALL OUTPUT ;FLUSH LAST LINE ;SIG01-2 ;SIG01-2 .IF NZ MULTIN ;chs49+ TSTEQB LOOP,5$ ;QUIT IF NO OTHER INPUT FILE CLR HFIN+4 ;RESET INPUT-LINE COUNTER JMP RUNOF2 ;LOOP BACK 5$: ;FINISH UP THIS COMMAND .IF NZ LSTPG ;chs38+ CLR $HDRSW ;CLEAR HEADER PRINT ENABLE .IF NZ TXTQUE ;chs78+ JMP PAGEC ;FORCE A PAGE ENDFI2:: .IFF ;chs78- CALL PAGEC ;FORCE A PAGE .ENDC ; -NZ TXTQUE ;chs78 CALL OUTPUT ;OUTPUT LAST RECORD .ENDC ; NZ LSTPG ;chs38- .ENDC ; NZ MULTIN ;chs49- .IF Z LSTPG ;chs38+ MOV SP,$EOJSW ;SIGNAL AT END OF JOB .IF NZ TXTQUE ;chs78+ JMP PAGEC ;FORCE A PAGE ENDFI2:: .IFF ;chs78- CALL PAGEC ;FORCE OUT ANY FOOTNOTES OR BLOCKS .ENDC ; -NZ TXTQUE ;chs78 .ENDC ; Z LSTPG ;chs38- ;SIG01-2 .IF Z RSTS ;SIG01-2 BITEQ #SPLSW,$SWTCH,10$ ;DON'T SPOOL TEXT FILE? ;SIG01-2 PRINT$ #LSTBLK ;SUBMIT FILE TO PRINT SYMBIONT ;SIG01-2 .ENDC ; Z RSTS ;SIG01-2 10$: JMP RUNOFF ; Local subroutine to process command-line option switches ;chs45+ ; ; On entry: R0 = 0 for "exclude", 1 for "include" .IF NZ OPTXSW OPTSET: MOV (R2)+,R3 ;GET SWITCH VALUE BEQ 20$ ;SKIP IF AT END OF LIST BLT 10$ ;ERROR CHECK VALUE CMP R3,#OPTTXT BGT 10$ MOVB R0,OPTBL(R3) ;SET TO INCLUDE/EXCLUDE BR OPTSET ;GO BACK FOR NEXT VALUE 10$: MSGPUT OPTV ;WARN USER SEC ;SIGNAL ERROR RETURN BR 30$ 20$: CLC ;SIGNAL NORMAL RETURN 30$: RETURN .ENDC ; NZ OPTXSW ;chs45- .END