PROCEDURE ,010002 ;+ ; Copyright (c) 1976 ; Digital Equipment Corporation, Maynard, Mass. ; ; This software is furnished under a license for use only on a ; single computer system and may be copied only with the inclu- ; sion of the above copyright notice. This software, or any ; other copies thereof, may not be provided or otherwise made ; available to any other person except for use on such system ; and to one who agrees to these license terms. Title to and ; ownership of the software shall at all times remain in DEC. ; ; The information in this software is subject to change without ; notice and should not be construed as a commitment by Digital ; Equipment Corporation. ; ; DEC assumes no responsibility for the use or reliability of its ; software on equipment which is not supplied by DEC. ; ; Runoff start up initialization ; ; Written: 1-Jun-72, -0.0.0-, L. Wade ; ; Modified: 12-Jan-80, -1.0.0-, Henry R. Tumblin ; Produced Duke supported version ; ; Verified: 12-Jan-80, -1.0.0-, Henry R. Tumblin ; ; Modified: 9-July-80, -1.0.1-, J. Berntsen ; Made Default DOC and TOC files NL instead of TI and nothing ; Modified: 29-july-80, -1.0.2-, Bruce C. Wright ; Fixed so that default DOC and TOC files default to nothing ; for all systems ; Modified: 1-Sept-80, J. Krupp, Middlebury College ; Modified: 30-Dec-80, -1.0.3-, J. Berntsen ; Modified: 22-July-81, -1.0.4-, J. Berntsen ;- .SBTTL MACRO LIBRARY CALLS AND RUNOFF GLOBALS .MCALL CLOSE$,CSI$,CSI$1,CSI$2,EXIT$S,GCMLD$,DIR$,OPNS$R .MCALL GCML$,GPRT$S,GTSK$S,OPEN$R,OPEN$W,FINIT$,FDBF$R ; RUNOFF global definitions .GLOBL FFEED ; form feed .GLOBL INLPG ; initial lines/page .GLOBL INSW ; Input file switch table .GLOBL LGO ; entry, main processing loop .GLOBL LINSET ; init counts and pntrs for new line .GLOBL LSTBLK ; output file fdb .GLOBL LSTFIL ; output file default fnb .GLOBL NLPG ; number of lines per page .GLOBL OPRWAT ; operator wait message .GLOBL OUSW ; Output file switch table .GLOBL OUTPUT ; flush line buffer to output file .GLOBL PNLPG ; permanent number of lines/page .GLOBL PRMARG ; permanent right margin .GLOBL RMARG ; current right margin .GLOBL SPLSW ; spool file flag .GLOBL SPSAV ; SP save area .GLOBL SSTV ; declare sst dpb .GLOBL TOCBLK ; TOC fdb .GLOBL TOCSPC ; TOC file flag .GLOBL TOCSW ; TOC switch table .GLOBL TTIBLK ; gcml fcb .GLOBL TTIBUF ; command input buffer .GLOBL TTILIN ; command input buffer size .GLOBL TTLDMY ; source input fdb .GLOBL ULSWT ; underline flag word .GLOBL $INITL ; task initialization .GLOBL $INSW ; Input file switches .GLOBL $OUSW ; Output file switches .GLOBL $SDISW ; secondary buffer flag .GLOBL $TOCSW ; TOC switches .GLOBL $ULMSW ; underline - backspace flag .GLOBL $ULNSW ; underline - line mode flag .GLOBL $ULSSW ; underline - simulate flag ; globals defined in this module .GLOBL ENDFIL ; endfile processing .GLOBL FLAGS ; task state flags .GLOBL RUNOFF ; task restart entry point .GLOBL TF.MOR ; More input files available .GLOBL $START ; task startup point .SBTTL LOCAL DATA DATA STARTD ; csi control block CSI$ ; define csi control block offsets GCMLD$ ; define gcml offsets CSIBLK: .BLKB C.SIZE ; csi control block FLAGS: .BLKW 1 ; Local flags ; task status flags TF.MOR = 1 ; More input files flag TF.OFO = 2 ; Output file open flag TF.PIN = 4 ; Pointers already initialized .SBTTL $START-START UP INITIALIZATION CODE START $START::FINIT$ ; Initialize FCS MOV SP,SPSAV ; save initial stack pointer DIR$ #SSTV ; claim sst vectors CLR FLAGS ; Initialize local flags DIAG VERSN ; display version message BISB #GE.IND!GE.CLO!GE.COM!GE.CON,TTIBLK+G.MODE ; Set up GCML .SBTTL START MAINLINE RUNOFF::MOV SPSAV,SP ; reset stack pointer 5$: CALL $INITL ; initialize variables AGAIN: MOV SPSAV,SP ; recover SP again. 10$: CLOSE$ #TTLDMY ; close input file CLOSE$ #LSTBLK ; close listing file CLOSE$ #TOCBLK ; CLose TOC file CLRB TOCSPC ; Clear TOC flag CLR FLAGS ; Clear local flags ; ; Get a command line from the command input file. ; 15$: MOV #TTIBUF,R0 ; Point to input buffer MOV #TTILIN,R1 ; Set length CALL REACMD ; Get command line BCC 30$ ; CC - then no errors CMPB #GE.EOF,R3 ; Top level EOF ? BNE 20$ ; NE - Then command input error CLOSE$ #TTIBLK ; Close command input file DIAG EXIT ; exit gracefully(always) 20$: DIAG MGCDME ; command error BR 10$ ; Analyze the command syntax and validate 30$: CSI$1 #CSIBLK,R1,R2 ; check syntax BCS 20$ ; CS - then syntax error. CALL PARFIL ; parse the file spec .SBTTL CHECK CSI STATUS ; ; Now parse the output file specification. Check to see ; if the = sign was specified. If it wasn't, then direct the ; output to NL0: ; 60$: BIT #TF.OFO,FLAGS ; Output file open ? BNE 100$ ; NE - yes BIS #TF.OFO,FLAGS ; Else indicate so MOVB #1,LSTSPC ; Indicate a file exists. BITB #CS.EQU,CSIBLK+C.STAT ; = sign specified ? BNE 62$ ; NE - Yes BIC #TF.OFO,FLAGS ; Else indicate not CLRB LSTSPC ; Indicate does not exist. BR 100$ ; And leave ; MOV #"NL,LSTFIL+N.DVNM ; Set default device ; OPEN$W #LSTBLK ; Open output file ; BCC 100$ ; CC - then output is open ; MOV R0,-(SP) ; DIAG MGOFER,FCS ; JMP AGAIN ; Parse the output listing file spec and switches 62$: CSI$2 #CSIBLK,OUTPUT,#OUSW ; Parse output file BCC 80$ ; CC - then parsed OK 70$: DIAG MGOFER JMP AGAIN 80$: BITB #CS.WLD,C.STAT(R0) ; Check for wild cards BEQ 111$ ; NE - then error DIAG WILCRD ; No wildcards allowed JMP AGAIN 111$: MOV CSIBLK+C.DSDS,-(SP) ; Sum length of filename. ADD CSIBLK+C.DSDS+4,(SP) ; ... ADD CSIBLK+C.DSDS+10,(SP)+ ; Is the length non-zero BNE 112$ ; 0 if so. CLRB LSTSPC ; Show no listing file. BR 82$ ; And continue. 112$: OPEN$W #LSTBLK,,#CSIBLK+C.DSDS ; Open listing file BCC 82$ ; CC - Then opened ok 81$: MOV R0,-(SP) ; Else push addr(fdb) DIAG MGOPER,FCS ; And tell user about it JMP AGAIN ; And re-prompt ; Check for and parse Table of Contents File Spec 82$: BITB #CS.MOR,CSIBLK+C.STAT ; Was a TOC specified ? BNE 83$ ; Ne - then more specified CLRB TOCSPC ; Say we don't have a TOC file. BR 86$ ; And leave. ; MOV #"NL,TOCFIL+N.DVNM ; Set default device ; OPEN$W #TOCBLK ; Open TOC file ; BCC 85$ ; CC - then TOC open ; BR 81$ ; Not open complain 83$: CSI$2 #CSIBLK,OUTPUT,#TOCSW ; Parse TOC filespecs BCS 70$ ; CS - then TOC error BITB #CS.WLD,C.STAT(R0) ; Wild cards aren't allowed either BEQ 84$ ; EQ - then OK DIAG WILCRD ; No wildcards allowed JMP AGAIN 84$: OPEN$W #TOCBLK,,#CSIBLK+C.DSDS ; Open TOC file BCS 81$ ; CS - then file open failure 85$: INCB TOCSPC ; Say we've got a TOC file opened 86$: .SBTTL INITIALIZE PAGE AND POINTERS 100$: BIT #TF.MOR,FLAGS ; more files ? BEQ 102$ ; EQ - no BIT #TF.PIN,FLAGS ; already initialized ? BNE 140$ ; NE - yes, skip init BIS #TF.PIN,FLAGS ; indicate initialized 102$: MOV PRMARG,RMARG ; set right margin TST PNLPG ; see if /ps::n given BNE 105$ MOV #INLPG, PNLPG ; reinitialize 105$: MOV PNLPG, NLPG ; and page length CMPNEB #'B,ULSWT,110$ ; not backspace mode? COMB $ULMSW ; set backspace mode BR 130$ 110$: CMPNEB #'S,ULSWT,120$ ; not simulate mode? COMB $ULSSW ; set simulate switch BR 130$ 120$: CMPEQB #'L,ULSWT,130$ ; line mode? COMB $ULNSW ; set no underline switch 130$: CALL LINSET ; set up for line .IF NDF M$$IDD CALL FFEED ; start at top of new form .ENDC ;M$$IDD CALL OPRWAT ; wait for operator if requested to CLRB $SDISW ; Clear sec. buffer flag 140$: JMP LGO ; and into main loop, line input .SBTTL INPUT FILE PARSING AND OPEN ; Now check the input file specs. Multiple input files ; are handled as concatenated files. That is, they are a ; continuation of the previous file. PARFIL: BITB #CS.EQU,CSIBLK+C.STAT ; Input or output ? BNE 42$ ; NE - then use INPUT CSI$2 #CSIBLK,OUTPUT,#INSW ; Parse input filespecs BCS 40$ ; CS - then syntax error BR 50$ ; And go open the file 42$: CSI$2 #CSIBLK,INPUT,#INSW ; Parse input filespecs BCC 50$ ; CC - then no errors 40$: DIAG MGIFER ; INPUT FILE SPEC ERROR JMP RUNOFF ; And go restart 50$: BITEQB #CS.WLD,C.STAT(R0),51$ ; Wild card in input ? DIAG WILCRD ; No wildcards allowed JMP AGAIN 51$: BIC #TF.MOR,FLAGS ; Clear local flags BITB #CS.MOR,CSIBLK+C.STAT ; More input files there ? BEQ 52$ ; EQ - no BIS #TF.MOR,FLAGS ; Set more input flag 52$: CLOSE$ #TTLDMY ; close input file. FDBF$R R0,,,#2,#FD.RAH ; Say we want read-ahead OPNS$R R0,,#CSIBLK+C.DSDS ; Open source file BCC 60$ ; CC - then file exists MOV R0,-(SP) ; push for error call DIAG MGIPER,FCS JMP RUNOFF ; and loop. 60$: RETURN ; and return to the caller. .SBTTL ENDFILE PROCESSING NXTFIL::CALL POPFIL ; try to pop off a file. BCC 20$ ; leave if ok BIT #TF.MOR,FLAGS ; more input files available? BEQ 10$ ; no CALL PARFIL ; yes - parse file spec. CLC ; show success BR 20$ ; and return. 10$: SEC ; show error return 20$: RETURN ; and return to the caller. ENDFIL: CALL OUTPUT ; flush last line CALL TOTPUT ; flush toc file .IF DF M$$IDD INC PAGCNT ; actually one more page for us .ENDC ;M$$IDD .IF NDF R$$OCK DIAG TPAGES ; output total pages .ENDC ;R$$OCK .IF NDF R$$STS CALL SPLFIL ; Check to see if we should spool file .ENDC ;R$$STS JMP RUNOFF ; go restart .SBTTL Read command input ; This module will read a command line into the buffer specified ; in R0 for length R1. C-bit will be set on error and R3 will ; contain the error. On return, R0 will point to the command ; buffer and R2 will contain the command length. REACMD: MOV R0,-(SP) ; preserve buffer pointer MOV R0,TTIBLK+G.CMLD+2 ; Point to input buffer MOV R1,TTIBLK+G.CMLD ; Set buffer length CLR R2 ; Clear accumulator BISB #GE.CON,TTIBLK+G.MODE ; Set continuation lines on BICB #GE.CLO,TTIBLK+G.MODE ; Don't close input file LOOP: GCML$ #TTIBLK ; Prompt for input. BCC 10$ ; CC - then ok MOV TTIBLK+G.CMLD,R2 ; Set line length CLR R3 ; Leave the error MOVB TTIBLK+G.ERR,R3 ; in R3 SEC MOV (SP)+,R0 ; Restore R0 RETURN 10$: MOV TTIBLK+G.CMLD,R2 ; Accumulate length BEQ LOOP ; EQ - Then nothing here yet MOV (SP)+,R0 ; Restore pointer MOV TTIBLK+G.CMLD+2,R1 ; get gcml pointer CLC RETURN ; Return to caller .SBTTL The end .END