diff --git a/src/decsys/runoff.mac b/src/decsys/runoff.mac new file mode 100644 index 00000000..62076061 --- /dev/null +++ b/src/decsys/runoff.mac @@ -0,0 +1,7605 @@ + TITLE RUNOFF - PROGRAM TO FORMAT DOCUMENTATION - %10(232) + SUBTTL R CLEMENTS/RCC/CHP/PFC 15-JAN-75 + + + +RNFWHO==0 ;DEC DEVELOPMENT +RNFVER==10 ;MAJOR VERSION +RNFMIN==0 ;MINOR VERSION +RNFEDT==232 ;EDIT NUMBER + + +;+ +;.AUTOPARAGRAPH.FLAG INDEX.FLAG CAPITAL.LOWER CASE +;.TITLE ^PROGRAM ^LOGIC ^MANUAL FOR ^^RUNOFF\\ +;.FIGURE 10.CENTER;^^RUNOFF\\ +;.SKIP 1.CENTER;^PROGRAM ^LOGIC ^MANUAL +;.SKIP 1.CENTER;^VERSION 10 +;.SKIP -20.CENTER; + TWOSEG + + LOC .JBVER + VRSN. RNF + RELOC + + +;+ +;.CHAPTER DEFAULT PARAMETERS +; +;^THE FOLLOWING PARAMETERS CAN PROBABLY BE REDEFINED:^^ +;.TS20.LM20.P-20,0.SK.SELECT D +;D+ + +ND AD.CAS,CASEUPPER ;INITIAL CASE DEFAULT +ND AD.CON,0 ;/CONTROL DEFAULT +ND AD.UND,"_" ;/UNDERLINE CHARACTER DEFAULT +ND ADSUND,"-" ;UNDERLINE CHARACTER IF /UNDERLINE:SEPARATE +ND BARWID,3 ;WIDTH OF BAR AREA +ND CHAPTB,^D12 ;BLANK BEFORE CHAPTER (IF LENGTH IS 64) +ND CHAPTC,1 ;BLANK BEFORE CHAPTER TITLE +ND CHAPTD,3 ;BLANK AFTER CHAPTER TITLE +ND HEADLB,3 ;BLANK BEFORE .HL +ND HEADLC,1 ;BLANK AFTER .HL1-2 +ND HEADLT,4 ;EXTRA TEST PAGE ON .HL +ND HRMRG,^D72 ;INITIAL RIGHT MARGIN FOR .HLP FILES +ND HWPLN,^D66 ;HARDWARE PAGE LENGTH +ND ILMRG,0 ;INITIAL LEFT MARGIN +ND ILPGNO,1 ;INITIAL PAGE NUMBER +ND INDEXD,CHAPTD ;SPACING AFTER INDEX HEADER +ND IPARIN,5 ;INITIAL PARAGRAPH INDENT +ND IPARTP,2 ;INITIAL PARAGRAPH .TEST PAGE +ND IPARVS,-1 ;INITIAL PARAGRAPH VERTICAL SPACING +ND L0LMAR,^D9 ;INITIAL LEFT MARGIN ON .LIST +ND LESPAC,2 ;HORIZ. SPACE AFTER "." IN LIST ELEMENT NUMBER +ND LFSPAC,1 ;LIST FINAL SPACE +ND LSLMAR,^D4 ;LEFT MARGIN FOR EMBEDDED .LIST +ND LPTLEN,^D60 ;SPOOLED HARDWARE PAGE LENGTH +ND NASPAC,1 ;SPACING AFTER "NOTE" +ND NFSPAC,2 ;SPACING AFTER NOTE (FINAL SPACE) +ND NHSPAC,2 ;SPACING BEFORE NOTE +ND NPMARG,^D15 ;NOTES PRIMARY MARGIN CHANGE +ND NSMARG,4 ;NOTES SECONDARY MARGIN CHANGE +ND NSPACG,1 ;NOTES SPACING +ND PD.TYP,TYPCAT ;/TYPESET DEFAULTS :CAT +ND RHDSPA,2 ;RUNNING HEAD (TITLE) SPACING AFTER +ND SINDIN,2 ;INDENT FOR SUB-INDEX +ND SPARIN,0 ;PARAGRAPH INDENT IF .SD COMMAND +ND TYPSWD,^D36 ;WIDTH OF TYPESETTER + CONT. +;D.SELECT _; +;+ +; AD.BAR,"|" ;BAR CHARACTER +; PD.BAR,"\" ;BAR CHARACTER IF /BAR +; AD.DWN,0 ;VERTICAL SPACING BEFORE TITLE +; PD.DWN,5 ;VERTICAL SPACING BEFORE TITLE IF /DOWN +; AD.HDR,HEADMIXED ;INITIAL HEADER DEFAULT +; PD.HDR,HEADUPPER ;HEADER DEFAULT IF /HEADER +; AD.LPP,58 ;LINES PER PAGE +; PD.LPP,64 ;LINES PER PAGE IF /LINES +; AD.OVR,0 ;HORIZONTAL SPACING BEFORE LEFT BORDER +; PD.OVR,^D20 ;HORIZONTAL SPACING BEFORE LEFT BORDER IF /OVER +; AD.SPC,1 ;INITIAL SPACING +; PD.SPC,2 ;INITIAL SPACING IF /SPACING +; AD.UNL,UNDRLINE ;/UNDERLINE MODE DEFAULT +; PD.UNL,UNDRCHARACTER ;/UNDERLINE MODE DEFAULT IF /UNDERLINE +; AD.WID,^D60 ;INITIAL WIDTH +; PD.WID,^D70 ;INITIAL WIDTH IF /WIDTH +;- + +DM BAR,177,"|","\" ;/BAR:CH +DM DWN,^D60,0,5 ;/DOWN:N +DM HDR,,HEADMIXED,HEADUPPER ;/HEADER:X +DM LPP,^D100000,^D58,^D64 ;/LINES:N +DM OVR,^D70,0,^D20 ;/OVER:N +DM SPC,5,1,2 ;/SPACING:N +DM UNL,77,UNDRLINE,UNDRCHARACTER ;/UNDERLINE: TYPE +DM WID,^D100000,^D60,^D70 ;/WIDTH:N + +;+.LM0.P0,-1 +;\\ ^THE FOLLOWING PARAMETERS CAN NOT BE CHANGED WITHOUT +;RISKING FURTHER DEBUGGING: ^^ +;.LM20.P-20,0.SK.SELECT D +;D+ + +ND LN$DRB,6 ;MAX DIRECTORY DEPTH (UFD+SFDS) +ND LN$ENT,11 ;LENGTH OF EXTENDED ENTER BLOCK +ND LN$IDX,^D60 ;MAX/5 LENGTH OF NAME IN INDEX +ND LN$LIN,^D100 ;MAX/5 LINE LENGTH +ND LN$LKP,7 ;LENGTH OF EXTENDED LOOKUP BLOCK +ND LN$MJP,5 ;LENGTH OF NOTE/LIST PUSH DOWN LIST +ND LN$MJS,4 ;LENGTH OF ENTRY ON NOTE/LIST PUSH DOWN LIST +ND LN$PDL,200 ;PUSH DOWN LIST LENGTH +ND LN$RNG,^D20 ;NUMBER OF /IRANGE/ORANGE PAIRS +ND LN$SEC,6 ;MAX DEPTH OF SECTION LOGIC +ND LN$TAB,40 ;MAX NUMBER OF TAB STOPS +ND LN$TEC,^D20 ;MAX/5 CHARS IN END COMMANDS +ND LN$TTL,^D50 ;MAX/5 TITLE LENGTH +ND LN$UND,^D100 ;MAX NUMBER UNDERLINES IN A LINE +ND LN$VAR,^D20 ;MAX NUMBER OF VARIABLES + +;D.SELECT _; +;&.FILL;\\ + SUBTTL REVISION HISTORY + +;+ +;.CHAPTER REVISION HISTORY +;.SK2 +;.LM5.P -5,0.TS 5.UC.AUTOTABLE.NOFLAGS + +;#7a -- and previous versions are lost in the dark ages. Work +; started on #10 during fall, 1971. Work was resumed +; after edit 11. +;a. Change to use twoseg. +;b. ! and ? followed by space are treated like . followed +; by space. +;c. All commands may be abbreviated. +;d. Add new commands: CENTRE (= CENTER), I (=INDEX), P +; (=PARAGRAPH), X (=SUBINDEX), PAGE SIZE (=PAPER SIZE), +; UPPER CASE (=^^), LOWER CASE (=\\). +;e. Add SUBINDEX command. Same as INDEX except subindices +; indicated by >. +;f. Warn of indents to the left of 0. +;g. Add defensive code to footnote routine to recover +; instead of halt. +;h. .PAGE clears current line before changing page width and +; counts as a break. +;i. Ring bell in PAUSE mode between pages. +;j. Avoid blank pages. +;k. Handle multiple lines of INDEX. +;l. Defend against footnote within a footnote. +;m. Defend correctly against ! when not in footnote. +;n. Around footnotes, preserve (and clear) indentation and +; case lock, preserve (and set) JUSTIFY and FILL. +;o. INDICATE core usage within []. +;p. TYPE number of pages at end. +;q. Warn and disregard strange control characters in file. +;r. Suppress the leading and trailing form feed on output +; except in PAUSE mode. +;s. Clear out any final footnotes at EOF. +;t. "PAGE" in page header is now UPPER/LOWER case. +;(12) Convert to use C, SCNMAC, SCAN, and WILD. This +; includes full wild-card and path usage on both input +; and output. +;RUNOFF pushed through PGMFMT. +;Default spacing is single, default case is UPPER. +;Default output is LPT:same.[-] +;Default input is DSK:.RNX[-] (file is previous or output +; file). where RNX=RNO+RND+RNP+RNC+ in that order. +;Convert all messages to lower case. Improve several of them +; in the process. +;Use LF-VT-FF instead of CR as end of line. +;Detect comments after non-text commands; junk as error. + CONT. +;(13) Add /HEADER:X and .HEADER X (X=UPPER,LOWER,MIXED) to +; control case of "PAGE n" (default is MIXED). +;Detect illegal negative arguments in commands (NUMBER, LEFT +; MARGIN, TEST PAGE, SKIP, BLANK, TAB STOPS, CENTER, +; FOOTNOTE). +;Keep Center within PAGE SIZE. +;(10-6912) Fix multiple case indexing correctly. +;Include SUBPAGE in error messages. +;Correct SUBPAGE logic to allow .PAGE inside .SUBPAGE. +;Warn if too many SUBPAGES (gt 26). +;Include SUBPAGES in INDEX. +;(10-6710) Put out sets of pages in INDEX with hyphens. +;Add .LITERAL n and .END LITERAL commands. +;Make ! be comment character, and ; be multiple command +; separator (except for TITLE, SUBTITLE, and INDEX). +;Fix error messages to print actual commands +;Include input page and line in error messages. +;Initialize FOOTNOTE case to /CASE:X setting as modified by +; .UPPER CASE and .LOWER CASE. + +;14 Implement .SCWLD for full output wildcarding. +;15 Implement > in SUBINDEX. also ;. +;16 Recognize multiple tab and space in AUTOPARAGRAPH. +;17 Fix bug which kept .X > from printing main entry. +;20 Handle RUNOFF and RUN xxx () commands. +;21 Add .AUTOPARAGRAPH and .NO AUTOPARAGRAPH. +;22 Add /NOAUTOPARAGRAPH/nopause/NOSIMULATE. +;23 Make . and . be break. In particular, note +; that . ;text is a new line. +;24 Add default extension .RNH to produce .HLP. +;25 Add .NOPAGING, reset by .PAGING. This is default if +; .RNH input. +;26 Add .COMMENT. +;27 Add optional second argument to .PARAGRAPH to set +; vertical paragraph spacing. -1 sets /2 +;30 Add /SEQUENCE/NOSEQUENCE to list input file sequence +; numbers to left of output. +;31 Add .SUBTTL (identical to .SUBTITLE). +;32 Allow sequence .PAGE;.TITLE to work. +;33 Add .FIRSTTITLE to cause PAGE 1 to be titled. +;34 Add .SELECT, .NOSELECT, /SELECT/NOSELECT, and default +; selection on source files. +;35 Correct /PAUSE bug to pause on first page. +;36 Suppress informational typeouts if output to TTY: +;37 Change output device default to DSK: +;40 Add file name to page count message. +;41 Add .NO XXX for .NOXXX. +;42 Treat : and ; like ! ? and . +;43 Add .PERIOD .NOPERIOD to defeat the .?!:; special +; handling. + CONT. +;44 Change internal EOF code to -1. +;45 Have .CENTER suppress trailing unquoted spaces. +;46 On .CENTER, treat TAB as a space. +;47 If CCL mode, type "RUNOFF: " before file in page +; count. +;50 Correct core messages to round up. +;51 Convert to the error message standard. +;52 Allow multiple spaces and tabs between words in +; commands. +;53 Allow null numbers on .PARAGRAPH, .TAB STOPS. +;54 Fix .CENTER to work correctly at top of page. +;55 In .AUTOPARAGRAPH mode, a blank line causes a new +; paragraph. +;56 Use the current .SPACING in the INDEX. +;57 Preset .TAB STOPS 9,17,25,... +;60 Allow relative specifications on .CENTER, .NUMBER, +; .LEFT MARGIN, .RIGHT MARGIN, .PAGE SIZE. +;61 Add .LEFT and .RIGHT. +;62 Only consider .:;!? as needing double space if it +; comes after two consecutive alphabetics. +;63 Treat spaces before last tab on line as non-expanding +; (quoted). +;64 /SEPARATE line for underline; default /UND to -. +;65 Change command entry point names for consistency. +; Change names of LH(F) to L.XXXX. +;66 Add defensive code on all buffers with error E$$IBO. +;67 If source file, then default output to .PLM. +;70 Negative argument to BLANK/SKIP is from bottom of page. +;71 Place underlined items before identically spelled +; ununderlined ones. +;72 Add .FLAGS/.NOFLAGS commands. +;73 Default RIGHT MARGIN to 72 if .HLP. +;74 Default INDEX casing is UPPER for first character and +; LOWER for rest. This is altered by any case controls. +;75 Start FOOTNOTE in case lock of text at definition. +;76 Add .FIGURE DEFER n. +;77 Add _ control character, .CONTROL, /CONTROL. +;100 Add .FLAG CAPITALIZE <. +;101 Add .FLAG INDEX >. +;102 Add .NOHEADER. +;103 Add 1-2 letter abbreviations for each command. +;104 Add .LS, .NOTE, .END, .SD. +;105 Add optional third argument to .P for automatic test +; page. +;106 Notice as not a blank line. +;107 Add /DOWN, /OVER. +;110 Don't justify an exactly full line with no spaces. +;111 Detect absence of command. +;112 Fix the bug in routine which causes spaces before tabs +; to be quoted. + CONT. +;113 Add CHAPTER and HEADER commands for automatic +; sectioning. +;114 Fix bugs in < and . logic within text. +;115 Allow "." (current form) as statement separator except +; in comments. +;116 Flag capital and index take up to the next space or +; linefeed. +;117 Add SPARIN and set it on .SD command. +;120 Fix .NOTE to agree with DEC standard. +;121 Fix many minor bugs in above edits. +;122 Centralize start of all error messages. +;123 Change to use C, SCNMAC as universal files. +;124 .CH update title, .HL1 update subtitle. +;125 If .RM is greater than page width, expand page width. +;126 Add .NST. +;127 Fix bugs in implicit skip logic which caused missing +; headings. +;130 Introduce internal mode of defaulting capitalization. +;131 Check indent against right margin. +;132 Add .AUTOTABLE. +;133 Include chapter numbers in page numbering. +;134 Add .DO INDEX and "INDEX-" in paging of chapter +; documents. +;135 Add .LIST ELEMENT. +;136 Make "n" optional in .LITERAL. +;137 Add long names for HL, SD, LS. +;140 Add /VARIANT, .VARIABLE, etc. +;141 Add options to .NUMBER. +;142 Add .APPENDIX. +;143 Add /DRAFT. +;144 Add /IRANGE, /ORANGE. +;145 Add /TYPESET. +;146 Clear indent on page/section/paragraph style commands. +;147 Detect illegal commands inside footnote. +;150 Add .NUMBER LEVEL and .NUMBER LIST. +;151 (10-13004) If ^\, etc., use last; make ^ followed by +; lower case force upper (just one character). +;152 Change /OVER to /RIGHT; consolidate /UNDERLINE +; switches. +;153 Cancel edit 62 as a bad idea. +;154 Add /LINES to set initial page length. +;155 Add .RNE makes .ERR, .RNS makes .STD. +;156 Have angle flags toggle settings. +;157 (QAR 2220) Allow /UNDERLINE:NONE and /UNDER:arg:arg and +; /NOUNDERLINE. +;160 Clean up /ORANGE. +;161 Decrease NIA errors. Issue as warnings. +;162 Add /TYPESET:CAT. +;163 Add .TYPESET. +;164 Fix literal tab bug and wild open bug. + CONT. +;165 (QAR 2632) Allow period in text type commands. +;166 Fix bug which lost line if footnote defined at end of +; page. +;167 (QAR 2453) Ignore autopar, autotab if no fill. +;170 (QAR 2537) Preserve AC B in routine FIN. +;171 (QAR 2473) Don't clear indent on test page. +;172 (QAR 2473) Allow .NUMBER PAGE 0. +;173 (QAR 2480) Add .END LIST. +;174 (QAR 2483) Underline quoted spaces when underlining. +;175 (QAR 2486) Speed up output by removing unneeded +; carriage returns. +;176 (QAR 2487) Discard extra space on line overflow when no +; fill. +;177 (QAR 2488) Improve justify with no fill. +;200 (QAR 2489) Move indent reset to handle CJL error +; better. +;201 (QAR 2491) More error tests: .I and .P to left of left +; edge, have .LM update .P if needed. +;202 (QAR 2493) Clear typein before waiting on /PAUSE. +;203 (QAR 2494) When output to TTY:/PAUSE, suppress echo. +;204 (QAR 2499) Return core after print index. +;205 (QAR 2633) Update lines this page more reliably. +;206 Support routine .OSDFS. +;207 Add extensions .RNB and .RNM; add more languages. +;210 Handle .END LITERAL if in lower case. +;211 (QAR 2635) Add BAR feature. +;212 Add .END FOOTNOTE. +;213 (QAR 2727) Fix relative .NUMBER. +;214 (QAR 2726) TSTPAG was off by 1. +;215 Remove bug of not double space after period at input +; eol. +;216 Remove bug in /SEQ if file not sequenced. +;217 Add command .NOSPACE. +;220 Remove bug in /VARIANT table lookup. +;221 Add /NUMBER/PAGING/WIDTH. +;222 (QAR 2784) Don't clear indent on .TP. +;223 (QAR 2785) Remove spurious JEC on .FLAG. +;224 (QAR 2786) Detect .ENDIF after blank line. +;225 Allow subindexes to match shorter form. +;226 (QAR 2845) Allow .PG.NM x to work. +;227 (QAR 2845) Add /CRETURN. +;230 (QAR 2845) Add .END SELECT. +;231 .NT at top of page lost page heading. +;232 Blank lines in .LT lost page heading. + SUBTTL DEFINITIONS + +;.FLAGS.LM 0.NOAUTOT.UPPER CASE +;.CHAPTER DEFINITIONS +;.HL1 AC DEFINITIONS +;.NOFILL.TS16;.P0,-1 +;- + +;AC'S + +;&.END SELECT + +F=0 ;FLAGS +A=1 ;WORK +B=2 +C=3 +D=4 +X=5 +CH=6 +C2=7 ;MUST STAY 7 +S1=10 +S2=11 +N=12 +N1=13 + +PA=15 ;POP ARGS + +P=17 ;STACK + + ;& + ;+.HL1 FLAGS +;.HL2 FLAGS IN -1 ;PAGE MASK IN INDEX TABLE +SPWID==5 ;SUB-PAGE WIDTH IN INDEX TABLE +SPMASK==<1_SPWID>-1 ;SUB-PAGE MASK IN INDEX TABLE +CHWID==^D36-PGWID-SPWID ;CHAPTER WIDTH IN INDEX TABLE +CHMASK==<1_CHWID>-1 ;CHAPTER MASK IN INDEX TABLE +IFE APPXFL&CHMASK, +ULCAS==40 ;DIFFERENCE BETWEEN CASES +CCUCAS==100 ;DIFFERENCE BETWEEN CONTROL AND UPPER +CHRMSK==177 ;ASCII CHARACTER MASK +IFN LCHPVT&CHRMSK, + ;& + ;+.FLAGS + +;.HL2 CHARACTERS FOR " ;INDEX NEXT WORD +C.SIF==">" ;SUBINDEX FLAG IN INPUT +C.QM=="?" ;QUESTION MARK +C.DN=="\" ;LOWER CASE INDICATOR +C.UP=="^" ;UPPER CASE INDICATOR +C.QNC=="_" ;QUOTE NEXT CHARACTER + ;& +;+.FLAGS + +;.HL2 SOFTWARE CHANNELS + +;.NOFLAGS.NOFILL.END SELECT + +F.FIN==1 ;COMMAND FILE INPUT +F.FOUT==2 ;COMMAND FILE OUTPUT + ;& +;&.FLAGS.FILL + +DEFINE IFEOF$($LOC),< JUMPL CH,$LOC> ;CREF EOF TESTS + ;+ +;.AUTOP.LOWER CASE + +;.HL2 MACROS + +; ,< SAVE$ > + MOVE A,[''CODE$'',,[ASCIZ \TEXT$\] ] + LIST + PUSHJ P,LEVEL$'MSG + XLIST +IFIDN ,< RSTR$ > + LIST> + +;+ +; + CONT. +;+ +; PUSHS THE LIST OF LOCATIONS +;ONTO THE STACK. +;- + + DEFINE SAVE$ (LIST$),< + XLIST +IRP (LIST$),< PUSH P,LIST$ > + LIST +> + + +;+ +; POPS THE LIST OF LOCATIONS FROM THE STACK. +;- + + DEFINE RSTR$ (LIST$),< + XLIST +IRP (LIST$),< POP P,LIST$ > + LIST +> + SUBTTL IMPURE STORAGE + +;+ +;.TS8,16,24.UPPER CASE +;.CHAPTER IMPURE STORAGE +;-.NOFILL.NOFLAGS.END SELECT + +;LOCATIONS WHICH ARE SET AT START-UP TIME AND NEVER CLEARED +CCLF1: BLOCK 1 ;1 IF CCL ENTRY, 0 IF NORMAL +INICOR: BLOCK 1 ;SIZE OF CORE BEFORE ANY EXPANSION +INIFF: BLOCK 1 ;INITIAL SETTING OF .JBFF + + +;SCAN BLOCKS + +SCNFWA:! ;START OF SCAN BLOCKS +SCNLOC: BLOCK 1 ;POINTER TO LAST INPUT SCAN BLOCK +SCNPTR: BLOCK 1 ;WILD-CARD SCAN POINTER +SINCOR: BLOCK 1 ;LH=.JBFF, RH=.JBREL AT START OF FILE +SCNFIR: BLOCK 1 ;START OF SCAN PARAMETER AREA +FINI: BLOCK 1 ;INITIAL F SETTING +FINIM: BLOCK 1 ;MASK FOR FINI +SCNNVR: BLOCK 1 ;/VARIABLE COUNT +SCNVAR: BLOCK LN$VAR ;/VARIABLE LIST +SCNNIR: BLOCK 1 ;/IRANGE COUNT +SCNIRG: BLOCK 2*LN$RNG ;/IRANGE FROM:TO PAIRS +SCNNOR: BLOCK 1 ;/ORANGE COUNT +SCNORG: BLOCK 2*LN$RNG ;/ORANGE FROM:TO PAIRS + ;(0) FROM PAGE,,LINE + ;(1) TO PAGE,,LINE + +SCMFWA:! ;START OF SCAN SWITCHES +SCNBAR: BLOCK 1 ;/BAR SWITCH +SCNCAS: BLOCK 1 ;/CASE SWITCH +SCNCRT: BLOCK 1 ;/CRETURN SWITCH +SCNDRF: BLOCK 1 ;/DRAFT SWITCH +SCNDWN: BLOCK 1 ;/DOWN SWITCH +SCNHDR: BLOCK 1 ;/HEADER SWITCH +SCNLPP: BLOCK 1 ;/LINES SWITCH +SCNNMB: BLOCK 1 ;/NUMBER SWITCH +SCNOVR: BLOCK 1 ;/OVER SWITCH +SCNPAG: BLOCK 1 ;/PAGING SWITCH +SCNPAU: BLOCK 1 ;/PAUSE SWITCH +SCNPER: BLOCK 1 ;/PERIOD SWITCH +SCNSEL: BLOCK 1 ;/SELECT SWITCH VALU +SCNSIM: BLOCK 1 ;/SIMULATE SWITCH +SCNSPG: BLOCK 1 ;/SPACING SWITCH +SCNTYP: BLOCK 1 ;/TYPESET +SCNWID: BLOCK 1 ;/WIDTH SWITCH +ULCHO: BLOCK 1 ;/UNDERLINE CHARACTER +ULTYPE: BLOCK 1 ;TYPE OF UNDERLINE +SCMLWA==.-1 ;END OF SCAN SWITCHES + +SCNOUT: BLOCK .FXLEN ;OUTPUT PARAMETER BLOCK +OPNBLK: BLOCK 3 ;INPUT OPEN BLOCK +SCNLWA==.-1 + CONT. +FILFWA:! ;START OF AREA TO CLEAR BEFORE EACH FILE +RMARG: BLOCK 1 ;RIGHT MARGIN +PRMRG: BLOCK 1 ;RIGHT PAGE-SIZE +LMARG: BLOCK 1 ;LEFT MARGIN +FILCAS: BLOCK 1 ;INITIAL CASE MODE +CAS: BLOCK 1 ;0 OR 40 TO CONVERT TO LOWER CASE +PAGENO: BLOCK 1 ;PAGE NUMBER FOR OUTPUT FILE +FRCPAR: BLOCK 1 ;FLAG TO FORCE PARAGRAPH +PARIND: BLOCK 1 ;INDENTING FOR PARAGRAPHS +PARSPC: BLOCK 1 ;VERT SPAC FOR PARAGRAPHS +PARTPG: BLOCK 1 ;TEST PAGE FOR PARAGRAPHS +LASLS: BLOCK 1 ;DEPTH OF LAST .LIST COMMAND +LSTCNT: BLOCK LN$MJP+1 ;COUNT AT THAT DEPTH +NSPNG: BLOCK 1 ;SPACING +LINEC: BLOCK 1 +SUBPGE: BLOCK 1 ;0 OR 1+SUBPAGE WE ARE IN +FILHDR: BLOCK 1 ;.HEADER CASE +FILOVR: BLOCK 1 ;SPACES IN FROM /OVER +FILOVT: BLOCK 1 ;TABS IN FROM /OVER +FLNUMB: BLOCK 1 ;.NONUMBERING +FLTITL: BLOCK 1 ;TITLE ON NEXT PAGE +FLNOPG: BLOCK 1 ;.NOPAGING +FLNHDR: BLOCK 1 ;.NOHEADER +FLSOPG: BLOCK 1 ;FLAG SOMETHING ON PAGE + +FILNVR: BLOCK 1 ;NUMBER OF VARIABLES +FILVAR: BLOCK LN$VAR ;VARIABLE NAMES +FILVVR: BLOCK LN$VAR ;VARIABLE VALUES (-LN$VAR=FALSE) +FILFVR: BLOCK LN$VAR ;VARIABLE DRAFT FLAGS (IF,,IFN) +VRSKIP: BLOCK 1 ;CURRENT VARIABLE INDEX +FLSKIP: BLOCK 1 ;ASCIZ LISTING FLAGS (/DRAFT) +IFSKIP: BLOCK 1 ;-1 TO SKIP INPUT + +MJSPDL: BLOCK 1 ;PD POINTER TO MJSPDB +MJSPDB: BLOCK LN$MJP*LN$MJS ;PD STORAGE FOR NOTE/LS +SECNUM: BLOCK LN$SEC ;SECTION NUMBERS (FIRST IS CHAPTER) +LASHL: BLOCK 1 ;LEVEL OF LAST .HL OR .CH +CENPOS: BLOCK 1 ;SAVED VALUE FOR CENTERING +CENTTL: BLOCK 1 ;-1 OR COUNT DOWN OF TITLE IN CENTER +SMINSC: BLOCK 1 ;FLAG SOMETHING IN THIS SECTION + + +TABTAB: BLOCK LN$TAB ;TAB SETTINGS +NTABS: BLOCK 1 + +NLPG: BLOCK 1 ;PAGE LENGTH +PNLPG: BLOCK 1 ;PAGE SIZE + CONT. +; GLOBAL VARIABLES + +PLIST: BLOCK LN$PDL+1 + +FOOTBF: BLOCK 1 ;ADDRESS OF FOOTNOTE BUFFER (SET AT INITIALIZATION) +FOOTC: BLOCK 1 ;FOOTNOTE COUNT +FOOTP1: BLOCK 1 +FOOTP2: BLOCK 1 +FOOTP3: BLOCK 1 +FOOTP4: BLOCK 1 + +FOOTWB: BLOCK LN$LIN ;LINE HOLDING BUFFER AROUND FOOTNOTE OUTPUTTER +FOOTS1: BLOCK 1 ;POINTERS TO FOOTWB +FOOTS2: BLOCK 1 ; .. + +ICBUF: BLOCK LN$IDX ;STORAGE FOR INDEXED ITEM +ICBFE=.-1 +ICBUFC: BLOCK 1 ;UP COUNTER ON ICBUF +ICBUFP: BLOCK 1 ;BYTE POINTER TO ICBUF +SUBIDX: BLOCK 1 ;DISTINGUISHES SUBINDEX COMMAND +XFIRST: BLOCK 1 ;ADDRESS OF ALPHABETICALLY FIRST ITEM +XTOP: BLOCK 1 ;TOP OF INDEX STORAGE +XBOT: BLOCK 1 ;BOTTOM OF INDEX STORAGE +OIXC: BLOCK 1 ;CURRENT ITEM IN OUTPUT INDEX +OIXL: BLOCK 1 ;INITIAL LETTER IN OUTPUT INDEX +AUTIDX: BLOCK 1 ;-1 IF > INDEXING + +PAGECT: BLOCK 1 ;COUNT OF REAL PAGES OUTPUT +LINECT: BLOCK 1 ;COUNT OF LINES ON CURRENT PAGE OUTPUT +DIDSOM: BLOCK 1 ;NON-ZERO IF LINE OUT SINCE LAST PAUSE +INDCT: BLOCK 1 ;INDENTATION +NIACNT: BLOCK 1 ;COUNT OF NIA WARNINGS SINCE LM +DEFFIG: BLOCK 1 ;DEFERRED FIGURE SIZE +LITCNT: BLOCK 1 ;LITERAL LINE COUNTER + +BARSW: BLOCK 1 ;BAR ENABLED +BARON: BLOCK 1 ;BAR ON +BARNPY: BLOCK 1 ;BAR WAS ON AT START OF LINE + CONT. +;I/O AREAS + +LKPBLK: BLOCK LN$LKP ;LOOKUP BLOCK FOR INPUT FILE + +OPNOUT: BLOCK 3 ;OPEN BLOCK FOR OUTPUT +ENTBLK: BLOCK LN$ENT ;ENTER BLOCK FOR OUTPUT FILE +DEFEXT: BLOCK 1 ;DEFAULT EXTENSION FOR OUTPUT +H.FOUT: BLOCK 3 ;BUFFER HEADER FOR OUTPUT + +; GENERAL + + +TT1: BLOCK 1 +TT2: BLOCK 1 +TT5: BLOCK 1 +TT6: BLOCK 1 +LCH: BLOCK 1 +PSTRP: BLOCK 2 + +INSEQP: BLOCK 1 ;POINTER TO INPUT SEQUENCE NUMBER +INSEQN: BLOCK 1 ;CURRENT INPUT SEQUENCE NUMBER +INSEQL: BLOCK 1 ;INPUT SEQUENCE NUMBER OF LAST LINE +INLINE: BLOCK 1 ;INPUT LINE COUNT THIS PAGE +INPAGE: BLOCK 1 ;INPUT PAGE COUNT +THISEQ: BLOCK 1 ;SEQUENCE AT START OF THIS OUTPUT LINE +THISLN: BLOCK 1 ;LINE COUNT AT START OF OUTPUT LINE +THISPG: BLOCK 1 ;PAGE COUNT AT START OF OUTPUT LINE + +INEOFP: BLOCK 1 ;INPUT END OF FILE STRING POINTER + +SELPFX: BLOCK 1 ;SELECT PREFIX ;;KEEP +SELSNG: BLOCK 1 ;SELECT SINGLE LINE ;; IN +SELSTR: BLOCK 1 ;SELECT START RANGE ;;THIS +SELSTP: BLOCK 1 ;SELECT STOP RANGE ;;ORDER +ESLCTF: BLOCK 1 ;-1 IF AFTER .END SELECT +SLINBF: BLOCK 50 ;.END SELECT BUFFER +SLINBL==.-SLINBF +SLIN: BLOCK 4 ;POINTERS TO SLINBF + +TTISOT: BLOCK 1 ;-1 IF OUTPUT TO TTY: +ISDFLN: BLOCK 1 ;-1 IF ISSUED FILE NAME + +AFTRNC: BLOCK 1 ;IF NON-ZERO, ADDRESS OF STRING TO + ; OUTPUT AFTER NEXT CHARACTER +TYPMUL: BLOCK 1 ;SPACING MULTIPLIER IF TYPESETTING +TYPDIV: BLOCK 1 ;SPACING DIVISOR IF TYPESETTING +FLTYPC: BLOCK 1 ;FLAG THAT IN .TYPESET COMMAND +FLTYPR: BLOCK 1 ;0=NO FACE CHANGE, + ; -1=FACE CHANGE, +1=TEXT AFTER FACE CHANGE +FLTYPS: BLOCK 1 ;-1=SUPPRESS NEXT STARTING SPACE +FOUTCH: BLOCK 1 ;ADDRESS OF ROUTINE TO OUTPUT CHAR + CONT. +; LINE TEMPS + + +LNINCT: BLOCK 1 ;COUNT OF CHARACTERS IN LINBF +LINBK: BLOCK 1 +SPCNT: BLOCK 1 ;COUNT OF SPACES IN LINBF +LSTSP: BLOCK 1 ;CHARACTER ADDRESS OF LAST SPACE IN LINBF +LINNSC: BLOCK 1 ;COUNT OF NON-SPACING CHARS IN LINBF + +LNIN1: BLOCK 1 ;INPUT POINTERS TO LINBF +LNIN2: BLOCK 1 ; .. +LOUT1: BLOCK 1 ;OUTPUT POINTERS TO LINBF +LOUT2: BLOCK 1 ; .. + +LINBF: BLOCK LN$LIN ;LINE BUFFER + +GCINP: BLOCK 1 ;RE-EAT POINTERS +GCIN2: BLOCK 1 ; .. +GCSCH: BLOCK 1 ;SAVED CHARACTER (-1=NONE) +LINDCX: BLOCK 1 ;ADDRESS OF ROUTINE IN LINDCW + +CMSTP: BLOCK 1 +CMST2: BLOCK 1 + +CMBF: BLOCK 10 +ECMBF=.-1 +CMEBFP: BLOCK 4 ;READ/WRITE/FIRST/LAST+1 CHAR POINT TO CMEBF +CMEBF: BLOCK 6 ;LAST COMMAND +CMEBFL==.-CMEBF + +RINCHR: BLOCK 1 ;ROUTINE TO READ CHAR +ADRECM: BLOCK 1 ;END ADDRESS MATCH +TECBFP: BLOCK 4 ;READ/WRITE/FIRST/LAST+4 CHAR PNTR TO TECBF +TECBF: BLOCK LN$TEC ;END COMMAND TEMP STRING BUFFER + +TTLP1: BLOCK 1 ;TITLES +TTLP2: BLOCK 1 +TTLBUF: BLOCK LN$TTL +STTLP1: BLOCK 1 ;SUB TITLES +STTLP2: BLOCK 1 +STTLBF: BLOCK LN$TTL +DOSTTL: BLOCK 1 ;INCLUDE SUBTITLE + CONT. +EXSP1: BLOCK 1 +EXSP2: BLOCK 1 +ULMCH: BLOCK 1 + +NSPCH: BLOCK 1 +LSTNSP: BLOCK 1 +ULPOS: BLOCK 1 +CPOS: BLOCK 1 +ULPT1: BLOCK 1 +ULPBF: BLOCK LN$UND ;COLUMNS TO BE UNDERLINED + +CCTABL:! ;PARRALLELS FLASTD +CC.CAP: BLOCK 1 ;.FLAG CAPITALIZE < +CC.CON: BLOCK 1 ;.FLAG CONTROL . +CC.END: BLOCK 1 ;.FLAG ENDFOOTNOTE ! +CC.IND: BLOCK 1 ;.FLAG INDEX > +CC.LOW: BLOCK 1 ;.FLAG LOWERCASE \ +CC.QUO: BLOCK 1 ;.FLAG QUOTE _ +CC.SPA: BLOCK 1 ;.FLAG SPACE # +CC.SUB: BLOCK 1 ;.FLAG SUBINDEX > +CC.UND: BLOCK 1 ;.FLAG UNDERLINE & +CC.UPP: BLOCK 1 ;.FLAG UPPERCASE ^ +CCTEND==.-1 + + +FILLWA==.-1 ;END OF STORAGE CLEARED EACH FILE + ;& + + RELOC 400000 ;END OF VARIABLES + SUBTTL INITIALIZATION + +;+ +;.AUTOPA.FLAGS.TS8,16,24,32,,,,,,,,.LM0.P0,-1.FILL.LOWER CASE +;.CHAPTER TERMINAL COMMAND SCANNING +;- + +RUNOFF: TDZA A,A ;NON-CCL ENTRY + MOVEI A,1 ;CCL ENTRY + MOVEM A,CCLF1 ;STORE FOR LATER + RESET ;CLEAR ALL I/O + HRRZ A,.JBREL ;GET FIRST-TIME CORE SIZE + MOVEM A,INICOR + HRRZ A,.JBFF ;GET INITIAL .JBFF + MOVEM A,INIFF ;SAVE FOR LATER + STORE 17,0,16,0 ;CLEAR ALL ACS + MOVE P,[IOWD LN$PDL,PLIST] ;STACK + MOVE A,[2,,[ IOWD 1,['RUNOFF'] + CCLF1,,'RNO']] + PUSHJ P,.ISCAN## ;INITIALIZE COMMAND SCANNER + CONT. +;BACK HERE AFTER EACH COMMAND IS COMPLETE +RUNOF0: MOVE A,[11,,[IOWD SWTL,SWTN + SWTD,,SWTM + 0,,SWTP + -1 + SCNCLA,,0 + SCNAIN,,SCNAOT + 0 + 0 + 0,,SCNSWT]] + PUSHJ P,.TSCAN## ;SCAN THE LINE + SKIPN SCNLOC ;IS THERE A FILE? + JRST E$$NFS ;NO + MOVE A,[3,,[IOWD SWTL,SWTN + SWTD,,SWTM + 0,,SWTP]] + PUSHJ P,.OSCAN## ;GET OPTIONS IF ANY + JRST RUNOFS ;GO PROCESS IT + +;ROUTINE TO CLEAR SCAN RESULTS +SCNCLA: STORE A,SCNFWA,SCNLWA,0 ;CLEAR AREA + STORE A,SCMFWA,SCMLWA,-1 ;AND SWITCHES + MOVE A,INIFF ;RESTORE .JBFF + MOVEM A,.JBFF ; .. + MOVE A,INICOR ;RESTORE .JBREL + CAME A,.JBREL ; .. + CORE A, ; .. + JFCL ; (NICE TRY) + POPJ P, ;RETURN + + MSG$ NFS,ERR,,No file specified + PUSHJ P,.TCRLF## + PUSHJ P,.CLRBF## ;CLEAR BUFFER + JRST RUNOF0 ;START OVER + ;ROUTINE TO STORE MULTI-VALUED SWITCHES + +SCNSWT: TLZ B,-1 ;CLEAR POINTER TO LEAVE INDEX + JUMPG B,SCNRNG ;IF NOT /VARIANT, JUMP + +;HERE WHEN SWITCH IS /VARIANT + + AOS A,SCNNVR ;INCREMENT COUNT + CAIN A,LN$VAR+1 ;SEE IF TOO MANY +E$$TMV: JRST [MOVEI A,'TMV' ;YES--GIVE UP + PJSP B,SCNERR + ASCIZ \Too many /VARIANTS\] +E$$VVZ: JUMPE C2,[MOVEI A,'VVZ' + PJSP B,SCNERR + ASCIZ \/VARIANT value zero\] + MOVEM C2,SCNVAR-1(A) ;NO--STORE AWAY + POPJ P, ;RETURN, INDICATING DONE + +;HERE IF /IRANGE OR /ORANGE + +SCNRNG: CAILE B,2 ;SEE IF NOT /IR OR /OR + JRST SCNUND ;RIGHT--GO TRY SOMETHING ELSE + MOVEI D,SCNNIR ;POINT TO /IRANGE + CAIN B,2 ;SEE IF /ORANGE + MOVEI D,SCNNOR ;YES--POINT TO IT + AOS A,(D) ;INCREMENT COUNT + CAIN A,LN$RNG+1 ;SEE IF OVERFLOW YET +E$$TMR: JRST [MOVEI A,'TMR' ;YES--GIVE UP + PJSP B,SCNERR + ASCIZ \Too many RANGES\] + IMULI A,3 ;MULTIPLY COUNT BY 3 + ADDI D,-2(A) ;POINT TO START OF TRIPLET + MOVE A,.NMUL## ;GET FROM + MOVEM A,(D) ;STORE + MOVE A,.NMUL+1 ;GET TO + MOVEM A,1(D) ;STORE + MOVE A,.NMUL+2 ;GET CHAPTERS + MOVEM A,2(D) ;STORE + POPJ P, ;RETURN + ;HERE IF /UNDERLINE + +SCNUND: HLRE A,C2 ;GET UNDERLINE CHARACTER + JUMPL A,SCNUN1 ;NOT SPECIFIED--PROCEED + SKIPLE ULCHO ;SEE IF PREVIOUSLY SET + CAMN A,ULCHO ;YES--SEE IF SAME + SKIPA ;OK + JRST E.DSI## ;NO--ERROR + MOVEM A,ULCHO ;OK--STORE +SCNUN1: HRRE A,C2 ;GET UNDERLINE TYPE + JUMPL A,SCNUN2 ;NOT SPECIFIED--ALL DONE + SKIPL ULTYPE ;SEE IF PREVIOUSLY SET + CAMN A,ULTYPE ;YES--SEE IF SAME + SKIPA ;OK + JRST E.DSI## ;NO--ERROR + MOVEM A,ULTYPE ;OK--STORE TYPE + +;HERE WHEN DONE WITH ARG, IF COLON, DO AGAIN + +SCNUN2: CAIE S1,":" ;SEE IF COLON + POPJ P, ;RETURN + PUSHJ P,SWUNDR ;YES--GET ANOTHER ARG + JRST SCNUND ;AND GO STORE IT + ;ROUTINE TO SCAN THE /UNDERLINE SWITCH +;VALUES ARE: +; /UNDERLINE:"CHARACTER" +; /UNDERLINE:OCTAL BOTH SET UNDERLINE CHARACTER +; +; /UNDERLINE:KEYWORD SETS TYPE OF UNDERLINING + +SWUNDR: PUSHJ P,TCHOO ;GET CHARACTER OR OCTAL VALUE + JRST [JUMPE C2,SWUND4 ;IF 0, INDICATE /UNDER:0 + HRLO C2,C2 ;RETURN THE + POPJ P,] ; ANSWER NUMBER + + PUSHJ P,.SIXSC## ;MUST BE KEYWORD + MOVE A,[IOWD UNDR.L,UNDR.T] + PUSHJ P,.NAME## ;LOOK IN TABLE OF KEYS + JRST SWUND3 ;NOT FOUND--GO SEE WHY + SUBI A,UNDR.T-1 ;FOUND--REMOVE OFFSET + TLZ A,-1 ;CLEAR JUNK + CAIN A,UNDRNONE ;SEE IF NONE + JRST SWUND4 ;YES--INDICATE THAT + HRROI C2,(A) ;SET IN ANSWER + POPJ P, ; AND RETURN + +SWUND3: CAME C2,['0 '] ;SEE IF :0 + JUMPN C2,E.UKK## ;IF NOT AND NOT BLANK, ERROR +SWUND4: HRROI C2,0 ;IF SO, RETURN 0 + POPJ P, ;RETURN + +;SWITCH HANDLER FOR OCTAL OR QUOTED CHARACTER + +SWCHOO: PUSHJ P,TCHOO ;GET IT + POPJ P, ;SOMETHING + MOVEI C2,0 ;IGNORE + POPJ P, ; NULL + +;ROUTINE TO GET OCTAL OR QUOTED CHARACTER + +TCHOO: PUSHJ P,.TIAUC## ;GET FIRST CHARACTER + CAIE S1,"""" ;SEE IF QUOTED CHARACTER + JRST SWCHO1 ;NO--TRY SOMETHING ELSE + PUSHJ P,.TISQT## ;YES--SET QUOTE + SKIPN .QUOTE## ;SEE IF STILL QUOTED + JRST E.SVR## ;NO--INDICATE SWITCH VALUE REQUIRED + MOVE C2,S1 ;RETURN THE ANSWER CHARACTER + MOVEI A,.TFCHR## ;INDICATE SINGLE + MOVEM A,.LASWD## ; CHARACTER FORMAT + PJRST .TIAUC## ;GET SEPARATOR AND RETURN + +SWCHO1: CAIL S1,"0" ;SEE IF + CAILE S1,"7" ; OCTAL + JRST CPOPJ1 ;NOT FOUND + PUSHJ P,.OCTNC## ;YES--GET OCTAL NUMBER + CAILE C2,177 ;SEE IF VALID CHARACTER + JRST E.SVTL## ;NO--INDICATE ERROR + POPJ P, ;RETURN VALUE + ;ROUTINE TO SCAN A RANGE VALUE +;FORM IS A/B-C:D/E-F WHERE A,C,D,F ARE DECIMAL NUMBERS OR ^ OR * +; A/B-C IS FROM, D/E-F IS TO ON THE RANGE +; A,D ARE LINE NUMBERS, C,F ARE PAGE NUMBERS +; B,E ARE CHAPTER NUMBERS OR APPENDIX LETTERS OR "INDEX" +;IF B,E ARE OMITTED, SO CAN FOLLOWING - +;IF D/E-F ARE ABSENT, COLON CAN BE OMITTED AND THEY ARE END OF FILE +;IF A/B-C ARE ABSENT, MEANS FROM START OF FILE +;IF F IS MISSING, SAME AS C +;IF C IS MISSING, SAME AS 1 +;IF A IS MISSING, SAME AS 1 +;IF D IS MISSING, SAME AS END OF PAGE (777777 INTERNALLY) +;^ IS SAME AS 1 (I.E., BEGINNING) +;* IS SAME AS 777777 (I.E., END) + +SWRNGE: SAVE$ ;SAVE P1, P2 + PUSHJ P,.TIAUC## ;GET NEXT CHARACTER + PUSHJ P,.TICQT## ;SET QUOTE IF APPROPRIATE + SETZB X,CH ;CLEAR FROM AND TO + PUSHJ P,DECPGC ;GET A + HRLZ X,C2 ;SAVE AWAY + MOVEI C2,0 ;CLEAR ACCUMULATOR + CAIN S1,"/" ;SEE IF PAGE NEXT + SKIPN .QUOTE## ;YES--LEGAL ONLY IF QUOTED + SKIPA ;NO--SKIP + PUSHJ P,DECHAP ;YES--GET IT + HRR X,C2 ;SAVE AWAY + HLLOM C2,.NMUL+2 ;SET START CHAPTER (END CH=INF) + CAIE S1,":" ;SEE IF TO SPECIFIED + JRST SWRNG1 ;NO--SKIP OVER + PUSHJ P,DECPAG ;YES--GET D + HRLZ CH,C2 ;SAVE AWAY + MOVEI C2,0 ;CLEAR ACCUMULATOR + CAIN S1,"/" ;SEE IF PAGE NEXT + SKIPN .QUOTE## ;YES--LEGAL ONLY IF QUOTED + SKIPA ;NO--SKIP + PUSHJ P,DECHAP ;YES--GET IT + HRR CH,C2 ;SAVE AWAY + TLNE C2,-1 ;SEE IF CHAPTER SET + HLRM C2,.NMUL+2 ;YES--SAVE AWAY +SWRNG1: SKIPN CH ;SEE IF TO SPECIFIED + SETOM CH ;NO--DEFAULT TO MAX + ;A DEFAULTS TO 0 + TRNN X,-1 ;SEE IF C + HRRI X,1 ;NO--DEFAULT TO /1 + TLNN CH,-1 ;SEE IF D + TLO CH,-1 ;NO--DEFAULT TO END OF PAGE + TRNN CH,-1 ;SEE IF F + HRR CH,X ;NO--DEFAULT TO C + MOVEM X,.NMUL## ;STORE FROM + MOVEM CH,.NMUL+1 ;STORE TO + RSTR$ ;RESTORE P2, P1 + POPJ P, ;AND FINISH PROCESSING + ;ROUTINE TO GET CHAPTER AND PAGE NUMBER +;RETURNS CHAPTER,,PAGE IN C2 + +DECHAP: PUSHJ P,.TIAUC## ;GET FIRST CHARACTER + CAIL S1,"A" ;SEE IF ALPHA + CAILE S1,"Z" ; .. + JRST DECHP3 ;NO--HANDLE NUMERIC + MOVEI C2,0 ;YES--APPENDIX +DECHP1: CAIL S1,"A" ;SEE IF STILL ALPHA + CAILE S1,"Z" ; .. + JRST DECHP2 ;NO--EXIT LOOP + IMULI C2,^D26 ;YES--ADVANCE RADIX + ADDI C2,1-"A"(S1) ;INCLUDE THIS DIGIT--OFFSET BY 1 + PUSHJ P,.TIAUC## ;GET NEXT CHARACTER + JRST DECHP1 ;LOOP +DECHP2: CAME C2,[^D4361706] ;"INDEX" + TROA C2,APPXFL ;APPENDIX--SET FLAG + SETOM C2 ;INDEX--SET CODE + JRST DECHP4 ;GO FINISH UP + +DECHP3: PUSHJ P,DECPGC ;GET DECIMAL CHAPTER + CAIE S1,"-" ;SEE IF WAS CHAPTER + JRST DECHP5 ;NO--IS PAGE +DECHP4: PUSH P,C2 ;SAVE CHAPTER + MOVEI C2,0 ;CLEAR PAGE + CAIN S1,"-" ;SEE IF PAGE COMING + PUSHJ P,DECPAG ;YES--GET IT + POP P,A ;RESTORE CHAPTER + HRL C2,A ;ENTER IN RESULT +DECHP5: POPJ P, ;RETURN VALUE + +;ROUTINE TO GET POSITION +; DECIMAL OR ^ FOR 1 OR * FOR END (777777) +;RETURNS VALUE IN C2 + +DECPAG: PUSHJ P,.TIAUC## ;GET FIRST CHARACTER +DECPGC: CAIN S1,"*" ;SEE IF END + JRST DECPG1 ;YES--GO HANDLE + CAIE S1,"^" ;SEE IF START + PJRST .DECNC## ;NO--HANDLE DECIMAL + SKIPA C2,[1] ;YES--SET "1" +DECPG1: MOVEI C2,-1 ;END--SET "777777" + PJRST .TIAUC## ;GET BREAK AND RETURN + ;ROUTINE TO ALLOCATE OUTPUT SPEC AREA +SCNAOT: MOVEI A,SCNOUT ;POINT TO AREA + MOVEI B,.FXLEN ;AND LENGTH + POPJ P, ;RETURN + +;ROUTINE TO ALLOCATE INPUT SPEC AREA +SCNAIN: MOVE B,.JBFF ;GET START OF FREE CORE + SUBI B,.FXLEN ;OFFSET FOLLOWING ADDI + SKIPN A,SCNLOC ;SEE IF ALREADY SOME + MOVE A,B ;NO--POINT TO START OF FREE CORE + ADDI A,.FXLEN ;POINT TO START OF AREA + MOVEM A,SCNLOC ;UPDATE MEMORY + MOVEI B,.FXLEN(A) ;DETERMINE NEW START OF FREE SPACE + MOVEM B,.JBFF ;SAVE FOR OTHERS + CAMG B,.JBREL ;SEE IF IT FITS IN CORE + JRST SCNAIG ;YES--PROCEED + MOVEI C,(B) ;NO--GET MORE + CORE C, ;FROM MONITOR + JRST E$$TMI ;WELL--NICE TRY +SCNAIG: HRLZ C,A ;CLEAR AREA + HRRI C,1(A) ; .. + SETZM (A) ; .. + BLT C,(B) ; .. + MOVEI B,.FXLEN ;INDICATE LENGTH + POPJ P, ;RETURN + +E$$TMI: MOVEI A,'TMI' ;NOT ENOUGH CORE + MOVEI B,[ASCIZ \Insufficient core for command\] + +;HERE ON ALL SCANNING ERRORS +SCNERR: HRLI A,'RNF' ;INCLUDE RUNOFF PREFIX + HRLI B,"?" ;INDICATE FATAL ERROR + PUSHJ P,.ERMSG## ;ISSUE ERROR MESSAGE + PJRST .FMSGE## ;GO RESTART COMMAND + ;SWITCH CONTROL TABLES + + DEFINE SWTCHS,< +SN AUTOPARAGRAPH,,FS.NUE!FS.NFS +SP BAR,SCNBAR,SWCHOO,BAR,FS.NUE!FS.NFS +SL CASE,SCNCAS,CASE,CASELOWER,FS.NUE!FS.NFS +SN CONTROL,,FS.NUE!FS.NFS +SN CRETURN,SCNCRT,FS.NUE!FS.NFS +SP DOWN,SCNDWN,.SWDEC##,DWN,FS.NUE!FS.NFS +SN DRAFT,SCNDRF,FS.NUE!FS.NFS +SL HEADER,SCNHDR,HEAD,HEADUPPER,FS.NUE!FS.NFS +SP IRANGE,1,SWRNGE,VAR,FS.LRG!FS.VRQ!FS.NFS +SP LINES,SCNLPP,.SWDEC##,LPP,FS.NUE!FS.NFS +SS NOBAR,SCNBAR,0,FS.NUE!FS.NFS +SS NOSELECT,SCNSEL,1,FS.NUE!FS.NFS +SS NOUNDERLINE,ULTYPE,UNDRNONE,FS.NUE!FS.NFS +SN NUMBERING,SCNNMB,FS.NUE!FS.NFS +SP ORANGE,2,SWRNGE,VAR,FS.LRG!FS.VRQ!FS.NFS +SN PAGING,SCNPAG,FS.NUE!FS.NFS +SN PAUSE,SCNPAU,FS.NUE!FS.NFS +SN PERIOD,SCNPER,FS.NUE!FS.NFS +SP RIGHT,SCNOVR,.SWDEC##,OVR,FS.NUE!FS.NFS +SP SELECT,SCNSEL,.SWASQ##,,FS.NUE!FS.NFS +SN SEQUENCE,,FS.NUE!FS.NFS +SN SIMULATE,SCNSIM,FS.NUE!FS.NFS +SP SPACING,SCNSPG,.SWDEC##,SPC,FS.NUE!FS.NFS +SL TYPESET,SCNTYP,TYP,PD.TYP,FS.NUE!FS.NFS +SP UNDERLINE,3,SWUNDR,UNL,FS.NFS +SP VARIANT,,.SWSIX##,VAR,FS.VRQ!FS.NFS +SP WIDTH,SCNWID,.SWDEC##,WID,FS.NUE!FS.NFS +> + +PD.VAR==0 +MX.VAR==1 + + +;KEY WORD LISTS + +KEYS (CASE,) +KEYS (HEAD,) +KEYS (TYP,) +KEYS (UNDR,) + ;NOW BUILD THE TABLES + DOSCAN (SWT) + ;HERE WHEN SCAN COMPLETED +RUNOFS: MOVSI A,'DSK' ;GET DEFAULT OUTPUT DEVICE + SKIPN SCNOUT+.FXDEV ;SEE IF NEEDED + MOVEM A,SCNOUT+.FXDEV ;YES--FILL IN DEFAULT + MOVEI A,AD.DWN ;GET DEFAULT FOR DOWN + SKIPGE SCNDWN ;SEE IF VALUE SET FOR DOWN + MOVEM A,SCNDWN ;WASN'T,MOVE IN DEFAULT + SKIPLE SCNDRF ;SEE IF /DRAFT + JRST [MOVEI A,R.SEQU ;YES--SEE IF /SEQUENCE + TDNN A,FINIM ; OR /NOSEQUENCE + IORM A,FINI ;NO--SET /SEQUENCE + JRST .+1] ; AND PROCEED + +;LOOP OVER INPUT SPECS + SKIPN SCNLOC ;SEE IF ANY INPUT + PUSHJ P,SCNAIN ;NO--MAKE A BLANK AREA + MOVE X,INIFF ;GET INITIAL AREA + MOVEM X,SCNFIR ;SET AS START OF SCAN AREA +INDEFL: MOVE A,X ;POINT TO SPEC [206] + MOVEI B,.FXLEN ;INDICATE LENGTH [206] + PUSHJ P,.OSDFS## ;APPLY DEFAULTS FROM SWITCH.INI [206] + MOVSI B,'DSK' ;GET DEFAULT DEVICE + SKIPN .FXDEV(X) ;SEE IF NEEDED + MOVEM B,.FXDEV(X) ;YES--FILL IN DEFAULT + MOVE B,SCNOUT+.FXNAM ;GET OUTPUT FILE NAME IF ANY + MOVE C,SCNOUT+.FXNMM ;GET OUTPUT FILE NAME WILD CARD + CAME X,INIFF ;SEE IF FIRST SPEC + MOVE B,.FXNAM-.FXLEN(X) ;NO--DEFAULT TO PREVIOUS + CAME X,INIFF ; .. + MOVE C,.FXNMM-.FXLEN(X) ; .. + SKIPN .FXNAM(X) ;SEE IF FILE NAME GIVEN + MOVEM C,.FXNMM(X) ;NO--FILL IN DEFAULT + SKIPN .FXNAM(X) ; .. + MOVEM B,.FXNAM(X) ; .. + HLLO B,EXTTAB ;GET DEFAULT EXTENSION + SKIPN .FXEXT(X) ;SEE IF ANYTHING TYPED + MOVEM B,.FXEXT(X) ;NO--FILL IN DEFAULT + ADDI X,.FXLEN ;ADVANCE TO NEXT SPEC + CAMG X,SCNLOC ;SEE IF ALL DONE + JRST INDEFL ;NO--GO DO NEXT ONE + + MOVE A,.JBREL ;GET CORE + HRL A,.JBFF ;AND FREE STORAGE + MOVEM A,SINCOR ;SAVE FOR MAIN LOOP + CONT. +;BACK HERE AFTER EACH FILE PROCESSED +RUNOF1: MOVE A,SINCOR ;GET ORIGINAL CORE + HLRZM A,.JBFF ;RESTORE FREE CORE + TLZ A,-1 ;CLEAR TO CORE SIZE + CAME A,.JBREL ; .. + CORE A, ;RESTORE IT + JFCL ;NICE TRY. + + MOVSI F,L.JUST!L.PJUS!L.FILL + SKIPGE A,ULTYPE ;GET TYPE OF UNDERLINING + MOVEI A,AD.UNL ; FILL IN DEFAULT + SKIPLE SCNTYP ;SEE IF TYPESETTING + MOVEI A,UNDRCH ;YES--SET /UNDERLINE:CHARACTER + XCT [TLO F,L.USUP ;/UNDERLINE:NO + TLO F,L.UBSP!L.UMOD ;/UNDERLINE:BACKSPACE + TLO F,L.UMOD ;/UNDERLINE:CHARACTER (NON-SPACING) + JFCL ;/UNDERLINE:LINE (OVERPRINT) + TLO F,L.ULIN ;/UNDERLINE:SEPARATE (LINE) + TLO F,L.USUP](A) ;/UNDERLINE:NONE +IFN AD.CON< TRO F,R.ALCC> ;SET /CONTROLS IF DEFAULT + ANDCM F,FINIM ;CLEAR SPECIFIED SWITCHES + IOR F,FINI ;INCLUDE OTHER COMMAND FLAGS + SKIPN SCNPER ;SEE IF /NOPERIOD + TRO F,R.NPER ;YES--SET INITIALLY TO IGNORE THEM + + STORE A,FILFWA,FILLWA,0 ;CLEAR FILE AREA + CONT. + MOVE A,[4,,[ SCNFIR,,SCNLOC + OPNBLK,,LKPBLK + .FXLEN,,LN$LKP + 1B0+F.FIN_^D18+SCNPTR]] + PUSHJ P,.LKWLD## ;PERFORM WILD-CARD LOOKUP (SEARCH) + JRST RUNOF0 ;NOT DISK--SEE IF DONE OR OTHER DEVICE + + MOVE X,SCNPTR ;GET INDEX + MOVE C2,B ;SAVE DEVICE TYPE FOR LATER + JUMPE A,RDERR3 ;ERROR IF NO SUCH DEVICE + + OPEN F.FIN,OPNBLK ;OPEN CHANNEL + JRST RDERR1 ;CAN'T GET DEVICE + INBUF F.FIN,0 ;GET DEFAULT BUFFER RING + MOVE CH,LKPBLK+.RBPPN ;SAVE DIRECTORY + MOVSI S1,-EXTN ;POINT TO DEFAULT EXTENSION TABLE +;BACK HERE IF FILE NOT FOUND AND NEW DEFAULT BEING TRIED +SETUP2: MOVEI A,0 ;SET FOR EXTENDEDLOOKUP + SKIPL C2 ;SET OFFSET OF 0 IF DISK + MOVEI A,2 ;OR 2 IF NOT + MOVEM CH,LKPBLK+.RBPPN ;RESTORE DIRECTORY + LOOKUP F.FIN,LKPBLK(A) ;LOOKUP FILE + JRST RDERR2 ;CAN'T GET AT FILE + PUSHJ P,.CHKTM## ;CHECK /BEFORE/SINCE + JRST SETER4 ;FAIL--GO TRY ANOTHER + CONT. +;NOW THE PRIMARY OUTPUT FILE + +SETUP3: MOVSI N,-EXTN ;NOW FIND CORRESPONDING OUT EXT + HLLZ B,LKPBLK+.RBEXT ;JUST THE EXT +SETU3A: HLLZ C,EXTTAB(N) ;CHECK INPUT EXT + CAMN B,C ;INPUT IN TABLE? + JRST SETU3D ;YES. + AOBJN N,SETU3A ;NOT THAT ONE. TRY THEM ALL + MOVSI N1,-NSLEXT ;NOT FOUND--TRY SOURCE FILES +SETU3B: HLLZ C,SELEXT(N1) ;GET SAMPLE + CAME B,C ;CHECK + AOBJN N1,SETU3B ;NO--TRY NEXT + JUMPGE N1,SETU3C ;DEFAULT IF UNKNOWN + MOVS N,PLMEXT ;YES--SET TO .PLM + JRST SETU3E ;AND PROCEED +SETU3C: SUBI N,1 ;NOT FOUND--USE LAST ENTRY +SETU3D: MOVS N,EXTTAB(N) ;FOUND. GET OUT EXT FOR IT. +SETU3E: SKIPLE SCNTYP ;SEE IF TYPESETTING + JRST [ANDI N,77 ;YES--SAVE LAST CHAR OF INPUT + TRO N,'TP ' ;INCLUDE .TP? + HRLZS N ;POSITION TO LH + JRST .+1] ;AND PROCEED + HLLOM N,DEFEXT ;SAVE FOR .SCWLD + MOVE A,[4,,[SCNPTR,,[SCNOUT] + OPNBLK,,OPNOUT + LKPBLK,,ENTBLK + DEFEXT,,LN$ENT]] + PUSHJ P,.SCWLD## ;SETUP OUTPUT WILDCARDS + JRST SETER4 ;GIVE UP IF IMPOSSIBLE + MOVSI C,H.FOUT + MOVEM C,OPNOUT+2 ;SET BUFFER ADDRESS + OPEN F.FOUT,OPNOUT + JRST WRERR1 ;CANT GET OUTPUT DEVICE + OUTBUF F.FOUT,0 ;ALLOCATE DEFAULT OUTPUT BUFFERS + CONT. + MOVE A,LKPBLK+.RBVER ;GET VERSION OF INPUT + SKIPN ENTBLK+.RBVER ;UNLESS SET, + MOVEM A,ENTBLK+.RBVER ;STORE FOR OUTPUT + SKIPG A,LKPBLK+.RBSIZ ;GET ACTUAL INPUT SIZE + MOVEI A,0 ;(IGNORE IF .LE. 0) + LSH A,-7 ;CONVERT TO BLOCKS + SKIPN ENTBLK+.RBEST ;UNLESS SET, + MOVEM A,ENTBLK+.RBEST ;SAVE AS ESTIMATED LENGTH + MOVEI A,0 ;SET FOR EXTENDED + SKIPL B ;IF NOT DISK + MOVEI A,2 ;CHANGE TO SHORT + ENTER F.FOUT,ENTBLK(A) ;ENTER FILE + JRST WRERR2 ;IF ERROR, GO GIVE UP + + MOVEI A,F.FOUT ;POINT TO OUTPUT CHANNEL + DEVNAM A, ;GET PHYSICAL NAME + MOVE A,OPNOUT+1 ;(OLD MONS, GET LOG NAME) + GETLIN B, ;GET TTY NAME + CAMN A,B ;SEE IF THE SAME + SETOM TTISOT ;YES--SET FLAG TO SUPPRESS INFO MESSAGES + MOVEI A,F.FOUT ;POINT TO CHANNEL [203] + DEVCHR A, ;GET CHARACTERISTICS [203] + TXNE A,DV.TTY ;SEE IF A TTY [203] + SETSTS F.FOUT,IO.SUP ;YES--SUPPRESS ECHO [203] + JRST RNGO ;NO GO INTO THE REAL PROGRAM, SETUP DONE. + ;ERRORS DURING SPECIFICATIONS + +RDERR1: PUSHJ P,E.DFO## ;OPEN ERROR + JRST RUNOF1 ;GO TRY AGAIN + +RDERR2: HRRZ A,LKPBLK+.RBEXT ;GET ERROR CODE + JUMPN A,RDER2E ;UNLESS NOT FOUND, GO GIVE ERROR + MOVX B,FX.NUL ;SEE IF NULL EXTENSION + TDNE B,.FXMOD(X) ; .. + AOBJN S1,.+2 ;YES--SEE IF MORE NAMES TO TRY + JRST RDER2E ;NO--GO GIVE ERROR NOW + HLLZ B,EXTTAB(S1) ;ELSE, GET NEXT CHOICE + MOVEM B,LKPBLK+.RBEXT ;SET FOR LOOKUP + JRST SETUP2 ;GO BACK AND TRY IT +RDER2E: PUSHJ P,E.DFL## ;LOOKUP ERROR + JRST SETER4 ;RELEASE INPUT AND TRY AGAIN + +WRERR1: SETZM SCNLOC ;CLEAR WILD SCAN + PUSHJ P,E.SCO## ;ERROR--OUTPUT OPEN + JRST SETER4 ;FINISH UP +WRERR2: PUSHJ P,E.SCL## ;ENTER ERROR + JRST SETER3 ;FINISH UP + +RDERR3: MSG$ NID,ERR,,No input device + PUSHJ P,.TSPAC## ;TYPE A SPACE + MOVE A,.FXDEV(X) ;GET INPUT DEVICE + PUSHJ P,.TSIXN## +SETER2: PUSHJ P,.TCRLF +SETER3: RELEAS F.FOUT, +SETER4: RELEAS F.FIN, + JRST RUNOF1 + +EXTTAB: ;TABLE OF XWD DEFAULT INPUT EXTENSION, OUTPUT EXT. + SIXBIT /RNOMEM/ ;FIRST IS DEFAULT INPUT IF WILDCARD + ;KEEP REST IN ALPHABETIC ORDER + SIXBIT /RNBBLB/ + SIXBIT /RNCCCO/ + SIXBIT /RNDDOC/ + SIXBIT /RNEERR/ + SIXBIT /RNHHLP/ +PLMEXT: SIXBIT /RNLPLM/ + SIXBIT /RNMMAN/ + SIXBIT /RNPOPR/ + SIXBIT /RNSSTD/ + SIXBIT / MEM/ ;LAST IS DEFAULT OUTPUT EXTENSION +EXTN==.-EXTTAB + ;HERE WHEN FILES OPENED + +RNGO: MOVE A,[FLASTD,,CCTABL] + BLT A,CCTEND ;PRESET .FLAG TABLE + HLRZ D,LKPBLK+.RBEXT ;GET EXTENSION + + SETOM GCSCH ;NO SAVED CHARACTER + SETOM ULMCH ; .. + SKIPL A,SCNLPP ;GET /LINES:N + CAIGE A,12 ;MAKE SURE AT LEAST MIN + MOVEI A,AD.LPP ;INITIAL LENGTH OF PAGE + SKIPGE SCNPAG ;IF NO /NOPAGING OR /PAGING + CAIE D,'RNH' ;SEE IF HELP FILE + SKIPN SCNPAG ;NOT HELP--SEE IF /NOPAGING + HRLOI A,INFIN ;YES--SET INFINITY [205] + MOVEM A,PNLPG + MOVEM A,NLPG + MOVEI A,AD.WID ;INITIAL RIGHT MARGIN + CAIN D,'RNH' ;SEE IF HELP FILE + MOVEI A,HRMRG ;YES--GET SPECIAL WIDTH + SKIPL SCNWID ;IF /WIDTH, + MOVE A,SCNWID ; GET IT INSTEAD + MOVEM A,PRMRG + MOVEM A,RMARG + STORE A,LMARG,,ILMRG ;SET INITIAL LEFT MARGIN + SKIPN SCNNMB ;IF /NONUMBERING, + SETOM FLNUMB ; SET .NONUMBER + SKIPGE A,SCNOVR ;OVER SWITCH ON? + MOVEI A,AD.OVR ;NO + IDIVI A,^D8 ;THIS FOR TABS + MOVEM A,FILOVT ;SAVE TABS OVER + MOVEM B,FILOVR ;SAVE SPACES OVER + MOVEI A,ILPGNO ;INITIAL PAGE NUMBER + MOVEM A,PAGENO + PUSHJ P,SETRNG ;SET L.SUPO IF NOT IN /RANGE + MOVEI A,IPARIN ;INITIAL PARAGRAPH INDENTING + MOVEM A,PARIND + STORE A,PARSPC,,IPARVS ;DEFAULT VERT SPACING OF PARAGRAPHS + MOVEI A,IPARTP ;INITIAL + MOVEM A,PARTPG ; PARAGRAPH TEST PAGE + MOVEI PA,LINBF ;INITIALIZE LINE INPUT POINTER + PUSHJ P,CSP + MOVEM A,LNIN1 ;STORE. + MOVEM B,LNIN2 ; .. + SKIPGE A,SCNCAS ;GET SWITCH CASE + MOVEI A,AD.CAS ;NONE--DEFAULT TO UPPER + MOVE A,[ULCAS + 0]-1(A) ;CONVERT TO INTERNAL FORMAT + MOVEM A,FILCAS ;SET INITIAL FILE CASE + MOVEM A,CAS ;STORE CURRENT FILE CASE + CONT. + SKIPGE A,SCNSPG ;GET /SPACING SWITCH + MOVEI A,AD.SPC ;NONE--GET DEFAULT + MOVEM A,NSPNG ;STORE AS INITIAL VALUE + SKIPG A,SCNHDR ;SEE IF /HEADER + MOVEI A,AD.HDR ;NO--USE DEFAULT + MOVEM A,FILHDR ;INITIALIZE SETTING + + SKIPGE SCNPAG ;SEE IF /PAGING OR /NOPAGING + CAIE D,'RNH' ;NO--SEE IF HELP FILE + SKIPN SCNPAG ;NOT HELP--SEE IF /NOPAGING + JRST [SETOM FLNOPG ;HELP OR /NOPAGING--SET .NO PAG + SETOM FLNHDR ; AND .NO HEAD + JRST .+1] ;AND PROCEED + + MOVEI A,AD.UND ;GET DEFAULT /UNDERLINE + TLNE F,L.ULIN ;SEE IF /UNDERLINE:SEPARATE + MOVEI A,ADSUND ;YES--DIFFERENT DEFAULT + SKIPG ULCHO ;SEE IF USER GAVE /UNDERLINE + MOVEM A,ULCHO ;NO--SUPPLY DEFAULT + + HRRZ PA,.JBFF ;GET FREE AREA + MOVEM PA,XTOP ;INITIAL INDEX POINTERS + MOVEM PA,XBOT ; .. + HRRZ PA,.JBREL ;INITIALIZE FOOTNOTE STUFF + SUBI PA,^D200 ;SPACE FOR SOME FOOTNOTES? + HRRZ A,.JBFF ; .. + CAIL A,0(PA) ; .. + JRST [ADDI PA,^D1000 ;NO. ASK FOR MORE CORE + CORE PA, ; .. + JFCL ;BUT DONT PANIC IF NOT THERE + JRST .+1] + HRRZ PA,.JBREL ;GIVE HALF OF CORE TO FOOTNOTES + SUBI PA,0(A) ;AND HALF TO INDEX + ASH PA,-1 ; .. + ADDI PA,0(A) ;.JBFF PLUS HALF DIFFERENCE + HRRZM PA,FOOTBF ;SAVE FOR COMPARISON LATER + PUSHJ P,CSP ; .. + MOVEM A,FOOTP1 ;STORE + MOVEM B,FOOTP2 + MOVEM A,FOOTP3 ;IN BOTH POINTERS + MOVEM B,FOOTP4 + CONT. + MOVEI PA,CMEBFP ;POINT TO COMMAND ERROR BUFFER + MOVEI A,CMEBF ;WORD ADDRESS + MOVEI B,CMEBFL ;WORD LENGTH + PUSHJ P,ICI ;INITIALIZE CHARACTER POINTERS + + MOVEI PA,SLIN ;POINT TO POINTERS + MOVEI A,SLINBF ;WORD ADDRESS + MOVEI B,SLINBL ;WORD LENGTH + PUSHJ P,ICI ;SET INITIAL POINTERS + + MOVEI PA,TECBFP ;POINT TO BUFFER FOR TEST END + MOVEI A,TECBF ;WORD ADDRESS + MOVEI B,LN$TEC ;WORD LENGTH + PUSHJ P,ICI ;INITIALIZE CHARACTER POINTERS + + MOVSI A,-LN$TAB ;LENGTH OF TAB STOP TABLE + MOVEI B,0 ;PRESET TO 8,16,24,... +INTABL: ADDI B,8 ;ADVANCE TO NEXT + MOVEM B,TABTAB(A) ;STORE + AOBJN A,INTABL ;LOOP FOR ENTIRE TABLE + HRRZM A,NTABS ;STORE NUMBER WE SET + MOVE B,SCNTYP ;GET /TYPESET SWITCH + CAIN B,TYPLPT ;IF /TYPESET:LPT + SETZM B ; TREAT AS NORMAL OUTPUT + MOVEI A,1 ;SET 1/1 + SKIPLE B ;UNLESS TYPESETTING (NOT LPT) + MOVEI A,TYPSWD ;GET TYPESETTING WIDTH + MOVEM A,TYPMUL ;STORE AS SPACING MULTIPLIER + SKIPLE B ;UNLESS TYPESETTING (NOT LPT) + MOVE A,PRMRG ;GET PAGE WIDTH + MOVEM A,TYPDIV ;STORE AS SPACING DIVISOR + + MOVEI A,FOUTCS ;PRESET FILE + SKIPLE SCNTYP ; OUTPUT ROUTINE + MOVEI A,OUTTYP ;IF TYPESETTING--MUST CONVERT + MOVEM A,FOUTCH ;STORE + CONT. + HLRZ B,LKPBLK+.RBEXT ;GET EXTENSION + MOVSI A,-NSLEXT ;LENGTH OF SELECTION TABLE +RNGSEL: HLRZ C,SELEXT(A) ;GET EXTENSION + CAME C,B ;SEE IF SAME + AOBJN A,RNGSEL ;NO--LOOP + HRRZ A,SELEXT(A) ;GET SELECTION ADDRESS + MOVE B,SCNSEL ;GET /SELECT VALUE + AOSE B ;SEE IF DEFAULT + MOVEI A,SCNSEL ;A NOW POINTS TO DEFAULT + SKIPE A ;IF NO DEFAULT + SKIPN B,(A) ;OR NO VALUE, + JRST RNGNSL ; SUPPRESS SELECTION + CAIN B,1 ;SEE IF /NOSELECT + JRST RNGNSL ;YES--NO SELECTION + TRO F,R.SLCT!R.SLLK ;SET .SELECTION MODE + MOVSI C,-4 ;COUNT OF MASK SIZE +RNGYSL: MOVEI A,0 ;CLEAR JUNK + LSHC A,7 ;PEEL OUT NEXT CHAR + MOVEM A,SELPFX(C) ;STORE IN ARRAY + AOBJN C,RNGYSL ;LOOP +RNGNSL: AOS DIDSOM ;FORCE FIRST WAIT + SKIPLE SCNSIM ;FORMFEED OR LF'S? + JRST RNG1 ;LINEFEEDS. REQUEST POSITIONING + SKIPL TTISOT ;SEE IF TTY: OUTPUT + SKIPLE SCNPAU ;OR IF PAUSE MODE IS ON + PUSHJ P,FRCFRM ;YES--FORCE FORM FEED + JRST RNG2 ;AND GO. + +RNG1: MOVEI A,[ASCIZ \ +Position paper, type space. +\] + PUSHJ P,.TSTRG ;ASK FOR POSITIONING + PUSHJ P,BPGXY ;WAIT FOR A CHARACTER + CONT. +RNG2: SKIPG SCNTYP ;SEE IF TYPESETTING + JRST RNG3 ;NO--PROCEED + MOVEI A,FOUTTT ;SET FOR FILE OUTPUT FROM .TOUTS + PUSHJ P,.TYOCH## ; GET BACK ORIGINAL + SAVE$ A ;SAVE FOR RESTORE + MOVEI A,[ASCIZ \ ;ABUT EXTENSION OF DATE + LSHC A,WID(RB.CRD) ;FORMAT TOGETHER + PUSHJ P,.TDATE## ;ISSUE IT + PUSHJ P,.TSPAC## ;SPACE OVER + LDB A,[POINTR (LKPBLK+.RBPRV,RB.CRT)] + IMULI A,^D60000 ;CONVERT TO MILLI-SEC. + PUSHJ P,.TTIME## ;ISSUE THAT + MOVEI A,[ASCIZ \>[*CAT]\] + MOVE B,SCNTYP ;GET /TYPESET + CAIN B,TYPLPT ;IF /TYPESET:LPT + MOVEI A,[ASCIZ \>[*LPTR]\] ; USE SPECIAL SETUP + CAIN B,TYPTXT ;IF /TYPESET:TXT + MOVEI A,[ASCIZ \>[*TXT6]\] ; USE ITS SETUP + PUSHJ P,.TSTRG## ;ISSUE MACRO TO START TYPESETTING OFF + PUSHJ P,LRMTYP ;ISSUE INITIAL MARGINS + PUSHJ P,.TCRLF## ;CLEAN LINE + RSTR$ A ;RESTORE ORIGINAL TYPER + PUSHJ P,.TYOCH## ;TELL .TOUTS + PUSHJ P,STSTYP ;SET TAB STOPS FOR TYPESETTING +RNG3: PUSHJ P,LINSET ;SET UP FOR LINE + PUSHJ P,LINDFN ;INITIALIZE TO NORMAL CASE RULES + JRST LGO ;AND INTO MAIN LOOP, LINE INPUT + ;TABLE OF XWD EXTENSION,ADDRESS OF DEFAULT .SELECTION + +;+ +;^THE TABLE ". ^THE USER +;DOES NOT NEED TO REMEMBER THE COMMENTING CONVENTION FOR EACH +;LANGUAGE TO EXTRACT THE PROGRAM'S DOCUMENTATION. ^IF A PROGRAM +;NEEDS ITS DOCUMENTATION TO BE FLAGGED BY NON-STANDARD CHARACTERS, +;IT SHOULD START WITH A .