.TITLE RUNOFF .IDENT /M3.0/ ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* * ;* General permission to copy (but not for profit) is hereby * ;* granted, provided that reference is made to the fact that * ;* reproduction privileges were granted by DECUS. * ;* * ;* The information in this document is subject to change with- * ;* out notice and should not be construed as a commitment by * ;* the contributor(s), DECUS or Digital Equipment Corporation. * ;* * ;* These parties make no warranty as to the suitability of this * ;* material for use by the recipient, nor as to the accuracy or * ;* functioning of the software or related material, and no * ;* responsibility is assumed in connection therewith. * ;* * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; 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. '83 ; ; 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 ; 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 and related switches ; chs40 Expand HEADER ; chs42 Distinguish between "ILLEGAL COMMAND" and "BAD PARAMETER" ; chs43 Add QUOTE CHARACTER ; chs44 Add "!" comment command and flag ; chs46 Change ALTERNATING HEADER to ALTERNATE ; 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 ; chs51 Add ENTRY and subindexing ; chs52 Correct spacing of underlined index entries ; chs53 Add orphan control to TEST PAGE ; chs54a Footnote processing reworked ; chs54b Add FOOTNOTE LINE ; chs55 Fix duplicate output of blank lines in autoparagraph mode ; chs56 Add PAGE NAME ; chs60 Make syntax for command arguments common ; chs61 Changes to LITERAL processing ; chs62 Internal cleanup of error messages ; chs64 Don't underline underbar characters in the input ; chs68 Store appendix letter in byte ; chs70 Add TEST LINES ; chs71 Add orphan control to PARAGRAPH ; chs75 Automatically do DO INDEX at end of file ; chs77 Eliminate FIRST TITLE ; chs78 Add text queue & BLOCK ; revamp footnote processing ; chs82 Add Table of Contents ; chs84 Add exit status (rework error handling) ; chs86 Only skip to next command on command error ; chs87 Save/restore AUTOPARAGRAPH mode in footnotes and blocks ; chs87a Allow TAB STOPS in blocks and footnotes ; chs88a Add ENABLE/DISABLE UNDERLINE ; chs92 Limit hyphenation of consecutive lines ; ; 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) ; INPUT LINE LIN:: .IF NZ SKPFIX ;chs24+ TSTEQ $PGPSW,LIN1 ;CONTINUE IF NO PAGE BREAK DUE CALL PAGEC ; ELSE DO IT LIN1: .ENDC ; NZ SKPFIX ;chs24- CALL GCIN ;READ CHARACTER WITH PRE-TRANSLATE CMPNE R1,#EOF,5$ ;DONE IF ENCOUNTERED ;chs78c+ JMP LGO2 ; (DON'T READ ANOTHER CHARACTER!) 5$: ;chs78c- BITNE #LITFG,F.1,10$ ;PROCESING LITERAL? ;; CMPEQ R1,#TAB,LTAB ;TAB? ;chs+ CMPNE R1,#TAB,10$ ;TAB? JMP LTAB ; YES, PROCESS IT ;chs- 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? 30$: JMP LSPAC ; YES, PROCESS IT 40$: CMPEQ R1,#SPC,30$ ;REGULAR SPACE? .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 NZ H$$PHN CLR HPHSW ;CLEAR HYPHENATE ENABLE TSTEQ $HPHSW,LIN3A ;NO HYPHENATION ACTIVE? .IF NZ FILLHY ;chs25+ BITEQ #FILLF,F.1,LIN3A ;NO FILLING? .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? .IF Z HYLINS ;chs92 BMI FIN06 ;IF MI NO .IFF ;chs92+ BMI 3$ ;NOT IF BYTE < 0 CMPB HYCNT,#HYMAXL ;LIMIT OF CONSECUTIVE LINES DONE? BLT 5$ ; NO, OKAY TO TRY 3$: CLRB HYCNT ;RESET COUNTER BR FIN06 ;CONTINUE WITH TEXT 5$: .ENDC ; -Z HYLINS ;chs92- 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? INC R0 .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 .IIF NZ HYLINS, CLRB HYCNT ;RESET COUNTER ;chs92 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 .IIF NZ HYLINS, INCB HYCNT ;COUNT HYPHENATED LINE ;chs92 FIN05: BICB #200,(R0)+ ;CLEAR HYPHEN FLAG AND TEST BNE FIN05 ;IF NE MORE TO GO BISB R1,@LSTSP ;RESET THE DESIRED ONE ONLY ;chs MOV (SP)+,R1 ;RETRIEVE SAVED CHARACTER FIN06: TST (SP)+ ;CLEAN STACK CALL WLNIN1 ;WRITE CHARACTER INTO BUFFER LIN3A: .ENDC ; NZ H$$PHN 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? CMPEQ #'],R1,21$ ;SPACE AFTER CLOSE BRACKET? CMPEQ #'},R1,21$ ;SPACE AFTER CLOSE BRACE? CMPNE #'",R1,22$ ;SPACE AFTER CLOSE QUOTE? 21$: MOV NLCH,R1 ;WAS IT PRECEEDED BY PUNCTUATION? BR 23$ 22$: .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? BLE 30$ ;NO. JUST STORE THE SPACE ;chs CALL 50$ CALL WLNIN1 DEC LINBK ;AND COUNT FOLLOWING CHARACTER BGT 27$ ;CONTINUE IF THERE'S SPACE ;chs94+ JMP LIN1 ;NEVER MIND IF AT END OF LINE 27$: MOV #NXS,R1 ;NON-EXPANDABLE SPACE ;chs94- 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 LITTST: BITEQ #LITFG,F.1,10$ ;SKIP IF NOT PROCESSING LITERAL MOV #MAXMRG,R2 ;CHECK IF REGULAR MARGIN WAS EXCEEDED SUB LITRM,R2 ;SHOULD HAVE THIS MUCH LEFT TO GO CMP LINBK,R2 ;DID WE? BGE 10$ ; YES, OKAY CALL $ERMSG ; NO, WARN USER ;chs84 .WORD LITERR ;; CALL ONPAG ;INDICATE WHICH PAGE IT WAS ON ;chs84 10$: RETURN .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:: .IF NZ SNGLER ;chs86+ CALL NXTCMD ;SKIP ANY REMAINDER OF LAST COMMAND .IFF ;chs86- CALL $FRCND ;FORCE TO LOGICAL END OF LINE .ENDC ; -NZ SNGLER ;chs86 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 MOV #F.1,R5 ;POINT TO FLAG MASK WORD CMPNE R1,#EOF,20$ ;NOT END OF FILE? LGO2:: CALL OUTNJ ;FLUSH OUT LAST LINE ;chs78c BITEQ #FOTF,(R5),10$ ;NOT PROCESSING FOOTNOTE? JMP FOOTND ;GO FINISH FOOTNOTE PROCESSING 10$: .IF NZ BLKCMD ;chs78a+ BITEQ #BLKF,(R5),12$ ;PROCESSING BLOCK? JMP BLKEND ;GO FINISH BLOCK PROCESSING 12$: .ENDC ; NZ BLKCMD ;chs78a- .IIF NZ MULTIN, TSTNEB LOOP,15$ ;SKIP IF ANOTHER INPUT FILE ;chs49 .IF NZ AUTODX ;chs75 CALL DOINX ;OUTPUT INDEX IF ANY ;chs75 .IFF ;chs75 .IIF NZ FIGFIX, CALL FIGDMP ;PROCESS ALL PENDING FIGURES ;chs37 .IIF NZ BLKCMD, CALL BLKDMP ;PROCESS ALL QUEUED TEXT BLOCKS ;chs78a .ENDC ; -NZ AUTODX ;chs75 .IIF NZ TBLCON, CALL DMPTOC ;OUTPUT ANY TABLES OF CONTENTS ;chs82 .IF NZ LSTPG ;chs38 CLR $HDRSW ;CLEAR HEADER PRINT ENABLE CALL PAGEC ;FORCE A PAGE .ENDC ; NZ LSTPG ;chs38 15$: JMP ENDFIL ;END OF FILE ;chs49 20$: CMPEQ R1,#FF,LGO ;FORMFEED ON INPUT? BITNE #LITFG,(R5),70$ ;PROCESSING LITERAL? CMPEQ #EXCL,R1,LCR ;IGNORE LINE WITH LEADING "!" ;chs 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 CMPEQ #CR,R1,40$ ;IGNORE BLANK LINES .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 ATOPAR:: ; *** MUST FOLLOW CALL ABOVE *** ;chs71 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 MOV (R3),ACTCMD ;SAVE FOR POSSIBLE REFERENCE ;chs 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 ; Entry points: ILCM = Bad command parameter ; ILCM2 = Invalid command ILCM:: CALL $ERMSG ;ILLEGAL COMMAND ;chs84 .WORD ILCMM BR ILCM3 ;chs42+ ILCM2:: CALL $ERMSG ;OUTPUT ERROR MESSAGE ;chs84 .WORD ILCMD ILCM3: MOV #PD,R1 ;SET TO OUTPUT A PERIOD ;chs42- 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 $ERMS2 ;FINISH STRING ;chs62 .WORD ILCMM0 ;chs22 .IIF NZ OPTTXT, TSTNEB OPTACT,30$ ;SKIP IF IN OPTION SCAN ;chs20 .IF NZ SNGLER ;chs86+ MOV #ENDCM,-(SP) ;SET EXIT ADDRESS .IFF ;chs86- MOV #LCR,-(SP) ;SET EXIT ADDRESS .ENDC ; -NZ SNGLER ;chs86 30$: JMP ONPAG ;ADD ON PAGE REFERENCE ;chs84+ ; Code for outputting page reference moved to ERMSG.MAC to reduce ; task size when overlays are used. ;chs84- ; EXPAND MEMORY ; On entry: R1 = Next character to be stored (if storing queue item) ; R2 = Index pointer (if processing index entry) ; R4 = Location to recevie next character (if queue item) ; ; On exit: Task enlarged 32.*INCR bytes ; Index/TOC buffer bumped up to top of task image ; R2 = Adjusted pointer ; ; Registers: R2 changed EXPAND:: .IF NZ EXTEND ;chs50+ EXTK$S #INCR ;EXTEND TASK INCR*32. WORDS BCS 80$ ;QUIT IF EXTENSION FAILED ;chs MOV R1,-(SP) ;SAVE REGISTERS MOV R2,-(SP) MOV R3,-(SP) MOV #INCR*32.,R1 ;SAVE SIZE OF EXPANSION ; Start of new version ;chs82+ .IF NZ TBLCON MOV #XFIRST,R3 ;ADDR. OF POINTER TO FIRST RECORD 10$: MOV (R3)+,-(SP) ;GET 1ST FORWARD POINTER BEQ 50$ ;LIST IS EMPTY IF POINTER ZERO ADD R1,-2(R3) ;ADJUST POINTER FOR EXPANSION .IFF MOV XFIRST,-(SP) ;POINTER TO FIRST RECORD BEQ 50$ ;LIST IS EMPTY IF POINTER ZERO ADD R1,XFIRST ;ADJUST POINTER FOR EXPANSION .ENDC ; -NZ TBLCON 20$: MOV (SP)+,R2 ;POINT AT NEXT RECORD BEQ 60$ ;DONE W/ LIST IF FORW. PTR. ZERO MOV (R2)+,-(SP) ;STORE POINTER TO NEXT RECORD BEQ 30$ ;LEAVE LAST POINTER ALONE ADD R1,-2(R2) ;ADJUST FORWARD POINTER 30$: TSTEQ (R2)+,40$ ;SKIP IF BACKWARD PTR. ZERO ADD R1,-2(R2) ;ADJUST BACKWARD POINTER 40$: ADD R1,(R2) ;ADJUST ASCII POINTER BR 20$ ;GO BACK FOR NEXT RECORD 50$: TST (SP)+ ;CLEAN STACK 60$: .IF NZ TBLCON CMP R3,#<2*TBLCON+XFIRST> ;DONE WITH LAST LIST? BLOS 10$ ; NO, GO BACK FOR ANOTHER .ENDC ; NZ TBLCON ; All pointers now adjusted; now bump everything up MOV #XTOP,R3 ;POINT AT TOP POINTER MOV (R3),R2 ;GET CURRENT TOP ADD R1,(R3) ;ADJUST TOP POINTER MOV (R3),R3 ;GET NEW TOP ; Delete old version .REPT 0 MOV XFIRST,R2 ;GET POINTER TO FIRST RECORD BEQ 60$ ;SKIP IF THERE IS NONE MOV (R2),R3 ;SAVE FORWARD POINTER BEQ 10$ ;LEAVE ALONE IF AT END OF LIST ADD R1,(R2) ;ADVANCE POINTER 10$: ADD #4,R2 ;POINT TO ASCII POINTER ADD R1,(R2) ;ADVANCE ASCII POINTER 20$: MOV R3,R2 ;POINT TO NEXT RECORD BEQ 50$ ;ALL DONE IF POINTER ZERO MOV (R2),R3 ;SAVE FORWARD POINTER BEQ 30$ ;LEAVE ALONE IF AT END OF LIST ADD R1,(R2) ;ADVANCE FORWARD POINTER 30$: TST (R2)+ ;ADVANCE TO BACK. PTR. TSTEQ (R2),40$ ;LEAVE IT ALONE IF ZERO? ADD R1,(R2) ; NO, ADVANCE BACKWARD POINTER 40$: TST (R2)+ ;ADVANCE TO ASCII PTR. ADD R1,(R2) ;ADVANCE IT TO NEW LOCATION BR 20$ ;GO BACK FOR NEXT RECORD 50$: ADD R1,XFIRST ;ADVANCE POINTER TO FIRST RECORD 60$: MOV XTOP,R2 ;POINT TO CURRENT TOP OF BUFFER ADD R1,XTOP ;ADVANCE TO NEW POSITION MOV XTOP,R3 ;POINT TO NEW TOP .ENDR ; End of old version ;chs82- 70$: MOV -(R2),-(R3) ;COPY UP A WORD CMP R2,XBOT ;REACHED BOTTOM YET? BHI 70$ ; NO, KEEP COPYING ADD R1,XBOT ; YES, RESET BOTTOM POINTER MOV (SP)+,R3 ;RESTORE REGISTERS MOV (SP)+,R2 ADD R1,R2 ;ADVANCE POINTER FOR INDEX PROCESSING MOV (SP)+,R1 RETURN ;RETURN TO CALLING ROUTINE 80$: .ENDC ; NZ EXTEND ;chs50- .IIF NZ MULTIN, CLRB LOOP ;TERMINATE INPUT COMMAND STRING ;chs49 CALL $ERMSG ;OUTPUT ERROR MESSAGE .WORD CORERR JMP ENDFIL ;FINISH OFF THIS OUTPUT FILE ;chs ; 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 ; COMMAND PARAMETER DECIMAL-ASCII-TO-OCTAL CONVERSION ROUTINES ; ; OUTPUTS: IF NUMBER IS PRESENT -- R3 = RESULTANT VALUE ; SKIP RETURN TAKEN ; IF NO NUMBER IS PRESENT -- NON-SKIP RETURN TAKEN ; RCNR -- RELATIVE DECIMAL CONVERSION ROUTINE ; ; INPUT: R3 = BASE VALUE TO BE AUGMENTED. .ENABL LSB RCNR:: MOV R3,-(SP) ;SAVE BASE VALUE CALL RCNO ;CONVERT DECIMAL NUMBER .IF NZ NOPARM ;chs29+ JMP 50$ ;NONSKIP RETURN IF NULL BEQ 5$ ;IF EQ, NO SIGN SPECIFIED ADD (SP),R3 ;AUGMENT BASE VALUE 5$: ADD #4,2(SP) ;SET SKIP RETURN BR 50$ ;TAKE SKIP RETURN .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 ; RCNO -- ABSOLUTE DECIMAL CONVERSION ROUTINE 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? ADD #4,4(SP) ; YES, SET SKIP RETURN .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 50$: .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 (C bit set if EOL found) .IF NZ GENSEP SKPSEP::CALL SKPWHT ;SKIP OVER WHITE SPACE CMPEQB #SEMI,R1,30$ ;PROCEED IMMEDIATELY AFTER SEMICOLON CMPNEB #CMA,R1,10$ ;SKIP WHITE SPACE AFTER COMMA CALL SKPWHT 10$: CMPNEB #CR,R1,20$ ;SKIP IF NO TEXT TO CENTER SEC ;SIGNAL END OF LINE ENCOUNTERED BR 40$ 20$: MOVB R1,GCSCH ;SAVE BREAK CHARACTER 30$: CLC ;MAKE SURE C BIT CLEAR 40$: RETURN ; SKIP OVER COMMAND ARGUMENT SEPARATOR (INCLUDING CRLF) SKPEND::CALL SKPSEP ;SKIP ARGUMENT SEPARATOR BCC 10$ ;C BIT INDICATES END OF LINE CALL SKPLF ;SKIP LINE SEPARATOR SEC ;SIGNAL END OF LINE ENCOUNTERED 10$: RETURN ; IGNORE WHITE SPACE SKPWHT::CALL CCIN ;READ NEXT CHARACTER CMPEQB #SPC,R1,SKPWHT ;IGNORE SPACES CMPEQB #TAB,R1,SKPWHT ; AND TABS RETURN ; THROW AWAY REST OF LINE SKPLF:: CALL CCIN ;READ NEXT CHARACTER CMPNEB #LF,R1,SKPLF ;IGNORE EVERYTHING UNTIL LF RETURN .ENDC ; NZ GENSEP ;chs60- ; IGNORE REMAINDER OF CURRENT COMMAND ;chs53a+ .IF NZ EXPTP+SNGLER ;chs86 NXTCMD::CALL CCIN ;READ NEXT CHARACTER CMPEQB #PD,R1,10$ ;ALL DONE IF IT'S A PERIOD .IIF NZ EXCMNT, CMPEQB #EXCL,R1,10$ ;...OR A "!" ;chs44 CMPNEB #LF,R1,NXTCMD ; ELSE LOOK FOR A LINEFEED 10$: MOVB R1,GCSCH ;SAVE BREAK CHARACTER RETURN .ENDC ; NZ EXPTP+SNGLER ;chs86 ;chs53a- ; 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 NZ 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 ;chs62 .WORD ILCMM1 ;chs22 ;; CALL ONPAG ;INDICATE WHAT PAGE ;chs84 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 BPL ..040 ;SKIP IF NOT HYPHENATION SITE CMPNEB #<200+'->,R1,35$ ;IS IT ALREADY A HYPHEN? BICB #200,@LSTSP ; YES, CLEAR FLAG BR ..040 ; AND SKIP 35$: .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 ; NZ H$$PHN 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...THREE ENTRY POINTS ; ; ENTRIES: SKIPS = Skip "SPACING" lines ; SKIP1 = Skip one line ; SKIPN = Skip R2 lines .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$: .IIF Z SKPFIX, ADD R2,LINEC ;COUNT LINES ;chs24a CLR NSPCH ;CLEAR PER-LINE COUNTS CLR CPOS 60$: .IF NZ SKPFIX ;chs24a CMP LINEC,NLPG ;IS PAGE FULL? ;chs24a BGE 62$ ; YES, DON'T DO BLANK LINE ;chs24a .IFTF ;chs24a CALL CRLF ;SPACE TO NEXT LINE .IFT ;chs24a INC LINEC ;COUNT LINE ;chs24a .IFTF ;chs24a DEC R2 ;OUTPUT AS MANY AS REQUESTED BGT 60$ ;IF GT YES .IFF ;chs24a CALL OUTPUT ;OUTPUT LOGICAL LINE MOV NSPNG,R3 ;GET SPACING COUNT TO NEXT LINE .IFT ;chs24a 62$: CALL OUTPUT ;OUTPUT LOGICAL LINE ;chs24a MOV #1,R3 ;ROOM FOR ANOTHER LINE OF TEXT? ;chs24a TSTNE $IDXAC,65$ ;SKIP IF INDEX BEING OUTPUT ;chs24 .IF NZ TXTQUE ;chs78 TSTNEB FTNCNT,65$ ;OR IF FOOTNOTE PENDING ;chs78 .IFF ;chs78 CMPNE FOOTP1,FOOTP2,65$ ;OR IF FOOTNOTE PENDING ;chs24 .ENDC ; -NZ TXTQUE ;chs78 ADD LINEC,R3 ;ADD ON CURRENT LINE POSITION ;chs24+ CMP R3,NLPG ;COMPARE TO LENGTH W/O FOOTNOTES BLE 66$ ;DON'T START NEW PAGE IF NOT DUE MOV SP,$PGPSW ;SET PAGE PENDING BR 66$ .ENDC ; NZ SKPFIX ;chs24- 65$: CALL TESTP ;TEST IF PAGE SHOULD BE BROKEN 66$: MOV (SP)+,R3 ;RESTORE R3 70$: RETURN ; OUTPUT SPACES TO FILE ; ; ENTRIES: NSPACB = Space over from extreme left, including BASE ; NSPAC = Space over from where we are ; ; INPUT: R2 = Number of spaces to output .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 ; ; OUTPUT A STRING TO THE OUTPUT FILE ; ; ENTRIES: PSTRPA = R4 contains address of string pointers ; PSTRAZ = S1 contains address of next character, ; end of string marked by NUL 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 BIC #200,R1 90$: .ENDC ; NZ RTJUST ;chs23- CALL CCOUT ;OUTPUT TO FILE BR 80$ ;LOOP FOR WHOLE STRING .DSABL LSB ; 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) 40$: RETURN ;chs88a .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 NZ 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? ;chs CMPEQ #UBAR,R1,80$ ;UNDERBAR CHARACTER? ;chs64 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? BGE GCINR ; YES, IGNORE FLAG .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 ; NZ H$$PHN ; SPECIAL CASE 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 BUFFER, FILE OR FOOTNOTE AS APPROPRIATE ; On entry: GCSCH .NE. 0 if reread character queued ; $SDISW .NE. 0 if input in secondary buffer ; $CBISW .NE. 0 if input in command buffer ; (automatically read after sec. buffer emptied) ; FOTF!BLKF set in F.1 if reading from text queue ; ...else, read from file CCIN:: MOVB GCSCH,R1 ;ANY CHARACTER SAVED FROM EARLIER PASS? BNE 30$ ;IF NE YES .IF NZ TBLCON ;chs82+ TSTEQB $SDISW,5$ ;INPUT NOT FROM SECONDARY BUFFER? MOV #SDINP,R4 ;SET ADDRESS OF LINE DESCRIPTOR BR 7$ ;GO GET CHARACTER 5$: TSTEQB $CBISW,20$ ;INPUT NOT FROM COMMAND BUFFER? MOV #CMSTP,R4 ;POINT TO START OF BUFFER 7$: .IFF ;chs82- TSTEQB $SDISW,20$ ;INPUT NOT FROM SECONDARY BUFFER? MOV #SDINP,R4 ;SET ADDRESS OF LINE DESCRIPTOR .IFTF ;chs82 CALL GCI ;GET CHARACTER FROM BUFFER .WORD 10$ ;NONE RETURN 10$: .IFT ;chs82+ TSTEQB $SDISW,15$ ;SKIP IF WEREN'T READING SEC. BUFFER .IFTF ;chs82- CLRB $SDISW ;CLEAR INPUT FROM SECONDARY BUFFER .IFT ;chs82+ BR 5$ ;CHECK FOR INPUT IN COMMAND BUFFER 15$: CLRB $CBISW ;CLEAR INPUT FROM COMMAND BUFFER .ENDC ; NZ TBLCON ;chs82- 20$: .IF NZ BLKCMD ;chs78a BITNE #FOTF!BLKF,F.1,40$ ;CHARACTERS COMING FROM QUEUE? ;chs78a .IFF ;chs78a BITNE #FOTF,F.1,40$ ;CHARACTERS COMING FROM FOOTNOTE? .ENDC ; -NZ BLKCMD ;chs78a 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 .WORD 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 .IF NZ TXTQUE ;chs78 TSTEQB FTNCNT,45$ ;SKIP IF NO FOOTNOTES IN QUEUE ;chs78 .IFF ;chs78 CMPEQ FOOTP1,FOOTP2,45$ ;NO DATA IN FOOTNOTE BUFFER? ;chs54 .ENDC ; -NZ TXTQUE ;chs78 ; Set up for output of footnote MOV NLPG,R2 ;GET STARTING FOOTNOTE LINE ADD #100.,NLPG ;SET LARGE COUNT ;chs 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$: .IF NZ BLKCMD ;chs78a+ MOV #FOTF,R2 ;SET FOOTNOTE FLAG ; Save current parameters and modes SAVSTA:: ;SAVE CURRENT STATE .ENDC ; NZ BLKCMD ;chs78a- 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 MOV PARPT,-(SP) ; AND TEST PAGE .ENDC ; NZ PARFN ;chs32- .IIF NZ BLKAP, MOV $AUTSW,-(SP) ;SAVE AUTOPARAGRAPH MODE ;chs87 .IF NZ BLKTAB ;chs87a+ MOV #TABTAB-1,R1 ;POINT TO START OF TAB DATA MOV #+1,R4 ;NUMBER OF WORDS OF TAB DATA TO SAVE 12$: MOV (R1)+,-(SP) ;SAVE A PAIR OF TAB STOPS SOB R4,12$ ;LOOP UNTIL ALL STORED .ENDC ; NZ BLKTAB ;chs87a- 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 .IF NZ TXTQUE ;chs78+ MOV #-1,R1 ;SET "FOOTNOTE" QUEUE RECORD TYPE .IF NZ BLKCMD ;chs78a+ CMPEQ #FOTF,R2,15$ ;SKIP IF PROCESSING FOOTNOTE NEG R1 ;SET "BLOCK" QUEUE RECORD TYPE 15$: .ENDC ; NZ BLKCMD ;chs78a- CALL QUENXT ;SET UP POINTERS TO READ NEXT RECORD .ENDC ; NZ TXTQUE ;chs78- 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 .IF NZ BLKCMD ;chs78a+ BIC #BLKF!FOTF,(R5) ;MAKE SURE NO EXTRA BITS SET BIS R2,(R5) ;SET SAVED-TEXT PROCESSING ACTIVE .IFF ;chs78a- BIS #FOTF,(R5) ;SET FOOTNOTE PROCESSING ACTIVE .IFTF ;chs78a CALL LINSET ;INITIALIZE LINE FOR START OF FOOTNOTE .IFT ;chs78a+ BITNE #BLKF,(R5),40$ ;SKIP IF PROCESSING BLOCK .ENDC ; -NZ BLKCMD ;chs78a- .IF NZ AUTOFN ;chs54b+ TSTEQB FTNCHR,40$ ;SKIP IF AUTOMATIC LINE DISABLED CALL SKIP1 ;SKIP ONE LINE MOVB FTNLEN,R2 ;LENGTH OF FOOTNOTE DIVIDING LINE MOVB FTNCHR,R1 ;GET CHARACTER TO USE FOR LINE 35$: CALL WLNIN1 ;STORE THE CHARACTER SOB R2,35$ ; SEVERAL TIMES CALL OUTNJ ;OUTPUT THE LINE .ENDC ; NZ AUTOFN ;chs54b- 40$: JMP LGO ;GO PROCESS SAVED INPUT 45$: BR 50$ ;TRANSIT POINT FOR LONG BRANCH ;chs54 ; [PAGE BREAK -- Continued on next page] ; (LSB continues) ; [PAGE BREAK -- Continued from previous page] ; (LSB continued) ; END OF FOOTNOTE PROCESSING -- Come here when EOF encountered while ; outputting footnote text FOOTND: .IF NZ TXTQUE ;chs78+ DECB FTNCNT ;REDUCE COUNT OF PENDING FOOTNOTE BEQ GETSTA ;SKIP IF NO MORE MOV #-1,R1 ;SET QUEUE RECORD TYPE CALL QUENXT ;SET UP POINTERS TO READ NEXT RECORD BR 40$ ;OUTPUT NEXT FOOTNOTE GETSTA:: .IFF ;chs78- CMPNE FOOTP1,FOOTP2,40$ ;ANY MORE FOOTNOTES TO PROCESS? MOV FOOTP3,FOOTP1 ;RESET FOOTNOTE BUFFER POINTERS MOV FOOTP3,FOOTP2 ; .ENDC ; -NZ TXTQUE ;chs78 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 BLKTAB ;chs87a+ MOV #,R1 ;POINT BEYOND END OF TAB DATA MOV #+1,R4 ;NUMBER OF WORDS OF TAB DATA 455$: MOV (SP)+,-(R1) ;RESTORE A PAIR OF TAB STOPS SOB R4,455$ ;LOOP UNTIL ALL RESTORED .ENDC ; NZ BLKTAB ;chs87a- .IIF NZ BLKAP, MOV (SP)+,$AUTSW ;RESTORE AUTOPARAGRAPH MODE ;chs87 .IF NZ PARFN ;chs32+ MOV (SP)+,PARPT ;RESTORE PARAGRAPH TEST PAGE MOV (SP)+,PARSP ; AND SPACING .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 BLKCMD ;chs78a+ MOV FOOTS1,GCINP ;RESTORE REREAD DESCRIPTOR MOV FOOTS2,GCINP+2 TSTEQB BLKACT,456$ ;SKIP IF NO BLOCK BEING COMPLETED? JMP BLKEN2 ;RETURN TO BLOCK PROCESSOR 456$: .ENDC ; NZ BLKCMD ;chs78a- .IF NZ NEWFTN ;chs54a+ MOV PNLPG,R2 ;CHECK FOR CORRECT PAGE END SUB LINEC,R2 ;DID PAGE OVER FILL? BEQ 48$ ; NO, CONTINUE BLT 46$ ; YES, WARN USER CMP #2,R2 ;MORE THAN 2 UNUSED LINES? BGE 48$ ; NO, CONTINUE CALL $ERMSG ;OUTPUT ERROR MESSAGE ;chs84+ .WORD FNSTRT,FNSHRT BR 48$ ;FINISH UP MESSAGE 46$: CALL $ERMSG ;OUTPUT ERROR MESSAGE .WORD FNSTRT,FNLONG ;chs84- .ENDC ; NZ NEWFTN 48$: MOV PNLPG,NLPG ;RESET LENGTH OF PAGE ;chs54a- .IF Z BLKCMD ;chs78a+ MOV FOOTS1,GCINP ;RESTORE REREAD DESCRIPTOR MOV FOOTS2,GCINP+2 .ENDC ; Z BLKCMD ;chs78a+ ; [PAGE BREAK -- Continued on next page] ; (LSB continues) ; [PAGE BREAK -- Continued from previous page] ; (LSB continued) ; START NEW PAGE 50$: .IF Z LSTPG ;chs38+ TSTEQ $EOJSW,501$ ;CONTINUE IF NOT AT END OF JOB .IF NZ TXTQUE ;chs78+ JMP ENDFI2 ;RETURN TO END-OF-FILE CODE .IFF ;chs78- RETURN ; ELSE, QUIT .ENDC ; -NZ TXTQUE ;chs78 501$: .ENDC ; Z LSTPG ;chs38- CALL FORM ;OUTPUT FORMFEEDS OR LINEFEEDS .IF NZ LAYOUT ;chs39+ MOV TOPMRG,R2 ;SKIP DOWN TOP MARGIN BEQ 503$ ;UNLESS NONE TO SKIP CALL SKIPN CLR LINEC ;DON'T COUNT THOSE LINES 503$: .ENDC ; NZ LAYOUT ;chs39- .IF NZ ALTTIT ;chs14 TSTNE $HDRSW,505$ ;NO HEADERS TO BE PRINTED? ;chs14 .IF NZ FIGFIX+BLKCMD ;chs78a JMP 131$ ;CHECK FOR PENDING FIGURES ;chs37 .IFF ;chs37 RETURN ;chs14 .ENDC ; -NZ FIGFIX+BLKCMD ;chs78a 505$: ;chs14 .IFF ;chs14 TSTEQ $HDRSW,160$ ;NO HEADERS TO BE PRINTED? .ENDC ; -NZ ALTTIT ;chs14 .IF NZ FIRTIT ;chs77 .IF NZ EXTHDR ;chs40+ MOV HDRLEN,R2 ;ASSUME HEADER NOT ENABLED TSTEQB $HDSSW,506$ ;HEADER DISABLED? JMP 130$ ; YES, SKIP 506$: .IFF ;chs40- .IF Z BMPHDR ;chs01 CALL SKIP1 ;SKIP ONE LINE ;chs01 MOV #,R2 ;ASSUME HEADER NOT ENABLED ;chs16 .IFF ;chs01 MOV #HDLEN,R2 ;ASSUME HEADER NOT ENABLED ;chs16 .ENDC ; -Z BMPHDR ;chs01 TSTNEB $HDSSW,130$ ;HEADER DISABLED? .ENDC ; -NZ EXTHDR ;chs40 .IFF ;chs77 .IIF Z BMPHDR, CALL SKIP1 ;SKIP ONE LINE ;chs01 .ENDC ; -NZ FIRTIT ;chs77 .IF NZ ALTHDR ;chs04 TSTEQ $ALHSW,535$ ;ALTERNATING HEADERS SELECTED? ;chs04 .IF NZ ALTSHF ;chs46+ CALL LFTRGT ;ON RIGHT-HAND PAGE? BCS 53$ ; YES, SKIP TO NORMAL HEADER .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 CALL PPAGN ;OUTPUT PAGE NUMBER ;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 MOV R2,-(SP) ;SAVE WHERE WE ARE SUB TTLP2,R2 ;SUBTRACT FOR TITLE LENGTH ADD TTLP1,R2 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? MOV #STTLP1,R4 ;OUTPUT SUBTITLE BR 54$ 535$: .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? SUB STTLP2,R2 ;COUNT SUBTITLE CHARACTERS ADD STTLP1,R2 BR 57$ 56$: .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 ADD PGNMP1,R2 ;ADJUST FOR LENGTH OF PAGE NAME SUB PGNMP2,R2 CMPNE (SP)+,R2,75$ ;SKIP IF THERE IS ONE .ENDC ; NZ PAGNAM ;chs56- MOVB APNDN,R3 ;GET CURRENT APPENDIX LEVEL ;chs68 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,R3 ;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 .IIF NZ FIRTIT, 130$: CLRB $HDSSW ;ENABLE HEADER ;chs77 .IF Z FIGFIX+BLKCMD ;chs78a JMP SKIPN ;INCLUDING SUBTITLE, AND RETURN FROM BPAGE .IFF ;chs37 CALL SKIPN ;OUTPUT BLANK LINES FOR HEADER ;chs37 131$: .IF NZ BLKCMD ;chs78a+ CMPEQ QSTART,QEND,132$ ;SKIP IF QUEUE EMPTY JMP BLKOUT ;PROCESS BLOCK(S) .IFF ;chs78a- MOVB FIGTAB,R3 ;ANY OUTSTANDING FIGURE REQUESTS? ;chs37 BEQ 132$ ;SKIP IF NONE ;chs37 CALL FIGOUT ;PROCESS REQUEST(S) ;chs37 .ENDC ; -NZ BLKCMD ;chs78a 132$: RETURN ;chs37 .ENDC ; -Z FIGFIX+BLKCMD ;chs78a ; (LSB continues) ; SUBROUTINES ASSOCIATED WITH STARTING A NEW PAGE ; (LSB continued) ; 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 PPAGN: CMPEQB #SPC,PAGHD,5$ ;"PAGE" BLANKED? ;chs11 PPAGNO::MOV #PAGHD,S1 ;SET ADDRESS OF OUTPUT MESSAGE ;chs04 CALL FMSG ;OUTPUT 'PAGE ' ;chs04 5$: ;chs56+ .IF NZ PAGNAM CMPEQ PGNMP1,PGNMP2,8$ ;SKIP IF NO PAGE NAME SET MOV #PGNMP1,R4 ;GET POINTER TO START OF NAME CALL PSTRPA ;OUTPUT PAGE NAME BR 20$ .ENDC ; NZ PAGNAM ;chs56- 8$: MOVB APNDN,R1 ;GET CURRENT APPENDIX LETTER ;chs04+ BEQ 10$ ;IF EQ NONE SPECIFIED ADD #'A-1,R1 ;CONVERT TO UPPER CASE ASCII CALL FOUT ;OUTPUT APPENDIX LETTER BR 20$ 10$: MOVB CHPTN,R0 ;GET CURRENT CHAPTER NUMBER BEQ 30$ ;IF EQ NONE SPECIFIED ; BIC #177400,R0 ;CLEAR POSSIBLE SIGN EXTENSION ;chs48c CALL DECPRT ;OUTPUT CHAPTER NUMBER 20$: MOV #'-,R1 ;OUTPUT A DASH CALL FOUT 30$: MOV PAGENO,R0 ;GET CURRENT PAGE NUMBER CALL DECPRT ;OUTPUT PAGE NUMBER TSTEQ $SBPSW,40$ ;NO SUBPAGE? MOV SUBPGE,R1 ;RETRIEVE THE LETTER ADD #SPC,R1 ;MAKE AN ASCII LETTER CALL FOUT ;GET IT INTO OUTPUT BUFFER 40$: RETURN ;chs04- .DSABL LSB ;chs11 ; OUTPUT VALUE AS A DECIMAL NUMBER DECPRT::MOV #10.,R1 ;USING BASE 10. CALL $DIV ;DIVIDE MOV R1,-(SP) TSTEQ R0,10$ ;SKIP IF NO MORE DIGITS TO CONVERT CALL DECPRT ; ELSE CONTINUE FOR OTHERS 10$: MOV (SP)+,R1 ;GET A DIGIT ADD #60,R1 ;MAKE ASCII DIGIT JMP FOUT ;OUTPUT TO FILE (RETURN TO 10$ ABOVE) ; 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$ 40$: INC SUBPGE ;COUNT SUBPAGE 45$: .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 CALL LFTRGT ;ON RIGHT-HAND PAGE? BCC 50$ ; NO, BASE MARGIN OKAY ADD ASHIFT,BASMRG ; YES, ADD IN OFFSET .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 ADD SUBPGE,(SP) ;ADD IN SUBPAGE NUMBER BITEQ #1,(SP)+,10$ ;BOTH EVEN OR ODD? SEC ; NO, ON RIGHT-HAND PAGE 10$: RETURN ;C BIT CLEAR = LEFT-HAND PAGE ;chs46- ; SPACE TO TOP OF FORM ;SIG01+ FFEED:: BITEQ #FFDSW,$SWTCH,10$ ;SPACING WITH LINE FEEDS? MOV #FF,R1 ;OUTPUT A FORMFEED CALL FOUT BR 30$ ;ADJUST COUNTS 10$: MOV LINEC,R2 ;GET LINE POSITION 15$: SUB LPPG,R2 ;GET - NUMBER OF LINES TO TOP OF PAGE BPL 15$ ;IF PL LOOP 20$: CALL CRLF ;SPACE TO NEXT LINE INC R2 BLT 20$ 30$: CLR LINEC ;CURRENT LINE NOW ZERO RETURN ; PROMPT OPERATOR AND WAIT FOR SIGNAL TO CONTINUE OPRWAT::BITEQ #PAUSW,$SWTCH,50$ ;DON'T WAIT FOR NEW PAPER? BITEQB #FD.TTY,TTBLK+F.RCTL,50$ ;IS TI: DEVICE A TERMINAL CALL OUTPUT ;FLUSH ANY OUTPUT BICB #FD.CR,TTBLK+F.RATT ;KEEP FCS FROM ADDING LINE FEED CALL $ERMS2 ;WAKE THE OPERATOR UP ;chs84 .WORD MGWIGL ;chs84 BISB #FD.CR,TTBLK+F.RATT ;RE-ENABLE CARRIAGE CONTROL CALL TTC4N ;READ A CHARACTER 50$: 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? CALL EXPAND ; YES, EXPAND BUFFER AREA BR 5$ ;CONTINUE ON 20$: .ENDC ; NZ EXTEND ;chs50- CALL $ERMSG ;OUTPUT ERROR MESSAGE .WORD BFOVF JMP RUNOFF ; START OF RUNOFF START:: JMP $START .END START