.TITLE FMTCM .IDENT /M3.0X/ ; RUNOFF COMMANDS ; ; AUTHOR: D. N. CUTLER 22-SEP-75 ; ; MODIFIED BY ; ; C. H. Spalding, Unimation, Dec. '82 ; ; 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" ; 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) ; ; 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) ;chs47 .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 ;chs03 SUB $HDRSW,R2 ;DECREASE BY HEADER LENGTH ;chs40 BLE 16$ ;NOTHING TO DO? ;chs03 .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 ;chs39 .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 ;chs68 17$: CLRB -(R0) ;CLEAR LEVEL NUMBERS ;chs68 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 BR 30$ ; 20$: .IF NZ CHSW ;chs59 DEC R0 ;DECREMENT POINTER ;chs59 .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 CALL SETTL ;MOVE TITLE TO BUFFER MOV RMARG,R2 ;CALCULATE SPACE TO CENTER TEXT SUB LMARG,R2 ;chs16 ADD TTLP1,R2 ; SUB TTLP2,R2 ; ASR R2 ; ADD LMARG,R2 ;chs16 .IF NZ LAYOUT ;chs39 CALL NSPACB ;SPACE OVER FROM BASE MARGIN ;chs39 .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 FOUR LINES .DSABL LSB ; HEADER LEVEL command HEADR:: .IF NZ RELHDL ;chs74 MOVB LASTHL,R3 ;GET CURRENT HEADER LEVEL ;chs74 .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 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 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 ATOSUB ;chs19+ CMP ASTLVL,(SP) ;AUTOSUBTITLE AT THIS LEVEL? BLO 31$ ; NOT IF LOWER CALL SETSTL ;YES, SET SUBTITLE 31$: .ENDC ; NZ ATOSUB ;chs19- .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$: MOV #HLBL1,R2 ;SKIP SOME LINES CALL SKIPN MOV #,R3 ;SET TEST PAGE VALUE 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$: MOV #SDINP+2,R5 ;GET ADDRESS OF SECONDARY BUFFER DESCRIPTOR MOV #SDBUF-1,(R5) ;INITIALIZE DESCRIPTOR MOV (R5),-(R5) ; MOV #SDWCI,R3 ;SET ADDRESS OF WRITE CHARACTER ROUTINE CMP #CHPTN+3,(SP) ;HEADING LEVEL 1 OR 2? 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 ;chs39 .IFF ;chs39 CALL NSPAC ;SPACE TO LEFT MARGIN .ENDC ; -NZ LAYOUT ;chs39 35$: MOV #CHPTN,R2 ;POINT TO CHAPTER/LEVEL TABLE .IIF NZ ATOSUB, MOV (SP),-(SP) ;SAVE POINTER ;chs19 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 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 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$: .IF NZ ATOSUB ;chs19+ INC (SP)+ ;THROW AWAY SCRATCH POINTER CMP #CHPTN+3,(SP) ;HEADING LEVEL 3, 4, OR 5? .IFF ;chs19- CMP #CHPTN+3,(SP)+ ;HEADING LEVEL 3, 4, OR 5? .ENDC ; -NZ ATOSUB ;chs19 BHI 80$ ;IF HI NO MOV #QTSP,R1 ;WRITE TWO QUOTED SPACES INTO BUFFER ;chs CALL (R3) ; CALL (R3) ; .IF NZ ATOSUB ;chs19+ CMP ASTLVL,(SP)+ ;AUTOSUBTITLE AT THIS LEVEL? BLO 65$ ; NOT IF LOWER CALL 200$ ;COPY SUBTITLE INTO BUFFER BR 75$ ;FINISH UP HEADER 65$: ;chs19 .ENDC ; NZ ATOSUB ;chs19- .IF NZ GENSEP ;chs60+ CALL SKPEND ;SKIP TO NEXT ARGUMENT 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 QUOTED SPACE AND DASH .BYTE QTSP,'- ; ;chs CALL (R3) ;WRITE QUOTED SPACE INTO BUFFER 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 ;chs15b ;; 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) ; .IF NZ ATOSUB ;chs19+ CMP ASTLVL,(SP)+ ;AUTOSUBTITLE AT THIS LEVEL? BLO 90$ ; NOT IF LOWER CALL 200$ ;COPY SUBTITLE INTO BUFFER BR 100$ 90$: .IFTF ;chs19- ;??? .IIF NZ GENSEP, CALL SKPEND ;SKIP TO TEXT ARGUMENT ;chs60 CALL SHFUC ;SHIFT TO UPPER CASE FOR HEADING LINE CALL SETBF ;TRANSFER REMAINDER OF LINE TO BUFFER .IFT ;chs19 100$: ;chs19 .ENDC ; NZ ATOSUB ;chs19 MOV R5,R4 ;SET ADDRESS OF LINE DESCRIPTOR CALL PSTRPA ;OUTPUT HEADING LINE MOV #,R2 ;SET LINE COUNT ;chs16 JMP SKIPN ;SKIP TWO LINES ; Local subroutine to copy subtitle into secondary buffer ;chs19+ .IF NZ ATOSUB 200$: MOV #STTLP1,R4 ;SUBTITLE POINTER MOV (R4)+,R2 ;GET ADDRESS OF STRING MINUS 1 MOV (R4),R4 ; ALSO END OF STRING CLRB 1(R4) ;SET SENTINEL BYTE 210$: INC R2 ;ADVANCE CHARACTER POINTER MOVB (R2),R1 ;GET A CHARACTER BEQ 220$ ;NUL MARKS END OF STRING CALL (R3) ;COPY TO BUFFER BR 210$ ;LOOP FOR WHOLE STRING 220$: RETURN .ENDC ; NZ ATOSUB ;chs19- ; 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 .IF NZ BADPRM ;chs42 BEQ 31$ ;IF EQUAL YES ;chs42 .IFF ;chs42 BEQ 30$ ;IF EQUAL YES .ENDC ; -NZ BADPRM ;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 $ERMS2 ;WARN USER ABOUT OVERLAP ;chs22 .WORD LSTERR CALL ONPAG ;INDICATE WHICH PAGE IT WAS ON .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 .IIF NZ BADPRM, 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 ;chs69 .IFF ;chs69 CALL TESTP ;TEST IF PAGE SHOULD BE BROKEN ;chs27b .ENDC ; -NZ XTSTPG ;chs69 MOV #SDINP+2,R5 ;POINT TO SECONDARY INPUT LINE DESCRIPTOR MOV #SDBUF-1,(R5) ;INITIALIZE DESCRIPTOR MOV (R5),-(R5) ; 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 ;chs27f 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 ;chs60 .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 ;chs63 .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 $ERMS2 ;WARN USER ABOUT MARGIN ;chs22 .WORD NOTERR ; CALL ONPAG ;OUTPUT PAGE NUMBER 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 MOV #SDINP+2,R5 ;GET ADDRESS OF SECONDARY INPUT DESCRIPTOR MOV #SDBUF-1,(R5) ;INITIALIZE DESCRIPTOR MOV (R5),-(R5) ; 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 ; SUB LMARG,R2 ; ASR R2 ; ADD LMARG,R2 ; .IF NZ LAYOUT ;chs39 CALL NSPACB ;SPACE OVER FROM BASE MARGIN ;chs39 .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 ;chs63 .ENDC ; NZ ENDSKP ;chs63 ; NUMBER APPENDIX, NUMBER CHAPTER ; NUMBER APPENDIX command .ENABL LSB NAPDX:: .IF NZ GENSEP ;chs60 CALL SKPWHT ;SKIP TO TEXT ARGUMENT ;chs60 .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 ; BE PUT IN RUNOFF.MAC IN THREE ; PLACES AFTER "MOVB CHPTN,Rx") ;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 SDWCI: MOV R5,R4 ;SET ADDRESS OF LINE DESCRIPTOR JMP WCI ;WRITE CHARACTER IN BUFFER ; 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$ 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 $ERMS2 ; YES, WARN USER .WORD OPSWER ; OF IGNORED COMMAND CALL ONPAG 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- .END