.TITLE FMTCM .IDENT /M3.0/ ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* * ;* 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 COMMANDS ; ; AUTHOR: D. N. CUTLER 22-SEP-75 ; ; MODIFIED BY ; ; C. H. Spalding, Unimation, Apr. '83 ; ; MODIFICATIONS ; ; chs03 Reduce blank lines from CHAPTER, APPENDIX, & INDEX ; chs15 No "BLANK 3" from "HL" if after "CH" or "AX" ; chs16 Use local symbols in place of constants ; chs19 Add AUTOSUBTITLE ; chs20 Add optional-text commands ; chs22 Output multi-part error message on one line ; chs27 Misc. changes to LIST commands ; chs37 Fix FIGURE to work as claimed; added queue ; chs39 Add LAYOUT and related switches ; chs40 Expand HEADER ; chs42 Distinguish between "ILLEGAL COMMAND" and "BAD PARAMETER" ; chs44 Add "!" comment command and flag ; chs45 Add optional-text command-line switches ; chs47 Allow consecutive subpages ; chs48 Changes to CHAPTER and NUMBER CHAPTER ; chs57 Changes to NOTE ; chs59 Add limit on chapters output ; chs60 Make syntax for command arguments common ; chs63 Control blank lines after END LIST & END NOTE ; chs68 Store appendix letter in byte ; chs69 Consider line spacing in TEST PAGE ; chs73 Provide for unnumbered lists ; chs74 Allow relative/default header level argument ; chs78a Add BLOCK ; chs79 Move infrequent code to SETUP.MAC ("START" overlay) ; chs82 Add Table of Contents ; chs82a Rework AUTOSUBTITLE processing ; chs83 Add AUTOCONTENTS ; chs84 Add exit status (rework error handling) ; chs90 Correct centering of undelined CHAPTER/APPENDIX & NOTE titles ; chs91 Add LEVEL STYLE ; ; ALL COMMAND ROUTINES ARE ENTERED WITH: ; ; R4 = Address of number conversion routine ; R5 = Address of flag word F.1 ; ; LOCAL DATA ; ; Standard headings ; APNMG: .ASCIZ /APPENDIX / ;APPENDIX HEADING PROTOTYPE CHAPT: .ASCIZ /CHAPTER / ;CHAPTER HEADING PROTOTYPE NOTET: .ASCIZ /NOTE/ ;NOTE HEADING PROTOTYPE .EVEN ; APPENDIX, CHAPTER ; APPENDIX command .ENABL LSB APNDX:: MOV #APNMG,-(SP) ;SET ADDRESS OF APPENDIX HEADING .IIF NZ FIGFIX, CALL FIGDMP ;PROCESS ALL PENDING FIGURES ;chs37 .IIF NZ BLKCMD, CALL BLKDMP ;PROCESS ALL QUEUED TEXT BLOCKS ;chs78a BR 10$ ; ; CHAPTER command CHPTR:: MOV #CHAPT,-(SP) ;SET ADDRESS OF CHAPTER HEADING .IIF NZ FIGFIX, CALL FIGDMP ;PROCESS ALL PENDING FIGURES ;chs37 .IIF NZ BLKCMD, CALL BLKDMP ;PROCESS ALL QUEUED TEXT BLOCKS ;chs78a .IIF NZ CHSW, INCB CHPTN ;INCREMENT CHAPTER NUMBER ;chs59 10$: MOV TTLP1,TTLP2 ;CLEAR TITLE BUFFER MOV STTLP1,STTLP2 ;CLEAR SUBTITLE BUFFER MOV #ILMRG,LMARG ;SET LEFT MARGIN ;chs16 MOV PRMRG,RMARG ;SET RIGHT MARGIN MOV #SPCNG,NSPNG ;SET INITIAL SPACING BIS #FILLF!JUSTF!PJUSTF,(R5) ;SET FILL AND JUSTIFY FLAGS CLR PAGENO ;SET INITIAL PAGE NUMBER MOV SP,$NUMSW ;TURN ON PAGE NUMBERING ;chs48 TSTNE LINEC,15$ ;NOT AT TOP OF PAGE ALREADY? INC PAGENO ;INCREMENT PAGE NUMBER 15$: .IF NZ SBPFIX ;chs47+ CALL ENDSBP ;BREAK CURRENT PAGE (END ANY SUBPAGE) .IFF ;chs47- CALL PAGEC ;BREAK CURRENT PAGE .ENDC ; -NZ SBPFIX ;chs47 .IF NZ BLSW ;USE CONTROLLABLE NO. BLANK LINES ;chs03+ MOV CHPSKP,R2 ;SET LINE COUNT SUB $HDRSW,R2 ;DECREASE BY HEADER LENGTH ;chs40 BLE 16$ ;NOTHING TO DO? .IFF ;...USE FIXED NO. BLANK LINES ;chs03- MOV #7.,R2 ;SET LINE COUNT .ENDC ; -NZ BLSW ;chs03 CALL SKIPN ;SKIP LINES 16$: MOV RMARG,R2 ;CALCULATE SPACE COUNT TO HEADING SUB LMARG,R2 ;chs16 ASR R2 ADD LMARG,R2 ;chs16 SUB #5.,R2 .IF NZ LAYOUT ;chs39+ CALL NSPACB ;SPACE OVER FROM BASE MARGIN .IFF ;chs39- CALL NSPAC ;SPACE TO CHAPTER HEADING .ENDC ; -NZ LAYOUT ;chs39 MOV (SP),S1 ;SET ADDRESS OF OUTPUT HEADING CALL FMSG ;OUTPUT HEADING MOV #CHPTN+MAXHL+1,R0 ;POINT PAST LAST LEVEL NUMBER ;chs68+ .IIF NZ RELHDL, MOVB #1,(R0) ;SET INITIAL DEFAULT HEADER LEVEL ;chs74 MOV #MAXHL,R1 ;NUMBER OF LEVELS TO CLEAR 17$: CLRB -(R0) ;CLEAR LEVEL NUMBERS SOB R1,17$ ;chs68- CMPEQ #CHAPT,(SP)+,20$ ;CHAPTER COMMAND? INCB APNDN ; NO, INCREMENT APPENDIX LETTER ;chs68 MOVB APNDN,R1 ;GET APPENDIX LETTER ADD #'A-1,R1 ;CONVERT TO UPPER CASE LETTER CALL FOUT ;OUTPUT LETTER CLRB CHPTN ;CLEAR CHAPTER NUMBER ;chs BR 30$ 20$: .IF NZ CHSW ;chs59+ DEC R0 ;DECREMENT POINTER .IFF ;chs59- INCB -(R0) ;INCREMENT CHAPTER NUMBER .ENDC ; NZ CHSW ;chs59 MOVB (R0),R0 ;GET CHAPTER NUMBER CALL DECPRT ;OUTPUT CURRENT CHAPTER NUMBER CLRB APNDN ;CLEAR APPENDIX LETTER ;chs68a 30$: MOV #,R2 ;SET LINE COUNT ;chs16 CALL SKIPN ;SKIP TWO LINES .IF NZ ATOTOC ;chs83+ CLR HDRLVL ;INDICATE CHAPTER/APPENDIX LEVEL CALL COMPHL ;COMPOSE TOC LEVEL IN SEC. BUFFER CALL SAVTOC ;CREATE TOC ENTRY IF WANTED CLR NSPCH ;FORGET NONSPACING CHARACTER COUNT ;chs90 .ENDC ; NZ ATOTOC ;chs83- CALL SETTL ;MOVE TITLE TO BUFFER MOV RMARG,R2 ;CALCULATE SPACE TO CENTER TEXT SUB LMARG,R2 ;chs16 ADD TTLP1,R2 SUB TTLP2,R2 ADD NSPCH,R2 ;ADJUST FOR NONSPACING CHARACTERS ;chs90 ASR R2 ADD LMARG,R2 ;chs16 .IF NZ LAYOUT ;chs39+ CALL NSPACB ;SPACE OVER FROM BASE MARGIN .IFF ;chs39- CALL NSPAC ;SPACE TO START OF TEXT .ENDC ; -NZ LAYOUT ;chs39 MOV #TTLP1,R4 ;POINT TO TITLE DESCRIPTOR CALL PSTRPA ;OUTPUT CONTENTS OF TITLE BUFFER MOV #,R2 ;SET LINE COUNT ;chs16 JMP SKIPN ;SKIP THE LINES .DSABL LSB ; HEADER LEVEL command HEADR:: .IF NZ RELHDL ;chs74+ MOVB LASTHL,R3 ;GET CURRENT HEADER LEVEL .IFTF ;chs74- CALL (R4) ;GET HEADING LEVEL NUMBER .IFT ;chs74+ MOVB LASTHL,R3 ;DEFAULT TO CURRENT LEVEL CMP R3,#1 ;LEVEL VALUE GREATER THAN 0? BLT 10$ ; NO, ERROR CMP R3,#MAXHL ;LEVEL NUMBER TOO BIG? BLE 15$ ; NO, CONTINUE 10$: JMP ILCM ; YES, ERROR 15$: MOVB R3,LASTHL ;SAVE CURRENT LEVEL .IIF NZ ATOHDR+HLSTYL, MOV R3,HDRLVL ;SAVE IT FOR REFERENCES ;chs91 ADD #CHPTN,R3 ;POINT TO LEVEL COUNTER .IFF ;chs74- 10$: JMP ILCM ;MUST BE LEVEL NUMBER DEC R3 ;REDUCE LEVEL BY ONE BLT 10$ ;INPUT VALUE MUST BE > 0 ;chs CMP R3,# ;LEGAL LEVEL NUMBER? ;chs16 BHI 10$ ;IF HI NO .IIF NZ ATOHDR, MOV R3,HDRLVL ;SAVE IT FOR AUTO REFERENCES ;chs83 ADD #CHPTN+1,R3 ;POINT TO LEVEL COUNTER .ENDC ; -NZ RELHDL ;chs74 INCB (R3)+ ;INCREMENT LEVEL NUMBER 20$: CMP R3,#CHPTN+MAXHL ;END OF LEVEL NUMBERS? ;chs16 BHI 30$ ;IF HI YES CLRB (R3)+ ;CLEAR NEXT LEVEL NUMBER BR 20$ ; 30$: TSTEQB -(R3),30$ ;ZERO LEVEL? MOV R3,-(SP) ;SAVE ADDRESS OF LAST LEVEL TO PRINT .IF NZ HLSKP ;chs15+ CMP $HDRSW,LINEC ;IN HEADER REGION OF PAGE? BGE 33$ ;IF GE YES CMPNE #1,PAGENO,32$ ;DON'T OUTPUT BLANK LINES IF TSTNEB CHPTN,315$ ; ON FIRST PAGE OF CHAPTER TSTEQB APNDN,32$ ; OR APPENDIX AND 315$: MOV CHPSKP,R2 ; AT TOP OF PAGE ADD #,R2 ;(# LINES IN CH. HEADER) ;chs16 CMP LINEC,R2 BLE 33$ 32$: .IF NZ HLSTYL ;chs91+ MOV HDRLVL,R3 ;GET LEVEL NUMBER MOVB (R3),R2 ;GET LINES TO SKIP CALL SKIPN MOVB (R3),R3 ;GET TEST PAGE VALUE .IFF ;chs91- MOV #HLBL1,R2 ;SKIP SOME LINES CALL SKIPN MOV #,R3 ;SET TEST PAGE VALUE .ENDC ; -NZ HLSTYL ;chs91 CALL TESTP ;TEST IF PAGE SHOULD BE .IFF ;chs15- MOV #8.,R3 ;SET TEST PAGE VALUE CALL TESTP ;TEST IF PAGE SHOULD BE BROKEN CMP $HDRSW,LINEC ;IN HEADER REGION OF PAGE? BGE 33$ ;IF GE YES MOV #,R2 ;SET LINE COUNT ;chs16 CALL SKIPN ;SKIP THREE LINES .ENDC ; -NZ HLSKP ;chs15 33$: .IF Z ATOTOC ;chs83+ .IIF NZ ATOHDR, CALL SAVTXT ;STORE TEXT ARG. IN COMMAND BUFFER CALL SDINI ;INITIALIZE SECONDARY BUFFER POINTERS ;; MOV #SDINP+2,R5 ;GET ADDRESS OF SECONDARY BUFFER DESCRIPTOR ;; MOV #SDBUF-1,(R5) ;INITIALIZE DESCRIPTOR ;; MOV (R5),-(R5) ;chs83- MOV #SDWCI,R3 ;SET ADDRESS OF WRITE CHARACTER ROUTINE .IFTF ;chs83 .IF NZ HLSTYL ;chs91+ CMP HLTYP2,(SP) ;HEADING LEVEL STYLE 1? .IFF ;chs91- CMP #CHPTN+3,(SP) ;HEADING LEVEL 1 OR 2? .ENDC ; -NZ HLSTYL ;chs91 BLOS 35$ ;IF LOS NO MOV LMARG,R2 ;GET VALUE OF LEFT MARGIN ADD INDCT,R2 ;ADD IN INDENTATION CLR INDCT .IF NZ LAYOUT ;chs39+ CALL NSPACB ;SPACE OVER FROM BASE MARGIN .IFF ;chs39- CALL NSPAC ;SPACE TO LEFT MARGIN .ENDC ; -NZ LAYOUT ;chs39 35$: .IFF ;chs83+ CALL COMPHL ;COMPOSE LEVEL NUMBER IN SEC. BUFFER .IFT ;chs83- MOV #CHPTN,R2 ;POINT TO CHAPTER/LEVEL TABLE MOVB APNDN,R1 ;GET CURRENT APPENDIX NUMBER BEQ 37$ ;IF EQ NONE INC R2 ;POINT PAST CHAPTER NUMBER ADD #'A-1,R1 ;CONVERT TO ASCII CHARACTER CALL (R3) ;WRITE CHARACTER IN BUFFER BR 55$ 37$: MOVB (R2)+,R0 ;GET CHAPTER NUMBER ; BIC #177400,R0 ;CLEAR POSSIBLE SIGN EXTENSION ;chs48c BNE 50$ ;IF NE CHAPTER ORIENTED DOCUMENT CMPNE R2,(SP),40$ ;NOT HEADER LEVEL 1? INC (SP) ;PRINT TRAILING ZERO 40$: MOVB (R2)+,R0 ;GET NEXT LEVEL NUMBER BIC #177400,R0 ;CLEAR POSSIBLE SIGN EXTENSION ;chs 50$: CALL CVTNM ;CONVERT CHAPTER/LEVEL NUMBER CMP R2,(SP) ;LAST NUMBER CONVERTED? BHI 60$ ;IF HI YES 55$: MOV #PD,R1 ;WRITE PERIOD INTO BUFFER CALL (R3) BR 40$ 60$: MOV #QTS,R1 ;WRITE TWO QUOTED SPACES INTO BUFFER ;chs+ CALL (R3) CALL (R3) ;chs- .ENDC ; Z ATOTOC ;chs83 .IIF NZ ATOHDR, CALL 300$ ;CONSIDER AUTOSUBTITLE & TOC ;chs83 .IF NZ HLSTYL ;chs91+ CMP HLTYP2,(SP)+ ;HEADING LEVEL STYLE 2? .IFF ;chs91- CMP #CHPTN+3,(SP)+ ;HEADING LEVEL 3, 4, OR 5? .ENDC ; -NZ HLSTYL ;chs91 BHI 80$ ;IF HI NO ;; MOV #QTSP,R1 ;WRITE TWO QUOTED SPACES INTO BUFFER ;chs+ ;; CALL (R3) ;; CALL (R3) ;chs- .IF NZ GENSEP ;chs60+ CALL SKPSEP ;ANY TEXT? BCS 75$ ;C BIT INDICATES NONE FOUND .IFF ;chs60- CALL $FRCND ;FORCE TO LOGICAL END OF COMMAND .ENDC ; -NZ GENSEP ;chs60 70$: CALL CCIN ;READ CHARACTER FROM FILE CMPEQ #CR,R1,75$ ;CARRIAGE RETURN? CALL (R3) ;WRITE CHARACTER IN BUFFER BR 70$ 75$: MOV (PC)+,R1 ;GET SPACE AND DASH ;chs+ .BYTE SPC,'- CALL (R3) ;WRITE SPACE INTO BUFFER ;chs- SWAB R1 ;SWAP DASH TO RIGHT BYTE CALL (R3) ;WRITE DASH INTO BUFFER CALL (R3) ; AND ANOTHER ;chs15b+ ;; SWAB R1 ;SWAP QUOTED SPACE TO RIGHT BYTE ;; CALL (R3) ;WRITE QUOTED SPACE INTO BUFFER ;chs15b- MOV #CR,R1 ;WRITE CARRIAGE RETURN INTO BUFFER CALL (R3) JMP LINEP ;FINISH IN COMMON CODE ;chs27 80$: ;; MOV #SPC,R1 ;GET A SPACE CHARACTER ;chs+ ;; CALL (R3) ;WRITE TWO SPACES INTO BUFFER ;; CALL (R3) ;chs- CALL SHFUC ;SHIFT TO UPPER CASE FOR HEADING LINE CALL SETBF ;TRANSFER REMAINDER OF LINE TO BUFFER MOV R5,R4 ;SET ADDRESS OF LINE DESCRIPTOR CALL PSTRPA ;OUTPUT HEADING LINE MOV #,R2 ;SET LINE COUNT ;chs16 JMP SKIPN ;SKIP TWO LINES .IF NZ ATOHDR ;chs83+ ; Local subroutine to process automatic subtitle setting ; and automatic entry into table of contents 300$: .ENABL LSB .IF NZ ATOSUB ;chs19+ CMPB ASTLVL,HDRLVL ;AUTO SUBTITLE AT THIS LEVEL? BLT 310$ ; NOT IF LOWER MOV R5,-(SP) ;SAVE POINTER CALL SETSTL ;SET THE SUBTITLE MOV (SP)+,R5 ;RESTORE POINTER .IIF NZ ATOTOC, CALL 320$ ;RESET BUFFER STATUS ;chs83 310$: .ENDC ; NZ ATOSUB ;chs19- .IF NZ ATOTOC ;chs83+ SAVTOC: CMPB ATCLVL,HDRLVL ;AUTO TABLE OF CONTENTS AT THIS LEVEL? BLT 330$ ; NOT LIMIT LOWER THAN CURRENT MOV R3,-(SP) ;SAVE POINTER CALL HDRTOC ;CREATE TOC ENTRY MOV (SP)+,R3 ;RESTORE POINTER MOV #SDBUF-1,SDINP ;RESET POINTER TO START OF TEXT .ENDC ; NZ ATOTOC ;chs83- 320$: INCB $CBISW ;DIRECT INPUT FROM COMMAND BUFFER MOV #CMBF-1,CMSTP ;RESTORE POINTER TO START OF TEXT ARG. 330$: RETURN ;chs19 .DSABL LSB .ENDC ; -Z ATOHDR ;chs83 ; Local subroutine to compose the ASCII header level number in the ; secondary input buffer (followed by 2 quoted spaces [QTS]). ; On entry: HDRLVL = Header level being processed (0 = CH/AX) .IF NZ ATOTOC ;chs83+ COMPHL: CALL SAVTXT ;STORE TEXT ARG. IN COMMAND BUFFER CALL SDINI ;INITIALIZE SECONDARY BUFFER POINTERS MOV #SDWCI,R3 ;SET ADDRESS OF WRITE-CHARACTER ROUTINE MOV #CHPTN,R2 ;POINT TO CHAPTER/LEVEL TABLE MOV HDRLVL,-(SP) ;PUT CURRENT LEVEL ON STACK BNE 10$ ;SKIP IF NOT DOING CHAPTER/APPENDIX INC (SP) ; ELSE, ADD ONE LEVEL 10$: ADD R2,(SP) ;CONVERT TO TABLE ADDRESS OF LAST ; LEVEL NUMBER TO OUTPUT MOVB APNDN,R1 ;GET CURRENT APPENDIX NUMBER BEQ 20$ ;IF EQ NONE INC R2 ;POINT PAST CHAPTER NUMBER ADD #'A-1,R1 ;CONVERT TO ASCII CHARACTER CALL (R3) ;WRITE CHARACTER IN BUFFER BR 50$ 20$: MOVB (R2)+,R0 ;GET CHAPTER NUMBER ; BIC #177400,R0 ;CLEAR POSSIBLE SIGN EXTENSION ;chs48c BNE 40$ ;IF NE CHAPTER ORIENTED DOCUMENT CMPNE R2,(SP),30$ ;NOT HEADER LEVEL 1? INC (SP) ;PRINT TRAILING ZERO 30$: MOVB (R2)+,R0 ;GET NEXT LEVEL NUMBER BIC #177400,R0 ;CLEAR POSSIBLE SIGN EXTENSION ;chs 40$: CALL CVTNM ;CONVERT CHAPTER/LEVEL NUMBER CMP R2,(SP) ;LAST NUMBER CONVERTED? BHI 60$ ;IF HI YES 50$: MOV #PD,R1 ;WRITE PERIOD INTO BUFFER CALL (R3) BR 30$ 60$: MOV #QTS,R1 ;WRITE TWO QUOTED SPACES INTO BUFFER CALL (R3) CALL (R3) TST (SP)+ ;CLEAN STACK RETURN .ENDC ; NZ ATOTOC ;chs83- ; LIST command .ENABL LSB LISTC:: CALL (R4) ;GET LIST VERTICAL SPACING MOV LSTVS,R3 ;DEFAULT TO CURRENT SPACING CMP R3,#MXSPC ;LEGAL VALUE? BHI 30$ ;IF HI NO MOV LSTKP,R0 ;GET CURRENT LIST STACK POINTER ;FOLLOWING TEST MOVED TO HERE ;chs73 CMP R0,#LSTK+ ;LIST STACK FULL? ;chs27a BEQ 31$ ;IF EQUAL YES ;chs42 MOVB LMARG,(R0)+ ;SAVE LEFT MARGIN MOVB LSTCT,(R0)+ ;SAVE LIST ELEMENT COUNT MOVB LSTVS,(R0)+ ;SAVE VERTICAL SPACING ;chs27a MOVB LSTPT,(R0)+ ;SAVE TEST-PAGE COUNT ;chs27a .IIF NZ LISTCH, MOV LSTCH,(R0)+ ;SAVE SPECIAL CHARACTER ;chs73 MOV F.1,(R0)+ ;SAVE FLAG WORD MOV CMADR,(R0)+ ;SAVE EXPECTED COMMAND ADDRESS MOV R0,LSTKP ;SAVE NEW LIST STACK POINTER MOV R3,LSTVS ;SET NEW LIST VERTICAL SPACING MOV #ILSTTP,LSTPT ;SET NEW TEST-PAGE COUNT ;chs27a BIS #SPECF,(R5) ;SET SPECIAL PROCESSING FLAG CLRB LSTCT ;CLEAR CURRENT LIST ELEMENT NUMBER .IF NZ LISTCH ;chs73+ MOV #LSLMAR,R2 ;ASSUME EMBEDDED LIST INDENT CMPNE #LSTK+,R0,10$ ;NOT FIRST ITEM IN STACK? MOV #LOLMAR,R2 ;SET FOR INITIAL LIST INDENT 10$: CALL NXTCHR ;GET FOLLOWING CHARACTER BCS 12$ ;SKIP IF END OF COMMAND HIT CMPEQ #CMA,R1,10$ ;KEEP LOOKING IF COMMA MOVB R1,LSTCH ;SAVE AS NEW LIST CHARACTER DEC R2 ;DECREASE MARGIN FOR UNNUMBERED LIST BR 14$ 12$: CLRB LSTCH ;DISABLE LIST CHARACTER 14$: ADD LMARG,R2 ;CALCULATE NEW LEFT MARGIN CMP R2,RMARG ;OVERLAP RIGHT MARGIN? .IFF ;chs73- MOV #LSLMAR,R4 ;ASSUME EMBEDDED LIST INDENT CMPNE #LSTK+,R0,10$ ;NOT FIRST ITEM IN STACK? ;chs27a MOV #LOLMAR,R4 ;SET FOR INITIAL LIST INDENT 10$: ADD LMARG,R4 ;CALCULATE NEW LEFT MARGIN CMP R4,RMARG ;OVERLAP RIGHT MARGIN? .IFTF ;chs73 BLT 20$ ;IF LT NO CALL $ERMSG ;WARN USER ABOUT OVERLAP ;chs84 .WORD LSTERR ;; CALL ONPAG ;INDICATE WHICH PAGE IT WAS ON ;chs84 .IFT ;chs73+ MOV LMARG,R2 ;REINITIALIZE TO LEFT MARGIN 20$: MOV R2,LMARG ;SET NEW LEFT MARGIN .IFF ;chs73- MOV LMARG,R4 ;REINITIALIZE TO LEFT MARGIN 20$: MOV R4,LMARG ;SET NEW LEFT MARGIN .ENDC ; -NZ LISTCH ;chs73 MOV ELSTC,CMADR ;SET EXPECTED COMMAND ADDRESS RETURN 30$: JMP ILCM ;INVALID COMMAND PARAMETER ;chs42 31$: JMP ILCM2 ;ILLEGAL COMMAND IN THIS CONTEXT ;chs42 ; (LSB continued on next page) ; LIST ELEMENT command ; (LSB continued from preceeding page) LSTEL:: CALL (R4) ;GET LIST PAGE TEST COUNT MOV LSTPT,R3 ;DEFAULT IS CURRENT VALUE CMP R3,PNLPG ;VALUE WITHIN REASON? BHI 30$ ;IF HI NO MOV R3,LSTPT ;SET NEW LIST PAGE TEST COUNT ;; CALL TESTP ;TEST IF PAGE SHOULD BE BROKEN ;chs27b MOV LSTVS,R1 ;GET LIST ELEMENT VERTICAL SPACING CALL LSTTP ;PERFORM LIST SPACING .IF NZ XTSTPG ;chs69+ CALL TESTL ;TEST IF PAGE SHOULD BE BROKEN .IFF ;chs69- CALL TESTP ;TEST IF PAGE SHOULD BE BROKEN ;chs27b .ENDC ; -NZ XTSTPG ;chs69 CALL SDINI ;INITIALIZE SECONDARY BUFFER POINTERS ;chs83+ ;; MOV #SDINP+2,R5 ;POINT TO SECONDARY INPUT LINE DESCRIPTOR ;; MOV #SDBUF-1,(R5) ;INITIALIZE DESCRIPTOR ;; MOV (R5),-(R5) ;chs83- MOV #-4,INDCT ;ASSUME NO SPECIAL CHARACTER USED ;chs73+ .IF NZ LISTCH MOVB LSTCH,R1 ;GET SPECIAL LIST CHARACTER BEQ 34$ ; SKIP IF DOESN'T EXIST INC INDCT ;ADJUST NEGATIVE INDENT CALL SDWCI ;OUTPUT CHARACTER MOV (PC)+,R1 ;GET TWO QUOTED SPACES .BYTE QTSP,QTSP BR 36$ ;SKIP OUTPUT OF NUMBER 34$: .ENDC ; NZ LISTCH ;chs73- INCB LSTCT ;INCREMENT LIST ELEMENT NUMBER CMPB LSTCT,#10. ;TWO DIGIT NUMBER? ;chs27f+ BLT 35$ ; NO, CONTINUE DECB INDCT ; YES, ADJUST FOR LONGER NUMBER ;chs27f- 35$: MOVB LSTCT,R0 ;GET CURRENT ELEMENT NUMBER CALL CVTNM ;CONVERT NUMBER TO ASCII MOV (PC)+,R1 ;GET QUOTED SPACE AND PERIOD .BYTE '.,QTSP ;chs CALL SDWCI ;WRITE PERIOD INTO BUFFER SWAB R1 ;SWAP QUOTED SPACE TO LEFT BYTE 36$: CALL SDWCI ;WRITE QUOTED SPACE INTO BUFFER ;chs73 ;; CMPB LSTCT,#10. ;TWO DIGIT NUMBER? ;chs27f ;; BGE 40$ ;IF GE YES ;chs27f CALL SDWCI ;WRITE ANOTHER QUOTED SPACE 40$: .IF NZ GENSEP ;chs60+ CALL SKPEND ;SKIP TO NEXT ARGUMENT .IFF ;chs60- CALL $FRCND ;FORCE TO LOGICAL END OF COMMAND .ENDC ; -NZ GENSEP ;chs60 50$: CALL CCIN ;READ BREAK CHARACTER ;chs27d CMPB #CR,R1 ;TEXT ON NEXT LINE? ;chs27e BGE 50$ ; YES, SKIP THIS CHARACTER ;chs27e CALL SDWCI ;WRITE CHARACTER INTO SECONDARY BUFFER LINEP: COMB $SDISW ;SET SECONDARY INPUT FLAG TST (SP)+ ;CLEAN STACK CALL LINSET ;RESET LINE PARAMETERS JMP TEXT ;PROCESS TEXT .DSABL LSB ; END LIST command ELIST:: .IF NZ ENDSKP ;chs63+ CALL (R4) ;GET NUMBER OF LINES TO SKIP MOV LSTVS,R3 ;DEFAULT TO VALUE FROM LIST CMD .ENDC ; NZ ENDSKP ;chs63- MOV LSTKP,R0 ;GET CURRENT LIST STACK POINTER MOV -(R0),CMADR ;RESTORE EXPECTED COMMAND ADDRESS MOV -(R0),R1 ;GET FLAG BYTE AND SPACING COUNT BITNE #SPECF,R1,10$ ;SPECIAL PROCESSING PREVIOUSLY ACTIVE? BIC #SPECF,(R5) ;CLEAR SPECIAL PROCESSING ACTIVE FLAG 10$: .IIF NZ LISTCH, MOV -(R0),LSTCH ;RESTORE SPECIAL CHARACTER ;chs73 MOVB -(R0),LSTPT ;RESTORE PREVIOUS TEST-PAGE COUNT ;chs27a MOVB -(R0),LSTVS ;RESTORE PREVIOUS VERTICAL SPACING ;chs27a MOVB -(R0),LSTCT ;RESTORE PREVIOUS LIST ELEMENT NUMBER MOVB -(R0),LMARG ;RESTORE PREVIOUS LEFT MARGIN MOV R0,LSTKP ;SAVE NEW LIST STACK POINTER .IF NZ ENDSKP ;chs63+ JMP ENOTC2 ;GO OUTPUT THE LINES .IFF ;chs63- MOV #LFSPAC,R2 ;SET SKIP COUNT JMP SKIPN ;SKIP LINES .ENDC ; -NZ ENDSKP ;chs63 ; NOTE and END NOTE ; NOTE command NOTE:: .IIF NZ NOTEMR, MOV R4,-(SP) ;SAVE SUBROUTINE ADDRESS ;chs57a .IF Z NOTETP ;chs57b MOV #NTESTP,R3 ;SET PAGE TEST COUNT ;chs16 CALL TESTP ;TEST IF PAGE SHOULD BE BROKEN .IFTF ;chs57b CMP $HDRSW,LINEC ;IN HEADER REGION OF PAGE? BGE 3$ ;IF GE YES MOV #NHSPAC,R2 ;SET LINE COUNT CALL SKIPN ;SKIP LINES .IFF ;chs57b+ MOV #NTESTP,R3 ;SET PAGE TEST COUNT CALL TESTP ;TEST IF PAGE SHOULD BE BROKEN .ENDC ; -Z NOTETP ;chs57b- 3$: .IF NZ NOTEMR ;chs57a+ MOV (SP)+,R4 ;RESTORE SUBROUTINE ADDRESS CALL (R4) ;GET MARGIN REDUCTION MOV #NPMARG,R3 ;USE DEFAULT IF OMITTED ASL R3 ;MULTIPLY BY 2 FOR NOW .IFF ;chs57a- MOV #NPMARG*2,R3 ;ASSUME AT LEFT MARGIN .IFTF ;chs57a MOV #RMARG,R4 ;POINT TO RIGHT MARGIN COUNT MOV (R4)+,-(SP) ;CALCULATE SPREAD IN MARGINS .IFF ;chs57a TSTEQ (R4),7$ ;AT LEFT MARGIN? MOV #NSMARG*2,R3 ;SET SECONDARY INDENT VALUE .ENDC ; -NZ NOTEMR ;chs57a 7$: SUB (R4),(SP) CMP R3,(SP)+ ;SPREAD LARGE ENOUGH? BLT 10$ ;IF LT YES CALL $ERMSG ;WARN USER ABOUT MARGIN ;chs84 .WORD NOTERR ;; CALL ONPAG ;OUTPUT PAGE NUMBER ;chs84 CLR R3 ;INDICATE NO ADJUSTMENT 10$: MOV (R4),NOTLM ;SAVE CURRENT LEFT MARGIN MOV -(R4),NOTRM ;SAVE CURRENT RIGHT MARGIN ASR R3 ;REDUCE TO ACTUAL MARGIN REDUCTION SUB R3,(R4)+ ;REDUCE RIGHT MARGIN ADD R3,(R4) ;INCREASE LEFT MARGIN MOV (R5),NOTSV ;SAVE CURRENT FLAGS WORD BIS #FILLF!JUSTF!PJUSTF!SPECF!NOTF,(R5) ;SET FLAGS MOV CMADR,NOTCM ;SAVE CURRENT EXPECTED COMMAND ADDRESS MOV ENOTE,CMADR ;SET EXPECTED COMMAND ADDRESS CALL SDINI ;INITIALIZE SECONDARY BUFFER POINTERS ;chs83+ ;; MOV #SDINP+2,R5 ;GET ADDRESS OF SECONDARY INPUT DESCRIPTOR ;; MOV #SDBUF-1,(R5) ;INITIALIZE DESCRIPTOR ;; MOV (R5),-(R5) ;chs83- CALL SETBF ;TRANSFER TEXT TO BUFFER CMPNE (R5),2(R5),30$ ;ANY TEXT GIVEN? MOV #NOTET,R3 ;POINT TO NOTE TEXT PROTOTYPE 20$: MOVB (R3)+,R1 ;GET NEXT CHARACTER IN STRING BEQ 30$ ;IF EQ DONE MOV R5,R4 ;SET DESCRIPTOR ADDRESS CALL WCI ;WRITE CHARACTER IN BUFFER BR 20$ 30$: MOV RMARG,R2 ;CALCULATE SPACE COUNT TO CENTER NOTE TEXT ADD (R5),R2 SUB 2(R5),R2 ADD NSPCH,R2 ;ADJUST FOR NONSPACNG CHARACTERS ;chs90 SUB LMARG,R2 ASR R2 ADD LMARG,R2 .IF NZ LAYOUT ;chs39+ CALL NSPACB ;SPACE OVER FROM BASE MARGIN .IFF ;chs39- CALL NSPAC ;SPACE TO TEXT POSITION .ENDC ; -NZ LAYOUT ;chs39 MOV R5,R4 ;SET ADDRESS OF LINE DESCRIPTOR CALL PSTRPA ;OUTPUT NOTE TEXT MOV #NASPAC+1,R2 ;SET LINE COUNT JMP SKIPN ;SKIP LINES ; END NOTE command ENOTC:: MOV NOTSV,(R5) ;RESTORE FLAGS WORD MOV NOTCM,CMADR ;RESTORE PREVIOUS EXPECTED COMMAND ADDRESS MOV NOTRM,RMARG ;INCREASE RIGHT MARGIN MOV NOTLM,LMARG ;DECREASE LEFT MARGIN .IF NZ ENDSKP ;chs63+ CALL (R4) ;GET NUMBER OF LINES TO SKIP MOV #NFSPAC,R3 ;DEFAULT TO OLD VALUE ENOTC2: MOV R3,R2 ;SET SKIP COUNT BEQ 10$ ;SKIP IF NONE .IFF ;chs63- MOV #NFSPAC,R2 ;SET SKIP COUNT .IFTF ;chs63 JMP SKIPN ;SKIP LINES .IFT ;chs63+ 10$: RETURN .ENDC ; NZ ENDSKP ;chs63- ; NUMBER APPENDIX, NUMBER CHAPTER ; NUMBER APPENDIX command .ENABL LSB NAPDX:: .IF NZ GENSEP ;chs60+ CALL SKPWHT ;SKIP TO TEXT ARGUMENT .IFF ;chs60- CALL CCIN ;READ NEXT CHARACTER CMPEQ #SPC,R1,NAPDX ;SPACE? CMPEQ #TAB,R1,NAPDX ;TAB? .ENDC ; -NZ GENSEP ;chs60 CMP #'A,R1 ;LETTER? BHI 10$ ;IF HI NO CMP #'Z,R1 ;LETTER? BLO 10$ ;IF LO NO SUB #'A,R1 ;SET FOR NEXT APPENDIX COMMAND MOVB R1,APNDN RETURN ; NUMBER CHAPTER command NCHPT:: CALL (R4) ;GET CHAPTER NUMBER 10$: JMP ILCM ;MUST BE A CHAPTER NUMBER DEC R3 ;BACK OFF NUMBER BY ONE BLT 10$ ;REQUESTED NUMBER MUST BE POSITIVE ;chs48c+ CMP #127.,R3 ;LEGAL CHAPTER NUMBER? ; (ABSOLUTE LIMIT IS "255.", BUT ; TO USE IT "BIC #177400,Rx" MUST ; APPEAR AFTER LOGICAL EQUIVALENT ; OF "MOVB CHPTN,Rx"--THE NECESSARY ; INSTRUCTIONS ARE ALL IN THE CODE, ; BUT ARE CURRENTLY COMMENTED OUT) ;chs48c- BLOS 10$ ;IF LOS NO MOVB R3,CHPTN ;SET FOR NEXT CHAPTER COMMAND RETURN .DSABL LSB ; Local subroutine to convert a number to ASCII, zero supressed CVTNM: MOV #10.,R1 ;SET DIVISOR CALL $DIV ;DIVIDE MOV R1,-(SP) ;SAVE REMAINDER TSTEQ R0,10$ ;NO MORE DIGITS TO CONVERT? CALL CVTNM ;CONVERT ANOTHER 10$: MOV (SP)+,R1 ;RETRIEVE CHARACTER ADD #'0,R1 ;CONVERT TO ASCII ; Routine to write character to buffer described by pointer in R5 SDWCI:: MOV R5,R4 ;SET ADDRESS OF LINE DESCRIPTOR ;chs83 JMP WCI ;WRITE CHARACTER IN BUFFER ; Routine to initialize pointers for secondary input buffer ;chs83+ SDINI:: MOV #SDINP+2,R5 ;ADDRESS OF SECONDARY INPUT DESCRIPTOR MOV #SDBUF-1,(R5) ;INITIALIZE DESCRIPTORS MOV (R5),-(R5) ;chs83- RETURN ; INCLUDE, EXCLUDE, OPTION, ELSE, END OPTION ;chs20+ ; Optional-Input commands .IF NZ OPTTXT .ENABL LSB ; INCLUDE command INCLUD::CALL 200$ ;GET OPTION NUMBER BCS 90$ ;SKIP IF ERROR .IF NZ OPTXSW ;chs45+ CALL 400$ ;CHECK FOR THIS OPTION IN SWITCH BCS 2$ ; YES, DON'T AFFECT THIS OPTION .ENDC ; NZ OPTXSW ;chs45- MOVB #1,OPTBL(R3) ;SET OPTION "ON" 2$: RETURN ; EXCLUDE command EXCLUD::CALL 200$ ;GET OPTION NUMBER BCS 90$ ;SKIP IF ERROR .IF NZ OPTXSW ;chs45+ CALL 400$ ;CHECK FOR THIS OPTION IN SWITCH BCS 4$ ; YES, DON'T AFFECT THIS OPTION .ENDC ; NZ OPTXSW ;chs45- CLRB OPTBL(R3) ;SET OPTION "OFF" 4$: RETURN ; OPTION command OPTION::CALL 200$ ;GET OPTION NUMBER BCS 90$ ;SKIP IF ERROR CALL 300$ ;COMPARE WITH OPTION SETTING BCS 100$ ;INCLUDE FOLLOWING TEXT 10$: MOVB R3,OPTACT ;SAVE OPTION NUMBER 20$: CALL CCIN ;IGNORE REST OF CURRENT COMMAND CMPEQ R1,#SEMI,40$ CMPEQ R1,#PD,60$ .IIF NZ EXCMNT, CMPEQ #EXCL,R1,30$ ;IGNORE LINE IF COMMENT FOUND ;chs44 CMPNE R1,#CR,20$ 30$: ;chs60+ .IF NZ GENSEP CALL SKPLF ;IGNORE REST OF CURRENT LINE .IFF ;chs60- CALL CCIN ;IGNORE REST OF CURRENT LINE CMPNE R1,#LF,30$ .ENDC ; -NZ GENSEP ;chs60 40$: CALL CCIN ;GET NEXT CHARACTER CMPNE R1,#EOF,50$ ;CHECK FOR END OF FILE CALL $ERMSG ;ERROR: OPTION ACTIVE AT EOF .WORD OPTERR BR 100$ 50$: CMPNE R1,#PD,30$ ;SKIP LINE IF NOT COMMAND 60$: CALL CMN ;DECODE COMMAND BCS 30$ ;SKIP COMMENTS (WHOLE LINE) BITNEB #TXTF,(R2),30$ ;COMMAND TAKES TEXT ARGUMENT? CMPEQ ELSEC,(R3),70$ ;IS IT "ELSE" COMMAND? CMPNE EOPTC,(R3),20$ ;IS IT "END OPTION" COMMAND? 70$: MOV #RCNO,R4 ;POINT TO ROUTINE FOR ARGUMENT CALL 200$ ;GET OPTION NUMBER BCC 80$ ;CONTINUE IF NO ERROR CALL ILCM ;DISPLAY ERROR BR 40$ ;IGNORE THIS "ELSE" OR "END OPTION" 80$: CMPNEB R3,OPTACT,40$ ;IGNORE IF NOT RIGHT ONE BR 100$ ;INCLUDE TEXT FROM HERE ; ELSE command ELSE:: CALL 200$ ;GET OPTION NUMBER BCS 90$ ;DISPLAY ERROR NEG R3 ;CONSIDER NEGATIVE LOGIC CALL 300$ ;COMPARE WITH OPTION SETTING BCS 100$ ;INCLUDE FOLLOWING TEXT NEG R3 ;RESTORE OPTION NUMBER BR 10$ ;EXCLUDE FOLLOWING TEXT ; END OPTION command ENDOPT::CALL 200$ ;GET OPTION NUMBER BCC 100$ ;RETURN IF NO ERROR 90$: JMP ILCM ;DISPLAY ERROR MESSAGE 100$: CLRB OPTACT ;INDICATE NO OPTION ACTIVE RETURN ; Local subroutine to get & error check option number 200$: CALL (R4) ;GET COMMAND ARGUMENT 210$: SEC ;THERE MUST BE ONE BR 220$ CMP R3,#OPTTXT ;OPTION NUMBER TOO LARGE? BGT 210$ ; YES, ERROR CMP R3,#-OPTTXT ;OPTION NUMBER TOO LARGE? BLT 210$ ; YES, ERROR TST R3 ;OPTION NUMBER = 0? BEQ 210$ ; YES, ERROR 220$: RETURN ; Local subroutine to check status of option switch 300$: MOV R3,R2 ;SAVE OPTION NUMBER TST R3 ;DEALING WITH NEGATIVE OPTION? BGT 310$ ; NO, USE POSITIVE LOGIC NEG R2 ; YES, NEGATE INDEX TSTB OPTBL(R2) ;TEST OPTION STATUS (NEGATIVE LOGIC) BGT 340$ ; >0 MEANS "EXCLUDE" BEQ 330$ ; =0 MEANS "INCLUDE" (COMMAND IS NOP) BLT 320$ ; <0 MEANS NEVER SET/CLEARED (ERROR) 310$: TSTB OPTBL(R3) ;TEST OPTION STATUS (POSITIVE LOGIC) BGT 330$ ; >0 MEANS "INCLUDE" (COMMAND IS NOP) BEQ 340$ ; =0 MEANS "EXCLUDE" 320$: CALL ILCM ; <0 MEANS NEVER SET/CLEARED (ERROR) 330$: SEC ;SIGNAL ERROR RETURN 340$: RETURN ; Local subroutine to check for command-line option switch ;chs45+ .IF NZ OPTXSW 400$: BITEQ #OPTSW,$SWTCH,430$ ;ANY COMMAND-LINE SWITCHES? MOV #INCL1,R2 ;POINT TO INCLUDE SWITCH VALUES MOV R3,-(SP) ;SAVE OPTION NUMBER 410$: CMP R2,#-2> ;AT END OF LISTS? BGE 420$ ; YES, DONE CHECKING MOV (R2)+,R3 ;GET SWITCH VALUE BEQ 410$ ;SKIP ZERO VALUES CMPNE R3,(SP),410$ ;THIS THE ONE? CALL $ERMSG ; YES, WARN USER ;chs84 .WORD OPSWER ; OF IGNORED COMMAND ;; CALL ONPAG ; WITH PAGE REFERENCE ;chs84 SEC ;DON'T AFFECT THIS OPTION 420$: MOV (SP)+,R3 ;RESTORE OPTION NUMBER 430$: RETURN .ENDC ; NZ OPTXSW ;chs45- .DSABL LSB .ENDC ; NZ OPTTXT ;chs20- ; DO CONTENTS command (start in root segment) .IF NZ PTCOVL ;chs82+ DMPTOC::CLRB TFLAG ;SIGNAL THIS ENTRY POINT BR DTOC1 ; (FROM EOF DUMP) DOTOC:: MOVB #1,TFLAG ;SIGNAL THIS ENTRY POINT DTOC1: .IIF NZ FIGFIX, CALL FIGDMP ;PROCESS ALL PENDING FIGURES ;chs37 .IIF NZ BLKCMD, CALL BLKDMP ;PROCESS ALL QUEUED TEXT BLOCKS ;chs78a JMP DTOC2 ;JUMP TO CODE IN OVERLAY .ENDC ; NZ PTCOVL ; DO INDEX command (start in root segment) .IF NZ PINOVL DOINX:: .IIF NZ FIGFIX, CALL FIGDMP ;PROCESS ALL PENDING FIGURES ;chs37 .IIF NZ BLKCMD, CALL BLKDMP ;PROCESS ALL QUEUED TEXT BLOCKS ;chs78a JMP DOIND ;JUMP TO CODE IN OVERLAY .ENDC ; NZ PINOVL ; SAVTXT ; Purpose: Store command text argument into command buffer ; On entry: Arguments before text already read from command ; On exit: Text stored in command buffer ; Input directed from there ; Registers: R1 and R4 changed .IF NZ ATOHDR SAVTXT::MOV #CMST2,R4 ;POINT AT BUFFER POINTER MOV #CMBF-1,(R4) ;INITIALIZE POINTERS MOV (R4),-(R4) CALL SKPSEP ;SKIP OVER ANY ARGUMENT SEPARATOR BCS 20$ ;SKIP IF AT EOL 10$: CALL CCIN ;GET A CHARACTER 20$: MOV #CMSTP,R4 ;POINT TO POINTERS CALL WCI ;WRITE CHARACTER TO BUFFER CMPNEB #CR,R1,10$ ;DONE IF AT EOL INCB $CBISW ;DIRECT INPUT FROM COMMAND BUFFER RETURN .ENDC ; NZ ATOHDR ;chs82- .END