.TITLE FMTCM ; ; ; ; J. CLEMENT - 1983 ; Rewrote most of the code ; AZ (new) ; NSWC Changes: V ; ; 13 Feb 87 - Add code to common .CHAPTER/.APPENDIX pro- ; cessing for .CHAPTER TITLES. ; Fix bug in .TITLES which made .NO TITLES ; non-reversable. ; 2 Mar 87 - Add .SET LEVEL command. ; Use correct error messages for .SET LEVEL ; and .HEADER LEVEL overflow. ; 23 Nov 87 - Correct SET LEVEL n , where n < current. ; 8 Feb 88 - Temporarily set .NO FILL while doing .HEADER ; LEVEL to avoid underlining problems when ; using .UNDERLINE SPACES. ; Fix ENABLE ODD creating malformed page, and ; base skipped page on .ENABLE EMPTY status. ; 5 Apr 88 - If doing TOC, ignore most CHAPTER actions. ; Change 8 Feb 88 .NO FILL code to remove con- ; flict with .SAVE HEADERS. ; ^ ; AZ (new) ; ; RUNOFF COMMANDS ; CHAPTER ; APPENDIX ; NOTE ; LIST, LIST ELEMENT, END LIST ; TITLE, SUBTITLE ; HEADER page commands ; HEADER LEVEL ; ; ; ALL COMMAND ROUTINES ARE ENTERED WITH: ; ; R4=ADDRESS OF NUMBER CONVERSION ROUTINE. ; ; LOCAL DATA ; ; OUTPUT TEXT ; .TEXT LOWER: .ASCIZ /page / MIXED: .ASCIZ /Page / UPPER: .ASCIZ /PAGE / NOTET: .ASCIZ /NOTE/ ; NOTE HEADING PROTOTYPE MRGERR: .ASCIZ /RNO -- Can't Reduce margins/ IFTXT: .BYTE TOCX,200 .ASCIZ /.IF TOC/ EITXT: .BYTE TOCX,200 .ASCIZ /.ENDIF TOC/ .EVEN ; ; Local variables ; .VARS LSAV: .WORDA 0 SAVA: .WORDA 0 SAVB: .WORDA 0 LSTAT: .WORDA 0 .CODE ; ; APPENDIX COMMAND ; APNDX:: CALL CHAP0 ; Pre chapter actions CLR CHPTN ; Clear current chapter number MOV #APNM2,-(SP) ; Post header CLR -(SP) ; end for number conversion MOV APNNX,R1 ; Next appendix number MOV R1,APNDN ; current appendix number MOV R1,-(SP) ; For output CALL NUMINC ; Increment it MOV R1,APNNX BIS APNDSP,(SP) ; set format MOV #APNMG,-(SP) ; SET ADDRESS OF APPENDIX HEADING MOV #APSTAT,R2 ; Appendix status BR CHAP1 ; ; ; CHAPTER COMMAND ; CHPTR:: CALL CHAP0 ; Pre chapter actions CLR APNDN ; No appendix now !!! MOV #CHPM2,-(SP) ; Post header CLR -(SP) ; end of numbers MOV CHPNX,R1 ; Next chapter number MOV R1,CHPTN ; current number MOV R1,-(SP) ; For output CALL NUMINC ; Increment it MOV R1,CHPNX ; Next chapter number BIS CHPDSP,(SP) ; format MOV #CHPMG,-(SP) ; SET ADDRESS OF CHAPTER HEADING MOV #CHSTAT,R2 ; Set for chapter status BR CHAP1 ; ; Common code for .CHAPTER or .APPENDIX ; CHAP0: CLRB LEVEL ; AZ 4/88 (moved) CLRB LEVNM ; AZ 4/88 (moved) TSTEQB $TOCBE,6$ ; TOC not in progress ?? ; AZ 4/88 (moved) CALL $FRCND ; Skip to title beginning ; AZ 4/88 (new) RETURN ; AZ 4/88 (moved) 6$: BICB #SW.TDS,$PAGNG ; Enable paging ; AZ 4/88 (6$ mvd) CALL TXDMP ; Dump all deferred text CALL ESCCLR ; Clear escapes and underlining TSTNEB $AUSTL,2$ ; Auto subtitle? ; AZ (new) TSTNEB $CHTTL,3$ ; CHAPTER TITLES active? ; AZ (new) 2$: MOV #STLBF,R3 ; CLEAR SUBTITLE BUFFER ; AZ (2$) CALL CLRBF 3$: TSTEQB $ODPAG,10$ ; Odd page not enabled ? ; AZ (moved,3$) BITNE #1,PAGNX,10$ ; Next page odd ? ; AZ (moved_ TSTNEB $EMPSW,91$ ; AZ (2/88) BISB #SW.TDS,$HDRSW ; AZ (2/88) BISB #SW.DIS,$NM2SW ; AZ (2/88) CALL PAGEC ; AZ (2/88) BICB #SW.DIS,$NM2SW ; AZ (2/88) BR 92$ ; AZ (2/88) 91$: CALL PAGEC ; AZ (2/88)(was PAGRST)(91$) 92$: INCB $PAGBR ; Set no current page ; AZ (moved,92$) 10$: TSTNEB $AUTTL,5$ ; No auto title? ; AZ (10$) CALL TTLSV ; Save title 5$: CALL $FRCND ; Start at beginning of title MOV PTMRG,TMARG ; SET TOP MARGIN MOV PLMRG,LMARG ; Left margin MOV PRMRG,RMARG ; SET RIGHT MARGIN CLRB $CENSW ; Clear centering just in case CALL STCMRG ; Set center margin MOV PSPNG,NSPNG ; SET INITIAL SPACING BIS #FILLF!JUSTF!PJUSTF,F.1 ;SET FILL AND JUSTIFY FLAGS ;10$: BISB #SW.TDS,$HDRSW ; no header at begin chapters/appendix ; AZ (;) MOVB CHLAY,R0 ; Any chapter layout ? BLT 20$ ; No ? MOVB R0,NXLAY ; Next layout MOV CHEPSP,NXEPSP ; And end of page spacing 20$: TSTNEB $CHTTL,21$ ; AZ (new) BISB #SW.TDS,$HDRSW ; no header at begin ch/app ; AZ (moved) 21$: CALL PAGRST ; Break page + reset subpage ; AZ (was 20$) RETURN CHAP1: CALL RSTAT ; Restore status if available CALL BUFTOC ; Send command to TOC MOVB CHSK1,R2 ; SET LINE COUNT CALL SKIPN ; Skip lines TSTEQB $TOCBE,10$ ; TOC not in progress ?? MOV PARPT,R1 ; use paragraph test page CALL TESTT ; To test page 10$: CALL LINBEG ; Start new line MOVB CHSP1,R2 ; First space count CALL CENCH ; Use em CALL SETINS ; Get input temporary MOV (SP)+,R0 ; chap/appendix pre-heading CALL PSTRZB CALL PAGCV ; convert numbers MOV (SP)+,R0 ; chap/appendix pre-heading CALL PSTRZB CALL INOUT TSTB CHSK2 ; Next one on same line? BMI 20$ ; Yes CALL OUTNJ ; No MOVB CHSK2,R2 ; Number of line CALL SKIPN ; Skip them 20$: CALL LINBEG MOVB CHSP2,R2 ; Second space count CALL CENCH ; Use em BISB #SW.IDS,$AUHYP ; Prevent automatic hyphenation CALL LINUC ; Transfer lines to buffer BICB #SW.IDS,$AUHYP ; Now allow it again CALL ENDESC TSTB CHSK3 ; Next one on same line? BMI 30$ ; Yes CALL OUTNJ ; Output it MOVB CHSK3,R2 ; Lines to skip CALL SKIPN ; Skip them 30$: JMP LGO ; Next line ; ; Clear escape sequences pending & underlining ; ENDESC: TSTEQ BF.HED(R3),ESCCLR ; No buffer ? MOV ESMSK,R4 ; Escape sequences on CALL ESCEND ; End them ESCCLR: CLR ESMSK ; Clear escapes MOV #1,PHSP ; Reset permanent spacing BISB #SW.TDS,$UNLSW ; Set temporary disable RETURN ; ; Set up centering or margin ; CENCH: TST R2 ; Type of spacing BEQ 40$ ; None ? BGT 20$ ; No centering? CMPNE R2,#-1,10$ ; Not centering? BISB #SW.TDS,$CENSW ; Set to center RETURN 10$: BISB #SW.TDS,$RIGSW ; Set to right justify RETURN 20$: CALL BRKSV ; Set break here 30$: MOV #NXS,R1 ; Output N spaces CALL PUBYT SOB R2,30$ 40$: RETURN ; ; Save TITLE in uppercase ; TTLSV: TSTNEB $TOCBE,STLSV2 ; TOC in progress? MOV BUFADD,R0 ; Input buffer MOV BF.FUL(R0),-(SP) ; Save current location CALL UCTTL ; Save current input in tittle BR STLSV1 STLSV: TSTNEB $TOCBE,STLSV2 ; TOC in progress? MOV CASE,STLCAS MOV BUFADD,R0 ; Input buffer MOV BF.FUL(R0),-(SP); Save current location CALL SETST1 ; Save current input in tittle STLSV1: MOV (SP)+,R1 ; Location to back to MOV BUFADD,R3 ; Input buffer CALL FNDBF ; Go back to previous location MOV #TX2BF,R3 ; Restore output buffer STLSV2: RETURN ; ; Output buffer to TOC ; COPTOC:: ;--------------------------------------------------- ;BUFTOC: TSTNEB $TOCSW,10$ ; No TOC? ; MOV BUFADD,R3 ; Get input buffer address ; MOV BF.VSP(r3),R1 ; Start of command ERRORSTRING ; ADD BF.CAD(r3),R1 ; Now is address ; ADD #BFLNK+1,R1 ; Correct for header ; MOV BF.CNT(R3),R2 ; String count ; ADD BF.ADD(R3),R2 ; SUB R1,R2 ; DEC R2 ; Omit CR,LF ; CALL OUTTOC ; Output to TOC file ; MOV #TTBF,R3 ; Get temporary buffer ; CALL CLRBF ; MOV #TAB,R1 ; Tab to output ; CALL PBYT ; To temporary buffer ; MOV #TOCM1,R0 ; Header before number ; CALL PSTRZB ; Into buffer ; CALL PUTPAG ; Page number into buffer ; MOV #TOCM2,R0 ; Post fix after number ; CALL PSTRZB ; Into buffer ; MOV BF.FUL(R3),R2 ; Count ; MOV BF.ADD(R3),R1 ; Address ; INC R1 ; Plus 1 ; SUB R2,R1 ; Start address ; JMP OUTTOC ; Output to TOC ;10$: RETURN ;------------------------------------------------------------------- ; The following routine was suggested by the RT-11 SIG to synchronize ; all methods of sending text out to the table of contents file. BUFTOC: TSTNEB $TOCSW,20$ ; TOC? CALL LINFAK ; Get output buffer address in R3 MOV #TOCX,R1 ; TOC flag CALL PBYT MOV #1,R1 ; Output status CALL PBYT ; Set to output number MOV BUFADD,R0 ; Get input buffer address MOV BF.VSP(R0),R4 ; Start of command ADD BF.CAD(R0),R4 ; Now is address ADD #BFLNK+1,R4 ; Correct for header MOV BF.CNT(R0),R2 ; String count ADD BF.ADD(R0),R2 SUB R4,R2 DEC R2 ; Omit CR,LF ; CMP R2,#72. ; Don't overflow buffer ; BLO 10$ ; MOV #72.,R2 10$: MOVB (R4)+,R1 CALL PBYT SOB R2,10$ CALL CBYT ; Chock end of command TSTNE BF.HED(R3),20$ ; Don't chock if header exists CALL CBYT ; Chock line 20$: RETURN ;------------------------------------------------------------------- ; ; HEADER COMMAND ; .ENABL LSB HEADU:: MOV #UPPER,R0 ; Header upper BR HEAD1 HEADM:: MOV #MIXED,R0 ; Header mixed BR HEAD1 HEADL:: MOV #LOWER,R0 ; Header lower HEAD1: MOV #PAGHD,R1 ; POINT TO PAGE HEADER AREA 40$: MOVB (R0)+,(R1)+ ; MOVE PROTOTYPE BNE 40$ ; IF NE MORE TO GO HEADP:: BICB R5,$HDRSW ; Set to print page headers RETURN ; 50$: CALL CCIN ; READ NEXT CHARACTER CMPNEB (R0),#GC.LC,60$ ; not lower case? BIC #^o40,R1 ; CONVERT TO UPPER CASE 60$: RETURN ; ; ; NOHEADER COMMAND ; NHEAD:: BISB R5,$HDRSW ; SET TO NOT PRINT PAGE HEADERS RETURN ; .DSABL LSB .ENABL LSB ; ; HEADER PAGE COMMANDS ; HPAGE:: CLRB $PAGSW ; SET 'PAGE' ON RETURN ; HNOPG:: MOVB #-1,$PAGSW ; SET 'PAGE' OUTPUT OFF RETURN ; ; ; HEADER SPACING ; HEDSP:: CALL (R4) ; GET PARAMETER BCS 10$ ; Default CALL CVSP ; Convert vertical spacing BR 20$ 10$: MOV NSPNG,R3 ; USE LINE SPACING AS DEFAULT 20$: CMP R3,#MAXPS*LINSP ; TOO BIG? BGT ERRGT ; Too big ? CMP R3,#LINSP ; Check lower bound BGE 30$ ; Big enough ? MOV #LINSP,R3 ; Set it to line spacing 30$: MOV R3,HSPAC ; SAVE HEADER SPACING RETURN ERRGT: MOV #1.,R0 ; Param error message BR ERR ERRLT: MOV #2,R0 ; Too small error message ERR: JMP ILCMA .DSABL LSB ; ; AZ (new) ; SET LEVEL command ; AZ (new) ; ; AZ (new) SETLVL:: MOV #1,SAVA ; AZ (new) BR LEVELS ; AZ (new) SETLVR: BITEQ #2,SAVA,SETLVZ ; Branch if not increasing lvl ; AZ (new) 11/87 DEC -(R2) ; AZ (new) SETLVZ: RETURN ; AZ (new) ; ; HEADER LEVEL COMMAND ; HEADR:: MOV #0,SAVA ; AZ LEVELS: MOVB LEVEL,R3 ; Initial level # ; AZ MOV R3,R2 ; And save it BNE 1$ ; Not zero ? INC R3 ; Make it 1 1$: CALL (R4) ; GET HEADING LEVEL NUMBER CMP R3,#LEVSIZ ; Level too big? BGT 6$ ; Param too big TST R3 ; Is level too small? BGT 10$ ; No MOV #2,R0 ; Param too small BR 7$ 6$: MOV #1,R0 ; Param too big ; AZ (was 3) 7$: JMP ILCMA 10$: MOVB R3,LEVEL ; Save level number INDXA R2 ; Now index address INDXA R3 ADD #LEVNM,R3 ; Point to current level + 1 ADD #LEVNM,R2 ; Point to previous level + 1 BIC #NM.MSK,(R3) ; Clear next level MOV -(R3),R1 ; Current number TSTNE SAVA,15$ ; AZ (new) CALL NUMINC ; Increment it MOV R1,(R3) ; And save it MOV R3,LSAV ; Current level 15$: CMP R3,R2 ; Current > previous BLO 20$ ; No BIS #2,SAVA ; Record that we are going up ; AZ (new) 11/87 BIC #NM.MSK,(R2) ; Clear next level INC (R2)+ ; Set levels to 1 BR 15$ ; Not yet 20$: BLBC SAVA,21$ ; AZ (new) 11/87 JMP SETLVR ; AZ (new) 21$: CMPB LEVEL,OUTLV ; Current level too big? ; AZ (21$) BLE 25$ ; Level number is ok JMP COMNT ; Kill text at end of command. 25$: TSTEQB $AUSTL,27$ ; No autosubtitle? CMPB LEVEL,STLLV ; Level low enuf? BGT 27$ ; No MOV CASE,-(SP) ; Save current case CALL SETCAS ; Set correct case CALL STLSV ; Set up subtitle MOV (SP)+,CASE ; Restore ;--------------------------------------------------------------+ ; The following 5 lines of code replaced by RT-11 SIG so that | ; .HEADER LEVEL performs a test page before skipping lines in | ; accordance with the documentation. | ;27$: MOVB BEGLV,R2 ; SET LINE COUNT | ; BEQ 30$ ; None | ; CALL SKPNIF ; Skip lines by line count | ;30$: MOVB TPGLV,R1 ; SET TEST PAGE VALUE | ; CALL TESTT ; Test if room on current page | 27$: MOVB TPGLV,R1 ; SET TEST PAGE VALUE | CALL TESTT ; Test if room on current page | MOVB BEGLV,R2 ; SET LINE COUNT | BEQ 30$ ; None | CALL SKPNIF ; Skip lines by line count | 30$: ; | ;--------------------------------------------------------------+ CMPB LEVEL,TOCLV ; Do TOC this level? BGT 35$ ; No !! CALL BUFTOC ; Output command to TOC 35$: MOV RMARG,-(SP) ; Save right margin MOV LMARG,-(SP) ; Save margin MOVB LIDLV,R1 ; Margin changes MOVB RIDLV,R2 CALL SETMRG ; Set them CALL LINBEG ; Start new line MOV #LVSTAT,R2 ; Level status buffer CALL RSTAT ; Restore status MOV F.1,-(SP) ; Save flags ; AZ 2/88 4/88 TSTNEB $TOCBE,32$ ; Branch if TOC in progress ; AZ 4/88 BIC #FILLF,F.1 ; Turn off .FILL for header ; AZ 2/88 4/88 32$: MOV #CHPMG,SAVA ; Points to Headers ; AZ 4/88 (:) MOV #CHPM2,SAVB MOVB LEVEL,R0 ; Current level 36$: ADD #CH.HD1+1,SAVA ; Next entry ADD #CH.HD2+1,SAVB ; " SOB R0,36$ ; Find current level CALL SETINS ; Get input temporary CLRB LSTAT TSTNEB @SAVA,37$ ; Header ?? TSTEQB @SAVB,38$ ; No second header ?? 37$: CALL ESCCLR ; Set No escapes or underlining INCB LSTAT ; Set escape set MOV SAVA,R0 ; heading CALL PSTRZB ; Into temporary input 38$: MOVB LEVEL,R0 ; Get level # CMPB R0,NONLV ; Check No number level BLT 39$ ; Number level ? JMP 66$ ; No 39$: CLR -(SP) ; end of numbers MOV LSAV,R2 ; Get index CMPB R0,UNILV ; Unitary level number BGT 50$ ; unitary ?? MOV #APNDN,R2 ; POINT TO CHAPTER/LEVEL TABLE MOV (R2)+,R1 ; Current appendix number BEQ 40$ ; IF EQ NONE BIS APNDSP,R1 ; format MOV R1,-(SP) ; appendix to convert BR 45$ ; Continue with rest of levels 40$: TSTNE (R2),50$ ; Chapter oriented document? 45$: TST (R2)+ ; Skip chapter number 50$: MOV (R2)+,R1 ; Current chapter or level number BEQ 60$ ; Last one? BIS CHPDSP-CHPTN-$WORDL(R2),R1 ; set display format MOV R1,-(SP) ; save for conversion BR 50$ ; more 60$: CMPB LEVEL,UNILV ; Unitary level number BGT 65$ ; Unitary ?? TSTNE APNDN,65$ ; Chapter oriented? CMPNEB LEVEL,#1,65$ ; Not first level? TSTNE CHPTN,65$ ; Chapter oriented? TSTNEB $TRZER,65$ ; No trailing zeroes ? MOV #NM.DEC,-(SP) ; Terminating 0 65$: MOVB #PD,$SEPR ; digit separator CALL PAGCV ; convert numbers BGT 66$ ; Yes, no header MOV SAVB,R0 ; post-heading CALL PSTRZB ; Into input 66$: CALL INOUT ; Output the number MOVB LEVEL,R2 ; Level index CMPB R2,NONLV ; No number level BGE 80$ MOVB SPCLV,R4 ; Get number of spaces to indent CMPB R2,LINLV ; Run in level BGE 67$ ; Yes ? CMPB R2,CENLV ; Centered level BGE 70$ ; Yes ? 67$: MOVB TIDLV-1(R2),R0 ; Absolute indent SUB SPCH,R0 ; Subtract off number of chars. CMP R4,R0 ; compare spaces with offset BGT 70$ ; Spaces larger ? MOV R0,R4 ; Use offset 70$: TST R4 ; Test result BLE 80$ ; None! MOV #NXS,R1 ; Get quoted space to write 75$: TST LINBK BLE 80$ ; Done ?? CALL CCBYT ; SOB R4,75$ ; Output all spaces 80$: CALL $FRCND CMPNEB R1,#CR,81$ ; Not end of line ? JMP 120$ ; End of line? 81$: MOV CASE,-(SP) ; Save current case CALL SETCAS ; Set correct case CMPB LEVEL,CENLV ; Not center it? BLT 90$ ; Yes CMPB LEVEL,LINLV ; Run in level BGE 90$ ; Yes, do not center it BISB #SW.TDS,$CENSW ; Set to center it BR 92$ 90$: MOV SPCH,R1 ; Check on total char count CLR R2 ; No right margin change CALL SETMRG ; Try to reset margin BCS 92$ ; Yes skip margin change ADD R1,LINBK ; Reset chars/line NEG R1 MOV R1,INDCT ; Negative indentation first time 92$: BISB #SW.IDS,$AUHYP ; Prevent hyphenation BISB #SW.IDS,$IFLSW+1; Prevent indexing CALL LIN ; Transfer lines to buffer MOVB LEVEL,R2 ; GET LEVEL # DEC R2 INDXA R2 ; Now have word index TSTEQB LSTAT,93$ ; Pre-header not used ?? CALL ENDESC 93$: BICB #SW.IDS,$AUHYP ; Now allow it again BICB #SW.IDS,$IFLSW+1; Now allow it again MOV (SP)+,R1 ; Old case MOV R1,CASE ; No, restore previous MOV R1,CASSAV ; And saved case 95$: TSTEQB $TOCBE,96$ ; TOC in progress? ; AZ 2/88 JMP 120$ ; AZ 2/88 96$: CMPB LEVEL,LINLV ; Level >= run on line value ; AZ 2/88 BGE 110$ ; Yes CALL OUTNJ ; OUTPUT HEADING LINE BICB #SW.TDS,$CENSW ; Reset centering MOVB ENDLV,R2 ; SET LINE COUNT BEQ 100$ ; None CALL SKPNIF ; Skip lines 100$: MOV (SP)+,F.1 ; Restore .FILL flag ; AZ 2/88 4/88 MOV (SP)+,LMARG ; Restore margins ADD (SP),LINBK ; Reset line length SUB RMARG,LINBK ; MOV (SP)+,RMARG ; JMP LGO 110$: CALL LINBEG CMP LINBK,#3 ; Room for 3 more? BLE 120$ ; No MOVB #NXS,R1 ; insert space CALL CCBYT MOVB #MINUS,R1 ; insert dash CALL CCBYT MOV #NXS,R1 ; insert space CALL CCBYT 120$: ADD LMARG,INDCT ; Now set up indentation SUB $WORDL(SP),INDCT ; = cur - old marg + Old indent ; AZ 4/88 BR 100$ ; ; routine to set correct case ; SETCAS: CMPB LEVEL,MIXLV ; Capitalize first char? BGT 10$ ; No BIS #^o1002,CASE ; Yes 10$: CMPB LEVEL,CAPLV ; Higher than min capitalize level BGT 20$ ; Yes MOV #^o401,CASE ; Shift to upper case 20$: RETURN ; ; LIST command ; LISTC:: MOV LSTKP,R0 ; GET CURRENT LIST STACK POINTER CMP R0,#TKPEND ; LIST STACK OVERFLOW? BLO 1$ ; No ? JMP 40$ ; IF HI YES 1$: MOV LMARG,LS.MRG(R0); SAVE LEFT MARGIN ADD #CH.HD1,LSTKH0 ; Next char string CLRB @LSTKH0 ; No character in list ADD #CH.HD1,LSTKH1 ; Next prefix string ADD #CH.HD2,LSTKH2 ; Next postfix string ADD #LS.SIZ,R0 BIC #NM.MSK,(R0) ; Clear current list element number MOV R0,LSTKP ; New stack address CALL GETVS ; Get list vertical spacing MOV LSTKP,R0 ; GET CURRENT LIST STACK POINTER MOV R3,LS.VSP(R0) ; SET NEW LIST VERTICAL SPACING MOV #LSLMAR,R1 ; ASSUME EMBEDDED LIST INDENT CMPNE #LSTK+LS.SIZ,R0,10$ ; NOT FIRST ITEM IN STACK? MOV #LOLMAR,R1 ; SET FOR INITIAL LIST INDENT 10$: CLR R2 ; No right margin change CALL SETMRG ; Set margin BCS 30$ ; Bad ? CALL GETLIT ; Now get literal BCS 20$ ; None ? MOV LSTKH0,R2 ; Current list character pointer TSTEQ R1,20$ ; Zero length ? CMP R1,#CH.HD1 ; Is number of chars too many ? BLOS 15$ ; No MOV #51.,r0 ; Literal too long JMP ILCMA 15$: MOVB (r0)+,(R2)+ ; Move string SOB R1,15$ ; Till done 20$: RETURN 30$: MOV #13.,R0 ; Warn user about overlap error BR 50$ 40$: MOV #35.,R0 ; List level overflow 50$: JMP ILCMA ; Output error message ; ; Get the vertical spacing ; GETVS: CALL (R4) ; Get list vertical spacing BCC 1$ ; Found number ? MOV PARSP,R3 ; Default spacing 1$: CMP R3,#MAXPS ; LEGAL VALUE? BLOS 20$ ; yes ? JMP ERRHI ; IF HI NO RETURN 10$: MOV PARSP,R3 ; Paragraph spacing 20$: RETURN ERRHI: MOV #8.,R0 ; Param too big or negative JMP ILCMA ; ; END LIST COMMAND ; ELIST:: CALL GETVS ; Get final vertical spacing MOV LSTKP,R4 ; GET CURRENT LIST STACK POINTER CMP R4,#LSTK ; Unexpected end? BLOS 20$ ; Yes, Do not unstack SUB #LS.SIZ,R4 ; New address MOV R4,LSTKP ; SAVE NEW LIST STACK POINTER SUB #CH.HD1,LSTKH0 ; Next char string SUB #CH.HD1,LSTKH1 ; Next prefix string SUB #CH.HD2,LSTKH2 ; Next postfix string MOV LS.MRG(R4),LMARG ; Restore left margin MOV R3,R1 ; Final skip count JMP SKPLIF ; Skip lines if not at top of page 20$: MOV #30.,R0 ; Unexpected endlist JMP ILCMA ; Output error message ; ; LIST ELEMENT COMMAND ; LSTEL:: MOV LSTKP,R4 ; Get stack pointer MOV LS.VSP(R4),R1 ; GET LIST ELEMENT VERTICAL SPACING CALL SKPLIF ; SKIP LINES CALL PART0 ; Break page if necessary MOV LSTKP,R4 ; Get stack pointer MOV (R4),R1 ; Get current element CALL NUMINC ; Increment it MOV R1,(R4) ; Save it 15$: CALL LINBEG ; Begin new line CALL SETINS ; Get input temporary MOV LSTKH0,R0 ; Get character string TSTNEB (R0),30$ ; Is there one ? MOV LSTKH1,R0 ; Get prefix chars CALL PSTRZB ; And output them CLR -(SP) ; chock for number conversion MOV @LSTKP,-(SP) ; Get current element number CALL PAGCV ; convert numbers MOV LSTKH2,R0 ; Get list postfix 30$: CALL PSTRZB ; Put into output buffer CALL INOUT ; Output number MOV #NXS,R1 ; GET NON EXPANDABLE SPACE CALL CCBYT ; WRITE QUOTED SPACE INTO BUFFER CALL CCBYT ; WRITE ANOTHER QUOTED SPACE MOV SPCH,R1 ; Char count MOV LMARG,R0 ; Check left margin ADD INDCT,R0 ; Add in indentation SUB PLMRG,R0 ; Find difference from permanent margin BLE 50$ ; smaller SUB R1,R0 ; Is indent too large? BGE 40$ ; No ADD R0,R1 ; Yes, correct it 40$: ADD R1,LINBK ; Add extra to line counter SUB R1,INDCT ; Indentation 50$: CALL $FRCND ; FORCE TO LOGICAL END OF COMMAND TST (SP)+ ; CLEAN STACK JMP TEXTF ; Process text immediately ; ; END NOTE COMMAND ; ENOTC:: BITEQ #NOTF,F.1,20$ ; Note not in progress? MOV NOTSV,F.1 ; RESTORE FLAGS WORD MOV NOTRM,RMARG ; INCREASE RIGHT MARGIN MOV NOTLM,LMARG ; DECREASE LEFT MARGIN CALL (R4) ; Get skip after note BCC 1$ ; Found number ? MOV #NFSPAC,R3 ; SET SKIP COUNT 1$: MOV R3,R1 CMP R1,#MAXPS ; Compare with maximum paragraph spacing BLOS 10$ ; Ok ? JMP ERRHI ; Too big ? 10$: JMP SKPLIF ; SKIP LINES 20$: MOV #29.,R0 ; Message number JMP ILCMA ; Bad end note ; ; NOTE COMMAND ; NOTE:: MOV #NHSPAC,R1 ; Pre line count CALL SKPLIF ; SKIP LINES MOV LMARG,NOTLM ; Save margins MOV RMARG,NOTRM ; Save margins MOV RMARG,R0 ; Get right margin SUB LMARG,R0 ; Minus left margin ASR R0 ; Half of difference ASR R0 ; One fourth of difference ASR R0 ; Now 1/8 MOV #NPMARG,R1 ; Note margin 5$: CMP R0,R1 ; Margin too wide? BGE 10$ ; No ? SUB #NSMARG,R1 ; Secondary indent BGT 5$ ; Not zero ADD #NSMARG,R1 ; Secondary indent 10$: CALL SETMRS ; Margins set? BCC 20$ ; Yes 15$: MOV #MRGERR,R0 ; Error message CALL ILCMC ; Output error 20$: MOV F.1,NOTSV ; SAVE CURRENT FLAGS WORD BIS #FILLF!JUSTF!PJUSTF!NOTF,F.1 ;SET FLAGS MOV #NASPAC+1,R1 ; post line count ADD PARPT,R1 ; Plus test page count CALL PART1 ; Use paragraph test page CALL LINBEG ; Start new line BISB #SW.TDS,$CENSW ; SET UP TO CENTER TEXT BISB #SW.IDS,$IFLSW+1; Prevent indexing CALL $FRCND CMPEQ R1,#CR,25$ ; End of line ? CALL GCIN ; Get line CALL BKSPI ; Backspace to LF TSTNE SPCH,30$ ; Any text ? 25$: MOV #NOTET,R2 ; POINT TO NOTE TEXT PROTOTYPE CALL TMPIN ; Set up in buffer CALL GCIN 30$: BICB #SW.IDS,$IFLSW+1; Now allow it again MOV #NASPAC,R1 CALL MULSP ; Get line adjusted MOV R1,EQBOT ; SET bottom LINE COUNT JMP OUTLIN ; OUTPUT THE TEXT ; ; Routine to reduce margins ; ; R1=left reduction ; r2=right reduction ; r0=destroyed ; SETMRS: MOV R1,R2 ; Both left and right SETMRG: MOV RMARG,R0 SUB LMARG,R0 SUB R1,R0 SUB R2,R0 ; Total margins CMP R0,#MINLN ; Too small?? BGE 1$ ; No SEC RETURN 1$: MOV #LMARG,R0 ; Margin ADD R1,(R0) ; New left CMP (R0)+,PLMRG ; Is left margin big enough? BGE 10$ ; Yes ADD -(R0),R1 ; Compensate R1 SUB PLMRG,R1 ; Now is actual indent MOV PLMRG,(R0)+ ; And is permanent margin 10$: SUB R2,(R0) ; New right CMP (R0),PRMRG ; Is right margin small enough? BLE 20$ ; Yes SUB (R0),R2 ; Compensate R2 ADD PRMRG,R2 ; Now is actual indent MOV PRMRG,(R0) ; And is permenant margin 20$: SUB R1,LINBK ; New char count SUB R2,LINBK ; New char count CALL STCMRG ; No! CLC RETURN ; ; Set up center margin ; STCMRG: MOV RMARG,R0 ; Get right margin ADD LMARG,R0 ; Sum of right and left margins ASR R0 ; Divide by 2 MOV R0,CMARG ; Set for center margin RETURN ; ; put byte and incrment counter ; CCBYT: CMPNEB R1,#SPC,10$ ; not space? CALL BRKSV ; Set break here INC SPCNT ; increment space count MOV #SPC,R1 ; Save space 10$: JMP PUBYT ; Put underlined byte ; ; SUBTITLE COMMAND ; SETSTL::CLR STLCAS SETST1: MOV #STLBF,R3 ; SUBTITLE BUFFER MOV #STLHD2,-(SP) ; Header addresses MOV #STLHD1,-(SP) ; Header addresses BR SETBF ; ; ; no title command ; NTITL:: MOVB #-1,$NTITL ; set no title print RETURN ; ; FIRST TITLE COMMAND ; UCTTL: MOV #^o401,TTLCAS ; Shift to upper case BR SETTL1 FTITL:: BITNE #LCKF,F.1,SETTL ; Params locked? CLRB $HDRSW ; ENABLE HEADER ON FIRST PAGE ; ; TITLE COMMAND ; SETTL:: CLR TTLCAS ; No title case settl1: MOV #TTLBF,R3 ; SET FOR TITLE BUFFER BITNE #LCKF,F.1,10$ ; param not locked? ; AZ (was BITEQ) CLRB $NTITL ; set for print of titles 10$: MOV #TTLHD2,-(SP) ; Header addresses MOV #TTLHD1,-(SP) ; Header addresses SETBF: CALL CLRBF ; SET BUFFER EMPTY MOV (SP)+,R0 ; Get pre-header CALL PSTRZB CALL $FRCND ; FORCE TO LOGICAL END OF COMMAND CLR BF.SPC(r3) 10$: CALL CCIN ; READ TITLE OR SUBTITLE CMPEQB R1,#CR,15$ ; Done ?? CALL PBYT ; Save the char INC BF.SPC(r3) BR 10$ ; Continue with more 15$: MOV (SP)+,R0 ; Get pre-header CALL PSTRZB TSTNE BF.SPC(R3),17$ ; Any chars stored ?? CALL CLRBF BR 20$ ; No title/subtitle 17$: MOV BF.FUL(R3),BF.SPC(R3) ; Get total char count TSTNEB $HDSTS,20$ ; Permanent status set ? MOV #HDSTAT,R2 ; No, save status CALL SSTAT 20$: RETURN ; ; ; SEND PAGE TOC command ; SENPTC::CALL (R4) ; get parameter BCC 1$ ; Found number ? CLR R3 ; Default value 1$: CMP R3,#9. ; Check max BLOS 2$ ; OK ? JMP ERRHI 2$: TSTEQB $TOCSW,3$ ; TOC? JMP COMNT ; No, treat text as comment 3$: MOV R3,R5 ; Save param CALL LINFAK ; Get output buffer address in R3 MOV #IFTXT,R2 ; Get if text CALL IFOUT CALL $FRCND ; Get beginning of line MOV #TOCX,R1 ; TOC flag CALL PBYT MOV #1,R1 ; Output status CALL PBYT ; Set to output number MOV #72.,R4 ; Max number of chars 10$: CALL CCIN ; Get input CMPEQB R1,#CR,20$ ; End ?? CALL PBYT ; Save it SOB R4,10$ ; Till full 20$: CALL CBYT ; Done MOV #EITXT,R2 ; Now end if text TSTNE BF.HED(R3),IFOUT; Header exists ? CALL IFOUT CALL CBYT ; Chock line RETURN IFOUT: TSTEQ R5,10$ ; No param or null ? 1$: MOVB (R2)+,R1 ; Get byte to trans BEQ 5$ ; Done ?? CALL PBYT ; Put into output BR 1$ 5$: MOV R5,R1 ; With number ADD #zero,R1 ; Convert to number CALL PBYT CALL CBYT ; to chock end 10$: RETURN ; ; Output a number ; INOUT: MOV #LF,R1 CALL PBYT MOV BF.SPC(R3),R1 ; Get beginning of string CALL FNDBF ; Reset to beginning CALL OUTAD ; Get output buffer MOV F.1,-(SP) ; Save status BIC #FILLF,F.1 ; Set no fill BISB #^o40,$NOSPC ; Set no spaces CALL GCIN ; Get number BICB #^o40,$NOSPC ; Restore MOV (SP)+,F.1 ; Restore JMP POPINS ; Pop input .END