.TITLE RUNOFF .IDENT /M03X/ ; THIS PROGRAM WAS TRANSLATED FROM THE PDP-10 VERSION OF RUNOFF ; AUTHORED BY B. CLEMENTS. ; ; 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 ; ; SIG01 - CLEAN UP OPERATOR WAIT ; SIG02 - RSTS CHANGES ; CHS01 - START HEADER AT LINE #1, ADD BLANK LINE AFTER HEADER ; CHS02 - JUSTIFY PAGE NUMBER TO PERMANENT RIGHT MARGIN ; CHS04 - ADD ALTERNATING HEADER ; CHS06 - ACCEPT SPACE CHARACTER AFTER QUOTED SPACE ; CHS07 - DOUBLE SPACE AFTER ; CHS08 - SINGLE SPACE AFTER SEMICOLON ; CHS09 - ADD ABILITY TO SPECIFY PREFERRED HYPHENATION ; CHS11 - ADD HEADER TYPE "BLANK" ; CHS14 - ADD ALTERNATING TITLE ; CHS16 - USE LOCAL SYMBOLS IN PLACE OF CONSTANTS ; CHS18 - HYPHENATE AT EXISTING HYPHENS ; CHS20 - ADD OPTIONAL-TEXT COMMANDS (ADDED TXTF FLAG) ; CHS22 - OUTPUT MULTI-PART ERROR MESSAGE ON ONE LINE ; CHS23 - ADD "RIGHT JUSTIFY" COMMAND ; CHS24 - FIX SKIP AT BOTTOM OF PAGE ; CHS25 - ALLOW HYPHENATION IN FILL-ONLY MODE ; CHS26 - ALLOW HYPHENATION FLAG TO PRECEED NON-ALPHA CHARACTER ; CHS29 - MAKE MISSING NUMERIC ARG. NOT DEFAULT TO 0 ; CHS32 - ALLOW "PARAGRAPH" IN FOOTNOTES; RESET LINE SPACING ; CHS35 - MISC. CHANGES TO TAB PROCESSING ; CHS37 - FIX "FIGURE" TO WORK AS CLAIMED; ADDED QUEUE ; CHS38 - DON'T OUTPUT BLANK PAGE AT END OF OUTPUT ; CHS39 - ADD "LAYOUT" COMMAND ; CHS40 - EXPAND "HEADER" COMMAND ; CHS42 - DISTINGUISH BETWEEN "ILLEGAL COMMAND" AND "BAD PARAMETER" ; CHS43 - ADD "QUOTE CHARACTER" COMMAND ; CHS44 - ADD "!" COMMENT COMMAND AND FLAG ; CHS46 - CHANGE "ALTERNATING HEADER" TO "ALTERNATE" COMMAND ; CHS47 - ALLOW CONSECUTIVE SUBPAGES ; CHS48 - ADD FIXES FOR CHAPTER NUMBERS > 127 (COMMENTED OUT) ; CHS49 - ALLOW MULTIPLE INPUT FILES & APPENDING TO OUTPUT ; CHS50 - HAVE TASK EXTEND ITSELF WHEN INDEX/FOOTNOTE BUFFER FULL ; CHS52 - CORRECT SPACING OF UNDERLINED INDEX ENTRIES ; CHS53 - ADD WIDOW CONTROL TO "TEST PAGE" ; CHS54A- FOOTNOTE PROCESSING REWORKED ; CHS54B- ADD "FOOTNOTE LINE" COMMAND ; CHS55 - FIX DUPLICATE OUTPUT OF BLANK LINES IN AUTOPARAGRAPH MODE ; CHS56 - ADD "PAGE NAME" COMMAND ; CHS60 - MAKE SYNTAX FOR COMMAND ARGUMENTS COMMON ; CHS61 - CHANGES TO "LITERAL" PROCESSING ; CHS62 - INTERNAL CLEANUP OF ERROR MESSAGES ; ; MACRO LIBRARY CALLS ; .IIF NZ EXTEND, .MCALL EXTK$S ;CHS50 ; ; LOCAL DATA ; HPHSW: .BLKW 1 ;HYPHENATION ENABLED FOR OUTPUT (0=NO) TJFSW: .BLKW 1 ;TEMPORARY JUSTIFY FLAG (0=NO) ; ; LOCAL MACROS ; .MACRO MSGPUT NAM CALL $ERMSG .WORD MG'NAM .ENDM ; INPUT LINE LIN:: .IF NZ SKPFIX ;CHS24 TSTEQ $PGPSW,LIN1 ;CONTINUE IF NO PAGE BREAK DUE ;CHS24 CALL PAGEC ; ELSE DO IT ;CHS24 LIN1: ;CHS24 .ENDC ; NZ SKPFIX ;CHS24 CALL GCIN ;READ CHARACTER WITH PRE-TRANSLATE BITNE #LITFG,F.1,10$ ;PROCESING LITERAL? CMPEQ R1,#TAB,LTAB ;TAB? 10$: CMPNE R1,#CR,20$ ;NOT CARRIAGE RETURN? .IIF NZ LITMSG, CALL LITTST ;CHECK FOR LONG LINE IN LITERAL ;CHS61C JMP LCR ;YES. GO LOOK FOR LF 20$: .IF NZ PRFHYP+EXSTHY ;CHS18 CMPNE R1,#NXS,40$ ;NON EXPANDABLE SPACE? ;CHS18 30$: JMP LSPAC ; YES, PROCESS IT ;CHS18 40$: CMPEQ R1,#SPC,30$ ;REGULAR SPACE? ;CHS18 .IFF ;CHS18 CMPEQ R1,#NXS,LSPAC ;NON EXPANDABLE SPACE? CMPEQ R1,#SPC,LSPAC ;REGULAR SPACE? .ENDC ; -NZ PRFHYP+EXSTHY ;CHS18 CMP R1,#QTS ;SOME OTHER CONTROL CHARACTER? BGE LIN3 ;IF GE NO INC LINBK ;ACCOUNT FOR NONSPACING CHARACTER INC LINNSC LIN3: CALL WLNIN1 ;WRITE CHAR IN INPUT BUFFER .IIF NZ PDPAR, MOV LCH,NLCH ;SAVE PRECEEDING CHARACTER ;CHS07 MOV R1,LCH ;SAVE AS LAST CHARACTER DEC LINBK ;TIME TO BREAK LINE YET? .IF NZ SKPFIX ;CHS24 BGE LIN1 ;NO. LOOP FOR MORE ;CHS24 .IFF ;CHS24 BGE LIN ;NO. LOOP FOR MORE .ENDC ; NZ SKPFIX ;CHS24 .IIF NZ LITMSG, CALL LITTST ;CHECK FOR LONG LINE IN LITERAL ;CHS61C .IF DF H$$PHN CLR HPHSW ;CLEAR HYPHENATE ENABLE TSTEQ $HPHSW,LIN3A ;NO HYPHENATION ACTIVE? .IF NZ FILLHY ;CHS25 BITEQ #FILLF,F.1,LIN3A ;NO FILLING? ;CHS25 .IFF ;CHS25 BITEQ #JUSTF,F.1,LIN3A ;NO JUSTIFICATION? .ENDC ; -NZ FILLHY ;CHS25 BITEQ #HYPSW,$SWTCH,LIN3A ;NO HYPHENATION SELECTED? MOV LNIN2,-(SP) ;REMEMBER END OF LINE FIN10: CALL GCIN ;GET A CHARACTER MOV R1,R2 ;COPY CHARACTER BIC #^C<177>,R2 ;CLEAR ALL EXTRANEOUS BITS .IIF NZ EXSTHY, CMPEQB #'-,R2,10$ ;ACCEPT "-" AS PART OF WORD ;CHS18 CALL ALPH2 ;ALPHABETIC? BCS FINEX ;IF CS NO 10$: CALL WLNIN1 ;PUT CHARACTER IN BUFFER .IIF NZ PDPAR, MOV LCH,NLCH ;SAVE PRECEEDING CHARACTER ;CHS07 MOV R1,LCH BR FIN10 FINEX: MOV LSTSP,R0 ;GET ADDRESS OF LAST WORD CMPB (R0)+,(R0)+ ; TSTB (R0) ;IS WORD TO BE HYPHENATED IF POSSIBLE? BMI FIN06 ;IF MI NO MOV R1,-(SP) ;SAVE LAST CHARACTER MOV LNIN2,R1 ;CONVERT LAST WORD TO ASCIZ CLRB 1(R1) ; .IIF NZ PRFHYP, MOV R0,R1 ;CLEAR ALL HYPHENS UP TO LAST WORD ;CHS09 10$: BICB #200,(R1) ;ERASE ALL POSSIBLE HYPHENATE DISABLES DEC R1 ;BACKUP ONE BYTE CMP R1,LNIN1 ;AT FRONT OF LINE? BHI 10$ ;IF HI NO MOV SP,HPHSW ;ENABLE HYPHENATE ON OUTPUT CALL HYPHEN ;TRY TO HYPHENATE THE WORD MOV LSTSP,R1 ;ADDRESS OF LAST SPACE MOV 2(SP),R0 ;ADDRESS OF REAL END OF LINE .IF NZ EXSTHY ;CHS18 CMPNEB #'-,-1(R0),FIN02 ;BREAKING AT EXISTING HYPHEN? ;CHS18 INC R0 ;CHS18 .ENDC ; NZ EXSTHY ;CHS18 FIN02: TSTB -(R0) ;IS THIS A PLACE TO INSERT A HYPHEN? BMI FIN03 ;YES CMP R0,R1 ;NO, SHOULD I LOOK FARTHER? BHI FIN02 ;YES CLR R1 ;CLEAR MASK BR FIN05 FIN03: DEC R0 MOV R0,LSTSP ;SET POINTER TO FAKE SPACE INC SPCNT ;COUNT THE FAKE SPACE MOV R1,R0 ;GET START OF WORD MOV #200,R1 ;SET BIT MASK FIN05: BICB #200,(R0)+ ;CLEAR HYPHEN FLAG AND TEST BNE FIN05 ;IF NE MORE TO GO FIN04: BISB R1,@LSTSP ;RESET THE DESIRED ONE ONLY MOV (SP)+,R1 ;RETRIEVE SAVED CHARACTER FIN06: TST (SP)+ ;CLEAN STACK CALL WLNIN1 ;WRITE CHARACTER INTO BUFFER LIN3A: .ENDC CALL OUTLJ ;OUTPUT LINE,JUSTIFIED IF FLAGS .IF NZ EXSTHY ;CHS18 JMP LIN ;PROCESS NEXT LINE. ;CHS18 .IFF ;CHS18 BR LIN ;PROCESS NEXT LINE. .ENDC ; -NZ EXSTHY ;CHS18 ;SPECIAL CHARACTERS DURING LINE INPUT .ENABL LSB LTAB: MOV LNIN2,R2 ;DETERMINE PRESENT POSITION SUB LNIN1,R2 SUB LINNSC,R2 ADD LMARG,R2 ADD INDCT,R2 CALL TABB ;FIND WHERE NEXT TAB STOP IS CMP R2,LINBK ;WOULD THAT MANY EQUAL OR EXCEED LINE SIZE? BGE LSPAC ;YES. TREAT AS SPACE, NOT TAB SUB R2,LINBK ;AND DECREMENT LINBK COUNT BY THAT AMOUNT MOV #QTS,R1 ;PUT N QUOTED SPACES IN BUFFER 10$: CALL WLNIN1 ; .. DEC R2 ; .. BGT 10$ 20$: JMP LIN ;HERE ON SPACE IN INPUT FILE, OR ON NON-EXPANDABLE SPACE. ALSO HERE ON ;TAB WHICH COULDN'T BE SATISFIED SO IS MADE A SPACE ;NOT HERE ON QUOTED SPACES. LSPAC: BITEQ #FILLF,F.1,30$ ;NO FILLING INPUT BEYOND BREAKS? MOV LNIN2,R2 ;FILTER OUT LEADING SPACES DEC R2 ;GET START OF BUFFER MINUS ONE CMP R2,LSTSP ;IS THAT WHERE LAST SPACE IS? BLOS 20$ ;IF LOS YES MOV LCH,R1 ;GET PREVIOUS CHARACTER WHAT WAS IT? CMPEQ R1,#SPC,20$ ;SPACE? CMPEQ R1,#NXS,20$ ;NON-EXPANDABLE SPACE? .IIF Z QTSPSP, CMPEQ R1,#QTS,20$ ;QUOTED SPACE? ;CHS06 TSTEQ $PERSW,30$ ;ONE SPACE AFTER PUNCTUATION? .IF NZ PDPAR ;CHECK FOR ... ;CHS07 CMPEQ #'),R1,21$ ;SPACE AFTER CLOSE PARENTHESIS? ;CHS07 CMPEQ #'],R1,21$ ;SPACE AFTER CLOSE BRACKET? ;CHS07 CMPEQ #'},R1,21$ ;SPACE AFTER CLOSE BRACE? ;CHS07 CMPNE #'",R1,22$ ;SPACE AFTER CLOSE QUOTE? ;CHS07 21$: MOV NLCH,R1 ;WAS IT PRECEEDED BY PUNCTUATION? ;CHS07 BR 23$ ;CHS07 22$: ;CHS07 .ENDC ; NZ PDPAR ;CHS07 CMPEQ #':,R1,25$ ;COLON FOLLOWED BY A SPACE? .IIF Z SEMISS, CMPEQ #SEMI,R1,25$ ;SEMICOLON FOLLOWED BY A SPACE? ;CHS08 23$: CMPEQ #'!,R1,25$ ;EXCLAMATION POINT FOLLOWED BY A SPACE? CMPEQ #'?,R1,25$ ;QUESTION MARK FOLLOWED BY A SPACE? CMPNE R1,#PD,30$ ;NOT PERIOD FOLLOWED BY SPACE? 25$: TST LINBK ;YES. ANY MORE ROOM LEFT? BLOS 30$ ;NO. JUST STORE THE SPACE CALL 50$ ; CALL WLNIN1 ; .. DEC LINBK ;AND COUNT FOLLOWING CHARACTER MOV #NXS,R1 ;NON-EXPANDABLE SPACE BR 40$ ; 30$: CALL 50$ ; 40$: JMP LIN3 ; 50$: MOV LNIN2,LSTSP ;HERE TO STORE AND COUNT A SPACE MOV LINNSC,LSTNSP ;AND NON-SPACING CHAR POSN INC SPCNT ;COUNT THIS SPACE MOV #SPC,R1 ;SPACE CHARACTER (EXPANDABLE) RETURN ; .DSABL LSB ; LOCAL SUBROUTINE TO CHECK FOR LONG LINE IN LITERAL SECTION ;CHS61C .IF NZ LITMSG ;CHS61C LITTST: BITEQ #LITFG,F.1,10$ ;SKIP IF NOT PROCESSING LITERAL ;CHS61C MOV #MAXMRG,R2 ;CHECK IF REGULAR MARGIN WAS EXCEEDED ;CHS61C SUB LITRM,R2 ;SHOULD HAVE THIS MUCH LEFT TO GO ;CHS61C CMP LINBK,R2 ;DID WE? ;CHS61C BGE 10$ ; YES, OKAY ;CHS61C CALL $ERMS2 ; NO, WARN USER ;CHS61C .WORD LITERR ;CHS61C CALL ONPAG ;INDICATE WHICH PAGE IT WAS ON ;CHS61C 10$: RETURN ;CHS61C .ENDC ; NZ LITMSG ;CHS61C ; ENDBCM--END OF BREAK COMMAND ;- .ENABL LSB ENDBCM::CALL LINSET ;SET FOR NEW LINE (BREAK COMMAND) ;+ ; ENDCM--END OF COMMAND ;- ENDCM:: CALL $FRCND ;FORCE TO LOGICAL END OF LINE CMPEQ #PD,R1,LGO ;PERIOD NEXT CHARACTER? CMPEQ #SEMI,R1,LGO ;MORE TEXT ON LINE? BR LCR ; ;+ ; END OF LINE PROCESSING ;- COMNT:: TST (SP)+ ;REMOVE RETURN FROM STACK LCR:: CALL GCIN ;GET FILE CHARACTER LCR1: CMPNE R1,#LF,LCR ;NOT A LINEFEED? ;+ ; READ AND PROCESS NEXT LINE ;- LGO:: MOV SPSAV,SP ;RELOAD STACK POINTER CALL CCIN ;READ INITIAL CHARACTER ON LINE 5$: MOV #F.1,R5 ;POINT TO FLAG MASK WORD CMPNE R1,#EOF,20$ ;NOT END OF FILE? BITEQ #FOTF,(R5),10$ ;NOT PROCESSING FOOTNOTE? JMP FOOTND ;GO FINISH FOOTNOTE PROCESSING 10$: CALL OUTNJ ;FLUSH OUT LAST LINE .IIF NZ FIGFIX, CALL FIGDMP ;PROCESS ALL PENDING FIGURES ;CHS37 .IF Z MULTIN ;CHS49 .IF NZ LSTPG ;CHS38 CLR $HDRSW ;CLEAR HEADER PRINT ENABLE CALL PAGEC ;FORCE A PAGE .ENDC ; NZ LSTPG ;CHS38 .ENDC ; Z MULTIN ;CHS49 JMP ENDFIL ;END OF FILE 20$: CMPEQ R1,#FF,LGO ;FORMFEED ON INPUT? BITNE #LITFG,(R5),70$ ;PROCESSING LITERAL? BITEQ #FILLF,(R5),60$ ;NOT FILLING FROM INPUT FILE? TSTEQ $AUTSW,60$ ;AUTOPARAGRAPH NOT ACTIVE? CMPEQ #CR,R1,40$ ;NULL LINE? CMPEQ #TAB,R1,30$ ;LEADING TAB? CMPNE #SPC,R1,70$ ;NOT LEADING SPACE? 30$: .IF NZ GENSEP ;CHS60 CALL SKPWHT ;IGNORE WHITE SPACE ;CHS60 .IFF ;CHS60 CALL CCIN ;READ NEXT CHARACTER CMPEQ #SPC,R1,30$ ;SPACE? CMPEQ #TAB,R1,30$ ;TAB? .ENDC ; NZ GENSEP ;CHS60 CMPNE #CR,R1,50$ ;NOT CARRIAGE RETURN? 40$: CALL CCIN ;BYPASS LINE FEED 45$: .IF NZ GENSEP ;CHS60 CALL SKPWHT ;IGNORE WHITE SPACE ;CHS60 .IFF ;CHS60 CALL CCIN ;READ NEXT CHARACTER CMPEQ #SPC,R1,45$ ;SPACE? CMPEQ #TAB,R1,45$ ;TAB? .ENDC ; NZ GENSEP ;CHS60 .IF NZ AUTFIX ;CHS55B CMPEQ #FF,R1,45$ ;IGNORE ;CHS55B CMPEQ #CR,R1,40$ ;IGNORE BLANK LINES ;CHS55B .ENDC ; NZ AUTFIX ;CHS55B CMPEQ #PD,R1,90$ ;LEADING PERIOD? 50$: MOVB R1,GCSCH ;SAVE FIRST CHARACTER CALL OUTNJ ;BREAK CURRENT LINE .IIF NZ AUTFIX, TSTNE AUTFLG,55$ ;SKIP IF BLANK LINES DONE ;CHS55A CALL PARTP ;PERFORM PARAGRAPH BREAK 55$: MOV PARIND,INDCT ;SET PARAGRAPH INDENT CALL LINSET ;RESET LINE PARAMETERS BR TEXT ;PROCESS TEXT 60$: CMPEQ #CR,R1,LCR ;NULL LINE? 70$: CMPEQ R1,#PD,90$ ;PERIOD AS FIRST CHAR? MOVB R1,GCSCH ;SAVE CHARACTER TEXT:: .IIF NZ AUTFIX, CLR AUTFLG ;CLEAR BLANK-LINE FLAG ;CHS55A TSTEQ $PGPSW,80$ ;NO PAGE PENDING? CALL PAGEC ;BREAK PAGE 80$: BITNE #FILLF,F.1,85$ ;FILLING FROM INPUT FILE? CALL OUTLIN ;OUTPUT LINE JMP LIN ;AND START ANOTHER 85$: JMP LSPAC ; 90$: CALL CMN ;PARSE COMMAND MOV #ENDCM,-(SP) ;ASSUME NONBREAK COMMAND MOV (R3),-(SP) ;SET ADDRESS OF COMMAND ROUTINE MOVB (R2),-(SP) ;GET FLAG BYTE BITEQB #BRKF,(SP),100$ ;NOT BREAK COMMAND? CALL OUTNJ ;BREAK CURRENT LINE MOV #ENDBCM,4(SP) ;SET FOR BREAK COMMAND 100$: BITEQB #FPGF,(SP),110$ ;DON'T PERFORM PENDING PAGE? TSTEQ $PGPSW,110$ ;NO PAGE PENDING? CALL PAGEC ;PERFORM PAGE OPERATION 110$: MOV #RCNO,R4 ;SET ADDRESS OF NUMBER CONVERSION ROUTINE BITEQB #RELF,(SP)+,120$ ;ABSOLUTE CONVERSION REQUIRED? MOV #RCNR,R4 ;SET ADDRESS OF RELATIVE CONVERSION ROUTINE 120$: JMP @(SP)+ ;DISPATCH TO COMMAND ROUTINE .DSABL LSB ; ; ILLEGAL COMMAND ; ILCM:: CALL $ERMS2 ;ILLEGAL COMMAND ;CHS22 +ILCMM .IF NZ BADPRM ;CHS42 BR ILCM3 ;CHS42 ILCM2:: CALL $ERMS2 ;OUTPUT ERROR MESSAGE ;CHS42 .WORD ILCMD ;CHS42 ILCM3: ;CHS42 .ENDC ; NZ BADPRM ;CHS42 MOV #PD,R1 ;SET TO OUTPUT A PERIOD 10$: CALL TTC1 ;OUTPUT CHARACTER 15$: MOV #CMSTP,R4 ;READ OUT COMMAND BUFFER CALL GCI ; TO TELETYPE ;CHS22 .WORD 20$ ;END OF LINE CMPB #CR,R1 ;CONTROL CHARACTER? ;CHS22 BGE 15$ ; YES, DON'T OUTPUT IT ;CHS22 BR 10$ ;LOOP FOR WHOLE LINE 20$: CALL $ERMS3 ;FINISH STRING ;CHS62 .WORD ILCMM0 ;CHS22 .IIF NZ OPTTXT, TSTNEB OPTACT,ONPAG ;SKIP IF IN OPTION SCAN ;CHS20 MOV #LCR,-(SP) ;SET EXIT ADDRESS ONPAG:: CALL $ERMS3 ;OUTPUT MORE OF ERROR MESSAGE ;CHS62 +ILCMM2 MOV APNDN,R1 ;GET CURRENT APPENDIX LEVEL BEQ 10$ ;IF EQ NONE ADD #'A-1,R1 ;CONVERT TO ASCII LETTER CALL TTC1 ;OUTPUT LETTER BR 20$ ; 10$: MOVB CHPTN,R0 ;GET CURRENT CHAPTER NUMBER BEQ 30$ ;IF EQ NONE ; BIC #177400,R0 ;CLEAR POSSIBLE SIGN EXTENSION ;CHS48C CALL DECTY ;OUTPUT CHAPTER NUMBER 20$: MOV #'-,R1 ;OUTPUT A DASH CALL TTC1 30$: MOV PAGENO,R0 MOV #TTC33,-(SP) ;SET EXIT ADDRESS DECTY: MOV #12,R1 ;SET DIVISOR CALL $DIV ;DIVIDE MOV R1,-(SP) ;SAVE REMAINDER TSTEQ R0,10$ ;NO MORE DIGITS TO CONVERT? CALL DECTY 10$: MOV (SP)+,R1 ADD #60,R1 JMP TTC1 ; ; EXPAND MEMORY ; EXPAND:: .IF NZ EXTEND ;CHS50 EXTK$S #INCR ;EXTEND TASK INCR*32. WORDS ;CHS50 CMPNE #IS.SUC,$DSW,80$ ;QUIT IF FAILURE ;CHS50 MOV R1,-(SP) ;SAVE REGISTERS ;CHS50 MOV R2,-(SP) ;CHS50 MOV R3,-(SP) ;CHS50 MOV #INCR*32.,R1 ;SAVE SIZE OF EXPANSION ;CHS50 MOV XFIRST,R2 ;GET POINTER TO FIRST RECORD ;CHS50 BEQ 60$ ;SKIP IF THERE IS NONE ;CHS50 MOV (R2),R3 ;SAVE FORWARD POINTER ;CHS50 BEQ 10$ ;LEAVE ALONE IF AT END OF LIST ;CHS50 ADD R1,(R2) ;ADVANCE POINTER ;CHS50 10$: ADD #4,R2 ;POINT TO ASCII POINTER ;CHS50 ADD R1,(R2) ;ADVANCE ASCII POINTER ;CHS50 20$: MOV R3,R2 ;POINT TO NEXT RECORD ;CHS50 BEQ 50$ ;ALL DONE IF 0 ;CHS50 MOV (R2),R3 ;SAVE FORWARD POINTER ;CHS50 BEQ 30$ ;LEAVE ALONE IF AT END OF LIST ;CHS50 ADD R1,(R2) ;ADVANCE FORWARD POINTER ;CHS50 30$: TST (R2)+ ;ADVANCE TO BACK. PTR. ;CHS50 TSTEQ (R2),40$ ;LEAVE IT ALONE IF ZERO? ;CHS50 ADD R1,(R2) ; NO, ADVANCE BACKWARD POINTER ;CHS50 40$: TST (R2)+ ;ADVANCE TO ASCII PTR. ;CHS50 ADD R1,(R2) ;ADVANCE IT TO NEW LOCATION ;CHS50 BR 20$ ;GO BACK FOR NEXT RECORD ;CHS50 50$: ADD R1,XFIRST ;ADVANCE POINTER TO FIRST RECORD ;CHS50 60$: MOV XTOP,R2 ;POINT TO CURRENT TOP OF BUFFER ;CHS50 ADD R1,XTOP ;ADVANCE TO NEW POSITION ;CHS50 MOV XTOP,R3 ;POINT TO NEW TOP ;CHS50 70$: MOV -(R2),-(R3) ;COPY INDEX LIST UP ;CHS50 CMP R2,XBOT ;REACHED BOTTOM YET? ;CHS50 BHI 70$ ; NO, KEEP COPYING ;CHS50 ADD R1,XBOT ; YES, RESET BOTTOM POINTER ;CHS50 MOV (SP)+,R3 ;RESTORE REGISTERS ;CHS50 MOV (SP)+,R2 ;CHS50 ADD R1,R2 ;ADVANCE POINTER ;CHS50 MOV (SP)+,R1 ;CHS50 RETURN ;RETURN TO CALLING ROUTINE ;CHS50 80$: ;CHS50 .ENDC ; NZ EXTEND ;CHS50 .IIF NZ MULTIN, CLRB LOOP ;TERMINATE INPUT COMMAND STRING ;CHS49 CALL $ERMSG ;OUTPUT ERROR MESSAGE .WORD CORERR JMP ENDFIL ; CHECK A CHARACTER FOR UPPER OR LOWER CASE ; ALPHABETICS ;- ALPH1:: MOV R2,-(SP) ;SAVE R2 MOV R1,R2 ;SET CHARACTER TO CHECK CALL ALPH2 ;CHECK FOR ALPHABETIC MOV (SP)+,R2 ;RESTORE R2 RETURN ; ALPH:: MOVB (R0),R2 ;GET CHARACTER TO CHECK ALPH2:: CMP R2,#'A BLO 20$ CMP R2,#'Z BLOS 10$ CMP R2,#'A+40 BLO 20$ CMP R2,#'Z+40 BHI 20$ 10$: CLC ;INDICATE ALPHABETIC RETURN ; 20$: SEC ;INDICATE NONALPHABETIC RETURN ; ;SUBROUTINE TO INITIALIZE COUNTS AND POINTERS FOR A NEW LINE LINSET::MOV RMARG,R2 ;COMPUTE REAL WIDTH OF LINE SUB LMARG,R2 ;AS DIFFERENCE OF MARGINS SUB INDCT,R2 ;MINUS INDENTING MOV R2,LINBK ;STORE IN LINE-BREAK COUNT MOV #-1,SPCNT ;INITIAL COUNTS OF SPACING CLR NSPCH ; AND NON-SPACING CHARS CLR CPOS ;CARRIAGE POSITION IS FAR LEFT CLR LINNSC ;NO NON-SPACING CHARACTERS MOV LNIN1,LNIN2 ;CLEAR LINE INPUT BUFFER MOV LNIN1,LSTSP ;SET LAST SPACING CHARACTER BACK HERE DEC LSTSP ;MINUS ONE, SO OFF START OF BUFFER ULBSET::MOV #ULPBF,ULPOS ;RESET UNDERLINE POSITION BUFFER RETURN ; ;+ ; RCNR--RELATIVE DECIMAL CONVERSION ROUTINE ; ; INPUTS: ; ; R3=BASE VALUE TO BE AUGMENTED. ; ; OUTPUTS: ; ; NONSKIP RETURN IF NO NUMBER IS PRESENT. ; ; SKIP RETURN WITH R3 UPDATED TO NEW VALUE. ;- .ENABL LSB RCNR:: MOV R3,-(SP) ;SAVE BASE VALUE CALL RCNO ;CONVERT DECIMAL NUMBER .IF NZ NOPARM ;CHS29 JMP 50$ ;NONSKIP RETURN IF NULL ;CHS29 BEQ 5$ ;IF EQ, NO SIGN SPECIFIED ;CHS29 ADD (SP),R3 ;AUGMENT BASE VALUE ;CHS29 5$: ADD #4,2(SP) ;SET SKIP RETURN ;CHS29 BR 50$ ;TAKE SKIP RETURN ;CHS29 .IFF ;CHS29 JMP 40$ ;NONSKIP RETURN IF NULL BEQ 30$ ;IF EQ NO SIGN SPECIFIED ADD (SP),R3 ;AUGMENT BASE VALUE BR 30$ ;SKIP RETURN .ENDC ; -NZ NOPARM ;CHS29 ; ; READ SIGNED DECIMAL NUMBER FOR COMMAND DECODER ; NON-SKIP RETURN IF NONE FOUND ; RCNO:: CLR R3 ;CLEAR ANSWER AC .IIF NZ NOPARM, CLR -(SP) ;AND INPUT FLAG ;CHS29 CLR -(SP) ;AND SIGN FLAG RCN1: .IF NZ GENSEP ;CHS60 CALL SKPWHT ;GET FIRST NON-BLANK CHARACTER ;CHS60 .IFF ;CHS60 CALL CCIN ;READ CHARACTER FROM COMMAND LINE .IFTF ;CHS60 CMPEQ R1,#CR,RCN5 ;LEADING CARRIAGE RETURN? CMPEQ #PD,R1,RCN5 ;LEADING PERIOD? CMPEQ #SEMI,R1,RCN5 ;LEADING CHARACTER SEMICOLON? .IIF NZ EXCMNT, CMPEQ #EXCL,R1,RCN5 ;LEADING "!" CHARACTER? ;CHS44 CMPEQ R1,#CMA,40$ ;LEADING COMMA? .IFF ;CHS60 CMPEQ R1,#SPC,RCN1 ;LEADING SPACE? CMPEQ R1,#TAB,RCN1 ;LEADING TAB? .ENDC ; -NZ GENSEP ;CHS60 CMPNE #'+,R1,10$ ;NOT PLUS SIGN? INC (SP) ;SET PLUS SIGN PRESENT 10$: CMPNE R1,#'-,20$ ;NOT MINUS SIGN? COM (SP) ;SET NEGATE FLAG 20$: TSTEQ (SP),RCN2 ;SIGN NOT SPECIFIED? RCN3: CALL CCIN ;READ ANOTHER CHARACTER RCN2: CMP R1,#'9 ;THIS CHAR A DIGIT? BGT RCN4 CMP R1,#'0 ; .. BLT RCN4 ;NO. STOP HERE. ASL R3 ;MULTIPLY BY 10. MOV R3,-(SP) ; ASL R3 ; ASL R3 ; ADD (SP)+,R3 ; SUB #60,R1 ;SUBTRACT OUT CHARACTER BIAS ADD R1,R3 ;ADD IN DIGIT .IIF NZ NOPARM, INC 2(SP) ;SET INPUT FLAG ;CHS29 BR RCN3 ;AND LOOP FOR MORE. RCN4: CMPNE R1,#CMA,25$ ;NOT COMMA? CALL CCIN ;READ NEXT CHARACTER 25$: TST (SP) ;SIGN NEGATIVE? BPL 30$ ;IF PL NO NEG R3 ;NEGATE NUMBER 30$: .IF NZ NOPARM ;CHS29 TSTEQ 2(SP),RCN5 ;ANY INPUT SEEN? ;CHS29 ADD #4,4(SP) ; YES, SET SKIP RETURN ;CHS29 .IFF ;CHS29 ADD #4,2(SP) ;SET SKIP RETURN .IFTF ;CHS29 RCN5: MOVB R1,GCSCH ;STORE BREAK CHARACTER 40$: .IFT ;CHS29 MOV (SP)+,(SP) ;CLEAN STACK ;CHS29 50$: ;CHS29 .ENDC ; -NZ NOPARM ;CHS29 TST (SP)+ ;CLEAN STACK & SET CONDITION CODES RETURN ; .DSABL LSB ; $FRCND - FORCE TO LOGICAL END OF COMMAND $FRCND:: .IF NZ GENSEP ;CHS60 CALL SKPWHT ;SKIP OVER WHITE SPACE ;CHS60 .IFF ;CHS60 CALL CCIN ;READ CHARACTER FROM FILE CMPEQ #SPC,R1,$FRCND ;SPACE? CMPEQ #TAB,R1,$FRCND ;TAB? .ENDC ; -NZ GENSEP ;CHS60 CMPEQ #SEMI,R1,10$ ;SEMICOLON? MOVB R1,GCSCH ;SAVE BREAK CHARACTER 10$: RETURN ; ; SKIP OVER COMMAND ARGUMENT SEPARATOR ;CHS60 .IF NZ GENSEP ;CHS60 SKPSEP::CALL SKPWHT ;SKIP OVER WHITE SPACE ;CHS60 CMPEQB #SEMI,R1,30$ ;PROCEED IMMEDIATELY AFTER SEMICOLON ;CHS60 CMPNEB #CMA,R1,10$ ;SKIP WHITE SPACE AFTER COMMA ;CHS60 CALL SKPWHT ;CHS60 10$: CMPNEB #CR,R1,20$ ;SKIP IF NO TEXT TO CENTER ;CHS60 SEC ;SIGNAL END OF LINE ENCOUNTERED ;CHS60 BR 40$ ;CHS60 20$: MOVB R1,GCSCH ;SAVE BREAK CHARACTER ;CHS60 30$: CLC ;MAKE SURE C BIT CLEAR ;CHS60 40$: RETURN ;CHS60 ; SKIP OVER COMMAND ARGUMENT SEPARATOR (INCLUDING CRLF) ;CHS60 SKPEND::CALL SKPSEP ;SKIP ARGUMENT SEPARATOR ;CHS60 BCC 10$ ;C BIT INDICATES END OF LINE ;CHS60 CALL SKPLF ;SKIP LINE SEPARATOR ;CHS60 SEC ;SIGNAL END OF LINE ENCOUNTERED ;CHS60 10$: RETURN ;CHS60 ; IGNORE WHITE SPACE ;CHS60 SKPWHT::CALL CCIN ;READ NEXT CHARACTER ;CHS60 CMPEQB #SPC,R1,SKPWHT ;IGNORE SPACES ;CHS60 CMPEQB #TAB,R1,SKPWHT ; AND TABS ;CHS60 RETURN ;CHS60 ; THROW AWAY REST OF LINE ;CHS60 SKPLF:: CALL CCIN ;READ NEXT CHARACTER ;CHS60 CMPNEB #LF,R1,SKPLF ;IGNORE EVERYTHING UNTIL LF ;CHS60 RETURN ;CHS60 .ENDC ; NZ GENSEP ;CHS60 ; LINE OUTPUT ROUTINE...THREE ENTRY POINTS OUTNJ:: MOV LNIN2,R2 ;HERE TO OUTPUT CURRENT LINE, NOT JUSTIFIED .IIF NZ FILLHY, CLR HPHSW ;CLEAR HYPHENATE ENABLE ;CHS25 CALL OUTNJ2 ;CALL BODY OF ROUTINE CLR EXSP3 ;CLEAR LEFT RIGHT SPACING FLAG OUTNJ3: RETURN ; OUTLJ: MOV LSTSP,R2 ;END OF LINE IS LAST SPACE, IF ANY CMP R2,LNIN1 ;.. BHI ..036 OUTLIN: MOV LNIN2,R2 ;ELSE END OF INPUT LINE ..036: MOV SP,TJFSW ;COPY JUSTIFY FLAG BITNE #JUSTF,F.1,..037 ;JUSTIFYING? OUTNJ2: CLR TJFSW ;CLEAR JUSTIFY FLAG .IF DF H$$PHN .IIF Z FILLHY, CLR HPHSW ;CLEAR HYPHENATE ENABLE ;CHS25 .IFTF ..037: MOV R2,LOUT2 ;SAVE END OF LINE TO CONSIDER MOV LNIN1,LOUT1 ;AND BEGINNING. CMP R2,LOUT1 ;LINE EMPTY? BLOS OUTNJ3 ;IF LOS YES TSTEQ TJFSW,OUTNJ1 ;NOT JUSTIFYING LINE? TST SPCNT ;YES, ANY SPACES IN LINE? BGT 30$ ;IF GT YES CALL $ERMSG ;OUTPUT ERROR MESSAGE .WORD JUSRM1 ; MOV LOUT1,T1 ;COPY LINE DESCRIPTOR MOV LOUT2,T2 ; 10$: MOV #T1,R4 ;READ A CHARACTER FROM LINE CALL GCI ; .WORD 20$ ;END OF LINE CMP R1,#SPC ;CONTROL OR SPECIAL CHARACTER? ;CHS BLT 10$ ; YES, DON'T OUTPUT IT ;CHS CALL TTC1 ;OUTPUT CHARACTER BR 10$ ; 20$: CALL TTC33 ;FORCE LINE OUT CALL $ERMS2 ;OUTPUT SOME SPACES ;CHS22 .WORD ILCMM1 ;CHS22 CALL ONPAG ;INDICATE WHAT PAGE CLR TJFSW ;CLEAR JUSTIFICATION BR OUTNJ1 ; 30$: MOV RMARG,R0 ;YES. COMPUTE WHERE TO EXPAND THEM SUB LMARG,R0 ;SIZE OF LINE SUB INDCT,R0 ; .. ADD LOUT1,R0 ;SUBTRACT SIZE OF DATA SUB LOUT2,R0 ;.. ADD LSTNSP,R0 ;COMPENSATE FOR NON-SPACING CHARACTERS .IFT TSTEQ HPHSW,..040 ;NO HYPHENATION ON OUTPUT? .IF NZ EXSTHY ;CHS18 MOVB @LSTSP,R1 ;CHECK END-OF-LINE CHARACTER ;CHS18 BPL ..040 ;SKIP IF NOT HYPHENATION SITE ;CHS18 CMPNEB #<200+'->,R1,35$ ;IS IT ALREADY A HYPHEN? ;CHS18 BICB #200,@LSTSP ; YES, CLEAR FLAG ;CHS18 BR ..040 ; AND SKIP ;CHS18 35$: ;CHS18 .IFF ;CHS18 TSTB @LSTSP ;DO WE ACCOUNT FOR A HYPHEN? BPL ..040 ;IF PL NO .ENDC ; -NZ EXSTHY ;CHS18 DEC R0 ;YES, DECREMENT COUNT ..040: .IFTF MOV SPCNT,R1 ;NOW FIND HOW MANY MULT SPACES EACH SPACE IS CALL $DIV ;DIVIDE MOV R0,EXSP1 ;MULTIPLIER FOR ALL SPACES TSTNE EXSP3,10$ ;EXTRAS TO LEFT? NEG R1 ;RIGHT. GET SPACES BEFORE EXTRAS ADD SPCNT,R1 ;.. 10$: MOV R1,EXSP2 ;STORE FOR LATER OUTNJ1: MOV INDCT,R2 ;GET INDENTING IN CASE OF PARAGRAPH CLR INDCT ;(ONCE ONLY) ADD LMARG,R2 ;PLUS LEFT MARGIN .IF NZ LAYOUT ;CHS39 CALL NSPACB ;SPACE OVER FROM BASE MARGIN ;CHS39 .IFF ;CHS39 CALL NSPAC ;OUTPUT THAT MANY SPACES .ENDC ; -NZ LAYOUT ;CHS39 OUTL1: CALL GLOUT ;READ A CHARACTER FROM OUTPUT BUFFER .WORD OUTLE ;END OF OUTPUT BUFFER CMPEQ R1,#SPC,OUTSP ;REAL SPACE? CMPNE R1,#NXS,10$ ;NOT NON-EXPANDABLE SPACE? MOV #SPC,R1 ;YES. MAKE IT ONE SPACE 10$: .IFT MOV R1,-(SP) BIC #200,R1 ;CLEAR POSSIBLE HYPHENATION FLAG .IFTF CALL CCOUT ;OUTPUT THE CHARACTER .IFT TSTB (SP)+ ;SHOULD HYPHEN BE TYPED? BPL OUTL1 ;IF PL NO TSTEQ HPHSW,OUTL1 ;NO HYPHENATION ON OUTPUT? .IIF NZ EXSTHY, CMPEQB #'-,R1,OUTL1 ;WAS LAST CHAR A "-"? ;CHS18 MOV #'-,R1 CALL CCOUT ;OUTPUT IT .ENDC BR OUTL1 ;LOOP BACK FOR MORE. OUTSP: CALL CCSPC ;OUTPUT A SPACE TSTEQ TJFSW,OUTL1 ;NOT JUSTIFYING LINE? MOV EXSP1,R2 ;YES. HOW MANY MULTIPLE SPACES? CALL NSPAC ;IF ANY, SEND THEM. DEC EXSP2 ;TO EXTRA BLANKS YET? BGE OUTS1 ;NO. TSTEQ EXSP3,OUTS2 ;SPACES TO RIGHT? BR OUTL1 ;LEFT. NO MORE EXTRAS, JUST LOOP OUTS1: TSTEQ EXSP3,OUTL1 ;NO SPACES LEFT OR RIGHT? OUTS2: CALL CCSPC ;OUTPUT A SPACE BR OUTL1 ;AND LOOP FOR REST OF LINE ;END OF LINE, AND FOOTNOTE PROCESSING OUTLE: COM EXSP3 ;COMPLEMENT LEFT RIGHT FLAG MOV LNIN2,R2 MOV LNIN1,LNIN2 CMP R2,LOUT2 ;ANY LEFT TO OUTPUT? BLOS OUTLE4 ;NO. MOV R2,GCIN2 ;YES. SAVE POINTER MOV LOUT2,GCINP ;FOR GET CHARACTER ROUTINE COMB $GCISW ;SET TO REREAD BUFFER OUTLE4: CALL SKIPS ; .. .IF Z NEWFTN ;CHS54A TSTEQ FOOTC,OUTFT1 ;NO FOOTNOTE LINE COMMANDS DECLARED? OUTFT: BITNE #FOTF,F.1,OUTFT1 ;DOING THEM ALREADY? MOV NLPG,R2 ;GET STARTING FOOTNOTE LINE SUB FOOTC,R2 ;REDUCE BY REQUESTED LINES CLR FOOTC ;CLEAR REQUESTED LINES MOV R2,NLPG ;SAVE STARTING FOOTNOTE LINE SUB NSPNG,R2 ;MINUS NORMAL SPACING CMP R2,LINEC ;ROOM ON THIS PAGE FOR FOOTNOTE? BHI OUTFT1 ;IF HI YES CALL BPAGE ;BREAK PAGE HERE. .ENDC ; Z NEWFTN ;CHS54A OUTFT1: JMP LINSET ;RESET LINE PARAMATERS ; SKIP N LINES ON OUTPUT FILE .ENABL LSB SKIPS:: MOV NSPNG,R2 ;SET TO SKIP TO NEXT LINE BR SKIPN ; SKIP1:: MOV #1,R2 ;SET TO SKIP ONE LINE SKIPN:: MOV R3,-(SP) ;SAVE R3 TSTNEB $ULMSW,50$ ;NO NEED TO CONSIDER SAVED UNDERLINES? MOV #ULPBF,R3 ;POINT TO START OF UNDERLINE POSITION BUFFER CMPEQ R3,ULPOS,50$ ;NO UNDERLINES IN THE BUFFER? MOV R2,-(SP) ;SAVE NUMBER OF LINES TO BE OUTPUT TSTNEB $ULNSW,40$ ;UNDERLINES SUPPRESSED? MOV #LPUS,-(SP) ;ASSUME UNDERLINE VIA UNDERLINE CHARACTER TSTEQB $ULSSW,10$ ;USE UNDERLINE CHARACTER? MOV #'-,(SP) ;SET CHARACTER TO DASH INC LINEC ;ACCOUNT FOR EXTRA LINE CALL CRLF ;SPACE TO NEXT LINE CALL OUTPUT BR 20$ ; 10$: MOV #CR,R1 ;OUTPUT A CARRIAGE RETURN CALL FOUT ; 20$: CLR CPOS ;START AT BEGINNING OF LINE 30$: MOVB (R3)+,R2 ;GET POSITION WHERE UNDERLINE GOES SUB CPOS,R2 ;HOW FAR TO IT? CALL NSPAC ;SPACE TO THE UNDERLINE MOV (SP),R1 ;GET PROPER UNDERSCORE CHARACTER CALL FOUT ;SEND TO FILE INC CPOS ;COUNT POSITION CMPNE R3,ULPOS,30$ ;NOT TO LAST UNDERLINE? TST (SP)+ ;CLEAN STACK 40$: CALL ULBSET ;RESET UNDERLINE BUFFER POINTER MOV (SP)+,R2 ;RESTORE NUMBER OF LINES 50$: ADD R2,LINEC ;COUNT LINES CLR NSPCH ;CLEAR PER-LINE COUNTS CLR CPOS ; .. 60$: CALL CRLF ;SPACE TO NEXT LINE DEC R2 ;OUTPUT AS MANY AS REQUESTED BGT 60$ ;IF GT YES CALL OUTPUT ;OUTPUT LOGICAL LINE MOV NSPNG,R3 ;GET SPACING COUNT TO NEXT LINE .IF NZ SKPFIX ;CHS24 TSTNE $IDXAC,65$ ;SKIP IF INDEX BEING OUTPUT ;CHS24 CMPNE FOOTP1,FOOTP2,65$ ;OR IF FOOTNOTE PENDING ;CHS24 ADD LINEC,R3 ;ADD ON CURRENT LINE POSITION ;CHS24 CMP R3,NLPG ;COMPARE TO LENGTH W/O FOOTNOTES ;CHS24 BLE 66$ ;DON'T START NEW PAGE IF NOT DUE ;CHS24 MOV SP,$PGPSW ;SET PAGE PENDING ;CHS24 BR 66$ ;CHS24 .ENDC ; NZ SKPFIX ;CHS24 65$: CALL TESTP ;TEST IF PAGE SHOULD BE BROKEN 66$: MOV (SP)+,R3 ;RESTORE R3 70$: RETURN ; ; ROUTINE TO OUTPUT SPACES TO FILE ; .IF NZ LAYOUT ;CHS39 NSPACB::ADD BASMRG,R2 ;INCLUDE BASE MARGIN ;CHS39 .ENDC ; NZ LAYOUT ;CHS39 NSPAC:: DEC R2 ;ANY MORE SPACES TO OUTPUT? BLT 70$ ;IF LT NO CALL CCSPC ;OUTPUT A SPACE BR NSPAC ; ; ; ROUTINES TO OUTPUT A STRING TO THE OUTPUT FILE ; PSTRPA::MOV (R4)+,S1 ;GET ADDRESS OF STRING MINUS 1 MOV (R4),R4 ;GET ENDING ADDRESS OF STRING MINUS 1 CLRB 1(R4) ;SET SENTINEL BYTE 80$: INC S1 ;POINT TO NEXT BYTE PSTRAZ::MOVB @S1,R1 ;GET A CHARACTER BEQ 70$ ;IF EQ END OF STRING .IF NZ RTJUST ;CHS23 BPL 90$ ;MAKE SURE 200 BIT CLEAR ;CHS23 BIC #200,R1 ;CHS23 90$: ;CHS23 .ENDC ; NZ RTJUST ;CHS23 CALL CCOUT ;OUTPUT TO FILE BR 80$ ;LOOP FOR WHOLE STRING .DSABL LSB ; ; SUBROUTINE TO OUTPUT CHARACTER TO FILE, AFTER SOME TESTS ; .ENABL LSB CCOUT: CMPNE R1,#ULCHS,10$ ;NOT UNDERLINE CHARACTER? TSTEQB $ULMSW,30$ ;BY LINE? MOV #LPUS,R1 ;CONVERT TO OUTPUT UNDERLINE CALL FOUT ;YES, SEND UNDERLINE MOV #BS,R1 ;AND FOLLOW WITH BACKSPACE INC XNSPCH ;COUNT IF INDEX ENTRY ;CHS52 10$: CMPNE R1,#QTS,20$ ;NOT QUOTED SPACE? CCSPC:: MOV #SPC,R1 ;MAKE REAL SPACE 20$: INC CPOS ;COUNT POSITION OF CARRIAGE JMP FOUT ;OUTPUT CHARACTER 30$: MOVB CPOS,@ULPOS ;INTO UNDERLINE BUFFER INC ULPOS ;STEP BUFFER POINTER (SHOULD CHECK IT) RETURN .DSABL LSB ;GET INPUT CHARACTER FROM SOURCE FILE .ENABL LSB GCIN:: TSTEQB $GCISW,GCIN3 ;NOT REREADING FROM BUFFER? CALL GGCINP ;GET CHARACTER FROM BUFFER .WORD 10$ ;NONE RETURN ; 10$: CLRB $GCISW ;CLEAR REREAD FLAG GCIN3: TSTNEB GCSCH,GCIN5 ;SAVED CHARACTER? MOVB ULMCH,R1 ;SAVED UNDERLINE CHARACTER? BEQ GCIN5 ;IF EQ NO CLRB ULMCH ;CLEAR SAVED UNDERLINE CHARACTER BR 80$ ; GCIN5: CALL CCIN ;NO. GET CHARACTER FROM FILE. GCIN6: CMP #'Z+40,R1 ;LOWER CASE? BLO 30$ ;IF LO NO CMP #'A+40,R1 ;LOWER CASE? BHI 20$ ;IF HI NO SUB WCAS,R1 ;CONVERT CASE IF NECESSARY BR GCINR ; 20$: CMP #'A,R1 ;UPPER CASE? BHI 30$ ;IF HI NO CMP #'Z,R1 ;UPPER CASE? BLO 30$ ;IF LO NO TSTNE WCAS,GCINR ;CONVERTING TO UPPER CASE FOR THIS WORD? ADD CAS,R1 ;CONVERT TO LOWER CASE IF NECESSARY BR GCINR ; 30$: TSTEQ $CFLSW,60$ ;FLAGS CAPITALIZE NOT ENABLED? CMPEQ #QTSP,R1,40$ ;QUOTED SPACE? CMPEQ #SPC,R1,40$ ;SPACE? CMPEQ #TAB,R1,40$ ;TAB? CMPNE #LF,R1,50$ ;NOT LINE FEED? 40$: CLR WCAS ;CLEAR WORD CASE CONVERSION 50$: CMPNE #WCAP,R1,60$ ;NOT WORD CAPITALIZE? MOV #40,WCAS ;SET WORD CAPITALIZE CONVERSION VALUE BR GCIN3 ; 60$: .IIF NZ SUBIDX, CLRB QTFLG ;ASSUME NOT QUOTE CHARACTER ;CHS51B .IF NZ QTCHAR ;CHS43 CMPEQB R1,QTCHR,CWR1 ;QUOTING A CHARACTER? ;CHS43 .IFF ;CHS43 CMPEQ R1,#CWARN,CWR1 ;QUOTING A CHARACTER? .ENDC ; -NZ QTCHAR ;CHS43 CMPEQ R1,#SHUP,SHFUP ;UPSHIFT CHARACTER? CMPEQ R1,#SHDN,SHFDN ;DOWNSHIFT CHARACTER? CMPEQ R1,#ULCHI,ULCH ;UNDERLINE REQUEST? .IF DF H$$PHN TSTEQ $HFLSW,70$ ;FLAGS HYPHENATE NOT ENABLED? CMPEQ #'=,R1,FLHYP ;FLAGS HYPHENATE? .IFTF 70$: CMPNE R1,#QTSP,GCINR ;NOT QUOTED SPACE? MOV #QTS,R1 ;SET QUOTED SPACE GCINR: TSTEQ $ULLSW,80$ ;UNDERLINE SHIFT-LOCK NOT ON? CMPEQ #QTS,R1,80$ ;QUOTED SPACE? CMP #SPC,R1 ;PRINTING CHARACTER? BGE 80$ ;IF GE NO MOVB R1,ULMCH ;SAVE UNDERLINED CHARACTER ULCH: MOV #ULCHS,R1 ;SET TO UNDERLINE CHARACTER INC NSPCH ;COUNT NONSPACING CHARACTERS 80$: RETURN ; .DSABL LSB .IFT ; ; FLAG HYPHENATE CHARACTER ; FLHYP: CALL GCIN ;GET NEXT CHARACTER WITH TRANSLATE .IF NZ GLBLFH ;CHS26 CMPB #SPC,R1 ;SPECIAL CHARACTER? ;CHS26 BGE GCINR ; YES, IGNORE FLAG ;CHS26 .IFF ;CHS26 CALL ALPH1 ;ALPHABETIC CHARACTER? BCS GCINR ;IF CS NO .ENDC ; -NZ GLBLFH ;CHS26 BISB #200,R1 ;DISABLE HYPHENATION ON THIS WORD BR GCINR ; .ENDC ;SPECIAL CASES OF INPUT CHARACTER CWR1: CALL CCIN ;READ CHARACTER NO TRANSLATION .IIF NZ SUBIDX, INCB QTFLG ;SET QUOTED-CHARACTER FLAG ;CHS51B BR GCINR ;AND RETURN IT. MAYBE UNDERLINED ;MORE SPECIAL CASES OF GET-CHARACTER ROUTINE .ENABL LSB SHFUP: CALL CCIN ;READ A CHARACTER CMPEQ R1,#ULCHI,ULMON ;LOCK ON UNDERLINE? CMPNE R1,#SHUP,20$ ;NOT DOUBLE UPSHIFT? CALL UPCAS ;SET UPPER CASE 10$: BR GCIN3 ;AND GO READ ANOTHER CHARACTER 20$: CALL ALPH1 ;ALPHABETIC CHARACTER? 30$: BCS GCIN6 ;IF CS NO CMP #'A+40,R1 ;LOWER CASE? 40$: BHI GCINR ;IF HI NO CMP #'Z+40,R1 ;LOWER CASE? 50$: BLO GCINR ;IF LO NO SUB #40,R1 ;CONVERT TO UPPER CASE BR GCINR ; SHFDN: CALL CCIN ;GET ANOTHER CHARACTER CMPEQ R1,#ULCHI,ULMOF ;UNLOCK UNDERLINE? CMPNE R1,#SHDN,60$ ;NOT SECOND DOWNSHIFT? CALL LWCAS ;SET LOWER CASE BR 10$ ; 60$: CALL ALPH1 ;ALPHABETIC CHARACTER? BCS 30$ ;IF CS NO CMP #'A,R1 ;IN RANGE FOR LOWERING? BHI 40$ ;IF HI NO CMP #'Z,R1 ;IN RANGE FOR LOWERING? BLO 50$ ;IF LO NO ADD #40,R1 ;YES. MAKE IT LOWER CASE BR GCINR ; ULMON: MOV SP,$ULLSW ;UNDERLINE LOCKED ON BR 10$ ULMOF: CLR $ULLSW ;UNDERLINE LOCKED OFF BR 10$ ; .DSABL LSB ; READ INPUT FROM FILE OR FOOTNOTE AS APPROPRIATE CCIN:: MOVB GCSCH,R1 ;ANY CHARACTER SAVED FROM EARLIER PASS? BNE 30$ ;IF NE YES TSTEQB $SDISW,20$ ;INPUT NOT FROM SECONDARY BUFFER? MOV #SDINP,R4 ;SET ADDRESS OF LINE DESCRIPTOR CALL GCI ;GET CHARACTER FROM BUFFER .WORD 10$ ;NONE RETURN ; 10$: CLRB $SDISW ;CLEAR INPUT FROM SECONDARY BUFFER 20$: BITNE #FOTF,F.1,40$ ;CHARACTERS COMING FROM FOOTNOTE? JMP FIN ;NO. READ FROM FILE 30$: CLRB GCSCH ;CLEAR SAVED CHARACTER RETURN ; 40$: MOV #FOOTP1,R4 ;GET CHARACTER FROM FOOTNOTE STRING CALL GCI ;GET THE CHARACTER .WORD 50$ ;NONE LEFT RETURN ; 50$: CALL $ERMSG ;GIVE THE HALT MESSAGE +HALTM JMP RUNOFF ;RESTART RUNOFF ; ROUTINE TO FIND NEXT TABSTOP FOR OUTLIN ROUTINE. TABB: CLR R0 ;START AT FIRST TABSTOP BR 20$ ;PRE-ENDCHECK, IN CASE NONE. 10$: MOVB TABTAB-1(R0),R4 ;GET CURRENT TAB STOP CMP R2,R4 ;THIS STOP BEYOND CURRENT POS? BLO 40$ ;YES. GET DIFFERENCE 20$: CMPB R0,NTABS ;LOOKED AT ALL TAB STOPS? ;CHS35A BGE 30$ ;CHS35A INC R0 ;ADVANCE TO NEXT ENTRY BR 10$ 30$: MOV RMARG,R4 ;YES. ASSUME A TABSTOP AT RIGHT END 40$: SUB R2,R4 ;GET DISTANCE TO TABSTOP MOV R4,R2 ;ANSWER IN A RETURN ; ; BREAK PAGE AND OUTPUT HEADING .ENABL LSB .IF NZ SBPFIX ;CHS47 ENDSBP:: ;END SUBPAGES ;CHS47 .IFF ;CHS47 PAGEC:: .IFTF ;CHS47 CLR $SBPSW ;CLEAR SUBPAGE FLAG MOV #SPC,SUBPGE ;RESET SUBPAGE NUMBER .IFT ;CHS47 PAGEC:: ;CHS47 .ENDC ; NZ SBPFIX ;CHS47 BR BPAGE ; TPAGE:: MOV SP,$SBPSW ;SET SUBPAGE FLAG .IIF Z SBPFIX, INC SUBPGE ;INCREMENT SUBPAGE ;CHS47 BPAGE:: CLR $PGPSW ;CLEAR PAGE PENDING FLAG BITNE #FOTF,F.1,45$ ;ALREADY PROCESSING A FOOTNOTE? ;CHS54 CMPEQ FOOTP1,FOOTP2,45$ ;NO DATA IN FOOTNOTE BUFFER? ;CHS54 MOV NLPG,R2 ;GET STARTING FOOTNOTE LINE MOV #100.,NLPG ;SET LARGE COUNT SUB LINEC,R2 ;CALCULATE DISTANCE TO FIRST FOOTNOTE BLOS 10$ ;IF LOS SOME LEFT TO GO CALL SKIPN ; SKIP TO END OF PAGE BEFORE FOOTNOTES 10$: MOV R5,-(SP) ;SAVE REGISTER R5 MOV #F.1,R5 ;POINT TO FLAG WORD MOV RMARG,-(SP) ;SAVE THESE ITEMS OVER FOOTNOTE PROCESSING MOV LMARG,-(SP) MOV PARIND,-(SP) ;SAVE PARA INDENTING .IF NZ PARFN ;CHS32 MOV PARSP,-(SP) ; AND SPACING ;CHS32 MOV PARPT,-(SP) ; AND TEST PAGE ;CHS32 .ENDC ; NZ PARFN ;CHS32 MOV NSPNG,-(SP) MOVB GCSCH,-(SP) MOV INDCT,-(SP) ;OCCASSIONALLY WE NEED TO SAVE THIS MOV (R5),-(SP) ;SAVE CURRENT FLAG WORD CLR INDCT ;CLEAR IT FOR RANDOM FAILURES MOV #ILMRG,LMARG ;RESET LEFT MARGIN ;CHS16 MOV PRMRG,RMARG ;RESET RIGHT MARGIN MOV #SPCNG,NSPNG ;SET INITIAL SPACING ;CHS32 CLRB GCSCH ;CLEAR SAVED CHARACTER MOV FOOTS1,FOOTS2 ;BUFFER IS EMPTY MOVB $GCISW,-(SP) ;SAVE REREAD FLAG BEQ 30$ ;IF EQ NOT SET 20$: CALL GGCINP ;GET A CHARACTER FROM SAVED BUFFER .WORD 30$ ;NONE LEFT MOV #FOOTS1,R4 ;SAVE BUFFER CALL WCI BR 20$ ;LOOP UNTIL SAVED BUFFER ALL MOVED 30$: CLRB $GCISW ;CLEAR REREAD BUFFER FLAG MOV SPSAV,-(SP) ;SAVE BASE OF STACK MOV SP,SPSAV ;SET NEW STACK BASE BIS #FOTF,(R5) ;SET FOOTNOTE PROCESSING ACTIVE CALL LINSET ;INITIALIZE LINE FOR START OF FOOTNOTE .IF NZ AUTOFN ;CHS54B TSTEQB FTNCHR,40$ ;SKIP IF AUTOMATIC LINE DISABLED ;CHS54B CALL SKIP1 ;SKIP ONE LINE ;CHS54B MOVB FTNLEN,R2 ;LENGTH OF FOOTNOTE DIVIDING LINE ;CHS54B MOVB FTNCHR,R1 ;GET CHARACTER TO USE FOR LINE ;CHS54B 35$: CALL WLNIN1 ;STORE THE CHARACTER ;CHS54B SOB R2,35$ ; SEVERAL TIMES ;CHS54B CALL OUTNJ ;OUTPUT THE LINE ;CHS54B .ENDC ; NZ AUTOFN ;CHS54B 40$: JMP LGO ;AND GO PROCESS SAVED FOOTNOTE COMMANDS 45$: BR 50$ ;TRANSIT POINT FOR LONG BRANCH ;CHS54 ; ; END OF FOOTNOTE PROCESSING ; FOOTND: CALL OUTNJ ;YES. FINISH UP LINE CMPNE FOOTP1,FOOTP2,40$ ;ANY MORE FOOTNOTES TO PROCESS? MOV FOOTP3,FOOTP1 ;RESET FOOTNOTE BUFFER POINTERS MOV FOOTP3,FOOTP2 ; CLR EXSP3 ;CLEAR LEFT RIGHT FLAG MOV SPSAV,SP ;RESET STACK TO CURRENT BASE MOV (SP)+,SPSAV ;RESTORE OLD STACK BASE MOVB (SP)+,$GCISW ;RESTORE REREAD FLAG MOV (SP)+,(R5) ;RESTORE FLAG WORD MOV (SP)+,INDCT ;RESTORE INDENT COUNT MOVB (SP)+,GCSCH ;RESTORE SAVED CHARACTER MOV (SP)+,NSPNG ;RESTORE CURRENT SPACING .IF NZ PARFN ;CHS32 MOV (SP)+,PARPT ;RESTORE PARAGRAPH TEST PAGE ;CHS32 MOV (SP)+,PARSP ; AND SPACING ;CHS32 .ENDC ; NZ PARFN ;CHS32 MOV (SP)+,PARIND ;RESTORE PARAGRAPH INDENT MOV (SP)+,LMARG ;RESTORE LEFT MARGIN MOV (SP)+,RMARG ;RESTORE RIGHT MARGIN BIC #FOTF,(R5) ;CLEAR FOOTNOTE PROCESSING FLAG MOV (SP)+,R5 ;RESTORE REGISTER R5 .IF NZ NEWFTN ;CHS54A MOV PNLPG,R2 ;CHECK FOR CORRECT PAGE END ;CHS54A SUB LINEC,R2 ;DID PAGE OVER FILL? ;CHS54A BEQ 48$ ; NO, CONTINUE ;CHS54A BLT 46$ ; YES, WARN USER ;CHS54A CMP #2,R2 ;MORE THAN 2 UNUSED LINES? ;CHS54A BGE 48$ ; NO, CONTINUE ;CHS54A CALL $ERMS2 ;OUTPUT ERROR MESSAGE ;CHS54A .WORD FNSTRT ;CHS54A CALL $ERMS3 ;CHS62 .WORD FNSHRT ;CHS54A BR 47$ ;FINISH UP MESSAGE ;CHS54A 46$: CALL $ERMS2 ;OUTPUT ERROR MESSAGE ;CHS54A .WORD FNSTRT ;CHS54A CALL $ERMS3 ;CHS62 .WORD FNLONG ;CHS54A 47$: CALL ONPAG ;INDICATE WHICH PAGE IT WAS ON ;CHS54A .ENDC ; NZ NEWFTN ;CHS54A 48$: MOV PNLPG,NLPG ;RESET LENGTH OF PAGE ;CHS54A MOV FOOTS1,GCINP ;RESTORE REREAD DESCRIPTOR MOV FOOTS2,GCINP+2 ; 50$: .IF Z LSTPG ;CHS38 TSTEQ $EOJSW,501$ ;CONTINUE IF NOT AT END OF JOB ;CHS38 RETURN ; ELSE, QUIT ;CHS38 .ENDC ; Z LSTPG ;CHS38 501$: CALL FORM ;OUTPUT FORMFEEDS OR LINEFEEDS .IF NZ LAYOUT ;CHS39 MOV TOPMRG,R2 ;SKIP DOWN TOP MARGIN ;CHS39 BEQ 503$ ;UNLESS NONE TO SKIP ;CHS39 CALL SKIPN ;CHS39 CLR LINEC ;DON'T COUNT THOSE LINES ;CHS39 503$: ;CHS39 .ENDC ; NZ LAYOUT ;CHS39 .IF NZ ALTTIT ;CHS14 TSTNE $HDRSW,505$ ;NO HEADERS TO BE PRINTED? ;CHS14 RETURN ;CHS14 505$: ;CHS14 .IFF ;CHS14 TSTEQ $HDRSW,160$ ;NO HEADERS TO BE PRINTED? .ENDC ; -NZ ALTTIT ;CHS14 .IF NZ EXTHDR ;CHS40 MOV HDRLEN,R2 ;ASSUME HEADER NOT ENABLED ;CHS40 DEC R2 ;CHS40 .IFF ;CHS40 .IIF Z BMPHDR, CALL SKIP1 ;SKIP ONE LINE ;CHS01 MOV #,R2 ;ASSUME HEADER NOT ENABLED ;CHS16 .IFT ;CHS40 TSTEQB $HDSSW,506$ ;HEADER DISABLED? ;CHS40 JMP 130$ ; YES, SKIP ;CHS40 506$: ;CHS40 .IFF ;CHS40 TSTNEB $HDSSW,130$ ;HEADER DISABLED? .ENDC ; -NZ EXTHDR ;CHS40 .IF NZ ALTHDR ;CHS04 TSTEQ $ALHSW,535$ ;ALTERNATING HEADERS SELECTED? ;CHS04 .IF NZ ALTSHF ;CHS46 CALL LFTRGT ;ON RIGHT-HAND PAGE? ;CHS46 BCS 53$ ; YES, SKIP TO NORMAL HEADER ;CHS46 .IFF ;CHS46 BITNE #1,PAGENO,53$ ;SKIP IF PAGE NUMBER ODD ;CHS04 .ENDC ; -NZ ALTSHF ;CHS46 MOV HFOUT+2,-(SP) ;REMEMBER WHERE WE ARE ON LINE ;CHS04 TSTEQ $NUMSW,51$ ;NO PAGE NUMBER? ;CHS04 .IF NZ EXTHDR ;CHS40 MOV HLMARG,R2 ;SPACE TO HEADER MARGIN ;CHS40 .IF NZ LAYOUT ;CHS39 CALL NSPACB ;SPACE OVER FROM BASE MARGIN ;CHS39 .IFF ;CHS39 CALL NSPAC ;OUTPUT THAT MANY SPACES ;CHS40 .ENDC ; -NZ LAYOUT ;CHS39 .ENDC ; NZ EXTHDR ;CHS40 .IF NZ BLNKHD ;CHS11 CALL PPAGN ;OUTPUT PAGE NUMBER ;CHS11 .IFF ;CHS11 CALL PPAGNO ;OUTPUT PAGE NUMBER ;CHS04 .ENDC ; NZ BLNKHD ;CHS11 51$: .IF NZ EXTHDR ;CHS40 MOV HRMARG,R2 ;GET HEADER RIGHT MARGIN ;CHS40 .IFF ;CHS40 MOV PRMRG,R2 ;FULL LINE LENGTH ;CHS04 .ENDC ; -NZ EXTHDR ;CHS40 SUB HFOUT+2,R2 ;SUBTRACT FOR PAGE NUMBER STRING ;CHS04 ADD (SP)+,R2 ;CHS04 MOV R2,-(SP) ;SAVE WHERE WE ARE ;CHS04 SUB TTLP2,R2 ;SUBTRACT FOR TITLE LENGTH ;CHS04 ADD TTLP1,R2 ;CHS04 CMPEQ (SP)+,R2,52$ ;NO TITLE? ;CHS04 .IF NZ LAYOUT ;CHS39 CALL NSPACB ;SPACE OVER FROM BASE MARGIN ;CHS04 .IFF ;CHS39 CALL NSPAC ;SPACE OVER TO TITLE ;CHS04 .ENDC ; -NZ LAYOUT ;CHS39 MOV #TTLP1,R4 ;OUTPUT TITLE ;CHS04 CALL PSTRPA ;CHS04 52$: CALL SKIP1 ;ADVANCE TO NEXT LINE ;CHS04 .IIF NZ ALTTIT, TSTNE $ALTSW,125$ ;SKIP SUBTITLE IF ALTERNATING TITLES ;CHS14 .IF NZ LAYOUT ;CHS39 CMPEQ STTLP1,STTLP2,125$ ;NO SUBTITLE? ;CHS39 .IFTF ;CHS39 .IF NZ EXTHDR ;CHS40 MOV HRMARG,R2 ;GET HEADER RIGHT MARGIN ;CHS40 .IFF ;CHS40 MOV PRMRG,R2 ;FULL LINE LENGTH ;CHS04 .ENDC ; NZ EXTHDR ;CHS40 SUB STTLP2,R2 ;ADJUST FOR SUBTITLE LENGTH ;CHS04 ADD STTLP1,R2 ;CHS04 .IFF ;CHS39 .IF NZ EXTHDR ;CHS40 CMPEQ HRMARG,R2,125$ ;NO SUBTITLE? ;CHS04 .IFF ;CHS40 CMPEQ PRMRG,R2,125$ ;NO SUBTITLE? ;CHS04 .ENDC ; -NZ EXTHDR ;CHS40 .IFT ;CHS39 CALL NSPACB ;SPACE OVER FROM BASE MARGIN ;CHS39 .IFF ;CHS39 CALL NSPAC ;SPACE OVER TO SUBTITLE ;CHS04 .ENDC ; -NZ LAYOUT ;CHS39 BR 121$ ;OUTPUT SUBTITLE & CONTINUE ;CHS04 53$: ;CHS04 .IF NZ ALTTIT ;CHS14 TSTEQ $ALTSW,535$ ;ALTERNATING TITLES SELECTED? ;CHS14 MOV #STTLP1,R4 ;OUTPUT SUBTITLE ;CHS14 BR 54$ ;CHS14 535$: ;CHS14 .ENDC ; NZ ALTTIT ;CHS14 .ENDC ; NZ ALTHDR ;CHS04 MOV #TTLP1,R4 ;OUTPUT TITLE TO FILE 54$: ;CHS39 .IF NZ EXTHDR ;CHS40 MOV HLMARG,R2 ;SPACE TO HEADER MARGIN ;CHS40 .IF NZ LAYOUT ;CHS39 CALL NSPACB ;SPACE OVER FROM BASE MARGIN ;CHS39 .IFF ;CHS39 CALL NSPAC ;OUTPUT THAT MANY SPACES ;CHS40 .ENDC ; -NZ LAYOUT ;CHS39 .ENDC ; NZ EXTHDR ;CHS40 CALL PSTRPA ;PRINT STRING FROM PA TSTEQ $NUMSW,120$ ;NO PAGE NUMBER? .IF NZ HPRMRG ;USE PERMANENT RIGHT MARGIN... ;CHS02 .IF NZ EXTHDR ;CHS40 MOV HRMARG,R2 ;GET HEADER RIGHT MARGIN ;CHS40 .IFF ;CHS40 MOV PRMRG,R2 ;TO POSITION PAGE NUMBER ;CHS02 .ENDC ; -NZ EXTHDR ;CHS40 .IFF ; ...OR CURRENT RIGHT MARGIN ;CHS02 MOV RMARG,R2 ;FIND POSITION WHERE THIS LEFT US BITEQ #SPECF,F.1,55$ ;NO SPECIAL HANDLING IN PROGRESS? CMPNE ENOTE,CMADR,55$ ;NOT PROCESSING A NOTE? MOV NOTRM,R2 ;GET RIGHT MARGIN BEFORE NOTE 55$: .ENDC ; -NZ HPRMRG ;CHS02 .IIF NZ EXTHDR, SUB HLMARG,R2 ;ADJUST FOR HEADER LEFT MARGIN ;CHS40 .IF NZ ALTTIT ;CHS14 TSTEQ $ALTSW,56$ ;ALTERNATING TITLES SELECTED? ;CHS14 SUB STTLP2,R2 ;COUNT SUBTITLE CHARACTERS ;CHS14 ADD STTLP1,R2 ;CHS14 BR 57$ ;CHS14 56$: ;CHS14 .ENDC ; NZ ALTTIT ;CHS14 SUB TTLP2,R2 ;COUNT TITLE CHARACTERS ADD TTLP1,R2 ;.. 57$: TSTEQ $SBPSW,60$ ;NO SUBPAGE? DEC R2 ;MAKE ROOM FOR LETTER 60$: SUB #5.,R2 ;ADJUST FOR SPACE REQUIRED BY 'PAGE ' .IF NZ PAGNAM ;CHS56 MOV R2,-(SP) ;SAVE FOR COMPARISON ;CHS56 ADD PGNMP1,R2 ;ADJUST FOR LENGTH OF PAGE NAME ;CHS56 SUB PGNMP2,R2 ;CHS56 CMPNE (SP)+,R2,75$ ;SKIP IF THERE IS ONE ;CHS56 .ENDC ; NZ PAGNAM ;CHS56 MOV APNDN,R3 ;GET CURRENT APPENDIX LEVEL BEQ 70$ ;IF EQ NONE SPECIFIED SUB #2,R2 ;ADJUST FOR APPENDIX LETTER AND DASH BR 80$ ; 70$: MOVB CHPTN,R3 ;GET CURRENT CHAPTER NUMBER BEQ 80$ ;IF EQ NONE SPECIFIED ; BIC #177400,R0 ;CLEAR POSSIBLE SIGN EXTENSION ;CHS48C MOV R3,R0 ;CALCULATE SPACE COUNT FOR CHAPTER NUMBER CALL PPGNO ; 75$: DEC R2 ;ADJUST FOR DASH ;CHS56 80$: MOV PAGENO,R0 ;GET CURRENT PAGE NUMBER CMPEQ #1,R0,120$ ;PAGE NUMBER ONE? CALL PPGNO ;CALCULATE SPACE COUNT FOR PAGE NUMBER CALL NSPAC ;SPACE TO PAGE NUMBER CALL PPAGNO ;OUTPUT PAGE NUMBER ;CHS04 120$: CALL SKIP1 ;SKIP ONE LINE .IIF NZ ALTTIT, TSTNE $ALTSW,125$ ;SKIP IF ALTERNATING TITLES ;CHS14 .IF NZ EXTHDR ;CHS40 MOV HLMARG,R2 ;SPACE IN TO HEADER MARGIN ;CHS40 .IF NZ LAYOUT ;CHS39 CALL NSPACB ;SPACE OVER FROM BASE MARGIN ;CHS39 .IFF ;CHS39 CALL NSPAC ;CHS40 .ENDC ; -NZ LAYOUT ;CHS39 .ENDC ; NZ EXTHDR ;CHS40 121$: MOV #STTLP1,R4 ;OUTPUT THE SUBTITLE, IF ANY ;CHS04 CALL PSTRPA ;.. 125$: ;ALL THROUGH WITH TITLE LINES ;CHS04 .IF NZ EXTHDR ;CHS40 MOV HDRLEN,R2 ;OUTPUT BLANK LINES ;CHS40 DEC R2 ;CHS40 .IFF ;CHS40 .IF NZ BMPHDR ;CHS01 MOV #,R2 ;AND THIS MANY BLANK LINES. ;CHS01 .IFF ;CHS01 MOV #,R2 ;AND THIS MANY BLANK LINES. ;CHS16 .ENDC ; -Z BMPHDR ;CHS01 .ENDC ; -NZ EXTHDR ;CHS40 130$: CLRB $HDSSW ;ENABLE HEADER .IF Z FIGFIX ;CHS37 JMP SKIPN ;INCLUDING SUBTITLE, AND RETURN FROM BPAGE .IFF ;CHS37 CALL SKIPN ;OUTPUT BLANK LINES FOR HEADER ;CHS37 MOVB FIGTAB,R3 ;ANY OUTSTANDING FIGURE REQUESTS? ;CHS37 BEQ 132$ ;SKIP IF NONE ;CHS37 CALL FIGOUT ;PROCESS REQUEST(S) ;CHS37 132$: RETURN ;CHS37 .ENDC ; -Z FIGFIX ;CHS37 ;SUBROUTINE FOR PAGE NUMBER OUTPUT PPGNO:: CMP #100.,R0 ;THREE DIGIT NUMBER BGT 140$ ;IF GT NO DEC R2 ;ADJUST FOR HUNDREDS DIGIT 140$: CMP #10.,R0 ;TWO DIGIT NUMBER? BGT 150$ ;IF GT NO DEC R2 ;ADJUST FOR TENS DIGIT 150$: DEC R2 ;ADJUST FOR ONES DIGIT 160$: RETURN ; .DSABL LSB ; SUBROUTINE TO OUTPUT PAGE NUMBER TO FILE ;CHS04 .ENABL LSB ;CHS11 .IF NZ BLNKHD ;CHS11 PPAGN: CMPEQB #SPC,PAGHD,5$ ;"PAGE" BLANKED? ;CHS11 .ENDC ; NZ BLNKHD ;CHS11 PPAGNO::MOV #PAGHD,S1 ;SET ADDRESS OF OUTPUT MESSAGE ;CHS04 CALL FMSG ;OUTPUT 'PAGE ' ;CHS04 5$: ;CHS56 .IF NZ PAGNAM ;CHS56 CMPEQ PGNMP1,PGNMP2,8$ ;SKIP IF NO PAGE NAME SET ;CHS56 MOV #PGNMP1,R4 ;GET POINTER TO START OF NAME ;CHS56 CALL PSTRPA ;OUTPUT PAGE NAME ;CHS56 BR 20$ ;CHS56 .ENDC ; NZ PAGNAM ;CHS56 8$: MOV APNDN,R1 ;GET CURRENT APPENDIX LETTER ;CHS04 BEQ 10$ ;IF EQ NONE SPECIFIED ;CHS04 ADD #'A-1,R1 ;CONVERT TO UPPER CASE ASCII ;CHS04 CALL FOUT ;OUTPUT APPENDIX LETTER ;CHS04 BR 20$ ;CHS04 10$: MOVB CHPTN,R0 ;GET CURRENT CHAPTER NUMBER ;CHS04 BEQ 30$ ;IF EQ NONE SPECIFIED ;CHS04 ; BIC #177400,R0 ;CLEAR POSSIBLE SIGN EXTENSION ;CHS48C CALL DECPRT ;OUTPUT CHAPTER NUMBER ;CHS04 20$: MOV #'-,R1 ;OUTPUT A DASH ;CHS04 CALL FOUT ;CHS04 30$: MOV PAGENO,R0 ;GET CURRENT PAGE NUMBER ;CHS04 CALL DECPRT ;OUTPUT PAGE NUMBER ;CHS04 TSTEQ $SBPSW,40$ ;NO SUBPAGE? ;CHS04 MOV SUBPGE,R1 ;RETRIEVE THE LETTER ;CHS04 ADD #SPC,R1 ;MAKE AN ASCII LETTER ;CHS04 CALL FOUT ;GET IT INTO OUTPUT BUFFER ;CHS04 40$: RETURN ;CHS04 .DSABL LSB ;CHS11 DECPRT::MOV #12,R1 ;STANDARD DECIMAL PRINT ROUTINE CALL $DIV ;DIVIDE MOV R1,-(SP) TSTEQ R0,10$ ;NO MORE DIGITS TO CONVERT? CALL DECPRT ;NO 10$: MOV (SP)+,R1 ;GET A DIGIT ADD #60,R1 ;MAKE ASCII DIGIT JMP FOUT ;OUTPUT TO FILE. ; TOP OF FORM FORM: MOV LINEC,R2 ;GET CURRENT LINE POSITION BEQ 50$ ;IF EQ ALREADY AT TOP CALL FFEED ;SPACE TO TOP OF FORM ;SIG01 TSTNE $SBPSW,40$ ;SUBPAGE? ;SIG01 INC PAGENO ;COUNT PAGE NUMBER ;SIG01 .IF NZ SBPFIX ;CHS47 BR 45$ ;CHS47 40$: INC SUBPGE ;COUNT SUBPAGE ;CHS47 45$: ;CHS47 .IFF ;CHS47 40$: .ENDC ; -NZ SBPFIX ;CHS47 CALL OPRWAT ;WAIT FOR OPERATOR TO POSITION FORMS ;SIG01 .IF NZ ALTSHF ;CHS46 MOV PBMRG,BASMRG ;GET STANDARD BASE MARGIN ;CHS46 CALL LFTRGT ;ON RIGHT-HAND PAGE? ;CHS46 BCC 50$ ; NO, BASE MARGIN OKAY ;CHS46 ADD ASHIFT,BASMRG ; YES, ADD IN OFFSET ;CHS46 .ENDC ; NZ ALTSHF ;CHS46 50$: .IIF NZ EXPTP, MOV PNLPG,NLPG ;RESET LENGTH OF PAGE ;CHS53 RETURN ;SIG01 ; ROUTINE TO DETERMINE IF ON LEFT- OR RIGHT-HAND PAGE ;CHS46 LFTRGT::MOV PAGENO,-(SP) ;GET PAGE NUMBER ;CHS46 ADD SUBPGE,(SP) ;ADD IN SUBPAGE NUMBER ;CHS46 BITEQ #1,(SP)+,10$ ;BOTH EVEN OR ODD? ;CHS46 SEC ; NO, ON RIGHT-HAND PAGE ;CHS46 10$: RETURN ;C BIT CLEAR = LEFT-HAND PAGE ;CHS46 ; ROUTINE TO SPACE TO TOP OF FORM ;SIG01 ; ;SIG01 FFEED:: BITEQ #FFDSW,$SWTCH,10$ ;SPACING WITH LINE FEEDS? ;SIG01 MOV #FF,R1 ;OUTPUT A FORMFEED ;SIG01 CALL FOUT ;SIG01 BR 30$ ;ADJUST COUNTS ;SIG01 10$: MOV LINEC,R2 ;GET LINE POSITION ;SIG01 15$: SUB LPPG,R2 ;GET - NUMBER OF LINES TO TOP OF PAGE ;SIG01 BPL 15$ ;IF PL LOOP ;SIG01 20$: CALL CRLF ;SPACE TO NEXT LINE ;SIG01 INC R2 ;SIG01 BLT 20$ ;SIG01 30$: CLR LINEC ;CURRENT LINE NOW ZERO ;SIG01 RETURN ;SIG01 ; ;SIG01 ; ROUTINE TO PROMPT OPERATOR AND WAIT FOR SIGNAL TO ;SIG01 ; CONTINUE ;SIG01 ; ;SIG01 OPRWAT::BITEQ #PAUSW,$SWTCH,50$ ;DON'T WAIT FOR NEW PAPER? ;SIG01 BITEQB #FD.TTY,TTBLK+F.RCTL,50$ ;IS TI: DEVICE A TERMINAL ;SIG01 CALL OUTPUT ;FLUSH ANY OUTPUT ;SIG01 BICB #FD.CR,TTBLK+F.RATT ;KEEP FCS FROM ADDING LINE FEED ;SIG01 MSGPUT WIGL ;WAKE THE OPERATOR UP ;SIG01 BISB #FD.CR,TTBLK+F.RATT ;RE-ENABLE CARRIAGE CONTROL ;SIG01 CALL TTC4N ;READ A CHARACTER ;SIG01 50$: RETURN ;RETURN ;SIG01 ; GET CHARACTER AND INCREMENT STRING POINTER GGCINP: MOV #GCINP,R4 BR GCI GLOUT: MOV #LOUT1,R4 ;PARTICULAR ARGUMENT GCI:: CMP (R4)+,(R4) ;ANYTHING IN STRING BHIS 10$ ;IF HIS NO INC -(R4) ;YES. COUNT AND GET FIRST POINTER CLR R1 ;PICKUP NEXT CHARACTER BISB @(R4)+,R1 ; ADD #2,(SP) ;FORCE SKIP RETURN RETURN ; 10$: MOV @(SP)+,PC ;SET SKIP RETURN ; ROUTINES TO WRITE CHARACTER AND INCREMENT POINTERS WCIFTN::MOV #FOOTP1,R4 ;POINT TO FOOTNOTE DESCRIPTOR BR WCI ; WLNIN1::MOV #LNIN1,R4 ;STANDARD ARG WCI:: TST (R4)+ ;POINT TO SECOND WORD OF DESCRIPTOR INC (R4) ;INCREMENT TO NEXT BYTE CMP (R4)+,(R4) ;BUFFER OVERFLOW? BHIS 10$ ;IF HIS YES 5$: MOVB R1,@-(R4) ;STORE BYTE RETURN ; 10$: .IF NZ EXTEND ;CHS50 CMPNE R4,#XBOT,20$ ;PROCESSING FOOTNOTE? ;CHS50 CALL EXPAND ; YES, EXPAND BUFFER AREA ;CHS50 BR 5$ ;CONTINUE ON ;CHS50 20$: ;CHS50 .ENDC ; NZ EXTEND ;CHS50 CALL $ERMSG ;OUTPUT ERROR MESSAGE .WORD BFOVF ; JMP RUNOFF ; ; ; START OF RUNOFF ; START: JMP $START ; .END START