.TITLE FMTCM .IDENT /M03X/ ; RUNOFF COMMANDS ; ; AUTHOR: D. N. CUTLER 22-SEP-75 ; ; MODIFIED BY ; ; C. H. SPALDING, UNIMATION, APR. '82 ; ; MODIFICATIONS ; ; CHS03 - REDUCE BLANK LINES FROM "CHAPTER," "APPENDIX," & "INDEX" ; CHS04 - ADD "ALTERNATING HEADER" COMMANDS ; CHS10 - CHANGE DEFAULT HEADER TYPE TO "MIXED" ; CHS11 - ADD HEADER TYPE "BLANK" ; CHS14 - ADD "ALTERNATING TITLE" COMMANDS ; CHS15 - NO "BLANK 3" FROM "HL" IF AFTER "CH" OR "AX" ; CHS16 - USE LOCAL SYMBOLS IN PLACE OF CONSTANTS ; CHS19 - ADD "AUTOSUBTITLE" COMMAND ; 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" COMMAND ; CHS40 - EXPAND "HEADER" COMMAND ; CHS42 - DISTINGUISH BETWEEN "ILLEGAL COMMAND" AND "BAD PARAMETER" ; CHS45 - ADD OPTIONAL-TEXT COMMAND-LINE SWITCHES ; CHS46 - CHANGE "ALTERNATING HEADER" TO "ALTERNATE" COMMAND ; 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 ; ; ALL COMMAND ROUTINES ARE ENTERED WITH: ; ; R4=ADDRESS OF NUMBER CONVERSION ROUTINE. ; R5=ADDRESS OF FLAG WORD F.1. ; ; LOCAL DATA ; ; OUTPUT TEXT ; APNMG: .ASCIZ /APPENDIX / ;APPENDIX HEADING PROTOTYPE .IF NZ BLNKHD ;CHS11 BLANK: .ASCIZ /BLANK/<0>/ /<' > ;BLANK OUT "PAGE" ;CHS11 .ENDC ; NZ BLNKHD ;CHS11 CHAPT: .ASCIZ /CHAPTER / ;CHAPTER HEADING PROTOTYPE LOWER: .ASCIZ /LOWER/<0><'P+40><'A+40><'G+40><'E+40><' > ;LOWER CASE PAGE MIXED: .ASCIZ /MIXED/<0><'P><'A+40><'G+40><'E+40><' > ;MIXED CASE PAGE NOTET: .ASCIZ /NOTE/ ;NOTE HEADING PROTOTYPE UPPER: .ASCIZ /UPPER/<0>/PAGE/<' > ;UPPER CASE PAGE .EVEN ; APPENDIX COMMAND ; .ENABL LSB APNDX:: MOV #APNMG,-(SP) ;SET ADDRESS OF APPENDIX HEADING BR 10$ ; ; ; CHAPTER COMMAND ; CHPTR:: MOV #CHAPT,-(SP) ;SET ADDRESS OF CHAPTER HEADING .IIF NZ CHSW, INCB CHPTN ;INCREMENT CHAPTER NUMBER ;CHS59 10$: .IIF NZ FIGFIX, CALL FIGDMP ;PROCESS ALL PENDING FIGURES ;CHS37 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+4,R0 ;POINT TO LAST LEVEL NUMBER CLR (R0) ;CLEAR LEVEL NUMBERS CLR -(R0) ; CLRB -(R0) ; CMPEQ #CHAPT,(SP)+,20$ ;CHAPTER COMMAND? INC APNDN ;INCREMENT APPENDIX LETTER 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 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 COMMAND ; HEADP:: CALL $FRCND ;FORCE TO LOGICAL END OF LINE .IF NZ MXDHDR ;CHS10 MOV #MIXED,R2 ;ASSUME MIXED CASE SPECIFIED ;CHS10 .IFF ;CHS10 MOV #UPPER,R2 ;ASSUME UPPER CASE SPECIFIED .IFTF ;CHS10 CMPEQ #CR,R1,25$ ;CARRIAGE RETURN? CMPEQ #SEMI,R1,25$ ;SEMICOLON? .IIF NZ EXTHDR, CMPEQ #CMA,R1,25$ ;COMMA? ;CHS40 CALL 50$ ;READ FIRST CHARACTER CMPEQB R1,(R2)+,10$ ;FIRST CHARACTER MATCH? .IFT ;CHS10 MOV #UPPER,R2 ;ASSUME 'UPPER' KEYWORD ;CHS10 .IFF ;CHS10 MOV #MIXED,R2 ;ASSUME 'MIXED' KEYWORD .ENDC ; NZ MXDHDR ;CHS10 CMPEQB R1,(R2)+,10$ ;FIRST CHARACTER MATCH? MOV #LOWER,R2 ;ASSUME 'LOWER' KEYWORD .IF NZ BLNKHD ;CHS11 CMPEQB R1,(R2)+,10$ ;FIRST CHARACTER MATCH? ;CHS11 MOV #BLANK,R2 ;ASSUME 'BLANK' KEYWORD ;CHS11 .ENDC ; NZ BLNKHD ;CHS11 CMPNEB R1,(R2)+,20$ ;FIRST CHARACTER MISMATCH? (BUG FIXED) ;CHS 10$: TSTEQB (R2),30$ ;NO MORE CHARACTERS TO MATCH? CALL 50$ ;READ ANOTHER CHARACTER CMPEQB R1,(R2)+,10$ ;CHARACTER MATCH? 20$: JMP ILCM ;ILLEGAL COMMAND 25$: TSTNEB (R2)+,25$ ;SEARCH FOR END OF STRING DEC R2 ;ADJUST FOR FOLLOWING INCREMENT 30$: INC R2 ;POINT TO PAGE PROTOTYPE MOV #PAGHD,R1 ;POINT TO PAGE HEADER AREA 40$: MOVB (R2)+,(R1)+ ;MOVE PROTOTYPE BNE 40$ ;IF NE MORE TO GO .IF NZ EXTHDR ;CHS40 41$: ;CHS60 .IF NZ GENSEP ;CHS60 CALL SKPEND ;SKIP TO NEXT ARGUMENT ;CHS60 BCS 48$ ;SKIP IF CR FOUND ;CHS60 CMPEQB #SEMI,R1,48$ ;SEMI INDICATES NO MORE ;CHS60 .IFF ;CHS60 CALL CCIN ;SKIP TO NEXT ARGUMENT ;CHS40 CMPEQB #CMA,R1,42$ ;MARKED BY COMMA ;CHS40 CMPEQB #SEMI,R1,48$ ;SEMI INDICATES NO MORE ;CHS40 CMPNEB #CR,R1,41$ ;SO DOES ;CHS40 MOVB R1,GCSCH ; (BUT IT SHOULD BE SAVED) ;CHS40 BR 48$ ;CHS40 .ENDC ; -NZ GENSEP ;CHS60 42$: MOV HDRLEN,R3 ;GET OLD HEADER LENGTH ;CHS40 CALL (R4) ;GET RELATIVE ARGUMENT ;CHS40 JMP 44$ ;SKIP IF NONE PROVIDED ;CHS40 .IF NZ XHDRSW ;CHS40A BITEQ #HLNSW,$SWTCH,43$ ;ALREADY SET VIA SWITCH? ;CHS40A CALL $ERMS2 ;OUTPUT MESSAGE ;CHS40A .WORD LOKWRN ;CHS40A CALL ONPAG ;IDENTIFY OUTPUT PAGE ;CHS40A BR 44$ ;SKIP TO NEXT ARGUMENT ;CHS40A .ENDC ; NZ XHDRSW ;CHS40A 43$: TST R3 ;IS IT REASONABLE? ;CHS40 BLT 20$ ;CAN'T BE NEGATIVE ;CHS40 MOV R3,HDRLEN ;STORE NEW VALUE ;CHS40 44$: MOV HLMARG,R3 ;GET CURRENT HEADER LEFT MARGIN ;CHS40 CALL (R4) ;GET RELATIVE ARGUMENT ;CHS40 JMP 46$ ;DEFAULT TO CURRENT SETTING ;CHS40 TST R3 ;IS IT REASONABLE? ;CHS40 BLT 20$ ;CAN'T BE NEGATIVE ;CHS40 CMP R3,HRMARG ;NOR GREATER THAN RIGH MARGIN ;CHS40 BGE 20$ ;CHS40 MOV R3,HLMARG ;SAVE NEW SETTING ;CHS40 46$: MOV HRMARG,R3 ;GET CURRENT HEADER RIGHT MARGIN ;CHS40 CALL (R4) ;GET RELATIVE ARGUMENT ;CHS40 JMP 48$ ;DEFAULT TO CURRENT SETTING ;CHS40 CMP R3,HLMARG ;IS IT REASONABLE? ;CHS40 BLE 20$ ;CAN'T BE LESS THAN LEFT MARGIN ;CHS40 MOV R3,HRMARG ;SAVE NEW SETTING ;CHS40 48$: MOV HDRLEN,$HDRSW ;SET TO PRINT PAGE HEADERS ;CHS40 .IFF ;CHS40 MOV #HDLEN,$HDRSW ;SET TO PRINT PAGE HEADERS ;CHS16 .ENDC ; -NZ EXTHDR ;CHS40 RETURN ; 50$: CALL CCIN ;READ NEXT CHARACTER CMP #'A+40,R1 ;LOWER CASE? BHI 60$ ;IF HI NO CMP #'Z+40,R1 ;LOWER CASE? BLO 60$ ;IF LO NO BIC #40,R1 ;CONVERT TO UPPER CASE 60$: RETURN ; ; ; NOHEADER COMMAND ; NHEAD:: CLR $HDRSW ;SET TO NOT PRINT PAGE HEADERS RETURN ; ; HEADER LEVEL COMMAND HEADR:: CALL (R4) ;GET HEADING LEVEL NUMBER 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 INCB (R3)+ ;INCREMENT LEVEL NUMBER 20$: CMP R3,#CHPTN+5 ;END OF LEVEL NUMBERS? 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? ;CHS19 BLOS 31$ ;IF LOS NO ;CHS19 CALL SETSTL ;YES, SET SUBTITLE ;CHS19 31$: ;CHS19 .ENDC ; NZ ATOSUB ;CHS19 .IF NZ HLSKP ;CHS15 CMP $HDRSW,LINEC ;IN HEADER REGION OF PAGE? ;CHS15 BGE 33$ ;IF GE YES ;CHS15 CMPNE #1,PAGENO,32$ ;DON'T OUTPUT BLANK LINES IF ;CHS15 MOV CHPSKP,R2 ; JUST DID "CH" OR "AX" ;CHS15 ADD #,R2 ;(# LINES IN CH. HEADER) ;CHS16 CMP LINEC,R2 ;CHS15 BLE 33$ ;CHS15 32$: MOV #HLBL1,R2 ;SKIP SOME LINES ;CHS15 CALL SKIPN ;CHS15 MOV #,R3 ;SET TEST PAGE VALUE ;CHS15 CALL TESTP ;TEST IF PAGE SHOULD BE BROKEN ;CHS15 .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 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 CMP #CHPTN+3,(SP) ;HEADING LEVEL 3, 4, OR 5? ;CHS19 .IFF ;CHS19 CMP #CHPTN+3,(SP)+ ;HEADING LEVEL 3, 4, OR 5? .ENDC ; -NZ ATOSUB ;CHS19 BHI 80$ ;IF HI NO MOV #'#,R1 ;WRITE TWO QUOTED SPACES INTO BUFFER CALL (R3) ; CALL (R3) ; .IF NZ ATOSUB ;CHS19 CMP ASTLVL,(SP)+ ;AUTOSUBTITLE AT THIS LEVEL? ;CHS19 BLOS 65$ ;IF LOS NO ;CHS19 CALL 200$ ;COPY SUBTITLE INTO BUFFER ;CHS19 BR 75$ ;FINISH UP HEADER ;CHS19 65$: ;CHS19 .ENDC ; NZ ATOSUB ;CHS19 .IF NZ GENSEP ;CHS60 CALL SKPEND ;SKIP TO NEXT ARGUMENT ;CHS60 BCS 75$ ;C BIT INDICATES NONE FOUND ;CHS60 .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 .ASCII /#-/ ; 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 #' ,R1 ;GET A SPACE CHARACTER CALL (R3) ;WRITE TWO SPACES INTO BUFFER CALL (R3) ; .IF NZ ATOSUB ;CHS19 CMP ASTLVL,(SP)+ ;AUTOSUBTITLE AT THIS LEVEL? ;CHS19 BLOS 90$ ;IF LOS NO ;CHS19 CALL 200$ ;COPY SUBTITLE INTO BUFFER ;CHS19 BR 100$ ;CHS19 90$: ;CHS19 .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 ;CHS19 200$: MOV #STTLP1,R4 ;SUBTITLE POINTER ;CHS19 MOV (R4)+,R2 ;GET ADDRESS OF STRING MINUS 1 ;CHS19 MOV (R4),R4 ; ALSO END OF STRING ;CHS19 CLRB 1(R4) ;SET SENTINEL BYTE ;CHS19 210$: INC R2 ;ADVANCE CHARACTER POINTER ;CHS19 MOVB (R2),R1 ;GET A CHARACTER ;CHS19 BEQ 220$ ;NUL MARKS END OF STRING ;CHS19 CALL (R3) ;COPY TO BUFFER ;CHS19 BR 210$ ;LOOP FOR WHOLE STRING ;CHS19 220$: RETURN ;CHS19 .ENDC ; NZ ATOSUB ;CHS19 ; ALTERNATING-HEADER COMMANDS ;CHS04 ; ;CHS04 .IF NZ ALTHDR ;CHS04 AHEAD:: BITEQ #ALHSW,$SWTCH,30$ ;ALTERNATING HEADER ENABLED? ;CHS04 .IF NZ ALTSHF ;CHS46 MOV ASHIFT,R3 ;GET CURRENT SHIFT ;CHS46 CALL (R4) ;GET NEW VALUE ;CHS46 MOV #0,R3 ;DEFAULT TO ZERO ;CHS46 TST R3 ;MAKE SURE ITS NOT NEGATIVE ;CHS46 BGE 10$ ;CHS46 JMP ILCM ; ELSE ERROR ;CHS46 10$: MOV PBMRG,BASMRG ;GET STANDARD BASE MARGIN ;CHS46 CALL LFTRGT ;ON RIGHT-HAND PAGE? ;CHS46 BCC 20$ ; NO, BASE MARGIN OKAY ;CHS46 ADD R3,BASMRG ; YES, ADD IN OFFSET ;CHS46 20$: MOV R3,ASHIFT ;STORE NEW VALUE ;CHS46 .ENDC ; NZ ALTSHF ;CHS46 MOV SP,$ALHSW ;SET ALTERNATING HEADER MODE ;CHS04 30$: RETURN ;CHS04 NAHEAD::CLR $ALHSW ;CLEAR ALTERNATING HEADER MODE ;CHS04 .IIF NZ ALTSHF, CLR ASHIFT ;CLEAR ALTERNATE OFFSET ;CHS46 .IF NZ ALTTIT ;CHS14 JMP NATITL ;TURN OFF ALTERNATING TITLES ;CHS14 .IFF ;CHS14 RETURN ;CHS04 .ENDC ; -NZ ALTTIT ;CHS14 .ENDC ; NZ ALTHDR ;CHS04 ; ;CHS14 ; ALTERNATING-TITLE COMMANDS ;CHS14 ; ;CHS14 .IF NZ ALTTIT ;CHS14 .ENABLE LSB ATITL:: TST $ALHSW ;ALTERNATING HEADERS ACTIVE? ;CHS14 .IF NZ BADPRM ;CHS42 BEQ 31$ ; NO, COMMAND NOT ALLOWED ;CHS42 .IFF ;CHS42 BEQ 30$ ;CHS14 .ENDC ; -NZ BADPRM ;CHS42 MOV SP,$ALTSW ;SET ALTERNATING TITLE MODE ;CHS14 RETURN ;CHS14 NATITL::CLR $ALTSW ;CLEAR ALTERNATING TITLE MODE ;CHS14 RETURN ;CHS14 ; LIST COMMAND ; .IFF ;CHS14 .ENABL LSB .ENDC ; -NZ ALTTIT ;CHS14 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 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 MOV F.1,(R0)+ ;SAVE FLAG WORD MOV CMADR,(R0)+ ;SAVE EXPECTED COMMAND ADDRESS CMP R0,#LSTK+ ;LIST STACK OVERFLOW? ;CHS27A .IF NZ BADPRM ;CHS42 BHI 31$ ;IF HI YES ;CHS42 .IFF ;CHS42 BHI 30$ ;IF HI YES .ENDC ; -NZ BADPRM ;CHS42 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 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? BLT 20$ ;IF LT NO CALL $ERMS2 ;WARN USER ABOUT OVERLAP ;CHS22 .WORD LSTERR ; CALL ONPAG ;INDICATE WHICH PAGE IT WAS ON MOV LMARG,R4 ;REINITIALIZE TO LEFT MARGIN 20$: MOV R4,LMARG ;SET NEW LEFT MARGIN MOV ELSTC,CMADR ;SET EXPECTED COMMAND ADDRESS RETURN ; 30$: JMP ILCM ; .IIF NZ BADPRM, 31$: JMP ILCM2 ;ILLEGAL COMMAND IN THIS CONTEXT ;CHS42 ; LIST ELEMENT COMMAND ; 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 CALL TESTP ;TEST IF PAGE SHOULD BE BROKEN ;CHS27B MOV #-4,INDCT ;INDENT LIST ELEMENT FOUR SPACES 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$: MOV #SDINP+2,R5 ;POINT TO SECONDARY INPUT LINE DESCRIPTOR MOV #SDBUF-1,(R5) ;INITIALIZE DESCRIPTOR MOV (R5),-(R5) ; MOVB LSTCT,R0 ;GET CURRENT ELEMENT NUMBER CALL CVTNM ;CONVERT NUMBER TO ASCII MOV (PC)+,R1 ;GET QUOTED SPACE AND PERIOD .ASCII /.#/ ; CALL SDWCI ;WRITE PERIOD INTO BUFFER SWAB R1 ;SWAP QUOTED SPACE TO LEFT BYTE CALL SDWCI ;WRITE QUOTED SPACE INTO BUFFER ; 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:: 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$: 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 LFSPAC ;CHS27C MOV #LFSPAC,R2 ;SET FINAL SKIP COUNT ;CHS27C JMP SKIPN ;SKIP LINES ;CHS27C .IFF ;CHS27C RETURN ;CHS27C .ENDC ; -NZ LFSPAC ;CHS27C ; 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 ;CHS57B CALL TESTP ;TEST IF PAGE SHOULD BE BROKEN ;CHS57B .ENDC ; -Z NOTETP ;CHS57B 3$: .IF NZ NOTEMR ;CHS57A MOV (SP)+,R4 ;RESTORE SUBROUTINE ADDRESS ;CHS57A CALL (R4) ;GET MARGIN REDUCTION ;CHS57A MOV #NPMARG,R3 ;USE DEFAULT IF OMITTED ;CHS57A ASL R3 ;MULTIPLY BY 2 FOR NOW ;CHS57A .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 MOV #NFSPAC,R2 ;SET SKIP COUNT JMP SKIPN ;SKIP LINES ; ; 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? ;CHS48C ; (ABSOLUTE LIMIT IS "255.", BUT ;CHS48C ; TO USE IT "BIC #177400,Rx" MUST ;CHS48C ; BE PUT IN RUNOFF.MAC IN THREE ;CHS48C ; PLACES AFTER "MOVB CHPTN,Rx") ;CHS48C BLOS 10$ ;IF LOS NO MOVB R3,CHPTN ;SET FOR NEXT CHAPTER COMMAND RETURN ; .DSABL LSB ; ; 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 ; OPTIONAL-TEXT COMMANDS ;CHS20 ; ;CHS20 .IF NZ OPTTXT ;CHS20 .ENABL LSB ;CHS20 INCLUD::CALL 200$ ;GET OPTION NUMBER ;CHS20 BCS 90$ ;SKIP IF ERROR ;CHS20 .IF NZ OPTXSW ;CHS45 CALL 400$ ;CHECK FOR THIS OPTION IN SWITCH ;CHS45 BCS 2$ ; YES, DON'T AFFECT THIS OPTION ;CHS45 .ENDC ; NZ OPTXSW ;CHS45 MOVB #1,OPTBL(R3) ;SET OPTION "ON" ;CHS20 2$: RETURN ;CHS20 EXCLUD::CALL 200$ ;GET OPTION NUMBER ;CHS20 BCS 90$ ;SKIP IF ERROR ;CHS20 .IF NZ OPTXSW ;CHS45 CALL 400$ ;CHECK FOR THIS OPTION IN SWITCH ;CHS45 BCS 4$ ; YES, DON'T AFFECT THIS OPTION ;CHS45 .ENDC ; NZ OPTXSW ;CHS45 CLRB OPTBL(R3) ;SET OPTION "OFF" ;CHS20 4$: RETURN ;CHS20 OPTION::CALL 200$ ;GET OPTION NUMBER ;CHS20 BCS 90$ ;SKIP IF ERROR ;CHS20 CALL 300$ ;COMPARE WITH OPTION SETTING ;CHS20 BCS 100$ ;INCLUDE FOLLOWING TEXT ;CHS20 10$: MOVB R3,OPTACT ;SAVE OPTION NUMBER ;CHS20 20$: CALL CCIN ;IGNORE REST OF CURRENT COMMAND ;CHS20 CMPEQ R1,#SEMI,40$ ;CHS20 CMPEQ R1,#PD,60$ ;CHS20 CMPNE R1,#CR,20$ ;CHS20 30$: ;CHS60 .IF NZ GENSEP ;CHS60 CALL SKPLF ;IGNORE REST OF CURRENT LINE ;CHS60 .IFF ;CHS60 CALL CCIN ;IGNORE REST OF CURRENT LINE ;CHS20 CMPNE R1,#LF,30$ ;CHS20 .ENDC ; -NZ GENSEP ;CHS60 40$: CALL CCIN ;GET NEXT CHARACTER ;CHS20 CMPNE R1,#EOF,50$ ;CHECK FOR END OF FILE ;CHS20 CALL $ERMSG ;ERROR: OPTION ACTIVE AT EOF ;CHS20 .WORD OPTERR ;CHS20 BR 100$ ;CHS20 50$: CMPNE R1,#PD,30$ ;SKIP LINE IF NOT COMMAND ;CHS20 60$: CALL CMN ;DECODE COMMAND ;CHS20 BCS 30$ ;SKIP COMMENTS (WHOLE LINE) ;CHS20 BITNEB #TXTF,(R2),30$ ;COMMAND TAKES TEXT ARGUMENT? ;CHS20 CMPEQ ELSEC,(R3),70$ ;IS IT "ELSE" COMMAND? ;CHS20 CMPNE EOPTC,(R3),20$ ;IS IT "END OPTION" COMMAND? ;CHS20 70$: MOV #RCNO,R4 ;POINT TO ROUTINE FOR ARGUMENT ;CHS20 CALL 200$ ;GET OPTION NUMBER ;CHS20 BCC 80$ ;CONTINUE IF NO ERROR ;CHS20 CALL ILCM ;DISPLAY ERROR ;CHS20 BR 40$ ;IGNORE THIS "ELSE" OR "END OPTION" ;CHS20 80$: CMPNEB R3,OPTACT,40$ ;IGNORE IF NOT RIGHT ONE ;CHS20 BR 100$ ;INCLUDE TEXT FROM HERE ON ;CHS20 ELSE:: CALL 200$ ;GET OPTION NUMBER ;CHS20 BCS 90$ ;DISPLAY ERROR ;CHS20 NEG R3 ;CONSIDER NEGATIVE LOGIC ;CHS20 CALL 300$ ;COMPARE WITH OPTION SETTING ;CHS20 BCS 100$ ;INCLUDE FOLLOWING TEXT ;CHS20 NEG R3 ;RESTORE OPTION NUMBER ;CHS20 BR 10$ ;EXCLUDE FOLLOWING TEXT ;CHS20 ENDOPT::CALL 200$ ;GET OPTION NUMBER ;CHS20 BCC 100$ ;RETURN IF NO ERROR ;CHS20 90$: JMP ILCM ;DISPLAY ERROR MESSAGE ;CHS20 100$: CLRB OPTACT ;INDICATE NO OPTION ACTIVE ;CHS20 RETURN ;CHS20 ; LOCAL SUBROUTINE TO GET & ERROR CHECK OPTION NUMBER ;CHS20 200$: CALL (R4) ;GET COMMAND ARGUMENT ;CHS20 210$: SEC ;THERE MUST BE ONE ;CHS20 BR 220$ ;CHS20 CMP R3,#OPTTXT ;OPTION NUMBER TOO LARGE? ;CHS20 BGT 210$ ; YES, ERROR ;CHS20 CMP R3,#-OPTTXT ;OPTION NUMBER TOO LARGE? ;CHS20 BLT 210$ ; YES, ERROR ;CHS20 TST R3 ;OPTION NUMBER = 0? ;CHS20 BEQ 210$ ; YES, ERROR ;CHS20 220$: RETURN ;CHS20 ; LOCAL SUBROUTINE TO CHECK STATUS OF OPTION SWITCH ;CHS20 300$: MOV R3,R2 ;SAVE OPTION NUMBER ;CHS20 TST R3 ;DEALING WITH NEGATIVE OPTION? ;CHS20 BGT 310$ ; NO, USE POSITIVE LOGIC ;CHS20 NEG R2 ; YES, NEGATE INDEX ;CHS20 TSTB OPTBL(R2) ;TEST OPTION STATUS (NEGATIVE LOGIC) ;CHS20 BGT 340$ ; >0 MEANS "EXCLUDE" ;CHS20 BEQ 330$ ; =0 MEANS "INCLUDE" (COMMAND IS NOP) ;CHS20 BLT 320$ ; <0 MEANS NEVER SET/CLEARED (ERROR) ;CHS20 310$: TSTB OPTBL(R3) ;TEST OPTION STATUS (POSITIVE LOGIC) ;CHS20 BGT 330$ ; >0 MEANS "INCLUDE" (COMMAND IS NOP) ;CHS20 BEQ 340$ ; =0 MEANS "EXCLUDE" ;CHS20 320$: CALL ILCM ; <0 MEANS NEVER SET/CLEARED (ERROR) ;CHS20 330$: SEC ;SIGNAL ERROR RETURN ;CHS20 340$: RETURN ;CHS20 ; LOCAL SUBROUTINE TO CHECK FOR COMMAND-LINE OPTION SWITCH ;CHS45 .IF NZ OPTXSW ;CHS45 400$: BITEQ #OPTSW,$SWTCH,430$ ;ANY COMMAND-LINE SWITCHES? ;CHS45 MOV #INCL1,R2 ;POINT TO INCLUDE SWITCH VALUES ;CHS45 MOV R3,-(SP) ;SAVE OPTION NUMBER ;CHS45 410$: CMP R2,#-2> ;AT END OF LISTS? ;CHS45 BGE 420$ ; YES, DONE CHECKING ;CHS45 MOV (R2)+,R3 ;GET SWITCH VALUE ;CHS45 BEQ 410$ ;SKIP ZERO VALUES ;CHS45 CMPNE R3,(SP),410$ ;THIS THE ONE? ;CHS45 CALL $ERMS2 ; YES, WARN USER ;CHS45 .WORD OPSWER ; OF IGNORED COMMAND ;CHS45 CALL ONPAG ;CHS45 SEC ;DON'T AFFECT THIS OPTION ;CHS45 420$: MOV (SP)+,R3 ;RESTORE OPTION NUMBER ;CHS45 430$: RETURN ;CHS45 .ENDC ; NZ OPTXSW ;CHS45 .DSABL LSB ;CHS20 .ENDC ; NZ OPTTXT ;CHS20 .END