.title fmtcm ; ; ; ; J. CLEMENT - 1983 ; Rewrote most of the code ; ; 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 BIC #^C,R1 ; Clear extra bits INC R1 ; increment appendix number BNE 10$ ; Non zero? INC R1 ; Make it 1 10$: 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 BIC #^C,R1 ; Clear extra bits INC R1 ; increment appendix number BNE 10$ ; Non zero? INC R1 ; Make it 1 10$: 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: BICB #SW.TDS,$PAGNG ; Enable paging CALL TXDMP ; Dump all deferred text CLRB LEVEL ; Current level # CALL ESCCLR ; Clear escapes and underlining CLR LEVNM ; And clear current header level MOV #STLBF,R3 ; CLEAR SUBTITLE BUFFER CALL CLRBF TSTNEB $AUTTL,5$ ; No auto title? CALL TTLSV ; Save title 5$: CALL $FRCND ; Start at beginning of title TSTEQB $TOCBE,6$ ; TOC not in progress ?? RETURN 6$: 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 TSTEQB $ODPAG,10$ ; Odd page not enabled ? BITNE #1,PAGNX,10$ ; Next page odd ? CALL PAGRST INCB $PAGBR ; Set no current page 10$: BISB #SW.TDS,$HDRSW ; no header at begin chapters/appendix MOVB CHLAY,R0 ; Any chapter layout ? BLT 20$ ; No ? MOVB R0,NXLAY ; Next layout MOV CHEPSP,NXEPSP ; And end of page spacing 20$: CALL PAGRST ; Break page + reset subpage 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 ; 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 CALL PUTPAG ; Page number 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 ; ; 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 GCTABL(R1),#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 ; ; HEADER LEVEL COMMAND ; HEADR:: MOVB LEVEL,R3 ; Initial level # 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 #3,R0 ; Param too big 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 CLR (R3) ; Clear next level INC -(R3) ; Increment current level MOV R3,LSAV ; Current level 15$: CMP R3,R2 ; Current > previous BLO 20$ ; No MOV #1,(R2)+ ; Set levels to 1 BR 15$ ; Not yet 20$: CMPB LEVEL,OUTLV ; Current level too big? 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 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 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 #CHPMG,SAVA ; Points to Headers 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 TSTNEB @SAVA,37$ ; Header ?? TSTEQB @SAVB,38$ ; No second header ?? 37$: CALL ESCCLR ; Set No escapes or underlining INC 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 TSTEQ 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$: TSTNEB $TOCBE,120$ ; TOC in progress? CMPB LEVEL,LINLV ; Level >= run on line value 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)+,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 (SP),INDCT ; = current - old margin + Old indentation 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? BHIS 40$ ; IF HI YES MOV LMARG,LS.MRG(R0); SAVE LEFT MARGIN ADD #LS.SIZ,R0 CLR (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 MOVB 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 R0,R2 ; Character address MOV LSTKP,R0 ; GET CURRENT LIST STACK POINTER MOVB (R2),LS.CHR(R0) ; Save character CMP R1,#1 ; Is number of chars too many ? BLOS 20$ ; No MOV #51.,r0 ; Literal too long JMP ILCMA 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 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 MOVB 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 INC (R4) ; INCREMENT LIST ELEMENT NUMBER BNE 10$ ; Non zero? INC (R4) ; INCREMENT LIST ELEMENT NUMBER 10$: CMP (R4),#4000. ; Too big ? BLO 15$ ; No MOV #1,(R4) ; Reset it 15$: CALL LINBEG ; Begin new line CALL SETINS ; Get input temporary MOV LSTKP,R4 ; Current list stack MOVB LS.CHR(R4),R1 ; Get list character BNE 30$ ; Any ? MOVB LS.PRE(R4),R1 ; Get first char CMP R1,#SPC ; Space or less? BLE 20$ ; Yes, do not output it CALL PBYT ; Save it 20$: CLR -(SP) ; chock MOV (R4),-(SP) ; GET CURRENT ELEMENT NUMBER BIS LS.FMT(R4),(SP) ; Set the format bits CALL PAGCV ; convert numbers MOVB LS.PST(R4),R1 ; Second char CMP R1,#SPC ; Space or less? BGE 30$ ; No, char is OK MOV #PD,R1 ; GET PERIOD 30$: CALL PBYT ; WRITE PERIOD INTO 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 BITEQ #LCKF,F.1,10$ ; param not locked? 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