100c15e6a6414d2a21945665f386bbfa826c6fcc
[pdp10-muddle.git] / <mdl.int> / midas.323
1
2 .SYMTAB 4003.,2000.     ;THIS MANY FOR DEC VERSION ON DEC SYSTEM.
3 IFN .OSMIDAS-SIXBIT/DEC/, .SYMTAB 5003. ;ON ITS ASSEMBLE FASTER.
4
5 TITLE MIDAS
6 .MLLIT==1       ;MULTI-LINE MODE.
7
8 ;AC DEFS
9
10 FF=0    ;FLAGS
11 P=1
12 I=2     ;INDICATOR FLAGS, CONTAIN INFO ON CURRENT SYL, FIELD, WORD; ALSO SEE UNRCHF
13 AA=3
14 A=4
15 B=5
16 C=6
17 D=7
18 T=10    ;NOT SO TEMP AS IN MOST PROGS W/ T
19 TT=11
20 SYM=12  ;FREQUENTLY CONTAINS SQUOZE SYM W/ FLAGS CLEAR
21 LINK=13
22 F=14
23 CH1=15  ;MACRO PROCESSOR TEMP, CLOBBERED BY CALLS TO RCH
24 CH2=16  ;" " "
25 TM=17   ;SUPER TEMPORARY
26
27 IFDEF .XCREF, .XCREF FF,P,I,A,B,C,D,T
28
29 IF1,[   ;FOR PASS 1 TTY CONDITIONALS
30 IFDEF SAILSW,IFN SAILSW,DECSW==1
31 IFDEF CMUSW,IFN CMUSW,DECSW==1
32 IFDEF DECDBG,IFN DECDBG,DECSW==1
33 IFDEF DECSW,IFN DECSW,DECSW==1 ? ITSSW==0 ? TNXSW==0
34 IFDEF ITSSW,IFN ITSSW,ITSSW==1 ? DECSW==0 ? TNXSW==0
35 IFDEF TNXSW,IFN TNXSW,TNXSW==1 ? DECSW==0 ? ITSSW==0
36 ] ; IF1
37 IFNDEF ITSSW,ITSSW==IFDEF .IOT,[1] .ELSE 0      ;NONZERO FOR ITS VERSION
38 IFNDEF TNXSW,TNXSW==IFDEF JSYS,[1] .ELSE 0      ;NONZERO FOR TENEX VERSION
39 IFNDEF DECSW,DECSW==IFDEF LOOKUP,[1-TNXSW] .ELSE 0      ;NONZERO TO RUN ON DEC MONITOR.
40                                 ; TNXSW SINCE TENEX MIDAS HAS DEC UUO'S
41                                 ; DEFINED TOO
42 IFNDEF DECDBG,DECDBG==0         ;NONZERO FOR DEC VERSION TO RUN WITH DEC DDT.
43 IFNDEF SAILSW,SAILSW==IFDEF SPCWAR,[1] .ELSE 0  ;NONZERO FOR SAIL VERSION.
44 IFNDEF CMUSW,CMUSW==IFDEF CMUDEC,[1] .ELSE 0    ;NONZERO FOR VERSION TO RUN AT CMU.
45 IFN TNXSW,DECSW==1      ;***TEMP*** USE PA1050 FOR NOW
46 IFN ITSSW\DECSW\TNXSW,TS==1
47 IFNDEF TS,TS==1                 ;NON-ZERO FOR ASSEMBLED VERSION TO RUN IN TIME-SHARING
48 IFE TS,1PASS
49 IFNDEF A1PSW,   A1PSW==TS       ;FOR 1PASS END-OF-PROGRAM AUTO-REASSEMBLY
50 IFNDEF TSSYMS,  TSSYMS==ITSSW   ;.UAI, ETC. (AND ..RJCL, ETC) - EVER USE THEM?
51 IFNDEF BRCFLG,  BRCFLG==0       ;1 => BRACES { AND } ARE SPECIAL IN MACRO ARGS, ETC.
52                                 ;JUST LIKE BRACKETS. BRACES ARE SPECIAL IN CONDITIONALS
53                                 ;REGARDLESS OF BRCFLG.
54 IFNDEF CREFSW,  CREFSW==ITSSW   ;SET TO ALLOW C SWITCH TO CAUSE CREF OUTPUT.
55 IFNDEF LISTSW,  LISTSW==1       ;SET TO ALLOW L SWITCH TO CAUSE A LISTING.
56 IFNDEF RCHASW,  RCHASW==TS      ;INCLUDE TTY AS POSSIBLE INPUT DEVICE
57 IFNDEF PURESW,  PURESW==TS      ;NON-ZERO TO SEPARATE PURE CODING FROM IMPURE AND DO PAGE SKIPS
58 IFNDEF FASLP,   FASLP==ITSSW\TNXSW\CMUSW\SAILSW ;NON-ZERO => INCLUDE FASL OUTPUT CAPABILITY
59                                 ; NOTE!! IF RUNNING UNDER 10/50 THIS MAKES THINGS
60                                 ; SEVERAL K BIGGER THAN OTHERWISE
61 IFNDEF .I.FSW,  .I.FSW==ITSSW\TNXSW\CMUSW\SAILSW        ;NON-ZERO => INCLUDE .I, .F
62 IFNDEF MACSW,   MACSW==1        ;NON-ZERO => INCLUDE MACRO PROCESSOR (!)
63 IFNDEF RUNTSW,  RUNTSW==1       ;ASSEMBLE CODING TO TYPE OUT RUN TIME AT END OF ASSEMBLY
64 IFNDEF WRQTSW,  WRQTSW==1       ;WRQOTE (MACRO DEFINITION READER) VERSION
65         ; ^ 0 => SLOW,   1 => FAST; MAYBE 2 WILL EVENTUALLY BE CREATED
66 IFE TS,IFNDEF MACL,MACL==6*2000 ;MACRO TABLE SIZE
67 IFN TS,[
68 IFE DECSW,IFNDEF MACL,MACL==6000 ;(MUST BE BIG ENOUGH TO COVER INIT CODE)
69                                  ;IN DEC VERSION, MACL IS DEFINED = SIZE OF INIT CODE.
70 IFNDEF MXMACL,MXMACL==32.*2000  ;MAXIMUM LENGTH MACTAB
71 ]
72 IFNDEF MACRUM,MACRUM==4         ;# WORDS NOT USED AT END OF MACTAB
73 IFNDEF STRL,STRL==20            ;LENGTH OF STRING STORAGE (USED BY GSYL)
74 IFNDEF DMDEFL,DMDEFL==40        ;MAX NO OF DMY ARGS IN DEFINE
75 IFNDEF DMYAGL,DMYAGL==400       ;MAX NO COMBINED DMYARGS ALL MACROS CURRENTLY EXPANDING OR PUSHED
76 IFNDEF MPDLL,MPDLL==300         ;MACRO PDL LENGTH
77 IFNDEF DSSIZ,DSSIZ==40          ;MAX # ARGS MACRO WHOSE ARGS BEING SCANNED (SHOULD BE .GE. DMDEFL)
78 IFNDEF BKTABL,BKTABL==40        ;MAX NUM .BEGIN BLOCKS.
79 IFNDEF BKPDLS,BKPDLS==10        ;MAXIMUM .BEGIN BLOCK NESTING DEPTH.
80 IFNDEF BSIZE,BSIZE==37          ;PREFERRED SIZE BLOCK  MAX SIZE-3
81 IFN DECSW,IFNDEF LPDL,LPDL==200.
82 IFNDEF LPDL,LPDL==500           ;LENGTH OF PDL
83 IFN DECSW,IFNDEF CONMIN,CONMIN==1000
84 IFNDEF CONMIN,CONMIN==3300      ;MINIMUM AMT OF SPACE FOR CONSTANTS TABLES.
85 IFNDEF CONMAX,CONMAX==10000     ;MAXIMUM SPACE USER CAN ASK FOR.
86 IFNDEF NCONS,NCONS==75.         ;MAXIMUM NUMBER OF CONSTANTS AREAS
87 IFNDEF NVARS,NVARS==25.         ;MAX. NUM. VARIABLES AREAS.
88 IFN DECSW,IFNDEF SYMDSZ,SYMDSZ==2003.
89 IFNDEF SYMDSZ,SYMDSZ==2707.     ;DEFAULT # SYMS IN SYMTAB.
90 IFNDEF SYMMSZ,SYMMSZ==10177*2   ;# SYMS IF JNAME IS MMIDAS.
91 IFNDEF SYMMAX,SYMMAX==40000     ;MAX SYMTAB SIZE (# SYMS)
92 IFNDEF FASBL,FASBL==400         ;WORDS  USED FOR FASL OUTPUT BUFFER
93                                 ; MUST HOLD STUFF ASSOC WITH ONE GROUP OF 9 CODE BYTES
94 IFNDEF FASATL,FASATL==2000      ;WORDS USED FOR FASL ATOM TABLE
95                                 ; HOLDS PNAMES ETC OF ALL ATOMS AS WILL BE IN FASLOAD'S
96                                 ; SYMTAB AT LOAD TIME
97 IFNDEF MINWPS,MINWPS==3         ;MIN # WORDS IN SYMTAB ENTRY
98 IFNDEF MAXWPS,MAXWPS==3         ;MAX # ALLOWED (WILL BE BIGGER SOME DAY)
99 IFNDEF NRMWPS,NRMWPS==3         ;DEFAULT #.   2 WDS FOR VALUE & FLAGS, 1 FOR NAME.
100 \f
101 IF1 [
102
103 IFNDEF MIDVRS,MIDVRS=.FNAM2
104 IFE MIDVRS-SIXBIT/MID/,[
105 PRINTX /What is MIDAS version number? /
106 .TTYMAC VRS
107 MIDVRS=SIXBIT/VRS/
108 TERMIN
109 ]
110
111 ;OSMIDAS GETS THE SIXBIT NAME OF THE TYPE OF OP. SYS. THE VERSION OF MIDAS
112 ;IS BEING ASSEMBLED TO RUN UNDER.  IT WILL BE THE VALUE OF ".OSMIDAS" WHEN PROGRAMS
113 ;ARE ASSEMBLED WITH THIS MIDAS.
114 IFNDEF OSMIDAS,OSMIDAS==IFE TS,[SIXBIT/BARE/] .ELSE IFN ITSSW,[SIXBIT/ITS/] .ELSE IFN CMUSW,[SIXBIT/CMU/] .ELSE IFN SAILSW,[SIXBIT/SAIL/] .ELSE IFN TNXSW,[SIXBIT/TENEX/] .ELSE SIXBIT/DEC/
115
116 ;FF FLAGS NOT PUSHED
117 ;LEFT HALF
118 FL==1,,525252
119 FLPPSS==400000  ;ONE IF PUNCHING PASS; MUST BE SIGN
120 FLHKIL==100000  ;ONE IF SYM TO BE SEMI KILLED IN DDT
121
122 FLVOT==40000    ;ALL RCH S MUST GO THRU RCH
123         ; IE TYPCTL .NE. POPJ P, (SET/CLEARED BY MDSSET, MDSCLR)
124 FLMAC==20000    ;ONE IF CHARS COMING FROM MACRO PROCESSOR, DON'T HACK CPGN/CLNN
125 FLTTY==10000    ;ONE IF CHARS FROM SOMEWHERE ELSE BUT NOT HACKING CPGN/CLNN
126 FLOUT==4000     ;ONE IF OUTPUT HAS OCCURED IN CURRENT MODE (USED BY TS NED LOGIC)
127 FLPTPF==2000    ;SET IF (TIME SHARING) OUTPUT DEVICE IS PTP
128 FLUNRD==1000    ;=> RE-INPUT LAST CHARACTER (SEE RCH)
129
130
131 ;FF RIGHT HALF FLAGS
132
133 FR==525252
134 FRFIRWD==400000 ;ONE FOR FIRST WORD OF BLOCK
135 FRSYMS==200000  ;ONE IF SYM PUNCH DESIRED
136 FRLOC==100000   ;ONE BETWEEN ABS LOC ASSIGN AND
137         ;FIRST BLOCK OUTPUT THEREAFTER (EBLK TO OUTPUT NULL BLOCK SO LINKING LOADER KNOWS $.)
138
139 FRNPSS==40000   ;ONE IF TWO PASS ASSEMBLY
140 FRPSS2==20000   ;ONE ON PASS 2
141
142 FRINVT==4000    ;USED BY PBITS AND OUTPUT TO OUTPUT WORDS OF CODE BITS IN CORRECT ORDER (STEAD LOGICAL)
143 FRNLIK==2000    ;TEMPORARILY SUPPRESS ADR LINKING
144 FRGLOL==1000    ;ONE IF LOCATION PLUS OFFSET IS GLOBAL
145
146 FRBIT7==400     ;SET IF LAST TIPLE OF CODEBITS WAS 7.
147 FRMRGO==200     ;MACRO PROC TO RETURN TO .GO HACKER W/O READING NEXT CHAR (SEE RCHSAV)
148
149 FRCMND==40      ;SET WHILE READING CMD, TELLS RFD TO NOTICE (, _, COMMA.
150 FRNNUL==20      ;SET ON RETURN FROM RFD IFF NONNULL SPEC.
151 FRARRO==10      ;TELLS RFD THAT 1ST NAME IS FN1, NOT FN2.
152
153 ] ;END IF1
154 \f
155 IF1 [
156
157         ;INDICATOR REGISTER
158
159 ;LEFT HALF
160 IL==1,,525252
161 ILGLI==1        ;SET ON " CLEARED EACH SYL
162 ILVAR==2        ;SET ON '    "     "   "
163 ILFLO==4        ;FLOATING NUM, SET ON DIGIT AFTER .
164 ILDECP==10      ;DECIMAL PREFER, SET WHEN . SEEN.
165 ILUARI==20      ;1 => RIGHT OPERAND TO UPARROW BEING READ
166 ILLSRT==40      ;RETURN FROM <
167 ILWORD==400     ;SET IF CURRENT WORD IS NOT NULL RETURNED BY GETWORD
168 ILNPRC==1000    ;ONE IF NUMBER ALREADY PROCESSED BY UPARROW
169 ILMWRD==4000    ;SET ON MULTIPLE WORD
170 ILPRN==10000    ;SET DURING MACCL IF MACRO NAME WAS FOLLOWED BY (.
171 ILMWR1==20000   ;SET BY LBRAK AS SIGNAL TO ITSELF THAT THIS NOT FIRST
172                 ;WORD OF MULTI-WORD CONSTANT
173 ILNOPT==40000   ;CONSTANTS OPTIMIZATION SUPPRESSION FLAG; SHOULD BE SET BY
174                 ;VALUE-RETURNING PSEUDO DURING NOT PUNCHING PASS TO KEEP ITSELF OUT OF
175                 ;CONSTANTS OPTIMIZATION
176
177
178 ;RIGHT HALF
179
180 IR==525252
181 IRFLD==1        ;SET IF FLD NOT NULL
182 IRSYL==2        ;SET IF SYL NOT NULL
183 IRLET==4        ;SET IF SYL IS SYMBOL
184 IRDEF==10       ;SET IF CURRENT EXPR DEFINED
185 IRNOEQ==20      ;SET IF = ISN'T ALLOWED IN CURRENT CONTEXT.
186 IRCOM==40       ;SET IF CURRENT QUAN IS COMMON
187 IRPERI==100     ;SET IF PERIOD SEEN IN WHAT IS SO FAR (INCL .) A NUMBER
188 IREQL==200      ;ONE DURING READING WORD TO RIGHT OF =
189 IRIOINS==400    ;FIRST FIELD OF CURRENT WORD HAS IO INST
190 IRCONT==1000    ;SET IF NOT OK TO END BLOCK
191 IRPSUD==4000    ;SET IF ERROR COMMENTS WILL COME FROM PSEUDO
192 IRGMNS==20000   ;SET IF ILUARI OR BAKARI HAS GOBBLED MINUS
193 IROP==200000    ;SET IF OPERATOR SEEN IN CURRENT FIELD
194
195
196 CALL=PUSHJ P,
197 RET=POPJ P,
198 SAVE=PUSH P,
199 REST=POP P,
200
201 ETSM=1000,,     ;ERROR, TYPE SYM.
202 ETR=2000,,      ;ERROR, ORDINARY MESSAGE.
203 ERJ=3000,,      ;ERROR, NO MESSAGE, RETURN TO ADDR.
204 ETI=4000,,      ;ERROR, IGNORE LINE, RET. TO ASSEM1.
205 ETA=5000,,      ;ERROR, RET. TO ASSEM1.
206 ETASM=6000,,    ;ERROR, TYPE SYM AND RETURN TO ASSEM1
207 ETF=7000,,      ;FATAL ERROR.
208 TYPR=(37000)    ;UUO, TYPE OUT ASCIZ STRING
209 ] ;END IF1
210 \f
211 IF1 [
212 ;LINK TABLE (GLOTB), ACCUMULATES GLOBAL REFERENCES FOR CURRENT FROB (USUALLY WORD) TO OUTPUT
213 ;GLSP2 POINTS TO (I.E. HAS ADR 1 LESS THAN) BOTTOM OF ACTIVE PART OF TABLE
214 ;GLSP1 POINTS TO TOP (HAS ADR OF LAST ENTRY ACTIVE)
215
216 ;ACTUAL ENTRIES IN GLOTB:
217 ;IF ENTIRE WORD ZERO, ENTRY IS NULL, WILL (OR SHOULD) BE IGNORED
218 ;RH ADR OF SQUOZE WITH INTERNAL MIDAS FLAGS (USUALLY IN SYMBOL TABLE, BUT MAY BE ANYWHERE IN CORE)
219 ;LH: RIGHT 10. BITS MULTIPLICATION FACTOR OR 0 => 1
220         ;GLOBAL SHOULD BE MULTIPLIED BY IT
221 ;REST OF LH FLAGS:
222
223 ;SIGN BIT => THIS NOT PART OF FIELD, DON'T PLAY WITH FLAGS AT GETFLD, INTFD
224 ACF==40000      ;AC LOW OR HIGH (SWAPF => HIGH)
225 HFWDF==100000   ;MASK GLOBAL TO HALFWORD
226 SWAPF==200000   ;SWAP
227 MINF==20000     ;NEGATIVE OF GLOBAL
228
229 IFNDEF LBRKT,LBRKT=="[  ;LEFT DELIMITER FOR EXPLICITLY GROUPED CONDITIONALS, MACRO ARGS, REPEAT BODY, ETC.
230 IFNDEF RBRKT,RBRKT=="]  ;RIGHT "
231 IFNDEF WPS,     WPS==3  ;# CONTIG. WDS /STE. IFNDEF FOR DEBUGGING.
232 IFNDEF BKWPB,BKWPB==3   ;# WDS/BKTAB ENTRY.
233 IFNDEF EOFCH,EOFCH==3   ;EOF CHAR, BEWARE DISPATCH TABLE ENTRIES.
234 IFNDEF LBRACE,LBRACE=="{
235 IFNDEF RBRACE,RBRACE=="}
236
237 ;3RDWRD LH. SYM TAB BITS
238
239 3REL==600000    ;RELOC BITS, DO NOT CHANGE, SOMETIMES REFERENCED BY NUMERIC BYTE POINTERS
240 3RLL==400000    ;R(LH)
241 3RLR==200000    ;R(RH)
242 3RLNK==100000   ;R(LINK)
243 3KILL==40000    ;FULLY-KILLED SYM (DON'T GIVE TO DDT).
244 3VP==20000      ;VALUE PUNCHED
245 3SKILL==10000   ;SEMI KILL IN DDT
246 3LLV==4000      ;LINKING LOADER MUST INSERT VAL
247 3VAS2==2000     ;VAR SEEN ON PASS TWO WITH '
248 3VCNT==1000     ;USED IN CONSTANT
249 3MAS==400       ;THIS ISN'T THE LAST DEFINITION OF A SYM WITH THIS NAME
250                 ;(SO ES MUST KEEP SEARCHING).
251 3NCRF==200      ;DON'T CREF THIS SYMBOL.
252 3MACOK==100     ;OK TO (RE)DEFINE THIS SYM AS MACRO.
253                 ;(IE IS A MACRO OR SEEN ONLY IN .XCREF)
254 3LABEL==40      ;ILLEGAL TO REDEFINE THIS SYM TO DIFFERENT VALUE
255 3MULTI==20      ;THIS SYM IS MULTIPLY DEFINED, SO FLAG ALL DEFINITIONS.
256 3DOWN==10       ;THIS DEFINITION SHOULD BE SEEN BY SUBBLOCKS IN 1PASS MODE.
257
258 3DFCLR==737110  ;BITS IN LH TO CLEAR ON REDEFINITION.
259
260 ;CONTROL FLAGS
261 ;LEFT HALF
262 TRIV==400000    ;1 IF OUT FORM IS FOR TRIVIAL LOADER (ABSOLUTE)
263 ;RIGHT HALF
264 ARIM==2         ;IF ONE OUT FOR IS RIM
265 SBLKS==10       ;IF ONE OUT FORM IS SIMPLE BLOCKS
266 ARIM10==20      ;PDP-10 RIM
267 DECREL==40      ;DEC RELOCATABLE FORMAT (CONSIDERED "ABSOLUTE" INSIDE MIDAS)
268 FASL==100       ;LISP FASL COMPATIBLE RELOCATABLE FORMAT  ( "  "  ")
269
270 ] ;END IF1
271 \f
272 IF1 [
273
274 ;SQUOZE FLAG DEFINITIONS IN MIDAS SYMBOL TABLE
275
276 CMMN==0         ;COMMON (NOT USED)
277 PSUDO==40000    ;PSEUDO OR MACRO, VALUE RH ADDR OF RTN (MACCL FOR MACRO),
278                 ; LH WILL BE IN LH OF B WHEN RTN CALLED.
279 SYMC==100000    ;SYM, VALUE IS VALUE OF SYM.
280 LCUDF==140000   ;LOCAL UNDEF
281 DEFLVR==200000  ;DEF LOC VAR, VALUE IS VALUE.
282 UDEFLV==240000  ;UNDEF LOC VAR, VALUE IS 1+ IDX IN VARIAB. AREA, BUT IGNORD IF VAR AREA GLOB.
283 LGBLCB==300000  ;CODE BITS EQUAL TO THIS OR HIGHER REPRESENT GLOBAL QUANTITIES
284 DEFGVR==300000  ;DEF GLO VAR, VALUE IS VALUE
285 UDEFGV==340000  ;UNDEF GLO VAR, VALUE LIKE UNDEF LOCAL VAR.
286 GLOETY==400000  ;GLO ENTRY
287 GLOEXT==440000  ;GLO EXIT
288 NCDBTS==GLOEXT_<-18.+4>+1       ;# CODE BIT TYPES
289
290 DEFINE CDBCHK TBLNAM
291 IFN .-<TBLNAM>-NCDBTS,.ERR TBLNAM LOSES
292 TERMIN
293
294 ;LOADER BLOCK TYPES LINK
295 LLDCM==1        ;LOADER COMMAND BLOCK
296 LABS==2         ;ABSOLUTE
297 LREL==3         ;RELOCATABLE
298 LPRGN==4        ;PROG NAME
299 LLIB==5         ;LIBRARY BLOCK
300 LCOMLOD==6      ;LOAD INTO COMMON
301 LGPA==7         ;GLOBAL PARAMETER ASSIGN
302 LDDSYM==10      ;LOCAL SYMS
303 LTCP==11        ;LOAD TIME COND ON PRESENCE
304 ELTCB==12       ;END LOAD TIME COND
305 LPLSH==22       ;POLISH FIXUP
306
307 ;LOADER COMMANDS
308 ;IN ADR OF LDCMD BLK
309 LCJMP==1        ;JUMP
310 LCGLO==2        ;GLOBAL LOC ASSIGN
311 LCCMST==3       ;SET COMMON BENCHMARK
312 LCEGLO==4       ;END OF GLOBAL BLOCK
313 LDCV==5         ;LOAD TIME COND ON VALUE
314 LDOFS==6        ;LOADER SET GLOBAL OFFSET
315 LD.OP==7        ;LOADER .OP
316
317 ;LOADER CODEBITS SECOND SPEC AFTER 7
318 CDEF==0         ;DEF
319 CCOMN==1        ;COMMON REL
320 CLGLO==2        ;LOC-GLO REC
321 CLIBQ==3        ;LIBREQ
322 CRDF==4         ;GLO REDEF
323 CRPT==5         ;REPEAT GLOBAL VALUE
324 CDEFPT==6       ;DEFINE SYM AS $.
325
326 ;DEC RELOCATABLE BLOCK TYPES.
327 DECWDS==1       ;STORAGE WORDS.
328 DECSYM==2       ;SYMBOL DEFS OR GLOBAL ADDITIVE RQS.
329 DECHSG==3       ;LOAD INTO HIGH SEG (FOR .DECTWO)
330 DECENT==4       ;ENTRY NAMES
331 DECEND==5       ;END BLOCK, HAS PROGRAM BREAK.
332 DECNAM==6       ;PROGRAM NAME.
333 DECSTA==7       ;STARTING ADDRESS BLOCK.
334 DECINT==10      ;INTERNAL REQUEST
335 DECRQF==16      ;REQUEST LOADING A FILE
336 DECRQL==17      ;REQUEST LOADING A LIBRARY
337 ] ;END IF1
338 \f
339 IF1 [
340
341 DEFINE PRINTA A,B,C,D,E,F
342 IF1,[PRINTC \7fA!B!C!D!E!F
343 \7f]
344 TERMIN
345
346 IF1 [DEFINE BNKBLK OP
347 OP
348 TERMIN ]
349
350         ;ADD A LINE TO BNKBLK, ACCUMULATED CONTENT OF
351         ;WHICH IS DUMPED OUT AT END OF ASSEMBLY
352         ;ARG TO BLCODE SHOULD BE FREE OF STORAGE WORDS
353
354 DEFINE BLCODE NEWCFT
355 IF1 [BNKBLK [DEFINE BNKBLK OP
356 OP]NEWCFT
357 TERMIN ]
358 IF2 [IRPW X,,[
359 NEWCFT
360 ]
361 IRPS Y,,X
362 Y=Y
363 .ISTOP TERMIN TERMIN ] TERMIN
364
365                 ;3RDWRD MANIPULATING MACROS
366                 ;GET 3RDWRD INTO LH("A"), "B" HAS INDEX OF 1STWRD INTO SYMBOL TABLE
367
368 DEFINE 3GET A,B
369         MOVE A,ST+2(B)
370         TERMIN
371
372                 ;GET 3RDWRD INTO "A", "B" HAS ADR OF 1STWRD
373
374 DEFINE 3GET1 A,B
375         MOVE A,2(B)
376         TERMIN
377
378                 ;PUT "A" INTO 3RDWRD, "B" HAS INDEX OF 1STWRD INTO SYMBOL TABLE
379
380 DEFINE 3PUT A,B
381         MOVEM A,ST+2(B)
382         TERMIN
383
384                 ;PUT "A" INTO 3RDWRD, "B" HAS ADR OF 1STWRD
385
386 DEFINE 3PUT1 A,B
387         MOVEM A,2(B)
388         TERMIN
389
390 ] ;END IF1
391 \f
392 IF1 [
393
394                 ;RANDOM MACRO DEFINITIONS
395
396                 ;A HAS ADR OF SYM SQUOZE, SKIP IF IT'S IN SYMBOL TABLE
397
398 DEFINE SKPST A
399         CAIL A,ST
400         CAML A,MACTAD
401 TERMIN
402
403                 ;EXECUTE AN INSTRUCTION WITH VARIOUS ADDRESSES (USUALLY PUSH OR POP)
404
405 DEFINE INSIRP A,B
406         IRPS %ADR,,[B]
407                 A,%ADR
408         TERMIN
409 TERMIN
410
411 DEFINE NOVAL
412         TDNE I,[ILWORD,,IRNOEQ\IRFLD]
413          ETSM ERRNVL
414 TERMIN
415
416 DEFINE NOABS
417         SKIPGE CONTRL
418          ETASM ERRABS
419 TERMIN
420
421 ] ;END IF1
422
423 ERRNVL==[ASCIZ /Returns no value/]
424 ERRABS==[ASCIZ /Allowed only for STINK relocatable format/]
425
426 IF1 [
427
428 DEFINE MOVEIM B,C
429         MOVEI A,C
430         MOVEM A,B
431 TERMIN
432
433 DEFINE MOVEMM B,C
434         MOVE A,C
435         MOVEM A,B
436 TERMIN
437 ] ;END IF1
438 \f
439 IF1 [
440 IFN 0,[
441 ;THESE ARE SOME MACRO DEFINITIONS FOR THE UNFINISHED MULTI-WORD
442 ;SYMBOL NAME FEATURE. FOR COMPATIBILITY, THEY ALL NOW HAVE DEFINITIONS
443 ;THAT ONLY HANDLE ONE WORD. THOSE OTHER DEFINITIONS COME AFTER THESE.
444
445 DEFINE TYPE2 X=SYM
446         MOVE A,X
447         CALL SYMTYP
448 IFSN X,SYM,SKIPE A,X+1
449 .ELSE      SKIPE A,SYMX
450          CALL SYMTYP
451 TERMIN
452
453 DEFINE COPY2 X,Y,Z=USING A
454         MOVE Z,X
455         MOVEM Z,Y
456         MOVE Z,X+1
457         MOVEM Z,Y+1
458 TERMIN
459
460 DEFINE STORE2 AC,Y,Z=USING A
461         MOVEM AC,Y
462         MOVE Z,AC!X
463         MOVEM Z,Y+1
464 TERMIN
465 ]
466
467 .ELSE [
468 ;THESE ARE THE DEFINITIONS OF THE MACROS THAT DO NOT IMPLEMENT
469 ;MULTI-WORD SYMBOL NAMES.
470
471 DEFINE TYPE2 X=SYM
472         MOVE A,X
473         CALL SYMTYP
474 TERMIN
475
476 DEFINE COPY2 X,Y,Z=USING A
477         MOVE Z,X
478         MOVEM Z,Y
479 TERMIN
480
481 DEFINE STORE2 AC,Y,Z=USING A
482         MOVEM AC,Y
483 TERMIN
484 ]
485
486 DEFINE USING X
487 X,TERMIN
488
489 ] ;END IF1
490 \f
491 IFN DECSW\TNXSW,[
492 IF1 [
493 IFE .OSMIDAS-SIXBIT/ITS/,[
494   IFE CMUSW\SAILSW,.INSRT SYS:DECDFS
495   IFN SAILSW,   .INSRT SYS:SAIDFS
496   IFN CMUSW,    .INSRT SYS:CMUDFS
497   IFN TNXSW,    .INSRT SYS:TNXDFS
498 ] ;IF ASSEMBLED ON ITS
499 IFN .OSMIDAS-SIXBIT/ITS/,[ ;OTHER PLACES DON'T KEEP THESE ON SYS:
500   IFE CMUSW\SAILSW,.INSRT DECDFS
501   IFN SAILSW,   .INSRT SAIDFS
502   IFN CMUSW,    .INSRT CMUDFS
503   IFN TNXSW,    .INSRT TNXDFS
504 ] ;IF ASSEMBLED ON A NON-ITS PLACE
505 .DECDF
506
507 IFN TNXSW,[EXPUNGE RESET        ; THE ONLY CONFLICTING JSYS/CALLI
508 .TNXDF
509 ] ;IFN TNXSW
510
511 EXPUNGE .SUSET
512 DEFINE .SUSET A
513 TERMIN
514
515 DEFINE HALT
516         JRST 4,.
517 TERMIN
518
519 EXPUNGE .VALUE
520 EQUALS .VALUE HALT
521 DEFINE .LOSE A
522         JRST 4,.-1
523 TERMIN
524 ] ;IF1
525 IFN PURESW,.DECTWO
526 IFE PURESW,.DECREL
527 RL0==.
528 ] ;IFN DECSW\TNXSW
529
530 IFN ITSSW,[IF1 [IFNDEF .IOT,[.INSRT SYS:ITSDFS
531         .ITSDF
532 ] ;IFNDEF .IOT
533 IFNDEF %PIPDL,.INSRT SYS:ITSBTS
534         HALT==.VALUE
535         EXPUNG .JBTPC,.JBCNI
536
537 DEFINE SYSCAL A,B
538         .CALL [SETZ ? SIXBIT/A/ ? B ((SETZ))]
539 TERMIN
540 ] ;IF1
541 RL0==0
542 IFDEF .SBLK,.SBLK
543 ] ;IFN ITSSW
544 \f
545 IFE PURESW,[    ;FOLLOWING IF NOT ASSEMBLING PURE CODING
546
547 DEFINE PBLK
548 TERMIN
549
550 DEFINE VBLK
551 TERMIN
552 ]
553
554 IFN PURESW,[    ;FOLLOWING IF ASSEMBLING PURE CODING
555
556 ;MEMORY ORGANIZATION PURE CODING
557
558 ;MAXVAR BLOCKS OF IMPURE CODING, NO DYNAMIC ALLOCATION
559         ;BLCODE MACRO ACCUMULATES CODING TO BE PUT AT END OF
560         ;IMPURE CODING, NO STORAGE WORDS ALLOWED
561 ;THEN SYM TAB, STARTING AT ST.
562 ;THEN MACRO TABLE (WITH INIT. CODE IN IT)
563 ;STARTING INITIALLY AT MACTBA, ACTUAL ADDR IN MACTAD.
564 ;SYMTAB AND MACTAB DON'T NECESSARILY START ON PAGE BNDRYS.
565 ;THEN GAP TO MINPUR*2000 (HEREAFTER KNOWN AS "THE GAP")
566 IFN DECSW\TNXSW,MINPUR==200
567 IFN ITSSW,MINPUR==140   ;BLOCK NUMBER BEGINNING OF PURE CODING
568 ;PURE CODING UNTIL MAXPUR*2000-SOMETHING
569 ;THE FOLLOWING MACROS AND BLCODE MAKE IT NOT COMPLETELY NECESSARY
570 ;TO SEPARATE PURE CODING FROM IMPURE
571
572 CKPUR==0        ;0 => ASSEMBLING BELOW THE GAP, 1 ABOVE
573
574                 ;SWITCH TO CODING ABOVE THE GAP
575
576 DEFINE PBLK
577 IFN CKPUR,.ERR PBLK
578 IFE CKPUR,[VAR.LC==.
579 LOC PUR.LC
580 ]CKPUR==1
581 TERMIN
582
583 PUR.LC==MINPUR*2000+IFN DECSW,[RL0]     ;SAVED LOCATION COUNTER ABOVE THE GAP WHEN ASSEMBLING BELOW
584
585                 ;SWITCH TO CODING BELOW THE GAP
586
587 DEFINE VBLK
588 IFE CKPUR,.ERR VBLK
589 IFN CKPUR,[PUR.LC==.
590 LOC VAR.LC
591 ]CKPUR==0
592 TERMIN
593
594 PBLK            ;PBLK NORMAL MODE, VARIABLE AREAS BRACKETED WITH VBLK AND PBLK
595
596 ]               ;END PURESW CONDITIONAL
597
598 .YSTGW          ;SET UP NOW, STORAGE WORDS OK
599 \f
600 FOO==.
601 LOC 41
602         JSR ERROR
603 IFN ITSSW,JSR TSINT
604 IFN DECSW,[IFE SAILSW,LOC .JBAPR
605 .ELSE LOC JOBAPR
606         TSINT1]
607 LOC FOO
608
609                 ;DISPATCH TABLE FOR NON-SQUOZE CHARACTERS
610                 ;REFERENCED AS DTB-40(RH OF POPJ IN GDTAB)
611                 ;DTB ENTRY OF SYL TERMINATOR PUT IN CDISP BY GETSYL
612
613 DSYL==400000    ;SYL OPERATOR, DISPATCH INDEXED BY RH AT GETSYL (MUST BE SIGN)
614 DFLD==200000    ;FIELD OPERATOR, GETFD
615 DWRD==100000    ;WORD OP, GETWD
616 DSY1==1000      ;SET ONLY IF DSYL SET,
617                 ;SET IF OP MIGHT BE 1ST CHAR OF NONNULL SYL.
618 DSYL1==DSYL+DSY1
619 DSY2==400       ;SET FOR _ ONLY.
620
621 ;ALL CLEAR => WORD TERMINATOR, NO DISPATCH
622
623 DTB:    DWRD,,SPACE     ;40  SP, TAB, RUBOUT
624         DSYL1,,RRL2     ;EXCLAIM AND OPEN-BRACE
625         DSYL1,,DQUOTE   ;"
626         DFLD,,XORF      ;NUM SIGN
627         DSYL,,RBRAK2    ;CLOSE-BRACE.
628         0               ;(USED TO BE PERCENT SIGN)
629         DFLD,,ANDF      ;AMPERSAND
630         DSYL1,,SQUOTE   ;'
631         DFLD,,LEFTP     ;(  50
632         DSYL,,RPARN     ;)
633         DFLD,,MULTP     ; STAR  TIMES
634         DFLD,,PLS       ;+  PLUS
635         DWRD,,COMMA     ; ,
636         DFLD,,MINUS     ;-
637         DSYL1,,CTLAT    ;^@ (56)
638         DFLD,,DIVID     ;/
639         DSYL1,,COLON    ;COLON  60
640         DSYL,,SEMIC     ;SEMI 
641         DFLD,,LSSTH     ;<
642         DSYL1,,EQUAL    ;=
643         DSYL,,GRTHN     ;>
644         0               ;?
645         DSYL1,,ATSGN    ;AT SIGN
646         DFLD,,LBRAK     ;[
647         DFLD,,IORF      ;BACKSLASH 70
648         DSYL,,RBRAK     ;]
649         DSYL1,,UPARR    ;^
650         DSYL+DSY2,,BAKAR ;BACKARR
651         0               ;CR
652         0               ;(USED TO BE TAB)
653         0               ;ALL OTHER
654         DSYL,,LINEF     ;LF (DSYL TO HACK CLNN)
655         DSYL,,FORMF     ;FORM FEED (")  100
656 \f
657         ;NOTE THAT POPJ P, IS VALID TEST FOR SQUOZENESS
658         ;EXCEPT FOR EOFCH
659
660 GDTAB:  POPJ P,56       ; ^@ GETS IGNORED.
661         REPEAT 2,POPJ P,76      ;(GDTAB GLOBAL SO OUT OF TS, AIO CAN CLOBBER GDTAB+141 WITH JRST RREOF
662                 ;ON OLD FILES)
663 IFN .-GDTAB-EOFCH,.ERR EOFCH DOESN'T AGREE WITH GDTAB.
664 IFE TS,[POPJ P,76] IFN TS,[JRST RREOF]
665         REPEAT 5,POPJ P,76
666         POPJ P,40       ; TAB
667         POPJ P,77       ; LF
668         POPJ P,76       ; VERT TAB
669         POPJ P,100      ; FORM FEED
670         POPJ P,74       ; CR
671         REPEAT "!-16-1,POPJ P,76
672         POPJ P,40       ; SPACE
673         POPJ P,41       ; !
674         POPJ P,42       ; "
675         POPJ P,43       ; #
676         ADD SYM,%$SQ(D) ; $
677         ADD SYM,%%SQ(D) ; %
678         POPJ P,46       ; &
679         POPJ P,47       ; '
680         POPJ P,50       ; (
681         POPJ P,51       ; )
682         POPJ P,52       ; *
683         POPJ P,53       ; +
684         POPJ P,54       ; ,
685         POPJ P,55       ; -
686         JSP CH1,POINT   ; .
687         POPJ P,57       ; /
688         REPEAT 10.,JSP CH2,RR2  ; DIGITS
689         POPJ P,60       ; :
690         POPJ P,61       ; ;
691         POPJ P,62       ; <
692         POPJ P,63       ; =
693         POPJ P,64       ; >
694         POPJ P,65       ; ?
695         POPJ P,66       ; @
696 IFDEF .CRFOFF,.CRFOFF
697 IRPC Q,,ABCDEFGHIJKLMNOPQRSTUVWXYZ
698         ADD SYM,%!Q!SQ(D)
699 TERMIN
700         POPJ P,67       ; [
701         POPJ P,70       ; \
702         POPJ P,71       ; ]
703         POPJ P,72       ; ^
704         POPJ P,73       ; _
705         POPJ P,76       ; NOW LOWER CASE GRAVE ACCENT
706
707 IRPC Q,,ABCDEFGHIJKLMNOPQRSTUVWXYZ
708         ADD SYM,%!Q!SQ(D)
709 TERMIN
710 IFDEF .CRFON,.CRFON
711         POPJ P,41       ;{
712         POPJ P,76       ;|
713         POPJ P,44       ;}
714         POPJ P,76       ;~
715         POPJ P,40       ; RUBOUT, LIKE SPACE
716         IFN .-GDTAB-200,.ERR GDTAB LOSES
717 \f
718 NSQTB:  IFDEF .CRFOFF,.CRFOFF
719 IRPC Q,,0123456789
720         ADD SYM,%!Q!SQ(D)
721 TERMIN
722
723 IRPC Q,,ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890$%.
724 %!Q!SQ: 0
725         SQUOZE 0,Q/50/50/50/50/50
726         SQUOZE 0,Q/50/50/50/50
727         SQUOZE 0,Q/50/50/50
728         SQUOZE 0,Q/50/50
729         SQUOZE 0,Q/50
730         SQUOZE 0,Q
731 TERMIN
732 IFDEF .CRFON,.CRFON
733
734 ;FORMAT TABLE(S)
735 ;4.9-4.4 ETC SPECIFY SHIFT
736 ;4.4-3.6 ETC SPECIFY NUMBER BITS
737 ;FIELD SPECS IN REVERSE ORDER
738
739 IFORTB: 0               ;NCNSN 10 ,
740         0               ;NCNSF 11 IMPOS
741         0               ;NCNCN 12 ,,
742         2200,,          ;NCNCF 13 ,,C
743         2200000000      ;NCFSN 14 ,B
744         0               ;NCFSF 15 ,B C
745         0               ;NCFCN 16 ,B,
746         0               ;NCFCF 17 ,B,C
747         4400000000      ;FSNSN 20 A
748         0               ;FSNSF 21 IMPOS
749         0               ;FSNCN 22 IMPOS
750         0               ;FSNCF 23 IMPOS
751         2200440000      ;FSFSN 24 A B
752         2200220044      ;FSFSF 25 A B C
753         270400440000    ;FSFCN 26 A B,
754         2227040044      ;FSFCF 27 A B,C
755         4400000000      ;FCNSN 30 A,
756         0               ;FCNSF 31 IMPOS
757         22220000        ;FCNCN 32 A,,
758         2200002222      ;FCNCF 33 A,,B
759         2200440000      ;FCFSN 34 A,B
760         0               ;FCFSF 35 A,B C
761         0               ;FCFCN 36 A,B,
762         0               ;FCFCF 37 A,B,C
763 FRTBL==.-IFORTB ;LENGTH OF FORMAT TABLE
764 VBLK
765 FORTAB: BLOCK FRTBL     ;ACTUAL FORMAT TABLE
766 FRTBE=.-1
767 PBLK
768 \f
769 ;VARIABLE STORAGE
770
771 VBLK
772
773 RETURN: JRST .  ;RH HAS RETURN ADR FOR END OF MAJOR ROUTINE (E.G PASS 2)
774 CDISP:  0       ;CURRENT DISPATCH CODE
775 PPRIME: 0       ;PUSH DOWN LIST MARKER  (GETFLD)
776 SCNDEP: 0       ;DEPTH IN SUCCESSFUL BRACKET CONDITIONALS INSIDE INNERMOST LITERAL.
777 CONDLN: 0       ;LINE NUMBER AT WHICH LAST TOP LEVEL SUCCESSFUL CONDITIONAL ENCOUNTERED
778 CONDPN: 0       ;PAGE NUMBER-- PRINT THESE IF REACH END AND CONDITIONAL NOT TERMINATED
779 CONDFI: 0       ;SIXBIT FN1 OF FILE CONTAINING LAST TOP LEVEL SUCCESSFUL CONDITIONAL.
780 A.SUCC: 0       ;NONZERO IFF LAST CONDITIONAL SUCCEEDED.
781 ASMOUT: 0       ;0 NORMAL, 1 WITHIN <>, 2 IN (), 3 IN [].
782 ASMDSP: ASSEM3  ;PLACE TO JUMP TO FROM ASSEM1 LOOP.
783                 ;ASSEM3 NORMAL. ASSEMC IF WITHIN <>, () OR []
784                 ;AND .MLLIT ISN'T POS.  LSSTHA AFTER > OR ) SEEN.
785                 ;[ ;CONND AFTER ] SEEN.
786 ASMDS1: 0       ;ASMDSP SAVED HERE DURING ASCII, SIXBIT PSEUDOS.
787 ASSEMP: 0       ;RESTORE P FROM HERE AT ASSEM1. SAVED OVER LITERAL.
788 ASMI:   0       ;REINIT I AT ASSEM2 FROM ASMI.
789 GLSPAS: 0       ;RESTORE GLSP1  AT ASSEM1. SAVED OVER LITERAL.
790 GLSP1:  0       ;POINTER TO BOT OF LINKAGE TABLE IN USE HIGH ADR
791 GLSP2:  0       ;POINTER TO TOP OF LINKAGE TABLE IN USE LOW ADR
792 FORMAT: 0       ;ACCUMULATES FORMAT WORD
793 FORPNR: 0       ;POINTER INTO FORMAT WORD, SHOULD BE FORMAT+1 SO CLOBBERABLE BY LAST IDPB
794 FLDCNT: 0       ;NUMBER OF FIELDS PUSHED DOWN IN CURRENT WORD
795 WRD:    0       ;ACCUMULATES VALUE OF WORD
796 WRDRLC: 0       ;RELOC OF WRD, MUST COME RIGHT AFTER WRD.
797 T1:     0       ;TEMP
798 T2:     0       ;TEMP
799 PBITS1: 0       ;CURRENT CODE BITS
800 PBITS2: 0       ;NO OF SPECS LEFT IN CURRENT WORD
801 PBITS4: 0       ;POINTER TO WHERE CURRENT CODE BITS WILL GO
802 OPT1:   0       ;POINTER FOR STORING IN BKBUF (OUTPUT BUFFER)
803 CONTRL: 0       ;FLAG REG FOR IO CONTROL ETC, .GE. 0 => RELOCATABLE/1PASS
804 CDATBC: 0       ;CURRENT DATA BLOCK CODE TYPE
805 SCKSUM: 0       ;CKSUM FOR SIMPLE BLOCK FORMAT
806 IFN A1PSW,[
807 PRGC:   -1      ;ONE LESS THAN # TIMES END HAS BEEN ENCOUNTERED
808 OUTN1:  -1      ;.GE. 0 => OUTPUT HAS OCCURED IN OTHER THAN 1PASS MODE (NOT INITIALIZED)
809 OUTC:   -1      ;.GE. 0 => OUTPUT HAS OCCURED DURING CURRENT ASSEMBLY
810 ]
811 LINKL:  0       ;SAVE LIMIT OF GLOTB  GETWRD
812 STRCNT: 0       ;COUNT OF CHARS READ (INCL. DELIM) BY GSYL
813 STRPNT: 0       ;TEMP AT GSYL, BYTE POINTER TO STRING STORAGE
814 ISYMF:  -1      ;-1 IF ISYMS HAVE NOT BEEN SPREAD
815 SMSRTF: -1      ;-1 IF SYMTAB HASN'T BEEN SORTED (PSEUDOS DELETED)
816 BITP:   0       ;BYTE PNTR TO CODE BITS IN CURRENT (RELOC) BLOCK
817 LDCCC:  0       ;DEPTH IN LOADTIME CONDS
818 PARBIT: 0       ;0 OR 4 FOR : OR = (IN GENERAL, TEMP AT P7X)
819 LABELF: 0       ;-1 IN COLON, SOMETIMES IN EQUAL. CAUSES 3LABEL TO BE SET.
820 STGSW:  0       ;NON ZERO GIVES ERROR PRINT ON STORAGE WORDS
821 HKALL:  0       ;NONZERO => HALF-KILL ALL LABELS (.HKALL'S VALUE)
822 LITSW:  0       ;-1 => USING A LITERAL GIVES AN ERROR
823 QMTCH:  0       ;-1 => ' AND " NEED MATCHING CLOSINGS (A LA FAIL, MACRO-10)
824 STARTA: 0       ;STARTING ADDRESS FOR SBLK, RIM
825 DECBRK: 0       ;LARGEST RELOC. ADDR. LOADED INTO. (USED FOR DEC FMT)
826 DECBRA: 0       ;LARGEST ABS. ADDR LOADED INTO.
827 DECBRH: 0       ;LIKE DECBRK BUT FOR ADDRS IN HI SEG.
828 DECTWO: MOVE    ;NOT = MOVE => .DECTWO WAS DONE, AND THIS WD HAS
829                 ;ADDR START OF HISEG.
830 ISAV:   0       ;I FROM FIELD AT AGETFLD
831 A.PASS: 0       ; .PASS INTSYM, # OF THIS PASS.
832 A.PPAS: 0       ;.PPASS INTSYM, # OF PASSES.
833 WPSTE:  NRMWPS  ;# WORDS PER SYMTAB ENTRY
834 WPSTE1: NRMWPS-1;ONE LESS THAN WPSTE - FOR SPEED.
835 WPSTEB: ,-NRMWPS(B)     ;RH HAS - # WORDS PER SYMTAB ENTRY; LH HAS INDEX OF B.
836 SYMSIZ: 0       ;#WDS IN SYMTAB = WPS*<SYMLEN>
837 SYMLEN: SYMMSZ  ;SYMTAB SIZE (# SYMS)
838         ;ASSEMBLED-IN VALUE USED AS DEFAULT,  ONLY IF NON-TS.
839 SYMAOB: 0       ;-<# SYMS>,,0
840 INICLB: 0       ;-1 IF INITIALIZATION CODE CLOBBERED.
841 TTYINS: 0       ;AT START OF ASSEMBLY, -1 => .INSRT TTY PASS1, -2 => PASS2 ALSO.
842 IFN FASLP,[
843 FASBP:  0       ;PNTR TO FASL OUTPUT BUFFER
844 FASATP: 0       ;PNTR TO FASL ATOM TABLE
845 FASAT1: 0       ;PNTR TO FASL ATOM TABLE AFTER READING IN NEW ATOM
846                 ; (MAYBE UPDATE FASATP TO THIS IF ATOM WAS UNIQUE9
847 FASAT2: 0       ;BYTE PNTR USED TO STORE ATOM IN
848 FASIDX: 0       ;INDEX NEXT ATOM LOADED INTO FASAT WILL BE
849 FASPCH: 0       ;AMOUNT OF FASAT "PUNCHED"
850 FASCBP: 440400,,FASB    ;BYTE PNTR TO FASL CODE BIT WORD
851 FASPWB: 0       ;FASL CODE AT PWRD
852 FASBLC: 0       ;LOSING BLOCK "COUNT"
853 FASBLS: 0       ;LOSING BLOCK "SYMBOL"
854 AFRLD:  0       ;LIST READ CURRENT DEPTH
855 AFRLEN: 0       ;LIST READ CURRENT LENGTH
856 AFRDTF: 0       ;LIST READ DOT CONTEXT FLAG (0 NORMAL, 1 SAW DOT, 2 SAW "FROB AFTER DOT"
857 AFRFTP: 0       ;LIST READ SAVED STATE OF FASATP
858 AFLTYP: 0       ;TYPE LIST OP IN- 0 EVAL AND THROW AWAY VALUE
859                         ;1 "RETURN" LIST
860                         ;2 "RETURN" VALUE OF LIST
861 ]
862 PBLK
863 \f
864                 ;INFO CONVENIENT TO ANYONE GENERATING AN OUT OF TIME-SHARING MIDAS
865
866 ;MIDAS OUT OF TIME-SHARING ASSEMBLES INTO A COLLECTION OF SUBROUTINES
867 ;IO IS EXPECTED TO BE HANDLED BY OTHER PROGRAMS.
868
869 ;EXITS FROM THE ASSEMBLER:
870 ;TPPB OUTPUT BINARY WORD IN A
871 ;TFEED IF OUTPUT DEVICE IS PTP, PUNCH OUT # FRAMES OF BLANK TAPE
872         ;SPECIFIED BY B, MAY CLOBBER A AND B
873 ;GO2 RETURN POINT FROM FATAL ERRORS
874 ;TYO TYPE OUT CHARACTER IN A
875 ;TAB TYPE OUT A TAB (MAY CLOBBER A OF COURSE)
876 ;RCHTBL SEE THE RCH ROUTINES
877
878 ;ENTRIES
879
880 ;PDL, LPDL MAY BE USED BY COMMAND PROCESSOR BUT WILL BE CLOBBERED BY MAIN ROUTINES
881 ;MAIN ROUTINES, CALLED WITH JSP A, , CLOBBER THE WHOLE WORLD (INCLUDING P)
882 ;INIT INITIALIZE
883 ;PS1 PASS 1
884 ;PLOD IF APPROPRIATE, PUNCH OUT LOADER
885 ;PS2 PASS 2 (DOES ITS OWN PARTIAL INITIALIZATION)
886 ;PSYMS PUNCH OUT SYMBOL TABLE
887
888 ;OTHER ENTRIES
889
890 ;CONTRL AFTER ASSEMBLY, .GE. 0 => RELOCATABLE, .LT. 0 => ABSOLUTE
891 ;ISYMF -1 IF SYMS HAVE NOT BEEN SPREAD, ELSE DON'T TRY TO ADD TO INITIAL SYMBOL TABLE
892 ;SMSRTF -1 IF SYMTAB HASN'T BEEN SORTED, ELSE SYMTAB CLOBBERED, DON'T RE-ASSEMBLE
893 ;MIDVRS .FNAM2 OF MIDAS ENGLISH
894
895 ;SOME FF FLAGS ARE GLOBAL SO COMMAND PROCESSOR CAN KNOW WHAT'S HAPPENED ON RETURN
896
897 ;COMMAND PROCESSOR MAY ADD TO INITIAL SYMBOL TABLE BEFORE CALLING INIT THE FIRST TIME
898 ;EISYMT IS THE FIRST LOCATION OK TO DUMP INTO
899 ;EISYMP RH SHOULD BE SET BY COMMAND PROCESSOR TO FIRST LOC NOT DUMPED INTO
900 ;INTSYM RH OF SYMTAB VALUE TO RETURN VALUE ADDRESSED BY LH(SYMTAB ENTRY)
901
902 ;RCH HAS AN ELABORATE SET OF GLOBALS, WHICH I DON'T FEEL LIKE PUTTING DOWN NOW, BUT THEY INCLUDE
903 ;RCH (GET CHAR) SEMIC, RRL1, RREOF, SEMICR, SEMIC, TYPCTL, GDTAB, CPGN, CLNN,
904 ;RCHMOD, MDSCLR, MDSSET, RCHSET, POPLMB, PSHLMB
905 ;ALSO RCHTBL ONLY EXIT
906
907 ;LISTING FEATURE GLOBALS:
908 ;PILPT PRINT CHAR IN A
909 ;LISTON LISTING ON/OFF FLAG, -1 => ON
910 ;LISTP SAME WORD AS LISTON.
911 ;LISTP1 POSITIVE => LIST EVEN ON NON-PUNCHING PASS.
912 ;LPTCLS END OF LISTING, PRINT FORM FEED, IF TS THEN CLOSE LPT
913
914 ;CREF FEATURE GLOBALS:
915 ;CRFOUT OUTPUT WORD IN A.
916 ;CREFP -1 => REQUEST GENERATION OF CREF OUTPUT.
917 ;THE RUBOUT-B-^W HEADER, THE SET-SOURCE-FILE BLOCK, AND THE EOF BLOCK
918 ;ARE THE RESPONSIBILITY OF THE COMMAND PROCESSOR.
919 \f
920 ;;RCH           ;CHARACTER INPUT ROUTINES
921
922 IFN RCHASW\MACSW,[
923                 ;SAVE LIMBO1 STATUS AND RH(B)
924                 ;THEN SET UP FOR NEW INPUT MODE (DESCRIPTOR IN A)
925                 ;CALLED BY PUSHEM AND PUSHTT
926
927 PSHLMB: HRL B,LIMBO1    ;LAST CHARACTER INPUT
928         TLZE FF,FLUNRD  ;RE-INPUT CHARACTER ON RETURN?
929         XCT LSTPLM      ;SET B'S SIGN; IF LISTING, JRST PSHLML.
930 PSHLMN: EXCH A,RCHMOD   ;GET OLD MODE IN A
931         DPB A,[360500,,B]       ;STORE IN 5 OF HIGH 6 BITS IN B
932         PUSH F,B        ;SAVE RESULTANT CRUD
933         CAMN A,RCHMOD   ;COMPARE NEW WITH OLD
934         POPJ P,         ;SAME => SKIP OVERHEAD OF SETTING NEW MODE
935         MOVE A,RCHMOD   ;NOW GET NEW MODE
936         JRST PSHLM1     ;SET UP INSTRUCTIONS FOR NEW MODE
937
938 IFN LISTSW,[
939 ;IF LISTING, LSTPLM HOLDS JRST PSHLML
940 PSHLML: AOSN PNTSW
941         JRST PSHLMM     ;LAST WAS BREAK CHR
942         REPEAT 4,IBP PNTBP
943         SOSA PNTBP
944 PSHLMM: SETOM LISTBC
945         TLO B,400000
946         JRST PSHLMN
947 ]
948
949                 ;UNDO A PSHLMB (NOTE: IN COMMENTS BELOW, "NEW" MODE IS ON PDL, OLD IN RCHMOD)
950
951 POPLMB: POP F,A         ;GET WORD THAT PSHLMB PUSHED
952         HLRZS A         ;JUST INTERESTED IN LEFT HALF
953         TRZE A,400000   ;SIGN BIT SET?
954         TLOA FF,FLUNRD  ;YES, SET FLAG TO RE-INPUT LAST CHAR
955         TLZA FF,FLUNRD  ;NO, CLEAR FLAG.
956         XCT POPLML      ;JFCL\IDPB A,PNTBP ;THE LATTER IFF LISTING.
957         SETZM LIMBO1    ;INITIALIZE FOR DPB
958         DPB A,[700,,LIMBO1]     ;RESTORE LIMBO1
959         LSH A,-<18.-6>  ;RIGHT JUSTIFY RCHMOD DESCRIPTOR
960         CAMN A,RCHMOD   ;COMPARE NEW MODE WITH OLD
961         POPJ P,         ;SAME => SKIP OVERHEAD OF SETTING NEW MODE
962         JRST RCHSET     ;SET UP FOR NEW MODE AND RETURN
963 ]
964 \f
965
966 FOO==0          ;INITIALIZE COUNTER FOR FOLLOWING
967
968 DEFINE RCHBLT SIZE,ADR/
969         MOVSI T,FOO(A)
970         HRRI T,ADR
971         BLT T,<SIZE>-1+ADR
972 FOO==FOO+<SIZE>
973 TERMIN
974
975 DEFINE RCHMOV ADR/
976         MOVE T,FOO(A)
977         MOVEM T,ADR
978 FOO==FOO+1
979 TERMIN
980
981                 ;SET UP FOR INPUT OF MODE TYPE SPECIFIED IN A, CLOBBER A ONLY
982
983 RCHSET: MOVEM A,RCHMOD  ;STORE NEW RCHMOD
984 PSHLM1: TLZ FF,FLMAC\FLTTY      ;CLEAR FLAGS (MAYBE DEVICE ROUTINE SETS ONE)
985         XCT RCHTBL(A)   ;GET IN A A POINTER TO A DESCRIPTOR TABLE (MAYBE ALSO SET FLAG)
986         PUSH P,T        ;SAVE T, NEED IT FOR TEMP
987         RCHBLT 3,RCH2   ;FIRST 3 WORDS RCH2
988         TLNE FF,FLVOT
989         JRST POPTJ      ;ALL RCH'S TO GO THROUGH RCH, DON'T DO ANYTHING ELSE
990 MDSST1: RCHBLT 3,RR1    ;NEXT 3 RR1
991         RCHMOV RRL1     ;NEXT WORD RRL1
992 RCHPSN==FOO             ;# WORDS IN ALL TABLES BUT LAST (NOT OF CONSTANT LENGTH)
993         RCHBLT 6,SEMIC  ;LAST N SEMIC
994 POPTJ:  POP P,T
995         POPJ P,
996
997 IFN LISTSW,[
998                 ;SET UP TO "DISPLAY" (ALL RCH'S THROUGH RCH)
999
1000 MDSSET: TLO FF,FLVOT    ;SET FLAG
1001         MOVEI A,MDSSTB-3        ;SET UP AC
1002         PUSH P,T        ;SAVE T FOR RESTORATION
1003         JRST MDSST1     ;NOW SET UP
1004
1005 MDSSTB: JRST RRL1       ;RR1
1006         HALT
1007         PUSHJ P,RCH     ;RREOF
1008
1009         PUSHJ P,RCH     ;RRL1
1010 IFN .-<MDSSTB-3>-RCHPSN,.ERR LOSSAGE AT MDSSTB.
1011         PUSHJ P,RCH     ;SEMIC
1012         CAIE A,15
1013         JRST SEMIC
1014         JRST SEMICR
1015
1016                 ;CLEAR OUT DISPLAY MODE
1017
1018 MDSCLR: TLZ FF,FLVOT    ;CLEAR FLAG
1019         MOVE A,RCHMOD
1020         JRST RCHSET     ;NOW SET UP FOR REAL IN CURRENT MODE
1021 ] ;END IFN LISTSW,
1022 \f
1023 IFN TS,[        ;TABLE FOR  RCHSET, INDEXED BY MODE
1024                 ;MAYBE THIS CONDITIONAL WANTS TO BE CHANGED TO SOMETHING ELSE
1025
1026 RCHTBL: MOVEI A,RCHFIL          ;0 => INPUT FROM FILE
1027 IFN MACSW,PUSHJ P,RCHMAC        ;1 => INPUT FROM MACRO (DO NOT CHANGE, USED BY MACRO PROCESSOR)
1028 IFN RCHASW,[IFE MACSW,HALT
1029         PUSHJ P,RCHTRC          ;2 => TTY, QUIT ON CR
1030         PUSHJ P,RCHARC          ;3 => TTY, DON'T QUIT ON CR
1031 ]
1032         ;TABLE FOR INPUTTING FROM FILE
1033                 ;MAYBE THIS CONDITIONAL ALSO WANTS TO BE CHANGED
1034
1035 RCHFIL: ILDB A,UREDP    ;GETCHR, GET CHARACTER
1036         CAIG A,14       ;SKIP IF TOO BIG TO BE SPECIAL
1037         XCT RPATAB(A)   ;SPECIAL, DO THE APPROPRIATE THING
1038
1039         JRST RRL1       ;RR1
1040         HALT
1041         PUSHJ P,INCHR3  ;RREOF
1042
1043         ILDB A,UREDP    ;RRL1
1044 IFN .-RCHPSN-RCHFIL,.ERR RCHFIL LOSES.
1045         LDB CH1,[360600,,UREDP] ;SEMIC; FIND WHERE IN ITS WORD UREDP POINTS
1046         IDIVI CH1,7
1047         JRST @SEMIC3(CH1)       ;AND ENTER THE CR-SCANNING LOOP AT THE APPROPRIATE
1048         JFCL                    ;PLACE (IT IS A WORD-BY-WORD LOOP).
1049
1050                 ;TABLE FOR ABOVE, EXECUTED INDEXED BY CHAR, 15 ONLY FROM SEMIC ELSE ANYTHING
1051
1052 RPATAB:
1053 IFN ITSSW,      JFCL            ;0, ON I.T.S. IS NORMAL CHARACTER
1054 .ELSE   CALL RPANUL     ;0, ON DEC SYSTEM, IGNORE IT.
1055         JFCL
1056         JFCL
1057 IFN .-RPATAB-EOFCH,.ERR EOFCH DOESN'T AGREE WITH ENTRY IN RPATAB.
1058         PUSHJ P,INCHR3  ;3, EOFCH
1059         REPEAT 6,JFCL
1060         CALL RPALF      ;LINE FEED
1061         JFCL            ;13
1062         PUSHJ P,RPAFF   ;FORM FEED
1063         JRST SEMICR     ;FROM SEMIC ONLY, EXIT FROM LOOP
1064
1065 RPAFF:  SKIPE ASMOUT    ;FORM FEED
1066          ETR [ASCIZ/Formfeed within <>, () or []/]
1067         AOS CH1,CPGN
1068         SETOM CLNN
1069 IFN ITSSW,[
1070         ADD CH1,[SIXBIT /P0/+1]
1071         MOVE CH2,A.PASS
1072         DPB CH2,[300200,,CH1]
1073         .SUSET [.SWHO3,,CH1]    ;PUT THE NEW PAGE # IN THE WHO-LINE.
1074 ]
1075 RPALF:  AOS CH2,CLNN
1076         CAME CH2,A.STPLN
1077          RET
1078         MOVE CH1,CPGN
1079         CAMN CH1,A.STPPG
1080          SETOM TTYBRF
1081         RET
1082
1083 IFN DECSW,[
1084 RPANUL: MOVE CH1,@UREDP ;SAW A NULL - IN A LINE NUMBER?
1085         TRNN CH1,1
1086          JRST RCHTRA    ;NO, JUST IGNORE IT.
1087         MOVEI CH1,010700
1088         HRLM CH1,UREDP  ;YES, SKIP THIS WHOLE WORD, THEN
1089         CALL RCH        ;SKIP THE 1ST CHAR AFTER THE LINE NUMBER
1090         JRST RCHTRA     ;RETURN THE NEXT CHAR FROM THIS CALL TO RCH.
1091 ]
1092 ] ;END IFN TS,
1093 \f
1094 VBLK
1095 LIMBO1: 0               ;LAST CHARACTER READ BY RCH
1096 RCHMOD: 0               ;CURRENT INPUT MODE, 0 => INPUT FROM FILE, 1 => MACRO, ETC.
1097 CLNN:   0       ;1 LESS THAN LINE # IN CURRENT INPUT FILE.
1098 CPGN:   0       ;1 LESS THAN PAGE # IN CURRENT INPUT FILE
1099 A.STPL: 0       ;1 LESS THAN LINE # TO STOP AT.
1100 A.STPP: 0       ;1 LESS THAN PAGE # TO STOP AT.
1101                 ;(STOPPING MEANS INSERTING THE TTY)
1102
1103 ;READ CHARACTER INTO A FROM INPUT FILE, MACRO, OR WHATEVER (RCH)
1104 ;CLOBBERS A,CH1,CH2.
1105
1106 RCH:    TLZE FF,FLUNRD
1107         JRST RCH1       ;RE-INPUT LAST ONE MAYBE GET HERE FROM RCH2+2
1108 RCH2:   HALT    ;ILDB A,UREDP   ;ILDB A,CPTR    ;GET CHAR
1109         0       ;CAIG A,14      ;TRZE A,200     ;CHECK FOR SPECIAL
1110         0       ;XCT RPATAB(A)  ;PUSHJ P,MACTRM ;SPECIAL, PROCESS
1111         MOVEM A,LIMBO1  ;GOT CHAR, SAVE AS LAST CHAR GOTTEN
1112 IFE TS,RCHLS1==JRST TYPCTL
1113 IFN TS,RCHLS1==RET      ;DEFAULT CONTENTS OF RCHLST (IF NOT LISTING)
1114 RCHLST: RCHLS1          ;AOSN PNTSW IF LISTING.
1115 IFN LISTSW,[
1116         PUSHJ P,PNTR
1117         CAIG A,15
1118         JRST RCHL1
1119 RCHL3:  IDPB A,PNTBP
1120 TYPCTL: POPJ P, ;OR JRST SOMEWHERE
1121 PBLK
1122
1123 RCHL1:  CAIE A,15
1124         CAIN A,12
1125         JRST RCHL2
1126         CAIE A,14
1127         JRST RCHL3
1128 RCHL2:  MOVEM A,LISTBC
1129         SETOM PNTSW
1130         JRST TYPCTL
1131
1132 VBLK
1133 RCH1:   MOVE A,LIMBO1
1134 RCH1LS: RET             ;OR CAILE A,15 IF LISTING.
1135         RET             ;NEEDED IN CASE LISTING.
1136         CAIE A,15
1137         CAIN A,12
1138         JRST RCHL2
1139         CAIE A,14
1140         POPJ P,
1141         JRST RCHL2
1142 PBLK
1143 ] ;END IFN LISTSW,
1144
1145 IFE LISTSW,[
1146 PBLK
1147 RCH1:   MOVE A,LIMBO1
1148         RET
1149 ] ;END IFE LISTSW,
1150 \f
1151 ;;GETSYL                ;VARIOUS SYLLABLE READING ROUTINES (BUT NOT ALL OF THEM)
1152
1153 GSYL:   CLEARB SYM,STRCNT
1154 GSYL1:  MOVEI D,6
1155         MOVE T,[440700,,STRSTO]
1156         MOVEM T,STRPNT
1157 GSYL3:  AOSG A,STRCNT
1158         JRST (F)
1159         PUSHJ P,RCH
1160         IDPB A,STRPNT   ;STORE CHAR IN STRING EVEN IF DELIMITER (MINIMUM STRCNT = 1)
1161 A.GSY2: CAIN A,".
1162         JRST GSYL1C
1163         HLRZ CH1,GDTAB(A)
1164         CAIN CH1,(JSP CH2,)
1165         JRST GSYL1A     ;NUMBER
1166         PUSHJ P,GSYL1B  ;RETURN ONLY ON SYL SEP
1167         HRRZ A,GDTAB(A)
1168         MOVE T,LIMBO1
1169 C%:     POPJ P,"%
1170
1171 GSYL1B: XCT GDTAB(A)    ;POPJ FOR SYL SEPS
1172         SUB P,[1,,1]
1173 GSYL1D: SOJGE D,GSYL3
1174         AOJA D,GSYL3
1175
1176 GSYL1C: ADD SYM,%.SQ(D)
1177         JRST GSYL1D
1178
1179 GSYL1A: XCT NSQTB-60(A)
1180         JRST GSYL1D
1181
1182                 ;VERSION OF GETSYL TO TRY UNTIL SYL OR WORD TERMINATOR FOUND
1183                 ;SKIPS IF NAME THERE (FOR .TYPE, SQUOZE)
1184
1185 GTSLD2: TLNN C,DWRD\DFLD
1186         JRST GTSLD3     ;DELIMITER IS WORD TERMINATOR, TOLERATE THE NULL SYLLABLE
1187 GETSLD: PUSHJ P,GETSYL  ;ENTRY, GET A SYL
1188         MOVE C,CDISP    ;GET CDISP
1189         TRNN I,IRSYL
1190         JRST GTSLD2     ;NO SYL
1191         AOS (P)         ;GOT SYL, CAUSE RETURN TO SKIP
1192 GTSLD3: TLNN C,DWRD\DFLD
1193         TLO FF,FLUNRD   ;CAUSE DELIMITER TO BE RE-INPUT
1194         POPJ P,
1195
1196 PASSPS: SKIPA A,LIMBO1
1197 GPASST:  CALL RCH
1198         CAIE A,40
1199          CAIN A,^I
1200           JRST GPASST
1201         RET
1202 \f
1203 GETSYL: TLZ I,ILUARI+ILNPRC+ILLSRT
1204 GTSL1:  CLEARB SYM,NUMTAB       ;RECUR HERE FOR RIGHT ARG TO ^ AND _.
1205         MOVE AA,[NUMTAB,,NUMTAB+1]
1206         AOSN NTCLF
1207         BLT AA,NUMTAB+10        ;NUMTAB NOT CLEAR, HAVE TO CLEAR IT
1208         MOVEI D,6       ;CHARACTER COUNTER FOR BUILDING UP SYM
1209         SETOM ESBK      ;NO SPECIFIC BLOCK DESIRED.
1210         TDZ I,[ILDECP+ILFLO+ILVAR+ILGLI,,IRPERI+IRLET+IRSYL]
1211 RRL2:   PUSHJ P,RR      ;CALL MAIN LOOP ROUTINE, READ UNTIL NON-SQUOZE CHAR
1212 SEMICR:         ;RETURN HERE FROM SEMIC WITH CR IN A
1213         MOVEM A,LIMBO1  ;SYLLABLE OPERATOR OR TERMINATOR IN A, SAVE
1214         HRRZ A,GDTAB(A) ;NOW GET RIGHT HALF OF POPJ, INDEX INTO DTB
1215         MOVE C,DTB-40(A)        ;GET DTB ENTRY (FLAGS,,JUMP ADR)
1216         MOVEM C,CDISP   ;STORE AS DISPATCH CODE FOR LAST CHAR (SORT OF AN INTERPRETED LIMBO1)
1217 RR8:    TLNE C,DSYL     ;NOW SEE IF SYL OPERATOR FLAG SET
1218         JRST (C)        ;SET => INTRA-SYLLABLE OPERATOR
1219 RR10:   TRNE I,IRLET    ;NOT SET => SYLLABLE TERMINATOR: SYL?
1220         POPJ P,         ;SYL HAS LETTERS
1221         TRNN I,IRSYL
1222         JRST CABPOP     ;NO SYL
1223         CAMN SYM,[SQUOZE 0,.]
1224         JRST PT1        ;SYM IS .
1225                 ;NUMBER
1226
1227 RR5:    TLNN I,ILNPRC
1228         PUSHJ P,NUMSL
1229         TLNN I,ILFLO
1230         JRST RR9        ;NOT FLOATING POINT
1231         MOVE A,B        ;FLOATING, HIGH IN AA,LOW IN A,EXP IN B
1232         ADDI A,306      ;201+105 TO ROUND
1233         ADDI AA,200     ;CAUSE EXPONENT TO BE ACCEPTABLE TO MACHINE
1234         JUMPGE AA,.+3   ;NOW CHECK FOR OVERFLOW ON ROUNDING
1235         LSH AA,-1       ;OVERFLOW, SHIFT BACK ONE
1236         AOS A           ;INCREMENT EXPONENT TO COMPENSATE FOR SHIFT
1237         EXCH A,AA       ;GET EXPONENT IN AA, REST IN A
1238         ASHC AA,-10     ;SHIFT TO MACHINE FLOATING POINT FORMAT
1239         SKIPE AA        ;NOW CHECK HIGH ORDER BITS OF EXPONENT NOT SHIFTED INTO NUMBER
1240         ETR [ASCIZ /Exponent overflow/]
1241 RR9:    TLZ I,ILGLI+ILVAR       ;NOT TRYING TO DEFINE NUMBER AS VARIABLE OR GLOBAL
1242 CLBPOP: TDZA B,B        ;CLEAR OUT B (RELOCATION BITS OF VALUE)
1243 CABPOP: SETZB A,B       ;DO JRST CABPOP TO RETURN ZERO AS VALUE
1244         POPJ P,
1245 \f
1246 RRU:    MOVE A,LIMBO1   ;GET HERE WHEN FLUNRD SET AT RR, RETRIEVE CHARACTER FROM LIMBO1
1247         CAIG A,14       ;IF TOO BIG,
1248         CAIGE A,12      ;OR IF TOO SMALL,
1249         JRST RR1B       ;THEN JUST FALL BACK IN
1250         TLNN FF,FLVOT\FLMAC\FLTTY       ;SKIP IF NOT HACKING CPGN/CLNN
1251         XCT RRUTAB-12(A)        ;HACKING, UNHACK FOR HACK COMING UP
1252         JRST RR1B       ;FALL BACK IN
1253
1254 RRUTAB: SOS CLNN        ;LINE FEED (TABLE FOR RRU)
1255         JRST RR1B       ;13
1256         SOS CPGN        ;FORM FEED
1257
1258                 ;MAIN LOOP ROUTINE FOR GETSYL, READ SYM OR NUMBER
1259 VBLK
1260 RR:     TLZE FF,FLUNRD  ;RE-INPUT LAST CHARACTER?
1261         JRST RRU        ;YES (SOMETIMES RETURN HERE FROM RREOF)
1262 RR1:    JRST RRL1       ;ILDB A,CPTR    ;GET CHAR (" " ")
1263         HALT            ;TRZE A,200     ;CHECK FOR END OF STRING
1264 RREOF:  PUSHJ P,RCH     ;PUSHJ P,MACTRM ;PROCESS CONDITION, GET NEXT CHAR OR JRST RR1 OR RR1-1
1265 RR1B:   XCT GDTAB(A)    ;GOT CHAR, DO SOMETHING APPROPRIATE (POPJ ON NOT SQUOZE)
1266         TROA I,IRLET\IRSYL      ;LETTERS RETURN, JUST UPDATED SYM, SET FLAGS
1267         TRO I,IRSYL     ;NUMBERS RETURN, SET FEWER FLAGS
1268         SOJGE D,RR1     ;DECREMENT SYM COUNTER AND LOOP
1269         AOJA D,RR1      ;COUNTER EXHAUSTED, INCREMENT BACK TO 0 AND LOOP
1270
1271 RRL1:   PUSHJ P,RCH     ;ILDB A,UREDP   ;GET CHAR
1272         XCT GDTAB(A)    ;NOW MAKE LIKE RR1B (EOFCH => JRST RREOF)
1273         TROA I,IRLET\IRSYL
1274         TRO I,IRSYL
1275         SOJGE D,RRL1
1276         AOJA D,RRL1
1277
1278                 ;SEMICOLON (GET HERE FROM RR8)
1279
1280         JRST SEMICL     ;RETURN HERE FROM SEMIC+2 WHEN FLUNRD SET
1281 ;NEXT 4 INSNS ALTERED IN DIFFERENT INPUT MODES. SEE RCHFIL, ETC.
1282 SEMIC:  PUSHJ P,RCH     ;GET CHAR
1283         CAIE A,15       ;SEE IF SPECIAL
1284         JRST SEMIC      ;SPECIAL => DO SOMETHING (JRST SEMICR ON CR)
1285         JRST SEMICR     ;IF NOT SPECIAL THEN GO BACK FOR NEXT CHAR
1286
1287 LOC SEMIC+6     ;LEAVE A LITTLE EXTRA ROOM FOR BIG ROUTINES
1288 PBLK
1289
1290 SEMICL: MOVE A,LIMBO1   ;HERE FROM SEMIC-1, RETRIEVE CHARACTER FROM LIMBO1
1291         CAIE A,15       ;SKIP IF SHOULD TERMINATE SCAN
1292         JRST SEMIC      ;NOT CR, FALL BACK IN
1293         JRST SEMICR     ;DONE
1294
1295 SEMIC2: 
1296 REPEAT 5,[
1297         ILDB A,UREDP
1298         CAIG A,15
1299          XCT RPATAB(A)
1300 ]
1301         MOVE A,[ASCII /@@@@@/]
1302 SEMIC1: AOS CH1,UREDP
1303         MOVE CH1,(CH1)  ;ANY CONTROL CHARS IN THE WORD UREDP POINTS AT?
1304         MOVE CH2,CH1
1305         AND CH1,A
1306         AND CH2,[ASCII/     /]
1307         LSH CH2,1
1308         IOR CH1,CH2
1309         CAMN CH1,A
1310          JRST SEMIC1    ;NO, ADVANCE TO NEXT WORD AND TEST IT.
1311         MOVEI A,440700
1312         HRLM A,UREDP
1313         JRST SEMIC2     ;YES, LOOK AT EACH CHAR AND PROCESS IT.
1314
1315 SEMIC3: REPEAT 6,JRST SEMIC2+3*<5-.RPCNT>
1316
1317
1318 \f
1319                 ;JSP CH2,RR2 => DIGIT (FROM GDTAB)
1320                 ;THIS ROUTINE IS GROSSLY SLOW, AND SHOULD BE SPEEDED UP SOMETIME
1321
1322 RR2:    XCT NSQTB-"0(A) ;UPDATE SQUOZE.
1323         TRNE I,IRLET
1324         JRST 1(CH2)     ;SYL IS SYM, DON'T WASTE TIME.
1325         TRNE I,IRPERI
1326         TLO I,ILFLO     ;DIGIT AFTER . => FLOATING.
1327 MAKNUM: SETOM NTCLF     ;NUMTAB ABOUT TO NOT BE CLEAR, SET FLAG FOR GETSYL TO CLEAR IT OUT NEXT TIME
1328         MOVEI AA,2      ;INDEX INTO NUMTAB ETC., SOJGE'D TO GET ALL RADICES
1329 MAKNM1: MOVE T,ARADIX(AA)       ;GET THIS RADIX,
1330         CAMN T,ARADIX   ;REDUNDANT => SKIP THIS PASS.
1331          JUMPN AA,MAKNM4
1332         SKIPGE CH1,HIGHPT(AA)
1333         JRST MAKNM3
1334         MUL T,LOWPT(AA) ;TT HAS OLD LOW TIMES RADIX, T HAS OVFLO TO HIGH.
1335         ADDI TT,-"0(A)  ;ADD DIGIT TO LOW PART
1336         TLZE TT,400000
1337         AOJ T,          ;OVERFLOW, INCREMENT SPILLOVER FROM MUL OF LOWPT
1338         JUMPE CH1,MAKNM5        ;OLG HIGHPT WAS 0 => SAVE TIME.
1339         JFCL 17,.+1     ;NOW CLEAR OV, ETC.
1340         IMUL CH1,ARADIX(AA)     ;MULTIPLY HIGHPT BY RADIX
1341         ADD T,CH1       ;ADD HIGH PARTS
1342         JFCL 10,MAKNM2  ;JUMP ON OVERFLOW FROM IMUL OR ADD
1343 MAKNM5: TLNE I,ILFLO
1344         SOS NUMTAB(AA)  ;FLOATING, DECREMENT EXP TO COMPENSATE FOR MULT OF HIGHPT/LOWPT
1345         MOVEM T,HIGHPT(AA)      ;NOW STORE STUFF BACK
1346         MOVEM TT,LOWPT(AA)
1347 MAKNM4: SOJGE AA,MAKNM1 ;NOW DO ALL THIS FOR NEXT RADIX
1348         JRST 1(CH2)
1349
1350 MAKNM2: MOVSI B,400000  ;OVERFLOW FROM UPDATING HIGH PARTS
1351         IORM B,HIGHPT(AA)       ;SET SIGN BIT
1352 MAKNM3: TLNN I,ILFLO
1353         AOS NUMTAB(AA)  ;NOT FLOATING, INCREMENT EXP, MAY NOT WANT TRAILING BITS
1354         JRST MAKNM4
1355
1356 VBLK
1357 NUMTAB: 0       ;EXPONENT
1358         0
1359         0
1360 HIGHPT: 0       ;HIGH PART OF CURRENT NUMBER THIS RADIX
1361         0       ;4.9 => OVERFLOW, TRAILING DIGITS DROPPED
1362         0
1363 LOWPT:  0       ;LOW PART OF CURRENT NUMBER THIS RADIX
1364         0       ;HIGHPT/LOWPT TAKEN AS 70. BIT POSITIVE INTEGER EXCEPT 4.9(HIGHPT) IS FLAG INSTEAD OF
1365         0       ;EXPONENTIATE 70. BIT INTEGER BY NUMTAB (WHICH MAY BE NEGATIVE) TO GET ACTUAL VALUE
1366 ARADIX: 10      ;CURRENT RADIX
1367         12
1368         10
1369
1370 NTCLF:  -1      ;-1 => NUMTAB NOT CLEAR (TO SAVE BLT AT GETSYL WHEN CLEAR)
1371 PBLK
1372 \f
1373                 ;JRST POINT => . (FROM GDTAB)
1374
1375 POINT:  TLO I,ILDECP    ;PREFER DECIMAL
1376         TROE I,IRPERI   ;SET PERIOD FLAG
1377         TRO I,IRLET     ;2 POINTS => NAME
1378         ADD SYM,%.SQ(D) ;UPDATE SYM
1379         JRST 1(CH1)     ;RETURN
1380
1381 RBRAK:  SOSL SCNDEP     ;IF A CONDITIONAL TO TERMINATE,
1382         JRST RBRAK2     ;HAVE DONE SO, IGNORE CHAR.
1383         SETZM SCNDEP
1384 ;CLOSES OF ALL KINDS COME HERE.
1385 RPARN:
1386 GRTHN:  MOVE A,LIMBO1
1387         SKIPE CH1,ASMOUT        ;WHAT KIND OF OPEN ARE WE IN?
1388         CAIN CH1,4      ;WITHIN A .ASCII OR
1389          JRST RBRAK1    ;NOT WITHIN GROUPING => THIS CLOSE IS STRAY.
1390         CAME A,ASMOT1(CH1) ;RIGHT KIND OF CLOSE FOR THAT OPEN?
1391          ERJ RBRAK3
1392 RBRAK4: MOVE CH1,ASMOT2(CH1)
1393         MOVEM CH1,ASMDSP ;ARRANGE FOR THIS ASSEM1 LEVEL TO EXIT
1394 RBRAK5: SETZM CDISP
1395         JRST RR10       ;AND GO TERMINATE WORD.
1396
1397 RBRAK3: CALL TYOERR     ;COME HERE ON CLOSE WRONG FOR OPEN.
1398                 ;(EG, ")" MATCHING "<").
1399         TYPR [ASCIZ/ Seen when /]
1400         MOVE A,ASMOT1(CH1)
1401         CALL TYOERR
1402         TYPR [ASCIZ/ expected
1403 /]
1404         JRST RBRAK4
1405
1406 RBRAK1: CAIN CH1,4      ;CLOSE INSIDE A .ASCII =>
1407          JRST RBRAK5    ;TERMINATE WORD BUT DON'T CLOSE ANYTHING.
1408         SKIPN CONSML    ;COME HERE FOR STRAY CLOSE.
1409          JRST RRL2
1410         ERJ .+1
1411         TYPR [ASCIZ/Stray /]
1412         MOVE A,LIMBO1   ;GET THE CLOSE WE SAW.
1413         CALL TYOERR
1414         CALL CRRERR
1415         JRST RRL2
1416
1417 ;COME HERE FOR CLOSE-BRACE, AND CERTAIN CLOSE-BRACKETS.
1418 RBRAK2: SETOM A.SUCC    ;HAVE JUST ENDED SUCCESSFUL BRACKETED CONDIT,
1419         JRST RRL2       ;REMEMBER THAT MOST RECENT CONDITIONAL WAS TRUE.
1420
1421 FORMF:  TLNN FF,FLVOT\FLMAC\FLTTY       ;FORM FEED SYLLABLE OPERATOR ROUTINE
1422          PUSHJ P,RPAFF  ;UNLESS ALREADY DONE, INCREMENT PAGE #.
1423         JRST RR10
1424
1425 LINEF:  TLNN FF,FLVOT\FLMAC\FLTTY       ;LINE FEED SYLLABLE OPERATOR ROUTINE
1426          CALL RPALF
1427         JRST RR10
1428
1429 CTLAT:
1430 IFN DECSW,[
1431         TLNN FF,FLVOT\FLMAC\FLTTY       ;^@ SYLLABLE OPERATOR ROUTINE.
1432          CALL RPANUL
1433 ]
1434         JRST RRL2
1435 \f
1436                 ;DECIPHER A VALUE FROM NUMTABS
1437                 ;LEAVES HIGH PART IN AA, LOW PART IN A, BINARY EXPONENT IN B
1438                 ;AND RADIX USED IN D.
1439
1440 NUMSL:  TLNN I,ILVAR\ILDECP\ILFLO
1441          SKIPE B,HIGHPT
1442           JRST NUMSLS
1443         MOVE A,LOWPT    ;BE VERY FAST IN CASE OF SMALL FIXNUM IN CURRENT RADIX.
1444         MOVE D,ARADIX   ;SAVE RADIX AND HIGH PART FOR ^.
1445         SETZ AA,
1446         RET
1447
1448 NUMSLS: CLEARB TT,D     ;TT BIT EXPONENT, D INDEX INTO NUMTAB, ETC.
1449         TLNE I,ILDECP+ILVAR     ;NEITHER . NOR ', CURRENT RADIX.
1450         TLNE I,ILGLI    ;" => CURRENT RADIX DESPITE . OR '.
1451          JRST NUMSL0
1452         MOVEI D,1       ;DECIMAL UNLESS '
1453         TLNE I,ILVAR    ;WHICH FORCES OCTAL.
1454          MOVEI D,2
1455         MOVE A,ARADIX(D)
1456         CAMN A,ARADIX   ;IF REALLY SAME AS CURRENT RADIX,
1457          MOVEI D,0      ;COMPUTATION WASN'T DONE FOR THIS VALUE OF D,
1458                         ;SO USE COMPUTATIONS DONE FOR CURRENT RADIX.
1459 NUMSL0: MOVE AA,HIGHPT(D)       ;AA := HIGH PART
1460         MOVE B,LOWPT(D)         ;B := LOW PART
1461         MOVE T,NUMTAB(D)        ;T := EXPONENT
1462         MOVE D,ARADIX(D)        ;NO LONGER NEED IDX, GET RADIX VALUE.
1463         TLNN I,ILFLO
1464          JRST FIXNUM    ;NOT FLOATING
1465         TLZ AA,400000   ;FLOATING, DON'T NEED DIGITS LOST ON OVERFLOW
1466 NUMC1:  JUMPN AA,.+2    ;ENTRY FROM UPARR
1467         JUMPE B,FIX0    ;COMPLETELY ZERO => RETURN FIXED ZERO
1468         JUMPL T,NUMSL1  ;JUMP IF EXPONENT NEGATIVE
1469         JUMPE T,NUMSL2  ;JUMP (SKIP FOLLOWING) IF EXPONENT ZERO
1470                 ;EXPONENT POSITIVE, DO THE APPROPRIATE THING
1471 NUMSL5: MULI B,(D)      ;MULITIPLY LOW PART BY RADIX
1472         MULI AA,(D)     ;MULTIPLY HIGH PART BY RADIX
1473         ADD A,B         ;A := LOW PART OF HIGH + HIGH PART OF LOW
1474         TLZE A,400000
1475         ADDI AA,1       ;OVERFLOW ON ADDITION, INCREMENT HIGH PART OF HIGH
1476         MOVE B,C        ;NO LONGER NEED HIGH OF LOW, GET LOW OF LOW IN B
1477 NUMSL3: JUMPE AA,NUMSL4 ;NOW CHECK FOR OVERFLOW INTO HIGH OF HIGH, JUMP ON NONE
1478         ASHC A,-1       ;NEXT THREE INSTRUCTIONS TO DO ASH3 AA,-1
1479         ASH A,1
1480         ASHC AA,-1
1481         AOJA TT,NUMSL3  ;INCREMENT BIT EXPONENT AND TRY AGAIN
1482
1483 NUMSL4: MOVE AA,A       ;FLUSHED OVERFLOW, NOW GET (LOW PART OF) HIGH PART IN AA
1484         SOJG T,NUMSL5   ;COUNT DOWN
1485
1486 NUMSL2: TLNN I,ILFLO
1487          JRST NUMSL9    ;NOT FLOATING, DON'T WASTE TIME NORMALIZING.
1488         SKIPA A,B       ;EXPONENT NOW ZERO, GET LOW PART OF NUMBER IN A
1489 NUMSL7: ASHC AA,1       ;NOW NORMALIZE
1490         TLNN AA,200000
1491         SOJA TT,NUMSL7
1492         SKIPA B,TT      ;DONE NORMALIZING, RETURN BINARY EXPONENT IN B
1493 PT1:    TRO I,IRLET
1494         POPJ P,
1495
1496 NUMSL9: MOVE A,B
1497         MOVEI B,0
1498         ASHC AA,(TT)    ;SHIFT 2-WD NUM. BY EXPONENT,
1499         LSH A,1         ;PUT HIGH BIT IN WITH REST.
1500         JRST FIX1
1501 \f
1502 FIX0:   TLZ I,ILFLO
1503 FIXNUM: LSHC A,45
1504 FIX1:   LSHC AA,-1
1505         JUMPE AA,.+2
1506         ETR [ASCIZ /FIXNUM too big for 36 bits/]
1507         POPJ P,
1508
1509 NUMSL1: SKIPA A,B       ;EXPONENT NEGATIVE: NORMALIZE NOW
1510 NUMSL8: ASHC AA,1
1511 NUMSL6: TLNN AA,200000
1512         SOJA TT,NUMSL8  ;NOT NORMALIZED YET
1513         AOS T
1514         MOVEI TM,(D)
1515         TLNN TM,-1      ;GET CONVIENT POWER OF RADIX
1516         JUMPL T,[       IMULI TM,(D)
1517                         AOJA T,.-1]
1518         MOVE B,A        ;GET NORMALIZED LOW PART IN B
1519         IDIV AA,TM      ;DIVIDE HIGH PART BY APPROPRIATE RADIX
1520         DIV A,TM
1521         JUMPL T,NUMSL6
1522         MOVE B,A
1523         JRST NUMSL2
1524
1525 UPARR:  TRON I,IRSYL
1526          JRST UPCTRC    ;"UNARY UPARROW" => GOBBLE CHARS
1527         TRNE I,IRLET
1528          ETR [ASCIZ /Symbolic 1st arg to "^"/]
1529         PUSHJ P,NUMSL   ;DECIPHER NUMTABS
1530         PUSHJ P,UA3     ;GET RIGHT OPERAND IN T
1531         MOVE TT,B       ;EXPONENT
1532         MOVE B,A        ;LOW PART
1533         PUSHJ P,NUMC1   ;T EXP HIGH IN AA LOW IN B TT BIN EXP
1534         MOVE C,CDISP    ;IF A _ WAS DEFERRED WHILE ILUARI WAS SET,
1535         TLO I,ILNPRC
1536         CAME C,[DSYL,,BAKAR] ;DO IT NOW.
1537          JRST RR10
1538
1539 BAKAR:  TLNE I,ILUARI
1540         JRST RR5        ;RETURN TO UPARROW (WILL COME BACK HERE LATER)
1541         TRNE I,IRSYL
1542         TRNE I,IRLET
1543         JRST BAK1       ;NO SYL, OR SYL IS NAME
1544         CAMN SYM,[SQUOZE 0,.]
1545         JRST BAK1       ;. ALSO NAME
1546         TLZN I,ILNPRC
1547         PUSHJ P,NUMSL
1548         PUSHJ P,UA3
1549         ADD B,T
1550         ASHC AA,(B)
1551         LSH A,1
1552         LSHC AA,-1
1553         CLEARB B,AA
1554         TLZ I,ILFLO
1555         MOVE C,[DFLD,,CBAKAR]
1556         EXCH C,CDISP    ;IF 2ND ARG ENDED WITH A _, TURN INTO FIELD OP.
1557         CAME C,[DSYL,,BAKAR]
1558          EXCH C,CDISP
1559         POPJ P,
1560 \f
1561 UPCTRC: SETZ T,
1562 UPCTR1: JSP F,QOTCOM    ;UP ARROW TO GOBBLE SYL AND RETURN MASKED ASCII VALUE
1563         LSH T,7         ;SHIFT ACCUMULATED VALUE OVER 7
1564         ANDI A,77       ;NOW MASK CHARACTER IN TO TO BOTTOM 6 BITS
1565         ADD T,A         ;ADD TO ACCUMULATED
1566         POPJ P,
1567
1568 BAK1:   MOVE TT,[DFLD,,CBAKAR]
1569         MOVEM TT,CDISP
1570         JRST RR10
1571
1572 UA3:    HRLM D,(P)      ;SAVE RADIX (FOR UPARR)
1573         JSP LINK,SGTSY  ;PUSH I,AA,A,B
1574         TLO I,ILUARI    ;TELL _ TO WAIT TILL LATER (SEE UPARR, BAKARR)
1575         PUSHJ P,RCH
1576         CAIN A,"-
1577         TROA I,IRGMNS
1578         TLO FF,FLUNRD
1579         PUSHJ P,RCH
1580         CAIN A,"<
1581         JRST UAR1
1582         TLO FF,FLUNRD
1583 UA3L:   PUSHJ P,GTSL1   ;GOBBLE SYL, LOOP POINT FOR PSEUDO OR MACRO RETURNED WITHOUT VALUE
1584         TRNE I,IRLET
1585         JRST UA3S       ;NAME
1586         TLNE I,ILFLO
1587         ETR [ASCIZ /Floating point 2nd arg to "_"/]
1588 UAR2:   TRZN I,IRGMNS
1589         SKIPA T,A
1590         MOVN T,A
1591         JSP LINK,SGTSY1 ;RESTORE GETSYL TEMPS.
1592         HLRZ D,(P)
1593         POPJ P,
1594
1595 UA3S:   PUSHJ P,GETVAL  ;MAKE NUMBER_NAME WORK
1596         JRST UA3SR      ;GOT VALUE, PROCESS
1597         JRST UA3L       ;NO VALUE, TRY AGAIN
1598
1599 UAR1:   TLO I,ILLSRT
1600         TRZ I,IRSYL     ;(OR ELSE LSSTH GIVES NOS ERROR.)
1601         SETZB A,B
1602         PUSHJ P,LSSTH
1603 UA3SR:  JUMPN B,RLCERR  ;RELOC ERR
1604         JRST UAR2
1605
1606 ATSGN:  MOVSI A,20      ;ATSIGN
1607         IORM A,WRD
1608         TRO I,IRFLD     ;SET IRFLD FLAG EVEN THOUGH NOT DIRECTLY RETURNING VALUE
1609                 ; ^ CHANGED FROM SYL TO FIELD 9/6/70
1610         JRST RRL2       ;FALL BACK IN
1611 \f
1612 DQUOTE: TRON I,IRSYL
1613          JRST DQUOT8
1614         TRNN I,IRLET    ;AFTER NUMBER => CURRENT RADIX.
1615          JRST DQUOT7
1616         PUSHJ P,RCH
1617         TLO FF,FLUNRD   ;NEXT CHAR. SQUOZE?
1618         HLRZ A,GDTAB(A)
1619         CAIN A,(POPJ P,)
1620          JRST DQUOT7    ;NO => MAKE PREV. SYM. GLOBAL.
1621         CAMN SYM,[SQUOZE 0,.M]  ;SPECIAL BLOCK NAMES
1622          JRST DQUOTM    ;.M MEANS MAIN BLOCK,
1623         CAMN SYM,[SQUOZE 0,.U]
1624          JRST DQUOTU    ;.U MEANS SUPERIOR.
1625         CAMN SYM,[SQUOZE 0,.C]
1626          JRST DQUOTC    ;.C MEANS CURRENT BLOCK.
1627         SKIPGE A,ESBK   ;GET SPEC'D BLOCK OR CURRENT,
1628          HRR A,BKCUR    ;LOOK FOR SUBBLOCK OF THAT BLOCK.
1629         HLL A,BKTAB+1(A)
1630         ADD A,[1,,]     ;LH HAS LEVEL SUBBLOCK OUGHT TO HAVE.
1631         MOVEI T,0
1632         SETO D,         ;NO POSSIBLE ALTERNATE CHOICE YET.
1633 DQUOT0: CAME SYM,BKTAB(T)       ;LOOK AT ALL BLOCKS SEEN.
1634          JRST DQUOT1    ;HAS THE NAME WE'RE LOOKING FOR?
1635         SKIPGE ESBK     ;IF LOOKING FOR A SUBBLOCK OF A PARTICULAR BLOCK,
1636          JRST DQUOT4
1637         CAMN A,BKTAB+1(T)
1638          JRST DQUOT2    ;SUCH A BLOCK WINS;  ALL OTHERS LOSE.
1639         JRST DQUOT1
1640
1641 DQUOT4: SKIPN BKTAB+2(T) ;ELSE PREFER DEFINED BLOCKS TO UNDEFINED ONES.
1642          JUMPGE D,DQUOT1
1643         SKIPE BKTAB+2(T)
1644          JUMPL D,DQUOT5
1645         CAME D,[-1]     ;THAT'S THE SAME EITHER WAY => PREFER AN INFERIOR
1646          CAMN A,BKTAB+1(T)      ;OF THE CURRENT BLOCK TO ONE THAT'S NOT.
1647           JRST DQUOT5
1648         JRST DQUOT1
1649
1650 DQUOT5: HRROI D,(T)     ;FOUND A BLOCK WE LIKE BEST SO FAR.
1651         SKIPE BKTAB+2(T)
1652          ANDI D,-1      ;LEAVE SIGN OF D SET UNLESS THE BLOCK IS DEFINED.
1653 DQUOT1: ADDI T,BKWPB
1654         CAMGE T,BKTABP
1655          JRST DQUOT0
1656         HRRZI T,(D)     ;NOW USE THE BEST BLOCK FOUND, IF THERE WAS ONE.
1657         CAIE T,-1
1658          JRST DQUOT2
1659         MOVE T,BKTABP   ;NOT FOUND, GET IDX OF 1ST UNUSED ENTRY.
1660         CAIL T,BKTABS
1661          ETF ERRTMB     ;NO ROOM FOR MORE BLOCKS.
1662         MOVEM SYM,BKTAB(T)
1663         MOVEM A,BKTAB+1(T)      ;ADD BLOCK AT END.
1664         MOVEI A,BKWPB(T)
1665         MOVEM A,BKTABP  ;POINTS AFTER LAST USED ENTRY.
1666 DQUOT2: MOVEM T,ESBK
1667         SETZ SYM,
1668 DQUOT3: MOVEI D,6       ;NEXT CHAR GOES IN 1ST SQUOZE POS.
1669         JRST RRL2
1670
1671 DQUOTM: MOVEI T,BKWPB   ;.M - MAIN BLOCK FOLLOWS INITIAL SYMS BLOCK.
1672         JRST DQUOT2
1673
1674 DQUOTU: SKIPGE T,ESBK   ;.U SPEC'D - GET SPEC'D OR CURRENT BLOCK,
1675          MOVE T,BKCUR
1676         HRRZ T,BKTAB+1(T)
1677         JRST DQUOT2     ;SPEC. ITS SUPERIOR.
1678
1679 DQUOTC: SKIPGE T,ESBK   ;.C => SPEC THE CURRENT BLOCK.
1680          MOVE T,BKCUR
1681         JRST DQUOT2
1682 \f
1683 SQUOT1: TLOA I,ILVAR
1684 DQUOT7:  TLO I,ILGLI
1685         MOVE A,BKCUR    ;IF NO SPEC'D BLOCK,
1686         SKIPGE ESBK
1687          MOVEM A,ESBK   ;SPEC. CURRENT BLOCK.
1688         JRST RRL2
1689
1690 DQUOT8: SETZ T,
1691 DQUOT9: JSP F,QOTCON    ;DOUBLE QUOTE TO GOBBLE SYL AND RETURN ASCII VALUE
1692         LSH T,7         ;SHIFT ACCUMULATED VALUE OVER 7
1693         ADD T,A         ;ADD IN ASCII CHARACTER IN A
1694         POPJ P,         ;RETURN TO SOMETHING
1695
1696 SQUOTE: TROE I,IRSYL
1697          JRST SQUOT1
1698         SETZ T,
1699 SQUOT9: JSP F,QOTCON    ;SIXBIT SYL
1700         CAIGE A,40
1701          ETR ERRN6B     ;NOT SIXBIT
1702         CAIL A,140
1703          SUBI A,40      ;CONVERT TO UPPER CASE
1704         LSH T,6         ;SHIFT OVER ACCUMULATED VALUE
1705         ADDI T,-40(A)   ;ADD IN SIXBIT FOR CHARACTER IN A
1706         POPJ P,
1707
1708 ;COMMON ROUTINE FOR RIGHT JUSTIFIED TEXT SYLS
1709 ;CALLED WITH JSP F,; ROUTINE PUSHJ'S BACK W/ CHAR IN T, ACCUM VALUE IN A
1710 ;SYL FLAG EXPECTED TO BE ALREADY SET
1711 QOTCON: SKIPE QMTCH     ;' AND " COME HERE, BUT NOT ^: IF IN QUOTES-MATCHING MODE, USE A
1712          JRST QOTCO4    ;FAIL-LIKE ALGORITHM. HERE FOLLOWS THE OLD MIDAS WAY OF DOING IT
1713 QOTCOM: CALL RCH        ;USE AT LEAST 1 CHAR IN ANY CASE.
1714         JRST QOTCO1
1715
1716 QOTCO2: CALL RCH        ;USE SUCCEEDING CHARS IF SQUOZE CHARS.
1717         HLRZ CH1,GDTAB(A)
1718         CAIN CH1,(POPJ P,)
1719          JRST QOTCO3
1720 QOTCO1: CALL (F)
1721         JRST QOTCO2
1722
1723 QOTCO3: CAIN A,""       ;NONSQUOZE: IF IT IS A TEXT SYL INDICATOR,
1724          JRST DQUOT9    ;CONTINUE WITH WHATEVER TYPE OF TEXT
1725         CAIN A,"'
1726          JRST SQUOT9    ;IT INDICATES.
1727         CAIN A,"^
1728          JRST UPCTR1
1729 QOTCO6: TLO FF,FLUNRD
1730         JRST TEXT5
1731
1732 QOTCO4: MOVE B,LIMBO1   ;GET ' OR ", WHICHEVER STARTED THIS SYL, AS THE DELIMITER.
1733         MOVE SYM,[SQUOZE 0,TEXT]
1734         JSP TM,ERMARK
1735 QOTCO5: CALL RCH
1736         CAMN A,B        ;FOUND ANOTHER EXAMPLE OF THE DELIMITER?
1737          JRST [ CALL RCH        ;IF DUPLICATED, IT PUTS THE DELIMITER IN THE CONSTANT.
1738                 CAMN A,B
1739                  JRST .+1
1740                 JRST QOTCO6]    ;OTHERWISE UNREAD THE CHAR AFTER THE DELIMITER AND EXIT.
1741         CALL (F)        ;HAVE CHAR TO PUT IN STRING IN A; GO MERGE IT IN.
1742         JRST QOTCO5
1743
1744 ;RETURN A VALUE FROM A PSEUDO WHOSE ARGS CAN BE TERMINATED BY EITHER COMMA (GOBBLED)
1745 ;OR CR (NOT GOBBLED).
1746 VALRET: MOVE T,A        ;ROUTINE TO RETURN VALUE IN A AFTER LAST CHAR GOBBLED BY GETSYL
1747         MOVE B,CDISP    ;GET STORED DISPATCH CODE
1748         TLNN B,DWRD\DFLD
1749         JRST VALR1      ;WORD TERMINATOR
1750 ;COME HERE TO RETURN A VALUE, AND ALSO
1751 ;BARF IF THE NEXT CHARACTER ISN'T A SYLLABLE SEPARATOR
1752 TEXT5:  PUSH P,T        ;ENTRY FROM TEXT ROUTINES (NLAST CHAR NOT GOBBLED BY GETSYL) TO RETURN VALUE IN T
1753         PUSHJ P,GETSYL  ;SEE IF IMMEDIATELY FOLLOWED BY SYL
1754         TRNE I,IRSYL
1755         ETR ERRNOS      ;NO SEPARATOR BETWEEN TWO VALUES
1756         POP P,A         ;RESTORE VALUE TO RETURN
1757 VALR1:  TRO I,IRSYL
1758         JRST CLBPOP
1759 \f
1760                 ;VARIOUS PUSH AND POP ROUTINES, ALL CALLED W/ JSP LINK,
1761
1762 SGTSY:  PUSH P,I
1763         PUSH P,AA
1764         PUSH P,A
1765         PUSH P,B
1766         JRST (LINK)
1767
1768 SGTSY1: POP P,B
1769         POP P,A
1770         POP P,AA
1771         POP P,I
1772         JRST (LINK)
1773
1774 ;JSP LINK,SAVWD1 TO SAVE STUFF FOR < OR (, ETC.
1775
1776 SAVWD1: PUSH P,A        ;SYLL. BEFORE GROUPING NOW STARTING.
1777         PUSH P,B        ;AND ITS RELOC.
1778
1779 SAVWLD: PUSH P,FORMAT
1780         PUSH P,FORPNR
1781         PUSH P,FLDCNT
1782         PUSH P,GLSP2
1783         PUSH P,I
1784         PUSH P,WRD
1785         PUSH P,WRDRLC
1786         PUSH P,SYM
1787         PUSH P,PPRIME
1788         PUSHJ P,(LINK)
1789 SAVL1==.
1790
1791 ;POP OFF WHAT PUSHED BY SAVWLD.  CLEARS FLUNRD, IN CASE THE > OR ) WAS UN-READ.
1792
1793 USVWLD: POP P,SYM
1794         HRRZS SYM
1795         CAIE SYM,SAVL1
1796         HALT
1797         TLZ FF,FLUNRD
1798         POP P,PPRIME
1799         POP P,SYM
1800         POP P,WRDRLC
1801         POP P,WRD
1802         TDZ I,[-1-(ILWORD)]
1803         IOR I,(P)
1804         POP P,1(P)
1805         POP P,GLSP2
1806         POP P,FLDCNT
1807         POP P,FORPNR
1808         POP P,FORMAT
1809         JRST (LINK)
1810 \f
1811 ;;GETFD         ;GET FIELD (EXPRESSION); RETURN VALUE IN A, RELOC BITS IN B
1812
1813                 ;GET FIELD FOR PSEUDO
1814                 ;SYM SHOULD CONTAIN THE SQUOZE NAME OF THE PSEUDO
1815                 ;OR A POINTER TO AN INSN TO EXECUTE WHEN UNDEF
1816                 ;SYMBOL SEEN. SYM IS NOT CLOBBERED.
1817
1818 AGETFD: PUSH P,I        ;SAVE I
1819         TRO I,IRPSUD+IRNOEQ     ;SET FLAG TO GETVAL TO EXECUTE GTVER ON UNDEFINED SYM ON EITHER PASS
1820         SAVE GTVER      ;OLD VALUE OF GTVER
1821         MOVEM SYM,GTVER ;ERROR MSG SHOULD GIVE NAME OF PSEUDO.
1822         CALL YGETFD
1823         MOVE SYM,GTVER
1824         REST GTVER
1825         MOVEM I,ISAV    ;SAVE FLAGS FOR FIELD GOTTEN
1826 POPIJ:  POP P,I
1827         POPJ P,
1828
1829 ;READ A FIELD, NOT PART OF THE CURRENT WORD.
1830 YGETFD: PUSH P,WRD
1831         SETZM WRD
1832         CALL XGETFD
1833         TLNE I,ILMWRD
1834         PUSHJ P,IGTXT   ;SOAK UP MULTIPLE WORD
1835         ADD A,WRD       ;ADD IN INDEX, INDIRECT FIELDS
1836         POP P,WRD
1837         POPJ P,
1838
1839 IFN FASLP,[
1840 FAGTFD: PUSHJ P,AGETFD  ;DO AGETFD, COMPLAIN IF RELOCATABLE OR GLOBAL
1841         MOVE TM,GLSP1
1842         CAMN TM,GLSP2
1843          SKIPE B
1844           ETSM [ASCIZ /relocatable or external argument/]
1845         POPJ P,
1846 ]
1847 ;READ A FIELD PART OF CURRENT WORD (FOR XWD, ETC).
1848 XGETFD: SAVE PPRIME
1849 AGTFD3: PUSHJ P,GETFLD
1850         MOVE CH1,CDISP
1851         TLNN CH1,DWRD
1852          TLOA FF,FLUNRD ;DELIMITER IS WORD TERMINATOR => RE-READ IT.
1853           TRNE I,IRFLD  ;NON-NULL FIELD SUPPLIED => RETURN IT.
1854             JRST AGTFD4
1855         HRRZ C,CDISP    ;ELSE COMMA => RETURN NULL VALUE (0)
1856         CAIN C,SPACE    ;SPACE => TRY AGAIN TO READ A FIELD.
1857          JRST AGTFD3    ;NO FIELD, TRY AGAIN
1858 AGTFD4: REST PPRIME
1859         POPJ P,
1860
1861                 ;IN RELOCATABLE FORMAT
1862                 ;READ FIELD AND COPY OUT AS WORD
1863
1864 RGETFD: SETZM WRD       ;FIRST INITIALIZE SOME STUFF AS THOUGH AT GETWD
1865         SETZM WRDRLC
1866         MOVE A,GLSPAS
1867         MOVEM A,GLSP1
1868         MOVEM A,GLSP2
1869         CALL XGETFD
1870         ADDM A,WRD
1871         ADDM B,WRDRLC
1872         PUSHJ P,PWRDA   ;OUTPUT WORD
1873         TLNE I,ILMWRD
1874         JRST IGTXT      ;SOAK UP MULTI-WORD FIELD
1875         POPJ P,
1876 \f
1877 ;READ IN A FIELD, RETURN IN A,B SETTING IRFLD IF FIELD NOT NULL.
1878 GETFLD: SAVE GLSP1      ;REFERED TO AS GETFLB(P) WHEN ONLY 1 SYL PUSHED.
1879         MOVEM P,PPRIME
1880         TRZ I,IRFLD+IROP
1881 GETFD1: TLNE I,ILMWRD
1882         JRST GETFD9     ;MULTIPLE WORD, RE-CALL PSEUDO
1883         PUSHJ P,GETSYL
1884         TRNE I,IRLET
1885 GETFD9: PUSHJ P,GETVAL  ;GET OPERAND (MAYBE SKIPS)
1886 GETFD6: SKIPA C,CDISP   ;GET INFO ON SYLLABLE TERMINATOR
1887         JRST GETFD1     ;GETVAL SKIPPED => PSEUDO/MACRO WITH NO VALUE, TRY AGAIN
1888         TLNE C,DFLD
1889         JRST (C)        ;FIELD OPERATOR, GO PROCESS
1890         TRNE I,IRSYL    ;NO DISP MEANS FIELD TERMINATOR.
1891         TRO I,IRFLD
1892         CAME P,PPRIME   ;IF ANY OPERATORS PUSHED,
1893          JSP LINK,GETFD8 ;EVAL THEM.
1894         SUB P,[1,,1]    ;FLUSH GLSP1 SAVED AT GETFLD.
1895         RET
1896
1897 GETFD8: MOVEI TT,       ;END OF FIELD HAS VERY LOW PRIORITY.
1898         JRST GETFD7
1899
1900 ;PUSH AN OPERATOR, MAYBE EVALLING STUFF TO LEFT.
1901 ;A HAS LEFT OPERAND (IF ANY), B RELOCATION BITS,
1902 ;C ADR OF ROUTINE TO PERFORM OPERATION, LH OF TT HAS PRECEDANCE OF OPERATOR
1903
1904 GETFDL: MOVEI LINK,GETFD3       ;AFTER MAYBE EVALLING, GO PUSH OPERATOR.
1905         TRO I,IRFLD+IROP
1906         TRNN I,IRSYL
1907          JRST GETFD5    ;UNARY, EVAL NOTHING, JUST PUSH WITH HIGH PRIO.
1908 GETFD2: CAME P,PPRIME   ;NO OPS TO LEFT => NOTHING TO EVAL.
1909         CAMLE TT,GETFLP(P) ;COMPARE PRIO OF PREV. OP. AND CURRENT.
1910         JRST (LINK)     ;WAIT UNTIL LATER
1911 GETFD7: HRRZ T,GETFLP(P) ;EVAL THE LAST OP ON STACK.
1912         JRST (T)        ;GO DO IT NOW (ROUTINE RETURNS TO GETFD4)
1913 GETFD4: SUB P,[4,,4]
1914         JRST GETFD2
1915
1916 GETFD5: MOVSI TT,200    ;GIVE UNARY OP HIGH PRIO. TO DO BEFORE NEXT BINARY.
1917 GETFD3: PUSH P,B        ;GETFLR(P)
1918         PUSH P,A        ;GETFLV(P)
1919         HLL C,TT
1920         PUSH P,C        ;GETFLP(P)
1921         PUSH P,GLSP1    ;GETFLG(P)
1922         JRST GETFD1
1923
1924 GETFLB==,-4     ;PDL IDX OF GLSP1 BEFORE LEFT OPERAND.
1925 GETFLR==,-3     ;PDL IDX OF RELOC OF LEFT OPERAND.
1926 GETFLV==,-2     ;PDL IDX OF VALUE OF LEFT OPERAND.
1927 GETFLP==,-1     ;PDL IDX OF PRIO,,DISPATCH
1928 GETFLG==0       ;PDL IDX OF GLSP1 AFTER LEFT OPERAND (=BEFORE RIGHT)
1929 \f
1930 PLS:    MOVEI C,PLS1    ;PLUS SIGN, PLS1 IS ROUTINE TO PERFORM OPERATION
1931 MINUS2: MOVSI TT,10     ;SET UP PRECEDENCE OF 10 FOR +, -
1932         JRST GETFDL
1933
1934 MINUS:  JSP C,MINUS2    ;MINUS SIGN
1935         MOVNS A         ;NEGATE VALUE OF RIGHT OPERAND
1936         MOVNS B         ;ALSO RELOCATION
1937         JUMPGE FF,PLS1
1938         MOVE T,GETFLG(P)
1939         PUSH P,B
1940         HRLZI B,MINF
1941         PUSH P,C
1942         PUSHJ P,LNKTZ   ;COMPLEMENT THE MINUS FLAG ON GLOBALS IN RIGHT OPERAND
1943         POP P,C
1944         POP P,B
1945 PLS1:   ADD A,GETFLV(P) ;ADD VALUES
1946         ADD B,GETFLR(P) ;ADD RELOCATIONS
1947         JRST GETFD4
1948
1949 LNKTZ:  TDZA C,C
1950 LNKTC1: MOVE T,GLSP2
1951 LINKTC: CAML T,GLSP1
1952         POPJ P,
1953         SKIPL 1(T)
1954         XORM B,1(T)
1955         SKIPL 1(T)
1956         IORM C,1(T)
1957         AOJA T,LINKTC
1958 \f
1959 MULTP:  MOVEI C,MULTP1  ;ASTERISK, MULTP1 ROUTINE TO PERFORM MULTIPLICATION
1960 DIVID2: MOVSI TT,20     ;20 PRECEDENCE OF MULTIPLICATION, DIVISION
1961         JRST GETFDL
1962
1963 MULTP1: JUMPGE FF,MULTR         ;ON P1, DON'T CHECK THIS, SINCE UNDEF SYMS ARE EXTERNALS
1964         SKIPL CONTRL            ;ELSE IN DECREL ASSEMBLY, TEST FOR EXTERNALS.
1965          JRST MULTR
1966         MOVE D,GETFLB(P)        ;ACTUALLY, GET HERE FOR ABS ASSEMBLIES TOO, BUT SO WHAT?
1967         CAME D,GLSP1
1968          ETR [ASCIZ /Externals multiplied/]
1969 MULTR:  JUMPE B,MULTP3          ;JUMP ON RIGHT OPERAND NOT RELOCATED
1970         SKIPE GETFLR(P)
1971          JRST MULTP4            ;BOTH OPERANDS RELOCATED
1972         MOVE T,GETFLV(P)        ;GET VALUE OF LEFT OPERAND AND FALL IN
1973         JRST MULTP5
1974
1975 MULTP3: MOVE T,A                ;RIGHT OPERAND NOT RELOCATED, GET VALUE IN T
1976         MOVE B,GETFLR(P)        ;RELOCATION BITS OF LEFT OPERAND
1977 MULTP5: MOVE D,GETFLG(P)        ;GLOTB POINTER TO BETWEEN OPERANDS
1978         CAME D,GETFLB(P)
1979          JRST GMUL1             ;LEFT OPERAND HAS GLOBALS
1980         CAME D,GLSP1
1981          JRST GMUL2             ;RIGHT OPERAND HAS GLOBALS
1982                 ;AT THIS POINT, T HAS VALUE OF ABS OPERAND, B RELOC BITS OF OTHER
1983 GMUL4:  IMUL A,GETFLV(P)        ;MULTIPLY VALUES
1984         IMULB B,T               ;MULTIPLY RELOCATION OF ONE BY VALUE OF OTHER
1985         TRZ T,1
1986         SKIPL CONTRL            ;EXCEPT IN STINK ASSEMBLY, OBJECT TO RELOCATION
1987          JRST GETFD4            ;OTHER THAN 0 OR 1 (ONLY AFFECTS DECREL, SINCE
1988         JUMPE T,GETFD4          ;RELOCATION CAN'T BE NONZERO IN ABS ASSEMBLY).
1989 MULTP4: ETR [ASCIZ+Relocatable arg to * or / or Boolean+]
1990         JRST GETFD4
1991
1992 GMUL1:  TLNE FF,FLPPSS  ;LEFT OPERAND HAS GLOBALS, CHEK RIGHT OPERAND
1993         CAMN D,GLSP1
1994         SKIPA CH1,A     ;LOOKS OK, GET VALUE IN CH1
1995          ETR [ASCIZ /Multiplying two externals/]
1996         SKIPA D,GETFLB(P)       ;GET GLOTB POINTER TO BOTTOM OF LEFT OPERAND
1997 GMUL2:  MOVE CH1,GETFLV(P)      ;GLOBALS IN RIGHT OPERAND ONLY, GET LEFT OPERAND
1998 GMUL3:  CAML D,GLSP1
1999         JRST GMUL4      ;TABLE COUNTED OUT
2000         SKIPGE 1(D)
2001         AOJA D,GMUL3
2002         JUMPE CH1,GMUL5 ;MULTIPLYING BY ZERO, CLEAR OUT GLOTB ENTRY AND LOOP BACK
2003         LDB CH2,[221200,,1(D)]  ;PICK UP MULTIPLICATION FIELD THIS GLOBAL
2004         SKIPN CH2
2005         MOVEI CH2,1     ;0 => 1
2006         IMUL CH2,CH1
2007         CAIN CH2,1
2008         MOVEI CH2,0     ;IF ONE THEN USE ZERO
2009         DPB CH2,[221200,,1(D)]
2010         AOJA D,GMUL3
2011
2012
2013 GMUL5:  CLEARM 1(D)
2014         AOJA D,GMUL3
2015 \f
2016 DIVID:  JSP C,DIVID2    ;SLASH, PRECEDENCE = 20
2017 DIVID1: JUMPN B,MULTP4  ;JUMP IF RIGHT OPERAND RELOCATED
2018         SKIPE GETFLR(P)
2019         JRST MULTP4     ;LEFT OPERAND RELOCATED
2020         EXCH A,GETFLV(P)
2021         IDIV A,GETFLV(P)
2022         MOVEI B,0
2023         JUMPGE FF,GETFD4
2024         MOVE D,GETFLB(P)
2025         CAME D,GLSP1
2026          ETR [ASCIZ /Division involving externals/]
2027         JRST GETFD4
2028
2029                 ;LOGIC OPERATORS & (PREC = 40), # (PREC = 34), \ (PREC = 30)
2030
2031 ANDF:   MOVSI TT,40     ;&
2032         JSP C,GETFDL
2033         JSP D,LOGIC1    ;GO DO IT
2034         AND A,GETFLV(P) ;INSTRUCTION ARGUMENT TO LOGIC1
2035
2036 XORF:   MOVSI TT,34     ;#
2037         TRNN I,IRSYL    ;IF ABOUT TO BE UNARY,
2038         MOVNI A,1       ;THEN TURN LEFT OPERAND INTO -1
2039         JSP C,GETFDL
2040         JSP D,LOGIC1
2041         XOR A,GETFLV(P)
2042
2043 IORF:   MOVSI TT,30     ;\
2044         JSP C,GETFDL
2045         JSP D,LOGIC1
2046         IOR A,GETFLV(P)
2047
2048                 ;COMMON EXECUTION ROUTINE FOR LOGICAL OPERATORS
2049
2050 LOGIC1: JUMPN B,MULTP4  ;NO RELOCATION ALLOWED
2051         SKIPE GETFLR(P) ;NOW CHECK RELOCATION OF LEFT OPERAND
2052         JRST MULTP4
2053         XCT (D)         ;ALL TESTS PASSED, DO IT
2054         JUMPGE FF,GETFD4        ;DON'T CHECK FOR GLOBALS EXCEPT DURING PUNCHING PASS
2055         MOVE D,GETFLB(P)        ;PICK UP POINTER TO LEFT OPERAND GLOTB ENTRIES
2056         CAME D,GLSP1
2057          ETR [ASCIZ /External in arg to \, & or #/]
2058         JRST GETFD4
2059
2060 CBAKAR: MOVSI TT,100    ;BACKARROW AS FIELD OPERATOR, PREC = 100
2061         JSP C,GETFDL    ;RETURN TO GETFLD TO READ 2ND ARGUMENT.
2062         JSP D,LOGIC1    ;FOR EVALUATION, CALL LOGIC1
2063             JSP D,.+1   ;WHICH EXECUTES THIS INSTRUCTION,
2064         MOVE T,A        ;TO CALL THIS SUBROUTINE.
2065         MOVE A,GETFLV(P)
2066         LSH A,(T)
2067         JRST (D)
2068 \f
2069 ;D SHOULD HAVE 1 FOR <, 2 FOR (, 3 FOR [        ;]
2070 LSSTH9: JSP LINK,SAVAS1 ;SAVE ASSEM1 PDL LEVELS, .BYTE MODE, ETC.
2071         MOVEM D,ASMOUT  ;SAY WHAT KIND OF OPEN WE JUST DID
2072         JRST ASSEM3     ;REENTER ASSEM1 LOOP AT INNER LEVEL.
2073
2074 ;COME HERE TO EXIT FROM AN ASSEM1 LEVEL THAT WAS ENTERED BY LSSTH9.
2075 LSSTHA: SKIPE BYTM      ;IN BYTE MODE, DO .WALGN. SINCE ASMDSP
2076          JRST A.BY3     ;STILL POINTS HERE, WE'LL COME BACK.
2077         MOVE P,CONSTP
2078         JSP T,CONNDP    ;POP STUFF SAVED BY SAVAS1
2079         MOVE A,WRD      ;RETURN THE WORD IN THE GROUPING
2080         MOVE B,WRDRLC   ;(OUR CALLER WILL USVWLD, CLOBBERING WRD)
2081         POPJ P,
2082
2083 LSSTH:  MOVEI D,1       ;1 FOR <.
2084         JSP LINK,SAVWD1
2085         PUSHJ P,LSSTH9
2086 LSSTH3: JSP LINK,USVWLD ;POP OFF ALL BUTPREVIOUS SYLL.
2087
2088 ;GROUPINGS EXCEPT (PARENS THAT ADD TO WORD)
2089 ;SYLL IMMEDIATELY BEFORE OR AFTER IS ERROR.
2090 LSSTH2: ADDM A,-1(P)    ;SYLL BEFORE GROUPING, PUSHED BY SAVWD1.
2091         ADDM B,(P)
2092         TRNE I,IRSYL    ;IF WAS SYLL BEFORE GROUPING, ERROR.
2093          ETR ERRNOS
2094 LSSTH5: MOVE A,LIMBO1   ;CHECK FOR FOLLOWING SYLL.
2095         CAIE A,15
2096         CAIN A,12
2097         JRST LSSTH6     ;DELIMITER CR OR LF
2098         PUSHJ P,RCH     ;NOT CR OR LF, GET NEXT CHAR
2099         CAIN A,"!       ;IGNORE EXCLAMATION POINT
2100         JRST .-2
2101         TLO FF,FLUNRD   ;CAUSE IT TO BE RE-INPUT
2102         HLRZ CH1,GDTAB(A)
2103         CAIE CH1,(POPJ P,)
2104         JRST LSSTH4     ;SQUOZE CHAR. MEANS FOLLOWING SYLL.
2105         HRRZ CH1,GDTAB(A)
2106         MOVE CH1,DTB-40(CH1)    ;GET DISPATCH FOR CHAR.
2107         TLNE CH1,DSY1   ;MIGHT START SYL => NOS ERROR.
2108          JRST LSSTH4
2109 LSSTH7: PUSHJ P,GTSL1
2110 LSSTH6: TRO I,IRSYL
2111         POP P,B
2112         POP P,A         ;VALUE OF GROUPING WAS ADDM'ED INTO THESE.
2113         TLZE I,ILLSRT   ?.SEE UA3
2114          RET            ;IF CALLED BY ^ OR _ AS SYL OP, RETURN TO IT.
2115         JRST GETFD6
2116 \f
2117 LSSTH1: TLO I,ILWORD    ;A NUMBER IN PARENS BY ITSELF IS A NONNULL WORD.
2118         ADDM A,WRD
2119         ADDM B,WRDRLC
2120         TRNE I,IRSYL    ;IF SYLL BEFORE,
2121         JRST LSSTH5     ;ERROR IF SYL AFTER.
2122         JRST LSSTH8     ;ELSE NO ERROR.
2123
2124 LSSTH4: ETR ERRNOS      ;FOLLOWING SYLL WHEN THAT IS ERROR.
2125 LSSTH8: TLNE I,ILLSRT   ?.SEE UA3
2126          JRST LSSTH6
2127         SUB P,[2,,2]
2128         JRST GETFD1
2129
2130 ERRNOS: ASCIZ /Syllables not separated/
2131
2132 POP2J:  SUB P,[2,,2]
2133         POPJ P,
2134
2135 LEFTP:  MOVEI D,2       ;2 FOR ).
2136         JSP LINK,SAVWD1
2137         MOVEI C,0
2138         TRNE I,IROP
2139         TRNE I,IRSYL
2140         TLO C,400000    ;CAUSE IT TO GET ADDED INTO WORD STEAD HAVE VALUE AS SYL
2141         PUSH P,C
2142         PUSHJ P,LSSTH9
2143         POP P,C
2144         MOVSM A,T1      ;STORE SWAPPED VALUE
2145         ADDI B,400000   ;NOW WANT TO SWAP RELOCATION, MAKE LH CORRECT
2146         HLREM B,T2      ;STORE AS RH WITH SIGN EXTENDED
2147         MOVSI B,400000(B)       ;GET RIGHT HALF IN LEFT
2148         ADDM B,T2       ;FINISH RELOCATION SWAP (THIS IS PAINLESS COMPARED TO THE HAIR EVERYWHERE
2149                 ;ELSE WHEN KEEPING THE HALFWORDS SEPARATE)
2150         MOVSI B,SWAPF
2151         PUSHJ P,LNKTC1
2152         JSP LINK,USVWLD
2153         MOVE A,T1
2154         MOVE B,T2
2155         JUMPL C,LSSTH1  ;ADD TO WHOLE WORD
2156         JRST LSSTH2
2157
2158 ;VERSION OF GETWRD FOR PSEUDO,
2159 ;PSEUDO MUST EITHER SAVE I, PPRIME AND GTVER OR RETURN TO ASSEM1.
2160 ;SYM SHOULD HOLD NAME OF PSUEUDO.
2161
2162 AGETWD: MOVEM SYM,GTVER ;STORE NAME OF PSEUDO FOR UNDEF SYM MSGS.
2163         TRO I,IRPSUD\IRDEF\IRNOEQ
2164         PUSHJ P,GETWRD
2165         MOVE SYM,GTVER  ;RESTORE SYM.
2166         TLNE I,ILMWRD
2167         PUSHJ P,IGTXT   ;SOAK UP MULTIPLE WORD
2168         RET
2169 \f
2170 ;;GETWD         ;READ A WORD, LEAVE VALUE IN A AND WRD, RELOC IN WRDRLC AND B
2171
2172 GETWRD: MOVE T,GLSP1
2173         MOVEM T,GLSP2
2174         CLEARM FORMAT   ;CLEAR FORMAT, WILL ACCUMULATE FORMAT NUMBER BY IDPB
2175         CLEARM WRD      ;CLEAR WRD, WILL ACCUMULATE ABSOLUTE PART OF WORD
2176         CLEARM WRDRLC   ; " RELOCATION BITS, "
2177         TDZ I,[ILWORD,,IRIOINS]
2178         CLEARM FLDCNT   ;NO FIELDS YET
2179         MOVE T,[50100,,FORMAT]  ;SET UP BIT POINTER TO FORMAT
2180         MOVEM T,FORPNR
2181 GTWD1:  PUSHJ P,GETFLD  ;READ NEXT FIELD
2182 SPACE6: MOVEI T,1       ;SET T TO 1, AC FOR IDPB ON ROUTINE DISPATCHED TO
2183         SKIPA C,CDISP
2184 SPACE5: REST A
2185         TLNE C,DWRD
2186         JRST (C)        ;NO DISPATCH MEANS WD TERMINATOR
2187         MOVE C,GLSP1
2188         MOVEM C,LINKL   ;MARK END OF ACTIVE PART OF GLOTB
2189         TRNN I,IRFLD
2190         JRST GETWD2     ;LAST FIELD NULL, MAYBE HAVE TO POP STUFF OFF
2191         IDPB T,FORPNR   ;MARK NON-NULL FIELD IN FORMAT
2192 GTWD4A: TLO I,ILWORD    ;NON-NULL WORD
2193         MOVE TT,FORMAT
2194         SKIPN TT,FORTAB-10(TT)  ;PICK UP BYTE POINTER POSITION/SIZE FIELDS FOR FIELDS IN WORD
2195         ETR [ASCIZ /Undefined format/]
2196         MOVEM TT,FORMAT         ;STORE IN FORMAT
2197         MOVE T,[301400,,FORMAT]
2198         MOVEM T,FORPNR
2199                 ;AT THIS POINT, FLDCNT HAS 1 LESS THAN # FIELDS; PUT FIELDS TOGETHER TO FORM WORD
2200 GTWD3:  LDB T,FORPNR
2201         MOVE D,FLDCNT
2202         CAIG D,2
2203         IBP FORPNR      ;HAVEN'T BACKED UP TO THIRD FIELD YET, INCREMENT TO DESC FOR PREV
2204         TRNE I,IRIOINS
2205         PUSHJ P,INTIOW
2206         PUSHJ P,INTFLD  ;PUT FIELD WHERE IT BELONGS
2207         SOSGE FLDCNT
2208         JRST GTWD5      ;THIS WAS LAST (FIRST) FIELD
2209         POP P,GLSP2     ;NOT YET, POP OFF MORE
2210         POP P,GLSP1
2211         POP P,B
2212         POP P,A
2213         JRST GTWD3
2214
2215 GTWD5:  MOVE A,WRD
2216         MOVE B,WRDRLC
2217         MOVE C,LINKL
2218         MOVEM C,GLSP1
2219         TRZ I,IRIOINS
2220         POPJ P,
2221 \f
2222 COMMA:  TRNN I,IRFLD    ;FIELD DELIMITER WAS COMMA (T HAS 1)
2223          JRST COMMA1    ;NO FIELD
2224         IDPB T,FORPNR   ;MARK NON-NULL FIELD
2225 COMMA4: IDPB T,FORPNR   ;MARK FIELD TERMINATOR WAS COMMA
2226         MOVE TT,FLDCNT
2227         CAIL TT,2
2228          ETR [ASCIZ /Comma past the 3rd field of a word/]
2229 PUSHFD: PUSH P,A        ;DONE WITH THIS FIELD, NOW TO GET NEXT
2230         PUSH P,B
2231         PUSH P,GLSP1
2232         PUSH P,GLSP2
2233         AOS FLDCNT      ;ANOTHER FIELD
2234         MOVE TT,GLSP1
2235         MOVEM TT,GLSP2
2236         HRRZ T,FORPNR
2237         CAIE T,FORMAT
2238         HRRZS FORPNR    ;STABILIZE FORPNR
2239         TLO I,ILWORD    ;SAY WE HAVE A NON-NULL WORD IN PROGRESS (LOC, ETC. ILLEGAL).
2240         JRST GTWD1
2241
2242 GETWD2: SKIPN FORMAT    ;LAST FIELD OF WORD IS NULL
2243         JRST GTWD5      ;ENTIRE WORD NULL, MAYBE WERE PARENS.
2244         SOS FLDCNT
2245         POP P,GLSP2
2246         POP P,GLSP1
2247         POP P,B
2248         POP P,A
2249         JRST GTWD4A
2250
2251 COMMA1: LDB TT,FORPNR   ;COMMA TERMINATED NULL FOELD.
2252         SKIPE FORMAT
2253         JUMPE TT,COMMA2 ;NOT 1ST FIELD, JMP IF PREV WAS TERM BY SPACE.
2254         IBP FORPNR      ;ELSE MARK NULL FIELD IN FORMAT.
2255         JRST COMMA4
2256
2257 ;FIELD SPACE COMMA, PATHOLOGICAL CASE
2258 ;(EG MACRO STARTED WITH A COMMA)
2259 COMMA2: DPB T,FORPNR    ;REPLACE SPACE WITH COMMA.
2260         JRST GTWD1
2261
2262                 ;FIELD TERMINATOR IS SPACE (T HAS 1)
2263
2264 SPACE:  MOVE TT,LIMBO1
2265         CAIE TT,^I      ;HEURISTIC: REAL SPACES ARE LIKELY TO BE FOLLOWED BY SQUOZE,
2266          JRST SPACE4    ;WHILE TABS ARE LIKELY TO BE FOLLOWED BY COMMENTS.
2267         PUSH P,A
2268         MOVE TT,GDTAB+40
2269         PUSHJ P,RCH
2270         CAMN TT,GDTAB(A)
2271         JRST .-2        ;FLUSH OTHER LOGICAL SPACES
2272         CAIN A,";       ;TAB WAS FOLLOWED BY SEMICOLON:
2273          JRST [ SAVE B
2274                 TRZ I,IRSYL
2275                 CALL SEMIC      ;FLUSH THE COMMENT
2276                 MOVEI T,1
2277                 REST B
2278                 JRST SPACE5]    ;AND HANDLE THE C.R.
2279 SPACE3: POP P,A
2280         TLO FF,FLUNRD   ;CAUSE CHAR TO BE RE-READ NEXT TIME
2281 SPACE4: TRNN I,IRFLD
2282          JRST GTWD1     ;NO FIELD
2283         IDPB T,FORPNR   ;T HAS 1, MARK NON-NULL FIELD IN FORMAT
2284         IBP FORPNR      ;MARK FIELD TERMINATOR WAS SPACE
2285         JRST PUSHFD
2286 \f
2287 ;T HAS DESC BYTE, PUT FIELD IN ITS PLACE
2288 ;ALSO CALLED FROM PBYTE, MUSTN'T CLOBBER AA.
2289
2290 INTFLD: MOVE TT,GLSP2
2291         CAMN TT,GLSP1
2292          JUMPE B,INTFD1 ;NO GLOBALS, JUMP IF NO RELOCATION
2293         CAIN T,2222     ;LH
2294          JRST INTL
2295         CAIN T,22       ;RH
2296          JRST INTR
2297         CAIN T,44       ;WHOLE WORD
2298          JRST INTW
2299         SKIPE B
2300          ETR [ASCIZ/Relocation attempted in irrelocatable field/]
2301                 ;(ASSUME) NO RELOCATION, CHECK FOR GLOBAL AC FIELDS
2302         CAIN T,2704     ;HIGH AC
2303          JRST INTACH
2304         CAIN T,504      ;AC LOW
2305          JRST INTACL
2306         JUMPGE FF,INTFD1        ;JUMP ON NOT PUNCHING PASS
2307         CAME TT,GLSP1
2308          ETR [ASCIZ/Global symbol in illegal field/]
2309 INTFD1: MOVEI TT,C_12.
2310         ROTC T,-12.     ;SHIFT BYTE POINTER INTO TT
2311         MOVEI C,0       ;INITIALIZE C TO RECEIVE FIELD IN PROPER PLACE
2312         DPB A,TT
2313         CAMN TT,[2200,,C]
2314         JRST INTFD2     ;RIGHT HALF, DON'T ALLOW CARRY INTO LH
2315         ADDM C,WRD      ;ALLOW CARRY
2316 INTFD3: ADDM B,WRDRLC   ;ADD RELOCATIONS, WILL BE BROKEN BACK INTO HALF-WORDS LATER
2317         POPJ P,
2318
2319 INTFD2: ADD C,WRD       ;ADD RIGHT HALVES
2320         HRRM C,WRD
2321         JRST INTFD3
2322
2323 INTIOW: CAIE T,2704
2324         CAIN T,504
2325         TRZA A,3                ;IO DEVICE FIELD
2326         POPJ P,                 ;NOT "AC" FIELD
2327         ADDI T,611-504
2328         POPJ P,
2329 \f
2330 INTR:   HRRE D,B        ;RH
2331         MOVEI B,0
2332         PUSH P,T
2333         HRLZI C,HFWDF
2334         PUSHJ P,LNKTC1  ;THIS IS A BUG WHICH SHOULD BE FIXED SOMETIME
2335 PRTCL:  MOVE B,D        ;GET BACK MAPPED RELOCATION BITS
2336 PRTCL2: POP P,T
2337 INTW:   MOVE D,GLSP2    ;WHOLE WORD
2338         HRLOI LINK,377777
2339         CAML D,GLSP1
2340         JRST INTFD1
2341         ANDM LINK,1(D)
2342         AOJA D,.-3
2343
2344 INTL:   HRLZ D,B        ;LH
2345         MOVSI B,SWAPF
2346         MOVSI C,HFWDF
2347         PUSH P,T
2348         MOVE T,GLSP2
2349 INTL2:  CAML T,GLSP1
2350         JRST PRTCL
2351         SKIPGE 1(T)     
2352         AOJA T,INTL2    ;INDEX FIELD, ETC => LEAVE ALONE
2353         IORM C,1(T)     ;SET HFWDF
2354         XORM B,1(T)     ;COMPLEMENT SWAP STATUS
2355         TDNN B,1(T)
2356         SETZM 1(T)      ;SWAPPED TO RH, FLUSH IT
2357         AOJA T,INTL2
2358
2359 INTACL: TDZA B,B        ;AC LOW
2360 INTACH: HRLZI B,SWAPF   ;AC HIGH
2361         HRLZI C,ACF
2362         PUSH P,T
2363         PUSHJ P,LNKTC1
2364         MOVEI B,0
2365         JRST PRTCL2
2366
2367 IOINST: HLLZ A,B        ;IO INSTRUCTION, GET WHICH ONE INTO A
2368         SKIPN FLDCNT    ;THIS FIRST FIELD OF WORD?
2369         TRO I,IRIOINS   ;YES
2370         JRST CLBPOP     ;RETURN VALUE
2371 \f
2372                 ;TOP LEVEL LOOP, ASSEMBLE STORAGE WORDS
2373                 ;LOTS OF PSEUDOS MEANINGLESS IN STORAGE WORDS
2374                 ;(E.G. BLOCK, CONSTA) DO JRST ASSEM1 WHEN DONE
2375                 ;THERE'S ALSO AN ERROR UUO WHICH RETURNS TO ASSEM1
2376
2377 ASSEM1: MOVE P,ASSEMP
2378         JRST @ASMDSP
2379
2380 ;COME HERE TO START THE NEXT EXPRESSION OR WHATEVER.
2381 ASSEM3: PUSHJ P,RCH
2382         CAIN A,^I
2383          JRST ASSEM2    ;PROBABLY NOT PROFITABLE TO SKIP AFTER SEE A TAB.
2384         CAIG A,40
2385          JRST ASSEM3    ;FLUSH LEADING GARBAGE
2386         TLO FF,FLUNRD   ;CAUSE NON-GARBAGE CHAR FOUND TO BE RE-INPUT
2387 ;ASMDSP POINTS HERE WITHIN ASCII, SIXBIT ETC.
2388 ASSEM2: TRZ I,IRFLD+IRSYL+IRLET+IRPSUD+IRCOM+IRCONT+IRGMNS+IROP+IRNOEQ+IREQL
2389         TLZ I,ILGLI+ILVAR+ILFLO+ILDECP+ILUARI+ILWORD+ILNPRC
2390         IOR I,ASMI      ;SET DEF AND RESTORE PSEUDF.
2391         MOVE A,GLSPAS
2392         SKIPL BYTM
2393         MOVEM A,GLSP1
2394                 ;GETWRD WILL COPY GLSP1 INTO GLSP2
2395 IFN TS,[AOSN TTYBRF     ;DO A ^H-BREAK IF REQUESTED.
2396          CALL TTYBRK]
2397         PUSHJ P,GETWRD
2398         TLZN I,ILWORD
2399         JRST @ASMDSP    ;NO WORD ASSEMBLED,TRY AGAIN
2400         SKIPGE BYTM
2401         JRST PBYTE      ;IN BYTE MODE, OUTPUT BYTE INSTEAD OF WORD, A,B MUST HAVE WRD,WRDRLC.
2402         MOVE AA,ASMOUT  ;OUTPUT WD AS APPRO. FOR GROUPING, IF ANY.
2403         JRST @ASMOT0(AA)
2404
2405 ASSEM6: SKIPE STGSW     ;ASMOT0 POINS HERE. COME IF NOT IN GROUPING.
2406          ETR ERRSWD     ;STORAGE WORD ASSEMBLED
2407         PUSHJ P,PWRD    ;OUTPUT THE WORD.
2408         AOS CLOC
2409         HRRZS CLOC      ;INCREM. POINT .
2410         JRST @ASMDSP    ;ASSEM3 OR ASSEM2
2411
2412 ERRSWD: ASCIZ /Storage word assembled/
2413
2414 ASSEM4: JSP T,PCONST    ;ASMOT0+3 POINTS HERE. COME IF IN CONSTANT.
2415         JRST @ASMDSP
2416
2417 ;ASMDSP POINTS HERE WITHIN GROUPING IF NOT IN MULTI-LINE MODE
2418 ;[ ;AND NO CLOSE (">)]") HAS BEEN SEEN.
2419 ASSEMC: MOVE AA,ASMOUT
2420         SKIPE CONSML    ;IN ERROR MODE, GIVE APPROPRIATE ERROR MSG.
2421          XCT ASMOT3(AA)
2422         JRST @ASMOT2(AA) ;CLOSE WHATEVER TYPE GRPING WE'RE IN.
2423 \f
2424 ;JUMP THRU THIS TABLE TO OUTPUT A WORD.
2425 ASMOT0: ASSEM6? ASSEM1? ASSEM1? ASSEM4? [HALT ]
2426
2427 ;THIS TABLE GIVES APPRO. CLOSE FOR EACH TYPE OF GROUPING. ;[
2428 ASMOT1:  "? ?    "> ?    ") ?    "] ?   "?
2429
2430 ;THIS TABLE SAYS WHERE TO GO TO END THE GROUPING.
2431 ASMOT2: [HALT ]?        LSSTHA? LSSTHA? CONND? [HALT ]
2432
2433 ;APPROPRIATE ERROR MESSAGE FOR MISSING CLOSE OF GROUPING. [
2434 ASMOT3: HALT
2435         ETR [ASCIZ /Missing >/]
2436         ETR [ASCIZ /Missing )/]
2437         ETR [ASCIZ /Missing ]/]
2438         HALT
2439
2440 ;THIS TABLE TELLS PBYTE HOW TO HANDLE BYTE MODE.
2441 ASMOT4: PBY4 ?  PBY5 ?  PBY5 ?  PBY3 ?  [HALT ]
2442
2443 ;TABLE SAYING WHAT CHAR MUST HAVE OPENED THE GROUPING.
2444 ASMOT5: "? ?     "< ?    "( ?    "[ ?   "?      ;]
2445 \f
2446 ;;GETVAL        ;GET VALUE OF SYM
2447                 ;SKIPS ON PSEUDO NOT RETURNING VALUE (E.G. MACRO STARTING TO BE EXPANDED)
2448                 ;ELSE RETURNS VALUE IN A, RELOCATION BITS IN B
2449
2450 VBLK
2451 GTVER:  0       ;SQUOZE NAME OF CALLING PSEUDO, OR POINTER
2452                 ;TO INSN TO EXECUTE WHEN IF SYM IS UNDEF.
2453 PBLK
2454
2455 GETVAL: PUSHJ P,ES
2456         JRST GVNF       ;NO STE.
2457 IFN CREFSW,XCT CRFINU   ;JFCL OR CALL TO CREF RTN.
2458         JRST @.+1(A)    ;FOUND, DISPATCH ON SQUOZE FLAGS
2459
2460 GVTAB:  GVCOM   ;COMMON (UNUSED)
2461         GVPSEU  ;PSEUDO OR MACRO.
2462         GVSYM   ;LOCAL SYMBOL.
2463         GVUL    ;LOCAL UNDEF (MAYBE STINK KNOWS VALUE)
2464         GVDLV   ;DEFINED LOCAL VAR.
2465         GVULV   ;UNDEF LOC VAR.
2466         GVDGV   ;DEF GLO VAR
2467         GVUGV   ;UNDEF GLO VAR
2468         GVDG    ;DEF GLOBAL
2469         GVUG    ;UNDEF GLOBAL
2470
2471 ;DEF LOCAL VAR.
2472 GVDLV:  PUSHJ P,GVDLGV  ;IF PASS2 AND HAS ' THIS TIME, SET 3VAS2 FOR AVARIAB
2473         TLZN I,ILGLI
2474         JRST GVDLV2
2475         MOVSI T,DEFGVR  ;NOW DEF GLO VAR.
2476         PUSHJ P,VSM2
2477         JRST GVDG1      ;MAYBE OUTPUT GLOBAL DEF. TO STINK.
2478
2479 GVDGV:  PUSHJ P,GVDLGV  ;DEF GLO VAR; IF PASS 2 AND ' THIS TIME, SET 3VAS2
2480         JRST GVDG2      ;MUSN'T PUNCH VALUE, AVARIAB WILL.
2481
2482 GVDLGV: TRNE FF,FRPSS2  ;IF PASS 2
2483         TLNN I,ILVAR    ;AND THIS TIME HAVE SINGLEQUOTE
2484         POPJ P,
2485         TLO C,3VAS2     ;TELL AVARIAB SEEN IN PASS 2 WITH '.
2486         3PUT C,D
2487         POPJ P,
2488
2489 GVULV:  TLZN I,ILGLI    ;UNDEF LOCAL VAR, MAYBE MAKE GLOBAL.
2490         JRST GVUNDF
2491         PUSHJ P,PLOGLO  ;IF SO, TELL STINK SYM IS GLOBAL,
2492         MOVSI T,UDEFGV  ;SYM NOW UNDEF GLO VAR
2493         PUSHJ P,VSM2
2494         JRST GVUNDF     ;IN EITHER CASE, HANDLE UNDEF SYM.
2495 \f
2496 GVUL:   TLZE C,3MACOK   ;UNDEF LOCAL, PRESUMED NUMERIC
2497          3PUT C,D       ;DON'T LET IT BECOME MACRO AND SCREW PASS2.
2498         TLNE C,3LLV
2499         JRST GVGLTB     ;(REALLY DEFINED BUT ONLY STINK KNOWS HOW)
2500         TLNE I,ILGLI    ;IF MAKING GLOBAL, TELL STINK.
2501         PUSHJ P,PLOGLO
2502 GVNF1:  TLZE I,ILVAR    ;IF ', MAKE VAR (WILL CHECK ILGLI)
2503         JRST GVUL1
2504         TLZN I,ILGLI    ;NOT MAKING VAR, MAYBE GLOBAL?
2505         JRST GVUNDF     ;NO, MAYBE ERROR, MAKE GLOTB ENTRY.
2506         MOVSI T,GLOEXT
2507         PUSHJ P,VSM2    ;NOW GLOBAL UNDEF,
2508         JRST GVGLTB     ;NO ERROR, JUST GLOTB ENTRY.
2509
2510 GVUL1:  TLZN I,ILGLI    ;UNDEF LOCAL BECOMES
2511         SKIPA T,[UDEFLV,,]      ;UNDEF LOC VAR OR
2512 GVGVAR: MOVSI T,UDEFGV  ;UNDEF GLO VAR.
2513 GVVAR:  AOS VARCNT
2514         HRR B,VARCNT
2515         PUSHJ P,VSM2    ;MAKE IT A VAR,
2516         JRST GVUNDF     ;PRETEND HAD ALREADY BEEN A VAR.
2517
2518 GVUG:   TLZE I,ILVAR    ;UNDEF GLOBAL: MAYBE MAKE UNDEF GLO VAR.
2519         JRST GVGVAR
2520 GVGLTB: SKIPGE CONTRL   ;UNDEF GLO IN ABS ASSEM =>
2521          JRST GVUND1     ;MAYBE TREAT AS UNDEF.
2522 GVGLT1: AOS GLSP1       ;DON'T KNOW SYM'S VALUE, MAKE GLOTB ENTRY.
2523         MOVEI T,ST(D)
2524         HRRZM T,@GLSP1
2525         JRST CABPOP     ;RETURN 0 AS VALUE.
2526
2527 GVNF:
2528 IFN CREFSW,XCT CRFINU   ;ONLY IF NOT FOUND WOULD NOT CREF AFTER ES.
2529         TLNE I,ILVAR+ILGLI      ;MAKING VAR OR GLOBAL FORCED CURRENTBLOCK ALREADY
2530         JRST GVNF1      ;AND WILL STORE NAME IN STE ANYWAY.
2531         SKIPGE ESBK     ;ELSE IF NO SPEC'D BLOCK,
2532          TRNN FF,FRNPSS ;FORCE .MAIN BLOCK SO DON'T GET LOTS OF UNDEF ENTRIES.
2533           CAIA          ;BUT CAN'T DO THAT FOR 1PASS OR WOULD MISS FWD REFS.
2534            HRRI C,BKWPB
2535         MOVSI T,LCUDF
2536         PUSHJ P,VSM2
2537         JRST GVUNDF     ;MAYBE ERROR, MAKE GLOTB ENTRY.
2538
2539 GVCOM:  TRO I,IRCOM     ;COMMON: SAY THIS WAS ONE.
2540         HRRZ A,B        ;RETURN RH OF VALUE, ABSOLUTE.
2541         JRST CLBPOP
2542
2543 GVPSEU: TLNN I,ILVAR+ILGLI      ;CAN'T MAKE PSEUD OR MACRO GLOBAL OR VAR.
2544          JRST (B)               ;OTHERWISE, DISPATCH TO IT.
2545         TLZE I,ILVAR
2546          ETSM ERRCBV
2547         TLZE I,ILGLI
2548          ETSM ERRCBG
2549         JRST (B)        ;DISPATCH TO PSEUDO (OR MACCL IF MACRO)
2550                         ;EXPECTS LH OF VALUE IN LH OF B.
2551
2552 ERRCBV: ASCIZ /Can't be a variable/
2553 ERRCBG: ASCIZ /Can't be global/
2554
2555 GTVL7B: TLNE C,3RLL     ;R(LH)
2556         TLO SYM,200000
2557         TLNE C,3RLR     ;R(RH)
2558         TLO SYM,100000
2559         POPJ P,
2560 \f
2561 GVSYM:  TLNN C,3REL
2562          TLNE I,ILVAR\ILGLI
2563           JRST GVSYM2
2564         MOVE A,B        ;THIS CODE DOES WHAT GVSYM2 WOULD DO, BUT FASTER.
2565         SETZ B,
2566         RET
2567
2568 GVSYM2: TLZE I,ILVAR    ;LOCAL SYM: CAN'T MAKE VARIABLE.
2569          ETSM ERRMDV
2570         TLZN I,ILGLI
2571         JRST GVSYM0     ;NOT MAKING GLOBAL, GET VALUE & RETURN.
2572 GVSYM1: MOVSI T,GLOETY  ;BECOMES DEF. GLOBAL.
2573         PUSHJ P,VSM2
2574         JRST GVDG1      ;HANDLE AS IF WAS DEF GLOBAL.
2575
2576 ERRMDV: ASCIZ /Multiply-defined variable/
2577
2578 GVDG:   TLZE I,ILVAR    ;GLOBAL ENTRY
2579          ETSM ERRMDV
2580 ;COME HERE FOR DEF GLOBAL
2581 GVDG1:  SKIPGE CONTRL
2582          JRST GVDLV2    ;DON'T PUNCH VALUE IF ABSOLUTE.
2583         TLNE C,3VP
2584          JRST GVDG2     ;VALUE PUNCHED ALREADY, NOT AGAIN.
2585         JUMPGE FF,GVDG2
2586         TLNN C,3LLV
2587          TRNE I,IRPSUD+IREQL
2588           JRST GVDG2
2589         TLO SYM,40000
2590         PUSH P,WRD
2591         PUSHJ P,OUTDE2
2592         POP P,WRD
2593 GVDG2:  TRNN I,IRPSUD\IREQL     ;IF INSIDE AN ORDINARY STORAGE WORD,
2594          TLNN C,3REL            ;GENERATE A GLOBAL REF IF GLOBAL IS RELOCATABLE (HEURISTIC).
2595 GVDLV2:   TLNE C,3LLV           ;IF VAL KNOWN ONLY BY STINK, MUST MAKE A GLOBAL REF.
2596            JRST GVGLTB
2597 GVSYM0: MOVE A,B        ;USED IN LBRAK
2598         LDB B,[.BP (3RLR),C]
2599         TLNE C,3RLL
2600          TLO B,1
2601         POPJ P,
2602
2603 GVUND1: MOVE A,CONTRL
2604         TRNE A,DECREL+FASL      ;DEC FMT OR FASL => UNDEF GLOBALS OK.
2605          JRST GVGLT1
2606 GVUGV:
2607 GVUNDF: TRZ I,IRDEF     ;UNDEFINED, MAYBE ERROR, MAKE GLOTB ENTRY.
2608         TRNE I,IRPSUD\IREQL
2609          JRST GVUND2    ;PSEUDO
2610         TRNN FF,FRPSS2
2611          JRST GVGLT1            ;PASS 1
2612         SKIPN CONDEP
2613          ETSM [ASCIZ/Undefined/]
2614         SKIPE CONDEP
2615          ETSM [ASCIZ/Undefined in literal/]
2616         JRST CABPOP
2617
2618 GVUND2: HLRZ A,GTVER    ;DOES GTVER POINT TO AN INSN?
2619         JUMPE A,[XCT @GTVER ? JRST CABPOP]
2620         ERJ .+1         ;NO, IT IS NAME OF PSEUDO.
2621         MOVE A,LINEL
2622         CAIGE A,75.     ;CR-LF-TAB NOW IF WHOLE MSG WON'T FIT ON A LINE.
2623          CALL CRRTBX
2624         TYPE2 SYM       ;TYPE NAME OF UNDEF SYM.
2625         TYPR [ASCIZ/    Undefined in /]
2626         TYPE2 GTVER
2627         CALL CRRERR
2628         JRST CABPOP
2629 \f
2630 ;EVALUATE SYMBOL, SQUOZE (FLAGS OFF) IN SYM
2631 ;IDX OF BLOCK TO DEFINE IN IN ESBK (OR -1 => ANY BLOCK NOW IN PROGRESS).
2632 ;DOESN'T CLOBBER F (FOR WRQOTE)
2633 ;RETURNS SKIPPING IF SYM FOUND, WITH SQUOZE FLAGS IN BOTTOM OF A,
2634 ;VALUE OF SYM IN B, STE IDX IN D, AND 3RDWD IN C.
2635 ;IF NOT FOUND, RETURNS IN D THE IDX OF A PLACE TO DEFINE SYM.
2636 ;CALL ESDCHK TO GET THE FOLLOWING EXTRA INFO (WHETHER SYM FOUND OR NOT):
2637 ;ESLAST -> LAST STE WITH DESIRED NAME SEEN, REGARDLESS OF WHAT BLOCK IT'S IN
2638 ;ESL1 HAS LEVEL OF BLOCK OF BEST STE SEEN, -1 IF NOT FOUND
2639 ;ESL2 HAS 3RDWRD OF BEST.
2640 ;ESXPUN HAS -1 OR IDX OF A STE WHICH MIGHT BE USED TO DEFINE THE SYM.
2641 ;RH(TM) GETS BLOCK IDX TO DEFINE IN IF DEFINE THE SYM.
2642 ;TT HAS -<# STE NOT LOOKED AT YET>
2643 ;THEN IF SYM IS FOUND IN A CONTAINING BLOCK AND YOU WANT TO DEFINE
2644 ;IT IN THE CURRENT BLOCK, YOU CAN CALL DEFCHK TO FIND AN STE TO DO IT IN.
2645 ;CALLING ESDEF IS AS GOOD AS CALLING ESDCHK AND DEFCHK, BUT DOESN'T
2646 ;LET YOU SEE WHAT YOU ARE GOING TO SHADOW.
2647
2648 ESDEF:  MOVE A,BKCUR    ;EVAL SYM IN ORDER TO DEFINE IT:
2649         SKIPGE ESBK     ;IF NO SPEC'D BLOCK, SPEC THE CURRENT BLOCK,
2650         MOVEM A,ESBK    ;SO DEFS IN CONTAINING BLOCKS WON'T BE SEEN
2651
2652 ESDCHK: SETOM ESLAST    ;CALL HERE IF WE MIGHT END UP CALLING DEFCHK,
2653         SETOM ESL1      ;SINCE IN THAT CASE WE'LL NEED THESE VARS EVEN IF SYM IS FOUND
2654         SETOM ESXPUN    ;RIGHT AWAY.
2655         MOVN TT,SYMLEN
2656 ES:     MOVE C,SYM      ;HASH AWAY
2657         TSC C,SYM       ;THIS MAKES SURE THAT THE FIRST FEW CHARS OF SYMBOL DON'T GIVE
2658                         ;A ZERO REMAINDER, IF SYMLEN IS A ROUND NUMBER.
2659         MOVMS C         ;THIS IS BECAUSE IDIV OF NEGATIVE NUMBER GIVES NEG. REMAINDER.
2660         IDIV C,SYMLEN
2661         IMUL D,WPSTE
2662         SKIPGE TM,ESBK  ;GET BKTAB IDX OF SPEC'D BLOCK
2663          HRR TM,BKCUR   ;OR -1,,BKTAB IDX OF CURRENT BLOCK.
2664 ;NOW CHECK FAST FOR AN IMMEDIATE MATCH - AVOID SETTING UP FLAGS NEEDED ONLY WHEN
2665 ;SYM APPEARS IN MULTIPLE BLOCKS OR ISN'T DEFINED.
2666         SKIPN B,ST(D)
2667          JRST ESEND0    ;SYM IS KNOWN NOT TO BE DEFINED.
2668         TLZ B,740000
2669         CAME B,SYM
2670          JRST ESBAD0    ;NOT FOUND IN 1ST ENTRY - MUST SET UP INFO AND LOOP
2671         3GET C,D
2672         MOVEI A,(C)
2673         CAIN A,(TM)
2674          JRST ESGOOD    ;IN THE DESIRED BLOCK => GOOD.
2675         TDNN C,[3MAS,,-1]       ;IN THE INITIAL SYMS BLOCK, NOT PRESENT IN ANY OTHER,
2676          JUMPL TM,ESGOOD        ;AND BLOCK WASN'T EXPLICITLY SPEC'D => GOOD.
2677         MOVN TT,SYMLEN  ;ELSE MUST KEEP LOOKING TO SEE IF THIS DEF IS REALLY ONE WE WANT.
2678         SETOM ESLAST
2679         SETOM ESL1
2680         SETOM ESXPUN
2681         JUMPGE TM,ESIGN
2682         JRST ESLP1
2683 \f
2684 ;LOOK AT THE NEXT STE, WHILE LOOPING.
2685 ESLP:   SKIPN B,ST(D)   ;GET SQUOZE IN THIS ST SLOT
2686          JRST ESEND     ;NOTHING WHERE SYM BELONGS, END SEARCH
2687         TLZ B,740000    ;CLEAR OUT FLAGS
2688         CAME B,SYM      ;COMPARE WITH WANTED
2689          JRST ESBAD     ;NO MATCH BUT MAYBE KEEP GOING
2690         3GET C,D        ;FOUND SYM, GET 3RDWRD
2691         MOVEI A,(C)
2692         CAIN A,(TM)     ;DEFINED IN DESIRED BLOCK
2693          JRST ESGOOD    ; => MUST BE GOOD.
2694 ESLP0:  JUMPGE TM,ESIGN ;BLOCK SPEC'D => ALLOW NO OTHERS.
2695         TDNE C,[3MAS,,-1]       ;IF IN INITIAL SYMS BLK, NO MORE DEFS,
2696          JRST ESLP1
2697         SKIPGE ESL1     ;AND NO PREVIOUS DEFS,
2698          JRST ESGOOD    ;UNREDEFINED INITL SYM MUST BE GOOD.
2699 ESLP1:  HLRZ B,BKTAB+1(C)       ;GET LEVEL OF BLOCK DEF. IS IN.
2700         CAMN A,BKPDL(B) ;SAME AS BLOCK WE'RE IN AT THAT LEVEL?
2701          CAMLE B,BKLVL  ;AND NOT A BLOCK WE'VE EXITED
2702           JRST ESIGN
2703         CAMG B,ESL1     ;OR HIGHER LEVEL THAN PREVIOUS BEST
2704          JRST ESIGN
2705         MOVEM C,ESL2    ;REPLACE BEST'S 3RDWRD, LEVEL, ADDR.
2706         MOVEM B,ESL1
2707         MOVEM D,SADR
2708 ESIGN:  HRRZM D,ESLAST  ;THIS ENTRY LAST SEEN WITH THIS NAME.
2709         TLNN C,3MAS     ;MORE STE'S FOR THIS SYM => 
2710          JRST ESEND1
2711         JRST ESNXT      ;KEEP LOOKING.
2712
2713 ;COME HERE IF 1ST SYM SEEN ISN'T THE SAME NAME. SET UP TO LOOP.
2714 ESBAD0: MOVN TT,SYMLEN
2715         SETOM ESLAST
2716         SETOM ESL1
2717         SETOB C,ESXPUN
2718 ;HERE WHILE LOOPING WHEN SYM WITH WRONG NAME IS SEEN.
2719 ESBAD:  JUMPN B,ESNXT
2720         SKIPGE A,ESXPUN ;IF THIS IS 1ST EXPUNGED ENTRY SEEN
2721          MOVEM D,ESXPUN ;REMEMBER IT FOR DEFINITION.
2722         SKIPGE A
2723          HRROS ESLAST   ;AND SET OLD ENTRY'S 3MAS.
2724 ESNXT:  ADD D,WPSTE
2725         CAML D,SYMSIZ   ;AT END => GO TO BEGINNING
2726          MOVEI D,0
2727         AOJN TT,ESLP
2728         JRST ESEND1     ;NOT FOUND.
2729 \f
2730 ESEND0: MOVEI C,(TM)    ;COME HERE IF 1ST PLACE LOOKED AT SHOWS THE SYM ISN'T DEFINED
2731         MOVEM D,ESXPUN
2732         POPJ P,
2733
2734 ESEND:  SKIPGE A,ESXPUN ;FREE ENTRY CAN BE USED TO DEFINE.
2735         MOVEM D,ESXPUN
2736         SKIPGE A
2737         HRROS ESLAST
2738 ESEND1: SKIPGE ESL1     ;NOT FOUND => FIND PLACE TO DEFINE IT.
2739         JRST DEFCH1
2740         MOVE D,SADR     ;IDX OF BEST FOUND.
2741         TRNN FF,FRNPSS
2742         JRST ES1PS      ;1-PASS, SPECIAL CHECK.
2743         MOVE C,ESL2     ;GET BEST'S 3RDWRD.
2744 ESGOOD: LDB A,[400400,,ST(D)]   ;GET SQUOZE FLAGS IN A.
2745 ES1POK: MOVE B,ST+1(D)  ;VALUE OF SYM. IN B.
2746                         ;D HAS IDX OF 1STWRD IN SYM TAB.
2747                         ;C HAS 3RDWRD
2748 POPJ1:  AOS (P)
2749 CPOPJ:  POPJ P,
2750
2751 ;ESDCHK THEN DEFCHK IS SAME AS CALLING ESDEF.
2752 DEFCHK: SKIPGE ESL1     ;IF WE DIDN'T TAKE TIME TO SET ESLAST BEFORE,
2753         HRRZM D,ESLAST  ;DO IT NOW. (SEE BEFORE ESLP1)
2754         JRST DEFCH1
2755
2756 ES1PS:  LDB A,[400400,,ST(D)]   ;1PASS & FOUND IN CONTAINING BLOCK:
2757         MOVE C,ESL2
2758         TRNN C,-1       ;INITIAL SYM, OK;
2759          JRST ES1POK
2760         CAIE A,1        ;PSEUDO OR MACRO
2761          TLNE C,3DOWN   ;OR .DOWN'D SYMBOL OK;
2762           JRST ES1POK   ;ELSE GET NEW STE TO DEF.
2763 DEFCH1: MOVEI C,(TM)    ;INITIALIZE NEW 3RDWRD WITH BLOCK TO DEF IN.
2764         SKIPL D,ESXPUN  ;IF FOUND EXPUNGED OR FREE ENTRY, USE IT.
2765         JRST DEFCH2
2766         SKIPGE D,ESLAST ;ELSE LOOK FOR ONE.
2767          ETF ERRSCE
2768 DEFCH4: MOVE B,ST(D)
2769         TLZ B,740000
2770         JUMPE B,DEFCH3  ;MUST RETURN 0 IN B IF DON'T SKIP.
2771         ADD D,WPSTE
2772         CAML D,SYMSIZ
2773         MOVEI D,0
2774         AOJL TT,DEFCH4  ;ASSUME TT LEFT AROUND FROM ES.
2775         ETF ERRSCE
2776 ERRSCE: ASCIZ /Symbol table full/
2777
2778 ;ESLAST HAS -1 IF NO ENTRY SEEN;  ELSE
2779 ;RH HAS IDX OF LAST SEEN, SIGN SET IF SEEN BEFORE PLACE TO DEFINE.
2780 DEFCH3: MOVEM D,ESXPUN  ;REMEMBER ADDR WHERE CAN DEFINE
2781         HRROS ESLAST    ;LAST PLACE SEEN MUST BE EARLIER.
2782 DEFCH2: SKIPL A,ESLAST
2783         JRST DEFCH5     ;LAST PLACE SEEN WAS SEEN AFTER PLACE TO DEFINE.
2784         CAMN A,[-1]
2785         POPJ P,         ;REALLY NEVER SEEN.
2786         MOVSI TM,3MAS
2787         IORM TM,ST+2(A) ;PLACE SEEN IS EARLIER, SET ITS 3MAS.
2788         POPJ P,
2789
2790 DEFCH5: TLO C,3MAS      ;PLACE TO DEF BEFORE EXISTING STES.
2791         POPJ P,
2792 \f
2793 ;ENTER A SYM IN SYMBOL TABLE
2794                 ;B HAS VALUE
2795                 ;C HAS 3RDWRD
2796                 ;D HAS INDEX INTO ST (PROBABLY SET UP BY ES)
2797                 ;T HAS SQUOZE FLAGS (ONLY) IN PLACE FOR IOR OF SQUOZE
2798                 ;SYM HAS SQUOZE, FLAGS OF WHICH ARE IGNORED
2799
2800 VSM2LV: TLOA C,3LLV     ;ENTRY FOR LINKING LOADER MUST SUPPLY VALUE
2801 VSM2W:  MOVE B,WRD      ;ENTRY TO ENTER VALUE OF WRD STEAD B
2802 VSM2:   MOVE CH1,SYM
2803         TLZ CH1,740000
2804         IOR CH1,T       ;CH1 := SQUOZE WITH FLAGS
2805         MOVEM CH1,ST(D) ;STORE SQUOZE
2806         MOVEM B,ST+1(D) ;STORE VALUE
2807 VSM3A:  3PUT C,D        ;STORE 3RDWRD
2808         POPJ P,
2809
2810 ;RETURN THE NUMBER OF SYMTAB SLOTS IN USE.
2811 A.SYMCN:MOVE D,SYMAOB
2812         SETZ A,
2813 A.SYC1: MOVE B,ST(D)
2814         TLZ B,740000
2815         SKIPE B
2816          AOS A
2817         ADD D,WPSTE1
2818         AOBJN D,A.SYC1
2819         JRST CLBPOP
2820 \f
2821 ;;EQUAL         ;EQUAL SIGN ENCOUNTERED, DO PARAMETER ASSIGNMENT
2822
2823 EQUAL:  TLZ FF,FLHKIL
2824         PUSHJ P,RCH
2825         CAIE A,"=       ;DECIDE WHETHER TO HALF-KILL THE SYM.
2826          TLOA FF,FLUNRD
2827           TLO FF,FLHKIL
2828         SETZM LABELF
2829         CALL RCH
2830         CAIE A,":       ;DECIDE WHETHER TO MARK SYM AS NOT REDEFINABLE.
2831          TLOA FF,FLUNRD
2832           SETOM LABELF
2833         CAMN SYM,[SQUOZE 0,.]   ;.=FOO, SAME AS LOC FOO
2834          JRST PTEQ
2835         TDNN I,[ILWORD,,IROP+IRNOEQ]
2836          TRNN I,IRLET
2837           ETR [ASCIZ/= With bad format or bad context/]
2838         PUSH P,SYM
2839         PUSH P,ESBK
2840         PUSH P,I
2841         MOVEI A,[ETSM [ASCIZ/Undefined in =/]]
2842         MOVEM A,GTVER
2843         TRO I,IRNOEQ+IRDEF+IREQL
2844         PUSHJ P,GETWRD
2845         MOVEI CH1,CRDF
2846         MOVEM CH1,PARBIT        ;SET FLAG TO TELL LOADER TO ALLOW REDEFINITION
2847         TRNN I,IRDEF
2848          JRST ASEM1A    ;UNDEFINED SYMS IN VALUE, IGNORE
2849 IFN LISTSW,[
2850         SKIPN LSTONP
2851          JRST EQUAL1    ;NOT LISTING.
2852         SKIPGE LISTPF
2853          PUSHJ P,PNTR
2854         MOVE SYM,WRD
2855         MOVEM SYM,LISTWD
2856         MOVE SYM,WRDRLC
2857         MOVEM SYM,LSTRLC
2858         SETOM LISTAD
2859         SETOM LISTPF
2860 EQUAL1:
2861 ] ;END IFN LISTSW,
2862         TDZ I,[-1-(ILMWRD)]
2863         IOR I,(P)
2864         TLZ FF,FLUNRD
2865         POP P,(P)
2866         POP P,ESBK
2867         POP P,SYM
2868         MOVE A,WRDRLC   ;GET RELOCATION
2869         TDNN A,[-2,,-2] ;SKIP ON NON-STANDARD RELOCATION BITS
2870         SKIPE LDCCC
2871         JRST EQG1       ;STRANGE RELOCATION OR IN LOAD TIME CONDITIONALS => HAND PROBLEM TO LOADER
2872         MOVE A,GLSP1
2873         CAMN A,GLSP2
2874         JRST EQL1       ;NO GLOBALS IN DEFINITION
2875 ;FALLS THROUGH.
2876 \f
2877 ;FALLS THROUGH.
2878 ;GLOBALS TO RIGHT OF = OR WITHIN LOADER CONDIT.
2879 EQG1:   IFN CREFSW, XCT CRFLBL  ;CREF DEF. OF NORMAL SYM,
2880         SKIPGE CONTRL
2881          JUMPL FF,[ETASM [ASCIZ /Externals in =/]]
2882         CALL ESDCHK             ;SEARCH SYM TAB.
2883          JRST EQL2      ;NOT FOUND IN CURRENT OR CONTAINING BLKS.
2884         HRRZI T,(C)     ;GET BKTAB IDX OF BLOCK FOUND IN.
2885         CAIE T,(TM)
2886          JRST EQG1A
2887         XCT EQG1TB(A)   ;FOUND IN DESIRED BLOCK.
2888         JRST ASSEM1
2889
2890 EQG1A:  JUMPN T,EQG2
2891         CAIN A,PSUDO_-16        ;FOUND AS INITIAL PSEUDO => ERROR.
2892          ETSM ERRQPA
2893 EQG2:   CALL DEFCHK     ;FIND FREE STE TO DEFINE IN DESIRED BLOCK.
2894         JRST EQL2       ;PRETEND WASN'T FOUND.
2895
2896 ERRQPA: ASCIZ /Shadowing a pseudo-op/
2897 ERRIPA: ASCIZ /Illegal =/
2898
2899 EQG1TB: ETSM ERRIPA     ;COMMON
2900         ETSM ERRIPA     ;PSEUDO OR MACRO
2901         JRST EQL2       ;SYM
2902         JRST EQGUL      ;LOCAL UNDEF
2903         ETSM ERRIPA     ;DEF LOC VAR
2904         ETSM ERRIPA     ;UNDEF LOC VAR
2905         ETSM ERRIPA     ;DEF GLO VAR
2906         ETSM ERRIPA     ;UNDEF GLO VAR
2907         JRST EQL7       ;GLO ENTRY
2908         JRST EQL8       ;GLO EXIT
2909
2910 EQL8:   PUSHJ P,GLKPNR
2911         TLZ C,3LABEL\3MULTI
2912 EQL7:   MOVSI T,GLOETY  ;GLOBAL PARA ASSIGN
2913         MOVEI B,0
2914         TLO SYM,40000
2915 LOPRA1: PUSH P,CASM1A   ;RETURN TO ASSEM1A AFTER FOLLOWING.
2916         TLNE C,3MULTI
2917          ETSM ERRMDT
2918         SKIPE LABELF
2919          TLO C,3LABEL
2920         TLNE FF,FLHKIL
2921         TLOA SYM,400000 ;SET FLAG TO HALF-KILL SYM
2922         TLZA C,3SKILL
2923         TLO C,3SKILL    ;SET CORRESPONDING FLAG IN 3RDWRD
2924         PUSHJ P,VSM2LV
2925         JUMPGE FF,CPOPJ ;JUMP ON NOT PUNCHING PASS
2926         SKIPN PARBIT    ;IF CAME FROM COLON ROUTINE,
2927         JRST PDEFPT     ;PUNCH "DEFINE SYM AS $.".
2928         TLO C,3VP       ;VALUE PUNCHED
2929         3PUT C,D        ;STORE UPDATED 3RDWRD
2930         PUSHJ P,EBLK
2931         MOVEI TT,LGPA
2932         DPB TT,[310700,,BKBUF]
2933         PUSHJ P,OUTSM0
2934         PUSHJ P,PWRDA
2935         JRST EBLK
2936
2937 EQGUL:  PUSHJ P,LKPNRO  ;LOCAL UNDEF, OUTPUT LINK REQUEST.
2938         TLZ C,3LABEL\3MULTI     ;CAN'T DETECT MDT'S WHEN ONLY STINK KNOWS FOR SURE.
2939 EQL2:   TLNE I,ILGLI
2940          JRST EQL7      ;MAKE IT GLOBAL
2941         MOVSI T,LCUDF   ;LOCAL UNDEFINED
2942         JRST LOPRA1
2943
2944 CASM1A: JRST ASEM1A
2945 \f
2946 ;MAYBE PUNCH OUT LINK REQUEST
2947 ;SYM HAS NAME OF SYM TO REQUEST, D STE IDX OF SYM, C 3RDWRD, B ADR OF REQUEST
2948 ;REQUEST WILL BE PUNCHED IF 3RLNK SET IN C OR IF ANYTHING SET IN LH(B)
2949
2950 GLKPNR: TLO SYM,40000   ;GLO BIT
2951 LKPNRO: TLNN C,3RLNK
2952         TLNE B,-1
2953         TROA I,IRCONT
2954         POPJ P,         ;DON'T PUNCH REQUEST
2955         MOVE A,CONTRL
2956         TRNE A,DECREL
2957          JRST LKPNDR    ;DIFFERENT WAY TO OUTPUT THIS INFO IN DECREL FMT
2958         MOVEI A,6
2959         PUSHJ P,PBITS
2960         PUSHJ P,OUTSM0  ;PUNCH SYM
2961         HLRZ A,B
2962         TLZE C,3RLNK    ;RELOC OF LINK PNR
2963         TLO A,100000
2964         HRRZS B         ;CLEAR OUT LH OF B
2965         TRZ I,IRCONT    ;OK TO END BLOCK NOW
2966         JRST $OUTPT     ;PUNCH OUT A AND RETURN
2967
2968 LKPNDR: MOVSI A,DECINT  ;WRITE AN "INTERNAL REQUEST" WITH ONE DATA WORD.
2969         CALL DECBLK
2970         SETZ TM,        ;COMPUTE RELOC OF ADDRESS AND DATA IN TM.
2971         TLNE C,3RLNK
2972          TRO TM,2
2973         SKIPE WRDRLC
2974          TRO TM,1
2975         MOVE A,WRD      ;ADDRESS TO LINK,,DATA
2976         HRL A,B
2977         CALL DECWR1
2978         JRST EBLK
2979
2980 ;THESE ASSUME STE IDX IN D, SQUOZE W/ FLAGS IN SYM.
2981 ;C HAS 3RDWRD, B OR WRD HAS VALUE TO DEF. WITH.
2982 ;CALL ONLY IN RELOCATABLE ASSEMBLY.
2983 OUTDE2: MOVEM B,WRD
2984 OUTDE1: TLNE FF,FLPPSS
2985         TLO C,3VP       ;VALUE PUNCHED
2986         3PUT C,D
2987         SKIPGE CONTRL
2988          RET
2989         TRO I,IRCONT
2990         PUSHJ P,P70     ;PUNCH OUT CODE BITS
2991         PUSHJ P,GTVL7B  ;SET RELOCATION BITS IN SQUOZE
2992         PUSHJ P,OUTSM0
2993         TRZ I,IRCONT
2994         JRST OUTWD      ;OUTPUT VALUE
2995
2996 ;PUNCH OUT LOCAL-GLOBAL RECOVERY BITS AND SYM
2997 ;I.E. TELL LOADER THAT SQUOZE IN SYM, FORMERLY CONSIDERED LOCAL, IS REALLY GLOBAL
2998 PLOGLO: SKIPGE CONTRL
2999          RET
3000         PUSHJ P,MKROOM
3001         PUSH P,A
3002         PUSHJ P,PBITS7
3003         MOVEI A,CLGLO
3004         PUSHJ P,PBITS
3005         TLO SYM,400000  ;SAY THIS IS NEW STYLE RQ,
3006         PUSHJ P,OUTSM0  ;PUNCH "OLD NAME" = SYMTAB IDX,
3007         TLC SYM,440000  ;SAY MAKE GLOBAL, OUTPUT ACTUAL NAME OF SYM.
3008         PUSHJ P,OUTSM
3009         JRST POPAJ
3010 \f
3011                 ;NO GLOBALS TO RIGHT OF EQUAL SIGN
3012
3013 EQL1:   PUSHJ P,ESDCHK
3014          JRST EQL1A     ;NOT FOUND
3015 IFN CREFSW,XCT CRFEQL   ;DEF. OCCUR. OF NORMAL SYM. OR INTSYM.
3016         MOVEI T,(C)     ;GET BKTAB IDX OF BLOCK FOUND IN.
3017         CAIE T,(TM)
3018          JRST EQL1F
3019         SKIPE LABELF    ;"=:" MEANS "SYM'S VALUE SHOULDN'T BE CHANGED".
3020          TLO C,3LABEL
3021         XCT EQL1TB(A)   ;FOUND IN DESIRED BLOCK => NOW REDEFINE.
3022         JRST ASSEM1
3023
3024 EQL1F:  JUMPN T,EQL10
3025         CAIE A,PSUDO_-16
3026          JRST EQL10
3027         MOVEI T,(B)     ;FOUND AS PSEUDO IN INITIAL SYMS BLOCK,
3028         CAIN T,INTSYM   ;SPECIAL WAY TO REDEFINE IF LIKE .MLLIT, ETC.
3029          JRST EQLINT
3030         ETSM ERRQPA     ;SHADOWING AN INITIAL PSEUDO, TELL USER.
3031 EQL10:  CALL DEFCHK     ;FOUND IN OUTER BLOCK, GET NEW STE,
3032         JRST EQL1A      ;DEFINE THERE AS IF NOT FOUND.
3033
3034 EQL1TB: ETSM ERRIPA     ;COMMON
3035         JRST EQL1B2     ;PSEUDO OR MACRO
3036         JRST EQL1B      ;SYM
3037         JRST EQL1C      ;LOCAL UNDEF
3038         ETSM ERRIPA     ;DEF LOC VAR
3039         ETSM ERRIPA     ;UNDEF LOC VAR
3040         ETSM ERRIPA     ;DEF GLO VAR
3041         ETSM ERRIPA     ;UNDEF GLO VAR
3042         JRST EQL1D      ;GLO ENTRY
3043         JRST EQL1E      ;GLO EXIT
3044
3045 EQL1E:  PUSHJ P,GLKPNR  ;DUMP LINKING POINTER
3046         CAIA
3047 EQL1D:   CALL MDTCHK
3048         PUSHJ P,RCHKT   ;GLO ENTRY
3049 EQLB2:  PUSHJ P,RMOVET
3050         TLNE FF,FLHKIL
3051         TLOA SYM,400000
3052         TLZA C,3SKILL
3053         TLO C,3SKILL
3054         HRLZI T,GLOETY
3055         SKIPE LDCCC     ;IF IN LOADER CONDITIONAL,
3056         TLO C,3LLV      ;THEN LOADER MUST SUPPLY VALUE
3057         PUSHJ P,VSM2W   ;DEFINE SYM
3058         TLO SYM,40000   ;SET GLOBAL BIT IN SQUOZE
3059 EQL1CE: JUMPGE FF,ASEM1A
3060         PUSHJ P,OUTDE1
3061 ASEM1A: TLNE I,ILMWRD
3062         PUSHJ P,IGTXT
3063         JRST ASSEM1
3064
3065 ;CHECK WHETHER DEFINING AN MDT, OR REDEFINING A LABEL (=> THIS IS AN MDT)
3066 MDTCHK: TLNN C,3LABEL
3067          JRST MDTCH1
3068         CALL GVSYM0     ;MOVE VALUE OF SYM TO A, GET RELOC (WRDRLC STYLE) IN B
3069         CAMN A,WRD
3070          CAME B,WRDRLC  ;IF WE'RE CHANGING THE VALUE, MARK SYM AS MDT
3071 MDTCHL:   TLO C,3MULTI
3072 MDTCH1: TLNE C,3MULTI   ;EVER ASSIGNING TO MDT, EVEN SAME VALUE, GIVES ERR MSG
3073          ETSM ERRMDT
3074         RET
3075 \f
3076 EQL1C:  TLNE I,ILGLI
3077         JRST EQL1CA     ;MAKE GLOBAL
3078         PUSH P,C
3079         PUSHJ P,LKPNRO  ;MAYBE OUTPUT LINK REQUEST
3080         PUSHJ P,RCHKT
3081         PUSHJ P,RMOVET  ;INITIALIZE 3RDWRD
3082         MOVSI T,SYMC    ;SYM
3083         PUSHJ P,EQA2A   ;ENTER DEF IN SYMTAB
3084         TLNE C,3SKILL
3085         TLO SYM,400000
3086         POP P,AA
3087         TLNE AA,3VCNT   ;USED IN CONSTANT
3088         PUSHJ P,CONBUG
3089         JRST EQL1CE
3090
3091                 ;PUNCH OUT CODE BIT PAIR, FIRST OF WHICH IS 7
3092
3093 P7X:    MOVEM A,PARBIT  ;ENTRY FOR SECOND BYTE IN A
3094 P70:    PUSHJ P,PBITS7  ;ENTRY FOR SECOND BITE IN PARBIT, PUNCH OUT THE 7
3095         SKIPA A,PARBIT  ;GET SECOND BYTE BACK
3096 PBITS7: MOVEI A,7       ;ENTRY TO JUST PUNCH OUT 7
3097         JRST PBITS
3098
3099 EQL1CA: PUSHJ P,PLOGLO
3100         JRST EQL1E
3101 EQA2:   PUSH P,CASM1A
3102 EQA2A:  TLNE FF,FLHKIL
3103         TLO C,3SKILL
3104         JRST VSM2W
3105
3106 EQL1B2: HRRZ A,B        ;ATTEMPT TO ASSIGN PSEUDO-OP, IS IT AN INTSYM?
3107         CAIN A,INTSYM
3108          JRST EQLINT    ;YES, GO SET WD IT POINTS TO.
3109         ETSM [ASCIZ /Pseudo or macro ='D/]
3110 EQL1B:  CALL MDTCHK
3111         PUSHJ P,RCHKT
3112         TLNE I,ILGLI
3113          JRST EQLB2     ;WAS LOCAL, MAKE IT GLOBAL
3114                 ;WAS LOCAL, LEAVE IT LOCAL
3115         PUSHJ P,RMOVET  ;PUT RELOCATION BITS IN BITS 0 AND 1 OF C (I.E. START SETTING UP 3RDWRD)
3116         MOVSI T,SYMC    ;SYM
3117         JRST EQA2
3118
3119 EQL1A1: PUSHJ P,RCHKT
3120         PUSHJ P,RMOVET
3121         HRLZI T,SYMC
3122         JRST EQA2
3123
3124 EQL1A:  SKIPE LABELF    ;"=:" MEANS "SYM'S VALUE SHOULDN'T BE CHANGED".
3125          TLO C,3LABEL
3126 IFN CREFSW,XCT CRFLBL   ;DEF. OCCUR. OF NORMAL SYM.
3127         TLNN I,ILGLI
3128         JRST EQL1A1
3129         JRST EQL1E
3130
3131 EQLINT: HLRZS B         ;GET ADDR OF WD HOLDING VALUE.
3132         MOVEMM (B),WRD  ;PUT NEW VALUE IN IT.
3133         JRST ASEM1A
3134 \f
3135 ;;.             ;ROUTINES DEALING WITH THE CURRENT LOCATION AND OFFSET
3136
3137 VBLK
3138 CLOC:   0       ;PUNCHING LOC
3139 CRLOC:  0       ;PUNCHING RELOC
3140 OFLOC:  0       ;OFSET VAL
3141 OFRLOC: 0       ;OFSET RELOC
3142 ;VAL OF PT=CLOC+OFLOC,CRLOC+OFLOC
3143 SYLOC:  0       ;VAL OF LAST TAG
3144 SYSYM:  0       ;LAST TAG
3145 SYLOC1: 0       ;VALUE OF NEXT TO LAST TAG
3146 SYSYM1: 0       ;NEXT TO LAST TAG
3147 GLOCTP: 0       ;4.9 => CURRENT LOCATION GLOBAL, 2.9 => OFFSET GLOBAL
3148                 ;FRGLOL (FLAG IN FF) IS IOR OF BITS 4.9 AND 2.9 OF GLOCTP
3149                 ;EXCEPT AFTER .=NON-GLOBAL WITH GLOBAL OFFSET
3150                 ;OTHER BITS USED ONLY WHEN IN LINK (NEVER SET IN GLOCTP):
3151                 ;400 => ARG GLOBAL
3152 PBLK
3153
3154
3155                 ;POINT (.) AS PSEUDO-OP
3156
3157 GTVLP:  TRNE FF,FRGLOL
3158         JRST GTVLP2     ;LOCATION GLOBAL
3159         MOVE B,OFRLOC   ;GET RELOCATION OF OFFSET
3160         ADD B,CRLOC     ;ADD CURRENT RELOCATION
3161         MOVE A,CLOC     ;GET CURRENT LOCATION
3162         SKIPGE BYTM1    ;IF IN BYTE MODE,
3163         HLL A,BYTWP     ;SET LEFT HALF TO BYTE POINTER LEFT HALF FOR ILDB
3164         ADD A,OFLOC     ;NOW ADD OFFSET
3165         TLZ I,ILFLO+ILDECP+IRPERI       ;CLEAR OUT FLAGS SET WHEN LOOKED LIKE FLOATING POINT NUMBER
3166         POPJ P,
3167
3168
3169 GTVLP2: MOVEI T,$.H     ;LOCATION GLOBAL
3170         AOS GLSP1
3171         HRRZM T,@GLSP1  ;PUT $. ON GLOBAL LIST (INCLUDES OFFSET, WHETHER GLOBAL OR NOT)
3172         SKIPL BYTM1     ;IN BYTE MODE?
3173         TDZA A,A        ;NO, CLEAR ABS PART OF VALUE
3174         HLLZ A,BYTWP    ;YES, USE LH(BP) AS ABS PART
3175         JRST CLBPOP
3176
3177 $.H:    (GLOETY)+SQUOZE 0,$.    ;CURRENT LOCATION + OFFSET IN LOADER
3178 $L.H:   (GLOETY)+SQUOZE 0,$L.   ;LOCATION BEING LOADED INTO BY LOADER, USED BY ABLOCK
3179 $O.H:   (GLOETY)+SQUOZE 0,$O.   ;LOADER OFFSET
3180 $R.H:   (GLOEXT)+SQUOZE 0,$R.   ;RELOCATION AS GLOBAL
3181 \f
3182 COLON:  TRNE I,IRLET
3183          TRNN I,IRSYL
3184           ETA [ASCIZ/Colon without preceding symbol/]
3185         TLNN I,ILWORD
3186          TRNE I,IROP+IRPSUD+IREQL+IRNOEQ
3187           ETSM [ASCIZ/Label inside an expression/]
3188         SKIPE ASMOUT
3189          ETSM [ASCIZ /Label inside <>, () or []/]
3190         TLZ FF,FLHKIL
3191         PUSHJ P,RCH     ;GET NEXT CHAR
3192         CAIN A,":       ;IF NEXT CHAR ANOTHER COLON,
3193         TLOA FF,FLHKIL  ;THEN SET FLAG TO HALF-KILL
3194         TLO FF,FLUNRD   ;NOT COLON, CAUSE IT TO BE RE-INPUT
3195         SKIPE HKALL     ;CHECK FOR HALF-KILL-ALL-LABELS MODE.
3196          TLO FF,FLHKIL
3197         MOVE T,CLOC     ;GET CURRENT LOCATION
3198         SKIPGE BYTM1
3199         HLL T,BYTWP     ;BYTE MODE, SET LEFT HALF OF VALUE TO LEFT HALF OF BYTE POINTER
3200         ADD T,OFLOC     ;ADD OFFSET
3201         MOVEM T,WRD     ;STORE RESULT AWAY FOR POSSIBLE PUNCHOUT
3202         EXCH T,SYLOC    ;NOW SET UP STUFF FOR ERROR PRINTOUT
3203         MOVEM T,SYLOC1
3204         EXCH SYM,SYSYM
3205         MOVEM SYM,SYSYM1
3206         MOVE SYM,SYSYM
3207         MOVE A,CRLOC    ;SET UP RELOCATION
3208         ADD A,OFRLOC
3209         MOVEM A,WRDRLC
3210         CLEARM PARBIT   ;SET FLAG SAYING COLON, FOR DEFINITION PUNCHING
3211         SETOM LABELF    ;SET FLAG CAUSING 3LABEL (DON'T REDEFINE) TO BE SET.
3212         SKIPN LDCCC
3213         TRNE FF,FRGLOL
3214         JRST GCOL1      ;LOCATION VIRTUAL OR IN LOAD TIME CONDITIONAL
3215         PUSHJ P,ESDCHK  ;TRY FINDING CURRENT ENTRY IN ST
3216         JRST EQL1A      ;NOT ALREADY DEFINED
3217 IFN CREFSW,XCT CRFLBL
3218 COLON1: MOVEI T,(C)     ;BKTAB IDX OF BLOCK FOUND IN,
3219         CAIE T,(TM)     ;FOUND IN DESIRED BLOCK => TRY REDEFINING.
3220          JRST COLON3
3221         TLO C,3LABEL    ;CAUSE REDEFINING SYMBOL TO BARF
3222         XCT COLON2(A)   ;BUT MAYBE PRINT ERR MSG FIRST.
3223         JRST EQL1B
3224
3225 CASSM1: JRST ASSEM1
3226
3227 COLON3: JUMPN T,EQL10   ;NOT INITIAL SYM => CAN SHADOW,
3228         CAIN A,SYMC_-14. ;INITIAL SYM => CAN SHADOW IF IT'S AN ORDINARY LOCAL SYM
3229          CAME B,WRD     ;AND NEW VALUE SAME AS OLD VALUE.
3230           CAIA
3231            SKIPE WRDRLC
3232             ETSM ERRRES ;ELSE GIVE ERROR MESSAGE BEFORE SHADOWING, TO WARN USER.
3233         JRST EQL10
3234
3235 ERRRES: ASCIZ /Pseudo, macro or initial sym as label/
3236 ERRMDT: ASCIZ /Multiply defined/
3237
3238 COLON2: TLO C,3MULTI    ;COMMON
3239         ETSM ERRRES     ;MACRO OR PSEUDO
3240         JRST EQL1B      ;SYM
3241         JRST EQL1C      ;LOCAL UNDEF
3242         TLO C,3MULTI
3243         TLO C,3MULTI
3244         TLO C,3MULTI
3245         TLO C,3MULTI    ;SETTING 3MULTI CAUSES EQL1B TO PRINT AN MDT ERROR.
3246         JRST EQL1D      ;GLOBAL ENTRY
3247         JRST EQL1E      ;GLO EXIT
3248 \f
3249 ;COLON WHEN LOCATION VIRTUAL, OR IN LOAD TIME CONDITIONAL
3250
3251 GCOL1:  IFN CREFSW,XCT CRFLBL   ;DEFINING ORDINARY SYM.
3252         SKIPGE CONTRL
3253          ETASM [ASCIZ /Virtual label in abs assembly/]
3254         PUSHJ P,ESDCHK  ;FIND ITS SLOT IN ST
3255          JRST EQL2      ;JUST LIKE EQG1 EXCEPT FOR ERROR MESSAGES.
3256         MOVEI T,(C)
3257         CAIE T,(TM)
3258          JRST COLON5
3259         XCT GCOL1T(A)   ;FOUND IN DESIRED BLOCK, REDEFINING.
3260         JRST EQL2
3261
3262 COLON5: JUMPN T,EQG2    ;SHADOWING, OK UNLESS INITIAL SYM.
3263         ETSM ERRRES
3264         JRST EQG2
3265
3266 GCOL1T: TLO C,3MULTI    ;COMMON
3267         ETSM ERRRES     ;PSEUDO.
3268         JRST EQL2       ;SYM.
3269         JRST EQGUL      ;LOCAL UNDEF.
3270         TLO C,3MULTI    ;VAR
3271         TLO C,3MULTI
3272         TLO C,3MULTI
3273         TLO C,3MULTI
3274         JRST EQL7       ;DEF GLO
3275         JRST EQL8       ;UNDEF GLO.
3276
3277
3278                 ;PUNCH OUT "DEFINE SYM AS $."
3279
3280 PDEFPT: MOVEI A,CDEFPT
3281         PUSHJ P,P7X     ;OUTPUT 7 THEN PDEFPT
3282         JRST OUTSM0     ;OUTPUT SYM, WITHOUT BITS
3283 \f
3284 ;LOC, BLOCK, .=
3285
3286 ALOC:   PUSHJ P,ALOCRG  ;LOC, GET ARG
3287 ALOC1:  SETZM SYLOC     ;CLEAR OUT LOC OF LAST TAG
3288         SETZM SYSYM     ;CLEAR OUT LAST TAG SO ERROR MESSAGES DON'T PRINT OBSCENE INCREMENTS
3289 IFN FASLP,[
3290         SKIPGE TM,CONTRL
3291         TRNN TM,FASL
3292         JRST .+2
3293         ETA [ASCIZ /LOC illegal in FASL assembly/]
3294 ]       
3295         TRZE LINK,400   ;GLOBALS IN ARG?
3296         JRST ALOC2      ;YES
3297         HRRZM A,CLOC    ;STORE NEW ABSOLUTE PART OF CURRENT LOCATION
3298         CALL SLOCF      ;RE-INIT NEXT OUTPUT BLOCK'S HEADER; SET LOCF.
3299         MOVEI A,LCEGLO  ;=> RESET GLOBAL RELOCATION (BACK TO ORIGINAL NON-GLOBAL RELOCATION)
3300         TLZE LINK,400000        ;IS CURRENT LOCATION NOW GLOBAL?
3301         PUSHJ P,PLDCM   ;YES, RESET IT
3302         MOVE B,WRDRLC   ;GET BACK NEW RELOCATION
3303 ALOC2B: TRZE B,-2       ;NO BITS ALLOWED EXCEPT LOW ORDER
3304          ETR [ASCIZ *Illegal relocation in LOC/BLOCK/.=*]
3305         HRRZM B,CRLOC   ;STORE NEW RELOCATION
3306         SKIPGE CONTRL
3307          JRST ASSEM1    ;DON'T BOTHER WITH REST IF ABS.
3308         MOVEI B,2(B)    ;LABS OR LREL
3309         DPB B,[310700,,BKBUF]   ;STORE NEW BLOCK TYPE
3310         MOVEM B,CDATBC  ;ALSO STORE AS NORMAL BLOCK TYPE
3311 AOFSTX: TDNN LINK,[SETZ(SETZ)]  ;ENTRY FROM AOFFSET, SKIP IF FRGLOL SHOULD BE SET
3312         TRZA FF,FRGLOL  ;CURRENT LOCATION PLUS OFFSET NOT GLOBAL, CLEAR FLAG
3313         TRO FF,FRGLOL   ;GLOBAL, SET FLAG
3314         TRZ LINK,600    ;CLEAR OUT TEMPORARY FLAGS SO WON'T GET STORED IN GLOCTP
3315         MOVEM LINK,GLOCTP       ;STORE BACK STATUS FLAGS
3316         JRST ASSEM1
3317
3318 PTEQ:   MOVE SYM,[SQUOZE 0,LOC]
3319         PUSHJ P,ALOCRG  ;.=, GET ARG
3320         MOVE T,[MINF+HFWDF,,$O.H]       ;GLOTB ENTRY IF .+1 DOESN'T SKIP
3321         TRNE LINK,400000        ;OFFSET GLOBAL?
3322         JRST PTEQ2      ;YES, WANT TO DO LOC ARG-$O."
3323         PUSHJ P,SBWDOF  ;OFFSET IS LOCAL, SUBTRACT FROM ARG
3324         JRST ALOC1
3325 \f
3326 ABLOCK: PUSHJ P,ABLKRG  ;GET ARG TO "BLOCK" PSEUDOOP.
3327         TRNE LINK,400   ;GLOBALS IN ARG?
3328          JRST ABLKG     ;GLOBALS IN ARG
3329         TLNE LINK,400000
3330          JRST ABLKG     ;JUMP IF LOSER CHANGING RELOCATION WHILE CLOC GLOBAL
3331 IFN FASLP,[
3332         MOVE D,CONTRL
3333         TRNN D,FASL     ;IN FASL FORMAT, CAN'T SET LOC. CTR.,
3334          JRST ABLKF1
3335         SKIPE B
3336          ETA [ASCIZ /BLOCK size relocatable/]
3337         JUMPGE FF,ABLKF1
3338         CALL ABLKF      ;SO ON PASS 2 OUTPUT A BUNCH OF ZEROS.
3339         JRST ABLKF1
3340
3341 ;OUTPUT C(A) ZEROS, IN FASL FORMAT. NO-OP ON PASS 1.  DOESN'T SET THE LOCATION COUNTER.
3342 ABLKF:  JUMPE A,CPOPJ
3343         JUMPGE FF,CPOPJ
3344         SETZM WRD
3345         SETZM WRDRLC
3346         SAVE A
3347         SAVE A
3348 ABLKF2: CALL FASPW
3349         MOVEMM GLSP2,GLSP1
3350         SOSE (P)
3351          JRST ABLKF2
3352         JRST POPBAJ
3353 ]
3354
3355 ABLKF1: ADD A,CLOC      ;ARG TO BLOCK IS LOCAL, ADD DIRECTLY TO CLOC
3356         ADD B,CRLOC     ;ALSO ADD RELOCATIONS
3357         HRRZM A,CLOC    ;STORE NEW ABSOLUTE PART OF LOCATION
3358         CALL SLOCF      ;FALL INTO ALOC ROUTINE, MAKING SURE FRLOC GETS SET
3359         JRST ALOC2B
3360
3361
3362 SBWDOF: SUB A,OFLOC     ;SUBTRACT OFFSET FROM WRD, ETC. IN A,B
3363         HRRZM A,WRD     ;MAKE SURE RESULT GETS STORED IN WRD, AS WELL AS AC'S
3364         SUB B,OFRLOC    ;NOW DO RELOCATIONS
3365         HRRZM B,WRDRLC
3366         POPJ P,
3367
3368 ABLKG:  TRNE LINK,400000        ;GLOBAL BLOCK, IS OFFSET GLOBAL?
3369          JRST ABLKG2    ;YES, OK TO REFERENCE $L.
3370         PUSHJ P,SBWDOF  ;NO, FOR COMPATIBILITY, DON'T REFERENCE $L.
3371         SKIPA T,[HFWDF,,$.H]
3372 ABLKG2: MOVE T,[HFWDF,,$L.H]
3373 PTEQ2:  AOS GLSP1       ;STORE T IN GLOTB
3374         MOVEM T,@GLSP1
3375 ALOC2:  TLO LINK,400000 ;SET GLOBAL LOCATION FLAG
3376         MOVEI A,LCGLO   ;=> GLOBAL LOCATION ASSIGNMENT
3377         PUSHJ P,PLDCM   ;PUNCH OUT GLOBAL LOCATION ASSIGNMENT
3378         SETZM CLOC      ;CLEAR OUT CLOC, NEW RELOCATION NOW
3379         SETZB B,BKBUF   ;ALSO CLEAR OUT HEADER, JUST TO BE SURE
3380         AOJA B,ALOC2B   ;SET RELOCATION TO 1 AND FALL IN
3381
3382 AOFFSET:        PUSHJ P,AOFFS2  ;OFFSET, GET ARG
3383         MOVE A,T
3384         MOVEM A,WRD     ;RESTORE UNTRUNCATED ARG.
3385         TRZE LINK,400   ;GLOBALS IN ARG?
3386         TROA LINK,400000        ;GLOBALS IN ARG, SET GLOBAL OFFSET FLAG
3387         TRZ LINK,400000 ;NO GLOBALS IN ARG
3388         MOVEM A,OFLOC   ;STORE NEW OFFSET
3389         MOVEM B,OFRLOC  ;ALSO STORE RELOCATION BITS
3390         SKIPGE CONTRL   ;IN RELOCATABLE,
3391         JRST AOFSTX
3392         MOVEI A,LDOFS   ;LOADER OFFSET LOADER COMMAND TYPE
3393         PUSHJ P,PLDCM   ;PUNCH OUT LOADER COMMAND
3394         JRST AOFSTX
3395 \f
3396 ;GET ARG TO LOC, BLOCK, .=, OFFSET
3397
3398 ALOCRG:
3399 ABLKRG: MOVE A,CLOC
3400         SKIPN CRLOC
3401          JRST [ CAML A,DECBRA   ;IF ADDR BEFORE THE LOC WAS ABS,
3402                  MOVEM A,DECBRA ;UPDATE HIGHEST ABS ADDR IF NEC.
3403                 JRST ABLKR1]
3404         CAML A,DECTWO           ;IT WAS RELOCA; UPDATE HIGHEST
3405          JRST [ CAML A,DECBRH   ;ADDR OF APPROPRIATE SEG.
3406                  MOVEM A,DECBRH
3407                 JRST ABLKR1]
3408         CAML A,DECBRK
3409          MOVEM A,DECBRK
3410 AOFFS2:
3411 ABLKR1: SAVE SYM
3412         PUSHJ P,CONBAD  ;ERROR IF IN GROUPING
3413         REST SYM
3414         TRNE I,IRNOEQ\IRPSUD\IREQL
3415          ETSM [ASCIZ /Inside pseudo or =/]
3416         TDNE I,[ILWORD,,IRFLD]
3417          ETSM ERRNVL
3418         PUSHJ P,EBLK    ;MAYBE END CURRENT OUTPUT BLOCK
3419         PUSHJ P,AGETWD  ;GET ARG
3420         MOVE LINK,GLOCTP        ;GET GLOCTP FLAGS IN LINK, STAYS THERE UNTIL ALMOST DONE
3421         MOVE T,GLSP2
3422         CAME T,GLSP1
3423         TROA LINK,400   ;SIGNAL GLOBAL ARG
3424         TRZ LINK,400    ;LOCAL
3425         MOVE T,A        ;SAVE UNTRUNCATED FOR AOFFSET,
3426         HRRZS A,WRD     ;TRUNCATE FOR LOC, BLOCK, .=.
3427         TRNN I,IRDEF    ;ALL DEFINED?
3428          JRST ASSEM1
3429         SKIPGE CONTRL   ;YES, RETURN SKIPPING OVER ARG
3430          TRNN LINK,400
3431           RET
3432         MOVE SYM,GTVER
3433         ETASM [ASCIZ *Argument has externals*]
3434 \f
3435 ;;CONSTANTS AND VARIABLES
3436                 ;VARIABLES AREA
3437 VBLK
3438
3439 LCNGLO==CONMIN/4
3440 LCONTB==CONMIN
3441
3442 BLCODE [
3443 PCNTB:  BLOCK NCONS*3   ;CONSTANTS AREAS TABLE
3444 VARTAB: BLOCK NVARS
3445 ]
3446 CONTBA: CONTAB  ;ADDRESS OF BEGINNING OF CONSTANTS TABLE.
3447 CONTBE: CONTAB+LCONTB   ;ADDRESS OF WORD AFTER END OF CONSTANTS TABLE.
3448 PLIM:   0       ;POINTER TO FIRST UNUSED WORD IN CONSTANTS TABLE.
3449
3450 CONGLA: CONGLO  ;ADDRESS OF BEGINNING OF CONSTANT-GLOBALS TABLE.
3451 CONGLE: CONGLO+LCNGLO   ;ADDRESS OF WORD AFTER END OF CONSTANT GLOBALS TABLE.
3452 CONGOL: 0       ;HAS ADR OF FIRST WORD INACTIVE IN CONSTANT-GLOBALS TABLE.
3453
3454 CONBIA: CONBIT  ;ADDRESS OF BEGINNING OF CONSTANT-RELOCATION-BITS TABLE.
3455
3456 CONLEN: CONMIN  ;TOTAL SPACE ALLOCATED TO CONSTANTS TABLES.
3457                 ;ALL THE HOOKS ARE IN FOR DYNAMIC ALLOCATION OF THESE TABLES
3458                 ;(CONTAB, CONGLO, AND CONBIT). ALL THAT IS NEEDED IS TO GET
3459                 ;THE SPACE AND INITIALIZE CONTBA, CONTBE, CONGLA, CONGLE, CONBIA.
3460
3461                 ;PCNTB STUFF
3462
3463                 ;EACH ENTRY 3 WORDS; FIRST WORD SQUOZE, NAME OF AREA IF GLOBAL
3464 CSQZ:   0               ;SQUOZE COUNTER
3465                 ;SECOND WORD RH LOC OF AREA (WITH OFFSET), LH LOC FIRST AFTER AREA (WITHOUT OFFSET)
3466                 ;THIRD WORD LH FLAGS
3467
3468 CGBAL==100000   ;GLOBAL (INCLUDING OFFSET)
3469 CTRL==200000    ;RELOCATED ( " )
3470 CTDEF==400000   ;DEFINED (MUST BE SIGN)
3471
3472 PBCON:  0       ;POINTER INTO PCNTB, HAS ADR OF ENTRY FOR NEXT CONSTA
3473 PBCONL: 0       ;POINTER TO ABSOLUTE TOP OF PCNTB
3474 CONCNT: 0       ;NUMBER OF TIMES CONSTANTS CAN APPEAR (DECREMENTED BY CONSTA)
3475 CONDEP: 0       ;DEPTH IN CONSTANTS (0 TOP LEVEL)
3476 CONSAD: 0       ;ADDR IN CONSTANTS TABLE OF ENTRY FOR CURRENT CONST.
3477 CONSML: 0       ;VALUE OF .MLLIT INTSYM.
3478                 ;NEGATIVE => ERROR MODE (DEFAULT)
3479                 ;ZERO => OLD MODE.
3480                 ;POSITIVE => NEW (MULTI-LINE) MODE.
3481
3482 CONSTP: 0       ;PDL POINTER BELOW WDS FOR INNERMOST CONSTANT.
3483 CONSP1: 0
3484
3485                 ;VARIABLES FOR VARIABLES CODING
3486
3487 VARCNT: 0       ;NO OF VAR IN CURRENT VAR AREA SO FAR
3488 VARPNT: 0       ;POINTER TO CURRENT PLACE IN VARTAB
3489 VARCNR: 0       ;NO OF TIMES VARIABLES MAY APPEAR
3490 VCLOC:  0       ;TEM FOR VARIAB
3491 VECSIZ: 0       ;DEFAULT SIZE FOR .VECTOR.
3492
3493 PBLK
3494 \f
3495 ;LEFT-BRACKET ENCOUNTERED; HERE ON DISPATCH FROM GETFD
3496 ;SAVE WORLD, BYTE MODE, ASSEM1 PDL LEVELS.
3497 ;THEN SET ASSEM1 PDL LEVELS TO CURRENT LEVELS
3498 ;SO ASSEM1 WON'T FLUSH PAST LEVEL OF CONSTANT.
3499 ;SET CONSTP _ CURRENT PDL LEVEL. PCONS WILL PUT WORDS
3500 ;OF CONSTANT ABOVE CONSTP, AND SET ASSEMP ABOVE THEM.
3501
3502 LBRAK:  SKIPE LITSW
3503          ETR [ASCIZ /Literal/]
3504         TRO I,IRFLD     ;LEFT BRACKET
3505         JSP LINK,SAVWD1 ;SAVE CRUFT
3506         PUSH P,SCNDEP   ;SO THE NEXT RBRKT WON'T TRY TO CLOSE CONDIT.
3507         JSP LINK,SAVAS1
3508         MOVEIM ASMOUT,3
3509         SETZM SCNDEP    ;NOT WITHIN CONDITIONALS IN THIS LITERAL.
3510         AOS CONDEP      ;ONE DEEPER IN LITERALS.
3511         JRST ASSEM3     ;GO ASSEMBLE THE WORDS OF THE CONSTANT.
3512
3513 ;OUTPUT WORD TO CONSTANT. P MUST EQUAL ASSEMP HERE.
3514 PCONS:  SKIPL CONTRL    ;IF RELOCATABLE,
3515         PUSHJ P,$RSET   ;HANDLE STRANGE RELOCATIONS.
3516         MOVE B,GLSP1
3517         SUB B,GLSP2     ;NUM. GLOBAL ENTRIES FOR THIS WD.
3518         HLRZ A,WRDRLC   ;ONLY 1.1 AND 3.1 BITS MATTER.
3519         LSH A,1
3520         IOR A,WRDRLC    ;GET THEM INTO 1.1, 1.2 BITS.
3521         TLNE I,ILNOPT   ;REMEMBER ILNOPT ALSO.
3522         IORI A,4
3523         DPB B,[032200,,A]       ;AND # GLBLS.
3524         PUSH P,A        ;SAVE THEM ALL.
3525         HRLI B,(B)      ;GET # GLBLS,,# GLBLS .
3526         JUMPE B,PCONS1
3527         MOVE A,GLSP2
3528         MOVSI A,1(A)
3529         HRRI A,1(P)     ;SAVE THE GLBLS, IF ANY.
3530         ADD P,B
3531         JUMPGE P,CONFLP
3532         BLT A,(P)
3533 PCONS1: PUSH P,WRD
3534         MOVEM P,ASSEMP  ;ASSEMP -> ABOVE WDS FOR LIT.; CONSTP, BELOW.
3535         JRST (T)
3536 \f
3537 ;JSP LINK,SAVAS1  TO PUSH DATA ON ASSEM1 LEVEL AND CALL ASSEM1
3538 ;LOOP RECURSIVELY.
3539 .SEE CONNDP     ;WHICH IS WHERE THESE THINGS ARE POPPED.
3540 SAVAS1: SKIPN BYTM      ;IF IN BYTM NOW (WILL PUSH AND TURN OFF)
3541         JRST LBRAK1
3542         MOVSI A,BYBYT   ;SAVE ALL THE DETAILS.
3543         HRRI A,1(P)
3544         ADD P,[LBYBYT+BYTMCL,,LBYBYT+BYTMCL]
3545         JUMPGE P,CONFLP ;(SOFTWARE-DETECTED PDL-OV)
3546         BLT A,-BYTMCL(P)
3547         MOVSI A,BYTMC
3548         HRRI A,1-BYTMCL(P)
3549         BLT A,(P)
3550 LBRAK1: PUSH P,BYTM
3551         SETZM BYTM
3552         SAVE ASMOUT
3553         SAVE ASMDSP
3554         SAVE ASMI
3555         PUSH P,GLSPAS   ;SAVE ASSEM1 PDL LEVELS.
3556         PUSH P,ASSEMP
3557         PUSH P,CONSTP
3558         MOVE A,I
3559         ANDI A,IRPSUD+IREQL
3560         IORI A,IRDEF
3561         MOVEM A,ASMI    ;ASMI IOR'D INTO I AT ASSEM2 LOOP.
3562         HRRZ A,CPGN
3563         HRL A,CLNN      ;REMEMBER WHERE THIS LITERAL STARTS.
3564         INSIRP PUSH P,[A SYSYM SYLOC]
3565         MOVEM P,ASSEMP  ;SO ASSEM1 WON'T FLUSH WHAT WE PUSHED.
3566         MOVEM P,CONSTP  ;SO CONND CAN FIND 1ST WD OF CONSTANT.
3567         MOVEMM GLSPAS,GLSP1
3568 SAVAS2: MOVEI A,ASSEM3  ;IF NOT MULTI-LINE MODE, ARRANGE TO
3569         SKIPG CONSML    ;END THE CONSTANT AFTER 1 WORD.
3570          MOVEI A,ASSEMC
3571         MOVEM A,ASMDSP
3572         JRST (LINK)
3573 \f
3574 PCONST: MOVE CH1,ASMDSP ;OUTPUT TO CONST. FROM ASSEM1
3575         CAIN CH1,CONND  ;LAST WD OF CONST?
3576         CAME P,CONSTP   ;1ST WD?
3577         JRST PCONS      ;NO, DO THE GENERAL THING.
3578         SKIPL CONTRL    ;THIS MUST BE ONLY WORD OF CONST,
3579         PUSHJ P,$RSET   ;DON'T BOTHER PUSHING, END CONST. NOW.
3580         PUSH P,CONSTP
3581         TLZ I,ILMWRD+ILMWR1     ;THIS IS 1ST WD, NO MORE WDS.
3582         JRST CONND3     ;PRETEND JUST POPPED IT.
3583
3584 ;COME HERE FROM ASSEM1 TO END A CONSTANT.
3585 CONND:  SKIPE BYTM      ;IF IN BYTE MODE, LEAVE IT AND DO .WALGN
3586         JRST A.BY3      ;(WILL COME BACK SINCE ASMDSP STILL SET)
3587 CONNDW: MOVEMM CONSP1,CONSTP
3588         TLZ I,ILMWR1    ;THIS IS 1ST WORD COMING UP.
3589 CONND0: TLZ I,ILMWRD+ILNOPT
3590         SETZM WRDRLC
3591         MOVE F,CONSP1   ;ADDR IN IN PDL OF NEXT WD.
3592         CAMN F,ASSEMP
3593         JRST CONND2     ;J IF NO WORDS.
3594         MOVE A,1(F)     ;GET SAVED NUM GLBLS,,NUM GLBLS
3595         DPB A,[100,,WRDRLC]
3596         LSH A,-1        ;RESTORE WRDRLC BITS 1.1, 3.1
3597         DPB A,[220100,,WRDRLC]
3598         TRNE A,2
3599         TLO I,ILNOPT    ;RESTORE NOOPTF.
3600         LSH A,-2        ;GET # GLBLS.
3601         HRLI A,(A)      ;# GLBLS,,# GLBLS.
3602         AOBJN F,.+1
3603         HRRZM F,GLSP2   ;ADDR BEFORE 1ST GLOBAL ENTRY.
3604         ADD F,A
3605         HRRZM F,GLSP1   ;ADDR OF LAST GLOBAL ENTRY.
3606         MOVE A,1(F)
3607         MOVEM A,WRD
3608         AOBJN F,.+1     ;POINT TO NEXT CONST WD IF ANY,
3609         MOVEM F,CONSP1
3610         CAME F,ASSEMP   ;IF MORE WORDS SET ILMWRD
3611         TLO I,ILMWRD
3612         JRST CONND3
3613
3614 CONND2: INSIRP SETZM,[WRD,GLSP1,GLSP2]
3615 CONND3: MOVE F,GLSP1
3616         SUB F,GLSP2
3617         JUMPE F,SCON    ;JUMP IF NOTHING VIRTUAL
3618         MOVEI B,-1(F)
3619         MOVN TT,B
3620         JUMPE B,SCON    ;JUMP IF ONLY ONE GLOBAL
3621                 ;SORT GLOTB ENTRIES THIS CONSTANT
3622 LSORT:  HRL T,TT        ;SET UP AOBJN POINTER TO GLOBALS REMAINING
3623         HRR T,GLSP2
3624 LSORT2: MOVE A,1(T)
3625         CAMLE A,2(T)
3626         EXCH A,2(T)     ;INTERCHANGE
3627         MOVEM A,1(T)
3628         AOBJN T,LSORT2  ;INNER LOOP POINT
3629         SOJG B,LSORT    ;OUTER LOOP
3630                 ;DROPS THROUGH
3631 \f
3632                 ;DROPS THROUGH
3633 SCON:   PUSHJ P,RCHKT
3634         PUSHJ P,RMOVET  ;SET UP RELOACTION BITS.
3635         ROT T,2         ;ROTATE TO BOTTOM TWO BITS OF T
3636         TLNE I,ILMWRD+ILMWR1+ILNOPT
3637         JRST NOCON      ;MULTIPLE WORD OR OPTIMIZATION SUPPRESSED, DON'T TRY TO FIND MATCH
3638         MOVE A,CONTBA
3639 SCON1:  CAML A,PLIM     ;SEARCH CONSTANTS TABLE TO SEE IF ALREADY THERE
3640         JRST NOCON      ;END OF TABLE, NO MATCH
3641         MOVE B,WRD
3642         CAME B,(A)
3643 SCON2:  AOJA A,SCON1    ;VAL DISAGREES
3644         PUSHJ P,CPTMK   ;GET BP TO CONSTANTS-BIT TABLE IN C
3645         LDB F,C         ;GET RELOCATION BITS THIS CONSTANT
3646         CAME F,T
3647         JRST SCON2      ;RLC DIFFRS
3648         MOVE B,CONGLA   ;VALUE AND RELOCATION AGREE, NOW TO CHECK GLOBALS
3649         SKIPA C,GLSP2
3650 SCON2B: AOS B           ;SEARCH FOR GLOBAL POINTING TO CONSTANT WHICH HAS MATCHED SO FAR
3651         CAML B,CONGOL
3652         JRST SCON3      ;GLOBALS MATCH SO FAR
3653         CAME A,1(B)     ;SKIP IF ONE FOUND
3654 SCON7:  AOJA B,SCON2B   ;NOT YET
3655         MOVE D,(B)      ;FOUND ONE, GET GLOTB ENTRY
3656         CAME D,1(C)     ;COMPARE WITH THIS ENTRY IN GLOTB
3657         JRST SCON2      ;NO MATCH, FLUSH THIS CONSTANT
3658         AOJA C,SCON7    ;MATCH, TRY NEXT GLOBAL
3659
3660 SCON3:  CAME C,GLSP1    ;GLOBALS MATCH, BUT ARE WE EXACTLY AT END OF GLOTB?
3661         JRST SCON2      ;NO, BACK TO SEARCH
3662         JRST NOCON4
3663 \f
3664 NOCON:  AOS A,PLIM      ;CONSTANT NOT ALREADY IN TABLE
3665         CAMLE A,CONTBE
3666          ETF [ASCIZ/Literal table full/]
3667         MOVE AA,WRD
3668         MOVEM AA,-1(A)
3669         SOS A
3670         PUSHJ P,CPTMK
3671         TLNE I,ILNOPT
3672         TRO T,4         ;1.3 OF RELOCATION BITS => DON'T OPTIMIZE ON TOP OF ME
3673         DPB T,C
3674         MOVE B,GLSP2
3675 NOCON3: CAML B,GLSP1
3676         JRST NOCON4
3677         SKIPN C,1(B)
3678         AOJA B,NOCON3   ;THIS ENTRY NOT REALLY HERE
3679         MOVEM C,@CONGOL
3680         HRRZS C
3681         PUSHJ P,NOCON5
3682         MOVEM A,@CONGOL
3683         PUSHJ P,NOCON5
3684         SKPST C,        ;SKIP IF IN SYMBOL TABLE
3685         AOJA B,NOCON3
3686         3GET1 D,C       ;IN SYMBOL TABLE
3687         TLO D,3VCNT     ;THIS SYM USED IN CONSTANT
3688         3PUT1 D,C       ;UPDATE 3RDWRD TABLE ENTRY
3689         AOJA B,NOCON3
3690
3691 NOCON5: AOS AA,CONGOL
3692         CAML AA,CONGLE
3693          ETF [ASCIZ/Constants-global table full/]
3694         POPJ P,
3695
3696                 ;SET UP BYTE POINTER TO CONSTANTS-BIT TABLE
3697                 ;A SHOULD HAVE ADR OF CONSTANTS TABLE ENTRY
3698                 ;LEAVES ANSWER IN C
3699                 ;BITS IN CONSTANTS-BIT TABLE PER ENTRY:
3700                         ;1.2, 1.1 RELOCATION BITS
3701                         ;1.3 ILNOPT BIT => DON'T OPTIMIZE ON TOP OF ME
3702
3703 CPTMK:  PUSH P,A
3704         SUB A,CONTBA
3705         PUSH P,B
3706         IDIVI A,12.
3707         MOVEI C,(A)
3708         ADD C,CONBIA    ;SET UP ADDRESS PART
3709         IMULI B,3
3710         DPB B,[360600,,C]       ;STORE POSITION FIELD FROM REMAINDER
3711         TLO C,200       ;SET UP SIZE FIELD
3712 POPBAJ: POP P,B
3713         JRST POPAJ
3714 \f
3715 NOCON4: TLON I,ILMWR1
3716         MOVEM A,CONSAD  ;IF 1ST WD SAVE ADDR.
3717         TLNE I,ILMWRD   ;IF MORE WORDS, HANDLE NEXT.
3718         JRST CONND0
3719         MOVE P,CONSTP   ;VALUE OF CONSTP AT CONND.
3720         MOVE C,GLSPAS   ;TO RESTORE GLSP1
3721         JSP T,CONNDP    ;POP STUFF.
3722         HRRZ A,CONSAD   ;ADDR OF CONSTANTS TABLE ENTRY OF 1ST WD.
3723         MOVE B,PBCON    ;ADDR OF WDS DESCRIBING CONST. AREA.
3724         SKIPL 2(B)      ;CONST. AREA LOCATION DEFINITE?
3725         AOJA C,CONND6   ;NO, USE GLOBAL.
3726         MOVEM C,GLSP1
3727         HRRZ C,1(B)     ;ADD ACTUAL ADDR OF CONST. AREA.
3728         ADDI A,(C)      ;GET C(CONTBA) + ADDR OF CONSTANT.
3729         LDB B,[420100,,2(B)]
3730         JRST CONND7
3731
3732 CONND6: MOVEM C,GLSP1
3733         MOVEM B,(C)
3734         MOVEI B,0
3735 CONND7: SUB A,CONTBA
3736         JRST LSSTH3     ;POP OUT INTO OUTER WORD.
3737
3738 .SEE SAVAS1     ;WHICH IS WHAT PUSHES WHAT CONNDP POPS.
3739 CONNDP: SUB P,[3,,3]    ;FLUSH SAVED SYLOC AND SYSYM AND CLNN,,CPGN.
3740 CONFL2: HRL T,ASMOUT    ;REMEMBER IF POPPING A LITERAL OR NOT.
3741         INSIRP POP P,[CONSTP,ASSEMP,GLSPAS,ASMI,ASMDSP,ASMOUT,BYTM]
3742         SKIPN BYTM      ;IF IN BYTE MODE, POP DETAILS.
3743         JRST CONND5
3744         MOVSI A,1-BYTMCL(P)
3745         HRRI A,BYTMC
3746         BLT A,BYTMC+BYTMCL-1
3747         MOVSI A,1-BYTMCL-LBYBYT(P)
3748         HRRI A,BYBYT
3749         BLT A,BYBYT+LBYBYT-1
3750         SUB P,[LBYBYT+BYTMCL,,LBYBYT+BYTMCL]
3751 CONND5: HLRZ A,T
3752         CAIE A,3
3753          JRST (T)
3754         POP P,A
3755         ADDM A,SCNDEP   ;DON'T FORGET ABOUT ANY CONDITIONALS.
3756         SOS CONDEP      ;HAVE POPPED ONE CONSTANT.
3757         JRST (T)
3758
3759 CONFLS: MOVE P,ASSEMP   ;FLUSH ALL CONSTANTS.
3760         CAMN P,[-LPDL,,PDL] ;IF IN ANY,
3761          JRST (LINK)
3762         MOVE P,CONSTP   ;POINT AFTER ITS PDL ENTRY,
3763         JSP T,CONNDP    ;POP IT,
3764         JRST CONFLS     ;TRY AGAIN.
3765
3766 CONBAD: SKIPN ASMOUT    ;IF IN GROUPING, ERROR.
3767         POPJ P,
3768         ETSM [ASCIZ/Within <>, () or []/]
3769         JRST ASSEM1
3770 \f
3771 ;COME HERE FOR PDL-OV ON P.
3772 ;IF IN A CONSTANT, FLUSH ALL OF THEM, SAYING WHERE EACH STARTED.
3773 ;THEN TYPE A PDL ERROR MSG AND RETURN TO ASSEM1.
3774 ;OTHERWISE FATAL ERROR.
3775 CONFLP: MOVEI LINK,ASSEM1
3776         MOVEI CH1,ERRPDL
3777         SKIPE CONDEP
3778          JRST CONFL3    ;IN A CONSTANT.
3779         MOVEI P,PDL     ;RE-INIT PDL SO NO MORE PDL-OV.
3780         ETF ERRPDL
3781 ERRPDL: ASCIZ /PDL overflow/
3782
3783 ;JSP LINK,CONFLM TO FLUSH CONSTANTS, SAYING WHERE THEYY STARTED,
3784 ;AND GIVE ERROR MSG.
3785 CONFLM: MOVE CH1,ASMOUT
3786         SKIPA CH1,ASMOT3(CH1)
3787 CONFLZ: SETZ CH1,       ;LIKE CONFLM BUT NO ERR MSG AT END.
3788 CONFL3: SETO C,
3789 CONFL1: MOVE P,CONSTP   ;GET STACK ABOVE INNERMOST LITERAL.
3790         REST SYLOC
3791         REST SYSYM
3792         REST D          ;GET INFO ON WHERE STARTED
3793         AOSN C          ;THE 1ST TIME ONLY, SAY WHAT'S GOING ON.
3794         TYPR [ASCIZ/Within groupings: /]
3795         SKIPE C
3796         TYPR [ASCIZ/, /]
3797         MOVE A,ASMOUT   ;SAY WHAT KIND OF GROUPING IS BEING CLOSED
3798         MOVE A,ASMOT5(A)
3799         CALL TYOERR     ;BY SAYING WHAT CHAR OPENED IT.
3800         JSP T,CONFL2    ;POP REST OF WDS SAVED AT LBRAK.
3801         TYPR [ASCIZ/ at /]
3802         MOVEI A,1(D)    ;PAGE # GROUPING STARTED ON.
3803         CALL DPNT       ;PRINT IN DECIMAL.
3804         MOVEI A,"-
3805         CALL TYOERR
3806         HLRZ A,D        ;LINE NUMBER IT STARTED ON.
3807         ADDI A,1
3808         CALL D3PNT2     ;PRINT W/ AT LEAST 3 CHARS, NO ZERO SUPPR.
3809         MOVE A,ASSEMP
3810         CAME A,[-LPDL,,PDL] ;MORE GROUPINGS TO POP => DO.
3811          JRST CONFL1
3812         CALL CRRERR
3813         MOVE P,ASSEMP
3814         JUMPE CH1,(LINK) ;IF CALLED CONFLZ, NO ERR MSG (CALLER WILL GIVE ONE)
3815         ETR (CH1)       ;[   NO] OR PDL.
3816         CALL CRRERR
3817         JRST (LINK)
3818 \f
3819                 ;CONSTA
3820
3821 CNSTNT: NOVAL
3822         SKIPE ASMOUT    ;IF ANY GROUPNGS,
3823         JSP LINK,CONFLM ;FLUSH THEM, GIVE ERROR.
3824         PUSHJ P,CNSTN0
3825         JRST ASSEM1
3826
3827 CNSTN0: SOSGE CONCNT    ;ENTRY FROM AEND
3828         ETF [ASCIZ /Too many constants areas/]
3829         MOVE B,CLOC
3830         ADD B,OFLOC
3831         HRRZ T,PBCON
3832         TRNN FF,FRPSS2
3833         JRST CNST1      ;PASS 1
3834
3835         MOVSI A,CGBAL
3836         TDZ A,2(T)
3837         TRNE FF,FRGLOL
3838         TLC A,CGBAL
3839         SKIPN A
3840          ETR [ASCIZ /Constants globality phase error/]
3841         HRRZ B,1(T)
3842         SUB B,OFLOC
3843         HRRZS B
3844         CAME B,CLOC
3845          ETR [ASCIZ /Constants location phase error/]
3846         MOVE B,2(T)
3847         ROT B,2
3848         XOR B,CRLOC
3849         XOR B,OFRLOC
3850         TRNE B,1
3851          ETR [ASCIZ /Constants relocation phase error/]
3852                 ;DROPS THROUGH
3853 \f
3854                 ;DROPS THROUGH
3855 CNST2:  MOVEI D,(T)     ;STE IDX IN D FOR OUTSM0
3856         MOVE SYM,(T)    ;GET NAME OF AREA
3857         TLC SYM,400000#LCUDF    ;CLEAR LCUDF, SET HALF-KILL
3858         TRNE FF,FRGLOL
3859         PUSHJ P,PDEFPT  ;DEFINE SYM FOR BEGINNING OF CONSTANTS AREA
3860         MOVE A,CONTBA
3861 CNSTH:  CAML A,PLIM
3862          JRST CNSTA     ;THRU
3863         MOVE TT,(A)
3864         MOVEM TT,WRD
3865         PUSHJ P,CPTMK
3866         LDB F,C         ;GET THIS CONSTANT'S RELOCATION BITS
3867         TRZE F,2
3868          TLO F,1        ;RELOCATE LEFT HALF
3869         MOVEM F,WRDRLC  ;STORE RELOCATION
3870         MOVEI D,GLOTB   ;AND NOW TO SET UP GLOTB!
3871         MOVEM D,GLSP2
3872         MOVE C,CONGLA
3873 CNSTC:  CAML C,CONGOL
3874          JRST CNSTB     ;END OF CONSTANT-GLOBAL TABLE
3875         CAMN A,1(C)     ;POINTS TO THIS CONSTANT?
3876          PUSH D,(C)     ;YES, STORE ENTRY IN GLOTB
3877         AOS C
3878         AOJA C,CNSTC
3879
3880 CNSTB:  HRRZM D,GLSP1   ;MARK END OF ACTIVE PART OF GLOTB
3881         PUSH P,A
3882         PUSHJ P,PWRD    ;OUTPUT THIS CONSTANT
3883         AOS CLOC        ;INCREMENT CLOC TO NEXT
3884         HRRZS CLOC      ;MAKE SURE IT STAYS IN A HALF-WORD (IMPORTANT SINCE MAY BE LESS THAN RELOCATION)
3885         POP P,A         ;RESTORE POINTER INTO CONSTANTS TABLE
3886         AOJA A,CNSTH
3887
3888 CNST3:  HLRZ A,1(T)     ;GET POINTER TO TOP OF AREA STORED DURING PASS 1
3889         CAMN A,CLOC     ;SAME AS CURRENT?
3890         JRST CNSTE      ;YES, NO HAIR
3891         CAMGE A,CLOC    ;DIFFERENT; LOWER?
3892          ETR [ASCIZ /More constants on pass 2 than 1/]
3893                 ;INSUFFICIENT CONSTANT SPACE; CONSTANTS AREA TRYING TO BE BIGGER
3894                 ;IN PASS 2 THAN PASS 1; THE EXTRA CONSTANTS WERE BACKED OVER
3895         MOVEM A,CLOC    ;EITHER WAY, SET CLOC TO TOP OF AREA SO WON'T HAVE MDT TROUBLE
3896         PUSHJ P,EBLK    ;END CURRENT BLOCK
3897         CALL SLOCF      ;IF RELOCATABLE, MAKE SURE NEW VALUE OF $. GETS PUNCHED
3898         JRST CNSTE
3899
3900 ;CALL SLOCF WHENEVER "." IS CHANGED WITHOUT THE OUTPUTTING OF A STORAGE WORD.
3901 SLOCF:  MOVE A,CLOC     ;STORE NEW "." IN HEADER FOR NEXT BLOCK OF OUTPUT.
3902         SKIPGE TM,CONTRL
3903          TRNN TM,DECREL+FASL    ;BUT NOT IN DEC OR FASL OUTPUT FORMATS.
3904           HRRM A,BKBUF
3905         IORI FF,FRLOC   ;MAKE SURE NULL BLOCK IS OUTPUT IF NEC. TO TELL LOADER "." HAS CHANGED.
3906         RET
3907 \f
3908                 ;CONSTA DURING PASS 1
3909
3910 CNST1:  HRRM B,1(T)     ;STORE LOCATION OF AREA
3911         MOVEI D,0
3912         MOVE A,CRLOC
3913         ADD A,OFRLOC
3914         TRNE A,1
3915         TLO D,CTRL      ;RELOCATED
3916         TRNE FF,FRGLOL
3917         TLO D,CGBAL     ;GLOBAL
3918         IORM D,2(T)     ;STORE FLAGS DESCRIBING AREA
3919         JUMPL FF,CNST2  ;JUMP ON PUNCHING PASS, PUNCH OUT AREA NOW
3920         MOVE T,PLIM
3921         SUB T,CONTBA
3922         ADDM T,CLOC     ;PASS 1, JUST UPDATE CLOC
3923         HRRZS CLOC
3924
3925 CNSTA:  HRRZ T,PBCON
3926         TRNE FF,FRGLOL
3927         JRST CNSTD      ;LOCATION GLOBAL
3928         TRNN FF,FRNPSS
3929         SKIPGE 2(T)
3930         JRST CNSTDA     ;2 PASS ASSEMBLY OR AREA DEFINED
3931         TRO I,IRCONT    ;1PASS AND NOT DEFINED
3932         SETZM PARBIT
3933         PUSHJ P,P70     ;DEFINE SYM
3934         MOVE A,(T)
3935         TLC A,400000#LCUDF
3936         SKIPE CRLOC
3937         TLO A,100000    ;RELOCATE
3938         PUSHJ P,$OUTPT
3939         HRRZ A,1(T)
3940         PUSHJ P,$OUTPT  ;OUTPUT VALUE, FIRST LOCATION IN AREA
3941         TRZ I,IRCONT
3942 CNSTDA: MOVSI A,CTDEF
3943         IORM A,2(T)     ;CALL IT DEFINED
3944 CNSTD:  TRNE FF,FRPSS2
3945         JRST CNST3      ;PASS 2
3946         MOVE A,CLOC
3947         HRLM A,1(T)     ;MARK END OF AREA
3948
3949 CNSTE:  MOVE A,CONTBA
3950         MOVEM A,PLIM
3951         MOVE A,CONGLA
3952         MOVEM A,CONGOL
3953         MOVEI T,3
3954         ADDB T,PBCON
3955         CAML T,PBCONL
3956         MOVEM T,PBCONL
3957         AOS A,CSQZ
3958         MOVEM A,(T)
3959         POPJ P,
3960 \f
3961                 ;DEFINING SYM USED IN CONSTANT, DELETE REFERENCES FROM CONSTANT-GLOBAL TABLE
3962
3963 CONBUG: MOVE A,CONGLA   ;B VAL C FLAGS ST(D) SADR
3964         PUSH P,T
3965         PUSH P,C        ;SAVE FLAGS
3966 CONBG2: MOVE C,(P)      ;GET FLAGS
3967         CAML A,CONGOL   ;DONE WITH SCAN?
3968         JRST CONBG1     ;YES
3969         HRRZ F,(A)      ;NO, GET CONSTANT-GLOBAL TABLE ENTRY
3970         CAIE F,ST(D)    ;POINT TO THIS SYM?
3971         AOJA A,CONBG6
3972         PUSH P,B        ;YES, SAVE VALUE, ABOUT TO WORK WITH B
3973         MOVE T,(A)      ;GET ENTIRE CONSTANT-GLOBAL TABLE ENTRY
3974         LDB CH2,[221200,,T]     ;GET MULTIPLICATION FIELD
3975         SKIPE CH2
3976         IMUL B,CH2      ;NON-ZERO => MULTIPLY VALUE OF SYM
3977         TLNE T,MINF
3978         MOVNS B         ;NEGATE VALUE
3979         TLNE T,HFWDF
3980         HRRZS B         ;TRUNCATE TO HALFWORD
3981         TLNE T,ACF
3982         ANDI B,17       ;AC, MASK TO FOUR BITS
3983         TLNE T,SWAPF
3984         MOVSS B         ;SWAP VALUE
3985         TLNE T,ACF
3986         LSH B,5         ;AC, SHIFT FIVE
3987         ADD B,@1(A)     ;ADD ABS PART OF VALUE
3988         TLNN T,SWAPF
3989         HRRM B,@1(A)    ;NOT SWAPPED, STORE LH
3990         TLNE T,SWAPF
3991         HLLM B,@1(A)    ;SWAPPED, STORE LH
3992         TLNN T,HFWDF
3993         MOVEM B,@1(A)   ;FULL WORD, STORE VALUE
3994         LDB CH1,[420200+P,,-1]  ;GET HIGH BITS OF 3RDWRD, RELOCATION BITS
3995         TLNE T,HFWDF    ;NOW TO MAP RELOCATION BITS
3996         TRZ CH1,2
3997         TLNE T,SWAPF
3998         LSH CH1,1
3999         TRZE CH1,4
4000         TRO CH1,1
4001         PUSH P,A
4002         HRRZ A,1(A)     ;GET POINTER INTO CONSTANTS TABLE
4003         PUSHJ P,CPTMK
4004         LDB B,C         ;GET RELOCATION BITS
4005         TLNE T,MINF
4006         JRST CONBG8     ;NEGATE
4007         TRNE B,(CH1)
4008          ETA ERRCRI
4009                 ;ATTEMPTED MULTIPLE RELOCATION IN CONSTANT
4010                 ; ^ ABOVE SHOULD BE REPLACED WITH A $RSET LIKE ROUTINE
4011                 ;THAT ALSO SEARCHES CONSTANT-GLOBAL TABLE FOR $R. ALREADY THERE
4012         IOR B,CH1       ;LOOKS OK, IOR IN BITS FOR GLOBAL
4013 CONB8A: DPB B,C         ;STORE BACK NEW RELOCATION BITS FOR CONSTANT
4014         POP P,A
4015         CLEARM (A)      ;CLEAR OUT CONSTANT-GLOBAL TABLE ENTRY
4016         CLEARM 1(A)
4017         POP P,B
4018         AOS A
4019 CONBG6: AOJA A,CONBG2   ;BACK FOR NEXT CONSTANT, DON'T KNOW HOW MANY THIS SYM USED IN
4020 \f
4021 CONBG1: MOVE A,CONGLA
4022         PUSH P,B
4023         MOVE B,CONGLA
4024 CONBG7: CAML A,CONGOL
4025         JRST CONBG3
4026         SKIPN C,(A)
4027 CONBG5: AOJA A,CONBG4
4028         MOVEM C,(B)
4029         MOVE C,1(A)
4030         MOVEM C,1(B)
4031         AOS B
4032         AOJA B,CONBG5
4033
4034 CONBG4: AOJA A,CONBG7
4035 CONBG3: MOVEM B,CONGOL
4036         POP P,B
4037         POP P,C
4038         POP P,T
4039         POPJ P,
4040 CONBG8: XORI B,3
4041         TRNE B,(CH1)
4042          ETA ERRCRI
4043         ANDCB B,CH1
4044         JRST CONB8A
4045
4046 ERRCRI: ASCIZ /Multiple relocation in constant/
4047 \f
4048                 ;VARIAB
4049
4050 AVARIAB:        NOVAL
4051         SKIPE ASMOUT    ;FLUSH ANY GROUPINGS IN PROGRESS.
4052          JSP LINK,CONFLM
4053         PUSHJ P,AVARI0
4054         JRST ASSEM1
4055
4056 AVARI0: SOSG VARCNR     ;ENTRY FROM AEND
4057          ETF [ASCIZ /Too many variable areas/]
4058         MOVE D,SYMAOB   ;SET UP AOBJN POINTER TO ST
4059         MOVE T,CLOC
4060         MOVEM T,VCLOC   ;STORE AS LOCATION OF VARIABLE AREA
4061         ADD T,OFLOC
4062         MOVE C,CRLOC
4063         ADD C,OFRLOC
4064         TRNE FF,FRPSS2
4065         JRST AVAR1      ;PASS 2
4066         HRL T,VARCNT    ;SIZE OF AREA
4067         TRNE C,1
4068         TLO T,400000    ;RELOCATED
4069         MOVEM T,@VARPNT
4070         JRST AVAR2E
4071
4072 AVAR1:  HRRZ A,@VARPNT  ;VARIAB DURING PASS 2
4073         CAIE A,(T)
4074          ETR [ASCIZ /Variables location phase error/]
4075         HLRZ A,@VARPNT
4076         TRZE A,400000
4077         XORI C,1
4078         TRNE C,1
4079          ETR [ASCIZ /Variables relocation phase error/]
4080         SKIPE VARCNT
4081          ETR [ASCIZ /Variables area size phase error/]
4082
4083 AVAR2E: HLRZ T,@VARPNT
4084         TRNN T,377777
4085          JRST AVAR2C    ;IF THIS VAR AREA IS EMPTY, DON'T SCAN SYMTAB.
4086 AVAR2:  HLRZ LINK,ST(D) ;SCAN, CHECKING EACH SYM FOR WHETHER IT'S A VARIABLE
4087         CAIL LINK,DEFLVR
4088          JRST AVAR2B
4089         ADD D,WPSTE1
4090         AOBJN D,AVAR2
4091         JRST AVAR2C     ;ALL SCANNED.
4092
4093 AVAR2B: 3GET C,D        ;FOUND A VARIABLE; DECIDE WHAT TO DO WITH IT.
4094         MOVE B,ST+1(D)
4095         MOVE SYM,ST(D)
4096         TLZ SYM,740000
4097         LDB LINK,[400400,,ST(D)]
4098         CAIE LINK,UDEFLV_-14.
4099          CAIN LINK,UDEFGV_-14.
4100           JRST AVAR3            ;UNDEFINED VARIABLE
4101         CAIE LINK,DEFGVR_-14.
4102          CAIN LINK,DEFLVR_-14.
4103           JRST AVAR4            ;DEFINED VARIABLE
4104 AVAR2A: ADD D,WPSTE1
4105         AOBJN D,AVAR2   ;CHECK ENTIRE SYMTAB
4106 AVAR2C: HLRZ A,@VARPNT  ;NOW GET SIZE OF AREA
4107         TRZ A,400000    ;CLEAR OUT RELOCATION CHECK BIT
4108 IFN FASLP,[
4109         MOVE D,CONTRL
4110         TRNE D,FASL     ;IN FASL ASSEMBLY, CAN'T JUST SET LOC CTR; MUST OUTPUT 0'S.
4111          CALL ABLKF
4112 ]
4113         ADD A,VCLOC     ;ADD LOCATION OF BEGINNING OF VARIABLE AREA
4114         MOVEM A,CLOC    ;STORE AS NEW CURRENT LOCATION
4115         PUSHJ P,EBLK
4116         CALL SLOCF
4117         CLEARM VARCNT   ;INITIALIZE COUNT OF VARIABLES IN NEXT AREA
4118         AOS VARPNT      ;INCREMENT POINTER TO POINT TO NEXT AREA
4119         POPJ P,
4120 \f
4121                 ;UNDEFINED VARIABLE FOUND IN SYMTAB SCAN
4122
4123 AVAR3:  CAIN LINK,UDEFGV_-14.   ;GLOBAL?
4124         TLO SYM,40000   ;GLOBAL
4125         PUSHJ P,LKPNRO
4126         MOVSI T,DEFLVR
4127         CAIN LINK,UDEFGV_-14.
4128         MOVSI T,DEFGVR
4129         TRNE FF,FRGLOL
4130         JRST AVAR3A     ;LOCATION GLOBAL
4131         MOVEI B,-1(B)
4132         ADD B,VCLOC
4133         ADD B,OFLOC
4134         MOVE TT,CRLOC
4135         ADD TT,OFRLOC
4136         SKIPE TT
4137         TLO C,3RLR
4138         CAIE LINK,UDEFGV_-14.
4139         TLZN C,3VCNT
4140         SKIPA
4141         PUSHJ P,CONBUG
4142 AVAR4B: PUSHJ P,VSM2
4143         JUMPGE FF,AVAR2A        ;IF PUNCHING PASS, OUTPUT DEFINITION.
4144         PUSHJ P,OUTDE2
4145         JRST AVAR2A
4146
4147 AVAR4:  TLNE C,3VAS2    ;DEFINED VARIABLE FOUND DURING SYMTAB SCAN
4148         TLOE C,3VP
4149         JRST AVAR2A
4150         MOVSI T,(LINK)  ;CAUSE AVAR4B TO REDEFINE AS SAME TYPE.
4151         LSH T,14.
4152         TRNN FF,FRGLOL
4153         JRST AVAR4A
4154 AVAR3A: PUSHJ P,VSM2LV
4155         JUMPGE FF,AVAR2A
4156         PUSHJ P,PDEFPT
4157         MOVEI A,0
4158         PUSHJ P,PBITS
4159         PUSHJ P,$OUTPT
4160         AOS CLOC
4161         JRST AVAR2A
4162
4163 AVAR4A: CAIN LINK,DEFGVR_-14.   ;DEF VAR, 3VAS2, POINT NOT GLOBAL.
4164         JRST AVAR4B     ;VAR GLOBAL, MUST PUNCH DEF SINCE DIDN'T ON PASS1.
4165         3PUT C,D        ;LOCAL, JUST SET 3VP SO DON'T SEE IT NEXT VARIAB.
4166         JRST AVAR2A     ;NO NEED TO PUNCH DEF SINCE WAS DEF ON PASS1.
4167 \f
4168 ;;MAIN          ;"MAIN" MIDAS ROUTINES: INIT, PS1, PLOD, PS2, PSYMS
4169                 ;ALL CALLED WITH JSP A,; ALL GLOBAL
4170                 ;RETURN INSTRUCTION FROM JSP IN LOCATION RETURN
4171 PS1:    HRRM A,RETURN   ;PASS 1, (PASS 1 INITIALIZATION ALREADY DONE), SAVE RETURN
4172         SAVE [ASSEM1-1] ;SIMBLK WILL POPJ1.
4173 IFN A1PSW,[SKIPL PRGC
4174         JRST A1PAS1     ;THIS NOT FIRST PROGRAM THIS ASSEMBLY, SET MODE TO 1PASS
4175 ]
4176         TRO FF,FRNPSS
4177 IFN ITSSW,JRST SIMBLK   ;SELECT SBLK AND ASSEMBLE
4178 IFN DECSW\TNXSW,JRST A.DECRE    ;SELECT .DECREL AND ASSEMBLE.
4179
4180 PS2:    HRRM A,RETURN   ;PASS 2 (MAIN ROUTINE, PASS 2 INITIALIZATION NOT ALREADY DONE), SAVE RETURN
4181         JUMPL FF,PA2A   ;JUMP IF PASS 1 ENDED IN 1PASS MODE
4182         TDO FF,[FLPPSS,,FRPSS2] ;SET PUNCHING PASS AND PASS 2 FLAGS
4183         PUSHJ P,P2INI   ;INITIALIZE
4184         JRST ASSEM1     ;START ASSEMBLING
4185
4186 PA2A:   MOVE A,SYMAOB   ;PASS 2 OF 1PASS ASSEMBLY, CHECK FOR UNDEFINED LOCALS
4187 PA2C:   MOVE SYM,ST(A)  ;GET SQUOZE THIS SYMTAB ENTRY
4188         LDB B,[400400,,SYM]     ;GET FLAGS
4189         CAIE B,LCUDF_-14.       ;LOCAL UNDEFINED?
4190         JRST PA2B       ;NOT LOCAL UNDEFINED, DON'T COMPLAIN
4191         3GET C,A        ;LOCAL UNDEFINED, GET 3RDWRD ST ENTRY
4192         TLZ SYM,740000  ;CLEAR OUT FLAGS IN SYM IN ANTICIPATION OF TYPING OUT COMPLAINT
4193         TLNN C,3LLV     ;PROBLEM HANDED TO LINKING LOADER?
4194          ETSM [ASCIZ /Undefined/] ;NO
4195 PA2B:   ADD A,WPSTE1    ;NOW GO FOR NEXT ST ENTRY
4196         AOBJN A,PA2C
4197         JRST RETURN
4198
4199 $INIT:  HRRM A,RETURN   ;INITIALIZATION (BEFORE PASS 1 ONLY) ROUTINE, SAVE RETURN POINT
4200 IFN CREFSW,PUSHJ P,CRFOFF       ;DON'T CREF ON 1ST PASS.
4201 IFN LISTSW,CALL LSTOFF  ;DON'T LIST ON 1ST PASS.
4202         SKIPGE ISYMF
4203         JRST INIT1      ;SPREAD SYMS (RETURNS TO SP4)
4204         MOVE A,SYMAOB   ;ALREADY SPREAD, JUST FLUSH ALL BUT INITIAL SYMS
4205 INIT4:  SKIPN B,ST(A)
4206         JRST INIT2
4207         3GET C,A
4208         TRNE C,-1       ;INITIAL SYM?
4209         CLEARM ST(A)    ;NO
4210 INIT2:  ADD A,WPSTE1
4211         AOBJN A,INIT4
4212         SETZM BBKCOD
4213         MOVE A,[BBKCOD,,BBKCOD+1]
4214         BLT A,EBKCOD    ;CLEAR OUT BLANK CODE
4215
4216 SP4:    PUSH P,CRETN
4217 P1INI:  CLEARB I, LDCCC
4218         INSIRP SETZM,BKBUF ISYMF A.PASS
4219 IFN FASLP,[
4220         INSIRP SETZM,FASATP FASPCH
4221         CLEARM FASIDX
4222 ]
4223         MOVEMM DECTWO,[[MOVE]]
4224         TDZ FF,[-1-FLVOT-FLPTPF-FLTTY,,-1]      ;INITIALIZE MOST FF FLAGS
4225         MOVEIM A.PPASS,2        ;DEFAULT IS 2-PASS.
4226         PUSHJ P,MACINI  ;INITIALIZE MACRO STATUS
4227         MOVEI A,PCNTB
4228         MOVEM A,PBCONL
4229         MOVS A,[BKTAB,,P1INI1]
4230         BLT A,BKTAB+4
4231         MOVEIM BKTABP,BKWPB*2
4232 \f;DROPS IN.
4233 P2INI:  INSIRP SETZM,[CPGN,CLNN,GENSM,OFLOC,OFRLOC,CRLOC,BKPDL
4234 SYLOC,SYSYM,BYTW,BYTRLC,STGSW,DECBRK,DEFNPS,BYTM,BYTM1,HKALL,QMTCH]
4235         AOS B,A.PASS
4236 IFN ITSSW,[
4237         CALL SETWH2             ;SET UP .WHO2, PREPARE .WHO3 IN A WITH PAGENUM=1.
4238         .SUSET [.SWHO3,,A]      ;'P1 ',,PAGENUM OR 'P2 ',,PAGENUM
4239         .SUSET [.SWHO1,,[.BYTE 8 ? 166 ? 0 ? 165 ? 0]]
4240 ]
4241         TDZ FF,[FLUNRD,,FRGLOL]
4242 IRP X,,[BKWPB,BKCUR,,BKPDL+1,1,BKLVL,IRDEF,ASMI
4243 NCONS,CONCNT,VARTAB,VARPNT,NVARS,VARCNR,1,VECSIZ]
4244 IFE 1&.IRPCN,IFSN [X], MOVEI A,X
4245 IFN 1&.IRPCN, MOVEM A,X
4246 TERMIN
4247         MOVE A,CONTBA
4248         MOVEM A,PLIM
4249         MOVE A,CONGLA
4250         MOVEM A,CONGOL
4251         CLEARM VARCNT
4252         CLEARM PBITS2
4253         MOVE A,[440300,,PBITS1]
4254         MOVEM A,BITP
4255         MOVEI A,PBITS4
4256         HRRZM A,PBITS4
4257         CLEARB I,PBITS1
4258         MOVEI A,PCNTB
4259         MOVEM A,PBCON
4260         MOVE A,[(LCUDF)+<SQUOZE 0,$ >+1]        ;< AND > FOR COMPATIBILITY WITH OLD
4261         MOVEM A,PCNTB
4262         MOVEM A,CSQZ
4263         MOVEI A,8
4264         MOVEM A,ARADIX
4265 IFN ITSSW,[
4266         MOVEI A,100
4267         MOVEM A,CLOC
4268 ]
4269 .ELSE [ SETZM CLOC
4270         AOS CRLOC       ;CRLOC GETS 1
4271 ]
4272         SETZM GLOCTP
4273         MOVEI A,BKBUF+1
4274         MOVEM A,OPT1
4275         MOVE A,CONTRL   ;IN DEC FORMAT, OUTPUT PROGRAM NAME.
4276         TRNE A,DECREL
4277          CALL DECPGN    ;CLOBBERS A
4278 IFN FASLP,[
4279         SETOM FASBLC    ;LOSING BLOCK COUNT
4280         MOVE A,CONTRL   ;IN FASL FORMAT, OUTPUT FASL HEADER
4281         TRNE A,FASL
4282          CALL FASOIN    ;INITIALIZE FASL OUTPUT
4283 ]
4284         SETZM DECBRH
4285         TRO FF,FRSYMS+FRFIRWD
4286         MOVE A,[IFORTB,,FORTAB] ;INITIALIZE FORMAT TABLE ON EACH PASS
4287         BLT A,FRTBE
4288         MOVEIM GLSPAS,GLOTB     ;INIT. ASSEM1 PDL LEVELS TO BOTTOM.
4289         MOVEMM ASSEMP,[[-LPDL,,PDL]]
4290         MOVEIM ASMDSP,ASSEM3
4291         SETZM ASMOUT
4292         SETZM CONSTP
4293         SETZM SCNDEP    ;NOT IN CONDIT. OR CONSTANT.
4294         SETZM CONDEP
4295         HRRZM P,CONSML  ;START OUT IN MULTI-LINE MODE.
4296 IFN LISTSW,[
4297         MOVE A,[440700,,LISTBF]
4298         MOVEM A,PNTBP
4299         CLEARM LISTPF
4300         SETOM LISTBC
4301         SKIPG LISTP1    ;IF LIST ON PASS 1
4302          JUMPGE FF,CRETN        ;OR PUNCHING PASS,
4303         SKIPE LISTP     ;IF WANT LISTING,
4304          CALL LSTON     ;TURN ON OUTPUT OF LISTING.
4305 ]
4306 IFN CREFSW,[
4307         JUMPGE FF,CRETN
4308         SKIPE CREFP     ;IF C SWITCH WAS SEEN,
4309         PUSHJ P,CRFON   ;TURN ON CREFFING,
4310 ]
4311 CRETN:  POPJ P,RETURN
4312
4313 P1INI1: SQUOZE 0,.INIT ? 0 ? 3
4314         SQUOZE 0,.MAIN ? 1,,
4315 \f
4316 PLOD:   HRRM A,RETURN   ;MAIN ROUTINE TO PUNCH LOADER, CALLED BEFORE PASS 2 (PS2"), SAVE RETURN POINT
4317         PUSHJ P,PLOD1   ;PUNCH LOADER
4318         JRST RETURN     ;RETURN
4319
4320                 ;PUNCH OUT THE LOADER
4321
4322 PLOD1:  PUSHJ P,FEED1   ;LEAVE LOTS OF BLANK PAPER TAPE
4323         MOVE B,CONTRL
4324         TRNE B,ARIM10
4325         JRST PLOD2      ;RIM10 => PUNCH OUT SBLK LOADER FOR PDP10 READIN-MODE READIN
4326         TRNN B,SBLKS
4327         POPJ P,         ;NOT SBLK => DON'T PUNCH LOADER
4328 PLOD1A: MOVSI B,SLOAD-SLOADP    ;PUNCH SBLK LOADER IN RIM FORMAT
4329         MOVSI C,(DATAI PTR,)
4330 PLOAD1: MOVE A,C
4331         PUSHJ P,PPBA
4332         CAMN C,[DATAI PTR,13]
4333         HRRI C,27
4334         MOVE A,SLOAD(B)
4335         PUSHJ P,PPBA
4336         AOS C
4337         AOBJN B,PLOAD1
4338         MOVE A,[JRST 1]
4339         PUSHJ P, PPBA
4340         JRST FEED1
4341
4342 PLOD2:  MOVSI C,LDR10-ELDR10    ;PUNCH SBLK LOADER FOR PDP10 READIN
4343 PLOD3:  MOVE A,LDR10(C)
4344         PUSHJ P,PPBA
4345         AOBJN C,PLOD3
4346         JRST FEED1
4347
4348                 ;SBLK LOADER NORMALLY PUNCHED OUT IN RIM FORMAT
4349
4350 SLOAD:  CONO PTR,60     ;0 RESTART POINT (NEW BLOCK)
4351         JSP 14,30       ;1 START POINT, LOOP POINT FOR NEW BLOCK; WAIT FOR DATA WORD READY
4352         DATAI PTR,16    ;GET HEADER
4353         MOVE 15,16      ;INITIALIZE CHECKSUM
4354         JUMPGE 16,16    ;HEADER .GE. 0 => STARTING INSTRUCTION
4355         JSP 14,30       ;5 LOOP POINT FOR NEXT DATA WORD: WAIT FOR READY
4356         DATAI PTR,(16)  ;READ IN DATA WORD
4357         ROT 15,1        ;NOW UPDATE CHECKSUM
4358         ADD 15,(16)
4359         AOBJN 16,5      ;LOOP FOR ALL DATA WORDS THIS BLOCK
4360         MOVEI 14,33     ;30 TO RETURN TO 33
4361         JRST 30         ;WAIT FOR READY THEN GO TO 33
4362                 ;14 JSP AC FOR ROUTINE AT 30
4363                 ;15 CHECKSUM
4364                 ;16 AOBJN POINTER (UPDATED HEADER)
4365         CONSO PTR,10    ;30 ROUTINE TO WAIT FOR DATA WORD READY FOR DATAI
4366         JRST 30
4367         JRST (14)
4368         DATAI PTR,16    ;33 GET CHECKSUM
4369         CAMN 15,16      ;COMPARE WITH CALCULATED
4370         JUMPA 1         ;OK, GO GET NEXT BLOCK (DON'T CHANGE TO JRST OR REAL LOADERS WILL GET CONFUSED)
4371         JRST 4,         ;CHECKSUM ERROR
4372 SLOADP==.
4373 \f
4374 ;PDP10 SBLK LOADER
4375 ;FOLLOWING CODING ACTUAL WORDS TO BE OUTPUT
4376         ;BY ASSEMBLER, COMPILER, OR WHATEVER
4377 ;SHOULD BE EXECUTED BY PDP10 HARDWARE READIN FEATURE
4378 ;USES ONLY THE AC'S (BUT ALL OF THEM)
4379
4380 LDR10:
4381         -17,,0          ;BLKI POINTER FOR READ SWITCH
4382
4383 LDRC=0          ;CHECKSUM (OK, SO YOU'RE NOT ALLOWED TO LOAD
4384                 ;INTO IT DURING HARDWARE READIN, BUT WHO SAYS
4385                 ;YOUR PROGRAM CAN'T USE IT?)
4386 OFFSET -.+1             ;BEGIN LOADING INTO 1 AS PER HEADER
4387 LDRGO==.
4388         CONO PTR,60     ;START UP PTR (RESTART POINT)
4389 LDRRD==.
4390         HRRI LDRB,.+2   ;INITIALIZE INDEX
4391 LDRW==.
4392         CONSO PTR,10    ;WAIT FOR WORD TO BE AVAILABLE
4393         JRST .-1
4394         ROT LDRC,-LDRRD(LDRB)   ;BEFORE READING IN HEADER, ROTATE 2 BITS (THEN IGNORE)
4395                 ;BEFORE READING IN EACH DATA WORD, ROTATE 1 BIT (FOR UPDATING CHECKSUM)
4396                 ;BEFORE READING IN CHECKSUM, ROTATE NOT AT ALL (DON'T ROTATE CALCULATED CHECKSUM)
4397         DATAI PTR,@LDRT1-LDRRD(LDRB)    ;READ WORD INTO RIGHT PLACE
4398                 ;HEADER => READ INTO C
4399                 ;STORAGE WORD => READ INDEXED BY AOBJN POINTER IN A
4400                 ;CHECKSUM => READ INTO A FOR COMPARISON WITH C(C)
4401         XCT LDRT1-LDRRD(LDRB)   ;EXECUTE RELEVANT T1 ENTRY (MAYBE SKIPS)
4402         XCT LDRT2-LDRRD(LDRB)   ;EXECUTE RELEVANT T2 ENTRY (MAYBE JUMPS)
4403 LDRB==.
4404         SOJA .,         ;-RD(B) IS 2, 1, AND 0 FOR SUCCESSIVE ENCOUNTERS OF THIS INSTRUCTION
4405                         ;USED AS INDEX INTO TABLES, ETC.
4406
4407                 ;TABLE 1
4408                 ;INDIRECTED THROUGH FOR DATAI
4409                 ;THEN EXECUTED TO SEE WHAT TO DO WITH READ IN WORD
4410                 ;ENTRIES EXECUTED IN REVERSE ORDER
4411
4412 LDRT1==.
4413         CAME LDRC,LDRA  ;COMPARE CHECKSUM WITH CALCULATED, SKIP TO B IF THEY AGREE
4414         ADD LDRC,(LDRA) ;UPDATE CHECKSUM
4415         SKIPL LDRA,LDRC ;INITIALIZE HEADER AND SKIP UNLESS JUMP BLOCK
4416
4417                 ;TABLE 2
4418                 ;EXECUTED IF CORRESPONDING ENTRY IN TABLE 1 DIDN'T SKIP WHEN EXECUTED
4419
4420 LDRT2==.
4421         JRST 4,LDRGO    ;CHECKSUM ERROR
4422         AOBJN LDRA,LDRW ;UPDATE AOBJN POINTER AND GO BACK FOR NEXT STORAGE WORD IF NOT EXHAUSTED
4423 LDRA==.
4424         JRST LDRRD              ;WHEN INITIALLY LOADED IS JUMP BLOCK TO THIS LOADER
4425                 ;DURING LOADING USED TO HOLD HEADER (AOBJN POINTER), WHICH MAY BE LOADED JUMP BLOCK
4426
4427 OFFSET 0
4428 ELDR10==.
4429 \f
4430 ;FLAGS IN SQUOZE OF SYMS TO OUTPUT
4431
4432 ABSGLO==040000  ;SYM IS GLOBAL (IF RELOCA, SAYS THIS IS BLOCK NAME)
4433 ABSLCL==100000  ;LOCAL
4434 ABSDLI==200000  ;DELETE INPUT (DON'T RECOGNIZE IT IF TYPED IN)
4435 ABSDLO==400000  ;DELETE OUTPUT (DON'T TYPE IT OUT)
4436
4437 PSYMS:  HRRM A,RETURN   ;PUNCH OUT SYMBOL TABLE, CALLED AFTER EVERYTHING ELSE, SAVE RETURN POINT
4438         PUSH P,PSYMS    ;AT END, POPJ TO RETURN.
4439         TRNE FF,FRSYMS
4440         JRST SYMDMP     ;PUNCH SYMS IF NEC.
4441         SKIPL A,CONTRL
4442         JRST SYMDA      ;IF RELOCA, PUNCH PROGRAM NAME.
4443         TRNN A,DECREL
4444         POPJ P,
4445 PSYMSD: MOVSI A,DECEND
4446         PUSHJ P,DECBLK  ;START AN END-BLOCK.
4447         MOVE A,DECTWO   ;IN 2-SEG PROGRAMS,
4448         CAME A,[MOVE]
4449          JRST [ CAMG A,DECBRH   ;OUTPUT HISEG BREAK
4450                  MOVE A,DECBRH
4451                 MOVEM A,WRD
4452                 MOVEIM WRDRLC,1
4453                 CALL PWRD
4454                 MOVEMM WRD,DECBRK
4455                 CALL PWRD       ;FOLLOWED BY LOSEG BREAK
4456                 JRST EBLK]
4457         MOVEMM WRD,DECBRK       ;OUTPUT THE PROGRAM BREAK.
4458         MOVEIM WRDRLC,1
4459         PUSHJ P,PWRD
4460         MOVE A,DECBRA   ;OUTPUT HIGHEST ABS. ADDR
4461         CAIG A,140
4462          SETZ A,        ;IF IT'S ABOVE THE JOBDAT AREA.
4463         PUSHJ P,DECWRD
4464         JRST EBLK
4465
4466 SYMDA:  MOVEI A,LPRGN   ;NOW PUNCH PROGRAM NAME
4467         DPB A,[310700,,BKBUF]
4468         MOVE A,PRGNM
4469         TLO A,40000
4470         PUSHJ P,$OUTPT
4471         PUSHJ P,EBLK
4472         TLZ FF,FLOUT
4473         POPJ P,
4474
4475                 ;DUMP OUT THE SYMBOL TABLE
4476
4477 SYMDMP: TRZ I,IRCONT    ;OK TO END BLOCK
4478         CLEARM GLSP1
4479         CLEARM GLSP2
4480         CLEARM WRDRLC
4481         MOVE T,CONTRL
4482         MOVEI A,BKBUF+1
4483         MOVEM A,OPT1
4484         CLEARM CLOC
4485         CLEARM BKBUF
4486 IFN FASLP,[
4487         TRNE T,FASL
4488          JRST SYMDM1
4489 ]
4490         TRNE T,DECREL
4491          JRST SYMDMD
4492         JUMPL T,SSYMD   ;JUMP IF NOT RELOCATABLE
4493         MOVEI B,LDDSYM  ;LOCAL SYMS BLOCK TYPE
4494         DPB B,[310700,,BKBUF]   ;SET BLOCK TYPE
4495         MOVEM B,CDATBC
4496         MOVE B,SYMAOB   ;CAUSE SSYMD3 TO LOOK AT ENTIRE SYM TAB.
4497         JRST SSYMDR
4498
4499 SYMDMD: MOVSI A,DECSYM  ;IN DEC FMT, START SYMBOLS BLOCK.
4500         PUSHJ P,DECBLK
4501 SYMDM1: MOVE B,SYMAOB
4502         JRST SSYMDR
4503 \f
4504 ;AC ALLOCATIONS DURING PHASE 1 (COMPACTING THE SYMBOL TABLE):
4505         ;AA INITIALLY HAS -SMK,,; INPUT INDEX INTO ST
4506         ;A TEMP
4507         ;B SQUOZE
4508         ;D OUTPUT INDEX INTO SYMTAB
4509         ;CH1 VALUE OF SYM
4510         ;CH2 3RDWRD
4511 SSYMD:  MOVEI D,ST-1
4512         SETZB C,SMSRTF  ;SYMS SORTED => INITIAL SYMS CLOBBERED
4513         MOVE AA,SYMAOB
4514 SSYMD1: SKIPE B,ST(AA)  ;GET SYM NAME FROM TABLE
4515         TDNN B,[37777,,-1]      ;MAKE SURE NOT EXPUNGED
4516         JRST SSYMDL     ;NOT (REALLY) THERE, TRY NEXT
4517         MOVE CH1,ST+1(AA)       ;GET VALUE OF SYM
4518         3GET CH2,AA     ;GET 3RDWRD
4519         TRNE CH2,-1
4520         TLNE CH2,3KILL+3LLV
4521         JRST SSYMDL     ;DON'T PUNCH INITIAL OR KILLED SYMS.
4522         MOVEI A,0       ;INITIALIZE FOR SHIFTING IN FLAGS
4523         LSHC A,4        ;SHIFT FLAGS INTO A
4524         XCT SSYMDT(A)   ;DO THE APPROPRIATE THING THIS KIND OF SYMTAB ENTRY
4525         JRST SSYMDL
4526 SSYMD2: LSH B,-4        ;SHIFT SQUOZE BACK TO WHERE IT BELONGS
4527         TLO B,ABSLCL    ;SET LOCAL BIT
4528         TLNE CH2,3SKILL
4529         TLO B,ABSDLO    ;HALF-KILL SYM
4530         PUSH D,B        ;STORE NAME OF SYM IN OUTPUT SLOT
4531         PUSH D,CH1      ;STORE VALUE 
4532         PUSH D,CH2      ;STORE 3RDWRD
4533 SSYMDL: ADD AA,WPSTE1
4534         AOBJN AA,SSYMD1 ;LOOP FOR ALL SYMS IN TABLE
4535         MOVSI CH2,4^5   ;1ST BIT TO SORT ON IS TOPO BIT,
4536         MOVEI A,ST      ;SORT FROM BOTTOM OOF SYMTAB
4537         MOVEI B,1(D)    ;TO WHERE WE FILLED UP TO.
4538         MOVE CH1,[TDNE CH2,1(A)] ;SORT ON 2ND WD, WDS WITH BIT ON COME FIRST.
4539         MOVE C,[TDNN CH2,1(B)]
4540         JSP AA,SSYMD9
4541         TLC C,(TDNE#TDNN)       ;ON BITS AFTER 1ST, ENTRIES WITH BIT OFF COME FIRST.
4542         TLC CH1,(TDNE#TDNN)
4543         MOVEI AA,SSRTX  ;NEED ONLY CHANGE C, CH1 THE FIRST TIME.
4544         JRST SSRTX
4545
4546 SSYMD9: PUSHJ P,SSRTX   ;SORT SYMS ARITHMETICALLY BY VALUE.
4547         MOVNI B,(B)
4548         ADDI B,ST       ;SIZE OF AREA OF SYMTAB STILL IN USE.
4549         IDIV B,WPSTE
4550         HRLZI B,(B)
4551         MOVE C,BKTABP
4552         IDIVI C,BKWPB   ;# BLOCKS (INCL. .INIT BLOCK).
4553         CAIN C,2
4554          MOVEI C,1      ;IF ONLY .INIT AND .MAIN, FILE WILL HAVE ONLY GLOBAL.
4555         MOVSI A,(C)
4556         SUBM B,A        ;-<# ENTRIES IN SYMTAB IN FILE>,,
4557         LSH A,1         ;-<# WDS IN SYMTAB IN FILE>,,
4558         MOVEM A,SCKSUM  ;SAVE THIS.
4559         PUSHJ P,PPB
4560         PUSHJ P,BKCNT   ;PUT -<# SYMS IN BLOCK> IN 3RD WD OF EACH BKTAB ENTRY.
4561
4562 ;DROPS THROUGH.
4563 \f
4564 ;DROPS IN IF ABS, JUMPS HERE IF RELOC.
4565 ;NOTE THAT IN ABS ASSEMBLY, B WILL CONTAIN THE CHECKSUM AND
4566 ;SHOULD NOT BE CLOBBERED.
4567 SSYMDR: PUSH P,B        ;-<# SYMS>,,0  ;IT WILL BE -1(P)
4568         PUSHJ P,BKSRT   ;SORT BLOCKS INTO BKTAB1
4569         MOVE B,SCKSUM   ;GET CHKSUM AFTER 1SS WD. (PPBCK WILL UPDATE)
4570         SETOM 1(D)      ;PUT A -1 AT END OF BKTAB1.
4571         PUSH P,[-1]     ;(P) WILL BE BKTAB1 IDX OF NEXT BLOCK TO OUTPUT.
4572 SSYMD3: AOS F,(P)       ;F HAS BKTAB1 IDX OF BLOCK.
4573         SKIPGE C,BKTAB1(F)      ;BKTAB1 ELT HAS BKTAB IDX OR
4574         JRST SSYMDX     ; -1 AFTER LAST BLOCK.
4575         SKIPL LINK,CONTRL
4576          JRST SSYMD7    ;DIFFERENT RTN TO OUTPUT BLOCK NAME IF RELOCA.
4577         TRNE LINK,DECREL+FASL
4578          JRST SSYMD6    ;NO BLOCKS IN DEC FMT. (OR FASL EITHER)
4579         SKIPGE BKTAB1+1
4580          JRST SSYMG1    ;ONLY 1 BLOCK, PUT ALL IN GLOBAL.
4581         MOVE A,BKTAB(C)
4582         PUSHJ P,PPBCK
4583         HLRZ A,BKTAB+1(C)
4584         HRL A,BKTAB+2(C)        ;PUT IN -2*<NUM SYMS>
4585         ADD A,[-2,,1]
4586 SSYMG2: PUSHJ P,PPBCK   ;FOLLOWED BY LEVEL.
4587         JRST SSYMD6
4588
4589 SSYMG1: MOVE A,[SQUOZE 0,GLOBAL]
4590         PUSHJ P,PPBCK
4591         HRLZ A,BKTAB+BKWPB+2
4592         ADD A,[-2,,]
4593         JRST SSYMG2
4594
4595 SSYMD7: MOVE A,BKTAB(C) ;OUTPUT BLOCK NAME IN RELOCATABLE.
4596         TLO A,ABSGLO    ;TELL STINK IT'S BLOCK NAME.
4597         PUSHJ P,$OUTPT
4598         HLRZ A,BKTAB+1(C)
4599         SUBI A,1
4600         PUSHJ P,$OUTPT
4601 SSYMD6: SKIPL C,-1(P)   ;AOBJN PTR TO SYMS.
4602          JRST SSYMD3     ;IN CASE NO SYMS.
4603 SSYMD4: HRRZ A,ST+2(C)  ;OUPUT ONLY THE SYMS IN THE BLOCK
4604         CAME A,BKTAB1(F)        ;NOW BEING HANDLED.
4605         JRST SSYMD5
4606         SKIPGE LINK,CONTRL
4607         TRNE LINK,DECREL+FASL
4608         JRST SYMD2      ;SPECIAL IF RELOCA.
4609         MOVE A,ST(C)
4610         PUSHJ P,PPBCK   ;1ST, SQUOZE WITH FLAGS.
4611         MOVE A,ST+1(C)
4612         PUSHJ P,PPBCK   ;2ND, VALUE.
4613 SSYMD5: ADD C,WPSTE1
4614         AOBJN C,SSYMD4  ;HANDLE NEXT SYM.
4615         JRST SSYMD3     ;ALL SYMS FORR THIS BLOCK DONE, DO NEXT BLOCK.
4616 \f
4617 ;PUNCH OUT LOCAL SYM (RELOCATABLE ASSEMBLY)
4618 ;NORMALLY OUTPUT SQUOZE W/ FLAGS  ?  VALUE,
4619 ;IF 3LLV SET OUTPUT  PHONY NAME (= STE ADDR) ? SQUOZE W/ FLAGS, STINK FIXES IT UP.
4620 SYMD2:  LDB A,[400400,,ST(C)]
4621         MOVE CH1,ST+1(C)        ;SSYMDT MAY CHANGE CH1.
4622         MOVE CH2,ST+2(C)
4623         XCT SSYMDT(A)   ;SKIPS IF SHOULD OUTPUT SYM.
4624         JRST SSYMD5
4625         TLNE CH2,3KILL
4626         JRST SSYMD5
4627         MOVE B,ST(C)
4628         TLZ B,740000
4629         JUMPE B,SSYMD5  ;UNUSED ENTRY.
4630         JUMPL LINK,SYMDEC       ;J IF DEC OR FASL FMT
4631         TLNE CH2,3RLL
4632         TLO B,200000    ;RELOCATE LEFT HALF
4633         TLNE CH2,3RLR
4634         TLO B,100000    ;RELOCATE RIGHT HALF
4635         TLNE CH2,3SKILL
4636         TLO B,400000    ;HALF-KILL
4637         MOVEI A,ST(C)
4638         TLNE CH2,3LLV   ;IF STINK HAS VALUE,
4639         PUSHJ P,$OUTPT  ;GIVE STINK NAME STINK KNOWS SYMBOL BY.
4640         TLNE CH2,3LLV   ;IF GIVING PHONY NAME, INSURE LOCAL FLAG SET
4641          TLO B,ABSLCL   ;(STINK WILL DO SO OTHERWISE)
4642         MOVE A,B
4643         PUSHJ P,$OUTPT  ;OUTPUT SYM
4644         MOVE A,CH1
4645         TLNN CH2,3LLV   ;DON'T OUTPUT VALUE IF DON'T KNOW IT.
4646         PUSHJ P,$OUTPT  ;OUTPUT VALUE
4647         JRST SSYMD5
4648
4649 SYMDEC: IFN FASLP,[
4650         TRNE LINK,FASL
4651         JRST SYMFSL     ;FASL ASSMBLY
4652 ]
4653         PUSHJ P,ASQOZR  ;RIGHT-JUSTIFY THE SQUOZE,
4654         TLNE CH2,3SKILL
4655         TLO B,ABSDLO    ;MAYBE HALFKILL,
4656         TLO B,ABSGLO
4657         LDB A,[400400,,ST(C)]
4658         CAIGE A,DEFGVR_-14.
4659          TLC B,ABSGLO+ABSLCL ;LOCAL SYM, CHANGE GLO TO LCL.
4660         MOVEM B,WRD
4661         PUSH P,C
4662         PUSHJ P,DECPW   ;FIRST, THE NAME,
4663         POP P,C
4664         LDB TM,[420200,,ST+2(C)]
4665         MOVE A,ST+1(C)  ;THEN THE VALUE AND RELOCATION BITS.
4666         PUSHJ P,DECWR1
4667         JRST SSYMD5
4668
4669 IFN FASLP,[
4670 SYMFSL: TLO B,400000    ;GET VALUE FROM SECOND WD
4671         TLNE CH2,3RLL
4672         TLO B,200000    ;RELOCATE LH
4673         TLNE CH2,3RLR
4674         TLO B,100000
4675         CAIL A,LGBLCB_<-18.+4>
4676         TLO B,40000     ;GLOBAL FLAG
4677         MOVE A,B
4678         MOVEI B,15      ;PUTDDTSYM
4679         PUSHJ P,FASO
4680         MOVE A,CH1
4681         PUSHJ P,FASO1
4682         JRST SSYMD5
4683 ]
4684 \f
4685 ;XCT INDEXED ON SQUOZE FLAGS; SHOULDN'T PUNCH SYM IF DOESN'T SKIP.
4686 SSYMDT: JFCL            ;COM
4687         JFCL            ;PSEUDO OR MACRO
4688         CAIA            ;SYM, PUNCH OUT
4689         TLNN CH2,3LLV   ;LOCAL UNDEFINED, OUTPUT IF STINK HAS VALUE TO TELL STINK WHERE TO PUT IT.
4690         TLZA CH1,-1     ;DEFINED LOCAL VARIABLE, CLEAR OUT LH(VALUE)
4691         JFCL            ;UNDEFINED LOCAL VARIABLE
4692         SKIPL CONTRL    ;DEFINED GLOBAL VARIABLE, PUNCH OUT IF ABS.
4693         JFCL            ;UNDEFINED GLOBAL VARIABLE
4694         SKIPL CONTRL    ;GLOBAL ENTRY, PUNCH OUT IF ABS ASSEM.
4695         JFCL            ;GLOBAL EXIT, DON'T PUNCH OUT
4696 IFN .-SSYMDT-NCDBTS,.ERR SSYMDT LOSES.
4697
4698 SSYMDX: SKIPGE LINK,CONTRL
4699         TRNE LINK,DECREL+FASL
4700          JRST SSYMG3
4701         SKIPGE BKTAB1+1 ;IF ABS ANND BLOCK STR,
4702          JRST SSYMG4
4703         MOVE A,[SQUOZE 0,GLOBAL]
4704         PUSHJ P,PPBCK   ;PUT A GLOBAL BLOCK WITH NO SYMS AT END.
4705         MOVSI A,-2
4706         PUSHJ P,PPBCK
4707 SSYMG4: MOVE A,B        ;ABS ASSEMBLY, OUTPUT CHKSUM.
4708         PUSHJ P,PPB
4709 SSYMG3: SUB P,[2,,2]
4710         PUSHJ P,EBLK    ;END CURRENT OUTPUT BLOCK
4711         SKIPL A,CONTRL  ;RELOCATABLE => OUTPUT PROG NAME.
4712         JRST SYMDA
4713 IFN FASLP,[
4714         TRNE A,FASL
4715         POPJ P,
4716 ]
4717         TRNE A,DECREL   ;DEC FMT => OUTPUT END BLOCK.
4718          JRST PSYMSD
4719         MOVE A,STARTA   ;NOW GET STARTING INSTRUCTION
4720         JRST PPB        ;PUNCH IT OUT AND RETURN
4721
4722 ;PUT INTO BKTAB1 THE BKTAB IDXS OF ALL THE BLOCKS IN THE ORDER THEIR
4723 ;SYMS SHOULD BE PUNCHED (A BLOCK'S SUBBLOCKS PRECEDE IT)
4724 BKSRT:  MOVEI D,BKTAB1-1        ;D IS FOR PUSHING INTO BKTAB1.
4725         MOVSI A,1       ;START WITH BLOCK 0 (OUTERMOST, .INIT).
4726 BKSR1:  SETZ C, ;HANDLE BLOCK IN A: LOOK FOR ITS SUBBLOCKS.
4727 BKSR2:  CAME A,BKTAB+1(C)
4728         JRST BKSR3      ;THIS BLOCK ISN'T A SUBBLOCK.
4729         ADD A,[1,,]     ;LH HAS SUBBLOCK'S LEVEL.
4730         HRRI A,(C)      ;RH HAS SUBBLOCK.
4731         PUSHJ P,BKSR1   ;HANDLE THE SUBBLOCK
4732         MOVE A,BKTAB+1(C)
4733 BKSR3:  ADDI C,BKWPB
4734         CAMGE C,BKTABP
4735         JRST BKSR2
4736         MOVEI C,(A)
4737         JUMPE C,CPOPJ   ;DON'T PUT .INIT BLOCK IN BKTAB1.
4738         PUSH D,C        ;PUT THE BLOCK IN BKTAB1 (AFTER SUBBLOCKS)
4739         POPJ P,
4740
4741 PPBCK:  ROT B,1 ;OUTPUT WD IN A, UPDATING CKSUM IN B.
4742         ADD B,A
4743         JRST PPB
4744 \f
4745 BKCNT:  PUSH P,B
4746         MOVEI C,0
4747 BKCNT0: SETZM BKTAB+2(C)        ;ZERO 3RD WD OF EACH BKTAB ENTRY.
4748         ADDI C,BKWPB
4749         CAMGE C,BKTABP
4750          JRST BKCNT0
4751 BKCNT1: MOVE C,ST+2(B)
4752         SOS BKTAB+2(C)  ;ADD -2 FOR EACH SYM IN THE BLOCK.
4753         SOS BKTAB+2(C)
4754         ADD B,WPSTE1
4755         AOBJN B,BKCNT1
4756 POPBJ:  POP P,B
4757         POPJ P,
4758
4759 SSRTX:  HRLM B,(P)      ;DO ONE PASS OF RADIX-EXCHANGE. SAVE END.
4760         CAIL A,@WPSTEB  ;ONLY 1 ENTRY, NOTHING TO DO.
4761          JRST SSRTX7
4762         PUSH P,A        ;SAVE START.
4763 SSRTX3: XCT CH1
4764          JRST SSRTX4    ;MOVE UP TO 1ST WITH BIT ON.
4765         SUB B,WPSTE
4766         XCT C           ;MOVE DOWN TO LAST WITH BIT OFF.
4767          JRST SSRTX5
4768         MOVE D,WPSTE
4769         CAIE D,MAXWPS
4770          JRST .+4
4771 REPEAT MAXWPS,[
4772         MOVE D,.RPCNT(A)        ;EXCHANGE THEM,
4773         EXCH D,.RPCNT(B)
4774         MOVEM D,.RPCNT(A)]
4775 SSRTX4: ADD A,WPSTE
4776 SSRTX5: CAME A,B        ;ALL DONE => DO NEXT BIT.
4777          JRST SSRTX3    ;MORE IN THIS PASS.
4778         ROT CH2,-1      ;NEXT BIT DOWN.
4779         POP P,A         ;A -> START, B -> END OF 1ST HALF.
4780         JUMPL CH2,SSRTX6        ;ALL BITS IN WD DONE, STOP.
4781         PUSHJ P,(AA)    ;DO NEXT BIT ON 1ST HALF.
4782         HLRZ B,(P)      ;A -> END OF 1ST HALF, B -> END OF ALL.
4783         PUSHJ P,(AA)    ;DO SECOND HALF.
4784 SSRTX6: ROT CH2,1       ;LEAVE CH2 AS FOUND IT.
4785 SSRTX7: HLRZ A,(P)      ;LEAVE A -> END OF AREA SORTED.
4786         POPJ P,
4787 \f
4788                 ;ARITHMETIC CONDITIONALS (B HAS JUMP<COND> A,)
4789
4790 COND:   PUSH P,B        ;SAVE CONDITIONAL JUMP
4791         PUSHJ P,AGETFD  ;GET FIELD TO TEST VALUE OF
4792 CONDPP: POP P,T         ;RESTORE CONDITIONAL JUMP INSTRUCTION
4793         HRRI T,COND2    ;HRRI IN JUMP ADDRESS, GO TO COND2 IF CONDITIONAL TRUE
4794         XCT T           ;JUMP IF COND T,ASSEMBLE STRING
4795 COND4:  SETZM A.SUCC    ;MOST RECENT CONDIT. FAILED.
4796 COND5:  JSP TM,ERMARK   ;ERROR MSGS SHOULD SAY WHAT PSEUDO WE'RE IN.
4797         CALL RCH
4798         JSP D,RARL4     ;INIT FOR THE CONDITIONALIZED STUFF.
4799          CAIA
4800         CALL RARFLS     ;READ AND IGNORE THE ARG.
4801         JRST MACCR
4802
4803 ANULL:  TLO FF,FLUNRD
4804         JRST COND5
4805
4806 ;.ELSE, .ALSO - B'S LH WILL HAVE SKIPE OR SKIPN.
4807 A.ELSE: HRRI B,A.SUCC
4808         XCT B
4809          JRST COND4     ;CONDITION FALSE.
4810         JRST COND2      ;TRUE.
4811
4812 ;IF1, IF2 - B'S LH WILL HAVE TRNE FF, OR TRNN FF,
4813 COND1:  HRRI B,FRPSS2
4814         XCT B
4815         JRST COND4      ;NO
4816                 ;CONDITION TRUE, ASSEMBLE STRING
4817 COND2:  SETOM A.SUCC    ;LAST CONDITIONAL SUCCEEDED.
4818 COND6:  PUSHJ P,RCH     ;GET NEXT CHAR
4819         CAIE A,LBRKT
4820          JRST [ CAIE A,LBRACE
4821                  TLO FF,FLUNRD
4822                 JRST MACCR]
4823         SKIPN SCNDEP    ;BRACKET TYPE CONDITIONAL.
4824         SKIPE CONDEP
4825         JRST COND7
4826         MOVEMM CONDLN,CLNN      ;AT TOP LEVEL, SAVE IN CASE THIS UNTERMINATED
4827         MOVEMM CONDPN,CPGN
4828 IFN TS, MOVEMM CONDFI,INFFN1
4829 COND7:  AOS SCNDEP      ;COUNT IT FOR RBRAK'S SAKE.
4830         JRST MACCR
4831 \f
4832                 ;IFB, IFNB
4833
4834 SBCND:  PUSH P,B        ;SAVE TEST JUMP
4835         SETZB B,C       ;C COUNTS SQUOZE CHARS FOR IFB/IFNB
4836                         ;B COUNTS NONSQUOZE FOR IFSQ/IFNSQ
4837         JSP D,RARG      ;INIT FOR READING OF ARG WHOSE BLANKNESS
4838          JRST CONDPP    ;IS TO BE TESTED.
4839         JSP D,RARGCH(T) ;READ 1 CHAR,
4840          JRST CONDPP    ;(NO MORE CHARS)
4841         HLRZ A,GDTAB(A) ;GET GDTAB ENTRY
4842         CAIE A,(POPJ P,)        ;POPJ => NOT SQUOZE
4843          AOJA C,RARGCH(T)
4844         AOJA B,RARGCH(T)
4845
4846                 ;IFDEF, IFNDEF
4847
4848 DEFCND: SAVE SYM
4849         PUSH P,B        ;SAVE CONDITIONAL JUMP
4850         PUSHJ P,GETSLD  ;GET NAME
4851          CALL NONAME
4852         PUSHJ P,ES
4853          MOVEI A,0      ;UNDEFINED
4854 IFN CREFSW,XCT CRFINU
4855         CAIN A,GLOEXT_-14.      ;GLOBAL EXIT...
4856          SKIPL CONTRL   ;DURING ABSOLUTE ASSEMBLY?
4857           CAIN A,3      ;NO, LOCAL UNDEF?
4858            MOVEI A,0    ;ONE OF THESE => UNDEF
4859         REST SYM
4860         EXCH SYM,(P)    ;POP SYM OUT FROM UNDER THE CONDITIONAL JUMP.
4861         JRST CONDPP
4862 \f
4863 ;;PWRD          ;ROUTINES TO OUTPUT ASSEMBLES WORDS AND PORTIONS THEREOF
4864
4865                 ;HERE FROM PBITS TO OUTPUT WORD OF CODE BITS
4866
4867 PBITS3: PUSH P,A
4868         MOVEI A,14
4869         MOVEM A,PBITS2  ;INITIALIZE PBITS2 FOR COUNTING DOWN THROUGH NEXT SET OF CODE BITS
4870         MOVE A,[440300,,PBITS1]
4871         MOVEM A,BITP    ;SET UP BITP FOR RELOADING PBITS1 WITH CODE BITS
4872         MOVE A,PBITS1   ;NOW GET ACCUMULATED WORD OF BITS
4873         MOVEM A,@PBITS4 ;STORE IN BKBUF
4874         AOS A,OPT1      ;RESERVE SPACE FOR NEW WORD
4875                 ;IF FRBIT7 SET (LAST CALL TO PBITS HAD 7) THEN NEXT WORD OF CODE BITS GOES
4876                 ;AFTER NEXT WORD OUTPUT (REALLY!), OTHERWISE BEFORE
4877         TRNN FF,FRBIT7
4878         SOSA A
4879         TRO FF,FRINVT
4880         HRRZM A,PBITS4
4881         POP P,A
4882         CLEARM PBITS1
4883                         ;DROPS THROUGH
4884                 ;OUTPUT RELOCATION CODE BITS IN A
4885
4886 PBITS:  SKIPGE CONTRL
4887         POPJ P,         ;NOT RELOCATABLE
4888         SOSGE PBITS2
4889         JRST PBITS3     ;NO MORE ROOM IN WORD, OUTPUT IT AND TRY AGAIN
4890         CAIN A,7
4891         TROA FF,FRBIT7
4892         TRZ FF,FRBIT7
4893         IDPB A,BITP
4894         POPJ P,
4895
4896                 ;Call when you're about to output two words into a block.
4897 MKROOM: PUSH P,A
4898         MOVE A,OPT1
4899         CAIL A,BSIZE+BKBUF-1    ;Space for more than one word?
4900          PUSHJ P,EBLK           ;No - start a new block
4901         POP P,A
4902         POPJ P,
4903
4904                 ;FOLLOWING ROUTINES SAVE AC'S EXCEPT FOR A
4905
4906 OUTSM0: MOVE A,SYM      ;OUTPUT NAME STINK KNOWS SYMBOL BY.
4907         TLZ A,37777     ;FOR LOCALS, THAT'S THE STE ADDR,
4908         HRRI A,ST(D)
4909         TLNN SYM,40000  ;FOR GLOBALS, THAT'S THE SQUOZE.
4910          JRST $OUTPT
4911 OUTSM:  SKIPA A,SYM
4912 OUTWD:  MOVE A,WRD
4913 $OUTPT: SKIPGE CONTRL   ;DIRECTLY PUNCH OUT WORD IN A IN RELOCATABLE ASSEMBLY ONLY
4914         POPJ P,         ;DO NOTHING IF ABSOLUTE ASSEMBLY
4915         PUSH P,AA
4916         MOVE AA,OPT1
4917         TRZN FF,FRINVT  ;SKIP IF BEING HACKED FROM PBITS3, PUT WORD BEFORE WHERE IT NORMALLY BELONGS
4918         AOS AA
4919         MOVEM A,-1(AA)
4920         MOVE A,CLOC
4921         TRZE FF,FRFIRWD
4922         HRRM A,BKBUF
4923         POP P,AA
4924         AOS A,OPT1
4925         CAIL A,BSIZE+BKBUF
4926         TRNE I,IRCONT
4927         POPJ P,
4928                 ;MAY DROP THROUGH
4929 \f
4930                 ;END CURRENT OUTPUT BLOCK
4931
4932 EBLK:   PUSH P,T
4933         PUSH P,TT
4934         PUSH P,A
4935         PUSH P,B
4936         MOVE T,CONTRL
4937         JUMPGE T,EBLK3  ;JUMP IF RELOCATABLE ASSEMBLY
4938         TRNE T,ARIM10\SBLKS
4939         JRST ESBLK
4940 IFN FASLP,[
4941         TRNE T,FASL
4942         JRST FASLE      ;FASL HAS NO BLOCKS TO END - IGNORE
4943 ]
4944         TRNE T,DECREL
4945          JRST DECEBL
4946         JRST EBLK5
4947
4948 EBLK3:  MOVE T,PBITS1
4949         MOVEM T,@PBITS4
4950         MOVEI T,PBITS4
4951         MOVEM T,PBITS4
4952         MOVE T,[440300,,PBITS1]
4953         MOVEM T,BITP
4954         CLEARB TT,PBITS2
4955         CLEARM PBITS1
4956         MOVEI T,BKBUF
4957         MOVE B,OPT1     ;GET POINTER TO END OF BLOCK
4958         SUBI B,BKBUF+1  ;CONVERT TO # WORDS IN BLOCK (EXCLUDING HEADER)
4959         DPB B,[220700,,BKBUF]   ;SET COUNT FIELD IN HEADER
4960         TRZN FF,FRLOC
4961         JUMPLE B,EBLK5  ;IGNORE NULL BLOCK UNLESS FRLOC SET
4962         TLO FF,FLOUT    ;INDICATE THAT OUTPUT HAS OCCURED (FOR 1PASS MULTIPLE-ASSEMBLY HACKING)
4963         PUSHJ P,FEED
4964 EBK1:   CAML T,OPT1     ;DONE WITH BLOCK?
4965         JRST EBK2       ;YES
4966         MOVE A,(T)      ;NO, GET DATA WORD
4967         JFCL 4,.+1      ;UPDATE CHECKSUM
4968         ADD TT,A
4969         JFCL 4,[AOJA TT,.+1]
4970         PUSHJ P,PPB     ;OUTPUT WORD
4971         AOJA T,EBK1
4972 EBK2:   SETCM A,TT      ;DONE OUTPUTTING BLOCK, NOW GET CHECKSUM
4973         PUSHJ P,PPB     ;OUTPUT CHECKSUM
4974         MOVE T,CDATBC   ;GET BLOCK TYPE
4975         DPB T,[310700,,BKBUF]   ;SET NE T BLOCK TYPE TO STORAGE WORDS BLOCK TYPE
4976         MOVEI T,BKBUF+1
4977         MOVEM T,OPT1
4978 EBLK4:  TLO FF,FLOUT    ;INDICATE THAT OUTPUT HAS OCCURED (FOR 1PASS MULTIPLE-ASSEMBLY HACKING)
4979 EBLK5:  TRO FF,FRFIRWD
4980 FASLE:  POP P,B
4981         POP P,A
4982 PTT.TJ: POP P,TT
4983         POP P,T
4984         POPJ P,
4985 \f
4986                 ;PUNCH OUT WORD OF CODED DATA (E.G. STORAGE WORD); WRD, WRDRLC, GLOTB ENTRIES
4987
4988 PWRDA:  TROA FF,FRNLIK  ;SUPPRESS ADR LINKING
4989 PWRD:   TRZ FF,FRNLIK   ;PERMIT ADR LINKING
4990         JUMPGE FF,CPOPJ ;IGNORE IF NOT PUNCHING PASS
4991 IFN LISTSW,[
4992         SKIPN LSTONP
4993          JRST PWRDL     ;NOT MAKING LISTING NOW.
4994         SKIPGE LISTPF
4995         PUSHJ P,PNTR
4996         SETOM LISTPF
4997         MOVE LINK,WRD
4998         MOVEM LINK,LISTWD
4999         MOVE LINK,WRDRLC
5000         MOVEM LINK,LSTRLC
5001         MOVE LINK,CLOC
5002         MOVEM LINK,LISTAD
5003         MOVE LINK,CRLOC
5004         DPB LINK,[220100,,LISTAD]
5005 PWRDL:
5006 ] ;END IFN LISTSW,
5007         SKIPGE LINK,CONTRL
5008         JRST PWRD1      ;ABSOLUTE ASSEMBLY
5009                 ;RELOCATABLE ASSEMBLY
5010         PUSHJ P,$RSET   ;CHECK VALIDITY OF RELOCATION, STANDARDIZE IF NON-STANDARD
5011         MOVE A,GLSP2
5012         CAMN A,GLSP1
5013         JRST PWRD2      ;NO GLOBALS
5014
5015                 ;NOW TO SEE IF IT'S POSSIBLE OR DESIRABLE TO ADDRESS LINK
5016
5017         HRLZ B,WRD
5018         HRR B,WRDRLC
5019         JUMPN B,PWRD3   ;JUMP IF RH NON-ZERO
5020         TRNN FF,FRNLIK
5021         SKIPGE GLOCTP
5022         JRST PWRD3      ;ADR LINKING SUPPRESSED OR CLOC GLOBAL
5023         SKIPE LDCCC
5024         JRST PWRD3      ;IN LOAD TIME CONDITIONALS
5025         MOVNI T,1       ;INITIALIZE T FOR COUNTING
5026 PWRD4:  CAML A,GLSP1
5027         JRST PWRD5      ;DONE
5028         HRRZ TT,1(A)    ;GET GLOTB ENTRY
5029         JUMPE TT,PWRD7A
5030         LDB TT,[400400,,(TT)]   ;GET SQUOZE FLAGS FROM SYM
5031         CAIE TT,DEFGVR_-14.
5032         CAIN TT,GLOETY_-14.
5033         JRST PWRD3      ;DEFINED, BUT MUST BE HERE FOR A REASON (SEE $.H)
5034         HLRZ TT,1(A)
5035         TRNE TT,1777+MINF
5036         JRST PWRD3      ;NEGATED OR MULTIPLIED
5037         TRNE TT,HFWDF
5038         JRST PWRD7
5039         TRNE TT,ACF
5040         TRNN TT,SWAPF
5041         JRST PWRD3      ;NOT HIGH AC
5042 PWRD7A: AOJA A,PWRD4
5043 PWRD7:  TRNE TT,SWAPF
5044         AOJA A,PWRD4    ;LEFT HALF
5045         AOJN T,PWRD3    ;JUMP IF THIS NOT FIRST GLOBAL IN RIGHT HALF
5046         MOVEI D,1(A)    ;FIRST GLOBAL, SET UP POINTER TO GLOTB ENTRY
5047         AOJA A,PWRD4
5048 \f
5049 PWRD5:  AOJE T,PWRD3    ;NO GLOBALS LOOK BAD AND THERE AREN'T TOO MANY; JUMP IF NONE IN RH
5050         HRRZ T,(D)      ;GET ADR OF SQUOZE
5051         SKPST T,        ;SKIP IF IN SYMBOL TABLE
5052         JRST PWRD3      ;BELOW SYMBOL TABLE, DON'T ADDRESS LINK AFTER ALL
5053         PUSH P,T        ;HOORAY, WE CAN ADDRESS LINK
5054         SETZM (D)       ;CLEAR OUT GLOTB ENTRY, DON'T NEED IT ANY MORE
5055         PUSHJ P,PWRD31  ;DUMP OUT THE OTHER GLOBALS
5056         POP P,D         ;GET ST ADR OF THIS AGAIN
5057         3GET1 A,D
5058         LDB A,[.BP (3RLNK),A]
5059         MOVE B,WRDRLC
5060         TLNE B,1
5061         TRO A,2         ;RELOCATE LEFT HALF
5062         PUSHJ P,PBITS   ;PUNCH OUT APPROPRIATE BITS FOR LINK LIST ENTRY
5063         HLR A,1(D)      ;GET ADR OF LAST
5064         HLL A,WRD
5065         PUSHJ P,$OUTPT  ;OUTPUT WORD WITH RH = ADR OF LAST RQ FOR SYM TO PUT IN RH'S
5066         MOVE A,CLOC     ;NOW UPDATE ST ENTRY
5067         HRLM A,1(D)
5068         3GET1 B,D
5069         SKIPN CRLOC
5070         TLZA B,3RLNK    ;CLOC NOT RELOCATED LAST TIME THIS SYM USED
5071         TLO B,3RLNK     ;RELOCATED
5072         3PUT1 B,D
5073         POPJ P,
5074 \f
5075 PWRD31: MOVE T,GLSP2    ;DUMP ALL GLO S IN GENERAL FORMAT
5076 PWRD3A: CAML T,GLSP1
5077         POPJ P,
5078         MOVE B,1(T)
5079         TRNN B,-1
5080         AOJA T,PWRD3A
5081         TLNE B,1777
5082         JRST RPWRD      ;REPEAT
5083 RPWRD1: LDB A,[.BP (MINF),B]
5084         TRO A,4
5085         PUSHJ P,PBITS
5086         MOVE  A,(B)     ;CODEBITS +SQUOZE FOR SYM
5087         HLRZ C,A
5088         TLZ A,740000
5089         CAIL C,DEFGVR
5090         TLOA A,40000    ;SYM IS GLO
5091         JRST [  MOVEI C,(B)             ;IF WE ARE OUTPUTTING A REFERENCE TO THE
5092                 CAIL C,PCNTB            ;"LABEL" AT THE BEGINNING OF A CONSTANTS AREA
5093                 CAIL C,PCNTB+NCONS*3    ;(BECAUSE THIS IS A 1PASS ASSEMBLY) USE THE
5094                 MOVEI A,(B)             ;NAME, SINCE THE SYMBOL ISN'T IN THE
5095                 JRST .+1]               ;SYMTAB
5096         TLNE B,SWAPF
5097         TLO A,400000
5098         TLNE B,ACF
5099         JRST PWRD3E     ;AC HIGH OR LOW
5100         TLNN B,HFWDF
5101         JRST PWRD3F     ;ALL THROUGH
5102         TLO A,100000
5103         TLNE B,SWAPF
5104         TLC A,300000
5105 PWRD3F: PUSHJ P,$OUTPT
5106         AOJA T,PWRD3A
5107
5108
5109
5110 RPWRD:  PUSHJ P,PBITS7
5111         MOVEI A,CRPT
5112         PUSHJ P,PBITS
5113         LDB A,[221200,,B]
5114         PUSHJ P,$OUTPT
5115         JRST RPWRD1
5116
5117 PWRD3E: TLO A,300000
5118         JRST PWRD3F
5119
5120 PWRD3:  PUSHJ P,PWRD31
5121 PWRD2:  PUSHJ P,RCHKT
5122         HRRZ A,B
5123         DPB T,[10100,,A]
5124         PUSHJ P,PBITS
5125         JRST OUTWD
5126 \f
5127                 ;CHECK FOR VALIDITY OF RELOCATION BITS OF CURRENT WORD
5128                 ;LEAVE RELOC (RH) IN B, RELOC (LH) IN T
5129
5130 RCHKT:  HRRZ B,WRDRLC   ;CHECK FOR RELOC. OTHER THAN 0 OR 1.
5131         HLRZ T,WRDRLC
5132         TRZN B,-2
5133         TRZE T,-2
5134 RLCERR: ETSM [ASCIZ /Illegal relocation/]
5135         POPJ P,
5136
5137 RMOVET: ROT T,-1
5138         DPB B,[420100,,T]
5139         TLZ C,3DFCLR    ;SET RELOC BITS IN C
5140         IOR C,T         ;FROM B AND T.
5141         POPJ P,
5142
5143                 ;CHECK WRDRLC FOR VALIDITY (CAPABILITY OF BEING PUNCHED OUT)
5144                 ;IF STANDARD THEN JUST RETURN
5145                 ;IF NON-STANDARD BUT OTHERWISE OK, PUT $R. ON GLOBAL LIST, RESET WRDRLC, AND RETURN
5146                 ;LEAVES B AND C SET UP WITH RH, LH OF WRDRLC.
5147
5148 $RSET:  MOVE C,WRDRLC   ;GET RELOCATION
5149         ADDI C,400000   ;WANT TO SEPARATE HALFWORDS
5150         HLRE B,C        ;GET LH IN B
5151         HRREI C,400000(C)       ;GET RH IN C (WILL EXCHANGE LATER)
5152         MOVE A,[SWAPF+HFWDF,,$R.H]      ;PUT THIS ON GLOBAL LIST IF LH NEEDS $R.
5153         TRNE B,-2       ;CHECK LH
5154         PUSHJ P,$RSET1  ;LH NEEDS GLOBAL REFERENCE
5155         EXCH B,C
5156         HRLI A,HFWDF
5157         TRNE B,-2       ;CHECK RH
5158         PUSHJ P,$RSET1  ;RH NEEDS GLOBAL REFERENCE
5159         HRLZM C,WRDRLC  ;RELOC OF LH
5160         ADDM B,WRDRLC   ;COMPLETE SETTING UP WRDRLC
5161         POPJ P,
5162
5163 $RSET1: JUMPGE B,$RSET2 ;STRANGE RELOCATION IN B, JUMP IF NON-NEGATIVE
5164         MOVN T,B        ;NEGATIVE, GET MAGNITUDE
5165         TLOA A,MINF     ;SET FLAG TO NEGATE GLOBAL
5166 $RSET2: SOSA T,B        ;POSITIVE, GET ONE LESS THAN IT IN T
5167         TDZA B,B        ;NEGATIVE, CLEAR B, RELOCATION LEFT OVER
5168         MOVEI B,1       ;POSITIVE, SET RELOCATION LEFT OVER TO 1
5169         CAIN T,1
5170         MOVEI T,0       ;MULTIPLYING BY TWO OR SUBTRACTING TIMES 1
5171         TRNE T,-2000
5172          ETSM [ASCIZ /Relocation too large/]    ;TOO BIG EVEN FOR $RSET
5173         DPB T,[221200,,A]       ;LOOKS OK, STORE TIMES FIELD IN $R. REFERENCE
5174         AOS GLSP1       ;NOW PUT $R. ON GLOBAL LIST
5175         MOVEM A,@GLSP1
5176         POPJ P,
5177 \f
5178                 ;PWRD DURING ABSOLUTE ASSEMBLY
5179
5180 PWRD1:  TRNE LINK,DECREL        ;DEC FMT IS CONSIDERED ABSOLUTE.
5181          JRST DECPW
5182 IFN FASLP,[
5183         TRNE LINK,FASL
5184          JRST FASPW     ;SO IS FASL
5185 ]
5186         MOVE A,GLSP1
5187         CAME A,GLSP2
5188          ETR ERRILG     ;GLOBALS APPEARING ILLEGALLY
5189         SKIPE WRDRLC
5190          ETR ERRIRL     ;RELOCATION APPEARING ILLEGALLY
5191         TRNE LINK,ARIM
5192         JRST PRIM       ;RIM
5193 SBLKS1: MOVE A,WRD      ;SBLK
5194         MOVEM A,@OPT1   ;STORE WRD IN BKBUF
5195         MOVE A,CLOC
5196         TRZE FF,FRFIRWD
5197         MOVEM A,BKBUF   ;FIRST WORD OF BLOCK, SET UP HEADER
5198         AOS A,OPT1
5199         CAIGE A,BKBUF+BSIZE
5200         POPJ P,         ;BKBUF NOT FULL YET
5201
5202 SBLKS2: SUBI A,BKBUF+1
5203         JUMPE A,CPOPJ
5204         MOVNS A
5205         HRLM A,BKBUF
5206         PUSHJ P,FEED
5207         MOVEI T,BKBUF
5208         CLEARM SCKSUM
5209 SBLK1:  CAML T,OPT1
5210         JRST SBLK2
5211         MOVE A,SCKSUM
5212         ROT A,1
5213         ADD A,(T)
5214         MOVEM A,SCKSUM
5215         MOVE A,(T)
5216         PUSHJ P,PPB
5217         AOJA T,SBLK1
5218
5219 SBLK2:  TRO FF,FRFIRWD
5220         MOVEI A,BKBUF+1
5221         MOVEM A,OPT1
5222         MOVE A,SCKSUM
5223         JRST PPB
5224
5225 ESBLK:  MOVE A,OPT1
5226         CAIN A,BKBUF+1
5227          JRST EBLK5     ;AVOID SETTING FLOUT IF NULL BLOCK.
5228         PUSHJ P,SBLKS2
5229         JRST EBLK4
5230
5231 PRIM:   MOVSI A,(DATAI PTR,)
5232         HRR A,CLOC
5233         PUSHJ P,PPB
5234         MOVE A,WRD
5235         JRST PPB
5236 \f
5237 ;END A BLOCK IN DEC FMT. COME FROM EBLK.
5238 DECEBL: PUSH P,[EBLK5]
5239 DECEB1: MOVSI A,DECWDS  ;JUST INIT. AN ORDINARY BLOCK,
5240
5241 ;COME HERE TO OUTPUT PREVIOUS BLOCK AND START NEW BLOCK OF TYPE IN LH OF A.
5242 DECBLK: PUSH P,A
5243         HRRZ A,BKBUF    ;GET DATA-WORD COUNT OF CURRENT BLOCK.
5244         JUMPE A,DECB1   ;NO WORDS => CAN IGNORE.
5245         MOVEI TT,BKBUF+1
5246 DECB0:  MOVE A,-1(TT)   ;GET AND PUNCH NEXT WD OF BLOCK.
5247         PUSHJ P,PPB
5248         CAME TT,OPT1    ;STOP WHEN NEXT WD ISN'T IN BLOCK.
5249          AOJA TT,DECB0
5250 DECB1:  POP P,A
5251         HLLZM A,BKBUF   ;PUT BLOCK TYPE IN LH OF HEADER, DATA WD COUNT IN RH IS 0.
5252         MOVEI TT,BKBUF+2        ;ADDR OF PLACE FOR 1ST DATA WD
5253         MOVEM TT,OPT1           ;(LEAVE SPACE FOR WD OF RELOC BITS)
5254         MOVE TT,[440200,,BKBUF+1]
5255         MOVEM TT,BITP   ;BP FOR STORING PAIRS OF RELOC BITS.
5256         SETZM BKBUF+1   ;CLEAR THE WD OF RELOC BITS.
5257         TLO FF,FLOUT
5258         POPJ P,
5259
5260 ;COME HERE TO OUTPUT A WORD IN DEC FORMAT.
5261 DECPW:  MOVS A,BKBUF
5262         CAIE A,DECWDS   ;BEFORE THE 1ST STORAGE WD IN ORDINARY BLOCK,
5263          JRST DECPW0
5264         MOVE A,CRLOC    ;MUST GO THE LOCATION CTR.
5265         IDPB A,BITP
5266         MOVE A,CLOC
5267         MOVEM A,@OPT1
5268         AOS OPT1
5269         AOS BKBUF       ;IT COUNTS AS DATA WORD.
5270 DECPW0: MOVE A,BITP
5271         TLNE A,77^4     ;IF NO ROOM FOR MORE RELOC BITS,
5272          JRST DECPW1
5273         HLLZ A,BKBUF    ;START A NEW BLOCK.
5274         PUSHJ P,DECBLK
5275         JRST DECPW
5276
5277 DECPW1: PUSHJ P,$RSET   ;SET UP RELOC BITS OF HALVES IN B,C.
5278         LSH C,1
5279         IORI B,(C)      ;COMBINE THEM.
5280         MOVE A,GLSP1
5281         CAME A,GLSP2
5282         JRST DECPG      ;GO HANDLE GLOBALS.
5283 DECPW3: IDPB B,BITP     ;STORE THE RELOC BITS
5284         MOVE A,WRD
5285 DECPW2: MOVEM A,@OPT1   ;AND THE VALUE.
5286         AOS OPT1
5287         AOS BKBUF
5288         POPJ P,
5289 \f
5290 ;PUT A WORD DIRECTLY INTO DEC FMT BLOCK.
5291 DECWRD: SETZ TM,
5292 DECWR1: IDPB TM,BITP    ;SKIP A PAIR OF RELOC BITS,
5293         JRST DECPW2     ;STORE THE WORD.
5294
5295 ;HANDLE GLOBAL REFS IN DEC FMT.
5296 DECPG:  PUSHJ P,DECPW3  ;FIRST, OUTPUT THE WORD,
5297 DECPG0: MOVSI A,DECSYM
5298         PUSHJ P,DECBLK  ;THEN STRT A SYMBOLS BLOCK.
5299         MOVE C,GLSP2
5300         SAVE SYM
5301 DECPG1: CAMN C,GLSP1    ;ALL DONE =>
5302          JRST DECPG2    ;GO START AN ORDINARY BLOCK FOR NEXT WD.
5303         MOVE A,BITP
5304         TLNN A,77^4     ;BLOCK FULL => START ANOTHER.
5305          JRST DECPG0
5306         AOS C,GLSP2     ;GET ADDR OF NEXT GLOBAL REF.
5307         MOVE B,(C)
5308         MOVE B,(B)      ;GET NAME OF SYM.
5309         TLZ B,740000
5310         CAMN B,[SQUOZE 0,$R.]
5311          JRST DECPG3    ;(DEC'S LOADER HAS NO SUCH HACK.)
5312         CALL ASQOZR     ;RIGHT-JUSTIFY THE SQUOZE FOR DEC SYSTEM.
5313         MOVE A,B
5314         TLO A,600000    ;PUT IN FLAGS SAYING ADDITIVE GLOBAL RQ.
5315         PUSHJ P,DECWRD  ;OUTPUT NAME.
5316         HRRZ A,CLOC     ;GET ADDR OF RQ,
5317         TLO A,400000    ;MACRO-10 SETS THIS BIT SO I WILL.
5318         MOVE B,(C)
5319         TLNE B,SWAPF    ;SWAPPED => TELL LOADER..
5320          TLO A,200000
5321         TLNE B,ACF+MINF
5322          ETSM ERRILG    ;CAN'T NEGATE GLOBAL OR PUT IN AC.
5323         MOVE TM,CRLOC
5324         PUSHJ P,DECWR1  ;OUTPUT 2ND WD,
5325         JRST DECPG1     ;GO BACK FOR MORE GLOBAL REFS.
5326
5327 DECPG2: REST SYM
5328         JRST DECEB1
5329
5330 DECPG3: ETR ERRIRL      ;WE NEEDED $R. BUT DIDN'T HAVE IT.
5331         JRST DECPG1
5332
5333 ERRILG: ASCIZ /Illegal use of external/
5334 ERRIRL: ASCIZ /Illegal use of relocatables/
5335
5336
5337 ;OUTPUT PROGRAM NAME BLOCK (AT START OF PASS 2)
5338 ;IF 2-SEG PROGRAM, ALSO OUTPUT A TYPE-3 BLOCK (LOAD INTO HISEG)
5339 DECPGN: JUMPGE FF,CPOPJ ;ONLY ON PASS 2.
5340         SAVE [EBLK]
5341         MOVSI A,DECNAM
5342         CALL DECBLK
5343         MOVE B,PRGNM
5344         CALL ASQOZR
5345         MOVE A,B
5346         CALL DECWRD
5347         MOVSI A,14      ;IDENTIFY THIS REL FILE AS MADE BY MIDAS.
5348         CALL DECWRD
5349         MOVE A,DECTWO
5350         CAMN A,[MOVE]
5351          RET            ;NOT A 2-SEG PROGRAM.
5352 DECP2S: MOVSI A,DECHSG
5353         CALL DECBLK     ;START A LOAD-INTO-HISEG BLOCK.
5354         MOVE A,DECTWO
5355         HRL A,DECBRH    ;HISEG BRK,,TWOSEG ORIGIN.
5356         SKIPL A
5357          HRLI A,(A)
5358         MOVEI TM,1      ;RELOCATION IS 1.
5359         JRST DECWR1
5360 \f
5361 IFN FASLP,[
5362 ;INITIALIZE OUTPUT FOR FASL ASSEMBLY
5363 FASOIN: JUMPGE FF,CPOPJ ;ONLY ON PASS 2
5364         MOVE A,[SIXBIT /*FASL*/]
5365         PUSHJ P,PPB
5366         MOVE A,[MIDVRS]
5367         LSH A,-6
5368         TLO A,(SIXBIT /M/)
5369         PUSHJ P,PPB     ;"LISP" VERSION NUMBER (USE M AND MIDAS NUMBER)
5370         MOVE A,[440400,,FASB]   ;INITIALIZE FASL OUTPUT BUFFER
5371         MOVEM A,FASCBP
5372         MOVEI A,FASB+1
5373         MOVEM A,FASBP
5374         POPJ P,
5375
5376
5377 ;COME HERE TO OUTPUT A WORD IN FASL FORMAT
5378 FASPW:  MOVE C,FASPCH
5379         CAME C,FASATP
5380         PUSHJ P,FPATB   ;"PUNCH" OUT ATOM TBL (IF MORE HAS APPEARED)
5381         PUSHJ P,$RSET   ;GET RELOC
5382         PUSH P,C        ;SAVE LH RELOC
5383         MOVEM B,FASPWB  ;B HAS RELOC, WHICH IS ALSO FASL CODE FOR RELOC =1
5384         MOVE A,GLSP2
5385 FASPW3: CAME A,GLSP1
5386         JRST FASPW1     ;LOOK TO SEE ..
5387 FASPW2: MOVE A,WRD      ;B HAS RELOC, WHICH ALSO HAPPENS TO BE FASL CODE TYPE
5388         MOVE B,FASPWB
5389         PUSHJ P,FASO    ;OUTPUT WORD IN A WITH FASL CODE IN B
5390         POP P,TM
5391         JUMPE TM,FASPW5 ;NO LEFT HALF RELOC, OK
5392         MOVNI A,1       ;ACTIVATE FASL HACK FOR LH RELOC
5393         MOVEI B,7       ;WOULD OTHERWISE BE GETDDTSYM
5394         PUSHJ P,FASO
5395 FASPW5: MOVE C,GLSP2
5396 FASPW6: CAMN C,GLSP1
5397         POPJ P,
5398         HRRZ TM,1(C)
5399         JUMPE TM,[AOJA C,FASPW6]
5400         MOVE SYM,(TM)   ;GET SQUOZE OF SYM
5401         TLZ SYM,740000  ;CLEAR CODE BITS
5402         HLRZ D,1(C)
5403         TRZ D,400000    ;DONT WORRY ABOUT THAT BIT
5404         TRZE D,MINF
5405         TLO SYM,400000  ;NEGATE
5406         CAIN D,SWAPF
5407         JRST FSPWSW
5408         CAIN D,HFWDF
5409         JRST FSPWRH
5410         CAIN D,ACF+SWAPF
5411         JRST FSPWAC
5412         JUMPE D,FSPWWD
5413         ETSM [ASCIZ /Global in illegal FASL context/]
5414
5415 FSPWWD: TLOA SYM,140000
5416 FSPWAC: TLOA SYM,100000
5417 FSPWRH: TLO SYM,40000
5418 FSPWSW: MOVE A,SYM
5419         MOVEI B,7       ;DDT SYM
5420         PUSHJ P,FASO
5421         AOJA C,FASPW6
5422
5423 FASPW1: HRRZ TM,1(A)    ;GLOTB ENTRY
5424         JUMPE TM,FASPW4
5425         CAIL TM,AFDMY1
5426         CAIL TM,AFDMY2
5427 FASPW4: AOJA A,FASPW3
5428         MOVE C,1(A)     ;ITS A LIST STRUCTURE REF
5429         TLNN C,-1-HFWDF
5430         SKIPE FASPWB
5431         ETA [ASCIZ /Illegal LISP structure reference/]
5432         MOVE TM,AFDMY2-AFDMY1(TM)       ;GET FASL BITS
5433         MOVEM TM,FASPWB         ;FASL BITS
5434         CLEARM 1(A)             ;FLUSH THAT GUY
5435         AOJA A,FASPW3
5436
5437 FPATB:  CAMN C,FASATP   ;PUNCH OUT ATOM TBL, AMT ALREADY PUNCHED IN C
5438         POPJ P,         ;THRU
5439         MOVEI B,12      ;ATOM TBL INFO
5440         MOVE A,FASAT(C)
5441         TRNN A,-1
5442         AOJA C,FPATB3   ;LIST WORD .. SHOULD HAVE PUNCHED ITSELF
5443         PUSHJ P,FASO
5444         HRRZ D,FASAT(C) ;ATOM "LENGTH"
5445         AOS C
5446 FPATB1: SOJL D,FPATB2
5447         MOVE A,FASAT(C)
5448         PUSHJ P,FASO1
5449         AOJA C,FPATB1
5450
5451 FPATB3: ETR [ASCIZ /Internal loss at FPATB3/]
5452 FPATB2: MOVEM C,FASPCH  ;RECORD AMOUNT PUNCHED
5453         JRST FPATB      ;LOOP BACK IF MORE
5454
5455
5456 FASO:   PUSHJ P,FASBO   ;WRITE BITS
5457 FASO1:  MOVEM A,@FASBP  ;STORE A IN FASL OUTPUT BUFFER
5458         AOS TM,FASBP
5459         CAIL TM,FASB+FASBL
5460          ETF [ASCIZ /.FASL output block too long/]
5461         POPJ P,
5462
5463 FASBO:  MOVE TM,FASCBP  ;OUTPUT FASL CODEBITS IN B, WRITE PREV BLOCK IF NECC
5464         TLNN TM,770000
5465         PUSHJ P,FASBE   ;WRITE PREV FASL BLOCK
5466         IDPB B,FASCBP
5467         POPJ P,
5468
5469 FASBE:  PUSH P,A
5470         PUSH P,B
5471         MOVEI TT,FASB
5472 FASBO2: CAML TT,FASBP
5473         JRST FASBO3
5474         MOVE A,(TT)
5475         PUSHJ P,PPB
5476         AOJA TT,FASBO2
5477
5478 FASBO3: POP P,B
5479         POP P,A
5480         CLEARM FASB     ;NEW CODE WORD
5481         MOVEI TM,FASB+1
5482         MOVEM TM,FASBP
5483         SOS FASCBP
5484         POPJ P,
5485         
5486 \f
5487 AFATOM: PUSH P,B        ;SAVE CODEBITS
5488         SKIPGE B,CONTRL
5489         TRNN B,FASL
5490         ETI [ASCIZ /.ATOM illegal except in FASL assembly/]
5491         PUSHJ P,AFRATM  ;READ "ATOM", RETURN INDEX IN A
5492         POP P,B
5493         HLRZS B
5494 AFLST1: AOS GLSP1
5495         MOVEI T,AFDMY1(B)       ;DUMMY (STORE THIS INFO IN SYM SO CONSTANTS WILL WIN
5496         HRRZM T,@GLSP1
5497         MOVEI B,0       ;NO RELOCATION
5498         POPJ P,
5499
5500 ;GLOBALS IN THIS TABLE KEEP TRACK OF LIST REFS
5501 ;UNDEF GLOBAL GODEBITS
5502 AFDMY1: SQUOZE 44,.%VCEL        ;EVENTUALLY POINT TO VALUE CELL
5503         SQUOZE 44,.%SCAL        ;EVENTUALLY BECOME "SMASHABLE CALL"
5504         SQUOZE 44,.%ATM         ;EVENTUALLY POINT TO ATOM
5505         SQUOZE 44,.%ARY         ;EVENTUALLY POINT TO ARRAY
5506 AFDMY2: 2                       ;CODE BITS FOR VALUE CELL REF
5507         3                       ;CODE BITS FOR SMASHABLE CALL
5508         4                       ;CODE BITS FOR POINTER TO ATOM
5509         10                      ;CODE BITS FOR POINTER TO ARRAY
5510
5511 AFRATM: PUSHJ P,AFRTKN          ;READ TOKEN, LEAVING IT AT END OF FASAT
5512         PUSHJ P,AFRITN          ;"INTERN" IT, SKIP IF NOT FOUND
5513         POPJ P,                 ;IF FOUND, INDEX IN A
5514         PUSHJ P,AFRENT          ;ENTER IN FASAT
5515         POPJ P,
5516
5517 AFRENT: MOVE A,FASAT1           ;STORE FASAT1 IN FASATP
5518         MOVEM A,FASATP
5519         AOS A,FASIDX            ;RETURN LOAD TIME ATOM INDEX
5520         POPJ P,
5521
5522 AFRTKN: MOVE A,FASATP
5523         ADD A,[700,,FASAT]
5524         MOVEM A,FASAT2          ;BYTE PNTR TO USE TO STORE ATOM
5525         CLEARM (A)
5526         CLEARM 1(A)             ;MAKE SURE ALL LOW BITS CLEARED
5527         PUSHJ P,RCH
5528         CAIN A,"#
5529         JRST AFRTK1             ;READ NUMBER INTO FIXNUM SPACE
5530         CAIN A,"&
5531         JRST AFRTK2             ;READ NUMBER INTO FLONUM SPACE
5532 AFRTKL: IDPB A,FASAT2           ;STORE CHAR
5533         HRRZ A,FASAT2
5534         CAIL A,FASAT+FASATL-1
5535 AFTERR: ETA [ASCIZ /LISP atom name table full/]
5536         CLEARM 1(A)
5537 AFRTL2: PUSHJ P,RCH
5538         CAIN A,12
5539         JRST AFRTL2             ;IGNORE LF IN ATOM NAMES (PRIMARILY SO /CR WINS WITH ONE
5540         CAIN A,"/               ;SLASH
5541         JRST AFRQT              ;QUOTE CHAR
5542         CAIE A,40
5543         CAIN A,15
5544         JRST AFREND
5545         CAIE A,";
5546         CAIN A,11
5547         JRST AFREND
5548         CAIE A,"(
5549         CAIN A,")
5550         JRST AFREN2
5551         JRST AFRTKL             ;THAT CHAR WINS, SALT IT
5552
5553 AFRQT:  PUSHJ P,RCH             ;TAKE NEXT CHR NO MATTER WHAT
5554         JRST AFRTKL
5555
5556 AFRTK1: SKIPA TM,[100000,,1]    ;PUT VAL IN FIXNUM SPACE
5557 AFRTK2: MOVE TM,[200000,,1]     ;PUT IT IN FLONUM SPACE
5558         PUSH P,TM
5559         MOVE SYM,[SQUOZE 0,ATOM]
5560         PUSHJ P,FAGTFD
5561         POP P,TM
5562         MOVE B,FASATP
5563         ADDI B,2
5564         CAIL B,FASAT+FASATL
5565         XCT AFTERR
5566         MOVEM TM,FASAT-2(B)
5567         MOVEM A,FASAT-1(B)
5568         MOVEM B,FASAT1
5569         POPJ P,                 
5570
5571 AFREN2: TLO FF,FLUNRD           ;SAVE ( OR ) AS WELL AS FLUSHING
5572 AFREND: MOVEI B,5               ;PAD END OF P.N. WITH 0 S
5573         MOVEI TM,0
5574 AFREN1: IDPB TM,FASAT2
5575         HRRZ A,FASAT2
5576         CAIL A,FASAT+FASATL-1
5577         XCT AFTERR
5578         CLEARM 1(A)
5579         SOJG B,AFREN1
5580         SUBI A,FASAT
5581         MOVEM A,FASAT1          ;STORE PNTR TO WORD BEYOND ATOM
5582                                 ; MAYBE PUT THIS IN FASATP
5583         MOVE B,FASATP           ;ADR OF START OF ATOM READ
5584         SUBI A,1(B)             ;COMPUTE LENGTH OF FASAT
5585         HRRZM A,FASAT(B)        ;PN ATOM 4.8-4.7 =0 STORE LENGTH IN HEADER WD
5586         
5587         POPJ P, 
5588
5589 AFRITN: MOVEI B,0               ;"INTERN" LAST ATOM READ IN
5590         MOVEI A,1               ;A CONTAINS RUNTIME ATOM TBL INDEX
5591                                 ;B INDEX WITHIN FASAT
5592 AFRIT1: CAML B,FASATP
5593         JRST POPJ1              ;NOT FOUND
5594         MOVE C,FASATP           ;POINTS AT HEADER OF WORD OF NEW (?) ATOM
5595         HRRZ D,FASAT(B)         ;HEADER WD OF GUY IN TBL(RIGHT HALF HAS LENGTH)
5596         JUMPE D,AFRIT4          ;JUMP ON RESERVED FOR LIST
5597 AFRIT2: MOVE TM,FASAT(C)
5598         CAME TM,FASAT(B)
5599         AOJA B,AFRIT3           ;THIS ONE LOSES
5600         SOJL D,CPOPJ                    ;THIS ONE WINS!
5601         AOS B
5602         AOJA C,AFRIT2
5603
5604 AFRIT3: SOJL D,[AOJA A,AFRIT1]          ;FINISH SPACING OVER THIS GUY
5605 AFRIT4: AOJA B,AFRIT3
5606
5607 AFENTY: SKIPGE B,CONTRL
5608         TRNN B,FASL
5609          ETI [ASCIZ /.ENTRY in NON-FASL/]
5610         SKIPN CRLOC
5611          ETI [ASCIZ /.ENTRY when . is absolute/]
5612         PUSHJ P,AFRATM          ;READ FUNCTION NAME
5613         HRLZS A
5614         PUSH P,A
5615         PUSHJ P,AFRATM          ;READ TYPE (SUBR, LSUBR, ETC)
5616         HRRM A,(P)
5617         MOVE SYM,[SQUOZE 0,.ENTRY]
5618         PUSHJ P,FAGTFD          ;READ ARGS PROP
5619         JUMPGE FF,ASSEM1        ;NOT PUNCHING PASS
5620         PUSH P,A        
5621         MOVE C,FASPCH
5622         CAME C,FASATP
5623         PUSHJ P,FPATB           ;MAKE SURE ANY NEW ATOMS OUT
5624         POP P,C
5625         POP P,A
5626         MOVEI B,13
5627         PUSHJ P,FASO
5628         HRL A,C
5629         HRR A,CLOC
5630         PUSHJ P,FASO1
5631         JRST ASSEM1
5632
5633 AFLIST: HLRZM B,AFLTYP
5634         SKIPGE B,CONTRL
5635         TRNN B,FASL
5636         ETI [ASCIZ /.LIST illegal except in FASL assembly/]
5637         PUSHJ P,AFRLST  ;READ LIST, RTN ATM TBL INDEX IN A
5638         SKIPN AFLTYP
5639         JRST ASSEM1     ;JUST EVAL IN LISP AND THROW AWAY VALUE
5640         MOVEI B,AFDMAI  ;"ATOM" INDEX IN AFDMY1 TBL
5641         JRST AFLST1     ;TREAT AS ATOM
5642
5643 AFRLST: CLEARM AFRLD    ;"DEPTH"
5644         CLEARM AFRLEN   ;"LENGTH" OF LIST AT CURRENT LEVEL
5645         CLEARM AFRDTF   ;DOT CONTEXT FLAG
5646         JUMPGE FF,AFRLI1
5647         MOVE C,FASPCH
5648         CAME C,FASATP
5649         PUSHJ P,FPATB   ;MAKE SURE ALL ATOMS "PUNCHED"
5650         MOVE A,FASATP
5651         MOVEM A,AFRFTP  ;SAVED STATE OF FASAT POINTER
5652         MOVE C,AFLTYP
5653         MOVEI B,16      ;EVAL TYPE HACK
5654         CAIN C,1
5655         MOVEI B,5       ;LIST TYPE HACK
5656         PUSHJ P,FASBO   ;WRITE CODE BITS
5657 AFRLI1:
5658 AFRL1:  PUSHJ P,RCH
5659         CAIE A,40       ;PREV ATOM (OR WHATEVER) "DELIMITED", SO THESE MEANINGLESS
5660         CAIN A,15       ;UNLESS AT TOP LEVEL AND HAVE READ SOMETHING
5661         JRST AFRL1A
5662         CAIE A,11
5663         CAIN A,12
5664         JRST AFRL1A
5665         CAIN A,"(
5666         JRST AFRLO
5667         CAIN A,")
5668         JRST AFRLC
5669         CAIN A,".
5670         JRST AFRDT      ;DOT..
5671         TLO FF,FLUNRD
5672         SKIPE AFRLD
5673         JRST AFRNXT     ;READ NEXT GUY THIS LVL
5674         SKIPE AFRLEN
5675 AFRLO2: ETI [ASCIZ /LISP read context error/]
5676 AFRNXT: SKIPN TM,AFRDTF
5677         JRST AFRNX2     ;NOT HACKING DOTS, OK
5678         AOS TM,AFRDTF
5679         CAIE TM,2
5680         JRST AFRLO2     ;DIDNT JUST SEE THE DOT
5681 AFRNX2: PUSHJ P,AFRATM
5682         JUMPGE FF,AFRNX1        ;XFER ON NOT PUNCHING PASS
5683         PUSHJ P,FASO1   ;TELL LOADER TO PUSH THIS ON ITS STACK
5684 AFRNX1: AOS AFRLEN      ;LIST NOW ONE LONGER THIS LVL
5685         JRST AFRL1
5686
5687 AFRLO:  SKIPN TM,AFRDTF
5688         JRST AFRLO3     ;NOT HACKING DOTS
5689         SOJN TM,AFRLO2
5690         CLEARM AFRDTF
5691         JRST AFRL1      ;IGNORE BOTH . AND (    
5692 AFRLO3: SKIPE AFRLD     ;(
5693         JRST AFRLO1
5694         SKIPE AFRLEN
5695         JRST AFRLO2
5696 AFRLO1: PUSH P,AFRLEN
5697         CLEARM AFRLEN   ;START NEW LVL
5698         AOS AFRLD       ;DEPTH NOW ONE GREATER
5699         JRST AFRL1
5700
5701 AFRLC:  SOSGE AFRLD     ;)
5702         JRST AFRLO2     ;AT TOP LEVEL, BARF
5703         MOVE A,AFRLEN
5704         SKIPN TM,AFRDTF
5705         JRST AFRLC2     ;NOT HACKING DOTS
5706         CAIE TM,2
5707         JRST AFRLO2
5708         SOS A           ;MAIN LIST NOW ONE SHORTER
5709         TLOA A,200000   ;DOT WITH LAST THING ON STACK
5710 AFRLC2: TLO A,100000    ;TELL LOADER TO MAKE LIST THIS LONG
5711         JUMPGE FF,AFRLC5
5712         PUSHJ P,FASO1
5713 AFRLC5: POP P,AFRLEN    ;LENGTH AT PREV LVL
5714         AOS AFRLEN      ;NOW ONE MORE
5715         CLEARM AFRDTF   ;NOT HACKING DOTS NOW
5716         SKIPE AFRLD     ;RETURNING TO TOP LEVEL?
5717         JRST AFRL1
5718         JRST AFRX1      ;YES THRU
5719
5720 AFRDT:  SKIPN AFRDTF
5721         SKIPN AFRLEN
5722         JRST AFRLO2     ;DOT IN FIRST POSITION OF LIST
5723         AOS AFRDTF      ;ENTER STATE 1 OF DOT HACKING
5724         JRST AFRL1
5725
5726 AFRL1A: SKIPN AFRLD     ;SPACER CHAR TERMINATES AT TOP LVL IF HAVE RD SOMETHING
5727         SKIPN AFRLEN
5728         JRST AFRL1
5729 AFRX1:  JUMPGE FF,AFRX2 ;NOT PUNCHING PASS
5730         MOVE A,AFRFTP
5731         CAME A,FASATP
5732         ETR [ASCIZ /Saw atoms in list on pass 2 for first time/]
5733         SKIPN B,AFLTYP  ;TYP LIST OP
5734         SKIPA A,[-1,,]
5735         MOVSI A,-2      ;PUT LIST OR VALUE OF LIST IN ATOM TBL
5736         PUSHJ P,FASO1   ;TERM OP AND PUT IT IN ATOM TBL
5737         MOVEI A,0
5738         MOVE B,AFLTYP
5739         JUMPE B,CPOPJ   ;JUST WANT VALUE OF LIST
5740         CAIN B,1        ;ONLY WANT THIS FOR STRAIGHT LIST
5741         PUSHJ P,FASO1   ;OUTPUT "SXHASH" WORD
5742         AOS A,FASATP
5743         CLEARM FASAT-1(A)       ;RESERVE SLOT IN FASAT TBL
5744         MOVEM A,FASPCH          ;SAY ALREADY PUNCHED OUT
5745         AOS A,FASIDX
5746         POPJ P,         
5747
5748 AFRX2:  TLO I,ILNOPT    ;DONT TRY TO OPTIMIZE IF IN CONSTANT
5749         CLEARB A,B
5750         POPJ P,
5751 ]
5752 \f               ;.LIBRA, .LIFS, ETC.
5753
5754 A.LIB:  NOVAL ? NOABS
5755         HLRZM B,LIBTYP' ;STORE BLOCK TYPE TO OUTPUT
5756         CLEARM LIBOP    ;INITIALIZE SQUOZE FLAGS
5757         PUSHJ P,EBLK    ;END CURRENT OUTPUT BLOCK, MAKING SURE LOADER KNOWS $.
5758 LIB1:   PUSHJ P,GETSYL  ;GET NAME
5759         TRNN I,IRSYL
5760         JRST LIB2       ;NO SYL, DON'T OUTPUT
5761         IOR SYM,LIBOP
5762         TLO SYM,40000
5763         PUSHJ P,OUTSM
5764         MOVSI A,400000
5765         ANDCAM A,LIBOP
5766 LIB2:   MOVE B,CDISP    ;GET CDISP
5767         TLNN B,DWRD\DFLD        ;CHECK FOR WORD TERMINATOR
5768         JRST LIB3       ;WORD TERMINATOR => DONE
5769         MOVE A,LIBOP
5770         MOVE B,LIMBO1   ;RETRIEVE LAST CHAR READ
5771         CAIN B,",
5772         MOVSI A,400000
5773         CAIN B,"+
5774         TLZ A,200000
5775         CAIN B,"-
5776         TLO A,200000
5777         MOVEM A,LIBOP'  ;STORE SQUOZE FLAGS (LESS GLBL BIT) FOR NEXT SYM
5778         JRST LIB1
5779
5780 LIB3:   MOVE A,LIBTYP   ;GET BLOCK TYPE TO OUTPUT
5781         DPB A,[310700,,BKBUF]
5782         PUSHJ P,EBLK
5783         CAIN A,LLIB     ;.LIBRA?
5784         JRST ARELC1     ;.LIBRA, NOW PLAY LIKE RELOCA PSEUDO
5785         JRST LIB5       ;SOMETHING ELSE (.LIFS), INCREMENT DEPTH IN LOAD TIME CONDITIONALS
5786
5787 A.ELDC: NOVAL ? NOABS
5788         PUSHJ P,EBLK
5789         MOVEI A,ELTCB
5790         DPB A,[310700,,BKBUF]
5791         TRO FF,FRLOC    ;MAKE EBLK OUTPUT NULL BLOCK
5792         PUSHJ P,EBLK
5793         SOSGE LDCCC
5794         CLEARM LDCCC    ;LOADER CONDITIONAL UNDERFLOW
5795         JRST ASSEM1
5796
5797                 ;LOADER CONDITIONAL ON VALUE
5798
5799 A.LDCV: NOVAL ? NOABS
5800         LSH B,-27.
5801         PUSH P,B
5802         PUSHJ P,AGETWD
5803         POP P,B
5804         DPB B,[400300,,BKBUF]
5805         MOVEI A,LDCV
5806         PUSHJ P,PLDCM
5807         MOVEI A,0
5808         DPB A,[400300,,BKBUF]
5809 LIB5:   AOS LDCCC
5810 CCASM1: JRST ASSEM1
5811 \f
5812 ;.GLOBAL, .SCALAR, .VECTOR
5813 ;LH(B) HAS ILGLI, ILVAR, ILVAR+ILFLO RESPECTIVELY.
5814
5815 A.GLOB: NOVAL
5816         HLLZ LINK,B     ;REMEMBER WHICH OF THE THREE PSEUDO'S THIS IS.
5817 A.GLO2: MOVE A,GLSPAS
5818         MOVEM A,GLSP1
5819         SETOM FLDCNT
5820         PUSHJ P,GETSLD  ;GET NAME
5821          JRST MACCR     ;NO NAME => DONE
5822         CALL ES
5823          JRST A.GLO1
5824         CAIE A,PSUDO_-14.
5825          JRST A.GLO1
5826         JSP B,GVPSEU    ;TRYING TO .GLOBAL A PSEUDO => TYPE APPRO. ERR MSG AND RETURN.
5827         JRST A.GLO2     ;DON'T DO ANYTHING TO IT; MOVE ON TO NEXT ARG.
5828
5829 A.GLO1: IOR I,LINK      ;SET THE GLOBAL FLAG OR THE VARIABLE FLAG.
5830         TLNE LINK,ILFLO ;FOR .VECTOR, SAVE # VARS CREATED BEFORE CREATING THIS ONE.
5831          SAVE VARCNT    ;SO WE CAN TELL IF THIS CALL TO GETVAL ACTUALY CREATES IT.
5832         PUSHJ P,GETVAL  ;NOW GET VALUE (CLOBBERS SQUOZE FLAGS)
5833          CAIA
5834           HALT
5835         TLNN LINK,ILFLO
5836          JRST A.GLO2
5837         SAVE LINK       ;.VECTOR - READ THE SIZE.
5838         TLO FF,FLUNRD   ;RE-READ THE TERMINATOR AFTER THE SYM, SO "FOO(1)" AND "FOO," WIN
5839         MOVE SYM,[SQUOZE 0,.VECTOR]
5840         CALL AGETFD
5841         REST LINK
5842         REST B          ;GET PREV. VARCNT, SO WE CAN SEE IF IT WAS INCREMENTED.
5843         TRNN A,-1       ;MAKE (N) WORK AS SIZE BY USIN L.H. IF R.H. IS 0.
5844          HLRZS A
5845         SKIPE A
5846          MOVEM A,VECSIZ ;IF NONZERO SIZE SPEC'D, USE IT AND SET DEFAULT.
5847         MOVE A,VECSIZ   ;ELSE USE THE DEFAULT.
5848         SUBI A,1        ;1 WORD WAS ALLOCATED BY GETVAL - HOW MANY MORE WANTED?
5849         CAME B,VARCNT   ;(MAYBE SYM ALREADY DEFINED, MAYBE PASS2, ...)
5850          ADDM A,VARCNT  ;IF GETVAL REALLY ALLOCATED THE SPACE THIS TIME, ALLOCATE THE
5851         JRST A.GLO2     ;RIGHT AMOUNT.
5852
5853                 ;.LOP
5854
5855 A.LOP:  NOVAL ? NOABS
5856         PUSHJ P,EBLK    ;TERMINATE CURRENT BLOCK
5857         REPEAT 3,PUSHJ P,RGETFD ;GET THE FIELDS
5858         MOVEI A,LD.OP
5859         PUSHJ P,PLDCN
5860         JRST ASSEM1
5861
5862                 ;.LIBRQ
5863
5864 A.LIBRQ:        NOVAL ? NOABS
5865 A.LBR1: PUSHJ P,GETSLD
5866          JRST MACCR
5867         PUSHJ P,PBITS7
5868         MOVEI A,3
5869         PUSHJ P,PBITS
5870         TLO SYM,40000
5871         PUSHJ P,OUTSM
5872         JRST A.LBR1
5873 \f
5874 A.LNKOT:        AOS (P) ;THIS PSEUDO RETURNS NO VALUE.
5875         NOVAL
5876
5877 AEND5:  JUMPGE FF,CPOPJ ;IGNORE FOLLOWING ON NOT PUNCHING PASS
5878         MOVE D,SYMAOB
5879 AEND5A: MOVE SYM,ST(D)
5880         LDB T,[400400,,SYM]
5881         CAIE T,DEFLVR_-14.
5882         CAIN T,DEFGVR_-14.
5883         JRST AEND5E
5884         CAIE T,LCUDF_-14.
5885         CAIN T,GLOEXT_-14.
5886         JRST AEND5B
5887 AEND5C: ADD D,WPSTE1
5888         AOBJN D,AEND5A
5889         POPJ P,
5890
5891 AEND5E: 3GET C,D
5892         TLNN C,3LLV
5893         JRST AEND5C
5894 AEND5B: HLLZ B,ST+1(D)
5895         3GET C,D
5896         TLNN C,3RLNK
5897         JUMPE B,AEND5C
5898         TLZ SYM,740000
5899         CAIE T,LCUDF_-14.
5900         CAIN T,DEFLVR_-14.
5901         SKIPA
5902         TLO SYM,40000
5903         PUSHJ P,LKPNRO
5904         HRRZS ST+1(D)   ;CLEAR OUT LIST HEAD POINTER.
5905         TLZ C,3RLNK     ;INDICATE NO LIST.
5906         3PUT C,D
5907         JRST AEND5C
5908
5909                 ;PUNCH OUT COMPLETE LOADER COMMAND, PUNCHING OUT WRD AS ONLY CONTENTS
5910
5911 PLDCM:  PUSH P,LINK     ;SAVE LINK FOR ALOC AND FRIENDS (CLOBBERS OTHER AC'S)
5912         PUSH P,A        ;SAVE LOADER COMMAND TYPE
5913         PUSHJ P,EBLK    ;TERMINATE PREV BLOCK, MAKING SURE LOADER KNOWS $.
5914         PUSHJ P,PWRDA   ;PUNCH OUT THE WORD
5915         POP P,A         ;GET BACK LOADER COMMAND TYPE FOR PLDCN
5916         PUSHJ P,PLDCN   ;OUTPUT THE RESULTING BLOCK
5917 PLINKJ: POP P,LINK      ;RESTORE LINK
5918         POPJ P,
5919
5920 PLDCN:  HRRM A,BKBUF    ;STORE LOADER COMMAND TYPE IN BKBUF HEADER
5921         MOVEI A,LLDCM   ;LOADER COMMAND BLOCK TYPE
5922         DPB A,[310700,,BKBUF]   ;STORE BLOCK TYPE IN HEADER
5923         TRO FF,FRLOC    ;MAKE EBLK OUTPUT BLOCK EVEN IF EMPTY
5924         JRST EBLK
5925
5926 ;.RELP <ARG> RETURNS RELOCATION OF ARG
5927 A.RELP: CALL AGETFD
5928         MOVE A,B
5929         JRST VALRET
5930
5931 ;.ABSP <ARG> RETURNS ABSOLUTE PART OF ARG.
5932 A.ABSP: CALL AGETFD
5933         JRST VALRET
5934
5935 ;.RL1 IN RELOCATABLE ASSEMBLY RETURNS ZERO WITH RELOCATION FACTOR ONE.
5936 ;IN ABSOLUTE ASSEMBLY, IT RETURNS JUST ZERO.
5937 ;IFN <.RELP .RL1>, IS A TEST FOR A RELOCATABLE ASSEMBLY.
5938 A.RL1:  SKIPGE A,CONTRL
5939          TRNE A,DECREL\FASL
5940           SKIPA B,[1]
5941            SETZ B,
5942         SETZ A,
5943         RET
5944 \f
5945 AEND:   NOVAL
5946         SKIPE ASMOUT    ; ERROR IF IN GROUPING.
5947          JSP LINK,CONFLM        ;FLUSH CONSTANTS, GIVE ERROR MSG.
5948         SKIPE SCNDEP    ;IF THERE ARE UNTERMINATED SUCCESSFUL
5949          CALL AENDM1    ;CONDITIONALS, MENTION THEM.
5950         MOVE A,BKCUR
5951         CAIE A,BKWPB    ;NOT IN .MAIN BLOCK => ERROR.
5952          ETR ERRUMB
5953         MOVE A,CDISP
5954         TLNN A,DWRD
5955          TLO FF,FLUNRD  ;IF LAST TERM. WAS WORD TERM., RE-READ.
5956 IFN LISTSW,[
5957         MOVE A,[440700,,LISTBF]
5958         EXCH A,PNTBP
5959         MOVEM A,LISTTM
5960 ]
5961         PUSHJ P,AVARI0
5962         PUSHJ P,CNSTN0
5963         SKIPL A,CONTRL
5964          PUSHJ P,AEND5  ;RELOCATABLE => .LNKOT
5965         SKIPGE A,CONTRL
5966          TRNN A,DECREL
5967           JRST AEND6
5968         MOVE A,CLOC     ;IN DEC FMT, UPDATE HIGHEST ADDR SEEN,
5969         SKIPN CRLOC     ;UPDATE EITHER THE HIGHEST ABS ADDR
5970          JRST [ CAML A,DECBRA
5971                  MOVEM A,DECBRA
5972                 JRST AEND6]
5973         CAML A,DECTWO   ;OR THE HIGHEST REL ADDR IN THE
5974          JRST [ CAML A,DECBRH   ;APPROPRIATE SEG.
5975                  MOVEM A,DECBRH
5976                 JRST AEND6]
5977         CAML A,DECBRK
5978          MOVEM A,DECBRK
5979 AEND6:  JUMPL FF,AEND1  ;ON PUNCHING PASS, SPECIAL STUFF 
5980         PUSHJ P,GETWRD  ;OTHERWISE EAT UP WORD,
5981         JRST RETURN     ;AND RETURN
5982
5983 AEND1:  PUSHJ P,EBLK
5984 IFN LISTSW,[
5985         SKIPGE LISTPF
5986          PUSHJ P,PNTR
5987         MOVE A,LISTTM
5988         MOVEM A,PNTBP
5989 ]
5990         MOVE SYM,[SQUOZE 0,END]
5991         TLZ I,ILWORD
5992         PUSHJ P,AGETWD
5993 IFN LISTSW,[
5994         MOVEM A,LISTWD
5995         MOVEM B,LSTRLC
5996         SETOM LISTAD
5997         SETOM LISTPF
5998         SKIPE LSTONP
5999         PUSHJ P,PNTR
6000         SKIPE LISTP
6001          PUSHJ P,LPTCLS ;DONE LISTING
6002         MOVE A,LISTWD
6003 ] ;END IFN LISTSW,
6004         SKIPL B,CONTRL
6005          JRST AEND3     ;RELOCATABLE
6006 IFN FASLP,[
6007         TRNE B,FASL
6008          JRST FASEN     ;FASL FORM
6009 ]
6010         TRNN B,DECREL   ;IF DEC FORMAT,
6011          JRST AEND1A
6012         TLNN I,ILWORD   ;THEN IF THERE7S A STARTING ADDRESS,
6013          JRST AEND2
6014         MOVSI A,DECSTA  ;OUTPUT START-ADDRESS BLOCK.
6015         PUSHJ P,DECBLK
6016         PUSHJ P,PWRD
6017         PUSHJ P,EBLK
6018         JRST AEND2
6019
6020 IFN FASLP,[
6021 FASEN:  JRST AEND2
6022 ]
6023
6024 AEND3:  HRRZ A,CLOC
6025         HRRM A,BKBUF    ;SET UP PROGRAM BREAK JUST IN CASE OUTPUTTING MORE NULL DATA BLOCKS
6026         MOVEI A,LCJMP
6027         PUSHJ P,PLDCM
6028         JRST AEND2
6029
6030 AEND1A: TLNN A,777000   ;CHECK INSTRUCTION PART
6031          TLO A,(JRST)   ;INSTRUCTION PART 0; HE WANTS JRST
6032         PUSHJ P,PPB
6033         JUMPG A,.+3
6034          ETR [ASCIZ /Start instruction negative/]
6035         HRLI A,(JRST)   ;END SYMTAB WITH POSITIVE WORD
6036         MOVEM A,STARTA  ;SAVE FOR PUNCHOUT AT END OF SYMTAB
6037         PUSHJ P,FEED1
6038 AEND2:  PUSH P,[RETURN]
6039 CNARTP:
6040 IFN DECSW,[
6041         SAVE TTYFLG
6042         SKIPE CCLFLG    ;IN DEC VERSION, IF RUN BY CCL, DON'T PRINT
6043          AOS TTYFLG     ;THIS STUFF ON THE TTY - ONLY IN ERROR FILE AND LISTING.
6044         CALL CNTPD
6045         REST TTYFLG
6046         RET
6047
6048 CNTPD:
6049 ]
6050         MOVNI D,1
6051         MOVEI TT,PCNTB
6052 CNTP1:  CAML TT,PBCONL
6053          RET
6054         HRRZ B,1(TT)
6055         HLRZ A,1(TT)
6056         CAMN A,B
6057          JRST CNTP2
6058         AOSN D
6059          TYPR [ASCIZ /Constants area inclusive
6060 From    To
6061 /]
6062         LDB B,[.BP (CGBAL),2(TT)]
6063         SKIPE B
6064          TYPR [ASCIZ /Global+/]
6065         HRRZ B,1(TT)
6066         PUSHJ P,OCTPNT
6067         PUSHJ P,TABERR
6068         HLRZ B,1(TT)
6069         SOS B
6070         PUSHJ P,OCTPNT
6071         PUSHJ P,CRRERR
6072 CNTP2:  ADDI TT,3
6073         JRST CNTP1
6074
6075 AENDM1: TYPR [ASCIZ /Unterminated successful bracketed conditionals
6076 The first was at /]
6077         AOS A,CONDPN
6078         CALL DPNT
6079         MOVEI A,"-
6080         CALL TYOERR
6081         AOS A,CONDLN
6082         CALL D3PNT2
6083 IFN TS,[
6084         TYPR [ASCIZ/ of file /]
6085         MOVE B,CONDFI
6086         CALL SIXTYO
6087 ]
6088         JRST CRRERR
6089
6090 \f
6091 AXWORD: CALL XGETFD     ;READ 1ST FIELD,
6092         TLNE I,ILMWRD
6093          CALL IGTXT     ;SOAK UP REST OF TEXT PSEUDO.
6094         HRLM A,WRD
6095         HRLM B,WRDRLC
6096         MOVSI C,HFWDF
6097         MOVSI B,SWAPF
6098         PUSHJ P,LNKTC1
6099         PUSH P,GLSP1
6100         CALL XGETFD     ;NOW THE SECOND FIELD
6101         HRRM A,WRD
6102         HRRES B
6103         ADDM B,WRDRLC
6104         MOVSI C,HFWDF
6105         MOVEI B,0
6106         POP P,T
6107         PUSHJ P,LINKTC
6108         JRST CABPOP
6109         
6110 A.NTHWD:        CALL AGETFD     ;READ THE NUMBER OF THE WORD WE WANT.
6111         SOJL A,CABPOP           ;NEGATIVE OR 0 => RETURN 0.
6112         SOJL A,A.1STWD          ;1 => TURN INTO .1STWD.
6113                         ;ELSE SKIP APPRO. # OF WORDS, THEN DO .1STWD.
6114
6115 A.NTH1: SAVE A
6116         SAVE WRD
6117         CALL XGETFD
6118         TLZ FF,FLUNRD
6119         REST WRD
6120         REST A
6121         TLNN I,ILMWRD
6122          JRST CABPOP            ;IF STRING ENDS BEFORE DESIRED WORD, RETURN 0.
6123         SOJGE A,A.NTH1
6124
6125 A.1STWD:        CALL XGETFD     ;GET THE 1ST WD OF FOLLOWING TEXT PSEUDO,
6126         CALL IGTXT      ;THROW AWAY THE REST.
6127         MOVE T,A        ;RETURN THE VALUE
6128         JRST TEXT5      ;COMPLAINING IF FOLLOWED IMMEDIATELY BY SYLLABLE.
6129
6130 A.LENGTH:       CALL PASSPS
6131         PUSH P,[0]
6132         PUSH P,A
6133 A.LN1:  PUSHJ P,RCH
6134         AOS -1(P)
6135         CAME A,(P)
6136         JRST A.LN1
6137         SOS A,-1(P)
6138         SUB P,[2,,2]
6139         JRST VALRET     ;RETURN VALUE IN T
6140
6141 ARDIX:  NOVAL
6142         PUSHJ P,AGETFD          ;GET FIELD ARG
6143         MOVEM A,ARADIX
6144         JRST MACCR      ;RETURN WITHOUT CLOBBERING CURRENT VALUE
6145
6146 A.RADIX:        CALL AGETFD     ;READ THE TEMP. RADIX.
6147         SAVE ARADIX     ;LAMBDABIND RADIX TO THAT VALUE.
6148         MOVEM A,ARADIX
6149         CALL XGETFD     ;READ IN THE NEXT FIELD USING THAT RADIX.
6150         REST ARADIX
6151         JRST VALRET
6152 \f
6153 ;READ A BIT-MASK AS ARG, RETURN THE LH OF BP. FOR THAT BYTE.
6154 A.BP:   CALL YGETFD
6155         MOVEI C,SPACE
6156         SKIPE CDISP     ;IF ARG WAS ENDED BY A COMMA, TURN IT INTO A SPACE
6157          HRRM C,CDISP   ;SO THAT .BP FOO,BAR USES THE FLD SPACE FLD FORMAT.
6158         JUMPE A,VALR1
6159         SAVE A
6160         JFFO A,.+2
6161          MOVEI B,36.
6162         EXCH B,(P)      ;(P) HAS # LEADING ZEROS.
6163         MOVN A,B
6164         AND A,B         ;A HAS ONLY THE LOW BIT OF THE BYTE.
6165         JFFO A,.+2
6166          MOVNI B,1      ;B HAS 35.-<# TRAILING ZREROS.>
6167         MOVEI A,1(B)
6168         SUB A,(P)       ;A HAS SIZE OF BYTE
6169         LSH A,30        ;PUT IN S FIELD OF BP.
6170         SUB P,[1,,1]
6171         MOVNS B
6172         ADDI B,35.      ;B HAS # TRAILING ZEROS.
6173         DPB B,[360600,,A] ;PUT THAT IN P FIELD OF BP.
6174         JRST VALR1
6175
6176 ;READ IN BP, RETURN BIT MASK TO SPEC'D BYTE.
6177 ;THE ARG SHOULD BE JUST THE LH OF A BP, WHICH MAY BE IN EITHER HALF OF THE ARG.
6178 A.BM:   CALL GETBPT     ;READ IN A BYTE POINTER ARG, IN A, POINTING AT T.
6179         SETZ T,
6180         SETO C,
6181 A.DPB1: DPB C,A         ;PUT 1'S IN SPEC'D PART OF ACCUM T
6182         MOVE A,T
6183         JRST VALRET
6184
6185 ;READ IN A BYTE POINTER (REALLY JUST S AND P FIELDS) AND MAKE POINT AT AC T.
6186 ;RETURN IT IN AC A.
6187 GETBPT: CALL YGETFD
6188         TLNN A,-1       ;IF ARG ISN'T IN LH, USE RH.
6189         HRLI A,(A)
6190         TLZ A,77        ;MAKE BP. -> AC T
6191         HRRI A,T
6192         RET
6193
6194 ;RETURN # TRAILING ZEROS IN ARGUMENT.
6195 A.TZ:   CALL YGETFD
6196         MOVN B,A
6197         AND A,B         ;A HAS JUST LOW BIT OF ARG SET.
6198         JFFO A,.+2
6199          MOVNI B,1      ;# OF ZEROS BEFORE LOW BIT =
6200         MOVN A,B        ;35. - <# TRAILING ZEROS>
6201         ADDI A,35.
6202         JRST VALRET
6203
6204 ;RETURN # LEADING ZEROS IN ARG.
6205 A.LZ:   CALL YGETFD
6206         JFFO A,.+2
6207          MOVEI B,36.
6208         MOVE A,B
6209         JRST VALRET
6210
6211 ;.DPB STUFF,BP,WORD DOES A DPB OF STUFF INTO THE FIELD OF WORD SPEC'D BY BP,
6212 ;RETURNING THE RESULTING WORD.
6213 A.DPB:  CALL YGETFD     ;READ STUFF.
6214         SAVE A
6215         CALL GETBPT     ;READ BP AND TURN INTO ACTUAL BP POINTING AT T
6216         SAVE A
6217         CALL YGETFD     ;READ IN WORD AND PUT IN T.
6218         MOVE T,A
6219         REST A          ;A HAS BP
6220         REST C          ;C HAS STUFF
6221         JRST A.DPB1     ;GO DO THE DEPOSIT AND RETURN THE ALTERED WORD.
6222
6223 ;.LDB BP,WORD RETURNS THE CONTENTS OF THE BYTE IN WORD SELECTED BY BP
6224 A.LDB:  CALL GETBPT
6225         SAVE A
6226         CALL YGETFD
6227         MOVE T,A
6228         REST A
6229         LDB A,A
6230         JRST VALRET
6231 \f
6232 AWORD:  NOVAL
6233         PUSHJ P,EBLK
6234         PUSHJ P,GETWRD  ;ON UNDEFINED SYM, WYB UNDEFINED SYM IN "WORD"?
6235         PUSHJ P,PPB
6236         JRST ASSEM1
6237
6238 ;.BIND - MAKE SYMS BE DEFINED IN CURRENT (SPEC'D) BLOCK. LH(B) HAS 0.
6239 ;.KILL - FULLY KILL THE SYMS.LH(B) HAS 3KILL.
6240 ;.HKILL - HALFKILL THEM. LH(B) HAS 3SKILL.
6241 ;.XCREF - PREVENT CREFFING OF SYMS. LH(B) HAS 3NCRF.
6242 ;.DOWN - SET 3DOWN, MAKING SYM VISIBLE IN SUBBLOCKS IN 1 PASS ASSEMBLY.
6243 A.KILL: NOVAL
6244         HLLZ LINK,B     ;REMEMBER BIT TO SET.
6245 A.KIL1: CALL GETSLD     ;READ NEXT SYMBOL NAME.
6246          JRST MACCR     ;NO MORE, EXIT.
6247         SKIPE LINK      ;EXCEPT FOR .BIND, DO NOTHING ON PASS 1.
6248          JUMPGE FF,A.KIL1
6249         CALL ESDEF      ;DEFINE THE SYMBOL, D HAS STE IDX.
6250          JRST A.KIL2    ;SYMBOL NEVER SEEN.
6251         IORM LINK,ST+2(D)       ;SET THE BIT IN 3RDWRD..
6252         IOR C,LINK      ;(IF .XCREF, PREVENT CREFFING THIS TIME)
6253 IFN CREFSW,XCT CRFINU   ;CREF THE SYMBOL
6254         JRST A.KIL1
6255
6256 A.KIL2: MOVSI T,LCUDF   ;SYMBOL UNDEFINED, MAKE UNDEF LOCAL.
6257         IOR C,LINK      ;WITH THE DESIRED BIT SET.
6258         TLO C,3MACOK    ;SHOULDN'T BE ERROR IF IT BECOMES MACRO.
6259         CALL VSM2
6260 IFN CREFSW,XCT CRFINU
6261         JRST A.KIL1
6262
6263 ;EXPUNG SYM1,SYM2 ... ;UNDEFINE THOSE SYMS.
6264 AEXPUNG:        NOVAL
6265 AEXPU2: PUSHJ P,GETSLD  ;GET NAME
6266          JRST MACCR     ;NO MORE NAMES
6267         SAVE [AEXPU2]   ;AFTER THIS SYM, POPJ TO READ ANOTHER.
6268 ;EXPUNGE 1 SYMBOL, SQUOZE IN SYM.
6269 AEXPU1: PUSHJ P,ES
6270         JFCL            ;NOT FOUND, DON'T COMPLAIN, JUST CREF.
6271 IFN CREFSW,XCT CRFDEF
6272         HRLZI T,400000  ;EXPUNGED ZERO SYM
6273         SKIPE ST(D)
6274         MOVEM T,ST(D)
6275         SKIPL CONTRL    ;IF RELOCATABLE ANDLOCAL SYMBOL,
6276         CAIL A,DEFGVR_-33.
6277          RET
6278         PUSHJ P,MKROOM
6279         PUSHJ P,PBITS7  ;TELL STINK TO EXPUNGE SYM.
6280         MOVEI A,CLGLO
6281         PUSHJ P,PBITS
6282         TLO SYM,400000  ;SAY IS NEW TYPE RQ,
6283         PUSHJ P,OUTSM0
6284         MOVSI A,400000  ;NEW NAME NULL => DELETE.
6285         JRST $OUTPT
6286 \f
6287 ;EQUAL SYM1,SYM2        ;DEFINE SYM1 SAME AS SYM2.
6288 AEQUAL: NOVAL
6289         PUSHJ P,GETSLD
6290          ETR ERRTFA
6291         SAVE SYM        ;REMEMBER SYM NAME AND BLOCK TO DEF. IN.
6292         SAVE ESBK
6293         PUSHJ P,GETSLD
6294          ETR ERRTFA
6295 IFN CREFSW,XCT CRFINU   ;CREF SYM DEFINED AS.
6296         CALL ES         ;LOOK UP SYM TO EQUATE TO.
6297          JRST [ REST ESBK       ;NOT FOUND => EXPUNGE THE 1ST SYM.
6298                 REST SYM
6299                 JRST AEXPU1]
6300         REST ESBK
6301         REST SYM
6302 IFN CREFSW,XCT CRFDEF
6303         SAVE A
6304         SAVE B          ;SAVE INFO ON VALUE OF SYM TO EQUATE TO.
6305         SAVE C
6306         CALL ESDEF
6307          MOVEM SYM,ST(D)
6308         REST B          ;3RDWRD OF 2ND SYMBOL.
6309         REST ST+1(D)    ;(WHAT WAS PUSHED FROM B)
6310         REST A
6311         DPB A,[400400,,ST(D)]
6312         TLZ C,3DFCLR    ;SAVE OLD 3MAS, 3NCRF OF 1ST SYMBOL (AND ITS BLOCK #).
6313         AND B,[3DFCLR,,] ;SET REST OF 3RDWRD BITS FROM 2ND SYMBOL.
6314         IOR B,C
6315         3PUT B,D
6316         JRST MACCR
6317
6318 ERRTFA: ASCIZ /Too few args - EQUAL/
6319
6320 ;.SEE SYM1,SYM2,...     ;CREF THOSE SYMS.
6321 A.SEE:  CALL GETSLD     ;READ 1 SYMBOL.
6322          JRST MACCR     ;NONE TO BE READ.
6323 IFN CREFSW,[
6324         SKIPN CRFONP    ;IF CREFFING,
6325          JRST A.SEE
6326         CALL ES
6327          MOVEI A,SYMC_-33.
6328         XCT CRFINU      ;CREF THE SYMBOL.
6329 ]
6330         JRST A.SEE
6331 \f
6332                 ;UUO HANDLING ROUTINE
6333                 ;41 HAS JSR ERROR
6334
6335 VBLK
6336 IFE ITSSW,ERRTTL:       0       ; NUMBER OF ERRORS HIT
6337 ERRCCT: 0       ;NUM CHARS OUTPUT ON LINE, FOR MAKING MSGS LINE UP.
6338 ERRJPC: 0       ;JPC READ WHEN UUO.
6339 ERROR:  0
6340 IFN TS, .SUSET [.RJPC,,ERRJPC]
6341         JRST ERRH       ;GO HANDLE IT
6342 PBLK
6343 ERRH:   PUSH P,T
6344         PUSH P,B        ;NOT TYPR => ERROR OF SOME KIND
6345         PUSH P,A
6346         SAVE C
6347         LDB T,[331100,,40]      ;PICK UP OP CODE
6348         CAIN T,TYPR_-33 ;TYPR?
6349         JRST TYPR1      ;YES
6350                 ;ERROR OF SOME KIND
6351         CAIE T,ETASM_-33        ;CHECK FOR SPECIAL LOSSAGES AT COLON
6352          CAIN T,ETSM_-33
6353           CAME SYM,SYSYM        ;ARE WE ABOUT TO MENTIO THIS LOSING LABEL AS THE LAST ONE?
6354            JRST ERRH1
6355         MOVE T,SYSYM1
6356
6357         MOVEM T,SYSYM   ;COLON LOSSAGE, DE-MUNG TAG WORDS FOR PRINTOUT
6358         MOVE T,SYLOC1
6359         MOVEM T,SYLOC
6360 ERRH1:
6361 IFN TS,[
6362 IFN LISTSW,[
6363         CALL PNTR       ;FORCE OUT BUFFERED LISTING OUTPUT
6364         CALL PNTCRR     ;AND CR, SO USER CAN SEE WHERE ERROR WAS.
6365 ]
6366         PUSHJ P,ERRTFL  ;IF NOT SAME FILE AS LAST, PRINT FILE NAME.
6367 ]
6368         SETZM ERRCCT
6369 IFE ITSSW,[
6370         AOS ERRTTL      ; BUMP ERROR TOTAL
6371 IFE SAILSW,AOS .JBERR   ; BUMP ERROR MESSAGE COUNTER FOR LOADER TO ABORT
6372 .ELSE AOS JOBERR
6373 ] ; IFE ITSSW
6374         MOVE A,SYSYM    ;GET LAST TAG DEFINED
6375         JUMPE A,ERR1    ;SKIP PRINTOUT IF NONE THERE
6376         PUSHJ P,SYMTYP  ;THERE, TYPE IT OUT
6377         MOVE B,CLOC     ;NOW GET CURRENT LOCATION
6378         SUB B,SYLOC     ;SUBTRACT VALUE OF LAST TAG
6379         JUMPE B,ERR1    ;SKIP NUMERIC PRINTOUT IF RIGHT AT TAG
6380         MOVEI A,"+      ;NOT AT TAG,
6381         PUSHJ P,TYOERR  ;TYPE OUT PLUS SIGN,
6382         AOS ERRCCT      ;(1 MORE CHAR TYPED)
6383         PUSHJ P,OCTPNT  ;THEN TYPE OUT DIFFERENCE IN OCTAL
6384 ERR1:   PUSHJ P,TABERR  ;NOW SEPARATE WITH TAB
6385         MOVE A,ERRCCT
6386         CAIGE A,8       ;MAKE SURE MOVE TO COLUMN 16.
6387         PUSHJ P,TABERR
6388         MOVEI B,[ASCIZ/GL+/]
6389         SKIPGE GLOCTP   ;LOCATION GLOBAL?
6390         PUSHJ P,TYPR3   ;YES, TYPE OUT THAT FACT.
6391         MOVE B,CLOC     ;GET CURRENT LOCATION
6392         PUSHJ P,OCTPNT  ;TYPE OUT IN OCTAL
6393 ;DROPS THROUGH
6394 \f
6395 ;DROPS THROUGH.
6396         PUSHJ P,TABERR
6397         MOVE A,MDEPTH   ;NOW DEPTH IN MACRO (NOT IRP, REPEAT, ETC.) EXPANSIONS
6398         MOVSI T,-2
6399         CALL DPNT0      ;PRINT, IN 2-CHAR FIELD.
6400         MOVEI A,".
6401         CALL TYOERR     ;(USED TO BE OCTAL)
6402         MOVE A,CPGN     ;CURRENT PAGE NUMBER (FIRST PAGE OF FILE => 0)
6403         PUSHJ P,[AOJA A,D6PNT]  ;TYPE IT OUT IN DECIMAL
6404         MOVEI A,"-
6405         CALL TYOERR
6406         MOVE A,CLNN     ;ALSO CURRENT LINE NUMBER
6407         PUSHJ P,[AOJA A,D3PNT2]
6408         PUSHJ P,TABERR
6409         MOVEI A,48.     ;ASSUME ALL THE STUFF WE'VE PRINTED TAKES 48. CHARS
6410         MOVEM A,ERRCCT  ;MAYBE SOMEDAY TABERR, ETC. WILL REALLY UPDATE ERRCCT PROPERLY.
6411         LDB A,[331100,,40]      ;PICK UP OP CODE AGAIN
6412         CAIGE A,8       ;ERROR UUO MAX
6413          JRST .+1(A)
6414         JRST [HALT ? JRST .-1]  ;OPCODE 0, OR TOO BIG.
6415         JRST ERRSM      ;ETSM => TYPE SYM AND MESSAGE.
6416         JRST ERRR       ;ETR => JUST PRINT MESSAGE
6417         JRST ERRJ       ;ERJ => RH(40) HAS JUMP ADR
6418         JRST ERRI       ;ETI => IGNORE LINE RET TO ASSEM1
6419         JRST ERRA       ;ETA => RET TO ASSEM1
6420         JRST ERRASM     ;ETASM => TYPE SYM AND GO TO ASSEM1
6421         JRST IAE        ;ERF => FATAL.
6422
6423 ERRJ:   MOVE A,40       ;ERJ => RH(40) HAS JUMP ADR
6424         HRRM A,ERROR
6425         JRST ERRET1
6426
6427 ERRI:   PUSHJ P,RCH     ;ETI => IGNORE LINE, RETURN TO ASSEM1: EAT UP LINE
6428         CAIE A,12
6429         JRST .-2
6430 ERRA:   MOVEI A,ASSEM1  ;ETA => RETURN TO ASSEM1, DON'T TYPE SYM.
6431         MOVEM A,ERROR
6432         JRST ERRR
6433
6434 ERRASM: MOVEI A,ASSEM1  ;ETASM => TYPE SYM AND RETURN TO ASSEM1
6435         MOVEM A,ERROR
6436 ERRSM:  MOVEI C,56.     ;ETSM OR ETASM => TYPE OUT SYM THEN MESSAGE
6437         CALL TYPE37     ;CR NOW IF WHOLE MSG WON'T FIT ON ONE LINE.
6438         MOVE A,SYM
6439         PUSHJ P,SYMTYP
6440         PUSHJ P,TABERR
6441 ERRR:   CALL TYPE40     ;TYPE THE ERROR MESSAGE.
6442 ERRET1: REST C
6443         POP P,A         ;COMMON RETURN POINT FROM UUOS
6444         POP P,B
6445         POP P,T
6446         JRST 2,@ERROR
6447 \f
6448 ;FINISH UP AN ERROR UUO'S ERROR MESSAGE.  PRINT THE SPECIFIED STRING
6449 ;AND ALSO "IN DEFINE AT ..." IF NECESSARY, ALONG WITH APPROPRIATE CR'S.
6450 TYPE40: MOVE C,ERRCCT
6451         CALL TYPE37
6452         CALL TYPR4      ;PRINT THE ASCIZ STRING
6453         CALL CRRERR
6454         SKIPN A,DEFNPS  ;IF INSIDE A LONG PSEUDO,
6455          RET
6456         MOVE A,DEFNLN
6457         MOVE B,DEFNPN
6458         CAMN A,CLNN     ;WHICH DIDN'T START IN THIS VERY LINE,
6459          CAME B,CPGN
6460           JRST TYPE42
6461         MOVE A,DEFNFI
6462         CAMN A,INFFN1
6463          JRST TYPE43
6464 TYPE42: MOVEI B,[ASCIZ/ in /]
6465         CALL TYPR3
6466         MOVE A,DEFNPS
6467         CALL SYMTYP     ;SAY WHAT PSEUDO, AND WHERE IT STARTED.
6468         MOVEI B,[ASCIZ/ Starting at /]
6469         CALL TYPR3
6470         MOVE A,DEFNPN   ;PAGE # -1.
6471         CALL [AOJA A,DPNT] ;PRINT PAGE #.
6472         MOVEI A,"-
6473         CALL TYOERR
6474         AOS A,DEFNLN
6475         CALL D3PNT2     ;PRINT LINE #.
6476 IFN TS,[
6477         MOVE B,DEFNFI   ;PRINT FILE NAME IF IT ISN'T THE CURRENT FILE.
6478         CAMN B,INFFN1
6479          JRST TYPE41
6480         MOVEI B,[ASCIZ/ of file /]
6481         CALL TYPR3
6482         MOVE B,DEFNFI
6483         CALL SIXTYO
6484 ]
6485 TYPE41: CALL CRRERR     ;AND CRLF.
6486 TYPE43: MOVE A,ERROR
6487         CAIN A,ASSEM1   ;IF THIS ERROR IS EXITING THE PSEUDO,
6488          SETZM DEFNPS   ;SAY WE'RE NOT IN IT ANY MORE.
6489         RET
6490
6491 ;JSP TM,ERMARK  IN A PSEUDO, TO ARRANGE FOR ERROR MESSAGES TO MENTION
6492 ;THAT PSEUDO.  SYM SHOULD CONTAIN THE NAME OF THE PSEUDO.
6493 ;PUSHES A WORD ON THE STACK SO THAT WHEN THE PSEUDO RETURNS DEFNPS WILL BE CLEARED.
6494 ;IF DEFNPS IS SET UP ALREADY, DOES NOTHING (DOESN'T SET DEFNPS; DOESN'T PUSH THE WORD)
6495 ERMARK: SKIPE DEFNPS
6496          JRST (TM)
6497         MOVEM SYM,DEFNPS
6498         MOVE SYM,CLNN
6499         MOVEM SYM,DEFNLN
6500         MOVE SYM,CPGN
6501         MOVEM SYM,DEFNPN
6502         MOVE SYM,INFFN1
6503         MOVEM SYM,DEFNFI
6504         MOVE SYM,DEFNPS
6505         CALL (TM)
6506          CAIA
6507           AOS (P)
6508         SETZM DEFNPS
6509         RET
6510 \f
6511 ;C SHOULD HAVE CURRENT HORIZ POS.  IF TYPING THE STRING 40 POINTS AT
6512 ;WOULD OVERFLOW THE LINE, TYPE A CRLF AND TAB NOW ON THE TTY ONLY.
6513 TYPE37: HRRZ B,40
6514         HRLI B,440700   ;FIRST, FIGURE OUT HOW FAR ON LINE WE'LL TYPE IF WE DON'T CR.
6515         ILDB A,B
6516         CAIE A,         ;AND COUNT CHARS IN THE ERR MSG.
6517          AOJA C,.-2
6518         CAMGE C,LINEL
6519          RET
6520 CRRTBX: MOVEI A,10
6521         MOVEM A,ERRCCT  ;PREVENT THIS FROM BEING DONE TWICE.
6522         SKIPE TTYFLG
6523          RET
6524         MOVEI A,^M      ;IF THERE'S NO ROOM, CRLF ON THE TTY ONLY (NOT THE ERR FILE).
6525         PUSHJ P,TYOX
6526         MOVEI A,^J
6527         PUSHJ P,TYOX
6528         MOVEI A,^I
6529         JRST TYOX
6530
6531                 ;TYPE OUT SQUOZE (FLAGS OFF) IN A
6532
6533 SYMTYP: PUSHJ P,SQCCV   ;GET NEXT CHAR IN ASCII.
6534         AOS ERRCCT
6535         PUSHJ P,TYOERR  ;TYPE IT OUT.
6536         JUMPE B,CPOPJ   ;RETURN IF NOTHING LEFT (TYPED OUT AT LEAST ONE CHAR THOUGH)
6537         IMULI B,50      ;LEFT-JUSTIFY REMAINDER
6538         MOVE A,B        ;GET LEFT-JUSTIFIED REMAINDER IN A
6539         JRST SYMTYP     ;TYPE OUT REMAINDER OF SYM
6540
6541                 ;TYPE OUT SQUOZE CHARACTER (IN A)
6542
6543 SQCCV:  IDIV A,[50*50*50*50*50]
6544         CAIG A,10.
6545         SOJA A,SQCDTO   ;NUMBER (OR BLANK =>SLASH)
6546         CAIL A,45
6547         SKIPA A,SYTB-45(A)      ;SPECIAL
6548         ADDI A,"A-13    ;LETTER
6549         POPJ P,
6550
6551 SQCDTO: ADDI A,"0
6552         POPJ P,
6553
6554 SYTB:   ".
6555         "$
6556         "%
6557
6558 D3PNT2: MOVE T,[-3,,400000]     ;3 CHAR FIELD, NO ZERO SUPPRESSION.
6559         JRST DPNT0
6560
6561 DPNT:   TDZA T,T        ;ORDINARY DECIMAL PRINT.
6562 D6PNT:  MOVSI T,-6      ;6 CHAR FIELD, ZERO SUPPRESSION.
6563 DPNT0:  IDIVI A,10.
6564         HRLM B,(P)
6565         TRNE T,377777   ;IF NOT LAST DIGIT,
6566         TRNE T,400000   ;AND ZERO-SUPPR. WANTED,
6567          JRST DPNT2
6568         JUMPN A,DPNT2   ;IF THIS IS A LEADING 0,
6569         JUMPN B,DPNT2
6570         MOVEI B," -"0
6571         HRLM B,(P)      ;REPLACE WITH A SPACE.
6572 DPNT2:  AOBJN T,.+2     ;J IF NOT ENOUGH CHARS YET.
6573         JUMPE A,DPNT1   ;ENOUGH, DON'T MAKE MORE IF NOT NEEDED.
6574         CALL DPNT0
6575         JRST DPNT1
6576 \f
6577 ;TYPE HALFWORD IN B IN OCTAL.
6578 OCTPNT: HRRZ A,B
6579         IDIVI A,10
6580         HRLM B,(P)
6581         JUMPE A,.+2
6582         PUSHJ P,.-3
6583         AOS ERRCCT
6584 DPNT1:  HLRZ A,(P)
6585 ADGTYO: ADDI A,"0
6586         JRST TYOERR
6587
6588 ;TYPE OUT THE SIXBIT WORD IN B
6589
6590 SIXTYO: JUMPE B,CPOPJ
6591         MOVEI A,0
6592         ROTC A,6
6593         ADDI A,40
6594         PUSHJ P,TYOERR
6595         JRST SIXTYO
6596
6597                 ;TYPE CRLF
6598
6599 CRR:    MOVEI A,15
6600         PUSHJ P,TYO
6601         MOVEI A,12
6602         JRST TYO
6603
6604 ;OP CODE 0 => NO RECOVERY RETURN TO GO2
6605 IAE:    CALL TYPE40     ;PRINT THE ERROR MESSAGE.
6606         SKIPE ASMOUT
6607          JSP LINK,CONFLZ ;TELL USER ABOUT UNTERM. GROUPINGS.
6608         SKIPE SCNDEP    ;MENTION ANY UNTERMINATED SUCCESSFUL
6609          CALL AENDM1    ;CONDITIONALS.
6610 IFN ITSSW,.RESET TYIC,
6611         JRST GO2
6612
6613                 ;TYPR [ASCIZ /STRING/]  ;TYPE OUT STRING
6614
6615 TYPR1:  PUSH P,[ERRET1]
6616 TYPR4:  HRRZ B,40       ;GET ADR OF BEGINNING OF STRING
6617 TYPR3:  HRLI B,440700   ;CONVERT TO BYTE POINTER
6618 TYPR2:  ILDB A,B        ;GET NEXT CHAR
6619         JUMPE A,CPOPJ   ;JUMP IF ZERO, END OF STRING
6620         PUSHJ P,TYOERR  ;NON-ZERO, TYPE IT OUT
6621         JRST TYPR2
6622
6623 CRRERR: MOVEI A,^M      ;CRLF IN ERROR MESSAGE.
6624         CALL TYOERR
6625         SKIPA A,[^J]
6626 TABERR: MOVEI A,^I      ;TAB INN ERROR MESSAGE.
6627 TYOERR:
6628 IFN LISTSW,[
6629         SKIPE LSTTTY    ;OUTPUT TO LISTING UNLESS LSTTTY ZERO.
6630          CALL PILPTX
6631 ]
6632         SKIPG LSTTTY
6633          JRST TYO       ;TO TTY UNLESS LSTTTY POSITIVE.
6634         RET
6635 \f;OUTPUT-FORMAT SELECTING PSEUDOS:
6636
6637 ;.SLDR -- ON PASS 2, PUNCH OUT SBLK LOADER AND SELECT SBLK FORMAT
6638 A.SLDR: NOVAL
6639         JUMPGE FF,MACCR ;DO NOTHING ON PASS 1.
6640         PUSHJ P,FEED1   ;LEAVE LOTS OF BLANK PAPER TAPE FIRST
6641         PUSHJ P,PLOD1A  ;PUNCH OUT LOADER
6642 SIMBLK: MOVSI B,SBLKS   ;ENTRY FROM PS1, A.SLDR SELECT SBLK
6643         JRST SIMBL1
6644
6645 SRIM:   MOVE A,SYM      ;ENTRY FROM GETVAL, LH(B) HAS RH(CONTRL)
6646         SAVE B
6647         CALL SYMTYP
6648         TYPR [ASCIZ/ Encountered
6649 /]
6650         REST B
6651 SIMBL1: TRO FF,FRNPSS
6652         HRRI B,TRIV     ;SET UP TRIV FLAG FOR LH(CONTRL)
6653         MOVSS B
6654         CAME B,CONTRL   ;IF CHANGING MODES, END THE BLOCK IN THE OLD MODE
6655          CALL EBLK
6656         MOVE A,CONTRL   ;IF OLD MODE WAS RELOCATABLE OF SOME KIND,
6657         TRNN A,DECREL\FASL
6658          JUMPL A,SIMBL2
6659         SETZM CRLOC     ;INITIALIZE LOCATION COUNTER.
6660         MOVEI A,100
6661         MOVEM A,CLOC
6662 SIMBL2: MOVEM B,CONTRL  ;STORE NEW MODE.
6663         AOS (P)
6664
6665         ;ROUTINE TO SET VARIABLES FOR BENEFIT OF NED LOGIC
6666         ;CALLED BY OUTPUT SELECTING PSEUDOS
6667 OUTUPD: NOVAL
6668 IFN A1PSW,[
6669         TRNE FF,FRNPSS  ;IF PASS 1,
6670         TLNN FF,FLOUT
6671         JRST OUTCHK
6672         AOS OUTN1       ;INDICATE "OUTPUT" HAS OCCURED OTHER THAN IN 1PASS MODE
6673 OUTCHK: TLZE FF,FLOUT
6674         AOS OUTC        ;INDICATE "OUTPUT" HAS OCCURED DURING CURRENT ASSEMBLY
6675 ]
6676         RET
6677
6678 ANOSYMS:        NOVAL
6679         TRZ FF,FRSYMS
6680         JRST MACCR
6681
6682 A1PASS: PUSHJ P,OUTUPD
6683 A1PAS1: TLO FF,FLPPSS
6684         MOVEIM A.PPASS,1        ;SET .PPASS TO 1.
6685 IFN CREFSW,[    SKIPE CREFP     ;THIS NOW PUNCHING PASS,
6686         PUSHJ P,CRFON   ;MAYBE TURN ON CREFFING.
6687 ]
6688 IFN LISTSW,[
6689         SKIPE LISTP
6690          CALL LSTON     ;LIST NOW IF WANT LISTING AT ALL.
6691 ]
6692         MOVE A,CONTRL
6693         TRNE A,DECREL
6694          CALL DECPGN
6695         TRZA FF,FRNPSS
6696 ARELOC: PUSHJ P,OUTUPD
6697 ARELC1: PUSHJ P,EBLK    ;FINISH CURRENT OUTPUT BLOCK
6698         TRO FF,FRLOC    ;DOING LOCATION ASSIGNMENT, MAKE SURE NEXT GETS OUTPUT
6699         CLEARM CLOC
6700         MOVEI A,1
6701         MOVEM A,CRLOC
6702         CLEARM CONTRL
6703         SETZM BKBUF
6704         MOVEI A,LREL
6705         DPB A,[310700,,BKBUF]
6706         MOVEM A,CDATBC
6707         JRST MACCR
6708
6709 A.DECTWO:       CALL AGETFD     ;READ THE TWOSEG ORIGIN.
6710         TRNN FF,FRNPSS
6711          ETF [ASCIZ /.DECTWO follows 1PASS/]
6712         MOVE C,ISAV
6713         TRNN C,IRFLD    ;NO ARG => DEFAULT IT TO 400000
6714          MOVEI A,400000
6715         MOVEM A,DECTWO
6716
6717 A.DECREL:       PUSHJ P,OUTUPD
6718         TRZ FF,FRLOC
6719         PUSHJ P,EBLK    ;FORCE OUT BLOCK IN OTHER FMT.
6720         MOVE A,[SETZ DECREL]
6721         CAME A,CONTRL   ;SWITCHING TO .DECREL MODE FOR 1ST TIME
6722          TRNE FF,FRNPSS ;IN A 1PASS ASSEMBLY
6723           JRST A.FAS1
6724         CALL A.FAS1     ;DO THE SWITCH
6725          JFCL
6726         CALL DECPGN     ;THEN WRITE THE PROGRAM NAME
6727         JRST MACCR
6728
6729 A.FAS1: MOVEM A,CONTRL  ;DEC FMT COUNTS AS ABS ASSEMBLY.
6730         SETZM BKBUF     ;(SO EBLK W0N'T OUTPUT ANYTHING)
6731         SETZM CLOC      ;START ASSEMBLING FROM RELOCATABLE 0.
6732         MOVEI A,1
6733         MOVEM A,CRLOC
6734         PUSHJ P,EBLK    ;INITIALIZE AN ORDINARY (DECWDS) BLOCK.
6735         JRST MACCR
6736
6737 IFN FASLP,[
6738 A.FASL: PUSHJ P,OUTUPD
6739         PUSHJ P,EBLK
6740         MOVE A,[SETZ FASL]      ;FASL ALSO COUNTS AS ABS
6741         JRST A.FAS1
6742 ]
6743 \f
6744 ATITLE: NOVAL
6745         SAVE CASSM1     ;RETURN TO ASSEM1.
6746         PUSHJ P,GSYL
6747         SKIPE SYM
6748         MOVEM SYM,PRGNM
6749         MOVE T,[440700,,STRSTO]
6750 ATIT2:  ILDB A,T        ;GET CHAR FROM TITLE STRING
6751         SOSG STRCNT
6752         JRST ATIT3      ;CHAR IS SYLLABLE TERMINATOR
6753 IFE ITSSW,SKIPE CCLFLG ? TRNN FF,FRPSS2
6754         PUSHJ P,TYO     ;NOT TERMINATOR, TYPE OUT AND LOOP BACK
6755         JRST ATIT2
6756
6757 ATIT3:  CALL ATIT1      ;PRINT THE REST OF THIS LINE.
6758         MOVE A,CONTRL
6759         TRNE A,DECREL
6760          TRNE FF,FRNPSS
6761           CAIA
6762            ETF [ASCIZ /TITLE follows 1PASS/]
6763         MOVE A,TTYINS
6764         ADD A,A.PASS    ;SHOULD WE .INSRT TTY: THIS PASS (T SWITCH)
6765         JUMPG A,CPOPJ
6766 IFDEF GTYIPA,JRST GTYIPA        ;GO PUSH TO TTY IF CAN,
6767 IFNDEF GTYIPA,HALT      ;WHY DID YOU SET TTYINS IF CAN'T?
6768
6769 ATIT1:  CAIE A,15       ;CR?
6770         CAIN A,12       ;LF?
6771          JRST [IFE ITSSW,SKIPE CCLFLG ? TRNN FF,FRPSS2
6772                JRST CRR ;ONE OF THESE, FINISH TYPEOUT WITH CR
6773                 .ALSO RET
6774                 ]       ; AND RETURN IF PASS2 DEC CCL
6775 IFE ITSSW,SKIPE CCLFLG ? TRNN FF,FRPSS2
6776         PUSHJ P,TYO     ;NEITHER OF THESE, PRINT CHAR
6777 A.ERR1: PUSHJ P,RCH     ;GET NEXT CHAR IN TITLE
6778         JRST ATIT1
6779
6780 ;.ERR PSEUDO-OP -- FOLLOWED BY LINE WHICH IS ERROR MSG.
6781 A.ERR:  SAVE CASSM1     ;RETURN TO ASSEM1,
6782         ERJ A.ERR1      ;AFTER NUMBERS AND USER'S STRING.
6783
6784 A.FATAL:        SAVE [GO2]      ;.FATAL - CAUSE A FATAL ERROR.
6785         ERJ A.ERR1
6786
6787 APRINT: NOVAL
6788         HLRZS B         ;B SAYS WHETHER PRINTX, PRINTC OR COMMENT.
6789         JSP TM,ERMARK
6790         CALL PASSPS
6791         MOVE T,A
6792 APRIN1: PUSHJ P,RCH
6793         CAME A,T
6794          JRST (B)       ;GO TO APRIN1 FOR COMMENT,
6795         JRST MACCR
6796
6797 APRIN2: CAIE A,"!       ;COME HERE FOR PRINTX
6798 APRIN3: PUSHJ P,TYO     ;HERE FOR PRINTC
6799         JRST APRIN1
6800
6801 A.TYO:  NOVAL
6802         CALL AGETFD     ;PSEUDO TO TYPE A CHARACTER (AS NUMERIC ARG).
6803         CALL TYOERR
6804         JRST MACCR
6805
6806 A.TYO6: NOVAL
6807         CALL AGETFD     ;PSEUDO TO TYPE A WORD OF SIXBIT.
6808         MOVE B,A
6809         CALL SIXTYO
6810         JRST MACCR
6811 \f;.BEGIN - START NEW BLOCK WITH NAME = ARG, OR LAST LABEL DEFINED.
6812 A.BEGIN:        NOVAL
6813         SKIPE ASMOUT    ;IF IN GROUPING, FLUSH IT & ERROR.
6814         JSP LINK,CONFLM
6815         PUSHJ P,GETSLD  ;READ A NAME.
6816          MOVE SYM,SYSYM ;NO ARG, USE NAME OF LAST LABEL.
6817         MOVE A,SYM      ;NAME TO USE FOR BLOCK.
6818         MOVE B,BKLVL    ;CURRENT LEVEL + 1
6819         HRLZI B,1(B)    ;IS LEVEL OF NEW BLOCK.
6820         HRR B,BKCUR     ;ITS SUPERIOR IS CURRENT BLOCK.
6821         MOVEI C,0       ;SEE IF AN ENTRY EXISTS FOR THIS BLOCK.
6822         MOVE AA,A.PASS
6823 A.BEG0: CAMN A,BKTAB(C)
6824         CAME B,BKTAB+1(C)
6825         JRST A.BEG1     ;THIS ENTRY ISN'T FOR BLOCK BEING ENTERED.
6826         TDNE AA,BKTAB+2(C)      ;FOUND: DEFINED IN THIS PASS?
6827          ETSM [ASCIZ /Multiply defined BLOCK/]
6828         JRST A.BEG2     ;NO, SAY IT'S DEFINED.
6829
6830 A.BEG1: ADDI C,BKWPB    ;LOOK THRU ALL ENTRIES.
6831         CAMGE C,BKTABP
6832         JRST A.BEG0
6833         CAIL C,BKTABS   ;ALL ENTRIES USED => ERROR.
6834          ETF ERRTMB
6835         MOVEM A,BKTAB(C)        ;ALLOCATE NEW ENTRY
6836         MOVEM B,BKTAB+1(C)      ;STORE NAME, LEVEL, SUPPRO.
6837         MOVEI A,BKWPB(C)
6838         MOVEM A,BKTABP  ;POINTS TO 1ST UNUSED ENTRY.
6839 A.BEG2: IORM AA,BKTAB+2(C)      ;INDICATE BLOCK SEEN THIS PASS.
6840         MOVEM C,BKCUR   ;NEW BLOCK NOW CURRENT BLOCK,
6841         AOS A,BKLVL     ;ITS LEVEL NOW CURRENT LEVEL,
6842         CAIL A,BKPDLS   ;PUSH IT ON BLOCK PDL
6843          ETF [ASCIZ /.BEGIN nesting too deep/]
6844         MOVEM C,BKPDL(A)
6845         JRST ASSEM1
6846
6847 ERRTMB: ASCIZ /Too many symbol blocks/
6848 ERRUMB: ASCIZ /Unmatched .BEGIN - .END/
6849
6850 ;.END - POP CURRENT BLOCK.
6851 A.END:  NOVAL
6852         SKIPE ASMOUT    ;IN GROUPING => TERMINATE IT & ERROR.
6853         JSP LINK,CONFLM
6854         MOVE A,CDISP    ;IF FOLLOWED BY WORD TERM,
6855         TLNN A,DWRD     ;CAUSE IT TO BE RE-READ
6856         TLO FF,FLUNRD   ;SO ARG WILL BE NULL.
6857         PUSHJ P,GETSLD  ;READ ARG.
6858         JRST A.END0     ;NO ARG.
6859         MOVE C,BKCUR    ;ERROR UNLESS BLOCK BEING TERMINATED
6860         MOVE A,BKTAB(C) ;HAS SAME NAME AS ARG.
6861         EXCH A,SYM      ;(MAKE SURE SYM NAME TYPED IS BLOCK'S NAME)
6862         CAME A,SYM
6863          ETSM ERRUMB    ;ERROR, PRINT SYM (BLOCK'S NAME)
6864 A.END0: MOVE C,BKCUR    ;NOT OK TO END .MAIN BLOCK OR .INIT BLOCK.
6865         CAIG C,BKWPB
6866          ETA ERRUMB
6867         HRRZ C,BKTAB+1(C)
6868         MOVEM C,BKCUR   ;POP INTO FATHER OF PREV. CURRENT BLOCK.
6869         SOS BKLVL
6870         JRST ASSEM1
6871 \f
6872 ;BKTAB: 3-WORD ENTRIES, 1 PER BLOCK, IN NO PARTICULAR ORDER.
6873 ;1ST WD HAS SQUOZE NAME OF BLOCK, FLAGS CLEAR.
6874 ;2ND WD HAS LEVEL,,BKTAB IDX OF CONTAINING BLOCK("FATHER", "SUPERIOR")
6875 ;3RD WD BIT 1.N ON => BLOCK ENTERED ON PASS N.
6876 ;SYMBOL TABLE OUTPUT RTN PUTS -2*<NUM SYMS IN BLOCK> IN 3RD WD.
6877 ;THE FIRST BKTAB ENTRY IS THAT OF THE OUTERMOST BLOCK (.INIT)
6878 ;IN WHICH INITIAL SYMS ARE DEFINED.
6879 ;THAT ENTRY'S 2ND AND 3RD WDS ARE 0.
6880 ;THE NEXT IS THAT OF THE MAIN BLOCK (.MAIN) IN WHICH
6881 ;ALL SYMBOLS ARE NORMALLY DEFINED (THAT IS, YOU ARE IN THAT BLOCK
6882 ;BEFORE YOU DO ANY .BEGIN'S).
6883 ;THAT ENTRY'S 2ND WD IS 1,, ; ITS 3RD, 0.
6884
6885 ;THE BKPDL IS A TABLE OF BLOCKS CURRENTLY ENTERED & NOT ENDED.
6886 ;BKPDL'S 1ST ENTRY IS FOR OUTERMOST BLOCK.
6887 ;LAST ENTRY IS BKPDL+@BKLVL, FOR CURRENT BLOCK.
6888
6889 BKTABS==BKTABL*BKWPB
6890
6891 VBLK
6892 BLCODE [
6893 BKTAB:  BLOCK 3         ;ENTRY FOR .INIT BLOCK.
6894 PRGNM:  BLOCK BKTABS-BKWPB      ;PROGRAM NAME IS NAME OF MAIN BLOCK.
6895 ]
6896 BKTABP: 0       ;IDX IN BKTAB OF 1ST UNUSED ENTRY.
6897 BKPDL:  BLOCK BKPDLS    ;TABLE OF BLOCKS STARTED, NOT FINISHED.
6898 BKLVL:  0       ;CURRENT BLOCK LEVEL, IDX OF LAST USED IN BKPDL.
6899 BKCUR:  0       ;BKTAB IDX OF CURRENT BLOCK.
6900 ESBK:   0       ;-1 OR BLOCK TO EVAL SYM. IN.
6901 ESL1:   0       ;IN ES, LEVEL OF BLOCK OF BEST SYM SO FAR.
6902 ESL2:   0       ;3RDWRD OF BEST SO FAR.
6903 SADR:   0       ;SYM TAB IDX OF BEST SO FAR.
6904 ESLAST: 0       ;RH IDX OF LAST DEF (EVEN IF NO GOOD) -1 IF NONE
6905                 ;SIGN NEG. IF LAST DEF SEEN BEFORE @ESXPUN
6906 ESXPUN: -1      ;IF SEE EXPUNGED OR FREE ENTRY, PUT IDX HERE.
6907 BKTAB1: BLOCK BKTABL    ;USED BY SSYMD.
6908 PBLK
6909
6910 ;.SYMTAB ARG    ;SAY WANT AT LEAST ARG STE'S IN SYMTAB.
6911 A.SYMTAB:       NOVAL
6912         SAVE [0]        ;THIS WORD WILL BE SETOM'ED IF THERE IS REALLY ANY WORK NEEDED.
6913         PUSHJ P,AGETFD  ;GET DESIRED SYM TAB SIZE.
6914         CAMG A,SYMLEN   ;IF HAVE ENOGH ROOM ALREADY,
6915          JRST A.SYM1    ;NO NEED TO RE-INIT.
6916         CAILE A,SYMMAX  ;IF WANTS MORE THAN MAXIMUM, ERROR.
6917          ETF [ASCIZ/.SYMTAB 1st arg too big/]
6918         MOVEM A,SYMLEN  ;TELL INITS ABOUT NEW SIZE.
6919         SETOM (P)
6920 A.SYM1: CALL AGETFD     ;READ DESIRED CONSTANTS TABLE SPACE ALLOCATION.
6921         CAMG A,CONLEN   ;IF TABLE ALREADY BUG ENOUGH, NOTHING TO DO.
6922          JRST A.SYM2
6923         CAILE A,CONMAX
6924          ETF [ASCIZ/.SYMTAB 2nd arg too big/]
6925         MOVEM A,CONLEN  ;ELSE REMEMBER IT AND SAY REALLOCATION NECESSARY.
6926         SETOM (P)
6927 A.SYM2: CALL AGETFD     ;3RD ARG IS # WORDS PER SYMBOL - BUT ONLY 3 IS ALLOWED NOW.
6928         JUMPE A,A.SYM3  ;EVENTUALLY 4 WILL GET 12-CHARACTER SYMBOLS.
6929         CAIL A,MINWPS
6930          CAILE A,MAXWPS
6931           ETF [ASCIZ/.SYMTAB 3rd arg out of range/]
6932         CAME A,WPSTE
6933          SETOM (P)
6934         MOVEM A,WPSTE
6935 A.SYM3: REST A          ;IS THERE ANYTHING THAT ACTUALLY NEEDS TO BE CHANGED?
6936         JUMPE A,ASSEM1  ;IF NOT, NEVER GIVE ERROR - ELSE WOULD ALWAYS LOSE ON PASS 2.
6937         MOVE B,PLIM
6938         CAMN B,CONTBA   ;IF THERE HAVE BEEN ANY LITERALS
6939          SKIPE INICLB   ;OR ANY MACROS, IRPS, REPEATS, ETC., THEN ...
6940           ETF [ASCIZ/Too late to do .SYMTAB/]
6941         MOVE CH1,MACTAD ;SET UP AC -> START OF INIT CODE
6942         SUBI CH1,MACTBA ;SO IT CAN REFER TO ITSELF.
6943         PUSHJ P,INITS(CH1) ;RE-INIT, SET SYMSIZ, SYMAOB, ETC.
6944         PUSHJ P,MACINI  ;INIT PTRS TO END OF MACTAB.
6945         JRST ASSEM1
6946 \f
6947 A.OP:   PUSHJ P,A.OP1   ;.OP,
6948         JRST VALRET     ;RETURNS VALUE
6949
6950 A.AOP:  NOVAL
6951         AOS (P)         ;.AOP DOESN'T RETURN VALUE
6952 A.OP1:  PUSHJ P,AGETFD
6953         PUSH P,A
6954         PUSHJ P,AGETFD
6955         PUSH P,A        ;PDL NOW HAS FIELD 0 AND FIELD 1
6956         PUSHJ P,AGETFD
6957         POP P,B         ;B NOW HAS FIELD 1, A HAS FIELD 2, PDL HAS FIELD 0
6958         EXCH A,B
6959         POP P,T         ;T HAS FIELD 0, A HAS FIELD 1, B HAS FIELD 2
6960         TLNN T,(0 17,)  ;IF AC FIELD NOT PRESENT IN INSN, SUPPLY ONE.
6961          TLO T,(0 A,)
6962         TDNN T,[0 -1(17)] ;IF NO ADDR OR IDX FIELD IN INSTRUCTION,
6963          HRRI T,B       ;SUPPLY ONE.
6964         SETOM A.ASKIP'  ;.ASKIP WILL BE -1 IFF INSN SKIPPED, ELSE 0.
6965         TLNE T,74000    ;AVOID EXECUTING OPCODE ZERO.
6966          XCT T
6967           SETZM A.ASKIP
6968         MOVEM A,AVAL1'  ;STORE C(AC) AS .AVAL1
6969         MOVEM B,AVAL2'  ;STORE C(E) FOR .AVAL2
6970         POPJ P,         ;RETURN TO WHATEVER
6971
6972 AASCIZ: TDZA T,T
6973 A.ASCII:        MOVEI T,1
6974         MOVEM T,AASCF1  ;STORE TYPE
6975         MOVE D,[440700,,T]
6976         SETZM AASCFT
6977         JRST AASC1
6978
6979 AASCII: SKIPA D,[440700,,T]
6980 ASIXBI:  MOVE D,[440600,,T]
6981         SETZM AASCFT    ;INDICATE NOT .DECTXT
6982         SETOM AASCF1    ;INDICATE REGULAR (NOT ASCIZ)
6983         JRST AASC1
6984
6985 A.DCTX: NOVAL
6986         MOVE A,CONTRL
6987         TRNN A,DECREL
6988          ETA [ASCIZ /.DECTXT in non-DECREL assembly/]
6989         CALL EBLK
6990         SETZ B,
6991         SETOM AASCFT
6992         SETOM AASCF1    ;INDICATE ASCIZ-STYLE PADDING
6993         MOVE D,[440700,,T]
6994 AASC1:  TLZE I,ILMWRD
6995          JRST TEXT2     ;MULTIPLE WORD, FALL IN FOR NEXT SET OF CHARS
6996         MOVEMM ASMDS1,ASMDSP
6997         MOVEM SYM,DEFNPS ;REMEMBER LOCATION IN FILE OF PSEUDO
6998         MOVEMM DEFNLN,CLNN      ;IN CASE THE DELIMITER IS MISSING.
6999         MOVEMM DEFNPN,CPGN
7000 IFN TS, MOVEMM DEFNFI,INFFN1
7001         HLRZ T,B        ;GET FILL CHARACTER
7002         IMUL T,[REPEAT 5,[1_<.RPCNT*7>+]0] ;CONVERT TO ASCII FILL WORD SHIFTED -1 (IMUL SCREW)
7003         LSH T,1         ;SHIFT TO PROPER POSITION (EXTRA IN CASE WANT TO FILL W/ HIGH BIT SET)
7004         MOVEM T,AASEFW  ;STORE AS FILL WORD, T NOW SET UP TO ACCUMULATE VALUE
7005         CALL PASSPS
7006         MOVEM A,TEXT4   ;STORE TERMINATOR
7007 TEXT7:  PUSHJ P,RCH
7008 AASC8:  CAMN A,TEXT4
7009          JRST AASC1A    ;TERMINATOR
7010         TLNN D,760000
7011          JRST TEXT6     ;WORD FULL
7012 TEXT9:  TLNE D,100      ;CHECK BOTTOM BIT OF SIZE FIELD OF BP
7013          JRST AASC2     ;SET => NOT SIXBIT
7014         SUBI A,40
7015         CAILE A,77
7016          SUBI A,40      ;CONVERT LOWER CASE ASCII TO UPPER CASE
7017         JUMPGE A,.+2
7018          ETR ERRN6B
7019 AASC3:  IDPB A,D
7020         TRO I,IRSYL
7021         JRST TEXT7
7022
7023 ERRN6B: ASCIZ /Character not SIXBIT/
7024 \f
7025 ;TERMINATOR
7026
7027 AASC1A: TLNN D,760000   ;SKIP UNLESS END OF WORD
7028         SKIPGE AASCF1   ;SKIP UNLESS REGULAR
7029          JRST [ MOVE CH1,ASMDS1 ;REGULAR OR NOT END OF WORD
7030                 MOVEM CH1,ASMDSP ;RESTORE ASMDSP AS SAVED AT START OF PSEUDO.
7031                 JRST TEXTX]
7032         MOVEI CH1,1     ;END OF WORD AND NOT REGULAR
7033         JRST AASC1B     ;EXTRA 0 NEED FOR Z FLAVOR
7034
7035 AASC2:  CAIN A,"!
7036         SKIPG AASCF1
7037         JRST AASC3      ;NOT .ASCII OR NOT EXCL
7038         PUSH P,T        ;READ FIELD
7039         PUSH P,D
7040         PUSH P,SYM
7041         SAVE ASMOUT     ;PREVENT CLOSEBRACKETS FROM TRYING TO TAKE EFFECT.
7042         MOVEIM ASMOUT,4 ;NOTE THIS LOSES IF CALL PSEUDO THAT RETURNS TO ASSEM1.
7043         MOVEI SYM,[SETOM ASUDS1]        ;NOW TO SET UP UNDEFINED SYM CONDITION
7044         TLNE FF,FLPPSS
7045          MOVE SYM,[SQUOZE 0,.ASCII]     ;PUNCHING PASS, UNDEFINED => REAL ERROR
7046         CLEARM ASUDS1
7047         PUSHJ P,AGETFD
7048                 ;"UNDEFINED IN .ASCII" ERROR INSTR, ERROR MESSAGE BUT ONLY ON PASS 2
7049                 ;BUT NOTE THAT ON PASS 2 IT MIGHT ASSEMBLE DIFFERENT NUMBER OF WORDS,
7050                 ;CAUSING LOSSAGE IF NOT IN CONSTANT
7051         REST ASMOUT
7052         POP P,SYM
7053         POP P,D
7054         POP P,T
7055         SKIPGE ASUDS1
7056         MOVNI A,1       ;HAD UNDEFINED SYMS SO ASSUME MAX
7057         SKIPGE ASUDS1
7058         TLO I,ILNOPT    ;ALSO DON'T OPTIMIZE OVER IN CONSTANT
7059         MOVE CH1,[440700,,AASBF]
7060         MOVEM CH1,ASBP1
7061         MOVEM CH1,ASBP2
7062         PUSH P,[AASC5]
7063         MOVE CH1,A
7064 AASC6:  LSHC CH1,-35.
7065         LSH CH2,-1
7066         DIV CH1,ARADIX
7067         HRLM CH2,(P)
7068         JUMPE CH1,.+2
7069         PUSHJ P,AASC6
7070         HLRZ A,(P)
7071         ADDI A,"0
7072         IDPB A,ASBP1
7073         POPJ P,
7074
7075 AASC5:  MOVEI A,0
7076         IDPB A,ASBP1    ;END .ASCII NUMBER WITH ZERO
7077 AASC8A: TLNN D,760000
7078         JRST AASC7      ;END OF WORD
7079         ILDB A,ASBP2
7080         JUMPE A,AASC9
7081         IDPB A,D
7082         JRST AASC8A
7083
7084 AASC9:  TLO FF,FLUNRD
7085         JRST TEXT7
7086 \f
7087 AASC7:  TDZA CH1,CH1
7088 TEXT6:  MOVNI CH1,1     ;WORD FULL
7089 AASC1B: MOVEM CH1,AASCF2
7090         CLEARM CDISP
7091         MOVEM A,TEXT8
7092         MOVE A,T
7093         SKIPE AASCFT    ;FOR .DECTXT, OUTPUT WORD INSTEAD OF RETURNING IT.
7094          JRST [ CALL PPB
7095                 MOVE D,[440700,,T]
7096                 JRST TEXT2A]
7097         TLO I,ILMWRD    ;ELSE ARRANGE TO BE CALLED BACK TO RETURN NEXT WORD.
7098         MOVEI T,ASSEM2
7099         MOVEM T,ASMDSP
7100         SKIPLE CONSML   ;IF NOT MULTI-LINE MODE,
7101          JRST CLBPOP
7102         MOVE T,ASMOUT   ;IF THE TEXT IS IN <>'S OR ()'S,
7103         HRRZ T,ASMOT2(T)
7104         CAIE T,LSSTHA
7105          JRST CLBPOP
7106         CALL IGTXT      ;USE ONLY THE FIRST WORD.
7107         SKIPE CONSML    ;AND ERROR IF IN ERROR MODE.
7108          ETR [ASCIZ/Multi-word text pseudo in brackets/]
7109         JRST CLBPOP
7110
7111                 ;GET NEXT WORD
7112
7113 TEXT2:  TRO I,IRFLD
7114 TEXT2A: MOVE T,AASEFW   ;INITIALIZE T TO FILL WORD
7115         MOVE A,TEXT8    ;GET NEXT CHAR (ALREADY READ BY RCH)
7116         SKIPGE B,AASCF2
7117         JRST TEXT9      ;REG OR HAVEN'T READ SECOND DELIMITER, FALL BACK IN
7118         JUMPE B,AASC8A
7119 TEXTX:  SETZM DEFNPS
7120         SKIPN AASCFT
7121          JRST TEXT5     ;RETURNING FROM ASCIZ AFTER PUTTING THE TRAILING ZERO OUT.
7122         MOVE A,T
7123         CALL PPB        ;FOR .DECTXT, OUTPUT THE FILL WORD INSTEAD.
7124         JRST MACCR
7125
7126 VBLK
7127
7128 AASCF1: 0       ;-1 REG OR SIXBIT, 1 .ASCI 0 ASCIZ
7129 AASCF2: 0       ;MULTIPLE WORD RETURN FLAG -1 REG 0  FINISH ! HACK 1 OUTPUT FILL WORD FOR Z
7130 AASCFT: 0       ;0 REGULAR, -1 => .DECTXT (OUTPUT WORDS TO FILE INSTEAD OF RETURNING  THEM)
7131 TEXT4:  0       ;DELIMITER
7132 TEXT8:  0       ;SAVED NEXT CHAR WHILE RETURNING BETWEEN WORDS
7133 ASBP1:  0       ;IDPB TO AASBF ON .ASCII FIELD
7134 ASBP2:  0       ;ILDB FROM AASBF "
7135 AASBF:  BLOCK 8 ;ACCUMULATED TYPEOUT OF NUMBER FOR .ASCII, EXTRA LONG FOR HACKERS TYPING OUT BINARY
7136 ASUDS1: 0       ;UNDEFINED SYM FLAG FOR .ASCII DURING PASS 1
7137 AASEFW: 0       ;FILL WORD
7138
7139 PBLK
7140
7141 IGTXT:  TLNN I,ILMWRD
7142          RET
7143         PUSH P,A        ;ROUTINE TO EAT UP TEXT OF UNDESIRED MULTIPLE WORD
7144         SKIPLE AASCF2   ;DETECT SCREW CASE:  AFTER ASCIZ OF 5 CHARS, DELIMITER IS
7145          JRST IGTXT1    ;ALREADY GOBBLED, BUT SOME OF THE ASCIZ REMAINS.
7146         PUSHJ P,RCH
7147         CAME A,TEXT4
7148         JRST .-2
7149 IGTXT1: TLZ I,ILMWRD
7150         MOVEMM ASMDSP,ASMDS1
7151         SETZM DEFNPS
7152         JRST POPAJ
7153
7154 ;".ASCVL  /X" RETURNS THE ASCII VALUE OF "X".  NOTE THE DELIMITER IS NOT REPEATED
7155 ;AND SERVES ONLY TO ALLOW SPACES TO BE IGNORED WHILE WINNING IF X IS A SPACE.
7156 A.ASCV: CALL PASSPS     ;SKIP SPACES TO REACH THE DELIMITER.
7157         CALL RCH        ;READ THE CHAR AFTER THE DELIMITER
7158         MOVE T,A
7159         JRST TEXT5      ;AND RETURN ITS ASCII VALUE.
7160 \f
7161 ASQOZ:  HLLM B,(P)      ;SAVE FLAG THAT'S 0 FOR SQUOZE, -1 FOR .RSQZ .
7162         SAVE SYM
7163         PUSHJ P,AGETFD
7164         LSH A,36
7165         PUSH P,A
7166         PUSHJ P,GETSLD  ;GET SYM, SAVE DELIMITER FOR REINPUT
7167          CALL NONAME
7168         REST A
7169         LDB B,[4000,,SYM]       ;GET JUST THE SQUOZE.
7170         SKIPGE -1(P)
7171         PUSHJ P,ASQOZR  ;FOR .RSQZ, RIGHT-JUSTIFY IT.
7172         SUB P,[1,,1]
7173         ADD A,B
7174         JRST CLBPOP
7175
7176 ;RIGHT-JUSTIFY THE SQUOZE WORD IN B.
7177 ASQOZR: MOVE SYM,B
7178         IDIVI SYM,50
7179         JUMPN LINK,CPOPJ        ;LAST ISN'T BLANK, DONE.
7180         MOVE B,SYM      ;ELSE REPLACE BY WHAT'S SHIFTED RIGHT 1 CHAR.
7181         JRST ASQOZR
7182
7183                 ;COMMON PSEUDO ROUTINE TO RETURN MIDAS INTERNAL QUANTITY
7184                 ;ADR IN LH(B)) AS VALUE (EG. .RPCNT, .FNAM1, .AVAL2, ETC.
7185                 ;INTSYMS MAY APPEAR TO LEFT OF =
7186
7187 INTSYM: MOVE A,B        ;GET ADR IN LH(A)
7188         JRA A,CLBPOP    ;RETURN IT
7189
7190                 ;.YSTGW, .NSTGW ACCORDING TO WHAT'S IN LH(B)
7191
7192 STGWS:  HRLES B         ;.NSTGW INCREMENTS STGSW, .YSTGW DECREMENTS.
7193         ADDB B,STGSW
7194         SKIPGE B        ;BUT DON'T DECREMENT PAST 0.
7195          SETZM STGSW
7196         JRST MACCR      ;STORAGE WORDS ARE ALLOWED IF STGSW IS ZERO.
7197
7198                 ;.TYPE
7199
7200 A.TYPE: SAVE SYM
7201         SAVE SYM
7202         PUSHJ P,GETSLD  ;GET NAME
7203          CALL NONAME
7204         SUB P,[2,,2]
7205         TRNN I,IRLET    ;IF SYLLABLE IS A NUMBER,
7206          JRST [ SETO A, ;RETURN -1.
7207                 JRST CLBPOP]
7208         PUSHJ P,ES      ;EVALUATE SYM, INTERESTED IN SQUOZE FLAGS RETURNED IN A
7209         MOVEI A,17      ;DIDN'T SKIP, RETURN 17 => UNSEEN
7210 IFN CREFSW,XCT CRFINU
7211         JRST CLBPOP
7212
7213 NONAME: MOVE SYM,-2(P)
7214         ETSM [ASCIZ /No arg/]
7215         SETZ SYM,
7216         POPJ P,
7217
7218                 ;.FORMAT
7219
7220 A.FORMAT:       PUSHJ P,AGETFD  ;GET FIRST FIELD (FORMAT #)
7221         MOVE B,CDISP    ;WORD TERMINATOR ENDED 1ST ARG =>
7222         TLNN B,DWRD
7223          JRST A.FOR1    ;RETURN CURRENT SPEC FOR THAT FORMAT.
7224         PUSH P,A
7225         PUSHJ P,AGETFD  ;GET SECOND FIELD (TABLE ENTRY FOR FORMAT NUMBER)
7226         POP P,B
7227         MOVEM A,FORTAB-10(B)
7228         JRST ASSEM1
7229
7230 A.FOR1: MOVE A,FORTAB-10(A)
7231         JRST CLBPOP
7232 \f
7233 A.BYTE: NOVAL
7234         CLEARM NBYTS    ;# BYTES ASSEMBLED
7235         CLEARM BYTMT    ;TOTAL ACTIVE BYTES IN TABLE
7236         MOVE A,[440700,,BYBYT]  ;POINTER TO NEW TABLE
7237         MOVEM A,BYTMP
7238 A.BY1:  PUSHJ P,AGETFD  ;GET FIELD, .GE. 0 => BYTE, .LT. 0 => HOLE
7239         MOVE C,ISAV
7240         TRNN C,IRFLD
7241         JRST A.BY2      ;NO FIELD
7242         MOVM B,A
7243         SKIPGE A
7244         TRO B,100
7245         IDPB B,BYTMP
7246         AOS BYTMT
7247 A.BY2:  TLNE CH1,DWRD   ;CDISP LEFT IN CH1 BY AGETFD
7248         JRST A.BY1      ;NOT WORD TERMINATOR
7249         SKIPN BYTMT     ;WORD TERMINATOR, ANY FIELDS?
7250         JRST A.BY3      ;NO, DO .WALGN AND RESET TO WORD MODE
7251         SETOM BYTM      ;ENTERING BYTE MODE
7252         MOVE A,[-LPDL,,PDL]
7253         CAMN A,ASSEMP
7254         SETOM BYTM1
7255         PUSHJ P,BYSET
7256         MOVE A,GLSPAS
7257         MOVEM A,GLSP1
7258         JRST ASSEM1
7259
7260                 ;RESET THE BYTE DESCRIPTOR TABLE POINTERS TO POINT TO NEW WORD
7261
7262 BYSET:  CLEARM BYTMC    ;COUNT OF BYTES PROCESSED THIS TABLE SCAN
7263         MOVE A,[440700,,BYBYT]  ;POINTER TO DESCRIPTOR TABLE
7264         MOVEM A,BYTMP
7265         ILDB A,BYTMP    ;FIRST DESCRIPTOR BYTE
7266         AOS BYTMC
7267         DPB A,[300600,,BYTWP]   ;DEPOSIT AS FIRST BYTE SIZE
7268         POPJ P,
7269
7270 A.BY3:  CLEARM BYTM     ;NO LONGER IN BYTE MODE
7271         MOVE A,[-LPDL,,PDL]
7272         CAMN A,ASSEMP
7273         SETZM BYTM1
7274         JRST A.WAL1
7275
7276 A.WALGN:        NOVAL
7277 A.WAL1: LDB A,[360600,,BYTWP]
7278         CAIN A,44
7279         JRST ASSEM1     ;ALREADY AT BEGINNING OF WORD
7280         MOVEI A,44
7281         DPB A,[360600,,BYTWP]   ;MAKE IT POINT TO BEGINNING OF WORD
7282         PUSHJ P,BYSET
7283         CLEARM T1
7284         JRST PBY1
7285 \f
7286 BYTIN1: CLEARM BYTMC
7287         MOVE A,[440700,,BYBYT]
7288         MOVEM A,BYTMP
7289 BYTINC: AOS A,BYTMC
7290         CAMLE A,BYTMT
7291         JRST BYTIN1
7292         ILDB A,BYTMP
7293         DPB A,[300600,,BYTWP]
7294         MOVEM A,T1
7295         HLLZ A,BYTWP
7296         IBP A
7297         TRNN A,-1
7298         JRST BYTINR
7299                 ;NEXT BYTE GOES IN NEXT WORD
7300 PBY1:   MOVE P,ASSEMP   ;PCONS NEEDS THIS.
7301         MOVEI A,WRD-1
7302         PUSH A,BYTW     ;INTO WRD,
7303         PUSH A,BYTRLC   ;INTO WRDRLC
7304         CLEARM BYTW
7305         SETZM BYTRLC
7306         MOVEI A,44
7307         DPB A,[360600,,BYTWP]
7308         MOVE AA,ASMOUT
7309         JRST @ASMOT4(AA) ;TO PBY4 OR PBY5 OR PBY3
7310
7311 PBY4:   SKIPE STGSW
7312          ETR ERRSWD
7313         PUSHJ P,PWRD    ;NOT IN CONST., OUTPUT WORD.
7314         AOSA CLOC
7315 PBY3:   JSP T,PCONS     ;OUTPUT INTO CONST.
7316 PBY5:   MOVE A,GLSPAS
7317         MOVEM A,GLSP1
7318 BYTINR: MOVE A,T1       ;CURRENT BYTE SIZE
7319         TRNN A,100
7320         JRST @ASMDSP
7321         SETZB A,B       ;ASSEMBLE HOLE (BLANK BYTE) IMMEDIATELY AFTER PREVIOUS BYTE
7322         JRST PBY2
7323
7324 PBYTE:  AOS NBYTS
7325 PBY2:   MOVEI AA,WRD-1
7326         PUSH AA,BYTW    ;INTO WRD
7327         PUSH AA,BYTRLC  ;INTO WRDRLC
7328         IBP BYTWP
7329         LDB T,[301400,,BYTWP]
7330         PUSHJ P,INTFLD
7331         POP AA,BYTRLC   ;WRDRLC
7332         POP AA,BYTW     ;WRD
7333         JRST BYTINC
7334
7335                 ;VARIABLES FOR .BYTE, .BYTC, .WALGN
7336
7337 VBLK
7338 BYTM:   0       ;-1 FOR IN BYTE MODE, LAMBDA BOUND BY <'S, ('S, AND ['S  ;]
7339 BYTMC:  0       ;COUNT CORRESP WITH BYTMP
7340 BYTMP:  0       ;POINTER TO BYTE DESC TABLE
7341 BYTMT:  0       ;TOTAL ACTIVE BYTES IN TABLE
7342 BYTM1:  0       ;GLOBAL VALUE OF BYTM - WHAT IT WAS OUTSIDE THE OUTERMOST BRACKET
7343
7344 ;FORMAT OF BYTE DESC TABLE
7345 ;SEVEN BIT BYTES
7346 ;1.7=0 ASSEMBLE =1 BLANK
7347 ;1.1 - 1.6 NUMBER OF BITS
7348
7349 IFNDEF LBYBYT,LBYBYT==5 ;LENGTH OF BYBYT
7350 BLCODE [BYBYT:  BLOCK LBYBYT]   ;BYTE DESC TABLE, 7 BITS PER DESC
7351
7352 BYTWP:  440000,,BYTW    ;POINTER TO BYTW IDPB TO DEPOSIT CURRENT BYTE
7353 BYTW:   0       ;WORD BEING ASSEMBLED IN BYTE MODE
7354 BYTRLC: 0       ;RELOC OF BYTW.
7355 NBYTS:  0       ;NUMBER BYTES ASSEMBLED (FOR .BYTC)
7356 BYTMCL==.-BYTMC
7357 PBLK
7358 \f;;MACRO PROCESSOR
7359 IFN MACSW,[
7360                 ;GET IN B THE CHAR WHOSE ADR IS IN A, INCREMENT A
7361
7362 REDINC: MOVE CH1,A
7363         IDIVI CH1,4
7364         LDB B,PTAB(CH2)
7365         AOJA A,CPOPJ
7366
7367 VBLK    ;THIS STUFF ALL RELOCATED WHEN MACTAB ADDR CHANGED.
7368 PTAB:   (341000+CH1)MACTBA      ;BYTE TABLE
7369         (241000+CH1)MACTBA
7370         (141000+CH1)MACTBA
7371         (41000+CH1)MACTBA
7372         (341000+CH1)MACTBA+1
7373
7374         ;IN FOLLOWING MACROS, B = -1, 0, OR +1 (+ SIGN MUST BE GIVEN)
7375         ;0 => BP SAME AS CHAR ADR, -1 => BP FOR ILDB, 1 => BP ONE AHEAD
7376
7377                 ;CHAR ADR IN A, RETURNS BP IN A, CLOBBERS A+1
7378
7379 DEFINE BCOMP A,B/
7380         IDIVI <A>,4
7381         ADD <A>,(<A>+1)BCOMPT!B
7382 TERMIN
7383
7384 STOPPT: 041000,,MACTBA-1
7385 BCOMPT: 341000,,MACTBA
7386         241000,,MACTBA
7387 BCOMPU: 141000,,MACTBA
7388         041000,,MACTBA
7389         341000,,MACTBA+1
7390
7391 ;BP IN A RETURN CHAR ADR IN A, CLOBBERS A-1 (YES, A MINUS 1)
7392 ;2ND ARG IS SUBTRACTED - -1 GIVES ADDR OF THE NEXT CHAR.
7393 DEFINE CCOMP A,B/
7394         MOVEI <A>-1,0
7395         ASHC <A>-1,2
7396         SUB <A>,(<A>-1)CCOMPT!B
7397 TERMIN
7398
7399                 ;BP IN A RETURN CHAR ADR IN A+1, CLOBBERS A
7400
7401 DEFINE CCOMP1 A,B/
7402         MULI <A>,4
7403         SUB <A>+1,(A)CCOMPT!B
7404 TERMIN
7405
7406 ;FROM HERE THRU CCOMPE SET BY MACINI.
7407 CCOMPB: 0       ;4*<41000,,MACTBA>-4
7408 CCOMPT: REPEAT 5,0      ;4*<41000,,MACTBA>+.RPCNT-3
7409 CCOMPE::PBLK
7410
7411                 ;BP IN A, DECREMENT IT
7412
7413 DEFINE DBPM A
7414         ADD A,[100000,,]
7415         SKIPGE A
7416         SUB A,[400000,,1]
7417 TERMIN
7418 \f
7419                 ;SET UP CPTR FROM CHAR ADR IN A
7420
7421 ACPTRS: MOVEI CH1,(A)   ;GET CHAR ADR IN CH1
7422         BCOMP CH1,-1    ;CONVERT TO BYTE POINTER
7423         MOVEM CH1,CPTR  ;STORE COMPUTED CPTR
7424         POPJ P,
7425
7426 AFCOMP: HRRZM A,FREEPT  ;ENTRY TO STORE C(A) INTO FREEPT
7427 FCOMP:  MOVE CH1,FREEPT ;COMPUTE FREPTB FROM FREEPT
7428         BCOMP CH1,-1
7429         MOVEM CH1,FREPTB        ;STORE CALCULATED BYTE POINTER
7430         POPJ P,
7431
7432 STPWR:  MOVEI A,375
7433         JRST PUTREL
7434
7435 VBLK
7436 PUT377: MOVEI A,377
7437 PUTREL: JRST PUTRE1     ;IDPB A,FREPTB;STORE CHAR INTO FREE CHARACTER STORAGE
7438         AOS A,FREEPT    ;CLOBBERS ONLY A.
7439         AOS PUTCNT
7440         CAMGE A,MACHI
7441         POPJ P,
7442         JRST GCA
7443 PBLK
7444 PUTRE1: PUSH P,[IDPB A,FREPTB]
7445         POP P,PUTREL    ;COME HERE ONLY ON 1ST CALL TO PUTREL.
7446         SETOM INICLB    ;HAVE WRITTEN IN MACRO TAB & CLOBBERED INIT.
7447         JRST PUTREL     ;NOW GO BACK AND REALLY WRITE CHAR.
7448
7449 ;200 BIT SET ON CHAR READ FROM MACTAB, PROCESS SPECIAL CONDITION
7450 ;CLOBBERS A,CH1,CH2.
7451
7452 MACTRM: CAIN A,176      ;376?
7453         JRST RCHTRA     ;376 => IGNORE, CHARACTER USED TO CLOBBER UNDESIRED CHARACTERS IN MACRO STORAGE
7454         PUSH P,B        ;SAVE B
7455         CAIE A,177
7456         CAIN A,175
7457         JRST MRCH1      ;377, 375 => STOP
7458         ADD A,BBASE     ;DUMMY, RELOCATE TO POINT TO DUMMY TABLE
7459         MOVEI B,RCHSAV  ;RETURN TO RCHSAV ON END OF DUMMY
7460         PUSHJ P,PUSHEM  ;SAVE CURRENT STATUS
7461         HRRZ A,(A)      ;GET CHAR ADR OF DUMMY
7462         BCOMP A,-1      ;CONVERT TO BYTE POINTER
7463         MOVEM A,CPTR    ;STORE AS NEW CPTR
7464         MOVE A,TOPP
7465         MOVEM A,BBASE
7466 RCHTRB: POP P,B
7467 RCHTRA: POP P,A ;POP RETURN
7468         TLZN FF,FLUNRD
7469         JRST -3(A)
7470         JRST -4(A)
7471
7472 MRCH1:  MOVE B,MACP
7473 BPOPJ:  POPJ B,         ;RETURN AT END OF STRING EXPANSION
7474 \f
7475                 ;RCHSET ROUTINE TO CAUSE INPUT FROM MACRO PROCESSOR
7476
7477 RCHMAC: TLO FF,FLMAC    ;SET FLAG
7478         JSP A,CPOPJ
7479 RCHMC0: REPEAT 2,[      ;GETCHR, RR1
7480         ILDB A,CPTR     ;GET CHAR
7481         TRZE A,200      ;200 BIT...
7482         PUSHJ P,MACTRM  ;=> SPECIAL, PROCESS
7483 ]
7484         .VALUE
7485 IFN .-RCHPSN-RCHMC0,.ERR RCHMC0 LOSES.
7486         ILDB A,CPTR     ;SEMIC
7487         TRZE A,200
7488         PUSHJ P,MACTRM
7489         CAIE A,15
7490         JRST SEMIC      ;NOT YET
7491         JRST SEMICR     ;YET
7492
7493                 ;PUSH INPUT STATUS IN FAVOR OF MACRO
7494                 ;B HAS RETURN ADR FOR END OF MACRO (OR WHATEVER)
7495                 ;SEE ALSO PMACP
7496
7497 PUSHEM: PUSH P,A
7498         PUSH P,F
7499         MOVE F,MACP     ;GET MACRO PDL POINTER
7500         MOVE CH1,CPTR
7501         CCOMP1 CH1,-1   ;CONVERT TO CHARACTER ADDRESS
7502         HRL CH2,BBASE
7503         PUSH F,CH2      ;PUSH BBASE,,CPTR
7504         MOVEI A,1       ;=> EXPAND MACRO
7505         PUSHJ P,PSHLMB  ;SAVE LIMBO1 STATUS AND RETURN
7506         JRST PSHM1
7507
7508                 ;UNDO A PUSHEM
7509                 ;RETURNS BBASE,,CPTR IN B (CPTR RE-INITIALIZED, BBASE NOT)
7510
7511 POPEM:  PUSH P,A
7512         PUSH P,F
7513         MOVE F,MACP
7514         PUSHJ P,POPLMB  ;RESTORE LIMBO1 STATUS
7515         POP F,B         ;BBASE,,CPTR
7516         MOVEI CH1,(B)   ;GET CHAR ADR IN CH1
7517         BCOMP CH1,-1    ;CONVERT TO BYTE POINTER
7518         MOVEM CH1,CPTR  ;STORE NEW CPTR
7519 PSHM1:  MOVEM F,MACP    ;STORE BACK MACRO PDL POINTER
7520 POPFAJ: POP P,F
7521 POPAJ:  POP P,A
7522         POPJ P,
7523 \f
7524 PMACP:  MOVE B,MACP     ;POP MACRO PDL
7525         HRRZ A,(B)
7526         SUB B,[1,,1]
7527 IFN RCHASW,CAIE A,A.TYM8
7528         CAIN A,AIRR
7529         JRST A.GO6      ;IRP OR .TTYMAC
7530         CAIN A,REPT1
7531         JRST A.GO4      ;REPEAT
7532         CAIE A,RCHSV1   ;MACRO
7533         CAIN A,RCHSAV   ;ARG
7534         JRST A.GO6
7535         .VALUE          ;DON'T HAVE RETURN,
7536         JRST A.GO6      ;BUT TRY A.GO6 LIKE EVERYTHING BUT REPEAT
7537
7538 A.GO4:  HLLZS -1(B)     ;REPEAT, CLEAR OUT COUNT REMAINING
7539 A.GO6:  TRO FF,FRMRGO   ;EVERYTHING ELSE, SET FLAG TO QUIT
7540         JRST (A)
7541
7542                 ;4.9(B) => .STOP ELSE .ISTOP
7543
7544 A.STOP: HRRZ A,MACP
7545         JUMPL B,A.STP1
7546         HRRZ B,(A)      ;.ISTOP
7547         CAIN B,REPT1
7548         HLLZS -2(A)     ;REPEAT, STOP ALL INTERATIONS
7549         CAIN B,AIRR
7550         HRRZS -1(A)     ;IRP TYPE, CLEAR OUT # GROUPS, DON'T ALLOW RECYCLE
7551 A.STP1: MOVE A,STOPPT
7552         MOVEM A,CPTR    ;CAUSE STOP
7553         JRST POPJ1
7554
7555 A.QOTE: JFCL
7556 ATERMI: ETSM [ASCIZ/Not in macro/]
7557         JRST MACCR      ;MAYBE FLUSH MESSAGE IF PEOPLE HAVE PROBLEMS
7558 \f
7559         ;PDL STRUCTURE FOR REPEAT
7560         ;TWO TWO WORD ENTRIES
7561         ;BBASE,,CPTR
7562         ;LIMBO1 STATUS,,# TIMES LEFT
7563         ;OLD .RPCNT,,BEG OF BODY
7564         ;GARBAGE,,REPT1
7565
7566 AREPEAT:        PUSHJ P,AGETFD
7567         JUMPLE A,COND5  ;NO REPEAT PLAY LIKE STRING COND FALSE
7568         PUSH P,A
7569         MOVE A,FREEPT
7570         MOVEM A,PRREPT  ;CHAR ADR BEGINNING OF REPEAT
7571         MOVEI A,373     ;CHECK CHAR FOR REPEAT
7572         PUSHJ P,PUTREL  ;STORE AS FIRST CHR OF BODY
7573         JSP D,RARL1
7574          CAIA
7575         CALL RARGCP     ;READ THE ARG & COPY INTO MACRO STORAGE.
7576         MOVEI A,^M      ;IF THE ARG WASN'T BRACKETED,
7577         TLNE FF,FLUNRD
7578          CALL PUTREL    ;INCLUDE THE TERMINATING CR.
7579 SWRET1: PUSHJ P,STPWR   ;ALSO RETURN FROM STRING WRITE (.F .I)
7580         POP P,B         ;# TIMES TO GO THROUGH
7581         PUSHJ P,PUSHEM
7582         MOVE B,MACP     ;NOW GET MACRO PDL POINTER FOR PUSH OF SECOND ENTRY
7583         MOVNI T,1
7584         EXCH T,CRPTCT   ;GET OLD .RPCNT, INITIALIZE NEW ONE TO -1
7585 CREPT1: SETZI TT,REPT1
7586         EXCH TT,PRREPT  ;GET LOC BEGINNING OF BODY, CLEAR OUT PRREPT, DON'T NEED IT ANYMORE
7587         HRL TT,T
7588         PUSH B,TT       ;SAVE OLD .RPCNT,,ADDRESS OF BODY.
7589         PUSH B,CREPT1   ;PUSH CRUD,,REPT1 FOR RETURN
7590         MOVEM B,MACP    ;STORE BACK UPDATED MACRO POINTER
7591         MOVE A,STOPPT
7592         MOVEM A,CPTR    ;CAUSE IMMEDIATE CYCLE
7593         JRST MACCR
7594
7595 IFN .I.FSW,[    ;CODING FOR .I, .F
7596
7597 SWINI:  MOVE A,FREEPT   ;INITIALIZE, WILL EVENTUALLY PLAY LIKE REPEAT 1
7598         MOVEM A,PRREPT
7599         MOVEI A,373
7600         JRST PUTREL
7601
7602 SWRET:  PUSH P,[1]      ;REPEAT COUNT
7603         JRST SWRET1
7604
7605 SWFLS:  MOVE A,PRREPT   ;FLUSH RETURN
7606         PUSHJ P,AFCOMP
7607         JRST MACCR
7608 ]
7609 \f
7610                 ;RECYCLE AROUND REPEAT
7611
7612 REPT1:  PUSH P,A
7613         PUSH P,C
7614         HRRZ A,(B)      ;CHAR ADR BEG BODY
7615         PUSHJ P,REDINC
7616         CAIE B,373
7617          HALT           ;FIRST CHAR OF REPEAT BODY NOT 373
7618         HRRZ C,MACP
7619         HRRZ B,-2(C)    ;# TIMES LEFT
7620         SOJL B,REPT2    ;JUMP IF LAST TIME THROUGH WAS LAST TIME TO GO THROUGH
7621         AOS CRPTCT
7622         PUSHJ P,ACPTRS  ;SET UP CPTR (CHAR ADR IN A)
7623         HRRM B,-2(C)    ;STORE UPDATED COUNTDOWN
7624 REPT3:  POP P,C
7625         POP P,A
7626         JRST REPT6
7627
7628 REPT2:  SOS A   ;MOVE BACK TO BEG OF REPEAT
7629                         ;(IN CASE GETS STORED INTO FREEPT)
7630         MOVE CH2,CPTR
7631         CCOMP CH2,-1    ;CONVERT TO CHARACTER ADDRESS
7632         CAMN CH2,FREEPT
7633         PUSHJ P,AFCOMP
7634         MOVE A,[-3,,-2]
7635         ADDB A,MACP
7636         HLRZ A,1(A)
7637         MOVEM A,CRPTCT
7638         PUSHJ P,POPEM
7639         JRST REPT3
7640 \f
7641                 ;STRING CONDITIONALS (IFSE, IFSN)
7642
7643 SCOND:  MOVE A,FREEPT
7644         MOVEM A,PRSCND
7645         MOVEM A,PRSCN1
7646         SAVE SYM
7647         HRRI B,SCONDF
7648         SAVE B          ;REMEMBER TEST INSTRUCTION.
7649         SETOB C,SCONDF
7650         JSP D,RARG      ;COPY THE 1ST OF THE 2 STRINGS
7651          CAIA
7652         CALL RARGCP     ;INTO MACRO STORAGE, FOLLOWED BY 375.
7653         CALL STPWR
7654         JSP D,RARG      ;THEN START READING THE 2ND ARG,
7655          JRST SCOND3    ;GO TO SCOND3 WHEN REACH END OF 2ND ARG.
7656         JSP D,RARGCH(T) ;READ NEXT CHAR OF 2ND ARG,
7657          JRST SCOND3
7658         EXCH A,PRSCND
7659         PUSHJ P,REDINC  ;RE-FETCH NEXT CHAR OF 1ST ARG
7660         EXCH A,PRSCND
7661         CAMN B,A        ;COMPARE CHARACTERS
7662          JRST RARGCH(T) ;CHARS EQUAL, KEEP COMPARING.
7663         CAIL A,"A+40
7664          CAILE A,"Z+40  ;NOT EQUAL => CONVERT BOTH TO UPPER CASE.
7665           CAIA
7666            SUBI A,40
7667         CAIL B,"A+40
7668          CAILE B,"Z+40
7669           CAIA
7670            SUBI B,40
7671         CAMN B,A        ;ARE THEY SAME EXCEPT FOR CASE?
7672          JRST RARGCH(T) ;CHARS EQUAL, KEEP COMPARING.
7673         CLEARM SCONDF   ;STRINGS DIFFER
7674         CALL RARFLS     ;IGNORE REMAINDER OF 2ND ARG.
7675 SCOND3: CLEARB A,C      ;END OF (SECOND) STRING ARG ENCOUNTERED
7676         EXCH C,PRSCN1
7677         MOVEM C,FREEPT
7678         PUSHJ P,FCOMP
7679         EXCH A,PRSCND
7680         PUSHJ P,REDINC
7681         CAIE B,375
7682         CLEARM SCONDF
7683         REST B
7684         REST SYM
7685         XCT B           ;DO THE TEST.
7686         JRST COND4
7687         JRST COND2
7688 \f
7689 VBLK
7690 BLCODE [DMYDEF: BLOCK DMDEFL]   ;TABLE OF DUMMY NAMES FOR THING BEING DEFINED
7691 DMYTOP: DMYDEF          ;POINTER INTO DMYDEF, POINTS TO AVAILABLE WORD
7692                 ;SINCE ONLY ONE THING CAN BE DEFINED AT ONCE, IT IS NOT NECESSARY TO SAVE AND RESTORE DMYTOP
7693 DMYBOT: DMYDEF  ;-> 1ST DMYDEF WD USED AT THIS LEVEL.
7694         ;RIGHT NOW, ALWAYS -> DMYDEF SINCE CAN'T HAVE DEFINITION
7695         ;WITHIN A DEFINITION YET.
7696
7697 PBLK
7698
7699 PDEF:   PUSHJ P,GSYL    ;READ IN SYL
7700         CAIE T,",       ;IF DELIMITING CHR NOT ,
7701          JUMPE SYM,CPOPJ        ;AND SYM NULL, RETURN
7702 PDEF1:  MOVEM SYM,@DMYTOP       ;STORE SYM
7703         AOS D,DMYTOP            ;INCR PNTR
7704         CAIL D,DMYDEF+DMDEFL    ;CHECK FOR TABLE SIZE EXCEEDED
7705          ETF [ASCIZ/Too many dummies in DEFINE or IRP/]
7706         POPJ P,
7707
7708 VBLK
7709 BLCODE [DSTG:   BLOCK DSSIZ]    ;TABLE OF CHAR ADRS OF DUMMIES BEING DEFINED PRIOR TO MACRO EXPANSION
7710 RDWRDP: DSTG            ;POINTER TO DSTG, POINTS TO FREE WORD
7711                 ;NOTE THAT RDWRDP MUST BE SAVED AND RESTORED SINCE MORE MACROS CAN
7712                 ;BE EXPANDED DURING FIELD READ FOR DUMMY
7713 PBLK
7714
7715 ADDTR1: CLEARM PUTCNT
7716 ADDTRN: MOVE A,FREEPT
7717 ADDTR2: MOVEM A,@RDWRDP
7718         AOS A,RDWRDP
7719         CAIL A,DSTG+DSSIZ
7720          ETF [ASCIZ/Too many dummies in all macros & IRPs being expanded/]
7721         RET
7722
7723 VBLK
7724 BLCODE [DMYAGT: BLOCK DMYAGL]   ;TABLE OF CHAR ADRS OF DUMMYS OF MACROS BEING EXPANDED
7725                 ;DMYAGT TRACKS WITH THE MACRO PDL;
7726                 ;DMYAGT CAN'T BE COMBINED WITH DSTG SINCE DMYAGT CAN BE SHIFTING AROUND RANDOMLY DURING ARG SCAN
7727 BBASE:  DMYAGT          ;POINTER TO BEGINNING OF ACTIVE DUMMY LIST (FOR DEEPEST-NESTED MACRO BEING EXPANDED)
7728                 ;ADD TO DUMMY # TO GET LOCATION CONTAINING CHAR ADR OF DUMMY
7729 TOPP:   DMYAGT          ;POINTER TO TOP OF DMYAGT ACTIVE, POINTS TO FREE REGISTER
7730 PBLK
7731
7732                 ;ACTIVATE DUMMYS ON TOP OF DSTG TABLE
7733                 ;A -> FIRST (LOWEST) DUMMY IN DSTG TO ACTIVATE
7734
7735 DMYTRN: MOVE B,TOPP
7736         MOVEM B,BBASE
7737         PUSH P,A
7738 DMYTR2: CAML A,RDWRDP
7739         JRST DMYTR1
7740         MOVE B,(A)
7741         MOVEM B,@TOPP
7742         AOS B,TOPP
7743         CAIL B,DMYAGT+DMYAGL
7744          ETF [ASCIZ /Too many dummy args active/]
7745         AOJA A,DMYTR2
7746 DMYTR1: POP P,RDWRDP
7747         POPJ P,
7748 \f
7749 ;THE MACRO TABLE IS FILLED MAINLY WITH 8-BIT BYTES.
7750 ;THE FIRST WORD'S ADDR IS IN MACTAD; THE LAST+1'S IN MACTND.
7751 ;THE CHARACTER NUMBER OF THE LAST+1ST CHAR IS IN MACHI.
7752 ;MACHIB IS BP. TO HIGHEST BYTE OK TO FILL (LAST IN C(MACTND)-1)
7753
7754 ;IF A BYTE IN THE TABLE HAS ITS HIGH BIT OFF, IT IS AN ASCII CHARACTER.
7755 ;OTHERWISE, IT IS SPECIAL. IF THE 100 BIT IS OFF IT MEANS
7756 ;SUBSTITUTE A MACRO DUMMY ARG WHEN READ; THE CHAR IS THE NUMBER OF THE ARG+200 .
7757
7758 ;377 AND 375  ARE STOP CODES, CAUSING A POP OUT OF THE CURRENT STRING.
7759 ;GC CONSIDERS THE CHAR. AFTER A 375 TO START A NEW STRING.
7760
7761 ;376 IS IGNORED WHEN READ; USED TO CLOBBER UNWANTED CHARACTERS IN STRINHGS.
7762
7763 ;374 STARTS EVERY MACRO-DEFINITION.
7764 ;373 STARTS THE BODY OF A REPEAT.
7765
7766 ;370 STARTS A WORD STRING:
7767 ;THE WORD AFTER THAT WHICH CONTAINS THE 370
7768 ; HAS THE LENGTH IN WORDS OF THE STRING IN ITS LH,
7769 ; IN ITS RH, THE ADDRESS OF WD WHICH POINTS BACK TO THIS ONE.
7770 ; THEN FOLLOW RANDOM WDS HOLDING ANYTHING AT ALL.
7771 ; GC WILL MAKE SURE IT STAYS ON WD BOUNDARY.
7772 ; THE LENGTH INCLUDES THE WD HOLDING THE LENGTH.
7773 ; IF THE RH OF 1ST WD HAS 0, GC WILL FLUSH THE STRING
7774
7775 STRTYP: PUSHJ P,REDINC  ;DEBUGGING AID ONLY
7776         EXCH A,B
7777         TRZE A,200
7778         JRST STRTP1
7779 STRTP2: PUSHJ P,TYO     ;NORMAL CHAR, JUST TYPE OUT
7780         MOVE A,B
7781         JRST STRTYP
7782
7783 STRTP1: PUSH P,A
7784         MOVEI A,"*      ;SPECIAL CHAR, TYPE *
7785         PUSHJ P,TYO
7786         POP P,A
7787         TRNE A,100
7788         JRST STRTP3     ;CONTROL CHAR
7789         ADDI A,260      ;DUMMY, CONVERT TO #
7790         JRST STRTP2     ;TYPE OUT (SINGLE DIGIT) NUMBER
7791
7792 STRTP3: CAIN A,175
7793         SKIPA A,C%      ;STOP, TYPE %
7794         MOVEI A,"/      ;SOMETHING ELSE, TYPE /
7795         JRST STRTP2
7796
7797
7798                 ;.GSSET, SET GENERATED SYM COUNTER
7799
7800 A.GSSET:        CALL AGETFD
7801         MOVEM A,GENSM
7802         JRST ASSEM1
7803 \f
7804                 ;GSYL-LIKE ROUTINE, READ A SYL FOR WRQOTE
7805
7806 WRQRR:  PUSHJ P,RCH     ;GET CHAR (MAYBE WANT THIS TO BE FASTER YET)
7807         IDPB A,FREPTB   ;DEPOSIT IN MACRO TABLE
7808         CAMN F,FREPTB   ;WAS THIS LAST CHAR IN TABLE?
7809         JRST WRQRGC     ;YES, NEED GARBAGE COLLECTION
7810 WRQRR2: XCT GDTAB(A)    ;DISPATCH ON CHAR
7811         JFCL            ;(MAYBE SKIPS)
7812         SOJGE D,WRQRR   ;LOOP FOR FIRST SEVEN CHARS
7813         HRRI D,0
7814         JRST WRQRR
7815
7816                 ;HERE FROM WRQRR WHEN NEED GARBAGE COLLECTION OF MACRO TABLE
7817
7818 WRQRGC: MOVEM C,WRQTBP  ;PUT POINTER TO BEGINNING OF SYL WHERE IT WILL BE GC'D
7819         MOVE A,MACHI
7820         PUSHJ P,GCA     ;GARBAGE COLLECT
7821         MOVE F,MACHIB   ;RESET F TO POINT TO NEW LAST CHAR IN MACTAB
7822         MOVEI C,0
7823         EXCH C,WRQTBP   ;GET BACK POINTER TO CHAR BEFORE SYL
7824         MOVE A,LIMBO1   ;RETRIEVE LAST CHAR READ
7825         JRST WRQRR2     ;LOOP BACK, PROCESS CHAR
7826
7827                 ;HERE FROM WRQOTE IF .QUOTE SEEN
7828                 ;.QUOTE TAKES ARG LIKE ASCII, PRINTC, ETC.
7829
7830 A.QOT1: MOVE A,WRQBEG(P) ;GET BACK BP TO CHAR BEFORE .QUOTE
7831         PUSHJ P,A.QOTS  ;SET UP FREEPT AND FREPTB PROPERLY
7832         MOVE A,LIMBO1   ;NOW GET CHAR AFTER .QUOTE
7833         CAIE A,^I
7834         CAIN A,40       ;COMPARE WITH SPACE
7835         PUSHJ P,RCH     ;SPACE, GOBBLE NEXT CHAR FOR DELIMITER, ELSE THIS ONE
7836         MOVEM A,A.QOT2  ;STORE AS TERMINATOR OF STRING
7837 A.QOT3: PUSHJ P,RCH     ;GET CHAR TO QUOTE
7838         CAMN A,A.QOT2   ;TERMINATOR?
7839         JRST WRQOT1     ;TERMINATOR, BACK FOR MORE DEFINITION
7840         PUSHJ P,PUTREL  ;DEPOSIT CHAR
7841         JRST A.QOT3
7842 \f
7843                 ;READ IN BODY OF MACRO, IRP, OR WHATEVER
7844
7845 WRQOTE: SAVE [0]        ;USED FOR LENGTH OF SYMBOL (REALLY 6 MINUS IT).
7846 WRQLEN==,-2
7847         SAVE [0]        ;THIS WD USED FOR DEFINE/TERMIN COUNT.
7848 WRQLVL==,-1
7849         SAVE [0]        ;USED TO REMEMBER BEGINNING OF SYMBOL.
7850 WRQBEG==0
7851         SETOM INICLB    ;CLOBBERED INITS, .SYMTAB NOW ILLEGAL.
7852         PUSHJ P,RCH     ;MAYBE POP UP A LEVEL IN EXPANSIONS, SAVE MACTAB SPACE
7853         TLO FF,FLUNRD   ;CAUSE CHAR TO BE RE-INPUT
7854         MOVE F,MACHIB   ;POINTER TO LAST CHAR OK TO PUT IN MACTAB, STAYS IN F
7855         TRO I,IRSYL\IRLET       ;MAKE SURE FLAGS SET SO WON'T WASTE TIME AT MAKNUM, POINT
7856 WRQOT0:
7857 WRQOT1: MOVEI D,6       ;SQUOZE COUNTER
7858         MOVEI SYM,0     ;INITIALIZE SYM
7859         MOVE C,FREPTB   ;GET POINTER TO CHAR BEFORE SYL ABOUT TO READ
7860         PUSHJ P,WRQRR   ;READ SYL
7861         JUMPE SYM,.-2   ;LOOP UNTIL NON-NULL
7862                 ;NOW SEE IF DUMMY; **NOTE**: C STILL HAS BYTE POINTER, A SYL TERMINATOR
7863         MOVE B,DMYBOT
7864         CAML B,DMYTOP
7865         JRST WRQOT2     ;NOT DUMMY
7866         CAME SYM,(B)    ;COMPARE WITH DUMMY NAME
7867         AOJA B,.-3      ;LOOP ON NO MATCH
7868         SUB B,DMYBOT    ;DUMMY, CONVERT TO NUMBER + 200
7869         SUBI B,200
7870         LDB T,C         ;GET LAST CHAR BEFORE SYL
7871         CAIE T,"!       ; ^ NOTE THAT THIS CAN LOSE IF MACRO HAS 33. ARGS
7872         IDPB B,C        ;NOT EXCLAMATION POINT, LEAVE THERE, DEPOSITING DUMMY CHAR
7873         CAIN T,"!
7874         DPB B,C         ;EXCL, WIPE IT OUT
7875         MOVEM C,FREPTB  ;RESET FREPTB
7876         CAIE A,"!       ;A HAS DUMMY TERMINATOR, COMPARE WITH EXCL
7877         TLO FF,FLUNRD   ;NOT EXCLAMATION POINT, CAUSE IT TO BE RE-INPUT
7878         JRST WRQOT1     ;LOOP BACK FOR NEXT SYL
7879
7880 ;SYL ISN'T DUMMY, CHECK FOR PSEUDO
7881 WRQOT2: MOVEM D,WRQLEN(P) ;REMEMBER START OF AND LENGHTH OF THE SYMBOL.
7882         MOVEM C,WRQBEG(P)
7883         SETOM ESBK      ;EVAL IN CURRENT BLOCK.
7884         PUSHJ P,ES      ;EVALUATE SYM (DOESN'T CLOBBER F)
7885         JRST WRQOT0     ;NOT SEEN
7886         CAIE A,PSUDO/40000
7887         JRST WRQOT0     ;NOT PSEUDO
7888         TLZ B,-1        ;CLEAR OUT LH OF VALUE, ONLY INTERESTED IN RH
7889         CAIN B,A.QOTE
7890         JRST A.QOT1     ;.QUOTE
7891         CAIE B,ADEFINE
7892         CAIN B,AIRP
7893         AOS WRQLVL(P)   ;DEFINE OR IRP
7894 IFN RCHASW,[CAIN B,A.TTYM
7895         AOS WRQLVL(P)   ;.TTYMAC
7896 ]
7897         CAIE B,ATERMIN
7898          JRST WRQOT0
7899         SKIPGE WRQLEN(P)
7900          ETR [ASCIZ /TERMIN longer than 6 chars/]
7901         SOSL WRQLVL(P)  ;TERMIN, SKIP IF THE TERMINATING ONE
7902          JRST WRQOT0    ;NOT MATCHING TERMIN, BACK FOR NEXT SYL
7903         POP P,A         ;GET BACK BP TO LAST CHAR BEFORE TERMIN
7904         SUB P,[2,,2]    .SEE WRQLVL,WRQBEG
7905         MOVE T,DMYBOT   ;WE'RE NO LONGER USING SPACE IN DMYDEF.
7906         MOVEM T,DMYTOP
7907 A.QOTS: LDB T,A         ;HERE ALSO FROM A.QOT1, GET CHAR BEFORE .QUOTE OR TERMIN
7908         CAIE T,"!
7909         JRST A.QTS2     ;NOT EXCLAMATION POINT => OK
7910         DBPM A,         ;EXCLAMATION POINT, DECREMENT POINTER
7911 A.QTS2: MOVEM A,FREPTB  ;STORE AS NEW FREPTB
7912         CCOMP1 A,-1     ;CONVERT TO CHAR ADR
7913         MOVEM B,FREEPT  ;STORE CHAR ADR AS NEW FREEPT
7914         POPJ P,
7915 \f
7916 ;FORMAT OF A MACRO:
7917 ;IT STARTS WITH A 374.
7918 ;THEN COME ARGUMENT DESCRIPTORS, ONE PER ARGUMENT.
7919 MCF==777650     ;BITS AND FIELDS ARE:
7920 MCFDEF==200     ;ARG IS DEFAULTED. MCFDEF AND MCFGEN NEVER BOTH SET.
7921 MCFGEN==100     ;ARG SHOULD BE GENSYMMED IF NOT GIVEN IN CALL.
7922 MCFKWD==40      ;ARG IS A KEYWORD ARG, SELECTED BY <ARGNAME>= RATHER THAN POSITION.
7923 MCFSYN==7       ;FIELD THAT SPECIFIES THE ARGUMENT'S SYNTAX.
7924  MCFNRM==1      ;MCFSYN CONTAINS MCFNRM => NORMAL-SYNTAX ARG
7925  MCFLIN==2      ;MCFSYN CONTAINS MCFLIN => WHOLE LINE ARG
7926  MCFBAL==3      ;MCFSYN CONTAINS MCFBAL => BALANCED ARG
7927  MCFSTR==4      ;MCFSYN CONTAINS MCFSTR => ARG IS A DELIMITED STRING, AS IN "ASCIZ".
7928  MCFEVL==5      ;MCFSYN CONTAINS MCFEVL => ARG IS BY VALUE (PREEVALUATED).
7929 ;IF MCFKWD IS SET, THE DESCRIPTOR IS FOLLOWED BY THE NAME OF THE ARGUMENT,
7930 ;TERMINATED BY A 377.
7931 ;IF MCFDEF IS SET, THE DESCRIPTOR IS FOLLOWED BY THE DEFAULT VALUE OF THE ARG,
7932 ;TERMINATED BY A 377.
7933 ;IF MCFKWD AND MCFDEF ARE BOTH SET, THE ARG NAME COMES FIRST.
7934 ;A ZERO BYTE ENDS THE DESCRIPTOR LIST.
7935 ;THEN COMES THE BODY OF THE MACRO, FOLLOWED BY A 375.
7936
7937 ADEFINE:        NOVAL   ;ERROR IF CONTEXT WANTS A VALUE.
7938         SAVE CASSM1     ;RETURN TO ASSEM1 EVENTUALLY
7939         JSP TM,ERMARK   ;ERR MSGS SHOULD SAY WE'RE INSIDE A DEFINE.
7940         SAVE SYM        ;THESE 2 PUSHES ARE FOR NONAME'S SAKE.
7941         SAVE SYM
7942         CALL GETSLD
7943          CALL NONAME
7944         TLZ FF,FLUNRD
7945         SUB P,[2,,2]
7946         SAVE SYM
7947         SAVE ESBK       ;SAVE BLOCK TO DEFINE IN FOR ES'S SAKE.
7948 IFN CREFSW,XCT CRFMCD
7949         CALL A.TYM1
7950         POP P,ESBK
7951         REST SYM
7952         PUSHJ P,ESDEF   ;FIND SLOT IN SYMBOL TABLE FOR IT
7953          TLO C,3MACOK   ;NEVER SEEN, OK TO MAKE MACRO.
7954         TLON C,3MACOK   ;ELSE ERROR IF NUMERIC OR ALREADY USED.
7955          ETSM [ASCIZ/Non-macro made macro/]
7956         MOVEI B,MACCL   ;RH(VALUE) = MACCL
7957         HRL B,PRDEF     ;LH(VALUE) = CHAR ADR OF MACRO
7958         CLEARM PRDEF    ;NO LONGER NEED PRDEF
7959         MOVSI T,PSUDO   ;SYMBOL TABLE ENTRY LOOKS LIKE PSEUDO
7960         JRST VSM2
7961
7962 IFN RCHASW,[
7963         ;.TTYMAC NAME
7964         ;BODY
7965         ;TERMIN
7966
7967         ;NAME DUMMY, CAUSES READIN OF CRUD FROM TTY -> CR (NOT INCLUSIVE)
7968
7969 A.TTYM: JSP TM,ERMARK   ;ERROR MSGS SHOULD SAY WE'RE INSIDE A .TTYMAC
7970         CALL A.TYM1     ;READ IN A MACRO-DEFINITION.
7971         MOVEI A,40      ;DON'T LET THE CHAR ENDING THE TERMIN
7972         MOVEM A,LIMBO1  ;MAKE MACCL THINK THERE ARE NO ARGS.
7973         CALL GTYIP1     ;PUSH INTO TTY FOR INPUT
7974         HRLZ B,PRDEF    ;PHONY UP A MACRO WHOSE DEFN IS WHAT WE READ.
7975         SETZM PRDEF
7976         MOVEI A,A.TYM8
7977         JRST A.TYM2     ;CALL THE MACRO:
7978                 ;READ THE ARGS, POP OUT OF TTY, EXPAND THE MACRO
7979                 ;AND THEN EXIT TO A.TYM8
7980 ]
7981 \f
7982 A.TYM1: MOVE A,FREEPT
7983         MOVEM A,PRDEF
7984         MOVEI LINK,MCFNRM       ;INITIALLY, DUMMIES ARE NORMAL.
7985         MOVEI A,374
7986         PUSHJ P,PUTREL  ;MARK BEGINNING OF MACRO
7987 DEFNI:  MOVE T,LIMBO1
7988         MOVE A,LINK
7989 DEFNC:  CAIE T,12
7990          CAIN T,15
7991           JRST DEFNA    ;NO MORE ARGS (DONE WITH LINE)
7992         CAIE T,LBRACE
7993          CAIN T,LBRKT
7994           JRST DEFNB1
7995         CAIE T,RBRACE
7996          CAIN T,RBRKT
7997           JRST DEFNB2
7998         CAIE T,"<       ;OPENS TURN ON BALANCEDNESS.
7999          CAIN T,"(
8000           JRST DEFNB1
8001         CAIE T,">       ;CLOSES TURN OFF BALANCEDNESS.
8002          CAIN T,")
8003           JRST DEFNB2
8004         CAIN T,"?       ;? TURNS BALANCEDNESS ON OR OFF.
8005          JRST DEFBAL
8006         CAIN T,"+       ;+ COMPLEMENTS KEYWORDNESS
8007          XORI LINK,MCFKWD
8008         CAIN T,"\       ;\ COMPLEMENTS GENSYMMEDNESS
8009          XORI LINK,MCFGEN
8010         CAIN T,"-       ;- TURNS WHOLELINENESS ON OR OFF.
8011          JRST DEFWHL
8012         CAIN T,"*       ;* TURNS ASCIZ-STYLE-NESS ON OR OFF.
8013          JRST DEFASC
8014         CAIN T,"#       ;# TURNS EVALUATEDNESS ON OR OFF.
8015          JRST DEFEVL
8016         CAIN T,":       ;: MAKES FOLLOWING ARGS NORMAL
8017          MOVEI LINK,MCFNRM      ;IN ALL RESPECTS
8018         CAIN T,";
8019          JRST DEFNSM    ;ALLOW DEFINE LINE TO BE COMMENTED
8020 DEFND:  SAVE A
8021         CALL GSYL       ;READ IN SYMBOL AS SQUOZE IN SYM.
8022         REST A
8023         CAIN T,"/       ;/ MEANS PREVIOUS ARG IS WHOLE-LINE.
8024          XORI LINK,MCFLIN#MCFNRM
8025         JUMPE SYM,DEFNC ;JUMP IF SYMBOL NAME WAS NULL.
8026         CALL PDEF1      ;ELSE PUSH IT ON LIST OF DUMMIES.
8027         MOVE A,LINK
8028         CAIE T,"=
8029          JRST DEFNL
8030         IORI A,MCFDEF   ;ONE ARG, WITH DEFAULT VALUE.
8031         ANDCMI A,MCFGEN ;NOT TO BE GENSYMMED.
8032 DEFNL:  CALL PUTREL     ;OUTPUT A DESCRIPTOR FOR THIS ARG
8033         TRNE LINK,MCFKWD
8034          CALL DEFNM     ;PUT OUT ARG NAME IF KWD ARG
8035         CAIE T,"=       ;THEN DEFAULT VALUE IF DEFAULTED.
8036          JRST DEFNI
8037         JSP D,RARG      ;INIT. FOR READING THE DEFAULT VALUE.
8038          CAIA
8039         CALL RARGCP     ;COPY THE ARG INTO MACRO SPACE,
8040         CALL PUT377     ;TERMINATED BY A 377.
8041         JRST DEFNI      ;NOW FOR THE NEXT ARG.
8042
8043 DEFNM:  MOVE D,[440700,,STRSTO]
8044 DEFNM1: ILDB A,D
8045         CAMN D,STRPNT
8046          JRST PUT377
8047         CALL PUTREL
8048         JRST DEFNM1
8049
8050 DEFEVL: SKIPA A,[MCFEVL]        ;TURN EVALUATEDNESS ON OR OFF.
8051 DEFASC: MOVEI A,MCFSTR          ;TURN ASCIINESS ON OR OFF.
8052         JRST DEFN9
8053
8054 DEFBAL: SKIPA A,[MCFBAL]        ;TURN ON BALANCEDNESS, BUT IF ALREADY ON TURN OFF.
8055 DEFWHL:  MOVEI A,MCFLIN         ;SIMILAR FOR WHOLELINENESS.
8056 DEFN9:  LDB B,[.BP MCFSYN,LINK]
8057         CAMN A,B                ;IF CURRENT STATE IS SAME AS IN A,
8058          MOVEI A,MCFNRM         ;SWITCH TO NORMAL MODE INSTEAD.
8059         DPB A,[.BP MCFSYN,LINK]
8060         JRST DEFND
8061
8062 DEFNB2: SKIPA A,[MCFNRM]        ;TURN OFF BALANCEDNESS
8063 DEFNB1: MOVEI A,MCFBAL          ;TURN ON BALANCEDNESS
8064         DPB A,[.BP MCFSYN,LINK]
8065         JRST DEFND
8066
8067 DEFNSM: PUSHJ P,RCH     ;SEMICOLON IN DEFINE LINE
8068         CAIE A,15
8069         CAIN A,12
8070 DEFNA:  SKIPA A,LINK    ;END OF DEFINE LINE, GET COUNT
8071         JRST DEFNSM
8072         MOVEI A,0
8073         PUSHJ P,PUTREL  ;DEPOSIT END-OF-DESCRIPTORS MARK
8074         PUSHJ P,RCH
8075         CAIE A,12
8076         TLO FF,FLUNRD   ;CHAR AFTER CR NOT LF
8077         PUSHJ P,WRQOTE  ;READ IN BODY
8078         JRST STPWR
8079 \f
8080 ;COME HERE TO EXPAND MACRO; LH OF B POINTS TO STRING.
8081 ;SYM HOLDS NAME OF MACRO (USED BY CALL TO AGETFD IN MACEVL).
8082 MACCL:  JSP TM,ERMARK   ;ERROR MESSAGE DURING ARG SCAN SHOULD SAY WE'RE IN IT.
8083         MOVEI A,RCHSV1
8084 A.TYM2: SAVE I
8085         AOS PRCALP
8086         AOS MDEPTH
8087         SAVE RDWRDP
8088         SAVE A          ;RCHSV1 FOR MACRO, A.TYM8 FOR .TTYMA
8089         MOVEI LINK,0
8090         HLRZ A,B
8091         PUSHJ P,REDINC
8092         CAIE B,374
8093          HALT
8094         MOVEM A,@PRCALP
8095         PUSHJ P,REDINC
8096         JUMPE B,[TLO FF,FLUNRD  ;SAVE CHR FOLLOWING MACRO W/NO ARGUEMENTS
8097                 TLZ I,ILPRN     ;SUCH MACROS
8098                 SKIPE B,ASMOUT  ;IF WITHIN A GROUPING,
8099                  CAIN B,4
8100                   JRST MACNX0
8101                 JSP LINK,SAVAS2 ;RESTORE ASMDSP TO NORMAL IN CASE
8102                 JRST MACNX0]    ;THE CHAR BEING REREAD IS A CLOSE.
8103         TLZ I,ILPRN
8104         MOVE A,LIMBO1
8105         CAIE A,15
8106          CAIN A,12
8107           JRST MACCLD   ;NO ARGS IN THIS CALL; NULLIFY ALL ARGS.
8108         CAIE A,"<
8109          CAIN A,"(
8110           TLO I,ILPRN   ;BUT MAYBE THERE IS A (. IF SO, IT'S A PAREN'D CALL,
8111         CAIN A,LBRKT    ;AND WON'T END TILL THE MATCHING CLOSE.
8112          TLO I,ILPRN
8113         CAIE A,40       ;IF THE CHAR ENDING THE MACRO NAME ISN'T AN OPENPAREN,
8114          CAIN A,^I      ;EOL, OR SPACE, RE-READ IT AS PART OF 1ST MACRO ARG.
8115           JRST MACNX0
8116         TLNN I,ILPRN
8117          TLO FF,FLUNRD
8118 MACNX0: TDZ LINK,LINK
8119 MACNXD: CALL MACDES     ;FETCH NEXT DESCRIPTOR
8120          JRST MACPUS    ;NO MORE => THIS IS END OF THE CALL
8121         TRNE LINK,MCFKWD
8122          JRST MACK      ;KEYWORD PARAM => SPECIAL SCANNER
8123 ;READ IN THE VALUE OF THE NEXT ARG, WHICH IS NORMAL (NOT KEYWORD)
8124 MACNRM: CALL ADDTRN     ;PUSH WORD TO HOLD VALUE OF ARG ONTO DSTG,
8125                         ;INITIALIZED -> FREEPT, WHERE WE WILL NOW WRITE THE ARG.
8126         SOS C,A         ;TELL MACRED WHERE THAT WORD IS.
8127         CALL MACRED     ;READ IN THE ARGUMENT VALUE.
8128          JRST MACNXD    ;THEN HANDLE ANOTHER ARG
8129          .VALUE
8130         JRST MACCLD     ;END OF ARG LIST => NULLIFY REMAINING ARGS.
8131 \f
8132 ;READ IN THE NEXT MACRO ARGUMENT ACC TO SYNTAX FLAGS IN LINK.
8133 ;C HAS ADDRESS OF WORD ON THE RDWRDP STACK WHICH HOLDS THE POINTER TO THIS ARG
8134 ;IN CASE WE WISH TO SET THE ARG TO THE NULL STRING.  B AND LINK NOT CLOBBERED.
8135 ;RETURNS SKIPPING TWICE IF NO ARG BECAUSE END OF MACRO CALL SEEN.
8136 MACRED: MOVEI D,MACNXR  ;RARL3, RARB, RARGBR RETURN TO MACNXR
8137         CALL RCH
8138         CAIE A,^M
8139          CAIN A,^J
8140           JRST MACEND   ;MAYBE WE HAVE REACHED THE END OF THE MACRO CALL.
8141         LDB B,[.BP MCFSYN,LINK]
8142         CAIN B,MCFLIN
8143          JRST RARL3     ;ELSE, IF WHOLELINE ARG, NOTHING ELSE TO CHECK,
8144                         ;SO INIT FOR READING IT IN.
8145         CAIN A,",
8146          JRST MACNUL    ;NON-WHOLELINE ARG IS NULL IF NEXT CHAR IS COMMA
8147         CAIN A,";       ;SEMICOLON ENDS ARG LIST UNLESS INSIDE WHOLELINE ARG
8148          JRST MACEND
8149         CAIN B,MCFBAL
8150          JRST RARB      ;FOR BALANCED ARG, NOTHING ELSE SPECIAL, SO INIT.
8151         CAIN B,MCFSTR
8152          JRST MACSTR
8153         CAIN B,MCFEVL   ;FOR EVALUATED ARG, READ FIELD AND EXPRESS AS NUMERAL.
8154          TLOA FF,FLUNRD  ;AND THE CHAR WE JUST READ WAS THE 1ST CHAR OF THE FIELD.
8155         CAIN A,"\       ;NORMAL ARG STARTING WITH "\" TREATED THE SAME WAY, BUT FIELD
8156          JRST MACEVL     ;STARTS WITH NEXT CHAR.
8157         CAIN A,LBRKT
8158          JRST RARGBR    ;FOR ORDINARY ARG, OPEN-BRACKET MAKES IT SPECIAL
8159 IFN BRCFLG,[
8160         CAIN A,LBRACE
8161          JRST RARGRR
8162 ]
8163         MOVEI T,RARGN   ;OTHERWISE IT'S A NORMAL ARG
8164         TLOA FF,FLUNRD  ;AND THE CHAR WE RCH'ED IS THE 1ST CHAR OF IT
8165 MACNXR:  JRST MACEN1    ;NON-SKIP RETURN FROM RARB, RARL3 OR RARGBR => ARG NULL
8166         CALL RARGCP     ;ARG NON-NULL => COPY IT INTO STRING SPACE
8167         CAIE A,";
8168 CSTPWR:  JRST STPWR     ;AND TERMINATE IT
8169 MACSC:  MOVE A,(C)      ;EXCEPT THAT SEMICOLONS INVALIDATE ALL THE SPACES
8170         CAME A,FREEPT   ;AND TABS THAT PRECEDE THEM.
8171          JRST STPWR     ;IF, AS A RESULT OF THAT, THE ARG IS NULL, END THE ARGLIST.
8172 ;COME HERE WHEN THE END OF THE MACRO'S WHOLE ARGLIST IS SEEN.
8173 MACEND: TLO FF,FLUNRD
8174 MACEN1: AOS (P)         ;2-SKIP RETURN FROM MACRED INDICATES END OF ARGLIST
8175         AOS (P)         ;END OF ARGLIST => THIS ARG IS NULL.
8176 ;COME HERE TO NULLIFY CURRENT ARG (WHERE C POINTS)
8177 MACNUL: TRZE LINK,MCFDEF
8178          JRST MACDEF    ;MAYBE DEFAULT IT
8179         TRNE LINK,MCFGEN
8180          JRST MACGEN    ;MAYBE GENSYM IT
8181         SETZM (C)       ;ELSE SET TO NULL STRING.
8182         RET
8183
8184 MACST1: CALL RCH
8185         CAIN A,",
8186          JRST MACNUL
8187 MACSTR: CAIE A,40       ;HERE FOR ARG DELIMITED LIKE TEXT STRINGS: /TEXT/.
8188          CAIN A,^I      ;SKIP ALL SPACES AND TABS BEFORE THE ARG.
8189           JRST MACST1
8190         JSP D,RARB      ;FIND END OF LINE, COMMENT, OR CLOSEBRACKET =>
8191          JRST MACEND     ;NULLIFY ARG AND END MACRO CALL.
8192         MOVE T,A        ;ELSE SAVE THIS CHAR;  IT'S THE DELIMITER.
8193         TLZA FF,FLUNRD
8194 MACST2:  CALL PUTREL
8195         CALL RCH        ;READ ANOTHER CHARACTER.  IF IT ISN'T THE DELIMITER,
8196         CAME A,T
8197          JRST MACST2    ;STORE IT AND READ ANOTHER.
8198         CALL STPWR
8199 MACST3: CALL RCH        ;PASS BY SPACES AFTER THE CLOSING DELIMITER
8200         CAIE A,40
8201          CAIN A,^I
8202           JRST MACST3
8203         CAIE A,",       ;COMMA HERE ENDS THE ARG BUT NOT THE MACRO CALL.
8204          JSP D,RARB     ;ELSE CHECK FOR OTHER TERMINATORS.
8205           RET           ;WE FOUND AN ACCEPTABLE ARG TERMINATOR.
8206         ETR [ASCIZ /Garbage in ASCIZ-style macro arg/]
8207         JRST RARFLS     ;IF THERE'S ANYTHING ELSE, COMPLAIN AND SKIP IT.
8208 \f
8209 ;COME HERE TO GIVE AN ARG ITS DEFAULT VALUE.
8210 ;MCFDEF WAS CLEARED SO MACDES WILL KNOW THE DEFAULT VALUE HAS
8211 ;ALREADY BEEN PASSED OVER AND WON'T TRY TO SKIP OVER IT.
8212 ;IF MCFKWD IS SET, WE MUST SKIP OVER THE KWD ARG'S NAME FIRST.
8213 MACDEF: MOVE A,@PRCALP  ;COPY THE DEFAULT VALUE FROM THE MACRO BODY
8214         TRZN LINK,MCFKWD
8215          JRST MACDF1
8216 MACDF0: CALL REDINC
8217         CAIE B,377
8218          JRST MACDF0
8219 MACDF1: CALL REDINC     ;AS THE ARGUMENT STRING.
8220         CAIN B,377
8221          JRST MACDF2    ;END OF THE DEFAULT VALUE.
8222         EXCH A,B
8223         CALL PUTREL
8224         EXCH A,B
8225          JRST MACDF1
8226
8227 MACDF2: MOVEM A,@PRCALP
8228         JRST STPWR
8229
8230 ;COME HERE IF GENSYMMABLE ARG IS SPEC'D AS NULL.
8231 MACGEN: MOVEI A,5
8232         MOVEM A,SCKSUM
8233         MOVEI A,"G
8234         PUSHJ P,PUTREL
8235         SAVE CSTPWR
8236         AOS A,GENSM
8237         IDIVI A,10
8238         HRLM B,(P)
8239         SOSLE SCKSUM
8240         PUSHJ P,.-3
8241         JRST MACEV2
8242
8243 ;PROCESS ARG THAT STARTS WITH \, OR #-TYPE ARG.
8244 MACEVL: CALL RCH        ;FIRST, CHECK FOR IMMEDIATE END OF MACRO CALL.
8245         JSP D,RARB
8246          JRST MACEN1
8247         SAVE C
8248         PUSH P,LINK     ;SAVE LINK, NEED FLAGS
8249         PUSHJ P,AGETFD  ;GET THE FIELD  
8250         SKIPE B
8251          ETR [ASCIZ /Relocatable \'d macro arg/]
8252         POP P,LINK
8253         REST C          ;IF AGETFD EXPANDED A MACRO, FREEPT HAS CHANGED, SO
8254         MOVE CH1,FREEPT ;PUT NEW VALUE INTO THE POINTER TO THIS DUMMY.
8255         MOVEM CH1,(C)
8256         MOVE CH1,A      ;SAVE VALUE OF FIELD FROM CLOBBERAGE
8257         SAVE CSTPWR
8258 MACEV1: LSHC CH1,-35.   ;NOW "TYPE OUT" VALUE OF FIELD IN CURRENT RADIX
8259         LSH CH2,-1
8260         DIV CH1,ARADIX
8261         HRLM CH2,(P)
8262         JUMPE CH1,.+2
8263         PUSHJ P,MACEV1
8264 MACEV2: HLRZ A,(P)
8265         ADDI A,60
8266         JRST PUTREL     ;OUTPUT TO MACTAB STRING BEING DEFINED
8267 \f
8268 ;HANDLE KEYWORD PARAMETERS. COME HERE WHEN A DESCRIPTOR IS SEEN
8269 ;THAT SPECIFIES A KEYWORD PARAMETER.
8270 MACK:   SAVE RDWRDP
8271         SAVE @PRCALP
8272         SAVE LINK
8273 ;FIRST, PUSH A "NOT SET" MARKER FOR EACH OF THE KEYWORD PARAMS IN THIS RUN OF SUCH.
8274 MACK2:  SETO A,
8275         CALL ADDTR2
8276         CALL MACDES     ;NOTE THAT THERE IS ONLY ONE PARAM PER DESCRIPTOR
8277          JRST MACK1     ;FOR KEYWORD PARAMS, SO NO NEED TO COUNT DOWN.
8278         TRNE LINK,MCFKWD
8279          JRST MACK2
8280 MACK1:  REST LINK
8281         REST @PRCALP    ;NOW GO BACK TO THE DESCRIPTOR OF THE FIRST KEYWORD PARAM.
8282 MACKLP: CALL GPASST     ;NOW SEE IF THERE'S AN ARGUMENT TO BE FOUND
8283         CAIE A,^M       ;IF SO, IT SHOUDL START WITH A KEYWORD.
8284          CAIN A,^J
8285           JRST MACKND   ;CR OR LF => NO KEYWORD, AND END SCAN.
8286         CAIN A,";
8287          JRST MACKND
8288         CAIN A,",
8289          JRST MACKN1    ;NULL ARG => NO KEYWORD, BUT DON'T END SCAN.
8290         CAIE A,")
8291          CAIN A,">
8292           JRST MACKND   ;DETECT END OF PARENTHESIZED CALLS, ETC.
8293         CAIE A,RBRKT
8294          CAIN A,RBRACE
8295           JRST MACKND
8296         TLO FF,FLUNRD
8297         CALL GSYL       ;THERE SHOULD BE ANOTHER ARG, SO TRY READING KEYWORD NAME
8298         CALL PASSPS
8299         MOVE C,(P)      ;NOW SCAN THROUGH THIS RUN OF KEYWORD PARAMS FOR THE
8300         SAVE @PRCALP    ;ONE WHOSE NAME MATCHES WHAT GSYL READ.
8301         SAVE LINK
8302         CAIE A,"=
8303          JRST MACKL5    ;NOT FOLLOWED BY "="??
8304         DPB A,STRPNT
8305 MACKL4: MOVE D,[440700,,STRSTO]
8306         MOVE A,@PRCALP
8307 MACKL1: CALL REDINC
8308         ILDB AA,D
8309         CAIN B,377      ;IF REACHED END OF KEYWORD'S NAME, AND EQUAL SO FAR
8310          JRST MACKL2    ;SEE IF ARG'S NAME ALSO OVER.
8311         CAMN B,AA
8312          JRST MACKL1    ;ELSE KEEP COMPARING IF NAMES STILL SAME SO FAR.
8313 MACKL6: MOVEM A,@PRCALP
8314         CALL MACDES     ;THIS KEYWORD DOESN'T MATCH SO FIND THE NEXT
8315          JRST MACKL3    ;THERE ARE NO MORE; LOSE - ARG WITH BAD KEYWORD.
8316         TRNN LINK,MCFKWD
8317          JRST MACKL3
8318         AOJA C,MACKL4
8319         
8320 MACKL5: ETR [ASCIZ /Bad format keyword argument/]
8321         TLOA FF,FLUNRD  ;INCLUDE THE BAD NON-"=" AS PART OF WHAT WE DISCARD
8322 MACKL3:  ETR [ASCIZ /Arg with undefined keyword/]
8323         MOVEI T,RARGN
8324         CALL RARFLS     ;SKIP AN ORDINARY-SYNTAX MACRO ARG TO TRY TO RECOVER.
8325         JRST MACK1
8326
8327 ;COME HERE AFTER FINDING THE PARAM THAT MATCHES THIS ARG.
8328 ;C POINTS TO THE WORD IN DSTG FOR THAT ARG (DSTG IS WHAT ADDTRN PUSHES IN)
8329 MACKL2: TRZ LINK,MCFKWD ;(IN CASE WE GO TO MACKL6, SINCE KWD NAME SKIPPED ALREADY)
8330         CAIE AA,"=
8331          JRST MACKL6    ;KWD NAME OVER BUT SPEC'D NAME NOT => MISMATCH
8332         MOVEMM (C),FREEPT
8333         CALL MACRED     ;READ IN THE VALUE OF THE ARG, THUS SETTING THIS PARAM.
8334          JRST MACK1     ;THERE ARE MORE ARGS => HANDLE THEM
8335          .VALUE
8336         REST LINK
8337         REST @PRCALP
8338 MACKND: TLO FF,FLUNRD   ;MACRO CALL TERMINATOR SEEN.
8339 ;NULL ARG SEEN; ENDS THIS RUN OF KEYWORD ARGS BUT NOT THE CALL.
8340 MACKN1: REST C          ;GET PTR TO 1ST KWD ARG'S VALUE-WORD
8341 MACKN2: MOVE A,(C)
8342         AOJN A,MACKN4   ;IF THIS ARG WASN'T SPECIFIED,
8343         MOVEMM (C),FREEPT
8344         CALL MACNUL     ;NULLIFY IT (MAYBE DEFAULT OR GENSYM)
8345 MACKN4: CALL MACDES     ;NOW SKIP OVER THE DESCRIPTORS OF THIS RUN OF KEYWORD PARAMS
8346          JRST MACPUS     ;EXHAUSTED ALL THE DESCR'S => END OF MACRO CALL.
8347         TRNE LINK,MCFKWD ;SAME IF REACH A NON-KWD ARG.
8348          AOJA C,MACKN2
8349         TLNN FF,FLUNRD  ;REACHED A NON-KEYWORD PARAM: IF TERMINATOR WAS A NULL ARG,
8350          JRST MACNRM    ;GO ON TO READ THE VALUE OF THE NON-KEYWORD PARAM.
8351         JRST MACCLS     ;ELSE CALL WAS REALLY ENDED, SO NULLIFY REMAINING ARGS.
8352 \f
8353 ;COME HERE TO FIND THE NEXT DESCRIPTOR.
8354 ;SKIPS OVER THE NAME AND DEFAULT VALUE OF THE PREVIOUS DESCRIPTOR, IF ANY.
8355 ;THE CONTENTS OF LINKK SAY WHETHER THEY EXIST TO BE SKIPPED OVER.
8356 MACDES: MOVE A,@PRCALP
8357         CALL REDINC     ;READ NEXT CHAR OF MACRO
8358         MOVEM A,@PRCALP
8359         TRNE LINK,MCFKWD\MCFDEF
8360          JRST [ CAIE B,377      ;IF THERE'S NAME OR DEFAULT TO SKIP, GO PAST TERMINATOR
8361                  JRST MACDES
8362                 TRZN LINK,MCFKWD ;AND SAY WE FOUND ONE
8363                  TRZ LINK,MCFDEF ;NOTE THERE MAY BE ANOTHER, IN WHICH CASE WE WILL
8364                 JRST MACDES]    ;SKIP TILL ANOTHER 377
8365         JUMPE B,CPOPJ   ;THIS DESC IS TERMINATOR => RETURN NO SKIP.
8366         MOVEI LINK,(B)  ;ELSE PUT FLAGS IN LINK.
8367         JRST POPJ1
8368
8369 ;COME HERE WHEN A MACRO CALL TERMINATOR IS ENCOUNTERED, TO NULLIFY ALL
8370 ;THE REMAINING PARAMS THAT THE MACRO WANTS, THEN ENTER THE MACRO.
8371 ;ENTER AT MACCLS IF HAVE JUST READ A DESCRIPTOR AND NOT NULLIFIED THE ARG,
8372 ;OR AT MACCLD IF HAVE JUST PROCESSED AN ARG, TO READ THE NEXT DESCRIPTOR.
8373 MACCLS: TRNE LINK,MCFDEF\MCFGEN
8374          JRST MACCL2
8375         SETZ A,         ;NULLIFY NON-GENSYMMED, NON-DEFAULTED ARGS QUICKLY
8376         CALL ADDTR2
8377 MACCLD: CALL MACDES     ;THEN READ THE NEXT DESCRIPTOR.
8378          JRST MACPUS    ;IF NO MORE ARGS, ENTER THE MACRO.
8379         JRST MACCLS
8380         
8381 MACCL2: CALL ADDTRN     ;FOR GENSYMMED OR DEFAULTED ARG, PUSH PTR TO FREE STG
8382         SOS C,A
8383         CALL MACNUL     ;THEN WRITE THE DESIRED VALUE THERE
8384         JRST MACCLD     ;THEN HANDLE NEXT DESCRIPTOR.
8385
8386 ;COME TO MACPUS WHEN ALL THE PARAMS HAVE HAD VALUES PUT IN DSTG (USING ADDTRN)
8387 ;TO ENTER THE MACRO.
8388 MACPUS: TLZE I,ILPRN    ;SPECIAL PARENTHESIZED CALL?
8389          CALL MACPRN     ;YES, SKIP PAST THE CLOSING PAREN.
8390         MOVE B,(P)      ;IS THIS A .TTYMAC?
8391         CAIN B,A.TYM8
8392          CALL A.INEO    ;YES, POP OUT OF TTY AFTER READING ARGS.
8393         JFCL
8394         REST B          ;RCHSV1 OR A.TYM8
8395         PUSHJ P,PUSHEM
8396         MOVE A,@PRCALP
8397         PUSHJ P,ACPTRS  ;SET UP CPTR
8398         POP P,A
8399         PUSHJ P,DMYTRN
8400         SOS PRCALP
8401         REST I
8402 MACCR:  AOS (P)         ;COMMON RETURN FROM PSEUDOS TO RETURN FROM GETVAL WITHOUT VALUE
8403 CMACCR: POPJ P,MACCR
8404
8405 MACPRN: MOVEI TT,1      ;START PAREN-DEPTH AT 1
8406         JSP D,RARBC     ;AND READ CHARS, UPDATING THE DEPTH, UNTIL
8407          HALT
8408         JUMPN TT,.-2    ;THE DEPTH GETS TO BE 0.
8409         RET
8410 \f
8411 A.GOMC: ILDB B,A        ;.GO ROUTINE TO SKIP PAST DESCRIPTORS
8412         JUMPN B,A.GOMC  ;IN HEADER OF MACRO DEFINITION.
8413         JRST A.GORT
8414
8415 RCHSV1: SOS MDEPTH      ;END OF MACRO EXPANSION, DECREMENT DEPTH IN MACRO EXPANSIONS
8416 A.TYM8: PUSH P,A        ;ENTRY FROM .TTYMAC END OF EXPANSION
8417         MOVE B,TOPP
8418 RCHSV3: CAMG B,BBASE
8419         JRST RCHSV2
8420         HLRZ A,-1(B)
8421         ADD A,-1(B)
8422         MOVEI A,1(A)
8423         CAME A,FREEPT
8424         JRST RCHSV2
8425         HRRZ A,-1(B)    ;GET NEW FREEPT
8426         SOJA B,RCHSV3
8427
8428 RCHSV2: POP P,A
8429                 ;RETURN ROUTINE FOR END OF DUMMY
8430 RCHSAV: MOVE B,BBASE
8431         MOVEM B,TOPP
8432         PUSHJ P,POPEM
8433         HLRM B,BBASE
8434 REPT6:  TRZE FF,FRMRGO
8435         POPJ P,         ;RETURN TO .GO
8436         JRST RCHTRB
8437 \f
8438 ;IRP, IRPS, IRPC, IRPW, IRPNC ALL CALL HERE.
8439 ;ALL USE 2 FRAMES ON THE MACRO PDL:
8440 ; <OLD BBASE>,,<OLD CPTR>
8441 ; <SAVED LIMBO1 STATUS>,,<OUTER .IRPCNT>
8442 ; <IRP TYPE>\<# GROUPS>,,<CHAR ADDR START OF IRP BODY>
8443 ; <SAVED TOPP>,,AIRR
8444 ;THE 3RD WORD HAS IN BITS 4.1-4.3 THE IRP TYPE CODE
8445 ;   (NIRPO, NIRPC, ETC)
8446 ;AND IN THE REST OF THE LH, THE NUMBER OF GROUPS
8447 ;   (TRIPLES OF TWO DUMMIES AND A LIST)
8448
8449 .SEE NIRPO      ;FOR DEFINITIONS OF IRP TYPE CODES.
8450
8451 AIRP:   JSP TM,ERMARK   ;ERROR MESSAGES SHOULD SAY WE'RE INSIDE IT.
8452         SAVE I
8453         SAVE RDWRDP
8454         HLRZ LINK,B     ;GET IRP TYPE CODE TO INDEX BY.
8455         CAIE LINK,NIRPN
8456          JRST AIRP0
8457         CALL AGETFD     ;IRPNC, READ THE 3 NUMERIC ARGS.
8458         SAVE A
8459         CALL AGETFD
8460         SAVE A
8461         CALL AGETFD
8462         MOVEM A,AIRPN2  ;THE LAST ARG,
8463         REST AIRPN1     ;THE MIDDLE,
8464         REST AIRPN0     ;THE FIRST.
8465         MOVEI LINK,NIRPN
8466 AIRP0:  SETZM IRPCR     ;NO GROUPS SEEN YET.
8467
8468 ;FALLS THROUGH.
8469 \f
8470 ;FALLS THROUGH.
8471
8472 ;TRY TO READ IN ANOTHER GROUP.
8473 AIRP1:  CALL PDEF       ;READ IN DUMMY NAME, PUSH ON DMYTOP.
8474         CAIE T,",       ;TERMINATOR WASN'T COMMA AND NAME WAS NULL
8475          JUMPE SYM,AIRP2 ;=> NO MORE GROUPS.
8476         CALL PDEF       ;NONNULL GROUP, READ & PUSH 2ND NAME.
8477         CAIN T,"[       ;] TRY TO DETECT "IRP X,[", ETC.  ]
8478          CALL [ETR [ASCIZ/Comma missing in IRP/]
8479                 TLO FF,FLUNRD   ;GENERATE A COMMA.
8480                 RET]
8481         CALL ADDTRN     ;PUSH CHAR ADDR OF 1ST DUMMY,
8482         CAIE LINK,NIRPS
8483         CAIN LINK,NIRPC ;LEAVE SPACE FOR IRPC'S 1ST ARG, IRPS'S 2ND.
8484          CALL PUT377
8485         MOVE A,RDWRDP
8486         CAIN LINK,NIRPS
8487          AOS -1(A)      ;IRPS - 1ST ARG GOES AFTER NEXT 377.
8488         CALL ADDTRN     ;PUSH CHAR ADDR OF 2ND DUMMY.
8489         CALL PUT377
8490         MOVE A,RDWRDP
8491         XCT AIRP1T-1(LINK)      ;MAYBE INCREMENT THAT ADDR.
8492         AOS IRPCR       ;ONE MORE GROUP SEEN.
8493         JSP D,RARG      ;INITIALIZE READING LIST.
8494          JRST AIRP3      ;NO LIST.
8495         JRST @.(LINK)
8496         OFFSET 1-.
8497 NIRPO:: AIRPO   ;IRP
8498 NIRPC:: AIRPC   ;IRPC
8499 NIRPS:: AIRPS   ;IRPS
8500 NIRPW:: AIRPW   ;IRPW
8501 NIRPN:: AIRPN   ;IRPNC
8502         OFFSET 0
8503
8504 AIRP1T: AOS -1(A)
8505         AOS -1(A)       ;INCR. THE 2ND DUMMY ADDR FOR IRP, IRPC.
8506         SOS -1(A)
8507         JFCL            ;DECR. FOR IRPS, NOTHING FOR IRPW.
8508         AOS -1(A)       ;INCR. FOR IRPNC.
8509 \f
8510 ;READ LIST FOR IRPC OR IRP AND STUFF INTO STRING.
8511 AIRPC:
8512 AIRPO:  CALL RARGCP     ;COPY UP TO END OF ARG INTO MACRO SPACE.
8513         JRST AIRP3
8514
8515 AIRPW3: CALL PUT377     ;END A LINE,
8516         CAIGE C,
8517          CALL PUT377    ;IF NO ; YET, MAKE NULL 2ND ARG.
8518 ;COME HERE FOR IRPW, LOOP BACK FOR NEXT LINE.
8519 AIRPW:  SETO C,         ;NO ; SEEN YET IN LINE.
8520 AIRPW1: JSP D,RARGCH(T)
8521          JRST AIRP3     ;END OF LIST, GO WRITE 375.
8522         CAIE A,^M
8523         CAIN A,^J
8524          JRST AIRPW1    ;IGNORE NULL LINES.
8525 AIRPW4: CAIN A,";
8526          AOJE C,AIRPW2  ;ON 1ST SEMI, SWITCH TO 2ND ARG.
8527         CAIE A,^J
8528         CAIN A,^M
8529          JRST AIRPW3    ;END OF LINE => END BOTH ARGS, START OVER.
8530 AIRPW5: CALL PUTREL
8531         JSP D,RARGCH(T)
8532          JRST AIRP3     ;END OF LIST.
8533         JRST AIRPW4
8534
8535 AIRPW2: MOVEI A,377
8536         JRST AIRPW5
8537
8538 AIRPS:  SETO C,         ;NO SQUOZE CHAR SEEN YET.
8539 AIRPS2: JSP D,RARGCH(T)
8540          JRST AIRP3
8541         HLRZ CH1,GDTAB(A)
8542         CAIN CH1,(RET)
8543         CAIN A,"!
8544          AOJA C,AIRPS0  ;A SQUOZE CHAR OR !.
8545         JUMPL C,AIRPS2  ;NON SQUOZE FOLLOWING ANOTHER, FLUSH.
8546         DPB A,AIRPSP    ;NONSQUOZE ENDING NONNULL SYL, PUT BEFORE SYL.
8547         SETZM AIRPSP
8548         CALL PUT377     ;FOLLOW SYL WITH 377.
8549         JRST AIRPS
8550
8551 AIRPS0: JUMPN C,AIRPS3  ;NOT 1ST CHAR IN SYL?
8552         SAVE A
8553         CALL PUT377     ;1ST, LEAVE A SPACE FOR THE SYL'S TERMINATOR.
8554         MOVE A,FREPTB
8555         MOVEM A,AIRPSP  ;REMEMBER WHERE THE SPACE IS.
8556         REST A
8557 AIRPS3: CALL PUTREL
8558         JRST AIRPS2
8559 \f
8560 AIRPN:  SKIPG C,AIRPN0  ;ANY CHARS TO IGNORE?
8561          JRST AIRPN4
8562         JSP D,RARGCH(T)
8563          JRST AIRP3
8564         SOJG C,.-2
8565 AIRPN4: SKIPN C,AIRPN2  ;GET MAX # GRPS OF CHARS.
8566          JRST AIRPN7     ;0 => IGNORE THE REST.
8567 AIRPN5: MOVE B,AIRPN1   ;DO NEXT GRP, GET # CHARS/GRP.
8568 AIRPN6: JSP D,RARGCH(T)
8569          JRST AIRP3
8570         CALL PUTREL     ;STORE THE NEXT CHAR.
8571         SOJG B,RARGCH(T) ;COUNT CHARS IN GRP.
8572         MOVEI A,376
8573         CALL PUTREL     ;FOLLOW GRP BY 376.
8574         SOJN C,AIRPN5   ;MAYBE CAN DO MORE GRPS.
8575 AIRPN7: CALL RARFLS     ;DID AS MANY GRPS AS CAN DO,
8576                         ;IGNORE REMAINDER OF LIST.
8577
8578 ;COME HERE WHEN EXHAUST THE LIST.
8579 AIRP3:  CALL STPWR
8580         JRST AIRP1      ;READ ANOTHER GROUP.
8581
8582 ;ALL GROUPS READ IN; NOW READ IN BODY.
8583 AIRP2:  CAIE T,";       ;IF A SEMICOLON ENDED THE ARGS, SKIP THE COMMENT.
8584          JRST AIRP4
8585 AIRP5:  CALL RCH
8586         CAIE A,^M
8587          JRST AIRP5
8588 AIRP4:  SAVE LINK
8589         MOVE A,FREEPT   ;SAVE CHAR ADDR START OF BODY
8590         MOVEM A,PRIRP   ;WHERE GC WILL RELOCATE IT.
8591         PUSHJ P,RCH     ;IF NEXT CHAR LF, THEN FLUSH IT
8592         CAIE A,12
8593         TLO FF,FLUNRD
8594         PUSHJ P,WRQOTE  ;READ BODY OF IRP
8595         PUSHJ P,STPWR   ;WRITE STOP
8596         PUSHJ P,PUSHEM  ;SAVE WORLD
8597         REST LINK
8598         POP P,A         ;RESTORE RDWRDP FROM LONG AGO
8599         PUSH P,TOPP     ;NOW SAVE TOPP
8600         PUSHJ P,DMYTRN  ;ACTIVATE DUMMYS
8601         MOVE B,MACP     ;NOW GET MACRO PDL POINTER
8602         MOVE A,CIRPCT   ;GET .IRPCNT
8603         HRRM A,(B)      ;CLOBBER "RETURN" ON PDL TO OLD IRPCNT
8604         SETOM CIRPCT    ;INITIALIZE IRPCNT
8605         MOVS A,IRPCR    ;GET # GROUPS
8606         HRR A,PRIRP     ;CHAR ADR OF BEGINNING OF BODY
8607         SETZM PRIRP
8608         DPB LINK,[410300,,A] ;PUT IN TYPE OF IRP.
8609         PUSH B,A        ;PUSH <SPECIFICATION BITS\# GROUPS>,,CHAR ADR BEGINNING
8610         POP P,A         ;NOW GET OLD TOPP
8611         HRLS A          ;MOVE TO LEFT HALF
8612         HRRI A,AIRR     ;RETURN TO AIRR ON END OF BODY
8613         PUSH B,A        ;PUSH OLD TOPP,,AIRP4
8614         MOVEM B,MACP    ;STORE BACK UPDATED MACRO PDL POINTER
8615         MOVE A,STOPPT
8616         MOVEM A,CPTR    ;CAUSE STOP RIGHT AWAY TO CAUSE CYCLING
8617         REST I
8618         JRST MACCR
8619 \f
8620                 ;RECYCLE THROUGH IRP
8621
8622                 ;AC ALLOCATIONS:
8623 AIRR:   PUSH P,A        ;A GETS BP ILDBING THRU ARG LIST.
8624         PUSH P,C        ;C # GROUPS LEFT
8625         PUSH P,T        ;T ADR OF PAIR OF CHAR ADR'S OF DUMMYS
8626         PUSH P,TT       ;TT TYPE OF IRP (NIRPO, NIRPC, ETC)
8627         AOS CIRPCT      ;INCREMENT .IRPCNT
8628         HRRZ A,(B)      ;GET CHARACTER ADR BEG BODY FROM PDL
8629         PUSHJ P,ACPTRS  ;SET UP CPTR
8630         SETOM AIRPT
8631         TRNE FF,FRMRGO
8632         JRST AIRR9      ;RETURN TO .GO
8633         HLRZ T,1(B)     ;DUMMY TAB ADR
8634         LDB C,[220600,,(B)]     ;# GROUPS
8635         JUMPE C,AIRR9   ;JUMP IF NO GROUPS
8636         LDB TT,[410300,,(B)]    ;GET TYPE OF IRP (NIRPO, ETC)
8637 AIRR6:  JRST @.+1(TT)
8638 AIRRER ? AIRRO ? AIRRC ? AIRRS ? AIRRW ? AIRRN ? AIRRER ? AIRRER
8639 AIRRER: .VALUE
8640
8641 ;MOVE 1 ARG THRU 1 GROUP OF IRP.
8642 AIRRO:  HRRZ A,1(T)     ;THE 1ST ARG WILL START THIS TIME
8643         HRRZM A,(T)     ;WHERE THE "REST OF STRING" STARTED LAST TIME.
8644         BCOMP A,-1      ;GET BP THAT'LL ILDB THAT CHAR.
8645         SETO CH1,       ;COUNT [-] DEPTH.
8646 AIRRO1: ILDB B,A
8647         CAIN B,375
8648          JRST AIRRO4    ;END OF STRING IS END OF ARG.
8649         SETZM AIRPT     ;THIS GROUP NOT NULL.
8650         CAIN B,"[
8651          AOJE CH1,AIRRO3        ;FLUSH OUTERMOST [-] PAIRS.
8652         CAIN B,"]
8653          SOJL CH1,AIRRO3
8654         JUMPGE CH1,AIRRO1       ;DON'T LOOK FOR , WITHIN [-].
8655         CAIE B,^J
8656         CAIN B,",
8657          JRST AIRRO2    ;END OF ARG.
8658         CAIE B,^M       ;^M IS IGNORED (FLUSHED.)
8659          JRST AIRRO1
8660 AIRRO3: MOVEI B,376     ;FLUSH A CHAR BY REPLACING WITH 376
8661         DPB B,A
8662         JRST AIRRO1
8663
8664 AIRRC4: SUB P,[1,,1]
8665 AIRRC3: SETZM (T)       ;NULLIFY BOTH ARGS PERMANENTLY.
8666 AIRRO4: SETZM 1(T)      ;NULLIFY 2ND ARG PERMANENTLY
8667         JRST AIRR8      ;DONE WITH THIS GROUP.
8668
8669 AIRRO2: MOVEI B,377     ;REPLACE CHAR THAT ENDED ARG WITH TERMINATOR.
8670         DPB B,A
8671 AIRRW3: CCOMP1 A,-1     ;GET ADDR OF CHAR AFTER.
8672         HRRZM B,1(T)    ;"REST OF STRING" STARTS THERE.
8673         JRST AIRR8
8674
8675 AIRRN:  MOVE A,1(T)     ;NEW 1ST DUMMY STARTS AT OLD "REST OF STRING".
8676         MOVEM A,(T)
8677         BCOMP A,-1      ;NEW "REST OF STRING" STARTS AFTER 376,
8678         JRST AIRRW2     ;WHICH WILL BECOME A 377.
8679 \f
8680 AIRRW:  MOVE A,1(T)     ;GET CHAR ADDR START OF 2ND HALF OF PREV LINE.
8681         CALL AIRRM      ;SET 1ST DUMMY -> AFTER NEXT 376 OR 377 .
8682 AIRRW2: ILDB B,A        ;MOVE UP TO NEXT 377 OR END OF STRING.
8683         CAIN B,375      ;END OF STRING ENDS 1ST DUMMY'S ARG =>
8684          JRST AIRRO4    ;NULLIFY THE 2ND DUMMY.
8685         SETZM AIRPT     ;THIS GROUP NOT NULL.
8686         CAIGE B,376
8687          JRST AIRRW2
8688         JRST AIRRO2     ;SET UP 2ND DUMMY -> NEXT CHAR.
8689
8690
8691 ;MOVE UP IN 1 GROUP OF IRPS.
8692 AIRRS:  MOVE A,(T)      ;MOVE FROM 1ST DUMMY,
8693         CALL AIRRM      ;PUT 1ST DUMMY AFTER NEXT 377,
8694         AOS (T)         ;MOVE IT PAST THE SYL'S TERMINATING CHAR,
8695         ILDB CH1,A      ;GET THAT CHAR,
8696         MOVE A,1(T)
8697         JRST AIRRS2     ;STORE AS 2ND DUMMY.
8698
8699 AIRRM:  BCOMP A,-1      ;A HAS CHAR ADDR; WILL ILDB THAT CHAR.
8700 AIRRM1: ILDB B,A
8701         CAIN B,375      ;END OF STRING => NULLIFY BOTH ARGS
8702          JRST AIRRC4    ;AND FINISHED WITH GROUP.
8703         CAIE B,377
8704          JRST AIRRM1
8705         MOVE CH1,A
8706         CCOMP1 CH1,-1   ;GET CHAR ADDR OF CHAR AFTER 377
8707         MOVEM CH2,(T)   ;PUT 1ST DUMMY THERE.
8708         RET             ;NOTE A NOT CLOBBERED, CAN GO ON ILDB'ING.
8709
8710 ;MOVE UP IN ONE GROUP OF IRPC.
8711 AIRRC:  AOS A,1(T)      ;DELETE 1ST CHAR FROM "REST OF STRING".
8712         BCOMP A,-1      ;GET BP -> THAT CHAR.
8713         LDB CH1,A       ;GET THE CHAR.
8714         MOVE A,(T)      ;GET CHAR ADDR OF PLACE TO PUT IT.
8715 AIRRS2: CAIN CH1,375    ;REACHED END OF STRING =>
8716          JRST AIRRC3    ;NULLIFY BOTH ARGS.
8717         BCOMP A,0
8718         DPB CH1,A       ;STORE IT IN THE 1-CHAR ARG.
8719 AIRR7:  SETZM AIRPT     ;THIS GROUP NOT EXHAUSTED YET.
8720 AIRR8:  ADDI T,2
8721         SOJG C,AIRR6    ;MORE GROUPS => DO THE NEXT.
8722 AIRR9:  POP P,TT        ;RETURN FROM AAIRPC
8723         POP P,T
8724         SKIPL AIRPT
8725         JRST REPT3
8726         MOVN A,[2,,2]   ;ARGS EXHAUSTED, RETURN
8727         ADDB A,MACP
8728         HRRZ A,(A)
8729         MOVEM A,CIRPCT
8730         POP P,C
8731         POP P,A
8732         JRST RCHSAV
8733 \f
8734 ;IRP ARG-STRING READING COROUTINES: CALL WITH JSP D,
8735 ;INITIALIZE FOR READIN OF ARG BUT DON'T GET A CHAR.
8736 ;SKIPS IF NONNULL ARG AVAILABLE.
8737 ;COROUTINES REMEMBER INFO IN T AND TT BETWEEN CALLS.
8738 ;THE CALLER SHOULDN'T CLOBBER THEM.
8739 RARG:   CALL RCH        ;DECIDE WHAT TYPE OF ARG FOLLOWS, IF ANY.
8740         CAIN A,LBRKT    ;RARG ALLOWS [-] AND MAYBE {-} ARGS AS WELL AS SIMPLE ONES.
8741          JRST RARGBR
8742 IFN BRCFLG,[
8743         CAIN A,LBRACE
8744          JRST RARGRR
8745 ]
8746         TLO FF,FLUNRD
8747         JSP T,RARGXT    ;CAUSE FAILURE RETURN ON SEMI, CR, LF.
8748 RARGN:  CALL RCH        ;RARGCH RTN FOR NORMAL ARG.
8749 RARGX1: CAIN A,",
8750          JRST (D)       ;COMMA ENDS ARG.
8751 RARGXT: CAIN A,";
8752          JRST RARGSM    ;SEMI ENDS SCAN.
8753 RARGX2: CAIE A,^M
8754         CAIN A,^J       ;CR, LF END SCAN.
8755 RARGSM:  TLOA FF,FLUNRD
8756         JRST 1(D)
8757         JRST (D)
8758
8759 RARGBR: SETZ TT,        ;TT USED AS BRACKET COUNTER.
8760         JSP T,1(D)      ;RETURN, WITH RARGCH RTN IN T.
8761 ;READ-CHAR RTN FOR [-] TYPE ARGS.
8762 RARGBC: CALL RCH        ;READ NEXT CHAR OF ARG.
8763         CAIN A,LBRKT
8764          AOJA TT,1(D)
8765         CAIN A,RBRKT
8766          SOJL TT,(D)
8767         JRST 1(D)       ;SKIP-RETURN UNLESS JUST READ THE FINAL CLOSEBRACKET.
8768
8769 RARGRR: SETZ TT,        ;TT USED AS BRACE COUNTER.
8770         JSP T,1(D)      ;RETURN, WITH RARGCH RTN IN T.
8771 ;READ-CHAR RTN FOR {-} TYPE ARGS.
8772 RARGRC: CALL RCH        ;READ NEXT CHAR OF ARG.
8773         CAIN A,LBRACE
8774          AOJA TT,1(D)
8775         CAIN A,RBRACE
8776          SOJL TT,(D)
8777         JRST 1(D)       ;SKIP-RETURN UNLESS JUST READ THE FINAL CLOSEBRACE.
8778
8779 ;TO GET THE NEXT CHAR OF THE ARG IN A, DO JSP D,RARGCH(T).
8780 ;SKIPS UNLESS NO MORE CHARS TO GET.
8781 ;NO SKIP AND  SET => SCAN SHOULD BE TERMINATED.
8782 ;RARG SHOULD NOT BE CALLED AGAIN IN THAT CASE.
8783 RARGCH==0       ;THIS SYMBOL IS FOR CREF'S SAKE.
8784
8785 ;COPY THE ARG BEING READ INTO MACRO SPACE.
8786 ;ON RETURN, A WILL HOLD "; IF ARGUMENT WAS ENDED BY ";".
8787 RARGCP: JSP D,RARGCH(T)
8788          JRST RARGC1
8789         CALL PUTREL
8790         JRST RARGCH(T)
8791
8792 RARGC1: CAIE A,";       ;IF SEMI ENDED THE ARG, FLUSH THE
8793          RET            ;SPACES AND TABS BEFORE IT.
8794 RARGC2: LDB A,FREPTB
8795         CAIN A,^I
8796          JRST RARGC3
8797         CAIE A,40
8798          JRST [ MOVEI A,";      ;LAST CHAR OF ARG ISN'T SP OR TAB.
8799                 RET]            ;MAKE SURE A HAS ";" IF ARG WAS ENDED BY ";".
8800 RARGC3: SOS FREEPT      ;IT IS ONE; BACK OVER IT.
8801         MOVE A,FREPTB
8802         DBPM A
8803         MOVEM A,FREPTB
8804         JRST RARGC2
8805
8806 ;IGNORE THE REST OF THE ARG NOW BEING READ.
8807 RARFLS: JSP D,RARGCH(T)
8808          RET
8809         JRST RARGCH(T)
8810 \f
8811 ;COME HERE TO SET UP TO READ A BALANCED ARG.
8812 ;IF THERE'S NO ARG, RETURNS WOTH JRST (D).
8813 ;ELSE RETURNS WITH JRST 1(D) SETTING UNRCHF.
8814 RARB:   TLO FF,FLUNRD
8815         SETZ TT,        ;TT USED AS BRACKET COUNTER.
8816         CAIE A,RBRACE
8817          CAIN A,")      ;IF 1ST CHAR IS A CLOSE,
8818           JRST RARB4    ;THERE'S NO ARG.
8819         CAIE A,">
8820          CAIN A,RBRKT
8821           JRST RARB4
8822         JSP T,RARGXT    ;CHECK FOR CR, LF, SEMI, AND RETURN.
8823 ;1-CHAR RTN FOR READING BALANCED ARG.
8824 RARBC:  CALL RCH
8825         CAIE A,RBRACE
8826          CAIN A,">      ;FOR CLOSES, MAYBE END ARG.
8827           JRST RARB2
8828         CAIE A,")
8829          CAIN A,RBRKT
8830           JRST RARB2
8831         CAIE A,LBRACE
8832          CAIN A,"<      ;FOR OPEN BRACKETS, INCR. THE COUNT.
8833           AOJA TT,1(D)  ;OPENS CAN'T END THE ARG.
8834         CAIE A,"(
8835          CAIN A,LBRKT
8836           AOJA TT,1(D)
8837         JUMPN TT,1(D)
8838         JRST RARGX1     ;NOT WITHIN BRACKETS, TEST FOR COMMA, ETC.
8839
8840 RARB2:  SOJGE TT,1(D)   ;COME HERE FOR CLOSEBRKTS.
8841 RARB4:  TLO FF,FLUNRD
8842         JRST (D)
8843
8844 ;COME HERE TO INIT FOR AN ARG FOR REPEAT, ETC.
8845 ;THAT IS, EITHER A BRACKETED ARG OR A 1-LINE ARG.
8846 RARL1:  CALL RCH
8847 RARL2:
8848 IFN BRCFLG,[
8849 RARL4:  CAIN A,LBRACE
8850          JRST RARGRR    ;1ST CHAR A BRACE => BRACED ARG.
8851 ]
8852         CAIN A,LBRKT    ;1ST CHAR A BRKT => BRKT ARG.
8853          JRST RARGBR
8854         TLO FF,FLUNRD
8855
8856 ;INIT FOR A 1-LINE ARG.
8857 RARL:   JSP T,1(D)
8858 ;1-CHAR RTN FOR 1-LINE ARGS.
8859 RARLC:  CALL RCH
8860         JRST RARGX2
8861
8862 IFE BRCFLG,[
8863 ;IF BRACES AREN'T USED BY MOST THINGS, THE NORMAL ROUTINE RARL1 DOESN'T
8864 ;CHECK FOR THEM, BUT RALR4 (CALLED BY CONDITIONALS) STILL MUST.
8865 RARL4:  CAIN A,LBRACE
8866          JRST RARGRR
8867         JRST RARL2
8868 ]
8869
8870 ;1-LINE ARGS TO MACROS: DON'T TERMINATE THE SPEC,
8871 ;AND SKIP OVER THE CR AND LF.
8872 RARL3:  TLO FF,FLUNRD
8873         JSP T,1(D)
8874         CALL RCH
8875         CAIN A,^J
8876          JRST (D)       ;LF IS THE END - SKIP IT.
8877         CAIE A,^M
8878          JRST 1(D)
8879         CALL RCH        ;CR => SKIP FOLLOWING LF, END ARG.
8880         CAIE A,^J
8881          TLO FF,FLUNRD
8882         JRST (D)
8883 \f
8884                 ;PUSHJ P,A.GST SEARCH CURRENT MACRO STRING FOR TAG (IN A.GST4)
8885                 ;SKIP IF FOUND, RETURN ON END OF STRING ANYWAY
8886                 ;BYTE POINTER (ILDB TO GET FIRST CHARACTER) IN A
8887
8888 A.GST:  MOVEM A,A.GST3  ;SAVE BYTE POINTER
8889 A.GST1: ILDB B,A.GST3   ;GET CHAR
8890         CAIL B,300
8891         POPJ P,         ;END OF STRING => STOP
8892         CAIE B,".
8893         JRST A.GST1     ;WAIT FOR POINT
8894         PUSHJ P,A.GSYL  ;FOUND POINT, GET REST OF NAME
8895         JUMPL T,CPOPJ   ;RETURN ON END OF STRING
8896         CAME SYM,[SQUOZE 0,TAG] ;TAG?
8897         JRST A.GST1     ;NO, KEEP GOING
8898         PUSHJ P,A.GSYL  ;GET THE TAG
8899         JUMPL T,CPOPJ   ;RETURN ON END OF STRING (THERE MUST BE BREAK CHAR AFTER TAG BEFORE STOP)
8900         CAME SYM,A.GST4
8901         JRST A.GST1     ;NOT THE ONE BEING LOOKED FOR
8902         MOVE A,A.GST3
8903         LDB B,A         ;GET DELIMITER
8904         CAIE B,15       ;CR?
8905         JRST POPJ1
8906         ILDB B,A        ;CR, GET NEXT CHAR
8907         CAIE B,12       ;LINE FEED?
8908         MOVE A,A.GST3   ;NO, DON'T FLUSH
8909         JRST POPJ1
8910
8911                 ;LOOK BACKWARD FOR BEGINNING OF STRING, BYTE POINTER AN A
8912                 ;LEAVES  POINTER POINTING AT STOP CHAR (NOT BEFORE); ALSO LEAVES STOP CHAR IN B
8913
8914 AG.SP:  MOVE B,(A)      ;GET WORD FROM MACTAB
8915         XOR B,[300_28.+300_20.+300_12.+300_4]   ;DO XOR TO ANITIALLY SET UP
8916         LDB CH1,[400400,,A]     ;PICK UP 4 HIGH ORDER BITS OF POSITION FIELD
8917         JRST A.GSP2-1(CH1)      ;DISPATCH ON POSITION FIELD (-1  SINCE BIT SET IN POSITION FIELD)
8918
8919 AG.SP3: MOVE B,(A)
8920         XOR B,[300_28.+300_20.+300_12.+300_4]
8921
8922 A.GSP2: TRNN B,300_4
8923         JSP CH1,AG.SF
8924         TLNN B,3
8925         JSP CH1,AG.SF
8926         TLNN B,300_2
8927         JSP CH1,AG.SF
8928         TLNN B,300_10.
8929         JSP CH1,AG.SF
8930         SOJA A,AG.SP3
8931
8932 AG.SF:  SUBI CH1,A.GSP2-1       ;GET HERE WHEN STOP CHAR FOUND
8933         DPB CH1,[400400,,A]     ;CLOBBER POSITION FIELD OF BYTE POINTER AGAIN
8934         ILDB B,A        ;INCREMENT TO UNIVERSALLY ACCEPTABLE POINTER, GETTING STOP CHAR IN B AT SAME TIME
8935         POPJ P,         ;THAT'S ALL
8936 \f
8937 A.TAG:  PUSHJ P,GSYL
8938         CAIE T,15
8939         JRST MACCR
8940         PUSHJ P,RCH
8941         CAIE A,12
8942         TLO FF,FLUNRD
8943         JRST MACCR
8944
8945 A.GO:   PUSHJ P,GSYL    ;DOESN'T WORK RELIABLY FROM DUMMY
8946         MOVEM SYM,A.GST4
8947
8948 A.GO1:  TLNN FF,FLMAC
8949         JRST MACCR      ;NOT GETTING CHARS FROM MACRO => STOP
8950         MOVE A,CPTR
8951         PUSHJ P,AG.SP   ;BACK TO BEGINNING
8952         CAIN B,374
8953         JRST A.GOMC     ;MACRO, SKIP PAST HEADER
8954 A.GORT: PUSHJ P,A.GST
8955         JRST A.GO2      ;END OF STRING, TRY POPPING UP ONE
8956         MOVEM A,CPTR
8957         JRST MACCR
8958
8959 A.GO2:  PUSHJ P,PMACP
8960         JRST A.GO1
8961
8962 A.GSYL: MOVNI D,100000  ;GET SYL FOR .GO WHILE LOOKING FOR TAG
8963         MOVEM D,STRCNT  ;STRCNT .LT. 0 SIGNAL FOR GSYL TO JRST (F)
8964         MOVEI SYM,0
8965         JSP F,GSYL1
8966 A.GSY3: ILDB A,A.GST3   ;GET CHAR
8967         TRZN A,200      ;CHECK FOR SPECIAL
8968         JRST A.GSY2     ;NO, FALL BACK IN
8969         CAIG A,100      ;BIG ENOUGH TO BE SPECIAL?
8970         JRST A.GSY3     ;NO, MUST BE DUMMY, IGNORE
8971         HRROI T,(A)     ;SPECIAL => ASSUME STOP: T .LT. 0 SIGNAL TO CALLING ROUTINE
8972         POPJ P,         ;RETURN TO CALLING ROUTINE
8973 \f
8974                 ;INITIALIZE MACRO STATUS
8975
8976 MACINI: MOVEI A,3
8977         MOVEM A,FREEPT  ;FORGET ALL STRINGS IN MACTAB
8978         PUSHJ P,FCOMP
8979         MOVE A,MACTAD
8980         HRLI A,41000    ;SET UP CCOMPB THRU CCOMPE
8981         LSH A,2         ;(THEIR VALUES CAN'T BE ASSEMBLED IN BECAUSE
8982         SUBI A,4        ;THEY ARE MUTLTIPLY RELOCATABLE, AND IN DEC
8983         MOVSI AA,CCOMPB-CCOMPE  ;VERSION THAT CAN'T BE DONE)
8984 MACIN0: MOVEM A,CCOMPB(AA)
8985         AOJ A,
8986         AOBJN AA,MACIN0
8987         MOVE A,MACTAD
8988         ADDI A,MACL+1777
8989         ANDI A,-2000    ;ADDR OF 1ST WD AFTER MACTAB.
8990         CALL MACIN2     ;SET UP PTRS TO END OF MACTAB.
8991         SETZM GCCNT     ;CLEAR OUT GC COUNT SO WILL GET MORE CORE FIRST THREE
8992 MACIN1: SETZM MDEPTH    ;NOW INITIALIZE MACRO EXPANSION STATUS
8993         SETZM PRSTG     ;NOW TO CLEAR OUT BYTE POINTERS
8994         MOVE A,[PRSTG,,PRSTG+1]
8995         BLT A,EPRSTT-1
8996         MOVEI A,DSTG
8997         MOVEM A,RDWRDP
8998         MOVEI A,DMYAGT
8999         MOVEM A,TOPP
9000         MOVEM A,BBASE
9001         MOVE A,[-MPDLL,,MACPDL]
9002         MOVEM A,MACP
9003         POPJ P,
9004
9005 ;A -> 1ST WD AFTER MACTAB, SET UP ALL POINTERS TO END OF MACTAB.
9006 MACIN2: MOVEM A,MACTND
9007         SUB A,MACTAD
9008         LSH A,2         ;1ST BYTE MACTAB DOESN'T HAVE.
9009         MOVEM A,MACHI
9010         SUBI A,MACRUM*4
9011         MOVEM A,GCRDHI
9012         MOVE A,STOPPT
9013         HRR A,MACTND
9014         SOS A           ;LAST WD IN MACTAB.
9015         MOVEM A,MACHIB  ;INITIALIZE BYTE POINTER TO HIGHEST BYTE OK TO FILL
9016         RET
9017
9018                 ;MACRO VARIABLE AREA (MOST THEREOF)
9019
9020 VBLK
9021 MACP:   0       ;MAC PDL POINTER
9022 BLCODE [MACPDL: BLOCK MPDLL+1]  ;MACRO PDL
9023 FREEPT: 0       ;MACRO STG PNTR POINTS TO FREE CHAR
9024 FREPTB: 0       ;FREEPT IN BYTE POINTER FORM
9025 MACTAD: MACTBA  ;ADDR OF START OF MACRO TABLE.
9026 MACTND: 0       ;ADDR OF 1ST WD AFTER MACTAB.
9027 MACHI:  0       ;CHAR ADR ONE ABOVE ACTIVE MACTAB
9028 MACHIB: 0       ;POINTS TO LAST BYTE IN MACTAB
9029 \f
9030 SCONDF: 0       ;STRING CONDITIONAL FLAG, -1 => IDENTICAL, 0 DIFFERENT
9031 GENSM:  0       ;GENERATED SYM COUNT
9032 DEFNPS: 0       ;NONZERO => NAME OF PSEUDO NOW READING ITS ARG.
9033                 ;A FATAL ERROR WILL TYPE THE PSEUDO'S NAME.
9034 DEFNPN: 0       ;PAGE # -1 OF THAT PSEUDO. ALSO TYPED BY FATAL ERRORS.
9035 DEFNLN: 0       ;LINE # -1.
9036 DEFNFI: 0       ;SIXBIT FN1 OF FILE CONTAINING PSEUDO THAT DEFNPS REFERS TO.
9037 MDEPTH: 0       ;DEPTH IN MACRO (NOT IRP OR REPEAT) EXPANSIONS
9038 PUTCNT: 0       ;AOS'D BY PUTREL, USED BY CALLING ROUTINE, USUALLY TO COUNT ACTIVE CHARS (DURING DEFINITION)
9039 IRPCR:  0       ;COUNT OF A,B,[LIST] GROUPS IN IRP IRPC IRPS, " " "
9040 AIRPT:  0       ;IRP EXPANSION TEMP, -1 => NO NON-NULL DUMMYS YET, ELSE 0
9041 AIRPN0: 0       ;1ST NUMERIC ARG TO IRPNC
9042 AIRPN1: 0       ;2ND,
9043 AIRPN2: 0       ;3RD.
9044 A.QOT2: 0       ;DELIMITER FOR .QUOTE
9045 CRPTCT: -1      ;COUNT THROUGH CURRENT REPEAT (FOR .RPCNT)
9046 CIRPCT: -1      ;COUNT THOUGH CURRENT IRP (FOR .IRPCNT)
9047 A.GST3: 0       ;ON .GO, NAME (IN SQUOZE) OF TAG BEING SEARCHED FOR
9048 A.GST4: 0       ;BYTE POINTER FOR ILDB WHILE SEARCHING FOR TAG
9049 PRCALP: PRCAL-1 ;POINTER INTO PRCALP, POINTS TO LAST ACTIVE ENTRY
9050
9051 PRSTG:                  ;BEGIN WORDS GARBAGE COLLECTED: FIRST BYTE POINTERS ILDB'D
9052
9053 CPTR:   0       ;ILDB TO GET NEXT CHAR FROM MACRO OR WHATEVER
9054 IFE WRQTSW-1,WRQTBP:    0       ;POINTS TO LAST CHAR BEFORE CURRENT SYL AT WRQOTE
9055 AIRPSP: 0       ;-> PLACE TO STORE SYL-TERMINATOR, IN IRPS READIN.
9056 GCBPL==.-PRSTG  ;END BYTE POINTERS, BEGIN CHARACTER ADDRESSES
9057 PRSCND: 0       ;CHARACTER ADDRESS OF CURRENT LOCATION IN FIRST STRING OF IFSE,IFSN WHILE COMPARING WITH SECOND
9058 PRSCN1: 0       ;CHAR ADR BEG OF FIRST STRING IFSE, IFSN
9059 PRREPT: 0       ;CHAR ADR BEG OF BODY OF REPT
9060 PRIRP:  0       ;CHAR ADR BEG OF IRP BODY
9061 PRDEF:  0       ;CHAR ADR BEG OF MACRO BEING DEFINED
9062 PRCAL:  REPEAT 10,0     ;TEMP STORAGE FOR CHAR ADR BEG MACRO BODY, USED TO READ DUMMY SPECS
9063 EPRSTT:         ;END CHAR ADR WORDS GARBAGE COLLECTED
9064
9065                 ;BEGIN GARBAGE COLLECTOR VARIABLES
9066
9067 GCCNT:  0       ;CNT OF GC'S
9068 SYMSTR: 0       ;PNTR TO CHAIN OF MACRO PNTRS IN SYM TABLE (DURING GC), LINKED THROUGH RH'S OF "VALUE"
9069 REDPT:  0       ;CHAR ADR READING FROM WHEN MOVING STRING DOWN
9070 REDPTB: 0       ;REDPT IN BYTE POINTER FORM
9071         ;GC WRITES WITH FREEPT/FREPTB
9072 COFST:  0       ;AMOUNT CHARS MOVED DOWN BY, SUBTRACTED FROM CHAR ADR TO RELOCATE
9073 SVF:    0       ;FLAG, .GE. 0 => NO POINTERS FOUND POINTING TO CURRENT STRING
9074 FREPTS: 0       ;-> BEGINNING OF CURRENT STRING BEING COPIED DOWN
9075 FRPTBS: 0       ;FREPTS IN BYTE POINTER FORM
9076 GCENDF: 0       ;-1 => END OF LAST STRING FOUND, AFTER RELOCATING POINTERS, MSTG2 SHOULD EXIT
9077 GCHI:   0       ;GC HIGH POINTER, CHAR ADR FIRST NOT TO GARBAGE COLLECT
9078 GCRDHI: <MACL-MACRUM>*4 ;GC DROPS DEAD (MACTAB FULL) IFWRITING INTO THIS CHAR ADR
9079 BLCODE [GCSV:   BLOCK 16]       ;AC SAVE AREA FOR GC
9080 PBLK
9081 \f
9082                 ;GARBAGE COLLECT THE MACRO TABLE
9083
9084 GCA1:   MOVE A,FREEPT   ;GC ALL IN MACTAB.
9085 GCA:    MOVEM A,GCHI    ;ENTRY TO STORE A IN GCHI -> FIRST CHAR NOT TO GARBAGE COLLECT
9086 GC:     MOVEM 17,GCSV+15
9087         MOVE 17,[2,,GCSV]
9088         BLT 17,GCSV+14
9089 IFN TS,[AOS A,GCCNT
9090         CAIGE A,4
9091         PUSHJ P,GCCORQ  ;EXPAND CORE ON FIRST THREE GC'S
9092 ]       CLEARB T,GCENDF
9093         MOVEI A,3
9094         MOVEM A,REDPT   ;SET UP FOR READING
9095         MOVEM A,FREEPT  ;ALSO FOR WRITING
9096         MOVE A,BCOMPU   ;ALSO SET UP CORRESPINDING BYTE POINTERS
9097         MOVEM A,FREPTB
9098         MOVEM A,REDPTB
9099         MOVE C,[-GCBPL,,PRSTG]
9100 GCLP1:  SKIPN B,(C)     ;NOW CONVERT BYTE POINTERS...
9101         JRST GCLP1B     ;(INACTIVE)
9102         CCOMP B,-1      ;TO CHARACTER ADDRESSES
9103         MOVEM B,(C)     ;STORE BACK CHARACTER ADDRESS
9104 GCLP1B: AOBJN C,GCLP1   ;LOOP FOR ALL SUCH BYTE POINTERS
9105         MOVE A,SYMAOB   ;NOW SET UP MACRO LIST; T INITIALLY HAS 0 => END OF LIST DURING COMPUTATION
9106 SYMMG:          ;POINTS TO FIRST MACRO SYMTAB ENTRY ON LIST
9107         LDB B,[400400,,ST(A)]   ;GET SQUOZE FLAGS THIS SYM
9108         CAIN B,PSUDO_-14.       ;PSEUDO? (=> MAYBE MACRO)
9109         JRST SYMMG1     ;YES, MAYBE PUT ON LIST (RETURNS TO SYMMG2)
9110 SYMMG2: ADD A,WPSTE1
9111         AOBJN A,SYMMG   ;LOOP FOR ENTIRE SYMTAB
9112         MOVEM T,SYMSTR  ;STORE INITIAL LIST ENTRY FOR MACROS
9113                 ;DROPS THROUGH
9114         ;GC DEALS WITH "UNIT STRINGS", EACH STRING ENDS WITH 375
9115         ;GENERAL PROCEDURE IS TO COPY A STRING DOWN THEN SEARCH FOR POINTERS TO WHERE STRING USED TO BE
9116         ;IF POINTERS FOUND THEY ARE RELOCATED TO POINT TO COPIED DOWN STRING
9117         ;IF POINTERS ARE NOT FOUND THE STRING IS WIPED OUT
9118                 ;DROPS THROUGH
9119
9120 MSTG:   MOVE C,REDPT    ;SET UP C TO POINT TO BEG OF STRING BEING READ
9121                 ;(FOR EVENTUALLY SEARCHING FOR POINTERS TO STRING, NOTE C STAYS AROUND FOR AWHILE)
9122         MOVE TT,FREEPT
9123         MOVEM TT,FREPTS ;-> BEGINNING OF WRITTEN STRING
9124         MOVE TT,FREPTB
9125         MOVEM TT,FRPTBS ;BYTE POINTER -> BEGINNING OF WRITTEN STRING
9126         PUSHJ P,RDTRNS  ;COPY CHARACTER
9127         CAIN B,370
9128          JRST MSTGB     ;THAT WAS NO STRING, THAT WAS MY IO-BUFFER!
9129         MOVE TT,B       ;SAVE CHARACTER JUST COPIED
9130 MSTG1:  CAML LINK,GCHI
9131         JRST GCEND      ;JUST READ LAST CHAR IN PART OF MACTAB TO GARBAGE COLLECT => DONE
9132         CAIN B,375
9133         JRST MSTG2      ;END THIS STRING, NOW SEARCH FOR POINTERS, RETURNS TO MSTG
9134         PUSHJ P,RDTRNS  ;STRING NOT EXHAUSTED, COPY NEXT CHAR
9135         JRST MSTG1
9136 \f
9137 SYMMG1: HRRZ B,ST+1(A)  ;PSEUDO FOUND IN SYMTAB, GET "VALUE"
9138         CAIE B,MACCL    ;MACCL? (=> MACRO, CHAR ADR OF BODY IN LH)
9139         JRST SYMMG2     ;NO, JUST FALL BACK INTO LOOP
9140         HRRM T,ST+1(A)  ;MACRO, REPLACE MACCL PART OF VALUE WITH POINTER TO NEXT
9141         MOVEI T,ST+1(A) ;UPDATE T (INITIAL LIST ENTRY) TO POINT TO WORD JUST CLOBBERED
9142         PUSH P,A
9143         HLRZ A,ST+1(A)
9144         PUSHJ P,REDINC
9145         CAIE B,374
9146         HALT
9147         POP P,A
9148         JRST SYMMG2
9149
9150                 ;COPY CHARACTER DOWN (REDPTB -> FREPTB)
9151         ;LEAVE INCREMENTED REDPT IN LINK, FREEPT IN A, CHAR IN B
9152
9153 RDTRNS: ILDB B,REDPTB
9154         IDPB B,FREPTB
9155         AOS LINK,REDPT
9156         AOS A,FREEPT
9157         POPJ P,
9158
9159 MSTGB:  ADDI A,3        ;COPY AN IO-BUFFER:
9160         TRZ A,3
9161         MOVEM A,FREEPT  ;WRITE INTO WORD BOUNDARY.
9162         ADDI LINK,3
9163         TRZ LINK,3
9164         MOVEM LINK,REDPT        ;READ FROM WORD BOUNDARY.
9165         MOVEI B,041000
9166         HRLM B,REDPTB
9167         HRLM B,FREPTB
9168         MOVE B,FREPTB
9169         MOVE A,REDPTB
9170         ADDI B,1        ;NEW ADDR OF 1ST WD.
9171         HRRZ LINK,1(A)  ;GET ADDR OF POINTER TO STRING.
9172         MOVEM LINK,SVF  ;REMEMBER WHETHER TO FLUSH STRING.
9173         SKIPE LINK
9174         HRRM B,(LINK)   ;RELOCATE THAT POINTER (IF ANY)
9175         HRLI B,1(A)     ;SET UP AC FOR BLT.
9176         HLRZ LINK,1(A)  ;GET LENGTH OF STRING.
9177         ADDM LINK,REDPTB
9178         LSH LINK,2
9179         ADDM LINK,FREEPT
9180         ADDM LINK,REDPT
9181         LSH LINK,-2
9182         ADDB LINK,FREPTB
9183         BLT B,(LINK)
9184         MOVE LINK,REDPT
9185         CAML LINK,GCHI  ;IF THIS IO-BUFFER IS LAST THING IN MACRO SPACE,
9186          SETOM GCENDF   ;DON'T LOOK FOR ANYTHING FOLLOWING IT.
9187         JRST MSTGB1     ;NOW MAYBE FLUSH THIS STRING,  COPY NEXT.
9188 \f
9189                 ;GET HERE WHEN MSTG2 FINISHES WITH FLAG SET TO EXIT: UNDO INITIALIZATION AND RETURN
9190
9191 GCEND1: IFN TS,[
9192         MOVE A,FREEPT
9193         ADDI A,2000*4
9194         CAML A,MACHI
9195         PUSHJ P,GCCORQ
9196 ]       MOVE A,FREEPT
9197         CAML A,GCRDHI
9198          ETF [ASCIZ /Macro space full/]
9199         SKIPN T,SYMSTR
9200         JRST USYMG1     ;EMPTY LIST
9201         MOVEI C,MACCL   ;SET UP C FOR HRRM'ING
9202 USYMG:  HRRZ TT,(T)     ;GET ADR ON LIST
9203         HRRM C,(T)      ;CLOBBER RH JUST GOT NEXT POINTER FROM TO MACCL
9204         HLRZ A,(T)
9205         PUSHJ P,REDINC
9206         CAIE B,374
9207         HALT
9208         SKIPE T,TT      ;MAKE NEXT POINTER CURRENT, SKIP IF END OF LIST
9209         JRST USYMG
9210
9211 USYMG1: MOVE C,[-GCBPL,,PRSTG]
9212 GCLP2:  MOVE A,(C)      ;NOW CONVERT CHARACTER ADDRESSES...
9213         BCOMP A,-1      ;BACK TO BYTE POINTERS
9214         MOVEM A,(C)
9215         AOBJN C,GCLP2
9216         MOVS 17,[2,,GCSV]
9217         BLT 17,17
9218         POPJ P,         ;EXIT FROM GARBAGE COLLECTOR
9219
9220                 ;GC ROUTINE TO SCAN TABLE AREA FOR POINTERS TO CURRENT STRING
9221                 ;CH1 -> BEGINNING OF TABLE, 4.9 => LOOK AT PAIRS SKIPPING SECOND OF EACH PAIR
9222                 ;T POINTS TO LAST WORD IN TABLE + 1
9223                 ;RELOCATE POINTERS IN TABLE POINTED TO
9224                 ;C POINTS TO BEGINNING OF STRING, B -> END + 1
9225
9226 MSCN:   CAIG T,(CH1)
9227         POPJ P,         ;TABLE EXHAUSTED
9228         HRRZ TT,-1(T)   ;GET LAST ENTRY IN TABLE (UPPER POINTER UPDATED TO COUNT DOWN)
9229         CAML TT,C
9230         CAML TT,B
9231         JRST MSCN1      ;DOESN'T POINT TO CURRENT STRING
9232         SUB TT,COFST    ;POINTS TO STRING, RELOCATE
9233         HRRM TT,-1(T)   ;STORE BACK RELOCATED POINTER
9234         SETOM SVF       ;SET FLAG TO SAVE STRING
9235 MSCN1:  SKIPGE CH1
9236         SOS T           ;CH1 NEGATIVE => SKIP A WORD
9237         SOJA T,MSCN
9238 \f
9239 GCEND:  SETOM GCENDF    ;DONE READING FROM MACTAB, BUT FIRST HAVE TO RELOCATE POINTERS TO LAST STRING
9240 MSTG2:  CLEARM SVF      ;NO POINTERS FOUND TO STRING YET
9241         MOVE D,REDPT
9242         SUB D,FREEPT
9243         MOVEM D,COFST   ;STORE AMOUNT CHARS COPIED DOWN BY FOR CHAR ADR RELOCATION
9244         MOVE B,REDPT
9245         CAIE TT,374
9246         JRST MSTG3      ;NOT A MACRO
9247         MOVE T,SYMSTR
9248         JUMPE T,MSTG3   ;JUMP IF NO MACROS ON LIST
9249 MSTG5:  HLRZ TT,(T)     ;GET CHAR ADR THIS MACRO
9250         CAML TT,C       ;SKIP IF POINTS BELOW BEGINNING THIS STRING
9251         CAML TT,B       ;SKIP UNLESS POINTS TO OR ABOVE FIRST CHAR NOT YET READ
9252         JRST MSTG4      ;DOESN'T POINT TO THIS STRING
9253         SETOM SVF       ;POINTS TO THIS STRING, SET FLAG TO SAVE STRING
9254         SUB TT,COFST    ;RELOCATE
9255         HRLM TT,(T)     ;STORE BACK UPDATED CHAR ADR THIS MACRO
9256 MSTG4:  HRRZ T,(T)      ;NOW GET POINTER TO NEXT MACRO
9257         JUMPN T,MSTG5   ;LOOP FOR ALL MACROS ON LIST
9258
9259 MSTG3:  MOVE T,TOPP
9260         MOVEI CH1,DMYAGT
9261         PUSHJ P,MSCN    ;RELOCATE POINTERS IN DUMMY ARG TABLE
9262         HRRZ T,MACP
9263         HRROI CH1,MACPDL
9264         PUSHJ P,MSCN    ;RELOCATE POINTERS IN MACRO PDL
9265         HRRZ T,PRCALP
9266         AOS T
9267         MOVEI CH1,PRSTG
9268         PUSHJ P,MSCN    ;RELOCATE POINTERS IN PRSTG
9269         HRRZ T,RDWRDP
9270         MOVEI CH1,DSTG
9271         PUSHJ P,MSCN    ;RELOCATE DUMMY ARGS READ (OR BEING READ) IN BUT NOT YET ACTIVATED
9272         SKIPGE GCENDF
9273          JRST GCEND1    ;EXIT
9274 MSTGB1: SKIPE SVF
9275          JRST MSTGB2    ;FOUND POINTERS TO THIS STRING, DON'T FLUSH
9276         MOVE TT,FREPTS  ;NO POINTERS FOUND, FLUSH STRING
9277         MOVEM TT,FREEPT
9278         MOVE TT,FRPTBS
9279         MOVEM TT,FREPTB
9280 MSTGB2: SKIPGE GCENDF   ;IF WE JUST HACKED AN I-O BUFFER, MAYBE IT'S THE LAST
9281          JRST GCEND1    ;THING IN MACRO SPACE.
9282         JRST MSTG
9283
9284 ]               ;END MACSW CONDITIONAL (AND MACRO PROCESSOR ROUTINES)
9285 \f
9286 IFN .I.FSW,[    ;;.I.F          ;ALGEBRAIC COMPILER ROUTINE
9287 ;               'ALGEBRAIC' CRUFT MARO DEFINITIONS
9288
9289 DEFINE MOAN ARG/
9290         MOVEI D,[SIXBIT /ARG!!/]
9291         JRST ERRCON
9292 TERMIN
9293
9294 DEFINE RETLIN
9295         MOVEI A,15      ;CARRIAGE RETURN
9296         PUSHJ P,PUTREL
9297         MOVEI A,12      ;LINE FEED
9298         PUSHJ P,PUTREL
9299 TERMIN
9300
9301 DEFINE NUMBER
9302         MOVE A,BTPNT
9303         ILDB I,A
9304         CAIE I,"#
9305         CAIGE I,"@
9306 TERMIN
9307
9308 DEFINE RESTOR
9309         MOVE D,BTPNT
9310         SETZM STRING
9311         SETZM STRING+1
9312         SETZM STRING+2
9313 TERMIN
9314
9315
9316 DEFINE SPECN
9317         POP P,RANDM
9318         MOVE A,ENN
9319         SUB A,RANDM
9320         MOVEM A,ENN
9321 TERMIN
9322
9323 DEFINE GET
9324         EXCH I,ACSAV+1
9325         PUSHJ P,RCH
9326         EXCH I,ACSAV+1
9327 TERMIN
9328
9329 DEFINE GETT
9330         EXCH I,ACSAV+1
9331         PUSHJ P,RCH
9332         EXCH I,ACSAV+1
9333         IDPB A,TPN
9334 TERMIN
9335 \f
9336 ;               START OF COMPILER PROPER
9337
9338 OPDL:   CH?CH?CH?CH?CH?CH?CH?CH ;COMMUTATOR
9339         CH?SP?CH?CH?CH?CR?CH?CH
9340         CH?CH?CH?CH?CH?CH?CH?CH
9341         CH?CH?CH?CH?CH?CH?CH?CH
9342         SP?CH?CH?CH?DL?CH?CH?CH
9343         LP?RP?TX?PL?CM?MN?CH?DV
9344         CH?CH?CH?CH?CH?CH?CH?CH
9345         CH?CH?CH?KL?LB?EQ?RB?CH
9346
9347 ;       CH?CH?CH?CH?CH?CH?CH?CH
9348 ;       CH?CH?CH?CH?CH?CH?CH?CH
9349 ;       CH?CH?CH?CH?CH?CH?CH?CH
9350 ;       CH?CH?CH?CH?CH?CH?UP?CH
9351 ;       CH?CH?CH?CH?CH?CH?CH?CH
9352 ;       CH?CH?CH?CH?CH?CH?CH?CH
9353 ;       CH?CH?CH?CH?CH?CH?CH?CH
9354 ;       CH?CH?CH?CH?CH?CH?CH?CH
9355
9356 VBLK
9357
9358 ENN:    60      ;ACCUMULATOR NUMBER - TROUBLE IF GOES PAST 9
9359
9360 BTPNT:  440700,,STRING  ;D
9361 STRING: BLOCK 10        ;CHARACTER ASSEMBLY (D) - TROUBLE IF OVERFLOWS 
9362
9363 TPN:    0
9364 DIRPNT: 440700,,DIROUT  ;TPN
9365 DIROUT: BLOCK 40        ;COPY OF LINE IN PROGRESS (TPN) - TROUBLE IF OVERFLOWS
9366
9367 OPSTKL==40
9368         0
9369 OPSTK:  BLOCK OPSTKL    ;OPERATOR STACK (R) - TROUBLE IF OVERFLOWS
9370         0
9371
9372
9373
9374 ENDSTT: 0       ;ON IF END OF STATEMENT ENCOUNTERED
9375 CHARF:  0       ;LAST WAS NOT OPERATOR
9376 NUMFL:  0       ;STRING IS NUMERIC CONSTANT (NEEDS [ AND ])
9377 R1SV:   0       ;SAVED A
9378 R2SV:   0       ;SAVED I, CALLED V EARLIER ON
9379
9380 INTEGR: 0       ;INTEGER ARITHMETIC
9381 WARN:   0       ;ON AFTER ) TO STOP NON-OPERATOR
9382 RANDM:  0       ;DUMP COMMA COUNT HERE
9383 ACSAV:  BLOCK 7
9384 TEMP:   440600,,(D)     ;INDIRECT VIA D
9385 BYTPNT: 0
9386 PBLK
9387 \f
9388 ;               ENTRANCE TO 'ALGEBRAIC' TRANSLATOR
9389
9390 A.I:    SETOM INTEGR
9391         SKIPA
9392 A.F:    SETZM INTEGR
9393         PUSHJ P,SWINI   ;INITIALISE PASSAGE TO MIDAS ASSEMBLER
9394         MOVE TM,[P,,ACSAV]
9395         BLT TM,ACSAV+6
9396         SETZM ENDSTT    ;RESET END OF STMNT FLAG
9397         SETZM EQHIT'    ;RESET LAST CHAR WAS= FLAG
9398         SETZM WARN      ;SET OFF ERROR DETECTOR
9399         MOVEI A,"0      ;INITIALISE POINTERS
9400         MOVEM A,ENN
9401         MOVE A,DIRPNT
9402         MOVEM A,TPN     ;POINTER TO SAVED INPUT
9403         MOVE SYM,[-OPSTKL,,OPSTK]
9404         PUSH SYM,[0,,ENDSAT]
9405         PUSH P,[0]      ;INITIALISE COMMA-COUNTER
9406         SETZM CHARF
9407 CLSTR:  RESTOR
9408 RDITTS: SKIPE ENDSTT
9409         JRST BDEND
9410 RDITA:  GETT
9411         CAIGE A,100     ;FOR ABBREVIATED DISPATCH TABLE
9412         JRST @OPDL(A)
9413         CAIN A,"\
9414         JRST AB
9415         CAIN A,"^
9416         JRST UP
9417
9418 CH:     SETZM EQHIT
9419         SKIPE WARN
9420         JRST CHBRT
9421 CHEY:   IDPB A,D
9422         SETOM CHARF     ;NON UNARY FLAG
9423         JRST RDITA
9424
9425 GAMB:   RESTOR
9426 COMMT:  MOVE I,R2SV
9427         JRST GOPURT
9428
9429 SHORT:  ;DECIDES IF STRING CAN BE USED IN IMMEDIATE TYPE OPS
9430         SETZM IMMED'
9431         SKIPN STRING
9432         POPJ P,         ;NO STRING
9433         MOVE A,BTPNT
9434         ILDB I,A
9435         CAIN I,"#
9436         JRST APUPJ      ;YEPE HE ASKED FOR IT
9437         SKIPE STRING+1
9438         POPJ P,         ;STRING IS LONG
9439         SKIPA
9440 \f
9441 TSTSHL: ILDB I,A
9442         JUMPE I,APUPJ   ;ITS OK FOUND ONLY NUMBERS
9443         CAILE I,"@
9444         POPJ P,         ;NON-NUMBER IN STRING
9445         CAIE I,".
9446         JRST TSTSHL
9447         ILDB I,A
9448         SKIPN I         ;ANYTHING FOLLOW '.' QST
9449 APUPJ:  SETOM IMMED'    ;INDICATE IMMEDIATE USAGE IS POSSIBLE
9450         POPJ P,
9451
9452 SZPRT:  SETZM CHARF
9453 GOPRT:  SETZM WARN
9454 GOPART: MOVEM I,R2SV
9455 GOPURT: HLRZ B,I
9456         HLRZ C,(SYM)
9457         CAMLE B,C
9458         JRST PSOPR      ;GO PUSH OPERATOR
9459         SKIPN INTEGR
9460         SETOM IMMED     ;FOR ARITH OPS ONLY FIXED WILL DO IMMEDIATE
9461         PUSHJ P,SHORT   ;ESTABLISH IF STRING CAN BE IMMEDIFIED
9462         POP SYM,A       ;POP AN OPERATOR
9463         JUMPN A,(A)
9464
9465         MOAN OVERPOPPED OPERATOR STACK
9466
9467 CHEX:   MOVE A,R1SV
9468         JRST CHEY
9469
9470 RP:     SKIPE EQHIT
9471         AOS ENN         ;TAKE CARE OF UNSATISFIED = AT END
9472         SKIPN CHARF
9473         JRST RTONOP
9474         SETOM CHARF
9475 BUDDY:  SETOM WARN
9476         MOVEI I,RPAR
9477         JRST GOPART
9478
9479 RTONOP: MOVE I,(SYM)
9480         CAIN I,FUNCT
9481         JRST BUDDY      ;NO ARGUMENT FUNCTION
9482
9483         MOAN ) FOLLOWS OPERATOR
9484
9485 BDEND:  MOAN TOO MANY ('S
9486
9487 CHBRT:  MOAN NON-OPERATOR FOLLOWS )
9488
9489 \f
9490 CR:     SKIPE EQHIT
9491         AOS ENN ;HANDLES UNSATISFIED = AT END
9492         SETOM ENDSTT
9493         MOVEI I,RCAR
9494         JRST GOPRT
9495
9496 LP:     SETZM EQHIT
9497         SKIPE WARN
9498         JRST LFRHT
9499         SETZM CHARF
9500         SKIPE STRING
9501         JRST INDX
9502         PUSH P,[0]      ;INITIALISE COMMA-COUNTER
9503         PUSH SYM,[0,,LFTPR]
9504         JRST RDITA
9505
9506 INDX:   NUMBER
9507         JRST NUSTRB
9508         GETT
9509         CAIG A,"9
9510         JRST NMRINX
9511         MOVEI I,"(      
9512         IDPB I,D
9513 INDY:   IDPB A,D
9514         GETT
9515         CAIN A,"+       ;IS IT COMPOUND SUBSCRIPT
9516         JRST CMPNDN
9517         CAIN A,"-
9518         JRST CMPNDN
9519         CAIE A,")       ;SEARCH FOR NEXT RP
9520         JRST INDY
9521         IDPB A,D
9522 CMBAN:  SETOM CHARF     ;MAKE BELIEVE CHARATER LAST
9523         SETOM WARN      ;YET SET ) TRAP
9524         JRST RDITA
9525
9526 NMRINX: CAIN A,"-       ;IS IT A MINUS
9527         JRST INDZ
9528         CAIN A,"+
9529         JRST INDZ
9530         MOVEI I,"+      ;NUMERICAL SUBSCRIPT
9531         IDPB I,D
9532 INDZ:   IDPB A,D
9533         GETT
9534         CAIN A,"+       ;IS IT COMPOUND SUBSCRIPT
9535         JRST CMPNDC
9536         CAIE A,")
9537         JRST INDZ
9538         JRST CMBAN
9539
9540 CMPNDN: MOVEI I,")
9541         IDPB I,D
9542         JRST INDZ
9543
9544 CMPNDC: MOVEI I,"(
9545         IDPB I,D
9546         JRST INDY
9547
9548 LFRHT:  MOAN ( FOLLOWS DIRECTLY ON )
9549 \f
9550 SP=RDITA        ;USE FOR NON ARITH STATS
9551
9552 CM:     MOVE I,[1,,COMMX]
9553         SKIPN CHARF
9554         AOS ENN
9555         JRST SZPRT
9556
9557 EQ:     SETOM EQHIT
9558         SETZM WARN
9559         SKIPN CHARF     ;TEST FOR EXISTANCE OF  L H S
9560         JRST EQFLOP
9561         NUMBER          ;IS  L H S A NUMBER
9562         JRST EQNUMB
9563         MOVEI I,EQAAL
9564 EQVAL:  SETZM CHARF
9565         PUSH SYM,I
9566         PUSH P,STRING
9567         PUSH P,STRING+1
9568         PUSH P,STRING+2
9569         PUSH P,[0]
9570         JRST CLSTR
9571
9572 PL:     MOVE I,[2,,PLUS]
9573         SKIPN CHARF
9574         JRST RDITA      ;UNARY PLUS
9575         JRST SZPRT
9576
9577 MN:     MOVE I,[2,,MINUX]
9578         SKIPN CHARF
9579         MOVE I,[5,,UMINU]
9580         JRST SZPRT
9581
9582 AB:     SKIPE CHARF     ;ABSOLUTE VALUE
9583         JRST ABERR      ;NOT UNARY
9584         MOVE I,[5,,UABS]
9585         JRST SZPRT
9586
9587 LB:     SKIPN CHARF
9588         JRST LP ;TREAT LIKE (
9589         NUMBER
9590         JRST NUBRST
9591         MOVEI I,FUNCT
9592         JRST EQVAL
9593
9594 RB=RP
9595
9596 NUBRST: MOAN '<' FOLLOWS NUMBER
9597
9598 NUSTRB: MOAN '(' FOLLOWS NUMBER
9599
9600 EQFLOP: MOAN '=' FOLLOWS OPERATOR
9601
9602 EQNUMB: MOAN '=' FOLLOWS NUMBER
9603
9604 ABERR:  MOAN NON-UNARY ABS
9605 \f
9606 TX:     MOVE I,[4,,TIMES]
9607         SKIPN CHARF
9608         JRST RDITA      ;UNARY TIMES
9609         JRST SZPRT
9610
9611 DL:     GET     ;CONTINUE STATEMENT RC
9612         GET     ;LF
9613         GET     ;.
9614         CAIE A,".       ;DOT
9615         JRST BDCONT
9616         GET     ;F OR I
9617         GET     ;CONTROL I OR SPACE
9618         MOVE A,DIRPNT
9619         MOVEM A,TPN     ;RESET SAVED INPUT POINTER TO AVOID FILLING ITS BUFFER
9620         MOVEI A,"$
9621         IDPB A,TPN
9622         MOVEI A,40
9623         IDPB A,TPN      
9624         JRST RDITA
9625
9626 ERRCON: TRNE FF,FRPSS2  ;NO OUTPUT ON SECOND PASS
9627         JRST CONRBT
9628 ;MAY ALSO WANT TO USE STATEMENT PLUS LINE NUMBER TYPE TACTIC
9629         MOVE B,DIRPNT
9630 OUTRR:  ILDB A,B
9631         PUSHJ P,TYO
9632         CAME B,TPN
9633         JRST OUTRR
9634         SKIPE ENDSTT
9635         JRST CONERT
9636 DORSTL: MOVEI A,40
9637         PUSHJ P,TYO
9638         MOVEI A,"?      ;POINT AT ERROR
9639         PUSHJ P,TYO
9640         MOVEI A,40
9641         PUSHJ P,TYO
9642 DORSAL: GET             ;COPY UP TO LINE FEED
9643         PUSHJ P,TYO
9644         CAIE A,12       ;LF
9645         JRST DORSAL
9646 CONERT: PUSHJ P,TIPIS
9647         PUSHJ P,CRR
9648 CONRAT: MOVE TM,[ACSAV,,P]
9649         BLT TM,P+6
9650         JRST SWFLS      ;GO BACK AND FLUSH 
9651
9652
9653 CONRBT: GET
9654         CAIE A,12       ;LF
9655         JRST CONRBT
9656         JRST CONRAT
9657
9658 \f
9659 UP:     SKIPN WARN      ;FOR (NUMBER)^N
9660         SKIPN STRING
9661         JRST ITSEX
9662         MOVEM A,R1SV    ;SAVE THE ARROW
9663         NUMBER
9664         JRST CHEX       ;ITS PART OF A NUMBER
9665 ITSEX:  MOVE I,[6,,STRSTR]
9666         SKIPN CHARF
9667         JRST EXMB
9668         JRST SZPRT
9669
9670 EXMB:   MOAN UNARY ^
9671
9672 BDCONT: MOAN BAD CONTINUATION
9673
9674 KL=CR   ;SEMICOLON ACTS LIKE CR IN TERMINATING
9675
9676 STRSTR: SKIPN STRING
9677         JRST EXLS
9678         NUMBER
9679         SKIPA
9680         JRST EXLS
9681         SUBI I,61
9682         TDNE I,[-1,,777774]
9683         JRST EXLS
9684         MOVE A,STRING
9685         TDNE A,[3777,,-1]
9686         JRST EXLS
9687         ADDI I,POWR
9688         JRST @(I)
9689
9690 EXLS:   PUSH P,[ASCII !EXPLO!]
9691         PUSH P,[ASCII !G    !]
9692         PUSH P,[0]
9693         PUSH P,[1]
9694         SETOM EXRET'
9695         JRST FUNET
9696
9697 DV:     MOVE I,[4,,DIVIX]
9698         SKIPN CHARF
9699         MOVE I,[5,,UDIVI]
9700         JRST SZPRT
9701
9702 PSOPR:  PUSH SYM,I      ;PUSH OPERATOR FOR LATER EXCECUTION
9703         SKIPN STRING
9704         JRST RDITTS
9705         PUSHJ P,SHORT   ;CAN WE IMMEDIFY
9706         PUSHJ P,MVOI    ;AND MOVE OPERAND INTO STACK
9707         JRST CLSTR
9708
9709 \f
9710 PRODB:  NUMBER          ;OUTPUT WHAT IS IN STRING
9711         SKIPE IMMED     ;NO [ & ] IF IMMEDIATE USE
9712         JRST OVNM
9713         PUSH P,A
9714         MOVEI A,"[      ;[ FOR CONSTANT
9715         PUSHJ P,PUTREL
9716         POP P,A
9717         SETOM NUMFL
9718 OVNM:   CAIN I,"#
9719         JRST PRDOC
9720
9721         EXCH A,I
9722         PUSHJ P,PUTREL
9723         MOVE A,I
9724 PRDOC:  ILDB I,A
9725         JUMPN I,OVNM
9726         SKIPN NUMFL
9727         POPJ P,
9728         MOVEI A,"]      ;] FOR CONSTANT
9729         PUSHJ P,PUTREL
9730         SETZM NUMFL
9731         POPJ P,
9732
9733 PRODC:  HRLI A,440700   ;MAKE BYTE POINTER
9734         JRST PRDOC
9735
9736 LFTPR:  SPECN
9737         JRST RDITTS     ;IGNORE LP ON STACK
9738 \f
9739 RCAR:   HALT    ;IMPOSSIBLE FOR THESE TO BE ON STACK
9740 RPAR:   HALT
9741
9742 EQAAL:  SPECN
9743         SKIPE STRING
9744         PUSHJ P,MVOI
9745         MOVEI A,[ASCIZ !        MOVEM A!]
9746         PUSHJ P,PRODC
9747         POP P,STRING+2
9748         POP P,STRING+1
9749         POP P,STRING
9750         MOVE A,ENN
9751         SOS A
9752         PUSHJ P,FINOF
9753         JRST GAMB
9754
9755 ENDSAT: SPECN
9756         SKIPN ENDSTT
9757         JRST TOEARL
9758         SKIPE STRING
9759         PUSHJ P,MVOI
9760 GETLF:  GET
9761         CAIE A,12       ;LF
9762         JRST GETLF
9763         MOVE TM,[ACSAV,,P]
9764         BLT TM,P+6
9765         JRST SWRET      ;GO BACK
9766
9767 MVOI:   MOVE A,BTPNT
9768         ILDB I,A
9769         CAIN I,"&
9770         JRST MVOALR     ;OPERAND ALREADY THERE
9771         MOVEI A,[ASCIZ !        MOVE A!]
9772         SKIPE IMMED
9773         MOVEI A,[ASCIZ !        MOVEI A!]
9774 MVOIK:  PUSHJ P,PRODC
9775         MOVE A,ENN
9776         AOS ENN
9777 FINOF:  PUSHJ P,PUTREL
9778         MOVEI A,",
9779         PUSHJ P,PUTREL
9780         PUSHJ P,PRODB
9781         RETLIN
9782         POPJ P,
9783
9784 MVOALR: AOS ENN
9785         POPJ P,
9786
9787 TOEARL: MOAN TOO MANY )'S
9788 \f
9789 PLUS:   MOVEI A,[ASCIZ !        FADR A!]
9790         SKIPE INTEGR
9791         MOVEI A,[ASCIZ !        ADD A!]
9792         SKIPE IMMED
9793         MOVEI A,[ASCIZ !        ADDI A!]
9794 OPERT:  PUSHJ P,PRODC
9795         SKIPE STRING
9796         JRST GAINS
9797         SOS ENN
9798 OPRTE:  MOVE A,ENN
9799         SOS A
9800         PUSHJ P,PUTREL
9801         PUSHJ P,COMMAA
9802         MOVE A,ENN
9803         PUSHJ P,PUTREL
9804         RETLIN
9805         JRST COMMT
9806
9807 COMMAA: MOVEI A,",
9808         PUSHJ P,PUTREL
9809         MOVEI A,"A
9810         JRST PUTREL
9811
9812 GAINS:  MOVE A,ENN
9813         SOS A
9814         PUSHJ P,FINOF
9815         JRST GAMB
9816
9817 MINUX:  MOVEI A,[ASCIZ !        FSBR A!]
9818         SKIPE INTEGR
9819         MOVEI A,[ASCIZ !        SUB A!]
9820         SKIPE IMMED
9821         MOVEI A,[ASCIZ !        SUBI A!]
9822         JRST OPERT
9823
9824 TIMES:  PUSHJ P,TMSTR
9825         SKIPE IMMED
9826         MOVEI A,[ASCIZ !        IMULI A!]
9827         JRST OPERT
9828
9829 DIVIX:  MOVEI A,[ASCIZ !        FDVR A!]
9830         SKIPE INTEGR
9831         MOVEI A,[ASCIZ !        IDIV A!]
9832         SKIPE IMMED
9833         MOVEI A,[ASCIZ !        IDIVI A!]
9834         JRST OPERT
9835
9836 \f
9837 UMINU:  CAMN B,C
9838         JRST BAKWD              ;THESE HAVE TO BE STACKED REVERSE
9839         SKIPE STRING
9840         JRST MOABC
9841         MOVEI A,[ASCIZ !        MOVNS A!]
9842 UMINUC: PUSHJ P,PRODC
9843         MOVE A,ENN
9844         SOS A
9845         PUSHJ P,PUTREL
9846         RETLIN
9847         JRST COMMT
9848
9849 MOABC:  MOVEI A,[ASCIZ !        MOVN A!]
9850         SKIPE IMMED
9851         MOVEI A,[ASCIZ !        MOVNI A!]
9852         PUSHJ P,MVOIK
9853         JRST GAMB
9854
9855 UABS:   CAMN B,C
9856         JRST BAKWD
9857         SKIPE STRING
9858         JRST MOABS
9859         MOVEI A,[ASCIZ !        MOVMS A!]
9860         JRST UMINUC
9861
9862 MOABS:  MOVEI A,[ASCIZ !        MOVM A!]
9863         SKIPE IMMED
9864         MOVEI A,[ASCIZ !        MOVMI A!]
9865         PUSHJ P,MVOIK
9866         JRST GAMB
9867
9868 MVONT:  MOVEI A,[ASCIZ !        MOVE A!]
9869         PUSHJ P,PRODC
9870         MOVE A,ENN
9871         JRST ONMVS
9872
9873 TMSTR:  MOVEI A,[ASCIZ !        FMPR A!]
9874         SKIPE INTEGR
9875         MOVEI A,[ASCIZ !        IMUL A!]
9876         POPJ P,
9877 \f
9878 BAKWD:  PUSH SYM,A
9879         JRST PSOPR
9880
9881 UDIVI:  CAMN B,C
9882         JRST BAKWD      ;THESE HAVE TO BE STACKED REVERSE
9883         SKIPE INTEGR
9884         JRST UINDV
9885         SKIPN STRING
9886         PUSHJ P,MVONT
9887         MOVEI A,[ASCIZ !        HRLZI A!]
9888         PUSHJ P,PRODC
9889         MOVE A,ENN
9890         SKIPN STRING
9891         SOS A
9892         PUSHJ P,PUTREL
9893         MOVEI A,[ASCIZ !,201400!]
9894         PUSHJ P,PRODC
9895         RETLIN
9896         AOS ENN
9897         JRST DIVIX
9898
9899 ONTMS:  PUSHJ P,TMSTR
9900         PUSHJ P,PRODC
9901         MOVE A,ENN
9902         SOS A
9903 ONMVS:  PUSHJ P,PUTREL
9904         PUSHJ P,COMMAA
9905         MOVE A,ENN
9906         SOS A
9907 LSTCHX: PUSHJ P,PUTREL
9908         RETLIN
9909         POPJ P,
9910
9911 POWR:   GAMB?POWR2?POWAA?POWR4
9912
9913 POWR4:  PUSHJ P,ONTMS
9914 POWR2:  PUSHJ P,ONTMS
9915         JRST GAMB
9916
9917 POWAA:  PUSHJ P,MVONT
9918         AOS ENN
9919         PUSHJ P,ONTMS
9920         SOS ENN
9921         PUSHJ P,TMSTR
9922         PUSHJ P,PRODC
9923         RESTOR
9924         JRST OPRTE
9925
9926 COMMX:  AOS (P)
9927         SKIPE STRING
9928         PUSHJ P,MVOI
9929         JRST GAMB
9930 \f
9931 UINDV:  MOAN INTEGER UNARY DIVIDE
9932
9933 FUNCT:  SETZM EXRET
9934 FUNET:  SKIPE STRING
9935         PUSHJ P,MVOI
9936         SPECN
9937         PUSHJ P,MORFMC
9938         MOVEI A,[ASCIZ !        PUSHJ P,!]
9939         POP P,STRING+2
9940         POP P,STRING+1
9941         POP P,STRING
9942         PUSHJ P,PRODC
9943         PUSHJ P,PRODB
9944         RESTOR
9945         RETLIN
9946         PUSHJ P,MORFNC
9947         SKIPN EXRET
9948         JRST RDITTS     ;AS USED FROM FUNCT
9949         JRST COMMT      ;AS USED FROM  STRSTR
9950
9951 MORFMC: MOVE A,RANDM
9952         MOVEM A,RANSV'
9953         SKIPN CHARF     ;NO ARGUMENTS
9954         AOS ENN
9955         SETOM CHARF
9956         MOVEI A,"1
9957         CAMN A,ENN      ;ARE ARGUMENT ALREADY IN A0 AND UP
9958         POPJ P,
9959         SETZM CORDM
9960 MORYLP: PUSHJ P,ZENBD
9961         AOS CORDM
9962         SOSL RANSV
9963         JRST MORYLP
9964         POPJ P,
9965
9966 MORFNC: MOVEI A,"1
9967         CAMN A,ENN
9968         POPJ P,
9969         MOVE A,RANDM
9970         MOVEM A,CORDM'
9971 MORXLP: PUSHJ P,ZENBD
9972         SOSL CORDM
9973         JRST MORXLP
9974         POPJ P,
9975
9976 ZENBD:  MOVEI A,[ASCIZ !        EXCH A!]
9977         PUSHJ P,PRODC
9978         MOVE A,CORDM
9979         ADDI A,"0
9980         PUSHJ P,PUTREL
9981         PUSHJ P,COMMAA
9982         MOVE A,ENN
9983         SOS A
9984         ADD A,CORDM
9985         JRST LSTCHX
9986 \f
9987 TIPIS:  MOVE A,TEMP
9988         MOVEM A,BYTPNT
9989 MORTP:  ILDB A,BYTPNT
9990         CAIN A,1        ;EXCLAMATION
9991         POPJ P,
9992         ADDI A,"        ;SPACE
9993         PUSHJ P,TYO
9994         JRST MORTP
9995
9996 ]               ;END .I.FSW CONDITIONAL
9997 \f
9998 IFN LISTSW,[
9999
10000 ;LISTING ROUTINES.
10001
10002 PNTR:   MOVEM 17,PNTSA+17
10003         MOVEI 17,PNTSA
10004         BLT 17,PNTSA+16
10005         SKIPL LSTONP
10006         JRST PNTR5
10007         AOSE LISTPF
10008         JRST PNTR1
10009         SKIPGE T,LISTAD
10010         JRST PNTR2
10011         PUSHJ P,P6OD
10012         HLRZS T
10013         PUSHJ P,PSOS    ;PRINT SPACE OR '
10014         PUSHJ P,PILPTS
10015 PNTR3:  HLRZ T,LISTWD
10016         PUSHJ P,P6OD
10017         MOVS T,LSTRLC
10018         TLNE T,400000
10019         AOJ T,
10020         PUSHJ P,PSOS
10021         HRRZ T,LISTWD
10022         PUSHJ P,P6OD
10023         HRRZ T,LSTRLC
10024         PUSHJ P,PSOS
10025         PUSHJ P,PILPTS
10026         PUSHJ P,PILPTS
10027 PNTR4:  MOVE TT,[440700,,LISTBF]
10028 PNTR6:  CAMN TT,PNTBP
10029         JRST PNTR5A
10030         ILDB A,TT
10031         PUSHJ P,PILPT
10032         JRST PNTR6
10033
10034 PNTR5A: CALL PNTCR
10035         MOVE A,LISTBC
10036         CAIE A,14
10037          JRST PNTR7
10038 PNTR5C: CALL PILPT      ;OUTPUT THE ^L,
10039         CALL PNTHDR     ;AND THE PAGE NUMBER.
10040         JRST PNTR5D
10041
10042 PNTR7:  MOVEI A,12
10043         PUSHJ P,PILPT
10044 PNTR5D: SETOM LISTBC
10045 PNTR5:  MOVNI A,LISTBS*5-1
10046         MOVEM A,PNTSW   ;DETECT OVERFLOW OF LISTBF
10047         MOVE TT,[440700,,LISTBF]
10048         MOVEM TT,PNTBP
10049         MOVSI 17,PNTSA
10050         BLT 17,17
10051         POPJ P,
10052 \f
10053 PNTR5B: MOVE A,LISTBC
10054         CAIN A,14
10055         JRST PNTR5C
10056         JRST PNTR5D
10057
10058 PNTR2:  MOVEI T,8
10059         MOVEI A,40
10060         PUSHJ P,PILPT
10061         SOJG T,.-1
10062         JRST PNTR3
10063
10064 PNTR1:  MOVE TT,[440700,,LISTBF]
10065         CAMN TT,PNTBP
10066         JRST PNTR5B
10067         MOVEI T,25.
10068         MOVEI A,40
10069         PUSHJ P,PILPT
10070         SOJG T,.-1
10071         JRST PNTR4
10072
10073 PSOS:   MOVEI A,"'
10074         TRNN T,-1
10075 PILPTS: MOVEI A,40
10076         JRST PILPT
10077
10078 P6OD:   MOVE TT,[220300,,T]
10079 P6OD1:  ILDB A,TT
10080         ADDI A,"0
10081         PUSHJ P,PILPT
10082         TLNE TT,770000
10083         JRST P6OD1
10084         POPJ P,
10085
10086 PNTCR:  MOVEI A,^M      ;OUTPUT ^M TO LST IF OPEN.
10087 PILPTX: SKIPE LSTONP;OUTPUT CHAR TO LST IF LSTING.
10088          JRST PILPT
10089         RET
10090
10091 PNTHDR: MOVEI A,^I
10092         MOVEI B,10.     ;MOVE TO COLUMN 80.,
10093         CALL PILPT
10094         SOJG B,.-1
10095         SAVE LSTTTY
10096         HLLOM B,LSTTTY  ;POSITIVE SO TYOERR GOES ONLY TO LST.
10097         TYPR [ASCIZ/Page /]
10098         MOVE A,CPGN
10099         CALL [AOJA A,DPNT]
10100         REST LSTTTY
10101 PNTCRR: CALL PNTCR      ;OUTPUT CRLF TO LST IF OPEN.
10102 PNTLF:  MOVEI A,^J
10103         JRST PILPTX
10104 \f
10105 DEFINE LSTM %A,B,C
10106 IF1 [   [B] ? [C]   ]
10107 IF2 [   MOVE A,[B]
10108         MOVEM A,%A
10109 .=.+LSTM0-2
10110         MOVE A,[C]
10111         MOVEM A,%A
10112 .=.-LSTM0
10113 ]
10114 TERMIN
10115
10116 A.LSTFF:        AOS (P) ;RETURN NO VALUE.
10117 ;          ADDR, CONTENTS IF NOT LISTING, CONTENTS IF LISTING.
10118 LSTOFF: LSTM LSTONP,0,-1
10119         LSTM LSTPLM,[TLO B,4^5][JRST PSHLML]
10120         LSTM RCHLST,RCHLS1,AOSN PNTSW
10121         LSTM RCH1LS,RET,[CAILE A,^M]
10122         LSTM POPLML,JFCL,[IDPB A,PNTBP]
10123         JRST MDSCLR
10124 LSTM0==.-LSTOFF
10125
10126 LSTON:  BLOCK LSTM0-1
10127         JRST MDSSET
10128
10129 A.LSTN: SKIPN LISTP1    ;IF SHOULD LIST THIS PASS
10130          JUMPGE FF,MACCR
10131         SKIPE LISTP     ;AND WANT LISTING,
10132          CALL LSTON     ;TURN ON LISTING OUTPUT.
10133         JRST MACCR
10134
10135 IFNDEF LISTBS,LISTBS==50.       ;LISTBF SIZE IN WORDS.
10136
10137 VBLK            ;LISTING FEATURE VARIABLES
10138
10139 PNTBP:  0       ;POINTER TO LISTING LINE BUFFER
10140 LSTONP: 0       ;NONZERO WHEN OUTPUTTING TO LISTING FILE.
10141 LISTP:
10142 LISTON: 0       ;-1 IF LISTING ON
10143 PNTSW:  0       ;-1 IF LAST CHR CR OR LF, OR -<# CHARS SPACE LEFT IN LISTBF>
10144 LISTBF: BLOCK LISTBS
10145 LISTAD: 0       ;ADDRESS OR -1 NONE 3.1 RELOC
10146 LISTWD: 0       ;WORD
10147 LSTRLC: 0       ;RELOCATION
10148 LISTPF: 0       ;-1 OTHERS CONTAIN SOMETHING
10149 LISTBC: 0       ;BREAK CHR CR LF OR FF OR -1 IF NONE SINCE LAST PNTR
10150 LISTTM: 0       ;TEMP AT AEND
10151 PNTSA:  BLOCK 20        ;AC SAVE AREA FOR LISTING FEATURE
10152 LISTP1: 0       ;POSITIVE => WANT TO LIST EVEN ON PASS 1.
10153 ] ;END IFN LISTSW,
10154
10155 IFE LISTSW,VBLK
10156
10157 ;THESE VARIABLES ARE REFERENCED EVEN IF LISTSW IS 0.
10158 LSTTTY: 0       ;TYOERR TYPES ON TTY IFF LE 0, ON LST IF NOT 0.
10159 LSTPLM: TLO B,4^5       ;OR JRST PSHLML         ;XCT'D BY PSHLMB.
10160 POPLML: JFCL            ;OR IDPB A,PNTSW        ;XCT'D IN POPLMB.
10161
10162 PBLK
10163 IFE LISTSW, A.LSTN: A.LSTF:     RET
10164 \f
10165 VBLK
10166 IFN CREFSW,[
10167 CREFP:  0       ;SET BY C SWITCH TO REQUEST CREFFING.
10168 CRFONP: 0       ;SET WHILE CREFFING.
10169 CRFLFL: 0       ;LAST PAGNUM,,LINENUM OUTPUT.
10170 CRFINU: JFCL\PUSHJ P,CRFUSE     ;XCT THIS TO CREF NON-DEF OCCUR.
10171 CRFLBL: JFCL\PUSHJ P,CRFLB1     ;XCT FOR DEF. OF NORMAL SYM.
10172 CRFEQL: JFCL\PUSHJ P,CRFEQ1     ;   FOR DEF. OF NORMAL SYM. OR INTSYM.
10173 CRFMCD: JFCL\PUSHJ P,CRFMC1     ;     FOR DEF. OF MACRO.
10174 CRFDEF: JFCL\PUSHJ P,CRFDF1     ;       FOR RANDOM DEF, CHECK FLAGS.
10175 ]
10176 CRFILE: 0       ;SET => SHOULDN'T OUTPUT PAGNUM,,LINENUM'S
10177 ;USED BY .CRFILE INTSYM SO CAN'T BE IN CONDIT.
10178 PBLK
10179 IFN CREFSW,[
10180 CRFEQ1: MOVEI T,(B)
10181         CAIN A,1        ;IF NOT PSEUDO OR NOT INTSYM,
10182         CAIE T,INTSYM
10183         JRST CRFLB1     ;IS NORMAL SYM.
10184 CRFOD1: MOVSI T,600000  ;ELSE DEFINING INSN.
10185         JRST CRFEQ2
10186
10187 CRFDF2: MOVEI T,(B)     ;DECIDE WHETHER DEFINING MACRO OR PSEUDO.
10188         CAIE T,MACCL
10189         JRST CRFOD1
10190 CRFMC1: SKIPA T,[500000,,]      ;DEFINING MACRO.
10191 CRFLB1: MOVSI T,440000  ;DEFINING NORMAL SYM.
10192 CRFEQ2: PUSH P,A
10193         MOVE A,T
10194         JRST CRFMA1
10195
10196 ;COME HERE FOR NON-DEF; MUST DECIDE WHAT TYPE SYM.
10197 CRFUSE: TLNE C,3NCRF    ;SYM MAY HAVE CREFFING SUPPRESSED.
10198         POPJ P,
10199         PUSH P,A
10200         CAIN A,1
10201         JRST CRFMAC     ;PSEUDOS, MACROS.
10202         MOVSI A,40000   ;FLAG FOR NORMAL SYM.
10203         TRNN C,-1
10204         MOVSI A,200000  ;FLAG FOR INSNS.
10205 CRFMA1: PUSH P,A
10206         MOVE A,CLNN
10207         HRL A,CPGN
10208         AOBJN A,.+1     ;A HAS PAGNUM,,LINENUM .
10209         SKIPGE CRFILE   ;IF SHOULD OUTPUT IT,
10210         JRST CRFUS1
10211         CAME A,CRFLFL   ;AND HAS CHANGED, DO SO.
10212         PUSHJ P,CRFOUT
10213         MOVEM A,CRFLFL
10214 CRFUS1: POP P,A
10215         IOR A,SYM       ;COMBINE SYM AND CREF FLAG.
10216         PUSHJ P,CRFOUT
10217         JRST POPAJ
10218
10219 CRFMAC: MOVEI A,(B)
10220         CAIN A,MACCL
10221         SKIPA A,[100000,,]      ;MACRO
10222         MOVSI A,200000          ;PSEUDO-OP.
10223         JRST CRFMA1
10224 \f
10225 ;DEFINING OCCURRENCE, MIGHT BE ANY TYPE SYM.
10226 CRFDF1: CAIN A,1        ;TYPE 1 => MACRO OR PSEUDO.
10227         JRST CRFDF2
10228         TRNE C,-1       ;ELSE INSN OR NORMAL SYM.
10229         JRST CRFLB1
10230         JRST CRFOD1
10231
10232 DEFINE CRFM %A,B,C
10233 IF1 [   [B]
10234         [C] ]
10235 IF2 [   MOVE A,[B]
10236         MOVEM A,%A
10237 .=.+CRFM0-2
10238         MOVE A,[C]
10239         MOVEM A,%A
10240 .=.-CRFM0]
10241 TERMIN
10242
10243
10244 A.CRFFF:        AOS (P) ;.CRFOFF - STOP CREFFING. NO VAUE.
10245 ;               LOCATION, NORMAL VALUE, VALUE WHILE CREFFING
10246 CRFOFF: CRFM    CRFONP,0,-1
10247         CRFM    CRFLBL,JFCL,[PUSHJ P,CRFLB1]
10248         CRFM    CRFEQL,JFCL,[PUSHJ P,CRFEQ1]
10249         CRFM    CRFMCD,JFCL,[PUSHJ P,CRFMC1]
10250         CRFM    CRFINU,JFCL,[PUSHJ P,CRFUSE]
10251         CRFM    CRFDEF,JFCL,[PUSHJ P,CRFDF1]
10252         POPJ P,
10253 CRFM0==.-CRFOFF
10254
10255 CRFON:  BLOCK CRFM0-1
10256         POPJ P,
10257
10258 A.CRFN: JUMPGE FF,MACCR
10259         SKIPE CREFP     ;.CRFON, IF HAVE CREF FILE, START CREFFING.
10260         PUSHJ P,CRFON
10261         JRST MACCR
10262 ] ;END IFN CREFSW,
10263 \f
10264 IFN TS,[        ;;TS            ;TIME-SHARING ROUTINES
10265
10266 IFNDEF TYPDLC,TYPDLC==7 ;MAXIMUM TOTAL DEPTH OF .INSRT (INCLUDING TTY)
10267 IFNDEF MX.INS,MX.INS==5 ;MAXIMUM DEPTH .INSRT FILES ONLY
10268 IFNDEF MAXIND,MAXIND==6 ;MAXIMUM # @: TABLE ENTRIES FOR .INSRT
10269 IFN DECSW,[
10270         UTOBFL==203
10271         CRFBSZ==203
10272         UTIBFL==410
10273         LSTBSZ==203
10274         ERRBSZ==203
10275 ]
10276 IFNDEF UTIBFL,UTIBFL==400       ;INPUT BUFFER SPACE.
10277 IFNDEF UTOBFL,UTOBFL==200
10278 IFNDEF CMBFL,CMBFL==50          ;COMMAND BUFFER LENGTH.
10279 IFNDEF CRFBSZ,CRFBSZ==200       ;# WDS CREF OUTPUT BUFFER.
10280 IFNDEF LSTBSZ,LSTBSZ==200
10281 IFNDEF ERRSW,ERRSW==1   ;1 FOR ERROR FILE OUTPUT CAPABILITY.
10282 IFNDEF ERRBSZ,ERRBSZ==1 ;ERROR FILE BUFFER SIZE.
10283
10284 ERRC==0 ;ERR DEVICE CHANNEL.
10285 TYIC==1         ;TTY INPUT CHANNEL
10286 TYOC==2         ;TTY OUTPUT CHANNEL
10287 CREFC==3        ;CREF OUTPUT.
10288 UTYOC==4        ;OUTPUT FILE
10289 LPTC==5         ;LISTING (LPT)
10290 ERRFC==6        ;ASSEMBLY ERROR OUTPUT FILE.
10291 UTYIC==7        ;1ST INPUT CHANNEL, UTYIC+N USED FOR NTH .INSRT LEVEL IN DEC VERSION.
10292
10293 VBLK
10294 INTJPC: 0       ;SAVES .JPC AT INTERRUPT.
10295 INTSVP: 0       ;SAVES P ON INTERRUPT FOR DEBUGGING
10296
10297 ;NOTE THAT ONLY PDL OV IS NOW ENABLED.
10298
10299 IFN ITSSW,[
10300 .JBCNI:
10301 TSINT:  0               ;1ST WD INTERRUPTS (AT PRESENT) ARE CONSIDERED FATAL ERRORS
10302 .JBTPC: 0               ;ERROR PROCESSOR RE-ENABLES INTERRUPTS
10303         .SUSET [.RJPC,,INTJPC]
10304         SKIPGE TSINT
10305          JRST TTYINT    ;SECOND-WORD INTS.
10306         JRST TSINT1     ;JUMP INTO PURE CODING AND PROCESS INTERRUPT
10307 ]
10308 .ELSE   CCLFLG:0        ; FLAG TO INDICATE CCL ENTRY FROM COMPIL
10309
10310 PBLK
10311 TSINT1: MOVEM P,INTSVP  ;SAVE P FOR POSSIBLE DEBUGGING
10312         .SUSET [.SPICL,,[-1]]
10313 IFE SAILSW,MOVE A,.JBCNI        ;GET INTERRUPT REQUEST WORD
10314 .ELSE MOVE A,JOBCNI
10315         TRNE A,200000   ;PDL OVERFLOW?
10316          JRST CONFLP
10317         MOVE B,[TYPR [ASCIZ/Unknown interrupt - Fatal/]]
10318         MOVEM B,40
10319 IFE SAILSW,MOVE A,.JBTPC        ;SO ERROR ROUTINE WILL PRINT OUT PROPERLY
10320 .ELSE MOVE A,JOBTPC
10321         JSA A,ERROR
10322 \f
10323 ;MIDAS STARTS HERE.
10324 BEG:
10325 IFN DECSW,[
10326         TDZA A,A
10327          SETO A,
10328         MOVEM A,CCLFLG          ; REMEMBER TYPE OF START-UP
10329         RESET
10330         MOVEI A,600000
10331         APRENB A,
10332 ]
10333 IFN ITSSW,[
10334         .SUSET [.RSNAM,,RSYSNM] ;GET SYSTEM NAME
10335         .SUSET [.SMASK,,[%PIPDL]]       ;PDL OVERFLOW ONLY.
10336         .SUSET [.SMSK2,,[1_TYIC]]
10337         SYSCAL TTYSET,[1000,,TYIC
10338                 [232020,,202020]
10339                 [232020,,220220]]
10340         .SUSET [.SPICL,,[-1]]   ;PERMIT INTERRUPTS (IN CASE RESTARTED DURING INTERRUPT)
10341 ]
10342         MOVEI FF,0              ;INITIALIZE FLAGS
10343         MOVE P,[-LPDL,,PDL]     ;INITIALIZE P
10344         AOSN NVRRUN
10345          JRST BEG9
10346         TYPR [ASCIZ /Can't restart MIDAS/]
10347         JRST TSRETN
10348
10349 BEG9:   MOVEI D,SYMDSZ  ;GET DEFAULT SYMTAB SIZE
10350 IFN ITSSW,[
10351         .SUSET [.RXJNAM,,A]
10352         CAME A,['MMIDAS]        ;OR LARGER FOR MMIDAS
10353          CAMN A,[SIXBIT/MM/]
10354           MOVEI D,SYMMSZ
10355 ]
10356         SKIPGE ISYMF    ;THE FIRST TIME THROUGH,
10357          MOVEM D,SYMLEN ;MAKE THAT THE SIZE TO USE.
10358         CALL JCLINI     ;NOW TRY TO FETCH JCL.
10359 IFN ITSSW,[SKIPGE ISYMF ;SKIP IF SYMS SPREAD
10360          CALL TSYMGT    ;GET TS SYMS FROM SYSTEM
10361 ]
10362         SKIPGE CMPTR    ;IF NO CMD FROM DDT,
10363         JRST GO2A       ;ANNOUNCE MIDAS'S NAME AND VERSION.
10364 IFG PURESW-DECSW,[
10365         SKIPGE PURIFG
10366          TYPR [ASCIZ /NOTPUR /]
10367 ]
10368         MOVE B,[SIXBIT /MIDAS./]
10369         PUSHJ P,SIXTYO
10370         MOVE B,[MIDVRS]
10371         PUSHJ P,SIXTYO
10372 ;       JRST GO2A
10373 \f
10374 GO2A:   SETOM FATAL
10375         SETZM TTYFLG
10376 IFE ITSSW,SETZM ERRTTL  ; INITIALIZE ERROR COUNTER
10377         MOVEI FF,0      ;INITIALIZE FLAGS
10378         SKIPLE CMPTR
10379         SETZM CMPTR
10380 IFN RUNTSW,[    PUSHJ P,RNTTMA  ;GET INITIAL RUN TIME.
10381                 MOVEM A,IRUNTM']
10382         SETZM LSTTTY
10383         PUSHJ P,CMD     ;GET TYPED IN COMMAND
10384         SKIPGE SMSRTF
10385          JRST GO21
10386         TYPR [ASCIZ/SYMTAB clobbered
10387 /]
10388         JRST GO2A
10389
10390 GO21:   PUSHJ P,GINIT   ;INITIALIZE STUFF
10391         PUSHJ P,OPNRD   ;OPEN INPUT FILE
10392         PUSHJ P,WINIT   ;OPEN OUTPUT FILE, CREF FILE.
10393 IFN DECSW,[
10394         SKIPGE CCLFLG
10395          OUTSTR [ASCIZ /MIDAS:  /]
10396 ]
10397 GO3:    MOVEMM TTYFLG,WSWCNT ;TURN OFF TYPEOUT IF THERE WERE (W) SWITCHS.
10398         SETOM LSTTTY
10399         JSP A,$INIT     ;INITIALIZE FOR ASSEMBLY
10400         JSP A,PS1       ;DO PASS 1
10401         TRNE FF,FRNPSS  ;IF 2 PASS ASSEMBLY,
10402          PUSHJ P,OPNRD  ;THEN RE-OPEN INPUT FILE
10403         JSP A,PLOD      ;MAYBE PUNCH OUT SBLK LOADER IN SOME FORMAT
10404         JSP A,PS2       ;DO PASS 2
10405         JSP A,PSYMS     ;MAYBE PUNCH OUT SYMBOL TABLE
10406 IFN A1PSW,[
10407         TLZ FF,FLOUT
10408         AOS PRGC        ;INDICATE END STATEMENT ENCOUNTERED
10409         SETOM OUTC      ;" " "
10410         TRNN FF,FRNPSS  ;IF 1 PASS ASSEMBLY,
10411          SKIPGE CONTRL
10412           CAIA  
10413         JRST GO3        ;THEN TRY TO ASSEMBLE ANOTHER PROGRAM
10414 ]
10415 IFN FASLP,[
10416         SKIPGE A,CONTRL
10417         TRNN A,FASL
10418          JRST GO4
10419         MOVE A,[SIXBIT /*FASL*/]        ;"FINISH" FASL FILE
10420         MOVEI B,17
10421         PUSHJ P,FASO    ;IGNORE END FROB, BUT OUTPUT FASL END CODE
10422         MOVE A,[.BYTE 7 ?3 ? 3 ? 3? 3? 3]
10423         PUSHJ P,FASO1   ;RANDOMNESS
10424         PUSHJ P,FASBE   ;WRITE OUT LAST BLOCK
10425 ]
10426 GO4:    SETZM FATAL     ;THERE WAS NO FATAL ERROR: OUTPUT FILES GET RENAMED.
10427 GO2:
10428 RETN2:  PUSHJ P,.FILE
10429         SETZM LSTTTY
10430 IFN RUNTSW,[
10431         PUSHJ P,RNTTYO  ;TYPE OUT RUN TIME USED SINCE GO2A
10432 ];IFN RUNTSW
10433         CALL ERRCLS     ;FILE AWAY ERROR FILE.
10434         JRST TSRETN
10435
10436                 ;INITIALIZATION ROUTINE CALLED ONCE PER (COMMANDED) ASSEMBLY
10437
10438 GINIT:  IFN A1PSW,[
10439         SETOM PRGC
10440         SETOM OUTC
10441 ]
10442 IFN DECSW,[ IFE SAILSW,[
10443         SETZM V.SITE    ;; CODE TO SET UP .SITE'S VALUE, ON DEC SYSTEM.
10444         MOVE A,[V.SITE,,V.SITE+1]
10445         BLT A,V.SITE+4
10446         MOVE B,[440600,,V.SITE]
10447         MOVSI C,-5      ;PROCESS 5 WORDS F .GTCNF
10448 GINIT1: HRLZ A,C
10449         HRRI A,11       ;11 = .GTCNF
10450         GETTAB A,       ;GET 1 WORD
10451          SETZ A,
10452 GINIT2: SETZ AA,        ;EXTRACT THE ASCII CHARS AND STORE THEM.
10453         ROTC AA,7
10454         TRCE AA,140     ;SWAP BIT 40 WITH BIT 100, THUS TURNING
10455          TRCE AA,140    ;"A TO 'A, "a TO 'A, "1 TO '1, ETC, AND ^@ TO ' .
10456           TRCE AA,140
10457         IDPB AA,B       ;STORE THE SIXBIT INTO .SITE'S VALUE STRING.
10458         JUMPN A,GINIT2  ;WHEN NOTHING LEFT OF THIS WORD OF .GTCNF, GET THE NEXT.
10459         AOBJN C,GINIT1
10460 ]];END DECSW
10461         MOVE A,[MAXIND,,FDSOFS]
10462         MOVEM A,INDDP   ;INITIALIZE POINTER INTO INDIRECT FILE TABLE
10463 IFDINI: MOVE A,[DNAM,,IFDS]
10464         BLT A,IFDS+LFDSE-1      ;SET UP INPUT FILE NAMES FROM DNAM ETC.
10465         POPJ P,
10466 \f
10467 IFN RUNTSW,[    ;TYPE OUT RUN TIME USED
10468
10469 RNTTYO:
10470 IFE ITSSW,[     ; NOBODY WANTS THIS ON ITS, BUT OTHER PEOPLE DO...SIGH...
10471         SKIPE A,ERRTTL  ; ANY ASSEMBLY ERRORS?
10472          JRST [ TYPR [ASCIZ/? /]        ; YES, ERROR MESSAGE FOR BATCH CONTROLLERS
10473                 CALL DPNT
10474                 TYPR [ASCIZ/ error(s) detected
10475 /]
10476                 JRST .+1]
10477 IFN DECSW,[
10478         SKIPE CCLFLG                    ; CALLED VIA CCL?
10479          RET
10480 ] ; IFN DECSW
10481 ] ; IFE ITSSW
10482         TYPR [ASCIZ /Run time = /]
10483         CALL A.MRUNT    ;GET RUNTIME IN MILLISEC. IN A.
10484         IDIVI A,10.
10485         IDIVI A,100.    ;GET SECS AND HUNDREDTHS.
10486         HRLM B,(P)      ;SAVE REMAINDER
10487         PUSHJ P,HMSTYO  ;TYPE OUT SECS
10488         MOVEI A,".
10489         CALL TYO
10490         HLRZ A,(P)
10491         CALL RNTYO3     ;TYPE OUT HUNDREDTHS
10492         CALL CRR
10493         CALL A.SYMC
10494         CALL DPNT
10495         TYPR [ASCIZ/ Symbols including initial ones
10496 /]
10497         RET
10498
10499                 ;TYPE OUT H:MM:SS TIME IN A
10500                 ;DOESN'T WORK FOR TIMES .GE. 60. HOURS
10501
10502 HMSTYO: IDIVI A,60.
10503         JUMPE A,HMSTY2
10504         HRLM B,(P)
10505         PUSHJ P,HMSTYO
10506         MOVEI A,":
10507 RNTYO2: PUSHJ P,TYO     ;TYPE DELIMITING CHAR
10508         HLRZ A,(P)
10509 RNTYO3: IDIVI A,10.
10510         PUSHJ P,ADGTYO  ;TYPE OUT DIGIT IN A
10511         MOVEI A,"0(B)
10512         JRST TYO
10513
10514 HMSTY2: MOVE A,B
10515         JRST DPNT
10516
10517 RNTTMA: .SUSET [.RRUNT,,A]
10518 IFN DECSW,[SETZ A,
10519         RUNTIM A,]
10520         POPJ P,
10521
10522 A.MRUNT:        PUSHJ P,RNTTMA  ;GET CURRENT RUN TIME
10523         SUB A,IRUNTM'   ;SUBTRACT RUN TIME AS OF GO2
10524 IFN ITSSW,[MULI A,4069. ;CONVERT TO NANOSECONDS
10525         DIV A,[1.^6]    ;THEN TO MILLISECONDS.
10526 ]
10527         JRST CLBPOP
10528 ]
10529 \f
10530                 ;TS OUTPUT ROUTINES
10531
10532 PPB:    JUMPGE FF,CPOPJ
10533 PPBA:
10534 TPPB:   SOSGE UTYOCT
10535          JRST TPPB1
10536         IDPB A,UTYOP
10537         RET
10538
10539 TPPB1:  CALL TPPBF      ;OUTPUT THE BUFFER,
10540         JRST TPPB
10541
10542 TPPBF:  SAVE C
10543         MOVE C,[0 UTYOC,UTOHDR]
10544         CALL OBUFO      ;OUTPUT & RE-INIT BUFFER.
10545         REST C
10546         RET
10547
10548 WINIT:
10549 IFN ERRSW,[
10550         SKIPN ERRFP     ;IF WANT ERROR OUTPUT FILE,
10551          JRST WINIT2
10552         CALL OINIT      ;OPEN IT.
10553          0 ERRFC,ERRDEV
10554          SIXBIT/ERROUT/
10555          ERRHDR,,ERRBUF
10556         SETOM ERRFOP    ;ERROR FILE NOW OPEN.
10557 WINIT2: ]
10558         PUSHJ P,OINIT   ;OPEN OUTPUT FILE, FN2=OUTPUT.
10559          13^9 UTYOC,ONAM        ;<DEC-MODE> CHNL,NAME-BLOCK.
10560          SIXBIT/OUTPUT/
10561          UTOHDR,,UTOBUF
10562 IFN ITSSW,[
10563         TLZ FF,FLPTPF   ;INITIALLY ASSUME DEVICE NOT PAPER TAPE PUNCH
10564         .STATUS UTYOC,A ;GET STATUS OF OUTPUT CHANNEL
10565         ANDI A,77       ;MASK TO DEVICE CODE
10566         CAIN A,7        ;IF PAPER TAPE PUNCH,
10567         TLO FF,FLPTPF   ;THEN SET FLPTPF
10568 ]
10569 IFN LISTSW,[
10570         SKIPN LISTP
10571          JRST WINIT1
10572         CALL OINIT
10573          0 LPTC,LSTDEV  ;OPEN LISTING FILE IF DESIRED.
10574          SIXBIT/LSTOUT/
10575          LSTHDR,,LSTBUF
10576 WINIT1:
10577 ]
10578 IFN CREFSW,[
10579         SKIPN CREFP     ;IF CREF REQUESTED,
10580          RET
10581         PUSHJ P,OINIT   ;OPEN CREF FILE, FN2=CRFOUT
10582          13^9 CREFC,CRFDEV
10583          SIXBIT/CRFOUT/
10584          CRFHDR,,CRFBUF
10585         MOVE A,[.BYTE 7 ? 177 ? "B ? ^W]
10586         PUSHJ P,CRFOUT  ;OUTPUT HEADER TO INDICATE IMAGE INPUT.
10587         PUSHJ P,CRFSSF  ;OUTPUT SET-SOURCE-FILE BLOCK.
10588 ]
10589         RET
10590 \f
10591 IFN ITSSW,RELEAS==.CLOSE
10592
10593 ;CLOSE INPUT, BIN, CREF AND LIST FILES.
10594 .FILE:  RELEAS UTYIC,
10595         MOVNI A,1
10596         SKIPL B,CONTRL  ;IF RELOCATABLE,
10597         PUSHJ P,TPPB    ;OUTPUT A -1 SO STINK WILL SEE EOF
10598         SETZ A,         ;IN DEC FMT, OUTPUT A 0 AT END.
10599         TRNE B,DECREL
10600          CALL TPPB
10601         SKIPE ONAM+2
10602         JRST .FILE2     ;OUTPUT FNAM2 WAS EXPLICITLY SPECIFIED
10603         SKIPL B,CONTRL
10604         SKIPA A,[IFN DECSW,['STK,,] .ELSE ['REL,,]]
10605         MOVSI A,(SIXBIT /BIN/)
10606         TRNE B,DECREL   ;THE DEFAULT DEPENDS ON OUTPUT TYPE.
10607          MOVSI A,'REL
10608 IFN FASLP,[
10609         TRNE B,FASL
10610         MOVE A,[IFN ITSSW,[SIXBIT /FASL/] .ELSE ['FAS,,]]
10611 ]
10612         MOVEM A,ONAM+2
10613 .FILE2: JSP A,OCLOSE
10614          0 UTYOC,UTOHDR ;WRITE OUT BUFFER, RENAME AND CLOSE OUTPUT FILE.
10615          ONAM
10616 IFN LISTSW,[
10617         SKIPN LISTP     ;LISTING FILE OPEN =>
10618          JRST .FILE3
10619         CALL PNTCR      ;END WITH CR AND FF.
10620         MOVEI A,^L
10621         CALL PILPT
10622         JSP A,OCLOSE
10623          0 LPTC,LSTHDR  ;OUTPUT BUFFER, RENAME & CLOSE IT.
10624          LSTDEV
10625 .FILE3:
10626 ] ;END IFN LISTSW
10627 IFN CREFSW,[
10628         SKIPN CREFP     ;IF CREF FILE OPEN,
10629         POPJ P,
10630         MOVEI A,0
10631         PUSHJ P,CRFOUT  ;OUTPUT EOF BLOCK,
10632         JSP A,OCLOSE    ;WRITE BUFFER, CLOSE.
10633          0 CREFC,CRFHDR ; 0 CHNL,HEADER
10634          CRFDEV
10635 ]
10636         RET
10637
10638 ;FILE OUT ERROR OUTPUT FILE.
10639 ERRCLS: SETZM FATAL     ;ERR FILE RENAMED EVEN AFTER FATAL ERROR.
10640 IFN ERRSW,[
10641         SKIPN ERRFOP
10642          RET            ;THERE IS NONE.
10643         MOVEI A,^M
10644         CALL ERRCHR     ;PUT CRLF AT ENND.
10645         MOVEI A,^J
10646         CALL ERRCHR
10647         JSP A,OCLOSE    ;RENAME AND CLOSE.
10648          0 ERRFC,ERRHDR
10649          ERRDEV
10650         SETZM ERRFOP
10651 ]
10652         RET
10653 \f;      PUSHJ P,OINIT   ;OPEN OUTPUT FILE
10654 ;        MODE CHNL,NAME-BLOCK-ADDR
10655 ;       SIXBIT/DESIRED-TEMPORARY-FN2/
10656 ;       HEADER,,BUFFER SPACE    ;USED ONLY IN DEC VERSION.
10657 ;THE MODE SHOULD BE 13^9 FOR BINARY, 0 FOR ASCII.
10658 IFN ITSSW,[
10659 OINIT:  MOVE A,(P)
10660         HLRZ B,2(A)     ;GET ADDR OF HEADER,
10661         SETOM 2(B)      ;SET BUFFER BYTE COUNT TO -1 => NOT INITTED.
10662         MOVE AA,1(A)    ;GET 2ND ARG,
10663         MOVS A,@(P)     ;COPY OUTPUT FILE'S EVENTUAL NAMES INTO DNAM, ETC.
10664         CALL A.IMP1
10665         .CALL OINITR    ;TRANSLATE THEM AS IF OPENING THAT FILE,
10666          JRST OINITL    ;(TOO MANY TRANSLATIONS)
10667         .CALL OINITB    ;DELETE OLD TEMP NAME FILE.
10668          JFCL           ;THERE WAS NONE.
10669         LDB A,[270400,,@(P)]    ;GET CHANNEL NUM.
10670         HRLI A,7        ;OPEN MODE.
10671         LDB B,[331100,,@(P)]
10672         CAIN B,0        ;BUT MAYBE WANT ASCII MODE.
10673          HRLI A,3
10674         .CALL OINITO
10675         JRST OINITL
10676         HRRZ A,@(P)
10677         MOVEI B,3(A)    ;SUCCESSFUL OPEN, COPY TRANSLATED NAMES INTO NAME-BLOCK FOR FILE
10678         HRLI A,DNAM
10679         BLT A,(B)       ;FOR EVENTUAL RENAME.
10680 POPJ3:  AOS (P) ;SKIP OVER 3 ARGS.
10681 POPJ2:  AOS (P)
10682         JRST POPJ1
10683
10684 ;       JSP A,OCLOSE
10685 ;       0 CHNL,HEADER
10686 ;       NAMEBLOCKADDR
10687 ;WRITE OUT LAST BUFFER, RENAME TO NAMES IN NAMEBLOCK AND CLOSE.
10688 OCLOSE: MOVE C,(A)      ;1ST WD OF ARGS IS WHAT OBUFO WANTS.
10689         LDB B,[360600,,1(C)]    ;JUST IN CASE THIS IS ASCII FILE,
10690         DPB B,[300600,,OCLOSP]  ;GET BP TO UNUSED PART OF LAST WD OF BUFFER,
10691         MOVE B,[ASCIC//]
10692         DPB B,OCLOSP    ;AND PAD WITH ^C'S.
10693         SOS 2(C)        ;OBUFO ASSUMES BYTE COUNT WAS SOS'D.
10694         CALL OBUFO      ;WRITE OUT LAST PARTIAL BUFFER
10695         MOVE B,1(A)
10696         LDB C,[270400,,(A)]     ;GET CHNL NUM.
10697         SKIPE FATAL
10698          JRST OCLOS1    ;AFTER FATAL ERROR, DON'T RENAME OUTPUTFILES.
10699         .CALL ORENMB    ;RENAME (B HAS NAMEBLOCK ADDR)
10700          HALT
10701 OCLOS1: .CALL OCLOSB    ;CLOSE
10702          HALT
10703         JRST 2(A)
10704 \f
10705 ORENMB: SETZ ? SIXBIT/RENMWO/
10706         C ? 1(B) ? SETZ 2(B)    ;[CHNL] ? [FN1] ? [FN2] ((SETZ))
10707
10708 OCLOSB: SETZ ? SIXBIT/CLOSE/
10709         SETZ C
10710
10711 OINITB: SETZ ? SIXBIT/DELETE/
10712         DNAM ? ['_MIDAS] ? AA ? SETZ SNAM
10713
10714 OINITR: SETZ ? SIXBIT/TRANS/
10715         REPEAT 4,DNAM+.RPCNT
10716         REPEAT 4,[? 2000,,DNAM+.RPCNT ] ((SETZ))
10717
10718 OINITO: SETZ ? SIXBIT/OPEN/ ? A
10719         DNAM ? ['_MIDAS] ? AA ? SETZ SNAM
10720
10721 ;WRITE OUT AND REINITIALIZE BUFFER FOR FILE.
10722 ;ASSUMES BYTE COUNT (HEADER 3RD WD) WAS SOS'D.
10723 ;C HAS <0 CHNL,HEADER>
10724 ;IN ITS VERSION, HEADER 1ST WD HAS <SIZE IN BYTES>,,<BUFFER ADDR>-1
10725 OBUFO:  SAVE A
10726         SAVE AA
10727         AOSGE 2(C)      ;WAS COUNT SOS'D FROM -1?
10728          JRST OBUFO1     ;YES, BUFFER HADN'T BEEN INITTED, DON'T WRITE IT.
10729         MOVN A,1(C)
10730         ADD A,(C)       ;RH(A) HAS -<# WDS USED IN BUFFER>.
10731         MOVSI A,(A)
10732         HRR A,(C)
10733         AOS A           ;A HAS AOBJN -> USED PART OF BUFFER.
10734         HLLZ AA,C
10735         IOR AA,[.IOT A]
10736         SKIPGE A
10737         XCT AA          ;WRITE IT IN FILE.
10738 OBUFO1: MOVE A,1(C)
10739         HRR A,(C)       ;POSITION THE B.P. BEFORE START OF BUFFER,
10740         TLZ A,770000    ;AFTER LAST BYTE IN WD (IDPB WILL USE 1ST BUFFER WD)
10741         MOVEM A,1(C)
10742         HLRE A,(C)
10743         MOVEM A,2(C)    ;SET UP BYTE COUNT.
10744         REST AA
10745         JRST POPAJ
10746
10747 TFEED:  TLNN FF,FLPTPF  ;IF OUTPUT DEVICE NOT PTP,
10748         POPJ P,         ;THEN DO NOTHING
10749         PUSHJ P,TPPBF   ;OTHERWISE OUTPUT THE BUFFER,
10750 TFEED1: .FEED UTYOC,    ;FEED A LINE,
10751         TLZA FF,FLPTPF  ;IF THIS IS EXECUTED, UTYOC DOESN'T HAVE PTP AFTER ALL
10752         SOJG B,TFEED1   ;FEED THE SPECIFIED NUMBER OF LINES,
10753         POPJ P,         ;AND RETURN
10754
10755 TSRETN:
10756 IFN PURESW,[
10757         SKIPGE PURIFG   ;IF NOT YET PURIFIED, ASSUME BEING DEBUGGED.
10758          .VALUE
10759 ]
10760         .LOGOUT ;COME HERE TO COMMIT SUICIDE.
10761         .BREAK 16,160000
10762
10763 A.SITE: CALL AGETFD     ;.SITE N, RETURNS NTH WORD OF SIXBIT MACHINE NAME.
10764         CAIE A,0        ;ON ITS, ONLY WORD 0 IS NONZERO. IT'S THE "MACHINE NAME".
10765          JRST CABPOP
10766         SYSCAL SSTATU,[MOVEM A ? MOVEM A ? MOVEM A ? MOVEM A ? MOVEM A ? MOVEM A]
10767          .LOSE 1000
10768         JRST CLBPOP
10769 ] ;END IFN ITSSW
10770 \f
10771 OINITL: IFN ITSSW,[
10772         HLLZ A,@(P)     ;GET CHNL NUM,
10773         TLZ A,777037    ;MASK TO JUST AC FIELD (CHNL NUM)
10774         IOR A,[.STATUS A]
10775         XCT A           ;READ ITS STATUS,
10776 ]
10777         PUSHJ P,OPNER   ;TYPE OUT REASON FOR OPEN FAILURE,
10778         TYPR OINITS
10779         PUSHJ P,GTYIP   ;GET TYPEIN
10780         HRLZ A,@(P)     ;REPLACE '_MIDAS' WHATEVER BY ACTUAL NAMES.
10781         PUSHJ P,A.IMP1
10782         PUSHJ P,RFD     ;GET NEW FILE DESCRIPTION
10783         HRRZ A,@(P)     ;GET NAME BLOCK ADDR,
10784         MOVEI B,3(A)
10785         HRLI A,DNAM     ;COPY NAMES JUST READ INTO IT.
10786         BLT A,(B)
10787         JRST OINIT
10788
10789 OINITS: ASCIZ/Use what filename instead? /
10790
10791 IFN DECSW,[
10792 OINIT:  MOVE AA,(P)
10793         MOVS A,(AA)     ;GET NAME-BLOCK ADDR IN LH,
10794         HRLZ TT,A       ;GET CHNL NUM IN LH.
10795         TLZ TT,#(0 17,) ;MASK TO AC FIELD (CHANNEL NUM)
10796         HRRI A,DNAM
10797         BLT A,SNAM      ;COPY NAMES INTO DNAM THRU SNAM.
10798         HRRZ D,2(AA)    ;GET BUFFER SPACE ADDR.
10799         HLLZ C,2(AA)    ;GET HEADER ADDR.
10800         HLRZ A,C
10801         SETZM (A)       ;CLEAR OUT ITS-VERSION CONTENTS OF 1ST HEADER WD.
10802         LDB A,[331100,,(AA)]    ;GET MODE TO OPEN IN (WILL BE ASCII OR IMAGE BINARY)
10803         CALL OPNRD2     ;DO OPEN.
10804          JRST OINITL
10805 IFE SAILSW,[SAVE .JBFF
10806         MOVEM D,.JBFF]
10807 .ELSE [SAVE JOBFF
10808         MOVEM D,JOBFF]
10809         XOR TT,[<OPEN A>#<OUTBUF 1>]
10810         XCT TT
10811 IFE SAILSW,REST .JBFF
10812 .ELSE REST JOBFF
10813         MOVE A,[SIXBIT /000MD /]
10814         PJOB B,         ;GET JOB NUMBER, TO MAKE SIXBIT /<NNN>MD<E, O, OR L>/
10815          JFCL           ;CAN IT SKIP?
10816         IDIVI B,10.
10817         DPB C,[220400,,A]
10818         IDIVI B,10.
10819         DPB C,[300400,,A]       ;PUT THE DIGITS OF THE JOB NUMBER INTO THE SIXBIT WORD.
10820         DPB B,[360400,,A]
10821         MOVE AA,(P)
10822         LDB B,[360600,,1(AA)]   ;GET 1ST CHAR OF 'OUTPUT, 'LSTOUT, 'CRFOUT, 'ERROUT.
10823         IOR A,B                 ;USE IT AS LAST CHAR OF TEMP FILE NAME.
10824         MOVSI B,'TMP
10825         SETZ C,
10826         MOVE D,SNAM
10827         XOR TT,[<OUTBUF 1>#<ENTER A>]
10828         XCT TT          ;DO ENTER UTYOC,A
10829          JRST OINITL
10830 POPJ3:  AOS (P)
10831 POPJ2:  AOS (P)
10832         JRST POPJ1
10833 \f
10834 ;CLOSE AN OUTPUT FILE, SEE NON-DEC VERSION FOR ARGS.
10835 OCLOSE: MOVE AA,1(A)    ;NAME BLOCK ADDR.
10836         SKIPGE FATAL
10837          JRST OCLOS2
10838         MOVE C,(AA)     ;DELETE ANY FILE WITH NAMES
10839         SETZB B,D       ;WE WANT TO RENAME TO.
10840         OPEN ERRC,B
10841          JRST OCLOS1
10842         MOVE B,1(AA)
10843         HLLZ C,2(AA)
10844         SETZ D,
10845         MOVE T,3(AA)
10846         LOOKUP ERRC,B
10847          JRST OCLOS1    ;THERE IS NONE, JUST RENAME.
10848         SETZ B,
10849         MOVE T,3(AA)
10850         RENAME ERRC,B
10851          JFCL
10852         RELEAS ERRC,
10853 OCLOS1: MOVE B,1(AA)    ;DESIRED FN1.
10854         HLLZ C,2(AA)    ;DESIRED FN2.
10855         SETZ D,
10856         MOVE T,3(AA)    ;SNAME (THAT IS, PPN)
10857         HLLZ AA,(A)     ;GET JUST CHNL NUM.
10858         IOR AA,[CLOSE]
10859         XCT AA
10860         XOR AA,[CLOSE#<RENAME B>]
10861         XCT AA
10862          JFCL
10863 OCLOS2: HLLZ B,(A)      ;GET CHNL IN AC FIELD.
10864         IOR B,[RELEAS]
10865         XCT B
10866         JRST 2(A)
10867
10868 ;WRITE OUT BUFFER OF OUTPUT FILE, C HAS <0 CHNL,HEADER>
10869 OBUFO:  AND C,[0 17,]   ;GET JUST CHNL NUM.
10870         TLO C,(OUT)
10871         XCT C
10872          RET
10873         SAVE A          ;ERROR RETURN FROM OUT UUO.
10874         XOR C,[OUT#<GETSTS A>]
10875         XCT C           ;READ FILE STATUS.
10876         TRZ A,74^4      ;CLEAR ERROR BITS.
10877         ETR [ASCIZ /Output data error/]
10878         XOR C,[<GETSTS A>#<SETSTS (A)>]
10879         XCT C
10880         JRST POPAJ
10881 \f
10882 TFEED:  RET
10883
10884 TSRETN: MOVE C,[SIXBIT /MIDAS/]
10885         SKIPE MORJCL
10886          JRST RFDRUN
10887         EXIT
10888
10889 A.SITE:
10890 IFE SAILSW,[
10891         CALL AGETFD     ;.SITE ON DEC SYSTEM; VALUE HAS BEEN PRECOMPUTED NTO V.SITE.
10892         CAIL A,
10893          CAIL A,5
10894           JRST CABPOP
10895         MOVE A,V.SITE(A)
10896         JRST CLBPOP
10897 ];END IFE SAILSW
10898 .ELSE   JRST CABPOP     ;SAIL DOESN'T HAVE GETTAB USED IN SETTING UP V.SITE.
10899
10900 ;DEVICE NAME IN B, MODE IN A,
10901 ;HEADER ADDR IN C, BUFFER SPACE ADDR IN D,
10902 ;CREAT DEC-STYLE BUFFER RING LEAVING 1 WD BETWEEN BUFFERS.
10903 BUFINI: MOVEI AA,A
10904 IFE SAILSW,DEVSIZ AA,
10905          SKIPA AA,[204] ;DEFAULT BUFFER SIZE IS THAT FOR DSK.
10906         AOJLE AA,.-1    ;GET SIZE INCLUDING EXTRA WD.
10907         MOVEI T,1(D)    ;ADDR OF WD 2 OF 1ST BUFFER.
10908         HRLI AA,T       ;@AA IS ADDR OF 2ND WD OF NEXT BUFFER.
10909         SUBI D,(AA)     ;FACILITATE TEST FOR END OF BUFFER SPACE.
10910         HRLI T,400000
10911         MOVEM T,(C)     ;HEADER -> A BUFFER, SIGN SET.
10912         HRRM T,1(C)     ;MAKE RH OF BP -> BUFFER 1ST WD.
10913         MOVSI T,440000  ;SET UP P-FIELD OF B.P.
10914         IORM T,1(C)
10915         HRRZ T,1(C)
10916         AOS 1(C)
10917         HRLI T,-3(AA)   ;DATA-AREA-SIZE +1,,ADDR-OF-2ND-WD
10918 BUFIN1: CAIGE D,-410(T) ;ROOM FOR ANOTHER AFTER THIS BUFFER?
10919          JRST BUFIN2    ;NO, ASSUMING 410 WDS BUFFERRrSPACE.
10920         MOVEM T,@AA     ;YES, MAKE NEXT BUFFER -> THIS ONE,
10921         HRRI T,@AA      ;POINT TO NEXT ONE.
10922         JRST BUFIN1
10923
10924 BUFIN2: ADDI D,1(AA)    ;-> 2ND WD OF 1ST BUFFER.
10925         MOVEM T,(D)     ;1ST BUFFER -> LAST, MAKING RING.
10926         RET
10927
10928 ;CLOSE ALL INPUT CHANNELS - EQUIVALENT TO ITS .IOPDL.
10929 $IOPDL: MOVEI A,UTYIC
10930         EXCH A,UTICHN   ;SET INPUT CHNL NUM. TO LOWEST.
10931         LSH A,27
10932         IOR A,[RELEAS]  ;SET UP TO RELEAS THE HIGHEST IN USE FIRST.
10933 IOPDL1: XCT A           ;RELEAS ONE INPUT CHANNEL,
10934         CAMN A,[RELEAS UTYIC,]
10935          RET            ;ALL DONE.
10936         SUB A,[0 1,]
10937         JRST IOPDL1     ;RELEAS THE NEXT ONE DOWN.
10938
10939 .IOPDL==CALL $IOPDL
10940 ] ;END IFNN DECSW,
10941 \f
10942                 ;TS INPUT ROUTINES
10943
10944                 ;OPEN MAIN INPUT FILE FOR READING
10945
10946 OPNRD:  .IOPDL          ;RE-INITIALIZE IO PDL
10947         INSIRP SETZM,INFCNT INFCUR INFERR
10948         MOVE A,[-TYPDLS-1,,TTYPDL]
10949         MOVEM A,ITTYP   ;INITIALIZE "TTY PDL"
10950         PUSHJ P,MACIN1  ;CLOBBER MACRO EXPANSION STATUS
10951         MOVS A,IFDS     ;GET DEVICE NAME
10952         CAIN A,(SIXBIT /TTY/)   ;TTY?
10953         JRST OPNRDT     ;YES, TREAT SPECIAL
10954         MOVSI A,IFDS    ;NOT TTY, TRY OPENING FILE
10955         PUSHJ P,A.IMP1  ;SET UP DNAM, ETC.
10956         PUSHJ P,OPNRD1  ;TRY OPENING FILE
10957         JRST OPNRDL     ;LOSE
10958         MOVEM A,INFERR  ;ERR MSG IN MAIN FILE SHOULDN'T TYPE NAMES.
10959         MOVEI A,0       ;=> INPUT FROM FILE
10960 OPNRT2: MOVE T,[IFNM1,,RFNAM1]
10961         BLT T,RFNAM2    ;SET UP .FNAM1, .FNAM2
10962         SETOM NEDCRL
10963         JRST RCHSET     ;SET UP TO READ FROM FILE OR TTY. (ARG IN A)
10964
10965 OPNRDT: MOVE A,[IFDS+1,,IFNM1]  ;TTY SPECIFIED, TREAT SPECIAL
10966         BLT A,IFNM2     ;CLOBBER .IFNM1, .IFNM2 TO SPECIFIED
10967         TYPR [ASCIZ /Reading from TTY:
10968 /]
10969         MOVEI A,3       ;=> INPUT FROM TTY, DON'T QUIT ON CR
10970         JRST OPNRT2
10971
10972 OPNRDL: PUSHJ P,IOPNER  ;.OPEN LOST, TYPE OUT MESSAGE
10973         JRST GO2A       ;READ NEW COMMAND
10974
10975
10976 ;COMMON STUFF FOR OPNRD1 IN DEC AND ITS VERSIONS.
10977 OPNRD3: HRRZM A,UTIBED  ;SAY BUFFER EMPTY,
10978         MOVSI A,^C_13
10979         MOVEM A,@UTIBED ;CAUSE IMMEDIATE RELOAD.
10980         MOVE A,[INFDEV+1,,IFNM1]
10981         BLT A,IFNM2     ;SET UP .IFNM1, .IFNM2.
10982         AOS A,INFCNT    ;ASSIGN THIS FILE A NUMBER.
10983         MOVEM A,INFCUR  ;OPNRD EXPECTS THIS LEFT IN A.
10984         JRST POPJ1
10985
10986                 ;EOF WHILE TRYING TO READ CHARACTER
10987
10988 RPAEOF: PUSH P,B        ;SAVE B
10989 RPAEO1: MOVE B,ITTYP    ;GET PDL POINTER
10990         PUSHJ P,BPOPJ   ;CALL POP ROUTINE (MAYBE NED'S OUT)
10991         JRST RCHTRB     ;RETURN TO GET CHARACTER
10992
10993                 ;EOF FROM MAIN FILE
10994
10995 NEDCHK: TRNE FF,FRCMND  ;^C READ IN COMMANND, :KILL SELF.
10996          JRST TSRETN
10997         SKIPE RCHMOD
10998          JRST NEDCH1
10999         AOSN NEDCRL     ;INVENT ONE CRLF AFTER END OF MAIN FILE.
11000          JRST [ MOVE B,[440700,,[.BYTE 7 ? ^M ? ^J ? ^C]]
11001                 MOVEM B,UREDP
11002                 RET]
11003 NEDCH1:
11004 IFN A1PSW,[     PUSHJ P,OUTCHK
11005         MOVSI A,-LNEDT
11006         XCT NEDT(A)     ;SKIPS IF NED CONDITION TO BE COMPLAINED ABOUT
11007         AOBJN A,.-1
11008         JUMPGE A,GO4
11009 ]
11010         ETF [ASCIZ /No END statement/]
11011
11012 IFN A1PSW,[     ;HOLLER "NED" IF ANY OF THE FOLLOWING:
11013 NEDT:   SKIPL PRGC      ;NO END STATEMENTS HAVE BEEN ENCOUNTERED
11014         SKIPGE OUTC     ;OUTPUT HAS OCCURED NOT MATCHED BY AN END STATEMENT
11015         SKIPGE OUTN1    ;OUTPUT HAS OCCURED OTHER THAN IN 1PASS MODE
11016         TRNN FF,FRPSS2  ;CURRENTLY IN PASS 2
11017 LNEDT==.-NEDT   ;LENGTH OF TABLE
11018 ]
11019 \f
11020 IFN ITSSW,[
11021                 ;TRY .OPENING INPUT FILE (DESCRIPTION IN DNAM, ETC.) SKIPS IF SUCCESSFUL
11022
11023 OPNRD1: MOVE A,[2,,UTYIC] ;MODE,,CHANNEL.
11024         .CALL OPENB
11025         JRST OPNRD2     ;CAN'T OPEN INPUT FILE.
11026         MOVE AA,[UTYIC,,A]
11027         .RCHST AA,
11028         SKIPN B         ;GET SYSTEM FILE NAME 1
11029         MOVE B,FNAM1    ;SYSTEM DOESN'T KNOW, USE SPEC'D.
11030         SKIPN C         ;NOW SAME FOR FN2.
11031         MOVE C,FNAM2
11032         MOVE AA,[A,,INFDEV]
11033         BLT AA,INFDEV+3 ;REMEMBER NAMES OF CURRENT INPUT FILE.
11034         HRLZS INFDEV    ;MAKE THE DEV NAME BE LEFT-JUST.
11035         MOVE A,IUREDP   ;SET UP READING PTR,
11036         MOVEM A,UREDP
11037         JRST OPNRD3     ;SET UP ^C AFTER BUFFER, INFCUR, ETC.
11038
11039 OPNRD2: .STATUS UTYIC,IFSTS     ;.OPEN LOST, GET CHANNEL STATUS NOW BEFORE POSSIBLE .IOPOP
11040         POPJ P,
11041
11042 OPENB:  SETZ ? SIXBIT/OPEN/
11043         A               ;SHOULD HOLD MODE,,CHANNEL.
11044         DNAM ? DNAM+1 ? DNAM+2 ? SETZ SNAM
11045
11046 IUREDP: 440700,,UTIBUF
11047
11048                 ;EOFCH ENCOUNTERED ON READ, RELOAD AND JUMP BACK FOR NEXT CHAR
11049
11050 INCHR3: HRRZ A,UREDP    ;GET BYTE POINTER
11051         CAME A,UTIBED   ;END OF COMPLETELY READ BLOCK?
11052         JRST RPAEOF     ;NO => REALLY EOF
11053         MOVE A,IUREDP
11054         MOVEM A,UREDP
11055         MOVE A,[-UTIBFL,,UTIBUF]
11056         .IOT UTYIC,A    ;READ IN BLOCK
11057         TLZ A,377777    ;CLEAR OUT @, INDEX FIELDS, ALSO ALL BUT SIGN JUST FOR LAUGHS
11058         MOVEM A,UTIBED  ;STORE RH (UPDATED POINTER) FOR EOF CHECK AT INCHR3
11059         MOVSI A,EOFCH_<18.-7>
11060         MOVEM A,@UTIBED ;STORE EOF WORD
11061         JRST RCHTRA     ;NOW TRY NEXT CHAR
11062 ] ;END IFN ITSSW
11063 \f
11064 IFN DECSW,[
11065 OPNRD1: MOVEI C,UTIHDR  ;OPEN THE INPUT FILE W/ NAMES IN DNAM ... SNAM.
11066         SETZ A,         ;MODE ASCII.
11067         MOVEI D,UTIBUF
11068         MOVE TT,UTICHN  ;GET CHANNEL NUM. TO USE.
11069         LSH TT,27       ;PUT IN AC FIELD.
11070         CALL OPNRD2     ;DO OPEN.
11071          RET            ;FAILED.
11072         CALL BUFINI     ;INITIALIZE THE INPUT BUFFERS AND HEADER.
11073         MOVE D,SNAM
11074         MOVE A,FNAM1
11075         HLLZ B,FNAM2
11076         TLC TT,(OPEN#LOOKUP)
11077         XCT TT          ;LOOKUP CHANNEL,A
11078          RET            ;FAILED.
11079 IFE SAILSW,[
11080         MOVE A,DNAM
11081         DEVNAM A,       ;GET REAL NAME OF DEVICE.
11082          CAIA
11083         MOVEM A,DNAM
11084 ]
11085         MOVE A,[DNAM,,INFDEV]
11086         BLT A,INFDEV+3
11087         MOVE A,UREDP
11088         JRST OPNRD3
11089
11090 ;TAKE C -> HEADER, D -> BUFFER SPACE, A HAS MODE, TT HAS CHNL IN AC FLD.
11091 ;OPEN FILE IN DNAM ... SNAM, INIT BUFFERS,
11092 ;THEN SET UP FOR LOOKUP OR ENTER.
11093 ;SKIP IF SUCCEED.
11094 OPNRD2: IOR TT,[OPEN A]
11095         MOVE B,DNAM
11096         XCT TT          ;OPEN CHANNEL,A
11097          RET
11098         JRST POPJ1
11099
11100 ;RELOAD BUFFER, DEC STYLE.
11101 INCHR3: HRRZ A,UREDP    ;EOF AT END OF BUFFER?
11102         CAME A,UTIBED
11103          JRST RPAEOF    ;NO, EOF, ^C IN FILE.
11104         SAVE B
11105         MOVE A,UTICHN
11106         LSH A,27        ;CHANNEL NUM. N AC FLD.
11107         TLO A,(IN)
11108         XCT A           ;GET NEXT BUFFERFULL.
11109          CAIA           ;SUCCEED.
11110         JRST INCHR4     ;ERROR.
11111 INCHR5: MOVE A,UTICNT
11112         ADDI A,9
11113         IDIVI A,5
11114         ADD A,UREDP     ;-> 1ST WD NOT READ INTO.
11115         HRRZM A,UTIBED
11116         HRRZ A,UREDP
11117         AOS A
11118         MOVEI B,1       ;SCAN THE FILE AND REPLACE ALL LINE NUMBERS WITH NULLS.
11119 INCHR6: CAMN A,UTIBED
11120          JRST INCHR7
11121         TDNE B,(A)
11122          MOVEM B,(A)
11123         AOJA A,INCHR6
11124
11125 INCHR7: MOVSI B,^C_13
11126         MOVEM B,(A)     ;PUT EOF CHAR AFTER BUFFER.
11127         JRST RCHTRB     ;RETRY RCH.
11128
11129 INCHR4: XOR A,[<GETSTS B>#IN]
11130         XCT A
11131         TRZE B,74^4
11132          ETR [ASCIZ /Input data error/]
11133         XOR A,[<GETSTS B>#<SETSTS (B)>]
11134         XCT A           ;CLEAR ERROR BITS IN STATUS.
11135         TRNN B,2^4
11136          JRST INCHR5
11137         JRST RPAEO1     ;EOF.
11138 ] ;END IFN DECSW,
11139 \f
11140                 ;IO PDL ROUTINES FOR INPUT FILE
11141                 ;PUSH THE INPUT FILE
11142
11143 IPUSH:  AOSN CMEOF      ;WANT TO POP OUT OF TTY? (^C  TYPED IN)
11144          CALL POPTT     ;YES, DO NOW BEFORE FORGET.
11145         MOVE D,UREDP    ;GET INPUT BYTE POINTER
11146 IFN ITSSW,[
11147         .IOPUS UTYIC,
11148         TLNN D,760000   ;AT END OF WORD?
11149         ADD D,[430000,,1]       ;YES, MAKE IT POINT TO BEGINNING OF NEXT WORD
11150         MOVEM D,UREDP
11151         MOVNI A,-2(D)
11152         ADD A,UTIBED    ;GET # WDS WE'LL NEED IN MACTAB.
11153         HLR D,UTIBED    ;REMEMBER WHETHER EOF ON LAST .IOT.
11154         HRRZS UTIBED    ;NOW CLEAR OUT LEFT HALF FOR FOLLOWING
11155 ]
11156 IFN DECSW,[
11157         AOS A,UTICHN    ;DO ".IOPUSH" - USE NEXT CHANNEL.
11158         LSH A,27
11159         ADD A,[WAIT-<0 1,>]
11160         XCT A           ;DON'T MOVE BUFFERS WHILE IO GOING ON!
11161         MOVEI A,UTIBFL+2 ;ASSUME MUST SAVE ALL BUFFER SPACE.
11162 ]
11163         SAVE A
11164         ADD A,FREPTB
11165         ANDI A,-1
11166         CAML A,MACTND   ;NO ROOM IN MACTAB => GC IT.
11167          CALL GCA1
11168         MOVEI A,370
11169         CALL PUTREL     ;INDICATE START OF SAVED BUFFER.
11170         REST A
11171         AOS B,FREPTB
11172         SUBI A,1
11173         MOVE C,ITTYP    ;GET ADDR OF TTY PDL WD THAT'LL POINT TO SAVED BUFFER.
11174         ADDI C,1
11175         HRRZM C,(B)     ;STORE IN RH OF 1ST WD,
11176         MOVEI C,(B)     ;REMEMBER ADDR OF SAVED BUFFER TO PUSH ON TTYPDL.
11177         HRLM A,(B)      ;PUT LENGTH IN LH.
11178         AOS B
11179 IFN ITSSW,HRL B,UREDP   ;ILH _ ADDR OF 1ST WD TO SAVE.
11180 IFN DECSW,HRLI B,UTIBUF
11181         ADDI A,-2(B)    ;ADDR OF LAST WD TO BLT INTO.
11182         BLT B,(A)
11183         HRLI A,041000
11184         MOVEM A,FREPTB  ;MAKE FREE BP -> LAST BYTE JUST USED.
11185         SUB A,MACTAD
11186         ANDI A,-1
11187         LSH A,2
11188         ADDI A,4        ;GET CHAR ADDR OF NEXT FREE BYTE.
11189         MOVEM A,FREEPT
11190         MOVE B,ITTYP    ;GET LOCAL VERSION OF IOPDL
11191 IPSHP:  PUSH B,C        ;PUSH -> SAVED BUFFER (GC WILL RELOCATE)
11192 IFN DECSW,PUSH B,UTIBED
11193 IFN DECSW,PUSH B,UTIHDR
11194 REPEAT 4,PUSH B,INFDEV+.RPCNT   ;SAVE NAMES OF INPUT FILE.
11195         PUSH B,INFCUR   ;SAVE NUMBER OF INPUT FILE.
11196         PUSH B,D        ;LH=LH(OLD UREDP), RH=LH(OLD UTIBED)
11197                 ;FOLLOWING TWO MUST BE LAST PUSHED
11198         INSIRP PUSH B,[IFNM1 IFNM2]     ;CLOBBERED ON PDL IF .OPEN SUCCESSFUL
11199 INPDEL==.-IPSHP         ;LENGTH OF EACH ENTRY ON PDL
11200         MOVE A,FREEPT   ;W MUST USE SAME GC CONVENTION AS PUTREL;
11201         CAML A,MACHI    ;NAMELY, GC AFTER USING UP THE LAST BYTE.
11202          CALL GCA1
11203         MOVEI A,0       ;=> INPUT FROM FILE
11204         MOVEM B,ITTYP   ;STORE BACK UPDATED POINTER
11205         JSP B,PUSHTT    ;SAVE STUFF, ADDRESS MODIFY AND RETURN
11206                 ;POP INTO THE INPUT FILE
11207 IPOP:
11208 IFN CREFSW,[ MOVEI A,2  ;IF CREFFING, OUTPUT POP-FILE BLOCK.
11209         SKIPE CRFONP
11210          PUSHJ P,CRFOUT]
11211 IPOPL:  PUSHJ P,POPTT   ;COME HERE IF .INSRT'S OPEN FAILED.
11212         SAVE C
11213         MOVE B,ITTYP    ;GET POINTER
11214         INSIRP POP B,[IFNM2 IFNM1 A]    ;POP STUFF
11215         POP B,INFCUR
11216 REPEAT 4,POP B,INFDEV+3-.RPCNT
11217 IFN DECSW,[
11218         POP B,C
11219         SAVE C          ;OLD UTIHDR
11220         POP B,UTIBED
11221 ]
11222         POP B,C
11223         MOVEM B,ITTYP   ;SAVED UPDATED PDL POINTERR.
11224         HLRZ B,(C)      ;GET LENGTH OF SAVED BUFFER,
11225 IFN ITSSW,[
11226         SAVE A
11227         CALL SETWH2
11228         REST A
11229         .IOPOP UTYIC,
11230         MOVEI AA,UTIBUF-1(B)    ;GET ADDR OF 1ST WD WON'T BLT INTO IN UTIBUF,
11231         HRLI AA,(A)     ;GET SAVED LH OF UTIBED,
11232         MOVEM AA,UTIBED
11233         HRRI A,UTIBUF   ;MAKE A -> 1ST WD IN BUFFER,
11234 ]
11235 IFN DECSW,[
11236         MOVE AA,UTICHN
11237         LSH AA,27
11238         IOR AA,[RELEAS]
11239         XCT AA          ;THIS CODE EQUIVALENT TO .IOPOP.
11240         SOS UTICHN
11241         REST UTIHDR
11242 ]
11243         MOVEM A,UREDP
11244         MOVSI A,^C_13
11245         MOVEM A,@UTIBED ;PUT EOF CHAR AFTER BUFFER.
11246         MOVSI A,1(C)    ;GET ADDR OF 1ST DATA WD OF SAVED BUFFER,
11247         HRRI A,UTIBUF
11248         CAIE B,1
11249          BLT A,UTIBUF-2(B)
11250         HLLZS (C)       ;TELL GC TO RECLAIM SAVED BUFFER.
11251 POPCJ:  REST C
11252         RET
11253 \f
11254                 ;SAVE INTERNAL POINTERS CONCERNING INPUT MODE
11255
11256 TYPDEL==2               ;NUMBER OF WORDS IN RELEVANT PDL ENTRY
11257
11258 PUSHTT: PUSH P,A
11259         PUSH P,F
11260         AOSN CMEOF      ;IF SUPPOSED TO POP OUT OF TTY SOON,
11261          CALL POPTT     ;DO IT NOW BEFORE CMEOF CLOBBERED.
11262         MOVE F,ITTYP    ;GET RELEVANT PDL POINTER
11263         MOVEI A,0
11264         EXCH A,CLNN     ;SET UP NEW LINE NUMBER
11265         HRL A,CPGN      ;SAVE CURRENT PAGE NUMBER
11266         SETZM CPGN      ;NOW RE-INITIALIZE
11267         SKIPGE CRFILE   ;SAVE CREF-ALL-ON-ONE-LINE FLAG.
11268         TLO A,400000
11269         PUSH F,A        ;SAVE CPGN,,CLNN
11270         MOVE A,-1(P)    ;RETRIEVE NEW MODE
11271         PUSHJ P,PSHLMB  ;SAVE LIMBO1 AND SET UP INSTRUCTIONS FOR NEW MODE
11272 IFN ITSSW,[
11273         CALL SETWH2
11274         .SUSET [.SWHO3,,A]
11275 ]
11276         MOVEM F,ITTYP   ;STORE BACK UPDATED POINTER
11277         JRST POPFAJ
11278
11279                 ;RESTORE INTERNAL POINTERS CONCERNING INPUT MODE
11280
11281 POPTT:  PUSH P,A
11282         PUSH P,F
11283         MOVE F,ITTYP    ;GET PDL POINTER
11284         PUSHJ P,POPLMB  ;POP INTO LIMBO1, SET UP NEW MODE
11285         POP F,A         ;GET CPGN,,CLNN
11286         SETZM CRFILE    ;RESTORE ALL-ON-ONE-LINE FLAG.
11287         TLZE A,400000
11288          SETOM CRFILE
11289         HLRZM A,CPGN
11290         HRRZM A,CLNN
11291 IFN ITSSW,[
11292         CALL SETWH2
11293         ADD A,CPGN
11294         .SUSET [.SWHO3,,A]
11295 ]
11296         MOVEM F,ITTYP   ;STORE BACK UPDATED POINTER
11297         JRST POPFAJ
11298
11299 IFN ITSSW,[
11300 SETWH2: MOVE A,RCHMOD
11301         CAIL A,2
11302          SKIPA A,[SIXBIT /TTY:/]
11303           MOVE A,INFFN1
11304         .SUSET [.SWHO2,,A]
11305         MOVE A,A.PASS
11306         LSH A,30
11307         ADD A,[SIXBIT /P0/+1]
11308         RET
11309 ]
11310 \f
11311                 ;TTY ROUTINES
11312
11313                 ;CAUSE INPUT FROM TTY (MAIN ROUTINES)
11314
11315 GTYIPA:         ;PUSH TO TTY, DON'T STO@ AT CR.
11316         SETZM A.TTYF
11317 IFN ITSSW,[     TYPR [ASCIZ/TTY: .INSRTed, end input with ^C
11318 /]      ]
11319 .ELSE [ IFE SAILSW,[ TYPR [ASCIZ/TTY: .INSRTed, end input with ^Z
11320 /]      ]
11321         .ELSE [ TYPR [ASCIZ /TTY: .INSRTed, end input with CTL-META-LF
11322 /] ]]
11323 GTYIP1: SKIPA A,[3]
11324 GTYIP:   MOVEI A,2      ;INPUT FROM TTY, STOP AFTER 1 LINE.
11325         SETZM CMPTR     ;FORCE RELOAD ON 1ST READ.
11326         JSP B,PUSHTT    ;SET UP VARIABLES AND RETURN
11327 GTYIPR: SETZM CMPTR     ;RETURN ON .INEOF OR CR
11328         JRST POPTT
11329
11330 ;CALL HERE FROM ASSEM1 LOOP WHEN A ^H INTERRUPT IS DETECTED.
11331 TTYBRK: SETZM A.TTYF
11332         ETR [ASCIZ/^H - break /]        ;TYPE FILENAME, PAGE AND LINE #.
11333         SKIPE ASMOUT
11334          TYPR [ASCIZ/within a <>, () or []
11335 /]
11336         JRST GTYIPA
11337
11338                 ;RCHSET ROUTINES FOR READING FROM TTY
11339                 ;RCHMOD=3 => DON'T QUIT ON CR
11340                 ;2 => QUIT ON CR.
11341
11342 RCHTRC:
11343 RCHARC: TLO FF,FLTTY    ;SET FLAG
11344         JSP A,CPOPJ
11345 RCHAC1: REPEAT 2,[      ;RCH2, RR1
11346         ILDB A,CMPTR    ;GET CHAR
11347         CAIN A,0        ;END OF STRING MARKED WITH 0
11348         PUSHJ P,TYRLDR  ;RELOAD, JUMP BACK FOR NEXT CHAR
11349 ]
11350         HALT    ;RRL1
11351 IFN .-RCHAC1-RCHPSN,.ERR RCHAC1 LOSES.
11352         ILDB A,CMPTR    ;SEMIC
11353         CAIN A,15
11354         JRST SEMICR
11355         JUMPN A,SEMIC
11356         PUSHJ P,TYRLD
11357         JRST SEMIC
11358 \f
11359 TYRLD:  MOVEI A,3       ;RETURN AFTER THE CALL, NOT BEFORE.
11360         ADDM A,(P)
11361
11362                 ;READ IN STRING
11363
11364 ;RELOAD BUFFER IF RAN OUT IN CALL TO RCH.
11365 TYRLDR: AOSN CMEOF      ;EOF DETECTED AFTER LAST RELOAD =>
11366          JRST RPAEOF    ;POP OUT OF TTY.
11367         SAVE A
11368         SAVE B
11369         MOVE B,RCHMOD
11370         PUSH P,F
11371         SAVE A.TTYF     ;IF CHARS RUBBED OUT THEY SHOULD BE PRINTED.
11372         SETZM A.TTYF
11373         MOVE F,[10700,,CMBUF-1] ;INITIAL BYTE POINTER TO BUFFER
11374         MOVEM F,CMPTR   ;STORE AS BYTE POINTER FOR READ
11375 TYRLD2: PUSHJ P,TYI     ;GET CHARACTER
11376         CAIN A,177      ;RUBOUT?
11377         JRST TYRLD3     ;YES
11378         CAIE A,^C
11379         CAIN A,^Z
11380          JRST TYRLD7    ;^C, ^Z => EOF.
11381         CAIN A,^U
11382         JRST TYRLD5     ;RUB OUT ALL
11383         CAIE B,2        ;FOR .TTYMAC HANDLING, CONVERT LOWER CASE TO UPPER.
11384          JRST TYRLD6
11385         CAIL A,"A+40
11386          CAILE A,"Z+40
11387           CAIA
11388            SUBI A,40
11389 TYRLD6: IDPB A,F        ;STORE CHARACTER IN BUFFER
11390         CAIE A,^M       ;CR?
11391         JRST TYRLD2     ;NO, GO BACK FOR NEXT
11392         CAIN B,2        ;.TTYMAC (MODE 2) => CR ENDS INPUT, SO FAKE EOF.
11393          SETOM CMEOF
11394         MOVEI A,^J      ;FOLLOW THE CR WITH A LF.
11395         IDPB A,F
11396         SAVE F          ;OUTPUT THE ENTIRE LINE TO THE ERROR FILE
11397         MOVE F,[10700,,CMBUF-1]
11398 TYRLD8: CAMN F,(P)
11399          JRST TYRLD9
11400         ILDB A,F
11401         CAIN A,^M       ;IF LINE WAS ENDED BY A ^C OR ^Z, PUT THAT IN ERROR
11402          SKIPL CMEOF    ;FILE, WHICH NEEDS HAIR SINCE THAT CHAR IS NOT
11403           JRST TYRLD0   ;IN THE STRING WE STORED.
11404         MOVEI A,"^
11405         CALL ERRCHR
11406         MOVEI A,IFN DECSW,["Z] .ELSE "C
11407         CALL ERRCHR
11408         LDB A,F
11409 TYRLD0: CALL ERRCHR
11410         JRST TYRLD8
11411
11412 TYRLD9: REST F
11413         MOVEI A,0
11414         IDPB A,F        ;MARK END OF STRING
11415         IDPB A,F
11416         REST A.TTYF
11417         REST F
11418         REST B
11419         REST A
11420         JRST RCHTRA
11421
11422 TYRLD7: SETOM CMEOF     ;^C, ^Z FORCE EOF,
11423         CALL TYRLCR     ;AFTER TURNING INTO ^M.
11424         MOVEI A,^M
11425         JRST TYRLD6
11426
11427 TYRLCR: MOVEI A,^M
11428         CALL TYOX
11429         MOVEI A,^J
11430         JRST TYOX
11431
11432 TYRLD3: CAMN F,[10700,,CMBUF-1] ;RUBOUT, BEGINNING OF BUFFER?
11433         JRST TYRLD4     ;YES
11434         LDB A,F         ;GET LAST CHARACTER IN BUFFER
11435         CALL TYOX       ;TYPE IT OUT, DON'T WRITE IN ERROR FILE.
11436         ADD F,[70000,,] ;DECREMENT POINTER
11437         JUMPGE F,TYRLD2 ;JUMP IF VALID
11438         SUB F,[430000,,1]       ;WAS 440700,,SOMETHING, BACK IT UP
11439         JRST TYRLD2
11440
11441 TYRLD5: MOVE F,[10700,,CMBUF-1] ;^U, BACK TO BEGINNING OF LINE
11442 TYRLD4: PUSHJ P,TYRLCR  ;RUBOUT WHEN AT BEGINNING OF BUFFER, TYPE CR
11443         JRST TYRLD2
11444 \f
11445 IFN ITSSW,[     ;GET (JUST TYPED IN) CHAR IN A
11446 OUTCHR==.IOT TYOC,
11447
11448 TYI:    SKIPN TTYOP
11449          CALL TTYINI    ;OPEN THE TTY IF NOT ALREADY DONE.
11450         .IOT TYIC,A
11451         JUMPE A,TYI
11452         CAIN A,^L
11453          JRST TYI
11454         POPJ P,
11455
11456                 ;INITIALIZE TTY
11457
11458 TTYINI: SAVE A
11459         .OPEN TYIC,[SIXBIT /   TTYMIDAS TYI/]   ;INPUT, CONVERT LOWER CASE TO UPPER
11460          .LOSE
11461         .OPEN TYOC,[21,,SIXBIT /   TTYMIDAS TYO/]       ;DISPLAY MODE OUTPUT
11462          .LOSE
11463         SYSCAL CNSGET,[1000,,TYOC ? 2000,,A ? 2000,,A]
11464          MOVSI A,1      ;TTY: IS TRANSLATED TO SOMETHING ELSE => ASSUME INFINITE LINEL
11465         MOVEM A,LINEL   ;ELSE LINEL GETS WIDTH OF TTY.
11466         SETOM TTYOP     ;SAY THE TTY IS NOW OPEN.
11467         JRST POPAJ
11468
11469 JCLINI: .SUSET [.ROPTIO,,A]
11470         TLNN A,40000            ;HAS OUR SUPERIUOR SAID IT HAS A CMD?
11471          RET                    ;NO.
11472         MOVE A,[CMBUF,,CMBUF+1]
11473         BLT A,CMBUF+CMBFL-2     ;ZERO ALL BUT LAST WD,
11474         MOVEM A,CMBUF+CMBFL-1   ;NONZERO LAST WD.
11475         .BREAK 12,[5,,CMBUF]    ;TRY TO READ COMMAND STRING.
11476         MOVE A,[440700,,CMBUF]
11477         SKIPE CMBUF     ;IF READ A CMD-STRING,
11478          MOVEM A,CMPTR  ;TELL TYRLD, GO2 IT'S THERE.
11479         POPJ P,
11480
11481 ;JRST HERE FROM TSINT FOR 2ND WD INTERRUPTS.
11482 TTYINT: SAVE A
11483         MOVEI A,TYIC    ;THE TTY CHNL IS THE ONLY ONE ENABLED.
11484         .ITYIC A,
11485          JRST TTYINX    ;NO INT. CHAR.
11486         CAIN A,^W
11487          AOS A,TTYFLG   ;^W SILENCES,
11488         CAIN A,^V
11489          SOS A,TTYFLG   ;^V UNSILENCES,
11490         CAIN A,^H
11491          SETOM TTYBRF   ;^H SAYS BREAK NEXT TIME THRU ASSEM1 LOOP.
11492 TTYINX: REST A
11493         .DISMIS .JBTPC
11494 ]       ;END IFN ITSSW
11495 \f
11496 IFN DECSW,[
11497 TYI:    SKIPN TTYOP     ;OPEN THE TTY, IF NOT ALREADY DONE.
11498          CALL TTYINI
11499         INCHWL A
11500 IFN SAILSW,[
11501         CAIN A,612      ;SAIL => EOF IS 612. SO TURN INTO NORMAL EOF.
11502          MOVEI A,^Z
11503 ]
11504         CAIE A,^M       ;THROW AWAY THE LF AFTER A CR
11505          RET
11506         INCHWL A
11507         MOVEI A,^M      ;NOTE THAT TYRLDR WILL PUT IT BACK IN.
11508         RET
11509
11510 TTYINI: OPEN TTYINB
11511          JRST TTYINI
11512         INSIRP PUSH P,AA A B
11513 IFE SAILSW,[
11514         PJOB A,
11515         TRMNO. A,
11516          JRST TTYIN1
11517         MOVEI AA,1012   ;.TOWID
11518         MOVE B,[2,,AA]
11519         TRMOP. B,               ;READ WIDTH OF TTY LINE INTO B.
11520 ]
11521 TTYIN1:  MOVEI B,80.            ;TRMOP. FAILED OR NOT TRIED => ASSUME WIDTH IS 80.
11522         MOVEM B,LINEL
11523         INSIRP POP P,B A AA
11524         SETOM TTYOP
11525         RET
11526
11527 TTYINB: 1
11528         'TTY,,
11529         0
11530
11531 TTYREN: IFE SAILSW,LOC .JBREN
11532 .ELSE LOC JOBREN
11533 TTYREN
11534 LOC TTYREN
11535         SETOM TTYBRF    ;"REENTER" COMMAND COMES HERE
11536 R: G:   IFE SAILSW,JRST @.JBOPC ;TO REQUEST A ^H-BREAK.
11537 .ELSE JRST @JOBOPC
11538 ]
11539
11540 TAB:    MOVEI A,^I
11541 TYO:    SKIPG A.TTYF
11542          CALL TYOX
11543 ERRCHR: IFN ERRSW,[
11544         SKIPN ERRFOP    ;OUTPUT CHAR IN A TO ERROR FILE IF ONE IS OPEN.
11545          RET
11546         SOSGE ERRCNT
11547          JRST ERRCH1    ;OUTPUT BUFFER.
11548         IDPB A,ERRPNT
11549         RET
11550
11551 ERRCH1: SAVE C
11552         MOVE C,[0 ERRFC,ERRHDR]
11553         CALL OBUFO
11554         REST C
11555         JRST ERRCHR
11556 ]IFE ERRSW,RET
11557
11558 TYOX:   SKIPN TTYOP
11559          CALL TTYINI
11560         OUTCHR A
11561         RET
11562 \f
11563 IFN DECSW,[
11564
11565 JCLINI: SKIPN CCLFLG            ; WAS MIDAS CALLED FROM CCL LEVEL?
11566          RET                    ; NO, DO NOT SNARF TEMPCORE
11567         SETZM CCLFLG            ; IF TMPCOR LOSES WANT THIS 0 (WILL RE-SETOM BELOW)
11568         SETZM CMBUF             ; ZERO FIRST COMMAND WORD
11569         MOVE A,[CMBUF,,CMBUF+1] ; LOAD BLT POINTER
11570         BLT A,CMBUF+CMBFL-2     ; ZERO ALL BUT LAST WORD
11571         MOVEM A,CMBUF+CMBFL-1   ; NON-ZERO LAST WORD
11572         MOVE A,[2,,['MID,, ? -CMBFL,,CMBUF-1]]
11573         TMPCOR A,               ; READ COMPIL-GENERATED COMMAND
11574          RET                    ; NO COMMAND, PUNT
11575         MOVE A,[440700,,CMBUF]  ; LOAD A BYTE POINTER TO THE COMMAND
11576         SKIPN CMBUF             ; ONE LAST CHECK FOR IT TO BE THERE
11577          RET                    ; ALAS, THERE IS NONE
11578         SETOM CCLFLG
11579         MOVEM A,CMPTR           ; THERE IS, SET COMMAND POINTER
11580         SAVE B
11581 JCLIN1: ILDB B,A
11582         CAIE B,^J               ;SEE IF OUR COMMAND FILE HAS ANYTHING AFTER 1ST LINE.
11583          JRST JCLIN1
11584         ILDB B,A
11585         JUMPE B,POPBJ
11586         SETOM MORJCL            ;IT DOES; SET FLAG SO AFTER HANDLING 1ST LINE WE'LL
11587         SAVE C
11588         MOVE C,[440700,,UTIBUF+2]
11589 JCLIN2: IDPB B,C
11590         ILDB B,A
11591         JUMPN B,JCLIN2
11592         SUBI C,UTIBUF+1         ;GET # WORDS WRITTEN IN UTIBUF. OPERAND IS RELOCATABLE!
11593         HRLOI C,-1(C)           ;THESE 2 INSNS TURN SIZE INTO -SIZE,,UTIBUF+1
11594         EQVI C,UTIBUF+1
11595         MOVEM C,(C)
11596         MOVSI C,'MID
11597         MOVEM C,UTIBUF
11598         MOVE C,[3,,UTIBUF]
11599         TMPCOR C,
11600          JFCL
11601         REST C
11602         REST B
11603         RET
11604 ];END IFN DECSW
11605 \f
11606                 ;TS DATA STORAGE
11607
11608 VBLK
11609
11610 TYPDLS==TYPDLC*TYPDEL+INPDEL*MX.INS
11611                 ;"TTY PDL", STORES INFORMATION ABOUT CURRENT INPUT MODE
11612                 ;(SIMILAR TO MACRO PDL BUT NOT GARBAGE COLLECTED)
11613
11614 ITTYP:  -TYPDLS-1,,TTYPDL       ;PDL POINTER (TYPDEL=LENGTH OF EACH ENTRY)
11615 TTYPDL: NEDCHK          ;ACTUAL PDL: INITIAL ENTRY TO OVERPOP ROUTINE
11616         BLOCK TYPDLS    ;PDL PROPER
11617
11618                 ;INPUT BUFFER AND VARIABLES
11619
11620 UTIBUF: BLOCK UTIBFL
11621 UTIHDR: 0               ;INPUT BUFFER HEADER (DEC VERSION)
11622 UREDP:  440700,,UTIBUF  ;INPUT BYTE POINTER
11623 UTICNT: 0               ;INPUT BYTE COUNT (DEC VERSION)
11624 UTIBED: UTIBUF          ;EOF COMPARISON WITH RH(UREDP), 4.9 => EOF ON .IOT
11625 IFSTS:  0               ;.STATUS WORD STORED BY OPNRD1 WHEN .OPEN LOSES
11626 IFN DECSW,UTICHN:       UTYIC
11627
11628                 ;FILE DESCRIPTION STORAGE
11629
11630 INDDP:  MAXIND,,FDSOFS  ;POINTER INTO TABLE
11631 FDSBEG==.               ;BEGINNING OF TABLE AREA
11632 DNAM:   0               ;DEVICE NAME
11633 FNAM1:  0               ;FILE NAME 1
11634 FNAM2:  0               ;" " 2
11635 SNAM:   0               ;SYSTEM NAME
11636 LFDSE==.-FDSBEG         ;LENGTH OF TABLE ENTRY
11637 IFDS:   BLOCK LFDSE     ;SPECIFIED INPUT FILE
11638         0               ;FOR .FDELE AT .FILE TIME
11639 ONAM:   BLOCK 3         ;OUTPUT DEVICE/FILENAMES SPECIFIED
11640 OFNM1==ONAM+1
11641 OFNM2==ONAM+2
11642 OSYSNM: -1              ;SPECIFIED OUTPUT SYSTEM NAME
11643 IFN CREFSW,[    0
11644 CRFDEV: BLOCK 3         ;CREF DEV, FN1, FN2.
11645 CRFSNM: 0               ;CREF SNAME.
11646 ]
11647 IFN ERRSW,ERRDEV:       BLOCK 4 ;ERROR OUTPUT FILE NAMES.
11648 IFN LISTSW,[
11649 LSTDEV: BLOCK 3         ;LISTING FILE NAMES.
11650 LSTSNM: 0
11651 ]
11652 FNMEND::
11653 INFDEV: 0
11654 INFFN1: BLOCK 3         ;FILENAMES OF INPUT FILE BEING READ NOW.
11655 INFCNT: 0       ;# INPUT FILE OPENED.
11656 INFCUR: 0       ;WHAT INFCNT WAS WHEN CURRENT FILE OPENED.
11657 INFERR: 0       ;WHAT INFCUR HELD AT LAST ERROR MSG.
11658 FDSOFS==.-FDSBEG        ;OFFSET TO BEGINNING OF NON-DEDICATED AREA
11659         BLOCK LFDSE*MAXIND      ;OPEN NAMES @: FILES (AND FNF'S)
11660 SFSFDS=.-FDSOFS         ;SOURCE SPECIFIED NAMES @: FILES
11661         BLOCK LFDSE*MAXIND      ;STORAGE FOR "
11662
11663 RFNAM1: 0               ;.FNAM1
11664 RFNAM2: 0
11665 IFNM1:  0               ;.IFNM1
11666 IFNM2:  0
11667 RSYSNM: 0               ;INITIAL SYSTEM NAME
11668
11669 IFN CMUSW, PPNBUF: BLOCK 4      ;FOR CONVERTING CMU PPNs
11670
11671 IFN DECSW,IFE SAILSW, V.SITE:   BLOCK 5         ;SYSTEM NAME IN SIXBIT, FOR .SITE.
11672 \f
11673                 ;TTY VARIABLES
11674
11675 CMBUF:  BLOCK CMBFL     ;TYPEIN BUFFER
11676 CMPTR:  0       ;BYTE POINTER TO CMBUF, CLEARED AT GO2 IF >0.
11677 CMEOF:  0       ;-1 => POPTT INSTEAD RELOAD AFTER THIS BUFFERFULL.
11678 IFN DECSW,MORJCL: 0     ;-1 => THERE ARE MORE LINES OF CCL COMMANDS
11679                         ;SO DO A RUN SYS:MIDAS WHEN FINISHED.
11680 TTYOP:  0       ;-1 => THE TTY IS ALREADY OPEN.
11681 LINEL:  0       ;WIDTH OF TTY (MAY BE 1,, MEANING ASSUME INFINITE).
11682 A.TTYFLG:       ;VALUE OF .TTYFLG:
11683 TTYFLG: 0       ;TTY TYPEOUT PERMITTED IFF >= 0.
11684 WSWCNT: 0       ;THE NUMBER OF W-SWITCHES IN THE LAST CMD STRING.
11685 TTYBRF: 0       ;-1 => ^H BREAK HAS BEEN REQUESTED BUT NOT DONE.
11686 FATAL:  0       ;AT END OF ASSEMBLY, NOT 0 IFF FATAL ERROR OCCURRED.
11687 NEDCRL: 0       ;-1 => HAVEN'T YET SUPPLIED A CRLF AT EOF OF MAIN FILE.
11688 NVRRUN: -1      ;0 => MIDAS WAS RUN; ERROR TO START OR PURIFY.
11689
11690                 ;OPNER VARIABLES
11691
11692 ERRDNM: (SIXBIT /ERR/)
11693         3
11694 ERRNM2: 0               ;.STATUS WORD
11695
11696 IFN ITSSW,OCLOSP: @1(C) ;TURNED INTO BP TO UNUSED PART OF LAST BFFER WD USED.
11697
11698                 ;OUTPUT VARIABLES
11699
11700 UTOBUF: BLOCK UTOBFL    ;OUTPUT BUFFER
11701 UTOHDR: UTOBFL,,UTOBUF-1
11702 UTYOP:  444400,,        ;OUTPUT (36. BIT) BYTE POINTER
11703 UTYOCT: 0               ;# WORDS LEFT IN UTOBUF
11704
11705 IFN CREFSW,[    ;CREF OUTPUT VARS.
11706 CRFBUF: BLOCK CRFBSZ
11707 CRFHDR: CRFBSZ,,CRFBUF-1        ;HEADER, ASSEMBLED VALUE USED ONLY IFN ITSSW
11708 CRFPTR: 444400,,        ;BP FOR FILLING BUFFER
11709 CRFCNT: 0               ;NUM. CHARS. EMPTY IN BUFFER
11710 ]
11711
11712 IFN LISTSW,[
11713 LSTBUF: BLOCK LSTBSZ
11714 LSTHDR: 5*LSTBSZ,,LSTBUF-1
11715 LSTPTR: 440700,,
11716 LSTCNT: 0
11717 ]
11718
11719 IFN ERRSW,[
11720 ERRBUF: BLOCK ERRBSZ
11721 ERRHDR: 5*ERRBSZ,,ERRBUF-1
11722 ERRPNT: 440700,,
11723 ERRCNT: 0
11724 ERRFP:  0       ;NON-0 IF WANT ERROR OUTPUT FILE.
11725 ERRFOP: 0       ;NON-0 IF ERROR FILE OPEN (IE TRY OUTPUTTING TO IT)
11726 ]
11727 PBLK
11728 \f
11729         ;.INSRT FILEDESCRIPTION<CR>
11730         ;INSERT FILE HERE
11731         ;TTY: => OK, READS LINE AT A TIME, RUBOUT ALLOWED WITHIN LINE
11732         ;PUSHES MACRO EXPANSION, OTHER .INSRT'S
11733         ;IN FILEDESCRIPTION, ^R => RESET FILE NAME COUNTER
11734
11735 A.INSR: NOVAL
11736         MOVEI F,IFDS-DNAM       ;SET UP POINTER TO INPUT FILE NAMES
11737         PUSHJ P,A.IMAP  ;DEFAULT NAMES = INPUT NAMES
11738         MOVSI A,(SIXBIT /DSK/)
11739         MOVS B,DNAM
11740         CAIN B,(SIXBIT /TTY/)   ;IF INPUTTING FROM TTY,
11741         MOVEM A,DNAM    ;THEN SET DEFAULT DEVICE TO DSK INSTEAD
11742 IFN ITSSW,MOVSI A,(SIXBIT/>/)
11743 IFN DECSW,MOVSI A,'MID
11744         MOVEM A,FNAM2   ;USE > AS THE DEFAULT FN2.
11745         TLO FF,FLUNRD
11746 A.IN1:  PUSHJ P,RFD     ;READ FILE DESCRIPTION
11747         MOVS A,DNAM     ;GET SPECIFIED DEVICE NAME
11748         CAIE A,(SIXBIT /@/)     ;ATSIGN?
11749         PUSHJ P,A.ITRY  ;NO, TRY OPENING FILE
11750         MOVE A,DNAM(F)
11751         AOJE A,A.INT1   ;ALREADY TRYING TO SET UP TABLE ENTRY
11752         SKIPA F,[MAXIND,,FDSOFS]        ;ATSIGN, OR FNF, SEARCH TABLE
11753 A.IN2:  SUBI F,-LFDSE   ;LOOP POINT SEARCHING TABLE, INCREMENT TO NEXT ENTRY, COUNT DOWN LH
11754         CAMN F,INDDP    ;COMPARE WITH POINTER TO TOP OF TABLE
11755         JRST A.IN3      ;AGREE => THIS FILE NOT IN TABLE
11756         MOVE A,F        ;-> SFSFDS
11757         MOVSI B,-LFDSE  ;-> DNAM, LH FOR COUNT
11758         MOVE T,SFSFDS(A)        ;GET SPECIFICATION NAME THIS ENTRY
11759         CAMN T,DNAM(B)  ;COMPARE WITH THAT JUST SPECIFIED
11760         AOBJN B,[AOJA A,.-2]    ;CHECK ALL NAMES THIS ENTRY
11761         JUMPL B,A.IN2   ;LOOP IF NAMES DON'T ALL AGREE
11762                 ;FILE IS IN TABLE
11763         PUSHJ P,A.IMAP  ;SET NEW FILE DESCRIPTION FROM THAT IN TABLE ENTRY
11764         PUSHJ P,A.ITRY  ;TRY OPENING FILE
11765         MOVSI A,SFSFDS(F)       ;SET UP LH(BLT POINTER),
11766         PUSHJ P,A.IMP1  ;UNMAP TO ORIGINAL NAMES
11767         PUSHJ P,TYPFIL  ;TYPE OUT SPECIFIED NAMES
11768         TYPR [ASCIZ / -> /]     ;TYPE OUT POINTER
11769         PUSHJ P,A.IMAP  ;RE-MAP INTO TRANSLATION ENTRY IN TABLE
11770         SETOM DNAM(F)   ;"HALF-KILL" ENTRY
11771 A.INT1: PUSHJ P,IOPNR1  ;TYPE OUT ALL KINDS OF STUFF
11772 A.INT2: PUSHJ P,GTYIP   ;PREPARE TO READ ONE LINE FROM TTY
11773         JRST A.IN1      ;TRY AGAIN WITH WHAT HE TYPES IN
11774
11775                 ;FILE NOT IN TABLE
11776
11777 A.IN3:  TLNN F,-1       ;MORE ROOM FOR ANOTHER ENTRY IN TABLE?
11778          ETF [ASCIZ /Too many @: files/]
11779         MOVEI A,SFSFDS(F)
11780         HRLI A,DNAM
11781         BLT A,SFSFDS+LFDSE-1(F) ;SET UP KEY OF NEW ENTRY
11782         SETOM DNAM(F)   ;DOCUMENT FACT THAT ENTRY HAS ONLY KEY, NOT TRANSLATION
11783         MOVNI A,-LFDSE
11784         ADDM A,INDDP    ;UPDATE POINTER INTO TABLE
11785         MOVS A,DNAM     ;GET SPECIFIED DEVICE NAME
11786         CAIE A,(SIXBIT /@/)     ;ATSIGN?
11787         JRST A.INT1     ;NO, TYPE OUT GARBAGE AND TRY AGAIN, READING FROM TTY
11788         MOVE A,IFDS     ;YES, CLOBBER FROM INPUT DEVICE NAME
11789         MOVEM A,DNAM
11790         JRST A.INT2
11791 \f
11792                 ;TRY OPENING INPUT FILE FOR .INSRT, RETURN IF UNSUCCESSFUL
11793
11794 A.ITRY: MOVS A,DNAM     ;GET SPECIFIED DEVICE NAME
11795         CAIN A,(SIXBIT /TTY/)   ;TTY?
11796          JRST A.ITRT    ;YES, TREAT SPECIAL
11797         TLO FF,FLUNRD
11798         PUSHJ P,IPUSH   ;SAVE CURRENT STATUS
11799         PUSHJ P,OPNRD1  ;TRY OPENING FILE
11800          JRST IPOPL     ;LOSE, POP AND RETURN
11801 IFN ITSSW,CALL SETWH2
11802         MOVE B,ITTYP
11803         MOVEI A,-1-TYPDEL(B)
11804         HRLI A,IFNM1
11805         BLT A,-TYPDEL(B) ;INTRODUCE HYSTERESIS SO .INSRT'ING FILE CAN REFERENCE .IFNM1, .IFNM2
11806 IFN CREFSW,[
11807         SKIPE CRFONP    ;IF CREFFING, OUTPUT PUSH-FILE BLOCK.
11808         PUSHJ P,CRFPSH  ;(POP-FILE BLOCK OUTPUT AT IPOP)
11809 ]
11810 A.ITR2:
11811         MOVE A,DNAM(F)  ;PUSH SUCCESSFUL, NOW CHECK TO SEE IF TABLE ENTRY SHOULD BE FINISHED
11812         AOJN A,ASSEM1
11813         PUSHJ P,A.OMAP  ;YES, DO IT
11814         JRST ASSEM1     ;NOW ASSEMBLE FROM FILE (ASSEM1 CLOBBERS PDL)
11815
11816                 ;.INSRT TTY:
11817
11818 A.ITRT: PUSHJ P,GTYIPA  ;READ FROM TTY, DON'T QUIT UNTIL .INEOF
11819         JRST A.ITR2     ;FALL BACK IN (DOESN'T TOUCH .IFNM1, .IFNM2)
11820
11821                 ;.INEOF         ;EOF PSEUDO (MAINLY USEFUL FROM TTY)
11822
11823 A.IEF2: PUSHJ P,PMACP   ;LOOP POINT, POP ENTRY OFF MACRO PDL
11824 A.INEO: TLNE FF,FLMAC   ;INPUTTING FROM MACRO?
11825         JRST A.IEF2     ;YES, POP IT OFF
11826         PUSH P,CMACCR   ;BACK TO INPUTTING FROM FILE OR TTY, CAUSE RETURN TO MACCR
11827         MOVE B,ITTYP    ;GET PDL POINTER
11828         POPJ B,         ;RETURN TO POP ROUTINE
11829
11830                 ;MISC .INSRT
11831
11832 A.IMAP: MOVSI A,DNAM(F) ;CLOBBER DNAM ETC. FROM TABLE TRANSLATION ENTRY POINTED TO BY F
11833 A.IMP1: HRRI A,DNAM     ;ENTRY FOR LH(BLT POINTER) ALREADY SET UP
11834         BLT A,DNAM+LFDSE-1      ;DO IT
11835         POPJ P,
11836
11837 A.OMAP: MOVEI A,DNAM(F) ;CLOBBER TRANSLATION OF TABLE ENTRY POINTED TO BY F FROM DNAM ETC.
11838         HRLI A,DNAM
11839         BLT A,DNAM+LFDSE-1(F)
11840         POPJ P,
11841
11842 ;CALL FROM ERRH; TYPE INPUT FILE'S NAMES IF CHANGED SINCE LAST ERR MSG.
11843 ERRTFL: MOVE C,INFCUR
11844         EXCH C,INFERR   ;SAY LAST ERROR MSG IN THIS FILE.
11845         CAMN C,INFERR   ;IF PREV. MSG WAS IN OTHER FILE,
11846         POPJ P,
11847         MOVE C,[-4+DECSW,,INFDEV-DNAM]
11848         PUSHJ P,TYPF1   ;TYPE THIS FILE'S NAMES.
11849         JRST CRRERR
11850 \f
11851                 ;MISC TS
11852
11853 IOPNR1: PUSHJ P,IOPNER  ;TYPE OUT CRUFT
11854         TYPR OINITS
11855         RET
11856
11857                 ;TYPE OUT DNAM ETC. AS FILE SPECIFICATION
11858
11859 TYPFIL: MOVSI C,-4+DECSW
11860 TYPF1:  MOVE B,DNAM(C)  ;GET NEXT NAME
11861         PUSHJ P,SIXTYO  ;TYPE OUT NAME
11862         HLRZ A,C
11863         MOVE A,FILSPC+4-DECSW(A)        ;NOW GET DELIMITING CHARACTER
11864         PUSHJ P,TYOERR  ;TYPE OUT
11865         AOBJN C,TYPF1   ;LOOP FOR ALL NAMES
11866 IFN ITSSW, POPJ P,
11867 .ELSE,[ SKIPN B,DNAM(C) ;ON DEC SYSTEM PPN IS A SPECIAL CASE
11868          POPJ P,
11869         MOVEI A,"[ ;]
11870         CALL TYOERR
11871 IFN CMUSW,[
11872         MOVE A,[B,,PPNBUF]
11873         DECCMU A,
11874          JRST OCTPPN
11875         MOVEI B,PPNBUF
11876         PUSHJ P,TYPR3
11877         JRST PPNRB
11878 ];IFN CMUSW
11879 IFE SAILSW,[
11880 OCTPPN: HLRZ B,DNAM(C)  ;LH IS PROJ,
11881         CALL OCTPNT
11882 ]
11883 .ELSE [ HLLZ B,DNAM(C)
11884         CALL SIXTYO
11885 ]
11886         MOVEI A,",
11887         CALL TYOERR
11888 IFE SAILSW,[
11889         HRRZ B,DNAM(C)
11890         CALL OCTPNT     ;RH IS PROG.
11891 ]
11892 .ELSE [ HRLZ B,DNAM(C)
11893         CALL SIXTYO
11894 ]
11895 PPNRB:                  ;[
11896         MOVEI A,"]
11897         JRST TYOERR
11898 ];IFN DECSW
11899
11900 FILSPC: ":
11901 IFN ITSSW, 40 ? 40 ? ";
11902 IFN DECSW, ". ? 0
11903
11904                 ;OPENLOSS DOCUMENTATION ROUTINE
11905 IOPNER: MOVE A,IFSTS    ;INPUT
11906 OPNER:  MOVEM A,ERRNM2  ;SAVE .STATUS WORD
11907         PUSHJ P,TYPFIL  ;TYPE OUT FILE DESCRIPTION
11908         PUSHJ P,CRRERR  ;NOW CRLF TO ENSURE ROOM FOR FOLLOWING
11909 IFN DECSW,[
11910         TYPR [ASCIZ/OPEN failed/]
11911         JRST CRRERR
11912 ]
11913 IFN ITSSW,[
11914         .OPEN ERRC,ERRDNM       ;NOW GET THE SYSTEM TO SAY WHAT'S WRONG
11915         .VALUE          ;CAN'T OPEN ERR DEVICE?
11916 IOPNR2: .IOT ERRC,A     ;GET CHARACTER FROM SYSTEM
11917         CAIN A,14       ;ENDS WITH FORM FEED
11918         POPJ P,
11919         PUSHJ P,TYOERR  ;TYPE OUT CHARACTER
11920         JRST IOPNR2     ;LOOP BACK FOR NEXT
11921 ]       ;END IFN ITSSW
11922 \f
11923 ;READ SINGLE FILE DESCRIPTION INTO DNAM ... SNAM .
11924 ;FRNNUL 1 IFF SPEC WAS NONNULL.
11925 ;FRMRGO 1 IFF "." WAS SEEN IN DEC VERSION - FORCE NULL FN2.
11926 ;FRCMND 1 IFF SHOULD RECOGNIZE -, COMMA, / AND ( AS SPECIAL CHARACTERS.
11927 RFD:    TRZ FF,FRNNUL+FRMRGO
11928 RFD8:   SETZ D,         ;D COUNTS FILENAMES. 0 BEFORE 1ST.
11929 RFD1:   MOVEI C,0       ;INITIALIZE SIXBIT NAME.
11930         MOVE B,[440600,,C]      ;SET UP BP FOR INPUT
11931 RFD2:   PUSHJ P,RCH     ;GET CHARACTER IN A
11932         CAIN A,":       ;IF COLON...
11933          JRST RFDCOL    ;THEN PROCESS AS SUCH
11934         CAIN A,";       ;SIMILARLY FOR SEMICOLON
11935          JRST RFDSEM
11936 IFN DECSW,[
11937         CAIN A,"!       ; FOO! MEANS RUN SYS:FOO WITH OFFSET 1
11938          JRST RFDRUN
11939 ]
11940         CAIN A,^Q       ;IF CONTROL Q...
11941          JRST RFDCQ     ;THEN GET NEXT CHARACTER AND TREAT AS NON-SYNTACTICAL
11942         TRNN FF,FRCMND  ;IF READING COMMAND, _, COMMA, / AND ( ARE SPECIAL.
11943          JRST RFD3
11944         CAIN A,"(
11945          JRST CMDSW     ;READ SWITCHES.
11946         CAIN A,"/
11947          JRST CMDSL     ;READ 1 SWITCH
11948 IFN DECSW,CAIN A,"=
11949 .ALSO      JRST RFD6    ;ON DEC SYS, "=" = "_"
11950         CAIE A,",
11951          CAIN A,"_
11952           JRST RFD6     ;COMMA AND _ END SPEC.
11953 RFD3:
11954 IFN DECSW,[
11955         CAIE A,"[       ;]
11956          CAIN A,".      ;. LIK SPACE ON DEC SYS.
11957           JRST RFD6]
11958         CAILE A,40      ;LOGICAL SPACE? (INCLUDING CR)
11959          JRST RFDC      ;NO
11960 RFD6:   TRZN FF,FRMRGO  ;EXCEPT AFTER ".",
11961          JUMPE C,RFD5   ;IGNORE NULL FILENAMES
11962         XCT RFDTAB(D)   ;STORE THE NAME (MAY SKIP)
11963          ADDI D,1       ;NEXT NAME PUT ELSEWHERE
11964 IFN DECSW,[
11965         CAIN A,".
11966          IORI FF,FRMRGO
11967 ]
11968         TRO FF,FRNNUL   ;SPEC NOT NULL.
11969 RFD5:   IFN DECSW,[CAIN A,"[    ;] READ PPN FOR DEC SYS.
11970                  JRST RFD7]
11971         CAIN A,^R       ;CONTROL R,
11972          JRST RFD8      ;RESETS FILENAME COUNT
11973 IFN DECSW,[
11974         CAIN A,"=       ;ON DEC SYS, "=" = "_".
11975          MOVEI A,"_
11976 ]
11977         CAIN A,",
11978          RET
11979         CAIE A,"_       ;RETURN IF SPEC TERMINATOR,
11980          CAIN A,^M
11981           RET
11982         JRST RFD1       ;ELSE NEXT NAME.
11983
11984 RFDCQ:  PUSHJ P,RCH     ;CONTROL Q EATS UP THE NEXT CHARACTER
11985         CAIN A,15
11986         JRST RFD6       ;BUT NOT IF CR
11987 RFDC:   CAIL A,140      ;CONVERT LOWER CASE TO UPPER.
11988         SUBI A,40
11989         SUBI A,40       ;CONVERT CHARACTER TO SIXBIT
11990         TLNE B,770000   ;TOO MANY CHARACTERS?
11991         IDPB A,B        ;NO
11992         JRST RFD2       ;LOOP
11993
11994 RFDTAB: MOVEM C,FNAM1   ;1ST NAME.
11995         MOVEM C,FNAM2   ;2ND NAME.
11996         MOVEM C,DNAM    ;3RD NAME IS DEV.
11997         MOVEM C,SNAM    ;4TH IS SNAME.
11998         CAIA            ;5TH AND ON IGNORED, DON'T INCR. D.
11999 \f
12000 RFDCOL: TRO FF,FRNNUL
12001         JUMPE C,RFD1    ;IF HE WANTS THE NULL DEVICE HE GETS TO TYPE IT IN
12002         MOVEM C,DNAM    ;MOVE TO RH OF DEVICE LOCATION
12003         JRST RFD1       ;LOOP
12004
12005 IFN DECSW,[
12006 RFD7:   PUSHJ P,RFDPPN  ;READ PPN, USE AS "SNAME".
12007 ]
12008 RFDSEM: TRO FF,FRNNUL
12009         JUMPE C,RFD1    ;NO NULL SYSTEM NAMES PLEASE
12010         MOVEM C,SNAM    ;MOVE TO SYSTEM NAME LOCATION
12011         JRST RFD1       ;LOOP
12012
12013 IFN DECSW,[
12014 RFDPPN: PUSHJ P,RFDOCT  ;READ PROJECT NUM,
12015 IFN CMUSW, JUMPE C,RCMUPP       ;AT CMU WATCH FOR OUR FUNNY PPNs
12016         HRLM C,(P)
12017         PUSHJ P,RFDOCT  ;READ PROGRAMMER NUM.
12018         HLL C,(P)
12019         POPJ P,
12020
12021 IFE SAILSW,RFDOCL=="0 ? RFDOCH=="8      ;READ OCTAL NUMBERS.
12022 .ELSE RFDOCL==40 ? RFDOCH==140  ;READ SIXBIT (RIGHT-JUSTIFIED).
12023
12024 RFDOCT: SETZ C, ;READ OCTAL NUM, RETURN IN C.
12025 RFDOC1: PUSHJ P,RCH
12026         CAIL A,140
12027          SUBI A,40
12028 IFN SAILSW,[ ;[         ;EVEN IF READING SIXBIT NAMES (FOR SAIL),
12029         CAIE A,",       ;COMMA AND CLOSEBRACKET ARE STILL SPECIAL.
12030          CAIN A,"]
12031           POPJ P,
12032 ]
12033         CAIL A,RFDOCL
12034         CAIL A,RFDOCH
12035          POPJ P,        ;NOT OCTAL OR NOT 6BIT, RETURN.
12036         IMULI C,RFDOCH-RFDOCL
12037         ADDI C,-RFDOCL(A)
12038         JRST RFDOC1
12039
12040 IFN CMUSW,[     ;[
12041 RCMUPP: CAIN A,"]       ;WATCH OUT FOR []
12042          POPJ P,
12043 REPEAT 4, SETZM PPNBUF+.RPCNT
12044         MOVE C,[440700,,PPNBUF]
12045 RCMUPL: CAIE A,^M               ;Don't look too far
12046          SKIPE PPNBUF+3
12047           JRST RCMUPD
12048         IDPB A,C
12049         PUSHJ P,RCH     ;[
12050         CAIE A,"]
12051          JRST RCMUPL
12052 RCMUPD: MOVE A,[C,,PPNBUF]
12053         CMUDEC A,
12054          SETZ C,
12055         POPJ P,
12056 ];IFN CMUSW
12057 ];IFN DECSW
12058 \f
12059 IFN DECSW,[
12060
12061 ;PROCESS "FOO!", WHICH MEANS "RUN SYS:FOO WITH AN OFFSET OF 1".
12062
12063 RFDRUN: MOVSI A,'SYS    ;DEV NAME
12064         MOVE B,C        ;FN1
12065         SETZB C,D       ;DEFAULT THE FN2.  4TH WORD NOT USED.
12066         SETZB T,TT      ;DEFAULT THE PPN (UNUSED ANYWAY).  DON'T SPECIFY CORE SIZE.
12067         MOVE AA,[1,,A]  ;<START OFFSET>,,<ADDRESS OF ARG BLOCK>
12068         JRST RFDRU1
12069 VBLK
12070 RFDRU1: MOVE F,[1,,RFDRUE]
12071         CORE F,         ;FLUSH AS MUCH CORE AS POSSIBLE, SINCE RUN UUO CAN LOSE
12072          HALT           ;BECAUSE OF HOW MUCH WE HAVE.
12073         RUN AA,
12074          HALT
12075 RFDRUE:
12076
12077 PBLK
12078 ];END IFN DECSW,
12079
12080 ;COMMAND SWITCH PROCESSING.
12081
12082 CMDSL:  CALL RCH        ;COME HERE AFTER A SLASH. READ ONE SWITCH.
12083         CAIN A,^M
12084          JRST RFD6
12085         CALL CMDSW1
12086         JRST RFD2
12087
12088 CMDSW:  PUSHJ P,RCH
12089         CAIN A,")
12090          JRST RFD2
12091         CAIN A,^M
12092          JRST RFD6      ;DON'T CRASH IF USER PUTS CR IN SWITCH LIST.
12093         CALL CMDSW1
12094         JRST CMDSW
12095
12096 CMDSW1: CAIL A,140      ;LOWER CASE TO UPPER.
12097          SUBI A,40
12098         CAIN A,"T
12099          SOS TTYINS     ;COUNT # T-SWITCHES.
12100 IFN LISTSW,[
12101         CAIN A,"L
12102          JRST CMDLST
12103 ]
12104         CAIN A,"W       ;W - PREVENT TTY MESSAGES, AND RQ ERROR OUTPUT FILE IF POSSIBLE.
12105 IFE ERRSW,AOS WSWCNT
12106 .ELSE [
12107         AOSA WSWCNT
12108         CAIN A,"E       ;E - RQ ERROR LOG FILE.
12109          SETOM ERRFP
12110 ]
12111 IFN CREFSW,[
12112         CAIN A,"C       ;C - RQ CREF OUTPUT.
12113         SETOM CREFP
12114 ]
12115         RET
12116 \f
12117 ;READ COMMAND, DEFAULT FILENAMES.
12118 CMD:    SKIPN CMPTR
12119         CALL CRR
12120         SKIPN CMPTR     ;UNLESS HAVE DDT COMMAND STRING, PROMPT.
12121 CMDB:   TYPR [ASCIZ/*/]
12122         MOVEI A,3       ;READ FROM TTY (OR STRING <- CMPTR)
12123         CALL RCHSET
12124         TRO FF,FRCMND+FRARRO    ;TELL RFD ABOUT COMMA, _ AND (.
12125         CALL RFD        ;NOW SEE IF COMMAND NULL, AND WHETHER HAS _.
12126         TRNN FF,FRNNUL
12127         CAIE A,^M
12128          CAIA
12129         JRST CMDB       ;JUST A CR WITH NOTHING SIGNIFICANT BEFORE IT.
12130 CMD0:   CAIN A,"_
12131          TRZ FF,FRARRO  ;FRARRO WILL BE ON IFF NO _ IN STRING.
12132         CAIN A,^M
12133          JRST CMD1      ;READ THRU THE WHOLE COMMAND.
12134         CALL RFD
12135         JRST CMD0
12136
12137 ;NOW RE-READ THE STRING, FOR REAL THIS TIME.
12138 CMD1:   MOVE F,[440700,,CMBUF]
12139         MOVEM F,CMPTR   ;START FROM BEGINNING OF STRING.
12140 IFN CREFSW,SETZM CREFP  ;CLEAR ALL SWITCHES BEFORE DECODING THEM.
12141 INSIRP SETZM 0,ERRFP TTYINS WSWCNT
12142 IFN LISTSW,[
12143         SETZM LISTP
12144         SETOM LISTP1    ;WILL BE AOSED BY EACH (L) SWITCH.
12145 ]
12146         SETZM DNAM      ;CLEAR OUT ALL FILENAMES.
12147         MOVE T,[DNAM,,DNAM+1]
12148         BLT T,FNMEND-1
12149         MOVSI T,'DSK    ;DEFAULT DEV IS DSK
12150         MOVEM T,DNAM    ;EXCEPT PERHAPS IF OUTPUT SPEC NULL.
12151         MOVE T,RSYSNM
12152         MOVEM T,SNAM    ;DEFAULT SNAME IS INITIAL SNAME.
12153         TRZ FF,FRNNUL
12154         TRNN FF,FRARRO  ;DON'T GOBBLE INPUT SPEC AS OUTPUT!
12155          CALL RFD               ;READ BIN FILE SPEC.
12156         MOVE F,FF       ;REMEMBER WHETHER NULL
12157         MOVE T,[DNAM,,ONAM]
12158         BLT T,OSYSNM
12159         MOVS T,DNAM
12160         CAIN T,'NUL     ;IF BIN WENT TO NUL:,
12161          MOVEI T,'DSK   ;CREF GOES TO DSK.
12162         MOVSM T,DNAM    ;ELSE DEFAULT DEV FOR CREF IS BIN'S DEV.
12163 IFN DECSW,MOVSI T,'CRF
12164 IFN ITSSW,MOVE T,[SIXBIT/CREF/]
12165         MOVEM T,FNAM2   ;DEFAULT THE CREF FILE'S NAMES.
12166         TRNE FF,FRARRO
12167          MOVEI A,"_
12168         CAIN A,"_
12169          JRST CMD2      ;RAN OUT OF OUTPUT SPECS => JUST USE DEFAULTS.
12170         CALL RFD        ;READ CREF FILE SPEC.
12171 IFN CREFSW,[
12172         TRNN FF,FRNNUL  ;IF SPEC NOT NULL OR ENDED BY _,
12173         CAIN A,"_
12174          SETOM CREFP    ;WE MUST WANT TO CREF.
12175 CMD2:   MOVE T,[DNAM,,CRFDEV]
12176         BLT T,CRFSNM
12177 ]IFE CREFSW,CMD2:
12178         MOVSI T,'ERR    ;DEFAULT THE ERROR OUTPUT FILE'S NNAMES.
12179         MOVEM T,FNAM2
12180         CAIN A,"_
12181          JRST CMD6      ;NO MORE OUTPUT SPECS.
12182         CALL RFD        ;READ ERROR FILE SPPEC.
12183 IFN ERRSW,[
12184         TRNN FF,FRNNUL  ;NONNULL SPEC OR LAST SPEC =>
12185         CAIN A,"_
12186          SETOM ERRFP    ;MUST WAANT ANN ERROR FILE.
12187 CMD6:   MOVE T,[DNAM,,ERRDEV]
12188         BLT T,ERRDEV+3
12189 ]
12190 IFE ERRSW,CMD6:
12191 IFN LISTSW,[
12192 IFN DECSW,MOVSI T,'LST
12193 IFN ITSSW,MOVE T,[SIXBIT/LIST/]
12194         MOVEM T,FNAM2   ;DEFAULT LST FILE FN2.
12195         CAIN A,"_       ;ANY OUTPUT SPEC REMAINING?
12196          JRST CMD3
12197         CALL RFD        ;YES, READ ONE.
12198         SETOM LISTP     ;LIST SPEC GIVEN IMPLIES WANT LISTING.
12199 CMD3:   MOVE T,[DNAM,,LSTDEV]
12200         BLT T,LSTSNM
12201 ] ;END IFN LISTSW,
12202 CMD5:   CAIN A,"_
12203          JRST CMD4
12204         CALL RFD        ;IGNORE ANY OUTPUT SPECS NOT NEEDED.
12205         JRST CMD5
12206
12207 CMD4:   MOVSI T,'DSK    ;DEFAULT THE INPUT NAMES.
12208         MOVS A,DNAM
12209         CAIE A,'PTP     ;DON'T LEAVE DEV NAME SET TO COMMON OUTPUT-ONLY DEVS.
12210          CAIN A,'NUL
12211           MOVEM T,DNAM
12212 IFN DECSW,MOVSI T,'MID
12213 IFN ITSSW,MOVSI T,'>_14
12214         MOVEM T,FNAM2
12215         MOVE T,[SIXBIT/PROG/]
12216         SKIPN FNAM1     ;THE FN1 ALONE IS STICKY ACROSS THE _.
12217         MOVEM T,FNAM1
12218         TRO FF,FRARRO   ;IF ONLY 1 NAME IT SHOULD BE FNAM1.
12219         CALL RFD        ;READ INPUT SPEC.
12220         MOVE T,[DNAM,,IFDS]
12221         BLT T,IFDS+3
12222         MOVE T,FNAM1    ;DEFAULT OUTPUT FN1'S TO INPUT.
12223         SKIPN ONAM+1
12224         MOVEM T,ONAM+1
12225 IFN CREFSW,[
12226         SKIPN CRFDEV+1
12227          MOVEM T,CRFDEV+1
12228 ]
12229 IFN LISTSW,[
12230         SKIPN LSTDEV+1
12231          MOVEM T,LSTDEV+1
12232 ]
12233 IFN ERRSW,[SKIPN ERRDEV+1
12234         MOVEM T,ERRDEV+1
12235 ]
12236         MOVSI A,'NUL    ;THE OUTPUT DEV DEFAULTS TO NUL:
12237         MOVS T,DNAM     ;IF THE INPUT IS FROM TTY:
12238         CAIN T,'TTY
12239         TRNE F,FRNNUL   ;AND THE BIN SPEC WAS NULL.
12240          CAIA
12241         MOVEM A,ONAM
12242         TRZ FF,FRARRO   ;DON'T LOUSE UP .INSRT'S READING.
12243         RET
12244 \f
12245 IFN CREFSW,[
12246
12247 CRFOUT: SOSGE CRFCNT
12248         JRST CRFOU1     ;NO ROOM, OUTPUT AND INIT BUFFER.
12249         IDPB A,CRFPTR
12250         POPJ P,
12251
12252 CRFOU1: SAVE C
12253         MOVE C,[0 CREFC,CRFHDR]
12254         CALL OBUFO
12255         REST C
12256         JRST CRFOUT
12257
12258 CRFSSF: SKIPA A,[1]     ;OUTPUT SET-SOURCE-FILE BLOCK.
12259 CRFPSH: MOVEI A,3       ;OUTPUT PUSH-SOURCE-FILE BLOCK.
12260 REPEAT 4,[ CALL CRFOUT
12261         MOVE A,INFDEV+.RPCNT
12262 ]
12263         JRST CRFOUT
12264 ]
12265
12266 IFN LISTSW,[
12267                 ;PRINTING ROUTINES
12268
12269 ;L SWITCH TYPED IN DURING COMMAND, SET UP FOR LISTING
12270 CMDLST: SETOM LISTP     ;SAY WANT LISTING.
12271         AOS LISTP1      ;(STARTS AS -1, WILL BE POS. AFTER 2ND (L))
12272         RET
12273
12274 ;PRINT CHARACTER IN A
12275 PILPT:  SOSGE LSTCNT
12276          JRST PILPT1
12277         IDPB A,LSTPTR
12278         RET
12279
12280 PILPT1: SAVE C
12281         MOVE C,[0 LPTC,LSTHDR]
12282         CALL OBUFO
12283         REST C
12284         JRST PILPT
12285
12286 LPTCLS==CPOPJ
12287 ] ;END IFN LISTSW,
12288 \f;GET ANOTHER K OF MACTAB SPACE.
12289
12290 CORRQB: IFN ITSSW,.VALUE                ;LOOP POINT FOR DON'T PROCEED
12291 IFN DECSW,EXIT 1,
12292         TLZ AA,400000
12293 CORRQA: POP P,D
12294         POP P,C
12295         MOVE A,(P)      ;RESTORE A FROM PDL
12296         JRST CORRQ1
12297
12298 GCCORQ: MOVE A,MACHI
12299         LSH A,-2        ;CONVERT TO WORD #
12300         CAIL A,MXMACL   ;WANT MORE THAN ALLOWED?
12301          POPJ P,
12302         MOVE A,MACTND   ;NO, GET ADDR OF BLOCK WE WANT TO GET.
12303         PUSH P,A        ;ENTRY, SAVE A IN CASE HAVE TO TRY AGAIN
12304 CORRQ1:IFN ITSSW,[
12305         HRLI A,10001    ;(CODE FOR FRESH PAGE, _1)
12306         LSH A,-1
12307         .CBLK A,        ;TRY GETTING BLOCK
12308 ]
12309 IFN DECSW,[
12310         IORI A,1777
12311         CORE A,
12312 ]
12313         JRST CORRQL     ;LOSE
12314         REST A
12315         ADDI A,2000
12316         JRST MACIN2     ;UPDATE POINTERS TO END OF MACTAB.
12317
12318 CORRQL: PUSH P,C
12319         PUSH P,D
12320         TLOE AA,400000
12321         JRST CORQL1
12322         TYPR [ASCIZ /
12323 No core for macro table./]
12324 CORQL1: TYPR [ASCIZ /
12325 Try again?   /]
12326 CORQL2: PUSHJ P,TYI     ;GET CHAR
12327         TRZ A," 
12328         CAIN A,"Y       ;Y,
12329         JRST CORRQA     ;=> TRY AGAIN
12330         CAIN A,"N       ;N,
12331         JRST CORRQB     ;=> BACK TO DDT THEN TRY AGAIN
12332         CAIN A,"?       ;?,
12333         ERJ CORQL1      ;=> TYPE OUT ERROR-TYPE BLURB
12334         TYPR [ASCIZ /?   /]     ;SOMETHING ELSE
12335         JRST CORQL2
12336
12337 ]               ;END TS CONDITIONAL
12338 \f
12339 FEED1:  SKIPA B,[40]
12340 FEED:   MOVEI B,5
12341         JRST TFEED
12342
12343 VBLK
12344
12345 IFG PURESW-DECSW,[      ;PURIFICATION ROUTINE
12346
12347 PURIFG: -1              ;-1 IF NOT (YET) PURIFIED
12348 ]
12349         VARIAB
12350 VPAT:
12351 VPATCH: BLOCK 20
12352 VPATCE=.-1
12353
12354 PBLK
12355
12356 CONSTANTS
12357
12358 PAT:
12359 PATCH:  BLOCK 100
12360 PATCHE: -1
12361
12362 IFG PURESW-DECSW,[LOC <.+1777>&-2000    ;SKIP TO NEXT PAGE
12363         MAXPUR==./2000  ;FIRST PAGE ABOVE PURE PAGES
12364 PRINTA Pure pages = ,\MAXPUR-MINPUR
12365 ]
12366
12367 VBLK
12368 PDL:    BLOCK LPDL+1
12369
12370 IFN DECDBG, DECDBB:     BLOCK 8000.     ;SPACE FOR DEC DDT'S SYMS.
12371
12372 .NSTGW
12373 BBKCOD==.       ;BEGIN BLANK CODING, CLEARED OUT DURING INITIALIZATION
12374 IFG PURESW-DECSW,MINBNK==<.+1777>/2000  ;FIRST PAGE OF BLANK CODE
12375 BNKBLK          ;DUMP OUT ACCUMULATED BLANK CODING
12376
12377                 ;NOW MORE BLANK CODING
12378
12379 BKBUF:  BLOCK BSIZE+5   ;CURRENT BLOCK TO OUTPUT
12380 GLOTB:  BLOCK 20        ;GLOBAL TABLE, EACH ENTRY FLAGS,,ADR OF SQUOZE (SEE COMMENTS NEAR BEGINNING)
12381 STRSTO: BLOCK STRL      ;STRING STORAGE FOR GSYL AND FRIENDS
12382 IFN FASLP,[
12383 FASB:   BLOCK FASBL     ;OUTPUT BUFFER FOR FASL MODE
12384                         ;FIRST WD 9 FOUR BIT CODE GROUPS, REST ASSOC STUFF
12385 FASAT:  BLOCK FASATL    ;ATOM TABLE FOR FASL MODE
12386                         ;EACH ENTRY CONSISTS OF ATOM IN FORMAT DESIRED BY FASLOAD,
12387                         ;NAMELY:
12388                         ;  HEADER WD. RH LENGTH IN WDS
12389                         ;  4.8-4.7 TYPE 0-PN 1 FIX 2 FLO 3 BIG (NOT IMPLEMENTED)
12390                         ;  FOLLOWED BY PN OR VALUE
12391                         ;-EXCEPT-  IF RH OF HEADER =0, THIS SLOT RESERVED FOR LIST
12392
12393 ]
12394
12395 EBKCOD==.               ;END BLANK CODING
12396 .YSTGW
12397
12398 PRINTA ST = ,\.-RL0
12399
12400 ST:     ;SYMBOL TABLE 3 WORDS/SYM FIRST SQUOZE, SECOND "VALUE", 3RD FLAGS,,BLOCK.
12401         BLOCK NRMWPS*SYMDSZ
12402
12403 ;LITERALS TABLES - CAN MOVE AND GROW. THESE TAGS & LENGTHS ARE JUST THE DEFAULTS
12404 .SEE CONTBA ;ETC, WHICH CONTAIN THE ACTUAL ADDRESSES.           SO DON'T USE THEM!
12405 CONTAB: BLOCK LCONTB    ;CONSTANTS TABLE, VALUES OF CONSTANTS THIS CONSTANTS AREA
12406 CONGLO: BLOCK LCNGLO    ;CONSTANTS GLOBAL TABLE, EACH ENTRY TWO WORDS
12407         ;FIRST WD GLOTB ENTRY.  SECOND WD ADR IN CONTAB OF CONSTANT TO WHICH IT REFERS
12408 CONBIT: BLOCK LCONTB/12.+1      ;RELOCATION BITS AND ILNOPT BIT(SEE CPTMK)
12409                                 ;3 BITS FOR EACH WORD OF CONTAB.
12410 \f
12411 ;;INIT          ;INITIALIZATION ROUTINES (IN MACRO TABLE, GET WIPED OUT)
12412 IFN ITSSW,MINMAC==./2000        ;# OF 1ST PAGE HOLDING PART OF MACTAB.
12413 ;NOTE THAT THIS CODE IS COPIED UPWARD WHEN MACTAB IS MOVED
12414 ;DUE TO SYMTAB EXPANSION. THEREFOR IT MUST REFER TO ITSELF
12415 ;INDEXED BY THE OFFSET OF WHERE IT IS FROM WHERE IT WAS ASSEMBLED.
12416 ;THAT IS KEPT IN CH1. ALL LITERALS MUST BE USED INDEX OF CH1, TOO.
12417
12418 ;MAC PROC TABLES
12419 MACTBA: 773767750000    ;MACRO CHARACTER STORAGE (FIRST WORD 3 375'S)
12420 INIT1:  MOVE CH1,MACTAD ;GET ADDR THIS COODE REALLY STARTS AT.
12421         SUBI CH1,MACTBA ;GET OFFSET FROM WHERE ASSEMBLED.
12422         SETZM BBKCOD
12423         MOVE A,[BBKCOD,,BBKCOD+1](CH1)
12424         BLT A,EBKCOD-1  ;CLEAR OUT BLANK CODING
12425         PUSH P,[SP4](CH1)       ;NOW INIT THE SYMTAB & FINISHED.
12426
12427 ;INITIALIZE THE SYMTAB, EXPECT SIZE IN SYMLEN.
12428 INITS:  MOVE AA,SYMLEN  ;SET UP THE OTHER VARS
12429         IMUL AA,WPSTE   ;DEALING WITH SYMTAB SIZE.
12430         MOVEM AA,SYMSIZ
12431         ADDI AA,ST      ;ADDR OF START OF CONTAB.
12432         MOVEM AA,CONTBA
12433         MOVEM AA,PLIM
12434         ADD AA,CONLEN   ;ADD LENGTH OF CONTAB TO GET ADDR OF CONGLO TAB.
12435         MOVEM AA,CONTBE ;WHICH IS ALSO THE END OF CONTAB.
12436         MOVEM AA,CONGLA
12437         MOVEM AA,CONGOL
12438         MOVE A,CONLEN   ;ADD IN LENGTH OF CONGLO (1/4 OF CONLEN)
12439         LSH A,-2
12440         ADD AA,A
12441         MOVEM AA,CONGLE ;TO GET END OF CONGLO, AND START OF CONBIT TABLE.
12442         MOVEM AA,CONBIA
12443         MOVE A,CONLEN
12444         ADDI A,11.
12445         IDIVI A,12.
12446         ADD AA,A        ;ADD LENGTH OF CONBIT (1/12 OF CONLEN) GETTING ADDR OF MACTAB.
12447 IFN DECSW,[
12448         SAVE AA
12449         ADDI AA,MACL-1
12450         IORI AA,1777    ;FIX ALLOCATION PROBLEMS ON KI-10
12451         CORE AA,
12452          ETF [ASCIZ /No core for symbols/](CH1)
12453         REST AA
12454 ]
12455         MOVN A,SYMLEN
12456         HRLZM A,SYMAOB  ;AOBJN -> SYMTAB.
12457         MOVE A,WPSTE
12458         SUBI A,1
12459         MOVEM A,WPSTE1
12460         MOVN A,WPSTE
12461         HRRM A,WPSTEB
12462         CAMG AA,MACTAD  ;MOVED MACTAB UP?
12463          JRST INITS1(CH1)
12464 IFN ITSSW,[             ;YES, GET CORE FOR INCREASE.
12465         SAVE AA
12466         MOVEI AA,MACL+1777(AA)
12467         LSH AA,-10.     ;1ST PAGE NOT NEEDED BY MACTAB.
12468         MOVEI A,MACL+1777+MACTBA(CH1)
12469         LSH A,-10.      ;1ST PAGE MACTAB DOESN'T YET HAVE.
12470         SUBM A,AA       ;# PAGES NEEDED.
12471         HRLZI AA,(AA)
12472         HRRI AA,(A)     ;-<# PAGES>,,<1ST NEEDED>
12473         JUMPGE AA,.+3(CH1)      ;DON'T CALL IF NEED 0 PAGES, WOULD GET ONE.
12474         .CALL INITSB(CH1)
12475          .VALUE
12476         REST AA
12477 ]
12478         SUBM AA,MACTAD  ;MACTAD _ SHIFT IN START OF MACTAB.
12479         EXCH AA,MACTAD  ;MACTAD GETS NEW START, AA HAS SHIFT.
12480         MOVSI A,PTAB-CCOMPB
12481         ADDM AA,PTAB(A) ;RELOCATE BYTE-PTRS INTO MACTAB.
12482         AOBJN A,.-1(CH1)
12483         MOVNI B,INITS2(CH1)
12484         HRROI A,@EISYMP(CH1)
12485         ADDI B,1(A)     ;GET # WDS IN SECOND HALF OF INIT CODE.
12486         HRRM AA,.+1(CH1)        ;COPY 2ND HALF UPWARD WITH POP-LOOP.
12487         POP A,(A)       ;THIS INSN IMPURE.
12488         SOJG B,.-1(CH1)
12489         ADDI CH1,(AA)   ;CHANGE OFFSET TO PT. TO NEW LOCATIONN OF INIT CODE.
12490         JRST INITS2(CH1)        ;JUMP INTO 2ND HALF, WHERE IT'S BEEN COPIED TO.
12491 INITS2: HRROI A,INITS2-1(CH1)   ;THEN COPY 1ST HALF (WHICH ENNDS BEFORE INITS2)
12492         SUBI A,(AA)             ;GET WHERE NOW ENDS, NOT WHERE WILL END.
12493         MOVEI B,INITS2-MACTBA   ;UP UNDERNEATH THE 2ND HALF.
12494         HRRM AA,.+1(CH1)        ;(THIS TWO-STEP COPYING HANDLES ALL OVERLAPS)
12495         POP A,(A)
12496         SOJG B,.-1(CH1)
12497 INITS1: MOVE AA,SYMSIZ
12498         SETZM ST
12499         MOVE A,[ST,,ST+1](CH1)
12500         BLT A,ST-1(AA)  ;CLEAR OUT SYMBOL TABLE
12501         SETZM ESBK      ;DEFINE THEM IN OUTER BLOCK.
12502         MOVEI AA,ISYMTB(CH1)
12503         MOVS F,ISMTBB(CH1)      ;GET SWAPPED VALUE OF FIRST INSTRUCTION
12504 SP3:    CAIL AA,EISYM1(CH1)
12505         JRST SP1(CH1)   ;DONE WITH INSTRUCTIONS
12506         MOVE SYM,(AA)
12507         JUMPE SYM,SP2(CH1)
12508         TLZ SYM,740000
12509         PUSHJ P,ES      ;WON'T SKIP
12510         HRLZI T,SYMC
12511         HRLZ B,F
12512         MOVSI C,3KILL
12513         PUSH P,CH1
12514         PUSHJ P,VSM2
12515         POP P,CH1
12516 SP2:    ADDI F,1000
12517         AOJA AA,SP3(CH1)
12518 EISYMP:         ;MAY BE MUNGED
12519 SP1:    CAIL AA,EISYMT(CH1)
12520         POPJ P,
12521         MOVE SYM,(AA)
12522         LDB T,[400400,,SYM](CH1)
12523         ROT T,-4
12524         TLZ SYM,740000
12525         PUSHJ P,ES
12526         MOVE B,1(AA)
12527         MOVSI C,3KILL
12528         CAME T,[GLOETY,,](CH1)  ;GLOBAL ENTRIES REALLY EXITS, HACKED TO DEFEAT ADDRESS LINKING
12529         CAMN T,[GLOEXT,,](CH1)
12530         TLO C,3LLV
12531         PUSH P,CH1
12532         PUSHJ P,VSM2
12533         POP P,CH1
12534         AOS AA
12535         AOJA AA,SP1(CH1)
12536 \f
12537 IFN ITSSW,[
12538 INITSB: SETZ ? 'CORBLK
12539         1000,,600000    ;BOTH READ AND WRITE.
12540         1000,,-1 ? AA   ;INTO SELF, AA IS AOBJN -> PAGES.
12541         SETZI 400001    ;FRESH PAGES.
12542
12543         ;GOBBLE SYMS FROM SYSTEM
12544         ;TABLE AREA IN SYSTEM:
12545         ;FIRST LOC SYSYMB
12546         ;LAST (AS OPPOSED TO LAST + 1) SYSYME
12547
12548 TSYMGT: MOVE AA,[MXICLR-MXIMAC,,MXICLR]
12549         .CALL INITSB    ;GET MACTAB PAGES NNOT LOADED INTO.
12550          .VALUE
12551 IFN PURESW,[
12552         MOVE AA,[MINBNK-MINMAC,,MINBNK]
12553         .CALL INITSB    ;GET PAGES FOR BLANK CODE & SYMTAB.
12554          .VALUE
12555         SKIPN PURIFG
12556          JRST TSYMG3
12557         JSP F,PURIFD    ;NOT PURIFIED => FLUSH PAGES
12558          MINPUR-MXIMAC  ;OF MACTAB CREATED BY LOADING BUT NOT NEEDED.
12559          MXIMAC*1001
12560 TSYMG3:
12561 ]
12562         MOVEI A,EISYMT  ;EISYMT FIRST LOC FOR ITS SYMS
12563         MOVE B,[SIXBIT /CALLS/] ;SYSTEM CALLS
12564         .GETSYS A,      ;READ IN SYSTEM CALLS (SHOULD SKIP)
12565         .VALUE
12566         SKIPGE A
12567         .VALUE          ;.GETSYS DIDN'T UPDATE AOBJN POINTER
12568         HRRM A,SP1      ;MARK END OF SYMS
12569         ANDI A,-1
12570         CAIL A,MACTBA+MACL
12571          .VALUE         ;MACL TOO SMALL!  INITS MIGHT LOSE.
12572         MOVEI B,EISYMT
12573         MOVEI AA,SYMC_<-18.+4>  ;SQUOZE FLAG FOR SYM
12574 TSYMG2: DPB AA,[400400,,(B)]
12575         ADDI B,2
12576         CAIE B,(A)
12577         JRST TSYMG2
12578         POPJ P,
12579 \f
12580 IFN PURESW,[    ;HERE ARE THE GUTS OF THE PURIFY ROUTINE
12581
12582 PURIFY: SKIPL NVRRUN
12583          .VALUE [ASCIZ /:\eAlready run\e
12584 /]
12585 PURIF1: MOVEI P,17      ;START PDL AT 20
12586         JSP F,PURIFD    ;CALL .CBLK ROUTINE
12587          MINMAC-MINBNK  ;FLUSH BLANK CODE PAGES (INCL. SYM TAB)
12588          MINBNK*1001
12589          MINPUR-MXICLR  ;FLUSH MACTAB PAGES CREATED BY LOAD BUT NOT NNEEDED.
12590          MXICLR*1001
12591          MAXPUR-MINPUR  ;PURIFY PURE PAGES.
12592          400000+MINPUR*1001
12593         SETZM PURIFG    ;SET "PURIFIED" FLAG
12594         MOVE [1,,2]     ;NOW CLEAR OUT REMAINS OF DATA OF SELF
12595         MOVEI 1,0
12596         BLT 40
12597         .VALUE [ASCIZ /:\ePurified\epdump\17 SYS;TS MIDAS\16\e/]
12598
12599 GAPFLS: JSP F,PURIFD    ;FLUSH GAP PAGES CREATED ON INITIAL LOAD.
12600          MINPUR-MXIMAC
12601          MXIMAC*1001
12602         .BREAK 16,300000
12603
12604                 ;JSP F,PURIFD   ;DO A SEQUENCE OF .CBLKS
12605                 ;FOLLOW WITH AN ARBITRARY NUMBER OF PAIRS OF ARGUMENTS
12606                 ;FIRST ARG OF PAIR # PAGES TO PROCESS, MAY BE ZERO
12607                 ;SECOND INITIAL .CBLK AC CONTENTS
12608
12609 PURIFD: MOVE C,(F)      ;GET COUNT
12610         TLNE C,777000   ;CHECK INSTRUCTION PART
12611         JRST (F)        ;INSTRUCTION => RETURN TO IT
12612         JUMPE C,PURID2  ;JUMP IF NO PAGES IN COUNT
12613         MOVE A,1(F)     ;GET INITIAL .CBLK ARG
12614 PURID1: .CBLK A,
12615         .VALUE
12616         ADDI A,1001     ;INCREMENT .CBLK ARG TO NEXT PAGE
12617         SOJG C,PURID1   ;DO IT THE APPROPRIATE NUMBER OF TIMES
12618 PURID2: ADDI F,2
12619         JRST PURIFD
12620
12621 ]               ;END PURESW CONDITIONAL
12622 ]               ;END ITSSW, CONDITIONAL
12623
12624 IFN DECDBG,[
12625 DECDBM: 0
12626 IFE SAILSW,HRLZ A,.JBSYM        ;GET ADDR OF START OF DDT SYMS,
12627 .ELSE HRLZ A,JOBSYM
12628         HRRI A,DECDBB+200       ;LEAVE 200 WD SPACE BEFORE THEM.
12629 IFE SAILSW,[HRRM A,.JBSYM               ;MOVE THEM INTO SPACE PROVIDED
12630         HLRE B,.JBSYM]
12631 .ELSE [HRRM A,JOBSYM
12632         HLRE B,JOBSYM]
12633         MOVMS B
12634         BLT A,DECDBB+177(B)     ;SO THEY WON'T GET IN MACTAB'S WAY.
12635         JRST @DECDBM
12636 ]
12637
12638 CONSTANTS
12639 \f
12640 ;;ISYMS         ;INITIAL SYMBOL TABLE
12641
12642 ADJSP=105_33    ;ALLOW FOR BOOTSTRAP, EVENTUALLY FLUSH, MAYBE
12643
12644 ISMTBB: ADJSP   ;FIRST OP. CODE IN ISYMTB
12645
12646 ISYMTB:
12647
12648 SQUOZE 10,ADJSP
12649         0
12650         0
12651 SQUOZE 10,DFAD
12652 SQUOZE 10,DFSB
12653 SQUOZE 10,DFMP
12654 SQUOZE 10,DFDV
12655 SQUOZE 10,DADD
12656 SQUOZE 10,DSUB
12657 SQUOZE 10,DMUL
12658 SQUOZE 10,DDIV
12659 SQUOZE 10,DMOVE
12660 SQUOZE 10,DMOVN
12661 SQUOZE 10,FIX
12662 SQUOZE 10,EXTEND
12663 SQUOZE 10,DMOVEM
12664 SQUOZE 10,DMOVNM
12665 SQUOZE 10,FIXR
12666 SQUOZE 10,FLTR
12667 SQUOZE 10,UFA
12668 SQUOZE 10,DFN
12669 SQUOZE 10,FSC
12670 SQUOZE 10,IBP
12671 SQUOZE 10,ILDB
12672 SQUOZE 10,LDB
12673 SQUOZE 10,IDPB
12674 SQUOZE 10,DPB
12675 SQUOZE 10,FAD
12676 SQUOZE 10,FADL
12677 SQUOZE 10,FADM
12678 SQUOZE 10,FADB
12679 SQUOZE 10,FADR
12680 SQUOZE 10,FADRL
12681 SQUOZE 10,FADRM
12682 SQUOZE 10,FADRB
12683 SQUOZE 10,FSB
12684 SQUOZE 10,FSBL
12685 SQUOZE 10,FSBM
12686 SQUOZE 10,FSBB
12687 SQUOZE 10,FSBR
12688 SQUOZE 10,FSBRL
12689 SQUOZE 10,FSBRM
12690 SQUOZE 10,FSBRB
12691 SQUOZE 10,FMP
12692 SQUOZE 10,FMPL
12693 SQUOZE 10,FMPM
12694 SQUOZE 10,FMPB
12695 SQUOZE 10,FMPR
12696 \fSQUOZE 10,FMPRL
12697 SQUOZE 10,FMPRM
12698 SQUOZE 10,FMPRB
12699 SQUOZE 10,FDV
12700 SQUOZE 10,FDVL
12701 SQUOZE 10,FDVM
12702 SQUOZE 10,FDVB
12703 SQUOZE 10,FDVR
12704 SQUOZE 10,FDVRL
12705 SQUOZE 10,FDVRM
12706 SQUOZE 10,FDVRB
12707 SQUOZE 10,MOVE
12708 SQUOZE 10,MOVEI
12709 SQUOZE 10,MOVEM
12710 SQUOZE 10,MOVES
12711 SQUOZE 10,MOVS
12712 SQUOZE 10,MOVSI
12713 SQUOZE 10,MOVSM
12714 SQUOZE 10,MOVSS
12715 SQUOZE 10,MOVN
12716 SQUOZE 10,MOVNI
12717 SQUOZE 10,MOVNM
12718 SQUOZE 10,MOVNS
12719 SQUOZE 10,MOVM
12720 SQUOZE 10,MOVMI
12721 SQUOZE 10,MOVMM
12722 SQUOZE 10,MOVMS
12723
12724 SQUOZE 10,IMUL
12725 SQUOZE 10,IMULI
12726 SQUOZE 10,IMULM
12727 SQUOZE 10,IMULB
12728 SQUOZE 10,MUL
12729 SQUOZE 10,MULI
12730 SQUOZE 10,MULM
12731 SQUOZE 10,MULB
12732 SQUOZE 10,IDIV
12733 SQUOZE 10,IDIVI
12734 SQUOZE 10,IDIVM
12735 SQUOZE 10,IDIVB
12736 SQUOZE 10,DIV
12737 SQUOZE 10,DIVI
12738 SQUOZE 10,DIVM
12739 SQUOZE 10,DIVB
12740 SQUOZE 10,ASH
12741 SQUOZE 10,ROT
12742 SQUOZE 10,LSH
12743 SQUOZE 10,JFFO  ;PDP10 INSTRUCTION
12744 SQUOZE 10,ASHC
12745 SQUOZE 10,ROTC
12746 SQUOZE 10,LSHC
12747 SQUOZE 10,CIRC  ;CIRCULATE: ROTC WITH AC+1 GOING THE WRONG WAY
12748 SQUOZE 10,EXCH
12749 SQUOZE 10,BLT
12750 SQUOZE 10,AOBJP
12751 SQUOZE 10,AOBJN
12752 SQUOZE 10,JRST
12753 SQUOZE 10,JFCL
12754 SQUOZE 10,XCT
12755 0
12756 \fSQUOZE 10,PUSHJ
12757 SQUOZE 10,PUSH
12758 SQUOZE 10,POP
12759 SQUOZE 10,POPJ
12760 SQUOZE 10,JSR
12761 SQUOZE 10,JSP
12762 SQUOZE 10,JSA
12763 SQUOZE 10,JRA
12764 SQUOZE 10,ADD
12765 SQUOZE 10,ADDI
12766 SQUOZE 10,ADDM
12767 SQUOZE 10,ADDB
12768 SQUOZE 10,SUB
12769 SQUOZE 10,SUBI
12770 SQUOZE 10,SUBM
12771 SQUOZE 10,SUBB
12772 SQUOZE 10,CAI
12773 SQUOZE 10,CAIL
12774 SQUOZE 10,CAIE
12775 SQUOZE 10,CAILE
12776 SQUOZE 10,CAIA
12777 SQUOZE 10,CAIGE
12778 SQUOZE 10,CAIN
12779 SQUOZE 10,CAIG
12780
12781 SQUOZE 10,CAM
12782 SQUOZE 10,CAML
12783 SQUOZE 10,CAME
12784 SQUOZE 10,CAMLE
12785 SQUOZE 10,CAMA
12786 SQUOZE 10,CAMGE
12787 SQUOZE 10,CAMN
12788 SQUOZE 10,CAMG
12789 SQUOZE 10,JUMP
12790 SQUOZE 10,JUMPL
12791 SQUOZE 10,JUMPE
12792 SQUOZE 10,JUMPLE
12793 SQUOZE 10,JUMPA
12794 SQUOZE 10,JUMPGE
12795 SQUOZE 10,JUMPN
12796 SQUOZE 10,JUMPG
12797 SQUOZE 10,SKIP
12798 SQUOZE 10,SKIPL
12799 SQUOZE 10,SKIPE
12800 SQUOZE 10,SKIPLE
12801 SQUOZE 10,SKIPA
12802 SQUOZE 10,SKIPGE
12803 SQUOZE 10,SKIPN
12804 SQUOZE 10,SKIPG
12805 SQUOZE 10,AOJ
12806 SQUOZE 10,AOJL
12807 SQUOZE 10,AOJE
12808 SQUOZE 10,AOJLE
12809 SQUOZE 10,AOJA
12810 SQUOZE 10,AOJGE
12811 SQUOZE 10,AOJN
12812 SQUOZE 10,AOJG
12813 SQUOZE 10,AOS
12814 SQUOZE 10,AOSL
12815 SQUOZE 10,AOSE
12816 \fSQUOZE 10,AOSLE
12817 SQUOZE 10,AOSA
12818 SQUOZE 10,AOSGE
12819 SQUOZE 10,AOSN
12820 SQUOZE 10,AOSG
12821 SQUOZE 10,SOJ
12822 SQUOZE 10,SOJL
12823 SQUOZE 10,SOJE
12824 SQUOZE 10,SOJLE
12825 SQUOZE 10,SOJA
12826 SQUOZE 10,SOJGE
12827 SQUOZE 10,SOJN
12828 SQUOZE 10,SOJG
12829 SQUOZE 10,SOS
12830 SQUOZE 10,SOSL
12831 SQUOZE 10,SOSE
12832 SQUOZE 10,SOSLE
12833 SQUOZE 10,SOSA
12834 SQUOZE 10,SOSGE
12835 SQUOZE 10,SOSN
12836 SQUOZE 10,SOSG
12837
12838 SQUOZE 10,SETZ
12839 SQUOZE 10,SETZI
12840 SQUOZE 10,SETZM
12841 SQUOZE 10,SETZB
12842 SQUOZE 10,AND
12843 SQUOZE 10,ANDI
12844 SQUOZE 10,ANDM
12845 SQUOZE 10,ANDB
12846 SQUOZE 10,ANDCA
12847 SQUOZE 10,ANDCAI
12848 SQUOZE 10,ANDCAM
12849 SQUOZE 10,ANDCAB
12850 SQUOZE 10,SETM
12851 SQUOZE 10,SETMI
12852 SQUOZE 10,SETMM
12853 SQUOZE 10,SETMB
12854 SQUOZE 10,ANDCM
12855 SQUOZE 10,ANDCMI
12856 SQUOZE 10,ANDCMM
12857 SQUOZE 10,ANDCMB
12858 SQUOZE 10,SETA
12859 SQUOZE 10,SETAI
12860 SQUOZE 10,SETAM
12861 SQUOZE 10,SETAB
12862 SQUOZE 10,XOR
12863 SQUOZE 10,XORI
12864 SQUOZE 10,XORM
12865 SQUOZE 10,XORB
12866 SQUOZE 10,IOR
12867 SQUOZE 10,IORI
12868 SQUOZE 10,IORM
12869 SQUOZE 10,IORB
12870 SQUOZE 10,ANDCB
12871 SQUOZE 10,ANDCBI
12872 SQUOZE 10,ANDCBM
12873 SQUOZE 10,ANDCBB
12874 SQUOZE 10,EQV
12875 SQUOZE 10,EQVI
12876 \fSQUOZE 10,EQVM
12877 SQUOZE 10,EQVB
12878 SQUOZE 10,SETCA
12879 SQUOZE 10,SETCAI
12880 SQUOZE 10,SETCAM
12881 SQUOZE 10,SETCAB
12882 SQUOZE 10,ORCA
12883 SQUOZE 10,ORCAI
12884 SQUOZE 10,ORCAM
12885 SQUOZE 10,ORCAB
12886 SQUOZE 10,SETCM
12887 SQUOZE 10,SETCMI
12888 SQUOZE 10,SETCMM
12889 SQUOZE 10,SETCMB
12890
12891 SQUOZE 10,ORCM
12892 SQUOZE 10,ORCMI
12893 SQUOZE 10,ORCMM
12894 SQUOZE 10,ORCMB
12895 SQUOZE 10,ORCB
12896 SQUOZE 10,ORCBI
12897 SQUOZE 10,ORCBM
12898 SQUOZE 10,ORCBB
12899 SQUOZE 10,SETO
12900 SQUOZE 10,SETOI
12901 SQUOZE 10,SETOM
12902 SQUOZE 10,SETOB
12903 SQUOZE 10,HLL
12904 SQUOZE 10,HLLI
12905 SQUOZE 10,HLLM
12906 SQUOZE 10,HLLS
12907 SQUOZE 10,HRL
12908 SQUOZE 10,HRLI
12909 SQUOZE 10,HRLM
12910 SQUOZE 10,HRLS
12911 SQUOZE 10,HLLZ
12912 SQUOZE 10,HLLZI
12913 SQUOZE 10,HLLZM
12914 SQUOZE 10,HLLZS
12915 SQUOZE 10,HRLZ
12916 SQUOZE 10,HRLZI
12917 SQUOZE 10,HRLZM
12918 SQUOZE 10,HRLZS
12919 SQUOZE 10,HLLO
12920 SQUOZE 10,HLLOI
12921 SQUOZE 10,HLLOM
12922 SQUOZE 10,HLLOS
12923 SQUOZE 10,HRLO
12924 SQUOZE 10,HRLOI
12925 SQUOZE 10,HRLOM
12926 SQUOZE 10,HRLOS
12927 SQUOZE 10,HLLE
12928 SQUOZE 10,HLLEI
12929 SQUOZE 10,HLLEM
12930 SQUOZE 10,HLLES
12931 SQUOZE 10,HRLE
12932 SQUOZE 10,HRLEI
12933 SQUOZE 10,HRLEM
12934 SQUOZE 10,HRLES
12935 SQUOZE 10,HRR
12936 \fSQUOZE 10,HRRI
12937 SQUOZE 10,HRRM
12938 SQUOZE 10,HRRS
12939 SQUOZE 10,HLR
12940 SQUOZE 10,HLRI
12941 SQUOZE 10,HLRM
12942 SQUOZE 10,HLRS
12943
12944 SQUOZE 10,HRRZ
12945 SQUOZE 10,HRRZI
12946 SQUOZE 10,HRRZM
12947 SQUOZE 10,HRRZS
12948 SQUOZE 10,HLRZ
12949 SQUOZE 10,HLRZI
12950 SQUOZE 10,HLRZM
12951 SQUOZE 10,HLRZS
12952 SQUOZE 10,HRRO
12953 SQUOZE 10,HRROI
12954 SQUOZE 10,HRROM
12955 SQUOZE 10,HRROS
12956 SQUOZE 10,HLRO
12957 SQUOZE 10,HLROI
12958 SQUOZE 10,HLROM
12959 SQUOZE 10,HLROS
12960 SQUOZE 10,HRRE
12961 SQUOZE 10,HRREI
12962 SQUOZE 10,HRREM
12963 SQUOZE 10,HRRES
12964 SQUOZE 10,HLRE
12965 SQUOZE 10,HLREI
12966 SQUOZE 10,HLREM
12967 SQUOZE 10,HLRES
12968 SQUOZE 10,TRN
12969 SQUOZE 10,TLN
12970 SQUOZE 10,TRNE
12971 SQUOZE 10,TLNE
12972 SQUOZE 10,TRNA
12973 SQUOZE 10,TLNA
12974 SQUOZE 10,TRNN
12975 SQUOZE 10,TLNN
12976 SQUOZE 10,TDN
12977 SQUOZE 10,TSN
12978 SQUOZE 10,TDNE
12979 SQUOZE 10,TSNE
12980 SQUOZE 10,TDNA
12981 SQUOZE 10,TSNA
12982 SQUOZE 10,TDNN
12983 SQUOZE 10,TSNN
12984 SQUOZE 10,TRZ
12985 SQUOZE 10,TLZ
12986 SQUOZE 10,TRZE
12987 SQUOZE 10,TLZE
12988 SQUOZE 10,TRZA
12989 SQUOZE 10,TLZA
12990 SQUOZE 10,TRZN
12991 SQUOZE 10,TLZN
12992 SQUOZE 10,TDZ
12993 SQUOZE 10,TSZ
12994 SQUOZE 10,TDZE
12995 SQUOZE 10,TSZE
12996 \f
12997 SQUOZE 10,TDZA
12998 SQUOZE 10,TSZA
12999 SQUOZE 10,TDZN
13000 SQUOZE 10,TSZN
13001
13002 SQUOZE 10,TRC
13003 SQUOZE 10,TLC
13004 SQUOZE 10,TRCE
13005 SQUOZE 10,TLCE
13006 SQUOZE 10,TRCA
13007 SQUOZE 10,TLCA
13008 SQUOZE 10,TRCN
13009 SQUOZE 10,TLCN
13010 SQUOZE 10,TDC
13011 SQUOZE 10,TSC
13012 SQUOZE 10,TDCE
13013 SQUOZE 10,TSCE
13014 SQUOZE 10,TDCA
13015 SQUOZE 10,TSCA
13016 SQUOZE 10,TDCN
13017 SQUOZE 10,TSCN
13018 SQUOZE 10,TRO
13019 SQUOZE 10,TLO
13020 SQUOZE 10,TROE
13021 SQUOZE 10,TLOE
13022 SQUOZE 10,TROA
13023 SQUOZE 10,TLOA
13024 SQUOZE 10,TRON
13025 SQUOZE 10,TLON
13026 SQUOZE 10,TDO
13027 SQUOZE 10,TSO
13028 SQUOZE 10,TDOE
13029 SQUOZE 10,TSOE
13030 SQUOZE 10,TDOA
13031 SQUOZE 10,TSOA
13032 SQUOZE 10,TDON
13033 SQUOZE 10,TSON
13034
13035 EISYM1:
13036 SQUOZE 4,BLKI
13037 BLKI IOINST
13038 SQUOZE 4,DATAI
13039 DATAI IOINST
13040 SQUOZE 4,BLKO
13041 BLKO IOINST
13042 SQUOZE 4,DATAO
13043 DATAO IOINST
13044 SQUOZE 4,CONO
13045 CONO IOINST
13046 SQUOZE 4,CONI
13047 CONI IOINST
13048 SQUOZE 4,CONSZ
13049 CONSZ IOINST
13050 SQUOZE 4,CONSO
13051 CONSO IOINST
13052 \f
13053 SQUOZE 10,APR
13054 0
13055 SQUOZE 10,PI
13056 4
13057 SQUOZE 10,PTP
13058 100
13059 SQUOZE 10,PTR
13060 104
13061 SQUOZE 10,TTY
13062 120
13063 SQUOZE 10,LPT
13064 124
13065 SQUOZE 10,DIS
13066 130
13067 SQUOZE 10,DC
13068 200
13069 SQUOZE 10,UTC
13070 210
13071 SQUOZE 10,UTS
13072 214
13073
13074
13075 SQUOZE 10,LDBI  ;REALLY ILDB,
13076 LDBI
13077 SQUOZE 10,DPBI  ;AND IDPB
13078 DPBI
13079 SQUOZE 10,CLEAR
13080 CLEAR
13081 SQUOZE 10,CLEARI
13082 CLEARI
13083 SQUOZE 10,CLEARM
13084 CLEARM
13085 SQUOZE 10,CLEARB
13086 CLEARB
13087 SQUOZE 10,ADJBP
13088 IBP
13089 IRPS INST,,FAD FSB FMP FDV
13090 SQUOZE 10,INST!RI
13091 INST!RL
13092 TERMIN
13093 \f
13094 IFN DECSW\TNXSW,[
13095 IFE TNXSW,[
13096 DEFINE DECDF1 FOO/
13097 IRPS X,,FOO
13098 SQUOZE 10,X
13099 X
13100 .ISTOP TERMIN TERMIN
13101 ]
13102 IFN TNXSW,[;; RESET IS BOTH A JSYS AND A CALLI!!
13103 DEFINE DECDF1 FOO/
13104 IRPS X,,FOO
13105 IFSN X,RESET,[SQUOZE 10,X
13106 X]
13107 .ISTOP TERMIN TERMIN
13108 ]
13109 .DECUU DECDF1
13110 .DECTT DECDF1
13111 IFE SAILSW,.DECMT DECDF1
13112 .DECCL DECDF1
13113 IFN SAILSW,.DECMS DECDF1
13114 IFE SAILSW,.DEC.J DECDF1
13115 IFN SAILSW,.DECJB DECDF1
13116 .DECJH DECDF1
13117
13118 IFN TNXSW,[;; DEFINE JSYS'S ON TENEX VERSION
13119 DEFINE TNXDF1 FOO/
13120 IRPS X,,FOO
13121 SQUOZE 10,X
13122 X
13123 .ISTOP TERMIN TERMIN
13124 .TNXJS TNXDF1
13125 ]]
13126 SQUOZE 10,.OSMID
13127 OSMIDAS
13128 SQUOZEE 4,.SITE
13129 A.SITE
13130 SQUOZE 4,RIM10
13131 ARIM10,,SRIM
13132 SQUOZE 4,SBLK
13133 SBLKS,,SRIM
13134 SQUOZE 4,RIM
13135 ARIM,,SRIM
13136 SQUOZE 4,SQUOZE
13137 ASQOZ
13138 SQUOZE 4,.RSQZ
13139 -1,,ASQOZ
13140 SQUOZE 4,XWD
13141 AXWORD
13142 SQUOZE 4,CONSTA
13143 CNSTNT
13144 SQUOZE 4,ASCIC
13145 EOFCH,,AASCIZ
13146 SQUOZE 4,RADIX
13147 ARDIX
13148
13149 SQUOZE 4,END
13150 AEND
13151 SQUOZE 4,TITLE
13152 ATITLE
13153 SQUOZE 4,.BEGIN
13154 A.BEGIN
13155 SQUOZE 4,.END
13156 A.END
13157 SQUOZE 4,VARIAB
13158 AVARIAB
13159 SQUOZE 4,SIXBIT
13160 ASIXBIT
13161 SQUOZE 4,ASCII
13162 AASCII
13163 SQUOZE 4,ASCIZ
13164 AASCIZ
13165 SQUOZE 4,.ASCII
13166 A.ASCII
13167 SQUOZE 4,.ASCVL
13168 A.ASCV
13169 SQUOZE 4,BLOCK
13170 ABLOCK
13171 SQUOZE 4,LOC
13172 ALOC
13173 SQUOZE 4,OFFSET
13174 AOFFSET
13175 SQUOZE 4,.SBLK
13176 SIMBLK
13177 SQUOZE 4,RELOCA
13178 ARELOCA
13179 SQUOZE 4,1PASS
13180 A1PASS
13181 SQUOZE 4,.DECRE
13182 A.DECRE
13183 SQUOZE 4,.DECTX
13184 A.DCTX
13185 \f
13186 SQUOZE 4,.DECTW
13187 A.DECTW
13188 SQUOZE 4,NOSYMS
13189 ANOSYMS
13190 SQUOZE 4,EXPUNGE
13191 AEXPUNGE
13192 SQUOZE 4,EQUALS
13193 AEQUALS
13194 SQUOZE 4,NULL
13195 ANULL
13196 SQUOZE 4,SUBTTL
13197 ANULL
13198 SQUOZE 4,WORD
13199 AWORD
13200 SQUOZE 4,.SYMTAB
13201 A.SYMTAB
13202 SQUOZE 4,.SEE
13203 A.SEE
13204 SQUOZE 4,.AUXIL
13205 MACCR
13206 SQUOZE 4,.MRUNT
13207 A.MRUNT
13208 SQUOZE 4,.SYMCN
13209 A.SYMC
13210 SQUOZE 4,.TYPE
13211 A.TYPE
13212 SQUOZE 4,.FORMAT
13213 A.FORMAT
13214 SQUOZE 4,.OP
13215 A.OP
13216 SQUOZE 4,.AOP
13217 A.AOP
13218 SQUOZE 4,.RADIX
13219 A.RADIX
13220 SQUOZE 4,.FATAL
13221 A.FATAL
13222 SQUOZE 4,.BP
13223 A.BP
13224 SQUOZE 4,.BM
13225 A.BM
13226 SQUOZE 4,.LZ
13227 A.LZ
13228 SQUOZE 4,.TZ
13229 A.TZ
13230 SQUOZE 4,.DPB
13231 A.DPB
13232 SQUOZE 4,.LDB
13233 A.LDB
13234 SQUOZE 4,.1STWD
13235 A.1STWD
13236 SQUOZE 4,.NTHWD
13237 A.NTHWD
13238
13239 IRPS X,,[.BIND=0,.KILL=3KILL,.HKILL=3SKILL,.XCREF=3NCRF,.DOWN=3DOWN]
13240 IFE 1&.IRPCN, SQUOZE 4,X
13241 IFN 1&.IRPCN, X,,A.KILL
13242 TERMIN
13243
13244 SQUOZE 4,.LSTON
13245 A.LSTN
13246 SQUOZE 4,.LSTOF
13247 A.LSTF
13248
13249 IRPS X,,[.MLLIT=CONSML,.PASS=A.PASS,.PPASS=A.PPASS,.SUCCESS=A.SUCCESS
13250 .HKALL=HKALL,.STGSW=STGSW,.LITSW=LITSW,.AVAL1=AVAL1,.AVAL2=AVAL2
13251 .ASKIP=A.ASKIP,.CURLN=CLNN,.CURPG=CPGN,.QMTCH=QMTCH,.STPLN=A.STPLN,.STPPG=A.STPPG]
13252 IFE 1&.IRPCN, SQUOZE 4,X
13253 IFN 1&.IRPCN, X,,INTSYM
13254 TERMIN
13255 \f
13256         ;CONDITIONALS (SEE ALSO IFSE, IFSN)
13257 SQUOZE 4,IFG
13258 JUMPG A,COND
13259 SQUOZE 4,IFGE
13260 JUMPGE A,COND
13261 SQUOZE 4,IFE
13262 JUMPE A,COND
13263 SQUOZE 4,IFLE
13264 JUMPLE A,COND
13265 SQUOZE 4,IFL
13266 JUMPL A,COND
13267 SQUOZE 4,IFN
13268 JUMPN A,COND
13269 SQUOZE 4,.ELSE
13270 SKIPE A.ELSE
13271 SQUOZE 4,.ALSO
13272 SKIPN A.ELSE
13273
13274 SQUOZE 4,IF1
13275 TRNE FF,COND1
13276 SQUOZE 4,IF2
13277 TRNN FF,COND1
13278 SQUOZE 4,IFDEF  ;ASSEMBLE IF SYM DEFINED
13279 JUMPG A,DEFCND
13280 SQUOZE 4,IFNDEF ;ASSEMBLE IF SYM NOT DEFINED
13281 JUMPE A,DEFCND
13282 SQUOZE 4,IFB    ;ASSEMBLE IF STRING BLANK (HAS NO SQUOZE CHARS)
13283 JUMPLE C,SBCND
13284 SQUOZE 4,IFNB   ;ASSEMBLE IF STRING NOT BLANK
13285 JUMPG C,SBCND
13286 SQUOZE 4,IFSQ   ;ASSEMBLE IF STRING ARG IS ALL SQUOZE
13287 JUMPLE B,SBCND
13288 SQUOZE 4,IFNSQ  ;ASSEMBLE IF STRING ARG IS NOT ALL SQUOZE.
13289 JUMPG B,SBCND
13290
13291 SQUOZE 4,PRINTX
13292 APRIN2,,APRINT
13293 SQUOZE 4,PRINTC
13294 APRIN3,,APRINT
13295 SQUOZE 4,COMMEN
13296 APRIN1,,APRINT
13297 SQUOZE 4,.TYO
13298 A.TYO
13299 SQUOZE 4,.TYO6
13300 A.TYO6
13301 SQUOZE 4,.ERR
13302 A.ERR
13303
13304 SQUOZE 4,.RELP
13305 A.RELP
13306 SQUOZE 4,.ABSP
13307 A.ABSP
13308 SQUOZE 4,.RL1
13309 A.RL1
13310 SQUOZE 4,.LIBRA
13311 LLIB,,A.LIB
13312 SQUOZE 4,.LENGTH
13313 A.LENGTH
13314 SQUOZE 4,.LIFS
13315 LTCP,,A.LIB
13316 SQUOZE 4,.ELDC
13317 A.ELDC
13318 IRPS A,,E N G LE GE L
13319 SQUOZE 4,.LIF!A
13320 JUMP!A A.LDCV
13321 TERMIN
13322 SQUOZE 4,.SLDR
13323 A.SLDR
13324 \f
13325 SQUOZE 4,.
13326 GTVLP
13327 SQUOZE 4,.LOP
13328 A.LOP
13329 SQUOZE 40,$.
13330 0
13331 SQUOZE 44,$R.
13332 0
13333 SQUOZE 40,$O.   ;(OH) GLOBAL OFFSET
13334 0
13335 SQUOZE 40,$L.   ;REAL LOCATION (WITHOUT OFFSET)
13336 0
13337 SQUOZE 40,.LVAL1
13338 0
13339 SQUOZE 40,.LVAL2
13340 0
13341 SQUOZE 4,.LNKOT
13342 A.LNKOT
13343 SQUOZE 4,.NSTGW
13344 1,,STGWS
13345 SQUOZE 4,.YSTGW
13346 -1,,STGWS
13347 SQUOZE 4,.LIBRQ
13348 A.LIBRQ
13349 SQUOZE 4,.GLOBAL
13350 ILGLI,,A.GLOB
13351 SQUOZE 4,.SCALAR
13352 ILVAR,,A.GLOB
13353 SQUOZE 4,.VECTOR
13354 ILVAR\ILFLO,,A.GLOB
13355
13356 SQUOZE 4,.BYTC
13357 NBYTS,,INTSYM
13358 SQUOZE 4,.BYTE
13359 A.BYTE
13360 SQUOZE 4,.WALGN
13361 A.WALGN
13362
13363 ;CREF PSEUDO-OPS.
13364 SQUOZE 4,.CRFON
13365 A.CRFN          ;START CREFFING.
13366 SQUOZE 4,.CRFOFF
13367 A.CRFFF ;STOP CREFFING.
13368 SQUOZE 4,.CRFIL
13369 CRFILE,,INTSYM
13370
13371 IFE CREFSW,[
13372         A.CRFN==ASSEM1  ;THESE DO NOTHING IF CAN'T CREF.
13373         A.CRFFF==ASSEM1
13374 ]
13375 \f
13376 IFN MACSW,[     ;MACRO PROCESSOR PSEUDOS
13377 ;MACROS GET DEFINED AS
13378 ;SQUOZE 4, <MACRO NAME>
13379 ;<CHAR ADR>,, MACCL
13380
13381 SQUOZE 4,REPEAT
13382 AREPEAT
13383 SQUOZE 4,DEFINE
13384 ADEFINE
13385 SQUOZE 4,IRP
13386 NIRPO,,AIRP
13387 SQUOZE 4,IRPC
13388 NIRPC,,AIRP
13389 SQUOZE 4,IRPS
13390 NIRPS,,AIRP
13391 SQUOZE 4,IRPW
13392 NIRPW,,AIRP
13393 SQUOZE 4,IRPNC
13394 NIRPN,,AIRP
13395 SQUOZE 4,TERMIN
13396 ATERMIN
13397 SQUOZE 4,.QUOTE
13398 A.QOTE
13399 SQUOZE 4,.STOP
13400 (400000)A.STOP
13401 SQUOZE 4,.ISTOP
13402 A.STOP
13403 SQUOZE 4,.RPCNT
13404 CRPTCT,,INTSYM
13405 SQUOZE 4,.GSSET
13406 A.GSSET
13407 SQUOZE 4,.GSCNT
13408 GENSM,,INTSYM
13409 SQUOZE 4,.GO
13410 A.GO
13411 SQUOZE 4,.TAG
13412 A.TAG
13413 SQUOZE 4,.IRPCNT
13414 CIRPCT,,INTSYM
13415 IFN RCHASW,[SQUOZE 4,.TTYMAC
13416 A.TTYM
13417 ]
13418 SQUOZE 4,IFSE
13419 SKIPN SCOND
13420 SQUOZE 4,IFSN
13421 SKIPE SCOND
13422 ]
13423
13424 IFN FASLP,[
13425 SQUOZE 4,.FASL
13426 A.FASL
13427 SQUOZE 4,.ARRAY ;3 INDEX TO AFDMY1 TBL
13428 AFATOM(3)
13429 SQUOZE 4,.ATOM
13430 AFATOM(AFDMAI)  ;2 INDEX TO AFDMY1 TBL
13431 AFDMAI==2       ;INDEX OF ATOM IN AFDMY1 TBL
13432 SQUOZE 4,.FUNCT
13433 AFATOM(1)       ;1   "   "    "     "
13434 SQUOZE 4,.SPECI
13435 AFATOM(0)       ;0   "   "    "     "
13436 SQUOZE 4,.SX
13437 AFLIST(1)       ;NORMAL LIST
13438 SQUOZE 4,.SXEVA
13439 AFLIST          ;EVAL LIST AND THROW VALUE AWAY
13440 SQUOZE 4,.SXE
13441 AFLIST(2)       ;EVAL LIST AND "RETURN" VALUE
13442 SQUOZE 4,.ENTRY
13443 AFENTY          ;DECLARE LISP ENTRY POINT  (SUBR ETC)
13444 ]
13445 \f
13446 IFN TS,[
13447 SQUOZE 4,.FNAM1
13448 RFNAM1,,INTSYM
13449 SQUOZE 4,.FNAM2
13450 RFNAM2,,INTSYM
13451 SQUOZE 4,.INSRT
13452 A.INSRT
13453 SQUOZE 4,.INEOF
13454 A.INEO
13455 IRPS X,,I O
13456 IRPS Y,,1 2
13457 SQUOZE 4,.!X!FNM!Y
13458 X!FNM!Y,,INTSYM
13459 TERMIN TERMIN
13460 SQUOZE 4,.TTYFLG
13461 A.TTYFLG,,INTSYM
13462 ]
13463 IFN .I.FSW,[
13464 SQUOZE 4,.F
13465 A.F
13466 SQUOZE 4,.I
13467 A.I
13468 ]
13469 IFN TSSYMS,[
13470 IRPS X,,UAI UAO BAI BAO UII UIO BII BIO
13471 SQUOZE 10,.!X
13472 .IRPCN
13473 TERMIN
13474
13475 IRPS X,Y,START LFILE STP+SYM JCL PFILE STB CONV+XUNAME
13476         SQUOZE 10,..R!X
13477         .IRPCN+1
13478 IFSN Y,+,[
13479         SQUOZE 10,..S!X
13480         400000+.IRPCN+1
13481 ] TERMIN
13482 ]
13483
13484 EISYMT: PRINTA \.-MACTBA-1, words initialization coding.
13485 IFN DECSW,[
13486 IFNDEF MACL,MACL=.+5-MACTBA
13487 IFGE .-MACTBA-MACL,.ERR MACL TOO SMALL
13488 ]
13489
13490 IFN ITSSW,[
13491 IFGE .+2400-MACTBA-MACL,.ERR MACL TOO SMALL
13492         LOC <.+1777>&-2000
13493 MXICLR==./2000  ;FIRST PAGE ABOVE INITIALIZING CODING
13494         LOC <MACTBA+MACL+1777>&-2000
13495 MXIMAC==./2000  ;FIRST PAGE ABOVE INITIAL MACTBA
13496 MAXMAC==<CONMAX+CONMAX/4+CONMAX/12+1+MXMACL+SYMMAX*MAXWPS+ST+1777>/2000
13497         ;1ST PAGE MACRO TABLE CAN'T POSSIBLY USE.
13498 IFLE MINPUR-MAXMAC,.ERR PURE TOO LOW.
13499 PRINTA MINPUR-MAXMAC = ,\MINPUR-MAXMAC
13500 ]
13501
13502 IFN TS,END BEG  ;MUST BE BEFORE RELOCATABLE END STATEMENT,
13503                 ;SINCE TS MIDAS NOW TRIES TO DO MULTIPLE 1PASS ASSEMBLIES FROM SAME FILE.
13504                 ;PUTTING RELOCABLE END STATEMENT FIRST CAUSES IT TO ENCOUNTER OTHER
13505                 ;END STATEMENT IN NEW ASSEMBLY CAUSING CONFUSION
13506
13507 END 100