.TITLE RNCMD .IDENT /M03X/ ; RUNOFF COMMANDS ; ; AUTHOR: L. WADE 1-JUN-72 ; ; MODIFIED BY ; ; E. POLLACK U. OF W. 19-DEC-73 ; ; D. N. CUTLER 27-JUL-75 ; ; C. H. SPALDING, UNIMATION, APR. '82 ; ; MODIFICATIONS ; ; CHS03 - REDUCE BLANK LINES FROM "CHAPTER," "APPENDIX," & "INDEX" ; CHS05 - MAKE PAGE SIZE SETTINGS AVAILABLE TO TASK BUILD ; CHS12 - ADD "EVEN" AND "ODD" COMMANDS ; CHS16 - USE LOCAL SYMBOLS FOR CONSTANTS ; CHS19 - ADD "AUTOSUBTITLE" COMMAND ; CHS23 - ADD "RIGHT JUSTIFY" COMMAND ; CHS24 - FIX SKIP AT BOTTOM OF PAGE ; CHS30 - ALLOW NEGATIVE ARGUMENT FOR SKIP & BLANK ; CHS32 - ALLOW "PARAGRAPH" IN FOOTNOTES ; CHS33 - MISC. FIXES TO FOOTNOTE PROCESSING ; CHS34 - CHANGES TO "PARAGRAPH" PROCESSING ; CHS35 - FIX "SET TABS" TO ALLOW MAX # SETTINGS; ALLOW REL. ARGUMENTS ; CHS36 - EXPAND SCOPE OF "STANDARD" ; 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" ; CHS43 - ADD "QUOTE CHARACTER" COMMAND ; CHS46 - CHANGE "ALTERNATING HEADER" TO "ALTERNATE" COMMAND ; CHS48 - HAVE "NUMBER" TAKE ACTUAL & RELATIVE PAGE NUMBER ; CHS51 - ADD "[NO] FLAGS SUBINDEX" COMMANDS ; CHS53 - ADD WIDOW CONTROL TO "TEST PAGE" ; CHS54A- FOOTNOTE PROCESSING REWORKED ; CHS54B- ADD AUTOMATIC FOOTNOTE LINE ; CHS55 - FIX DUPLICATE OUTPUT OF BLANK LINES IN AUTOPARAGRAPH MODE ; CHS56 - ADD "PAGE NAME" COMMAND ; CHS58 - ADD TESTS FOR UNREASONABLE COMMAND PARAMETERS ; CHS60 - MAKE SYNTAX FOR COMMAND ARGUMENTS COMMON ; CHS61 - CHANGES TO "LITERAL" PROCESSING ; ; ALL COMMAND ROUTINES ARE ENTERED WITH: ; ; R4=ADDRESS OF NUMBER CONVERSION ROUTINE. ; R5=ADDRESS OF FLAG WORD F.1. ; AUTOPARAGRAPH COMMANDS ; AUTOP:: MOV SP,$AUTSW ;SET AUTOPARAGRAPH MODE .IIF NZ AUTFIX, CLR AUTFLG ;CLEAR BLANK-LINE FLAG ;CHS55A RETURN ; NAUTO:: CLR $AUTSW ;CLEAR AUTOPARAGRAPH MODE RETURN ; ; ;CHS43 ; QUOTE CHARACTER COMMAND ;CHS43 ; ;CHS43 .IF NZ QTCHAR ;CHS43 QTCH:: CALL NXTCHR ;GET NEXT NON-BLANK CHARACTER ;CHS43 BCS 10$ ;SKIP IF END OF COMMAND HIT ;CHS43 MOVB R1,QTCHR ;SAVE AS NEW QUOTE CHARACTER ;CHS43 BR 20$ ;CHS43 10$: MOVB #CWARN,QTCHR ; ELSE USE DEFAULT ;CHS43 20$: RETURN ;CHS43 .ENDC ; NZ QTCHAR ;CHS43 ; ; DISABLE ALL FLAGS ; DSAFL:: CALL DSCFL ;CLEAR FLAGS CAPITALIZE ;CHS .IIF NZ SUBIDX, CALL DSSFL ;CLEAR FLAGS SUBINDEX ;CHS51B BR DSHFL ;CLEAR FLAGS HYPHENATE ;CHS ; ; FLAG CAPITALIZE COMMANDS ; .ENABL LSB DSCFL:: CLR $CFLSW ;CLEAR WORD CAPITALIZE ENABLE BR 10$ ; ENCFL:: MOV SP,$CFLSW ;SET WORD CAPITALIZE ENABLE 10$: CLR WCAS ;CLEAR CASE CONVERSION VALUE RETURN ; .DSABL LSB ; ; FLAG HYPHENATE COMMANDS ; DSHFL:: CLR $HFLSW ;CLEAR HYPHENATE ENABLE RETURN ; ENHFL:: MOV SP,$HFLSW ;SET HYPHENATE ENABLE RETURN ; ; ;CHS51B ; FLAG SUBINDEX COMMANDS ;CHS51B ; ;CHS51B .IF NZ SUBIDX ;CHS51B DSSFL:: CLR $SFLSW ;CLEAR SUBINDEX ENABLE ;CHS51B RETURN ;CHS51B ENSFL:: MOV SP,$SFLSW ;SET SUBINDEX ENABLE ;CHS51B RETURN ;CHS51B .ENDC ; NZ SUBIDX ;CHS51B ; ; HYPHENATION COMMANDS ; HYPHN:: MOV SP,$HPHSW ;SET HYPHENATION ACTIVE RETURN ; NHYPH:: CLR $HPHSW ;CLEAR HYPHENATION ACTIVE RETURN ; ; INDENT COMMAND ; INDENT::CALL (R4) ;READ SIGNED DECIMAL NUMBER MOV PARIND,R3 ;NONE. USE CURRENT VALUE CMP R3,RMARG ;LEGITIMATE VALUE? BLE 10$ JMP ILCM ;NO. COMPLAIN 10$: MOV R3,INDCT ;YES. STORE ARGUMENT .IF NZ GENSEP ;CHS60 CALL SKPEND ;SKIP OVER SEPARATOR ;CHS60 CALL LINSET ;RESET LINE PARAMETERS ;CHS60 MOV #LGO,(SP) ;RESET RETURN ADDRESS ;CHS60 .ENDC ; NZ GENSEP ;CHS60 ; ; BREAK COMMAND ; BREAK:: RETURN ; ; ; CASE SELECTION COMMANDS ; .ENABL LSB LWCAS:: MOV #40,R1 ;SET FOR LOWER CASE BITEQ #UPCSW,$SWTCH,10$ ;DON'T FORCE ALL UPPER CASE? UPCAS:: CLR R1 ;SET FOR UPPER CASE 10$: MOV R1,CAS ;STORE RETURN ; .DSABL LSB ; ; PAGE NUMBER SELECTION COMMANDS ; NUMON:: .IIF NZ NUMREL, MOV PAGENO,R3 ;START WITH CURRENT PAGE ;CHS48B CALL (R4) ;NUMBER PAGES. ANY PARTICULAR NUMBER? .IF Z NUMFIX ;CHS48A MOV PAGENO,R3 ;NO. LEAVE SAME AS BEFORE .IFF ;CHS48A JMP 20$ ;NO INPUT, SKIP ;CHS48A DEC R3 ;COMPENSATE FOR INC ON NEW PAGE ;CHS48A BGE 10$ ;REQUESTED NUMBER MUST BE POSITIVE ;CHS48A JMP ILCM ; ELSE ERROR ;CHS48A 10$: ;CHS48A .ENDC ; -Z NUMFIX ;CHS48A MOV R3,PAGENO ;STORE PAGE NUMBER 20$: MOV SP,$NUMSW ;TURN ON FLAG TO CAUSE NUMBERING RETURN ; NUMOF:: CLR $NUMSW ;TURN OFF NUMBERING. RETURN ; ; ; PAGE COMMAND ; CPAGE:: CMP $HDRSW,LINEC ;IN HEADER REGION OF PAGE? BGE 20$ ;IF GE YES 10$: MOV SP,$PGPSW ;SET PAGE PENDING FLAG 20$: RETURN ; ; EVEN AND ODD COMMANDS ;CHS12 ; ;CHS12 .IF NZ EVNODD ;CHS12 .ENABL LSB ;CHS12 EPAGE:: ;CHS12 .IIF NZ ALTHDR, BITEQ #ALHSW,$SWTCH,40$ ;ALTERNATING HEADERS ENABLED? ;CHS12 CALL 30$ ;GET # LINES TO SKIP & CHECK PAGE # ;CHS12 BCS 10$ ;CONTINUE IF PAGE # ODD ;CHS12 BR 40$ ; ELSE DO NOTHING ;CHS12 OPAGE:: ;CHS12 .IIF NZ ALTHDR, BITEQ #ALHSW,$SWTCH,40$ ;ALTERNATING HEADERS ENABLED? ;CHS12 CALL 30$ ;GET # LINES TO SKIP & CHECK PAGE # ;CHS12 BCS 40$ ;CONTINUE ONLY IF PAGE # EVEN ;CHS12 10$: MOV R3,-(SP) ;SAVE # BLANK LINES ;CHS12 CALL PAGEC ;START NEW PAGE ;CHS12 MOV (SP)+,R2 ;RESTORE SKIP COUNT ;CHS12 BLE 20$ ;ANY TO SKIP? ;CHS12 CALL SKIPN ;OUTPUT BLANK LINES ;CHS12 20$: ;CHS12 .IF NZ GENSEP ;CHS60 CALL SKPSEP ;SKIP TO NEXT ARGUMENT ;CHS60 BCS 45$ ;SKIP IF NO TEXT TO CENTER ;CHS60 .IFF ;CHS60 CALL $FRCND ;FORCE TO LOGICAL END OF LINE COUNT ;CHS12 CMPEQ #CR,R1,40$ ;ANY TEXT TO CENTER? ;CHS12 .ENDC ; -NZ GENSEP ;CHS60 MOV RMARG,-(SP) ;YES, CENTER ON RIGHT MARGIN ;CHS12 .IF NZ RTJUST ;CHS23 CALL GETTX2 ;GET TEXT TO CENTER ;CHS23 JMP CENT2 ;AND DO IT ;CHS23 .IFF ;CHS23 JMP CENT1 ;GET TEXT AND CENTER IT ;CHS12 .ENDC ; -NZ RTJUST ;CHS23 30$: ;CHS12 .IIF NZ FIGFIX, CALL FIGDMP ;PROCESS ALL PENDING FIGURES ;CHS37 CALL (R4) ;GET SKIP COUNT FROM COMMAND ;CHS12 .IF NZ BLSW ;CHS12 CALL 50$ ;DEFAULT TO CHAPTER SPACING ;CHS12 .IFF ;CHS12 MOV #7,R3 ;DEFAULT TO FIXED CHAPTER SPACING ;CHS12 .ENDC ; -NZ BLSW ;CHS12 .IF NZ PRMCHK ;CHS58 CMP R3,PNLPG ;SKIP COUNT REASONABLE? ;CHS58 BLT 35$ ; YES, CONTINUE ;CHS58 JMP ILCM ; NO, DISPLAY ERROR ;CHS58 .ENDC ; NZ PRMCKH ;CHS58 35$: MOV PAGENO,-(SP) ;GET PAGE NUMBER ;CHS12 ROR (SP)+ ;MOVE LSB TO C BIT ;CHS12 RETURN ;RETURN TO MAIN STREAM ;CHS12 40$: CALL GCIN ;DISCARD REST OF COMMAND LINE ;CHS12 CMPNEB #CR,R1,40$ ; I.E., TO RETURN ;CHS12 .IF NZ GENSEP ;CHS60 45$: ;CHS60 .ENDC ; -NZ GENSEP ;CHS60 .IIF NZ SKPFIX, CLR $PGPSW ;CANCEL ANY PAGE PENDING ;CHS24 RETURN ;EXIT COMMAND ;CHS12 .IF NZ BLSW ;CHS12 50$: MOV CHPSKP,R3 ;GET DEFAULT CHAPTER SPACING ;CHS12 SUB $HDRSW,R3 ;DECREASE BY HEADER LENGTH ;CHS40 BGE 60$ ;CHS12 CLR R3 ;MINIMUM IS ZERO ;CHS12 60$: RETURN ;CHS12 .ENDC ; NZ BLSW ;CHS12 .DSABL LSB ;CHS12 .ENDC ; NZ EVNODD ; ;CHS12 ; MARGIN SELECTION COMMANDS ; .ENABL LSB SETRM:: MOV RMARG,R3 ;GET CURRENT RIGHT MARGIN CALL (R4) ;GET RELATIVE ARGUMENT MOV PRMRG,R3 ;IF NONE, INITIALIZE CMP R3,LMARG ;MUST BE RIGHT OF LEFT MARGIN BGT 20$ ;IF GT OKAY 10$: JMP ILCM ;ILLEGAL COMMAND SETLM:: MOV LMARG,R3 ;GET CURRENT LEFT MARGIN CALL (R4) ;GET RELATIVE ARGUMENT MOV #ILMRG,R3 ;IF NONE, INITIALIZE TST R3 ;MUST NOT BE NEGATIVE ;CHS BLT 10$ ;CHS CMP R3,RMARG ;MUST BE LESS THAN RIGHT MARGIN? BGE 10$ ;IF GE NO MOV R3,LMARG ;OK SAVE AS LEFT MARGIN RETURN ; ; ; STANDARD COMMAND ; STAND:: .IF NZ BIGSTD ;CHS36 CALL INITP ;INITIALIZE PARAMETERS ;CHS36 .IFF ;CHS36 MOV #SPCNG,NSPNG ;SET STANDARD SPACING MOV #IPARIN,PARIND ;SET INITIAL PARAGRAPH INDENT MOV #ILMRG,LMARG ;INITIALIZE LEFT MARGIN .ENDC ; -NZ BIGSTD ;CHS36 .IF NZ TKBPS ;USE ADJUSTABLE VALUE TO... ;CHS05 MOV INLPG,R3 ;SET INITIAL PAGE LENGTH PARAMETER ;CHS05 .IFF ;...OR USE CODED VALUE TO... ;CHS05 MOV #INLPG,R3 ;SET INITIAL PAGE LENGTH PARAMETER .ENDC ; -NZ TKBPS ;CHS05 BIS #FILLF!JUSTF!PJUSTF,(R5) ;SET TO FILL AND JUSTIFY BR 15$ ;FINISH IN COMMON CODE ; ; PAGE SIZE COMMAND ; SETPG:: MOV PNLPG,R3 ;GET CURRENT PAGE LENGTH CALL (R4) ;GET RELATIVE ARGUMENT MOV PNLPG,R3 ;DEFAULT TO CURRENT LENGTH .IF NZ BLSW ; ;CHS03 CMP R3,CHPSKP ;LENGTH REASONABLE FOR CHAPT. HEADING ;CHS03 .IFF ; (THIS IS AN ODD CRITERION) ;CHSO3 CMP R3,#12 ;LENGTH REASONABLE FOR CHAPT. HEADING .ENDC ; -NZ BLSW ;CHS03 BLE 10$ ;IF LE ERROR 15$: MOV R3,NLPG ;SAVE AS LENGTH OF THIS PAGE MOV R3,PNLPG ;AND PERMANENT PAGE LENGTH CALL SETRM ;SET RIGHT MARGIN MOV R3,PRMRG ;SET NEW PERMANENT MARGIN .IIF NZ EXTHDR, MOV R3,HRMARG ;SET NEW HEADER RIGHT MARGIN ;CHS40 20$: MOV R3,RMARG RETURN ; PARAGRAPH COMMAND ; PARAG:: .IIF NZ PARFN, MOV R4,-(SP) ;SAVE IN CASE IN FOOTNOTE ;CHS32 CALL (R4) ;OPTIONAL IDENTING ARGUMENT MOV PARIND,R3 ;NO. USE OLD VALUE CMP R3,RMARG ;REASONABLE VALUE? BGT 10$ ;IF GT NO MOV R3,INDCT ;SET PARAGRAPH INDENT MOV R3,PARIND ;STORE PARA INDENT VALUE .IIF NZ PARFN, MOV (SP),R4 ;MAKE SURE ITS RIGHT ;CHS32 CALL (R4) ;GET PARAGRAPH SPACING MOV PARSP,R3 ;DEFAULT TO NORMAL SPACING CMP R3,#MXSPC ;LEGAL VALUE? ;CHS16 BHI 10$ ;IF HI NO MOV R3,PARSP ;SET NEW PARAGRAPH SPACING .IIF NZ PARFN, MOV (SP)+,R4 ;MAKE SURE ITS RIGHT ;CHS32 CALL (R4) ;GET TEST PAGE COUNT .IF NZ DEFPTP ;CHS34A JMP PARTP ;DEFAULT TO PREVIOUS VALUE ;CHS34A .IFF ;CHS34A JMP 30$ ;IF NONE NO TEST .ENDC ; -NZ DEFPTP ;CHS34A CMP R3,PNLPG ;VALUE WITHIN REASON? BHI 10$ ;IF HI NO MOV R3,PARPT ;SET NEW PARAGRAPH PAGE TEST COUNT PARTP:: .IF NZ PARORD ;CHS34B MOV PARSP,R1 ;GET CURRENT PARAGRAPH SPACING ;CHS34B CALL LSTTP ;SKIP THE LINES ;CHS34B MOV PARPT,R3 ;GET PAGE TEST COUNT ;CHS34B JMP TESTP ;TEST IF ROOM ON PAGE ;CHS34B .IIF Z DEFPTP, 30$: MOV PARSP,R1 ;GET CURRENT PARAGRAPH SPACING ;CHS34A .IFF ;CHS34B MOV PARPT,R3 ;GET PAGE TEST COUNT CALL TESTP ;TEST IF ROOM ON PAGE 30$: MOV PARSP,R1 ;GET CURRENT PARAGRAPH SPACING .ENDC ; -NZ PARORD ;CHS34B LSTTP:: BEQ 40$ ;IF EQ NO SPACING MOV NSPNG,R0 ;GET LINES PER LINE CALL $MUL ;CALCULATE ACTUAL NUMBER OF LINES TO SKIP CMP $HDRSW,LINEC ;ALREADY IN HEADING AREA? BGE 40$ ;IF GE YES MOV R1,R2 ;SET LINE SKIP COUNT CALL SKIPN ;SKIP LINES .IIF NZ AUTFIX, MOV SP,AUTFLG ;SET BLANK-LINE FLAG ;CHS55A 40$: RETURN ; .DSABL LSB ; ; TEST PAGE COMMAND ; .ENABL LSB TSTPG:: CALL (R4) ;GET ARGUMENT OF TEST JMP ILCM ;MUST BE ONE CMP R3,PNLPG ;VALUE WITHIN REASON? BHI 10$ ;IF HI NO .IF NZ EXPTP ;CHS53 MOV R3,-(SP) ;SAVE TEST COUNT ;CHS53 CALL (R4) ;GET BLOCK LENGTH ;CHS53 JMP 5$ ;IGNORE END TEST IF MISSING ;CHS53 MOV R3,-(SP) ;SAVE IT ;CHS53 ADD LINEC,R3 ;ADD ON CURRENT LINE POSITION ;CHS53 CMP R3,NLPG ;WILL ENTIRE BLOCK FIT ON PAGE? ;CHS53 BLE 4$ ; YES, DON'T NEED END TEST ;CHS53 CALL (R4) ;GET LENGTH OF END GROUP ;CHS53 MOV 2(SP),R3 ;DEFAULT TO LENGTH OF START GROUP ;CHS53 SUB (SP)+,R3 ;CALCULATE #LINES BEFORE END ;CHS53 NEG R3 ;CHS53 CMP R3,(SP) ;BEYOND START GROUP? ;CHS53 BLT 10$ ; NO, INVALID COMBINATION ;CHS53 ADD LINEC,R3 ;ADD ON CURRENT LINE POSITION ;CHS53 CMP R3,NLPG ;WILL IT INCREASE PAGE LENGTH? ;CHS53 BGE 6$ ; YES, DON'T CHANGE IT ;CHS53 MOV R3,NLPG ;STORE AS NEW MAX. PAGE LENGTH ;CHS53 BR 6$ ;CHS53 4$: TST (SP)+ ;THROW AWAY BLOCK LENGTH ;CHS53 5$: CALL $FRCND ;IGNORE REST OF COMMAND ;CHS53 6$: MOV (SP)+,R3 ;RESTORE START TEST COUNT ;CHS53 .ENDC ; NZ EXPTP ;CHS53 TESTP:: ADD LINEC,R3 ;ADD ON CURRENT LINE POSITION CMP R3,NLPG ;COMPARE TO LENGTH W/O FOOTNOTES BLE 20$ JMP BPAGE ;TEST SHOWS NEAR END. BREAK PAGE. ; SPACING COMMAND ; SSP:: CALL (R4) ;GET ARGUMENT OF SPACING COMMAND 10$: JMP ILCM ;MUST BE ONE CMP R3,#MXSPC ;MUST BE IN RANGE 1 TO MXSPC ;CHS16 BHI 10$ TSTEQ R3,10$ ;ILLEGAL VALUE? MOV R3,NSPNG ;OK. STORE AS NORMAL SPACING 20$: RETURN ; .DSABL LSB .ENABL LSB ; ;CHS56 ; PAGE NAME COMMAND ;CHS56 ; ;CHS56 .IF NZ PAGNAM ;CHS56 SETPN:: MOV #PGNMP1,R5 ;POINT TO PAGE NAME BUFFER ;CHS56 BR 10$ ;CHS56 .ENDC ; NZ PAGNAM ;CHS56 ; ; SUBTITLE COMMAND ; SETSTL::MOV #STTLP1,R5 ;SET FOR SUBTITLE BUFFER BR 10$ ; ; ; FIRST TITLE COMMAND ; FTITL:: CLRB $HDSSW ;ENABLE HEADER ON FIRST PAGE ; ; TITLE COMMAND ; SETTL:: MOV #TTLP1,R5 ;SET FOR TITLE BUFFER CALL SHFUC ;SHIFT TO UPPER CASE FOR TITLE 10$: MOV (R5),2(R5) ;INITIALIZE DESCRIPTOR .IF NZ GENSEP ;CHS60 CALL $FRCND ;SKIP TO START OF TEXT ;CHS60 BR 20$ ;SAVE TEXT ;CHS60 .IFTF ;CHS60 SETBF:: .IFT ;CHS60 CALL SKPSEP ;SKIP TO START OF TEXT ;CHS60 BCS 30$ ;QUIT IF NONE ;CHS60 .IFF ;CHS60 CALL $FRCND ;FORCE TO LOGICAL END OF COMMAND .ENDC ; -NZ GENSEP ;CHS60 20$: CALL GCIN ;READ A CHARACTER FROM TITLE OR SUBTITLE CMPEQ #CR,R1,30$ ;CARRIAGE RETURN? MOV R5,R4 ;POINT TO BUFFER POINTER CALL WCI ;WRITE CHARACTER IN BUFFER BR 20$ ; 30$: JMP ULBSET ;RESET UNDERLINE BUFFER .DSABL LSB ; ;CHS19 ; AUTOSUBTITLE COMMAND ;CHS19 ; ;CHS19 .IF NZ ATOSUB ;CHS19 ASUBT:: MOV ASTLVL,R3 ;GET CURRENT MAX LEVEL ;CHS19 SUB #,R3 ;CHS19 CALL (R4) ;GET RELATIVE ARGUMENT ;CHS19 MOV #DEFAST,R3 ;USE DEFAULT IF NO ENTRY ;CHS19 CMP R3,#MAXHL ;IN RANGE? ;CHS19 BLOS 10$ ; YES, OKAY ;CHS19 JMP ILCM ; NO, COMMAND ERROR ;CHS19 10$: ADD #,R3 ;POINT TO HIGHEST LEVEL ;CHS19 MOV R3,ASTLVL ;SAVE IT ;CHS19 RETURN ;CHS19 .ENDC ; NZ ATOSUB ;CHS19 ; LINE SKIPPING COMMANDS ; .ENABL LSB SKIPL:: MOV NSPNG,-(SP) ;SKIP COMMAND. N CURRENT LINES BR 10$ LINSKP::MOV #1,-(SP) ;BLANK COMMAND. N REAL LINES 10$: CALL (R4) ;GET OPTIONAL ARGUMENT MOV #1,R3 ;IF NONE, ASSUME 1 MOV (SP)+,R0 ;RETRIEVE NUMBER OF LINE TO SKIP .IF Z SKPNEG ;CHS30 CMP LINEC,$HDRSW ;AT TOP OF PAGE? BLE 30$ ;IF LE YES .IFTF ;CHS30 MOV R3,R1 CALL $MUL ;MULTIPLY MOV R1,R2 ;CHECK IF ROOM ON PAGE .IFF ;CHS30 BLT 40$ ;SKIP DOWN PAGE IF NEGATIVE ;CHS30 CMP LINEC,$HDRSW ;AT TOP OF PAGE? ;CHS30 BLE 30$ ;IF LE YES ;CHS30 .ENDC ; Z SKPNEG ;CHS30 ADD LINEC,R1 ;ADD CURRENT LINE CMP R1,NLPG ;ROOM FOR ANOTHER? BLE 20$ JMP BPAGE ;NO. MAKE A NEW PAGE 20$: CALL SKIPN ;YES. SPACE OUT C(R2) LINES 30$: RETURN ; .IF NZ SKPNEG ;CHS30 40$: SUB LINEC,R2 ;COMPUTE NUMBER OF LINES TO SKIP ;CHS30 ADD NLPG,R2 ; (ALLOWING FOR FOOTNOTE SPACE) ;CHS30 BGT 20$ ;SKIP THE LINES IF COUNT OKAY ;CHS30 BEQ 30$ ;QUIT IF NOTHING TO DO ;CHS30 50$: JMP ILCM ;TOO FAR DOWN PAGE ALREADY ;CHS30 .ENDC ; NZ SKPNEG ;CHS30 ; ; TAB STOP SELECTION COMMAND ; SETTAB::CLR R0 ;CLEAR NUMBER OF TABS ;CHS35A 60$: MOVB R0,NTABS ;CHS35A .IIF NZ RELTAB, MOVB TABTAB(R0),R3 ;GET CURRENT SETTING ;CHS35C CALL (R4) ;GET ANOTHER STOP IF ANY ;CHS35A NOP RETURN INC R0 ;COUNT THIS SETTING ;CHS35A CMP R0,#TABTL ;TABLE FULL? ;CHS35A BGT 50$ ; IF SO, ERROR ;CHS35A CMPB R3,TABTAB-2(R0) ;LARGER THAN LAST VALUE? ;CHS35B BLE 50$ ; ERROR IF NOT ;CHS35B MOVB R3,TABTAB-1(R0) ;STORE THIS TABSTOP BR 60$ ;GO BACK FOR ANOTHER ;CHS35A .DSABL LSB ; FIGURE COMMAND ; .ENABL LSB ;CHS37 FIGUR:: CALL (R4) ;GET ARGUMENT MOV #1,R3 ;IF NONE, ASSUME ONE LINE .IF NZ FIGFIX ;CHS37 MOV R3,R2 ;CHECK FOR RATIONAL ARGUMENT ;CHS37 ADD $HDRSW,R2 ; CONSIDERING HEADER LINES ;CHS37 CMP R2,PNLPG ;WILL FIGURE FIT ON A PAGE? ;CHS37 .IFF ;CHS37 CMP R3,PNLPG ;CHECK FOR RATIONAL ARGUMENT .IFTF ;CHS37 BLOS 10$ ;IF LOS OKAY ;CHS37 5$: JMP ILCM ;ERROR 10$: ;CHS37 .IFT ;CHS37 TSTNEB FIGTAB,40$ ;JUST ADD TO QUEUE IF ALREADY OCCUPIED ;CHS37 FIGOUT::CLRB FIGTAB ;MAKE SURE QUEUE ENTRY AVAILABLE ;CHS37 MOV R3,R0 ;COPY TO WORKING REGISTER ;CHS37 ADD LINEC,R0 ;ADD ON CURRENT LINE COUNT ;CHS37 CMP R0,NLPG ;ROOM ON PAGE? ;CHS37 BHI 40$ ; NO, MUST WAIT ;CHS37 MOV R3,R2 ; YES, SKIP THE LINES ;CHS37 CALL SKIPN ;CHS37 CMP LINEC,NLPG ;PAGE FULL? ;CHS37 BLT 15$ ; NO, KEEP GOING ;CHS37 MOV SP,$PGPSW ; YES, SIGNAL NEW PAGE ;CHS37 15$: MOV #FIGTAB,R0 ;CHECK FOR OTHER POSSIBLE REQUESTS ;CHS37 TSTNEB (R0),30$ ;IF FIRST ENTRY EMPTY... ;CHS37 MOV #FIGFIX-1,R1 ;...BUMP DOWN THE QUEUE ;CHS37 20$: MOVB 1(R0),(R0)+ ;CHS37 SOB R1,20$ ;CHS37 CLRB (R0) ;CLEAR LAST ENTRY ;CHS37 30$: MOVB FIGTAB,R3 ;ANOTHER REQUEST PENDING? ;CHS37 BEQ 70$ ; NO, ALL DONE ;CHS37 TSTEQ $PGPSW,FIGOUT ; YES, NEED TO START NEW PAGE? ;CHS37 CALL PAGEC ; YES, DO IT ;CHS37 BR FIGOUT ;GO BACK FOR NEXT FIGURE ;CHS37 ; REQUEST CAN'T BE PROCESSED NOW, PUT IT INTO THE QUEUE ;CHS37 40$: MOV #FIGTAB,R0 ;POINT TO QUEUE ;CHS37 MOV #FIGFIX,R1 ;NUMBER OF ENTRIES ;CHS37 50$: TSTEQB (R0)+,60$ ;QUEUE LOCATION EMPTY? ;CHS37 SOB R1,50$ ;CHECK ALL LOCATIONS ;CHS37 .IF NZ BADPRM ;CHS42 JMP ILCM2 ;ILLEGAL COMMAND IN THIS CONTEXT ;CHS42 .IFF ;CHS42 BR 5$ ;QUEUE IS FULL! ;CHS37 .ENDC ; -NZ BADPRM ;CHS42 60$: MOVB R3,-(R0) ;PUT REQUEST IN QUEUE ;CHS37 70$: RETURN ;CHS37 ; PROCESS ALL QUEUED REQUESTS ;CHS37 FIGDMP::MOVB FIGTAB,R3 ;ANY OUTSTANDING FIGURE REQUESTS? ;CHS37 BEQ 70$ ;QUIT IF NONE ;CHS37 CALL FIGOUT ;PROCESS REQUEST(S) ;CHS37 TSTEQB FIGTAB,70$ ;QUIT IF ALL FIGURES DONE ;CHS37 CALL BPAGE ;START ANOTHER PAGE ;CHS37 BR FIGDMP ;AND PROCESS MORE FIGURES ;CHS37 .IFF ;CHS37 MOV R3,-(SP) ;SAVE DESIRED SPACE CALL TESTP ;TEST IF PAGE SHOULD BE BROKEN MOV (SP)+,R2 ;GET BACK DESIRED SIZE JMP SKIPN ;SPACE THAT OUT .ENDC ; -NZ FIGFIX ;CHS37 .DSABL LSB ;CHS37 ; LITERAL COMMAND ; LITRL:: MOV (R5),LITSV ;SAVE CURRENT FLAGS WORD BIS #LITFG!SPECF,(R5) ;SET LITERAL FLAG MOV CMADR,LITCM ;SAVE CURRENT EXPECTED COMMAND ADDRESS MOV ELCMD,CMADR ;SET ADDRESS OF EXPECTED COMMAND .IF NZ LITSPC ;CHS61A MOV NSPNG,LITSP ;SAVE LINE SPACING ;CHS61A MOV #1,NSPNG ;SET TO SINGLE SPACING ;CHS61A .ENDC ; NZ LITSPC ;CHS61A .IF NZ LITMRG ;CHS61B MOV RMARG,LITRM ;SAVE RIGHT MARGIN ;CHS61B MOV #MAXMRG,RMARG ;SET TO MAXIMUM WIDTH ;CHS61B .ENDC ; NZ LITMRG ;CHS61B BR FILOF ;TURN OFF FILL AND JUSTIFY ; ; END LITERAL COMMAND ; ELTRL:: MOV LITSV,(R5) ;RESTORE PREVIOUS FLAGS WORD MOV LITCM,CMADR ;RESTORE PREVIOUS EXPECTED COMMAND ADDRESS .IIF NZ LITSPC, MOV LITSP,NSPNG ;RESTORE NORMAL LINE SPACING ;CHS61A .IIF NZ LITMRG, MOV LITRM,RMARG ;RESTORE NORMAL RIGHT MARGIN ;CHS61B RETURN ; ; ; FILL AND JUSTIFY COMMANDS ; JUSTN:: BIS #JUSTF+PJUSTF,(R5) ;TURN ON JUSTIFYING RETURN ; JUSOF:: BIC #PJUSTF+JUSTF,(R5) ;TURN OFF JUSTIFY BITS RETURN ; FILLN:: BIS #FILLF+JUSTF,(R5) ;TURN ON FILLING, COPY PJUSTF TO JUSTF BITNE #PJUSTF,(R5),10$ ;COPY PERMANENT FLAG BIC #JUSTF,(R5) ;TO CURRENT ONE. 10$: RETURN ; FILOF:: BIC #FILLF+JUSTF,(R5) ;TURN OFF FILLING AND JUSTIFYING RETURN ; ; ; CENTER COMMAND ; CENTER:: .IF NZ RTJUST ;CHS23 CALL GTARGS ;GET COMMAND ARGUMENTS ;CHS23 .IFF ;CHS23 MOV RMARG,R3 ;GET RIGHT MARGIN CALL (R4) ;GET RELATIVE ARGUMENT MOV RMARG,R3 ;DEFAULT IS RIGHT MARGIN .IF NZ PRMCHK ;CHS58 CMP R3,#MAXMRG ;IS VALUE REASONABLE? ;CHS58 BLE 5$ ; YES, CONTINUE ;CHS58 JMP ILCM ; NO, DISPLAY ERROR ;CHS58 .ENDC ; NZ PRMCHK ;CHS58 5$: MOV R3,-(SP) ;STORE .IF NZ GENSEP ;CHS60 CALL SKPEND ;SKIP TO TEXT ARGUMENT ;CHS60 .IFF ;CHS60 CALL $FRCND ;FORCE TO LOGICAL END OF COMMAND CMPNE #CR,R1,CENT1 ;NOT END OF LINE? 10$: CALL GCIN ;DISCARD REST OF THIS COMMAND CMPNE R1,#LF,10$ ;NOT LINE FEED? .ENDC ; -NZ GENSEP ;CHS60 CENT1: CALL GCIN ;READ LINE TO BE CENTERED CMPEQ R1,#CR,CENT2 ;CARRIAGE RETURN? CALL WLNIN1 ;PUT IN LINE INPUT BUFFER BR CENT1 ;LOOP FOR MORE .ENDC ; -NZ RTJUST ;CHS23 CENT2: MOV (SP)+,R2 ;COMPUTE SPACING BEFORE LINE CMPEQ LNIN1,LNIN2,CENT4 ;NO TEXT TO OUTPUT? ;CHS12 ADD LNIN1,R2 ;AS HALF RIGHT MARGIN SUB LNIN2,R2 ;MINUS HALF OF LINE SIZE SUB LMARG,R2 ;MINUS LEFT MARGIN ADD NSPCH,R2 ; INCLUDING UNDERLINES, ET ASR R2 ;TAKE HALF TST R2 ;IS RESULT REASONABLE? ;CHS23 BGE 10$ ; YES, CONTINUE ;CHS23 CALL $ERMS2 ; NO, WARN USER ;CHS23 .WORD CTRERR ;CHS23 CALL ONPAG ;INDICATE WHICH PAGE IT WAS ON ;CHS23 CLR R2 ;CHS23 10$: ADD LMARG,R2 ;ADD IN LEFT MARGIN .IIF NZ LAYOUT, ADD BASMRG,R2 ;INCLUDING BASE MARGIN ;CHS39 CENT3: CALL NSPAC ;OUTPUT SPACES ;CHS23 MOV #LNIN1,R4 ;THEN OUTPUT LINE BUFFER TO FILE CALL PSTRPA ; .. JMP SKIPS ; .. CENT4: RETURN ;CHS12 ; RIGHT JUSTIFY COMMAND ;CHS23 ; ;CHS23 .IF NZ RTJUST ;CHS23 RJUST:: MOV #ENDBCM,(SP) ;SET BREAK STATUS ;CHS23 MOV R4,-(SP) ;SAVE ADDR OF CONVERSION ROUTINE ;CHS23 MOV INDCT,R2 ;GET CURRENT INDENT ;CHS23 CLR INDCT ;USE ONCE ONLY ;CHS23 ADD LMARG,R2 ;CHS23 .IF NZ LAYOUT ;CHS39 CALL NSPACB ;SPACE OVER FROM BASE MARGIN ;CHS39 .IFF ;CHS39 CALL NSPAC ;SPACE OVER TO START OF TEXT ;CHS23 .ENDC ; -NZ LAYOUT ;CHS39 MOV #LNIN1,R4 ;OUTPUT CURRENT LINE ;CHS23 CALL PSTRPA ;CHS23 TSTNEB $ULNSW,10$ ;CONSIDER UNDERLINES IF ACTIVE ;CHS23 TSTEQB $ULMSW,10$ ; AND NOT OVERPRINT ;CHS23 SUB NSPCH,CPOS ;ADJUST CURRENT POSITION ;CHS23 10$: CLR NSPCH ;RESET NON-SPACING COUNT ;CHS23 MOV LNIN1,LNIN2 ;RESET LINE BUFFER ;CHS23 MOV (SP)+,R4 ;RETRIEVE ADDR OF CONVERSION ROUTINE ;CHS23 CALL GTARGS ;GET COMMAND ARGUMENTS ;CHS23 MOV (SP)+,R2 ;GET BACK RIGHT MARGIN ;CHS23 CMPEQ LNIN1,LNIN2,CENT4 ;NO TEXT TO OUTPUT? ;CHS23 .IIF NZ LAYOUT, ADD BASMRG,R2 ;INCLUDE BASE MARGIN ;CHS39 MOV R2,-(SP) ;SAVE IN CASE OF ERROR ;CHS23 CLR R3 ;CLEAR ERROR FLAG ;CHS23 20$: ADD LNIN1,R2 ;COMPUTE SPACING BEFORE TEXT = RT MARG ;CHS23 SUB LNIN2,R2 ; MINUS LENGTH OF TEXT ;CHS23 SUB CPOS,R2 ; MINUS CURRENT POSITION ;CHS23 ADD NSPCH,R2 ; PLUS NON-SPACING CHARACTERS ;CHS23 BGE 40$ ;CONTINUE IF NO OVERLAP ;CHS23 TSTNE R3,30$ ; OR IF SECOND ERROR ;CHS23 CALL $ERMS2 ;WARN USER ;CHS23 .WORD RJUERR ;CHS23 CALL ONPAG ;INDICATE WHICH PAGE IT WAS ON ;CHS23 MOV NSPCH,-(SP) ;SAVE TEMPORARILY ;CHS23 CALL SKIPS ;MOVE ON TO NEXT LINE ;CHS23 MOV (SP)+,NSPCH ;RESTORE ;CHS23 MOV SP,R3 ;SET ERROR FLAG ;CHS23 MOV (SP),R2 ;RESTORE RIGHT MARGIN ;CHS23 BR 20$ ;TRY AGAIN ;CHS23 30$: CALL $ERMSG ;WARN USER ;CHS23 .WORD RJUERR ; LINE TOO LONG TO JUSTIFY ;CHS23 40$: TST (SP)+ ;POP STACK ;CHS23 JMP CENT3 ;OUTPUT SPACES AND TEXT ;CHS23 GTARGS: MOV RMARG,R3 ;GET RIGHT MARGIN ;CHS23 CALL (R4) ;GET RELATIVE ARGUMENT ;CHS23 MOV RMARG,R3 ;DEFAULT IS RIGHT MARGIN ;CHS23 .IF NZ PRMCHK ;CHS58 CMP R3,#MAXMRG ;IS VALUE REASONABLE? ;CHS58 BLE 10$ ; YES, CONTINUE ;CHS58 JMP ILCM ; NO, DISPLAY ERROR ;CHS58 .ENDC ; NZ PRMCHK ;CHS58 10$: MOV (SP),-(SP) ;RETURN VALUE ON STACK ;CHS23 MOV R3,2(SP) ;CHS23 GETTXT: ;CHS23 .IF NZ GENSEP ;CHS60 CALL SKPEND ;SKIP TO TEXT ARGUMENT ;CHS60 .IFF ;CHS60 CALL $FRCND ;FORCE TO LOGICAL END OF COMMAND ;CHS23 CMPNE #CR,R1,GETTX2 ;NOT END OF LINE? ;CHS23 10$: CALL GCIN ;DISCARD REST OF THIS COMMAND ;CHS23 CMPNE R1,#LF,10$ ;NOT LINE FEED? ;CHS23 .ENDC ; -NZ GENSEP ;CHS60 GETTX2: CALL GCIN ;READ LINE TO BE CENTERED ;CHS23 CMPEQ R1,#CR,10$ ;CARRIAGE RETURN? ;CHS23 CALL WLNIN1 ;PUT IN LINE INPUT BUFFER ;CHS23 BR GETTX2 ;LOOP FOR MORE ;CHS23 10$: RETURN ;CHS23 .ENDC ; NZ RTJUST ;CHS23 ; FOOTNOTE COMMAND ; FOOTN:: CALL (R4) ;HOW MANY LINES TO RESERVE? 5$: JMP ILCM ;MUST HAVE SPEC CMP R3,PNLPG ;VALUE WITHIN REASON? BHI 5$ ;IF HI NO .IF NZ AUTOFN ;CHS54B TSTEQB FTNCHR,7$ ;SKIP IF AUTO FOOTNOTE LINE DISABLED ;CHS54B CMPNE FOOTP1,FOOTP2,7$ ; OR IF FOOTNOTE ALREADY QUEUED ;CHS54B ADD #2,R3 ;ADJUST LINE COUNT FOR SPACE & LINE ;CHS54B 7$: ;CHS54B .ENDC ; NZ AUTOFN ;CHS54B .IF NZ NEWFTN ;CHS54A SUB R3,NLPG ;ADJUST CURRENT PAGE LENGTH ;CHS54A .IFF ;CHS54A MOV NSPNG,R0 ;RESERVE N TIMES SPACING MOV R3,R1 CALL $MUL ;MULTIPLY ADD R1,FOOTC ;ADD TO RESERVED FOOTNOTE LINES .ENDC ; -NZ NEWFTN ;CHS54A 8$: CALL $FRCND ;FORCE TO LOGICAL END OF LINE ;CHS33 .IF NZ FNFIX ;CHS33 CMPEQ #SEMI,R1,8$ ;KEEP LOOKING FOR REAL STUFF ;CHS33 CMPEQ #PD,R1,30$ ;SAVE REST OF COMMAND LINE ;CHS33 .IFF ;CHS33 CLRB GCSCH ;CLEAR TERMINAL CHARACTER CMPNE #CR,R1,40$ ;NOT END OF LINE? .ENDC ; -NZ FNFIX ;CHS33 10$: .IF NZ GENSEP ;CHS60 CALL SKPLF ;IGNORE REST OF CURRENT LINE ;CHS60 .IFF ;CHS60 CALL CCIN ;SKIP REST OF COMMAND LINE CMPNE R1,#LF,10$ ;NOT LINE FEED? .ENDC ; -NZ GENSEP ;CHS60 BR 40$ ; 20$: CALL CCIN ;READ A CHARACTER 30$: CALL WCIFTN ;WRITE CHARACTER IN BUFFER CMPNE R1,#LF,20$ ;NOT END OF LINE? 40$: CALL CCIN ;SEE WHAT CHARACTER AFTER LINE FEED IS CMPEQ R1,#EOF,50$ ;END OF FILE? CMPNE #'!,R1,30$ ;NOT END OF FOOTNOTE? MOV #EOF,R1 ;SET END OF FOOTNOTE 50$: JMP WCIFTN ;STORE THIS CHARACTER ; ;CHS54B ; FOOTNOTE LINE COMMAND ;CHS54B ; ;CHS54B .IF NZ AUTOFN ;CHS54B FOOTL:: CALL (R4) ;GET LINE LENGTH ;CHS54B JMP 10$ ;DEFAULT TO CURRENT LENGTH ;CHS54B MOVB R3,FTNLEN ;STORE NEW LENGTH ;CHS54B 10$: CALL NXTCHR ;GET FOLLOWING CHARACTER ;CHS54B BCS 20$ ;SKIP IF END OF COMMAND HIT ;CHS54B CMPEQ #CMA,R1,10$ ;KEEP LOOKING IF COMMA ;CHS54B MOVB R1,FTNCHR ;SAVE AS NEW LINE CHARACTER ;CHS54B BR 30$ ;CHS54B 20$: CLRB FTNCHR ;DISABLE AUTO FOOTNOTE LINE ;CHS54B 30$: RETURN ;CHS54B .ENDC ; NZ AUTOFN ;CHS54B ; LOCAL SUBROUTINE TO GET NEXT NON-BLANK CHARACTER ;CHS54B NXTCHR: .IF NZ GENSEP ;CHS60 CALL SKPWHT ;GET NEXT NON-BLANK CHARACTER ;CHS60 .IFF ;CHS60 CALL CCIN ;READ NEXT CHARACTER ;CHS54B CMPEQ #SPC,R1,NXTCHR ;IGNORE SPACES ;CHS54B CMPEQ #TAB,R1,NXTCHR ; AND TABS ;CHS54B .ENDC ; -NZ GENSEP ;CHS60 CMPEQ #CR,R1,10$ ;STOP ON ;CHS54B CMPEQ #PD,R1,10$ ; OR PERIOD ;CHS54B CMPEQ #SEMI,R1,10$ ; OR SEMICOLON ;CHS54B .IIF NZ EXCMNT, CMPEQ #EXCL,R1,10$ ; OR EXCLAMATION MARK ;CHS54B CLC ;MAKE SURE C BIT CLEAR ;CHS54B BR 20$ ;DON'T SAVE BREAK CHARACTER ;CHS54B 10$: MOVB R1,GCSCH ;SAVE BREAK CHARACTER ;CHS54B SEC ;SIGNAL END OF COMMAND ;CHS54B 20$: RETURN ;CHS54B ; ; PERIOD SPACING COMMANDS ; PERSP:: MOV SP,$PERSW ;ENABLE TWO SPACES AFTER PUNCTUATION RETURN ; NPERS:: CLR $PERSW ;DISABLE TWO SPACES AFTER PUNCTUATION RETURN ; ; ; COROUTINE TO SHIFT TO UPPER CASE TEMPORARILY ; SHFUC:: MOV (SP),-(SP) ;COPY RETURN ADDRESS MOV CAS,2(SP) ;SAVE CURRENT CASE CLR CAS ;SET FOR UPPER CASE CALL @(SP)+ ;CALL THE CALLER BACK MOV (SP)+,CAS ;RESTORE PREVIOUS CASE RETURN ; ; LAYOUT COMMAND ;CHS39 ; ;CHS39 .IF NZ LAYOUT ;CHS39 LYOUT:: MOV TOPMRG,R3 ;GET OLD TOP MARGIN ;CHS39 CALL (R4) ;GET RELATIVE ARGUMENT ;CHS39 JMP 40$ ;SKIP IF NONE PROVIDED ;CHS39 .IF NZ LAYSW ;CHS39A BITEQ #DWNSW,$SWTCH,10$ ;ALREADY SET VIA SWITCH? ;CHS39A CALL 200$ ; YES, OUTPUT ERROR ;CHS39A BR 40$ ;SKIP TO NEXT ARGUMENT ;CHS39A .ENDC ; NZ LAYSW ;CHS39A 10$: TST R3 ;MUST BE AT LEAST POSITIVE ;CHS39 BGE 30$ ;CHS39 20$: JMP ILCM ;DISPLAY ERROR ;CHS39 30$: MOV R3,TOPMRG ;STORE NEW VALUE ;CHS39 40$: MOV PNLPG,R3 ;GET CURRENT PAGE LENGTH ;CHS39 CALL (R4) ;GET RELATIVE ARGUMENT ;CHS39 50$: MOV PNLPG,R3 ;DEFAULT TO CURRENT LENGTH ;CHS39 .IF NZ LAYSW ;CHS39A CMPEQ R3,PNLPG,60$ ;TRYING TO CHANGE VALUE ;CHS39A BITEQ #LNGSW,$SWTCH,60$ ;ALREADY SET VIA SWITCH? ;CHS39A CALL 200$ ; YES, OUTPUT ERROR ;CHS39A BR 50$ ;USE DEFAULT VALUE ;CHS39A 60$: ;CHS39A .ENDC ; NZ LAYSW ;CHS39A .IF NZ BLSW ;CHS39 CMP R3,CHPSKP ;LENGTH REASONABLE FOR CHAPT. HEADING ;CHS39 .IFF ; (THIS IS AN ODD CRITERION) ;CHS39 CMP R3,#12 ;LENGTH REASONABLE FOR CHAPT. HEADING ;CHS39 .ENDC ; -NZ BLSW ;CHS39 BLE 20$ ;IF LE ERROR ;CHS39 MOV R3,NLPG ;SAVE AS LENGTH OF THIS PAGE ;CHS39 MOV R3,PNLPG ; AND PERMANENT PAGE LENGTH ;CHS39 MOV BASMRG,R3 ;GET CURRENT PERM. LEFT MARGIN ;CHS39 .IF NZ ALTSHF ;CHS46 MOV ASHIFT,R2 ;GET ALTERNATE-PAGE OFFSET ;CHS46 CALL LFTRGT ;ON RIGHT-HAND PAGE? ;CHS46 BCC 70$ ; NO, BASE MARGIN OKAY ;CHS46 SUB R2,R3 ; YES, MUST CONSIDER OFFSET ;CHS46 70$: ;CHS46 .IFTF ;CHS46 CALL (R4) ;GET RELATIVE ARGUMENT ;CHS39 JMP 100$ ;DEFAULT TO CURRENT SETTING ;CHS39 .IF NZ LAYSW ;CHS39A BITEQ #LFTSW,$SWTCH,80$ ;ALREADY SET VIA SWITCH? ;CHS39A CALL 200$ ; YES, OUTPUT ERROR ;CHS39A BR 100$ ;SKIP TO NEXT ARGUMENT ;CHS39A .ENDC ; NZ LAYSW ;CHS39A 80$: TST R3 ;NEW VALUE CANNOT BE NEGATIVE ;CHS39 BLT 20$ ;CHS39 .IFT ;CHS46 MOV R3,PBMRG ;SAVE AS PERMANENT VALUE ;CHS46 CALL LFTRGT ;ON RIGHT-HAND PAGE? ;CHS46 BCC 90$ ; NO, BASE MARGIN OKAY ;CHS46 ADD R2,R3 ; YES, INCLUDE OFFSET ;CHS46 90$: ;CHS46 .ENDC ; NZ ALTSHF ;CHS46 MOV R3,BASMRG ;SAVE WORKING VALUE ;CHS39 100$: MOV PRMRG,R3 ;GET CURRENT PERMANENT RIGHT MARGIN ;CHS39 CALL (R4) ;GET RELATIVE ARGUMENT ;CHS39 JMP 120$ ;IF NONE, LEAVE UNCHANGED ;CHS39 .IF NZ LAYSW ;CHS39A BITEQ #DWNSW,$SWTCH,110$ ;ALREADY SET VIA SWITCH? ;CHS39A CALL 200$ ; YES, OUTPUT ERROR ;CHS39A BR 120$ ;SKIP ;CHS39A .ENDC ; NZ LAYSW ;CHS39A 110$: CMP R3,LMARG ;MUST BE RIGHT OF LEFT MARGIN ;CHS39 BLE 20$ ;IF GT OKAY ;CHS39 MOV R3,PRMRG ;SET NEW PERMANENT RIGHT MARGIN ;CHS39 MOV R3,RMARG ;SET NEW RIGHT MARGIN ;CHS39 .IIF NZ EXTHDR, MOV R3,HRMARG ;SET NEW HEADER RIGHT MARGIN ;CHS40 120$: RETURN ;CHS39 .IF NZ LAYSW ;CHS39A ; LOCAL SUBROUTINE TO DISPLAY WARNING MESSAGE ;CHS39A 200$: CALL $ERMS2 ;OUTPUT MESSAGE ;CHS39A .WORD LOKWRN ;ADDRESS OF MESSAGE ;CHS39A CALL ONPAG ;IDENTIFY OUTPUT PAGE ;CHS39A RETURN ;CHS39A .ENDC ; NZ LAYSW ;CHS39A .ENDC ; NZ LAYOUT ;CHS39 .END