.TITLE START .IDENT /M03/ ; ; 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. ; ; VERSION M03 ; ; AUTHOR: L. WADE 1-JUN-72 ; ; MODIFIED BY: ; ; E. POLLACK U. OF W. 19-DEC-73 ; ; D. N. CUTLER 27-JUL-75 ; ; SIG MODIFICATIONS ;**NEW** ; SIG01 CLEAN UP WAIT FUNCTION ;**NEW** ; SIG02 RSTS CHANGES ;**NEW** ; ;**NEW** ; RUNOFF START UP INITIALIZATION ; ; MACRO LIBRARY CALLS ; .MCALL CLOSE$,CSI$,CSI$1,CSI$2,EXIT$S,GCMLD$ .MCALL GCML$,GPRT$S,GTSK$S,OPEN$R,OPEN$W,PRINT$ CSI$ ;DEFINE CSI CONTROL BLOCK OFFSETS GCMLD$ ; ; LOCAL MACROS ; ; ERROR MESSAGE OUTPUT ; .MACRO MSGPUT NAM CALL $ERMSG .WORD MG'NAM .ENDM ; ; LOCAL DATA ; ; CSI CONTROL BLOCK ; .PSECT $VARS,RW,LCL,D,CON CSIBLK: .BLKB C.SIZE ; FIRST BLOCK FOR INPUT COMMAND CSIBL: .BLKB C.SIZE ; SECOND BLOCK FOR .REQ COMMAND ; ; TASK MEMORY LIMITS ; LIMIT: .LIMIT ;SIG02 ;+ ;**-17 .PSECT $CODE,RO,I,LCL,CON ; **-$START-START UP INITIALIZATION ;- $START::MOV SP,SPSAV ; SAVE INITIAL STACK POINTER OPEN$W #TTBLK ; OPEN COMMAND OUTPUT FILE RUNOFF::MOV SPSAV,SP ; RESET STACK POINTER CALL INITL ; INITIALIZE VARIABLES 10$: CLOSE$ #LSTBLK ; CLOSE LISTING FILE MOVB LUNSTK+1,R4 ; MAX NUMBER OF LUNS*2 15$: MOV FDBTAB(R4),R0 ; GET FDB CLOSE$ R0 ; CLOSE INPUT FILE SUB #2,R4 ; NEXT ENTRY? BGE 15$ ; YES GCML$ #TTIBLK ; GET A COMMAND BCC 30$ CMPNEB #GE.EOF,G.ERR(R0),20$ ;NOT TOP LEVEL EOF CLOSE$ #TTBLK CLOSE$ #TTIBLK EXIT$S 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$ CSI$2 #CSIBLK,INPUT,#SWTBL BCC 50$ 40$: MSGPUT IFER ; INPUT FILE SPEC ERROR BR 10$ 50$: BITNEB #CS.MOR!CS.WLD,C.STAT(R0),40$ ;MORE INPUT FILES? OPEN$R #LUN4,,#CSIBLK+C.DSDS BCC 60$ MSGPUT IPER BR 10$ 60$: CSI$2 #CSIBLK,OUTPUT,#SWTBL BCC 80$ 70$: MSGPUT OFER ; INPUT FILE SPEC ERROR BR 10$ 80$: BITNEB #CS.MOR!CS.WLD,C.STAT(R0),70$ ;MORE OUTPUT FILES? CLRB LSTBLK+F.RATT ; No file attributes BITNEB #CRSW,$SWTCH,81$ ; No imbedded carriage control? MOVB #FD.CR,LSTBLK+F.RATT ; Set normal list carriage control 81$: OPEN$W #LSTBLK,,#CSIBLK+C.DSDS BCC 100$ MSGPUT OPER ; INPUT FILE OPEN ERROR BR 10$ 100$: MOV PRMRG, RMARG ; SET RIGHT MARGIN TST PNLPG ; SEE IF /PS::N GIVEN BNE 105$ MOV #INLPG, PNLPG ; REINITIALIZE 105$: MOV PNLPG, NLPG ; AND PAGE LENGTH MOVB #'_,$ULCH ; TRY UNDERLINE CHAR AS UNDERSCORE 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 MOVB #'-,$ULCH ; SET CHAR TO HYPHEN BR 130$ 120$: CMPEQB #'L,ULSWT,130$ ; LINE MODE? COMB $ULNSW ; SET NO UNDERLINE SWITCH 130$: CLR R1 ; SET TO CLEAR CASE SHIFT BITEQ #UPCSW,$SWTCH,140$ ;NO UPPER CASE REQUIRED? MOV #401,R1 ; REQUIRED UPPER 140$: MOV R1,CASE ; SET CASE BITNE #HYPSW,$SWTCH,150$ ; HYPHENATION SWITCH? BISB #1,$HYPSW ; SET IT PERMENANTLY OFF 150$: GTSK$S #CSIBLK ; GET TASK PARAMETERS MOV CSIBLK+G.TSTS,R4 ;GET SIZE OF PARTITION IN BYTES GPRT$S ,#CSIBLK ; GET STARTING VIRTUAL ADDRESS ADD $DSW,R4 ; CALCULATE ENDING VIRTUAL ADDRESS MOV R4,XTOP ; INITIAL INDEX POINTERS MOV LIMIT+2,XBOT ; set xbot to top memory location CLR LNKHD ; new linked list of buffers CALL LNKSET ; Set up linked list of buffers CALL LINSET ; SET UP FOR LINE CALL OPRWAT ; WAIT FOR OPERATOR IF REQUESTED TO CLR TTBLK+F.NRBD ; CLEAR OUTPUT BUFFER JMP LGO ; AND INTO MAIN LOOP, LINE INPUT ENDFIL::CALL OUTPUT ; FLUSH LAST LINE .IF NDF RSTS BITEQ #SPLSW,$SWTCH,10$ ;DON'T SPOOL TEXT FILE? PRINT$ #LSTBLK ; SUBMIT FILE TO PRINT SYMBIONT .ENDC 10$: JMP RUNOFF ; START AT TOP AGAIN ; ; THIS IS INCLUDED HERE SINCE IT USES CSI$ ; ; REQUIRE COMMAND ; .ENABL LSB REQUR:: CMPB LUNSTK,LUNSTK+1 ; AT END OF STACK? BHIS 50$ ; YES CALL GETLIT ; GET LITERAL ADDRESS BCS 30$ ; NONE TO GET CSI$1 #CSIBL,R2,R1 ; INIT CSI BLOCK TO PARSE INPUT BCS 40$ ; BAD INPUT CSI$2 #CSIBL,OUTPUT ; GET FILE SPEC BCS 40$ ; BAD FILE BITNEB #CS.MOR!CS.WLD!CS.EQU,C.STAT(R0),30$ ; ILLEGAL INPUT MOVB LUNSTK,R0 ; GET POINTER MOV FDBTAB+2(R0),R0 ; GET FDB BLOCK OPEN$R R0,,#CSIBL+C.DSDS ; OPEN FILE BCS 20$ ; NOT OPEN 10$: MOV BUFADD,R3 ; GET OLD BUFFER CLR BF.CNT(R0) ; EMPTY CURRENT INPUT BUFFER MOVB LUNSTK,R0 ; GET STACCK ADD #2,R0 ; NEXT ENTRY MOVB R0,LUNSTK ; SAVE CURRENT STACK MOV BUFTAB(R0),R3 ; AND BUFFER ADDRESS MOV R3,BUFADD ; SAVE IT CALL CLRBF ; CLEAR THE BUFFER MOV #CR,R1 ; GET CARRIAGE RET TO SIGNAL END OF LINE CALL PBYT ; INTO BUFFER MOV #LF,R1 ; PUT LF INTO BUFFER AS END LINE CALL PBYT ; INTO BUFFER CALL BEGBF ; SET TO TOP OF BUFFER RETURN 20$: MOVB F.ERR(R0),R1 ; GET ERROR CLOSE$ R0 ; CLOSE BAD FILE JMP ILOPE ; OPEN FAILURE 30$: JMP ILCM ; ILLEGAL COMMAND 40$: JMP ILFER ; ILLEGAL FILE SPEC ERROR 50$: JMP ILRQO ; LUN OVERFLOW ERROR .DSABL LSB ; ; DEFAULT FLAG TABLE ; .PSECT $TABL,RO,D,LCL,CON $FLTAB:: ; CONTAINS DEFAULT FLAG VALUES .WORD '_ ; FLAG ACCEPT (-=NO) ; *** .WORD '<+100000 ; FLAG CAPITALIZE ENABLE (-=NO) .WORD '& ; UNDERLINE SWITCH (-=NO) .WORD '\ ; LOWERCASE SWITCH (-=NO) .WORD '^ ; UPPERCASE SHIFT SWITCH (-=NO) .WORD '# ; QUOTED SPACE SWITCH (-=NO) .WORD '%+100000 ; OVERSTRIKE FLAG ENABLE (-=NO) .WORD '>+100000 ; INDEX FLAG ENABLE (-=NO) .WORD '=+100000 ; FLAG HYPHENATE (-=NO) .WORD 100000 ; ESCAPE FLAG .WORD '$+100000 ; substitute flag .WORD '|+100000 ; break flag .WORD '. ; CONTROL FLAG ; ; DEFAULT ESCAPE TABLE ; ESTAB:: .IFDF $FLORD .BYTE 4,'^,'>,ESC,'D ; 1/2 UP SHIFT .BYTE 4,'^,'<,ESC,'U ; 1/2 DOWN SHIFT .BYTE 5,'^,'1,ESC,'I,2 ; SELECT FONT #1 .BYTE 5,'^,'2,ESC,'I,3 ; FONT 2 .BYTE 5,'^,'3,ESC,'I,4 ; FONT 3 .BYTE 5,'^,'4,ESC,'I,5 ; FONT 4 .BYTE 5,'^,'5,ESC,'I,6 ; FONT 5 .BYTE 5,'^,'8,ESC,'I,9. ; FONT 8 .BYTE 4,'^,'*,ESC,'W ; BEGIN SHADOW PRINT .BYTE 4,'\,'*,ESC,'& ; END SHADOW/BOLD PRINT .BYTE 4,'^,'(,ESC,LF ; SHIFT UP 1 SPACE .BYTE 3,'^,'),LF ; SHIFT DOWN 1 SPACE .BYTE 3,'^,'=,16 ; SO BEGIN ELONGATED .BYTE 3,'\,'=,17 ; SI END ELONGATED .ENDC .BYTE 0 ; LAST BYTE .EVEN LEVTAB: .BYTE 1,3,1,6,7,7,2,1,7,2 ; Default header level data .PSECT $CODE,I,RO,LCL,CON ; ; **- INITL-INITIALIZE RUNOFF VARIABLES ;- ; ; First clear whole list of variables ; INITL: MOV #VARBEG,R0 ; First variable 1$: CLR (R0)+ ; Clear variables CMP R0,#VAREND ; Done? BLO 1$ ; No DECB $FIRPG ; Make this the first page of document MOV #JUSTF+PJUSTF+FILLF,F.1 ;INITIAL FLAGS ; ; Reset the FLAG characters in character table ; MOV #128.,R0 ; NUMBER OF ASCII CHARS 2$: BICB #CH.FLG,CHTABL(R0) ; CLEAR OUT FLAG BIT BITEQB #CH.FLC,CHTABL(R0),3$ ; NOT A FLAGGABLE CHARACTER? MOVB #GC.MSC,GCTABL(R0) ; YES CLEAR ANY EXISTING FLAGS 3$: SOB R0,2$ ; TILL DONE ; ; Setup the FLAG characters ; MOV #$FLTAB,R1 ; DEFAULT TABLE MOV #$AFLSW,R0 ; FLAGS TO BE SET MOV #NFLAG+1,R2 ; NUMBER OF FLAGS 5$: MOV (R1),(R0)+ ; MOVE EM TSTNEB 1(R1),6$ ; FLAG DISABLED? MOVB (R1),R3 ; CHAR TO USE MOV R1,R4 ; CURRENT FLAG SUB #$FLTAB-GC.AFL,R4 ; CURRENT FLAG CHAR MOVB R4,GCTABL(R3) ; INTO CHARACTER TABLE 6$: TST (R1)+ ; NEXT FLAG SOB R2,5$ ; TILL DONE ; ; ENABLE/DISABLE SWITCHES ; MOVB #100,$UNLSW ; UNDERLINING ENABLED/OFF MOVB #300,$CBRSW ; SET CHANGE BAR DISABLED/OFF MOVB #1,$HDRSW ; No header on first page MOV SP,$NUMSW ; SET NUMBER PAGE FLAG MOV SP,$PERSW ; SET PUNCTUATION DOUBLE SPACE FLAG MOV IUL, ULSWT ; INITIALIZE UNDERLINE MODE MOV HWLPP, LPPG ; SET DEFAULT HARDWARE PAGE SIZE MOV #INLPG, PNLPG ; SET INITIAL LENGTH OF PAGE MOV #3,HSPAC ; Initial header spacing MOV #ILMRG,PLMRG ; Permenant left margin MOV #IRMRG,PRMRG ; INITIAL PERMANENT MARGIN MOV #ILMRG,LMARG ; INITIAL LEFT MARGIN MOV #IRMRG,RMARG ; Right margin MOV #100000,APNDSP ; appendix display format MOV #100000,SUBDSP ; subpage display format MOV #1,PAGENO ; SET INITIAL PAGE NUMBER MOV #LEVTAB,R1 ; Level default table ; ; Set up header level style ; MOV #LEVEL,R0 ; Header level data table MOV (R1)+,(R0)+ ; Set levels to default MOV (R1)+,(R0)+ ; Set levels to default MOV (R1)+,(R0)+ ; Set levels to default MOV (R1)+,(R0)+ ; Set levels to default MOV (R1)+,(R0)+ ; Set levels to default MOV #LSTK,LSTKP ; Reset stack pointer MOV #PAGHD,R0 ; INITIALIZE PAGE HEADING PROTOTYPE MOV (PC)+,(R0)+ ; .ASCII /PA/ ; MOV (PC)+,(R0)+ ; .ASCII /GE/ ; MOV (PC)+,(R0) ; .ASCIZ / / ; MOV #SPCNG,NSPNG ; SET INITIAL SPACING MOV #IPARTP,PARPT ; SET INITIAL PARAGRAPH PAGE TEST COUNT MOV #IPARVS,PARSP ; SET INITIAL PARAGRAPH SPACING COUNT MOV IPARIN,PARIND ; INITIAL PARAGRAPH INDENTING MOV #1,CPOS ; Current character position MOV #1000.,LINEC ; Start with page pending CLR R0 ; CLEAR LOOP COUNTER MOV #8.,R1 ; SET INITIAL TAB STOP VALUE 10$: MOVB R1,TABTAB(R0) ; SET STANDARD TAB STOPS ADD #8.,R1 ; ADVANCE TO NEXT TAB STOP INC R0 ; INCREMENT LOOP COUNTER CMPNE R0,#17.,10$ ; LOOP IF END OF LOOP NOT REACHED MOV R0,NTABS ; SET NUMBER OF TAB STOPS MOV INI$SW, $SWTCH ; INITIAL SWITCH SETTINGS MOV BUFTAB,R0 ; FIRST BUFFER HEADER MOV R0,BUFADD ; IS CURRENT BUFFER CLR BF.CNT(R0) ; SET NO CHARS IN BUFFER MOV HFOUT,HFOUT+4 ; SET CHARACTER COUNTS MOV #OUBUF,HFOUT+2 ;INITIALIZE POINTERS MOV #-1,HGHPAG MOV #-1,HGHCHP ; hi chapter limit MOV #-1,HGHAPN ; default highest appendix # ; ; SET BUFFERS TO EMPTY ; MOV #F.1,R5 ; FLAG WORD MOV #FOTBF,R3 ; FOOTNOTE CALL CLRBF BIS #FOTF,F.1 ; SET FOOTNOTE FLAG CALL LINSET ; SET UP HEADER BIC #FOTF,F.1 ; CLEAR FOOTNOTE FLAG CALL LINSET ; CLEAR SECONDARY BUFFER MOV #TTLBF,R3 ; TITLE CALL CLRBF MOV #STLBF,R3 ; SUBTITLE CALL CLRBF MOV #INXBF,R3 ; index buffer CALL CLRBF MOV #ESCBF,R3 ; escape table buffer CALL CLRBF MOV #ESTAB,R0 ; default escape sequences CALL PSTRZB ; into escape buffer CLRB SUBSTK ; no substitution in progress MOV #BUFADD+2,R4 ; Substitution buffer headers MOV (R4)+,R3 CALL CLRBF MOV (R4)+,R3 CALL CLRBF MOV (R4)+,R3 CALL CLRBF CALL ULBSET ; RESET UNDERLINE BUFFER RETURN ; .END