1 TITLE MACRO V.30(52)
\r
2 SUBTTL RPG/CMF/JF/PMH/DMN 7-SEPT-71
\r
3 ;COPYRIGHT 1968,1969,1970,1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS.
\r
5 VMACRO==30 ;VERSION NUMBER
\r
6 VUPDATE==0 ;DEC UPDATE LEVEL
\r
7 VEDIT==30 ;EDIT NUMBER
\r
8 VCUSTOM==0 ;NON-DEC UPDATE LEVEL
\r
12 <VCUSTOM>B2+<VMACRO>B11+<VUPDATE>B17+VEDIT
\r
16 COMMENT * ASSEMBLY FEATURE SWITCHES (ACTION WHEN NON-ZERO)
\r
18 SWITCHES ON (NON-ZERO) IN DEC VERSION
\r
19 FTDISK GIVES DISK FEATURES
\r
20 RUNSW USE RUN UUO FOR "DEV:NAME!"
\r
21 FORMSW USE MORE READABLE FORMATS FOR LISTING (ICCSW)
\r
22 DFRMSW DEFAULT CONDITION OF FORMAT PRINTING (MULTI-FORM IF ON)
\r
24 SWITCHES OFF (ZERO) IN DEC VERSION
\r
25 IIISW GIVES III FEATURES
\r
26 OPHSH GIVES HASH SEARCH OF OPCODES
\r
28 \fSUBTTL DEFAULT ASSEMBLY SWITCH SETTINGS
\r
30 IFNDEF RUNSW,<RUNSW==1>
\r
31 IFNDEF FTDISK,<FTDISK==0>
\r
32 IFNDEF DFRMSW,<DFRMSW==0>
\r
33 IFN DFRMSW,<FORMSW==1>
\r
34 IFDEF ICCSW,<FORMSW==ICCSW> ;SAME SWITCH
\r
35 IFNDEF FORMSW,<FORMSW==0>
\r
37 IFNDEF IIISW,<IIISW==0>
\r
39 IFNDEF OPHSH,<OPHSH==0>
\r
41 \fSUBTTL OTHER PARAMETERS
\r
43 .PDP== ?D50 ;BASIC PUSH-DOWN POINTER
\r
44 IFNDEF LPTWID,<LPTWID==?D132> ;DEFAULT WIDTH OF PRINTER
\r
45 .LPTWD==8*<LPTWID/8> ;USEFUL WIDTH IN MAIN LISTING
\r
46 .CPL== .LPTWD-?D32 ;WIDTH AVAIABLE FOR TEXT WHEN
\r
47 ;BINARY IS IN HALFWORD FORMAT
\r
48 .LPP==?D55 ;LINES/PAGE
\r
49 .STP== ?D40 ;STOW SIZE
\r
50 .TBUF== ?D80 ;TITLE BUFFER
\r
51 .SBUF== ?D80 ;SUB-TITLE BUFFER
\r
52 .IFBLK==?D20 ;IFIDN COMPARISON BLOCK SIZE
\r
54 .UNIV==?D10 ;NUMBER OF UNIVERSAL DEFINITIONS
\r
55 .LEAF==4 ;SIZE OF BLOCKS IN MACRO TREE
\r
57 NCOLS==LPTWID/?D32 ;NUMBER OF COLUMNS IN SYMBOL TABLE
\r
58 IFN OPHSH,<IFNDEF PRIME,<PRIME==?D701>>
\r
60 NUMBUF==2 ;NUMBER OF INPUT BUFFERS
\r
62 EXTERN JOBREL,JOBSYM,JOBDDT,JOBFF,JOBAPR,JOBSA
\r
64 SALL ;SUPPRESS ALL MACROS
\r
66 ;SOME ASCII CHARACTERS
\r
78 SDEL= 3 ;SEARCH INCREMENT
\r
79 SX= SDEL+1 ;SEARCH INDEX
\r
82 C= 7 ;CURRENT CHARACTER
\r
83 CS= C+1 ;CHARACTER STATUS BITS
\r
84 RC= 11 ;RELOCATION BITS
\r
85 MWP= 12 ;MACRO WRITE POINTER
\r
86 MRP= 13 ;MACRO READ POINTER
\r
87 IO= 14 ;IO REGISTER (LEFT)
\r
88 ER== IO ;ERROR REGISTER (RIGHT)
\r
89 FR= 15 ;FLAG REGISTER (LEFT)
\r
90 RX== FR ;CURRENT RADIX (RIGHT)
\r
91 MP= 16 ;MACRO PUSHDOWN POINTER
\r
92 PP= 17 ;BASIC PUSHDOWN POINTER
\r
100 OPDEF RESET [CALLI 0]
\r
101 OPDEF SETDDT [CALLI 2]
\r
102 OPDEF DDTOUT [CALLI 3]
\r
103 OPDEF DEVCHR [CALLI 4]
\r
104 OPDEF WAIT [MTAPE 0]
\r
105 OPDEF CORE [CALLI 11]
\r
106 OPDEF EXIT [CALLI 12]
\r
107 OPDEF UTPCLR [CALLI 13]
\r
108 OPDEF DATE [CALLI 14]
\r
109 OPDEF APRENB [CALLI 16]
\r
110 OPDEF MSTIME [CALLI 23]
\r
111 OPDEF PJOB [CALLI 30]
\r
112 OPDEF RUN [CALLI 35]
\r
114 \f ;FR FLAG REGISTER (FR/RX)
\r
115 IOSCR== 000001 ;NO CR AFTER LINE
\r
116 MTAPSW==000004 ;MAG TAPE
\r
117 ERRQSW==000010 ;IGNORE Q ERRORS
\r
118 LOADSW==000020 ;END OF PASS1 & NO EOF YET
\r
119 DCFSW== 000040 ;DECIMAL FRACTION
\r
120 RIM1SW==000100 ;RIM10 MODE
\r
121 NEGSW== 000200 ;NEGATIVE ATOM
\r
122 RIMSW== 000400 ;RIM OUTPUT
\r
123 PNCHSW==001000 ;RIM/BIN OUTPUT WANTED
\r
125 R1BSW== 004000 ;RIM10 BINARY OUTPUT
\r
126 TMPSW== 010000 ;EVALUATE CURRENT ATOM
\r
127 INDSW== 020000 ;INDIRECT ADDRESSING WANTED
\r
128 RADXSW==040000 ;RADIX ERROR SWITCH
\r
129 FSNSW== 100000 ;NON BLANK FIELD SEEN
\r
130 MWLFLG==200000 ;ON FOR DON'T ALLOW MULTI-WORD LITERALS
\r
133 ;IO FLAG REGISTER (IO/ER)
\r
134 FLDSW== 400000 ;ADDRESS FIELD
\r
136 ARPGSW==100000 ;ALLOW RAPID PROGRAM GENERATION
\r
137 IOPROG==040000 ;SUPRESS LISTING (LIST/XLIST PSEUDO OP)
\r
139 IOMAC== 010000 ;MACRO EXPANSION IN PROGRESS
\r
140 IOPALL==004000 ;SUPRESS LISTING OF MACRO EXPANSIONS
\r
141 IONCRF==002000 ;SUPRESS OUTPUT OF CREF INFORMATION
\r
142 CRPGSW==001000 ;CURRENTLY IN PROGRESS ON RPG
\r
143 IOCREF==000400 ;WE ARE NOW OUTPUTTING CREF INFO
\r
144 IOENDL==000200 ;BEEN TO STOUT
\r
146 DEFCRS==000040 ;THIS IS A DEFINING OCCURANCE (MACROS)
\r
147 IOIOPF==000020 ;IOP INSTRUCTION SEEN
\r
148 MFLSW== 000010 ;MULTI-FILE MODE,PRGEND SEEN
\r
149 IORPTC==000004 ;REPEAT CURRENT CHARACTER
\r
150 IOTLSN==000002 ;TITLE SEEN
\r
151 IOSALL==000001 ;SUPPRESS MACRO LISTING EVEN IF BINARY IS GENERATED
\r
153 OPDEF JUMP1 [JUMPL FR, ] ;JUMP IF PASS 1
\r
154 OPDEF JUMP2 [JUMPGE FR, ] ;JUMP IF PASS 2
\r
156 OPDEF JUMPOC [JUMPGE IO, ] ;JUMP IF IN OP-CODE FIELD
\r
157 OPDEF JUMPAD [JUMPL IO, ] ;JUMP IF IN ADDRESS FIELD
\r
159 OPDEF JUMPCM [JUMPL CS, ] ;JUMP IF CURRENT CHAR IS COMMA
\r
160 OPDEF JUMPNC [JUMPGE CS, ] ;JUMP IF CURRENT CHAR IS NON-COMMA
\r
162 \f ;ER ERROR REGISTERS (IO/ER)
\r
163 ERRM== 000020 ;MULTIPLY DEFINED SYMBOL
\r
164 ERRE== 000040 ;ILLEGAL USE OF EXTERNAL
\r
165 ERRP== 000100 ;PHASE DISCREPANCY
\r
166 ERRO== 000200 ;UNDEFINED OP CODE
\r
167 ERRN== 000400 ;NUMBER ERROR
\r
168 ERRV== 001000 ;VALUE PREVIOUSLY UNDEFINED
\r
169 ERRU== 002000 ;UNDEFINED SYMBOL
\r
170 ERRR== 004000 ;RELOCATION ERROR
\r
171 ERRL== 010000 ;LITERAL ERROR
\r
172 ERRD== 020000 ;REFERENCE TO MULTIPLY DEFINED SYMBOL
\r
173 ERRA== 040000 ;PECULIAR ARGUMENT
\r
174 ERRX== 100000 ;MACRO DEFINITION ERROR
\r
175 ERRQ== 200000 ;QUESTIONABLE, NON-FATAL ERROR
\r
180 ;SYMBOL TABLE FLAGS
\r
181 SYMF== 400000 ;SYMBOL
\r
183 NOOUTF==100000 ;NO DDT OUTPUT WFW
\r
184 SYNF== 040000 ;SYNONYM
\r
185 MACF== SYNF?-1 ;MACRO
\r
186 OPDF== SYNF?-2 ;OPDEF
\r
187 PNTF== 004000 ;"VALUE" IN SYMBOL TBL IS PNTR TO 36BIT VALUE
\r
188 UNDF== 002000 ;UNDEFINED
\r
189 EXTF== 001000 ;EXTERNAL
\r
190 INTF== 000400 ;INTERNAL
\r
191 ENTF== 000200 ;ENTRY
\r
192 VARF== 000100 ;VARIABLE
\r
193 MDFF== 000020 ;MULTIPLY DEFINED
\r
194 SPTR== 000010 ;SPECIAL EXTERNAL POINTER
\r
195 SUPRBT==000004 ;SUPRESS OUTPUT TO DDT
\r
196 LELF== 000002 ;LEFT HAND RELOCATABLE
\r
197 RELF== 000001 ;RIGHT HAND RELOCATABLE
\r
199 LITF== 200000 ;FLAG FOR PSEUDO-OPS INVALID IN LIT'S
\r
200 ADDF== 100000 ;FLAG FOR PSEUDO-OPS INVALID IN ADDRESSES
\r
202 TNODE== 200000 ;TERMINAL NODE FOR EVALEX
\r
208 \fIFN RUNSW,< ;ASSEMBLE IF RUN UUO IMPLEMENTED
\r
209 NUNSET: JUMPN ACDEV,.+2
\r
210 MOVSI ACDEV,(SIXBIT /SYS/) ;USE SYS IF NONE SPECIFIED
\r
213 MOVEM ACFILE,RUNFIL ;STORE FILE NAME
\r
214 PUSHJ PP,DELETE ;COMMAND FILE
\r
216 MOVEI 16,RUNDEV ;XWD 0,RUNDEV
\r
217 TLNE IO,CRPGSW ;WAS RPG IN PROGRESS?
\r
218 HRLI 16,1 ;YES. START NEXT AT C(JOBSA)+1
\r
219 RUN 16, ;DO "RUN DEV:NAME"
\r
220 HALT ;SHOULDN'T RETURN. HALT IF IT DOES
\r
223 DELETE: HRRZ EXTMP ;IF THE EXTENSION
\r
224 CAIE (SIXBIT/TMP/) ;IS .TMP
\r
226 CLOSE CTL2, ;DELETE
\r
227 SETZB 4,5 ;THE COMMAND FILE.
\r
233 \fSUBTTL START ASSEMBLING
\r
235 ASSEMB: PUSHJ PP,INZ ;INITIALIZE FOR PASS
\r
236 MOVE [ASCII /.MAIN/]
\r
241 ASSEM1: PUSHJ PP,CHARAC ;TEST FOR FORM FEED
\r
242 SKIPGE LIMBO ;CRLF FLAG?
\r
243 JRST ASSEM1 ;YES ,IGNORE LF
\r
252 CAIN C,"\" ;BACK-SLASH?
\r
253 TLZA IO,IOMAC ;YES, LIST IF IN MACRO
\r
255 PUSHJ PP,STMNT ;OFF WE GO
\r
256 TLZN IO,IOENDL ;WAS STOUT PRE-EMPTED?
\r
257 PUSHJ PP,STOUT ;NO, POLISH OFF LINE
\r
260 \fSUBTTL STATEMENT PROCESSOR
\r
262 STMNT: TLZ FR,INDSW!FSNSW
\r
264 STMNT1: PUSHJ PP,LABEL
\r
265 STMNT2: PUSHJ PP,ATOM ;GET THE FIRST ATOM
\r
270 JUMPAD STMNT7 ;NUMERIC EXPRESSION
\r
271 JUMPN AC0,STMN2A ;JUMP IF NON NULL FIELD
\r
272 SKIPN LITLVL ;ALLOW COMMA IN LITERALS
\r
273 CAIE C,14 ;NULL, COMMA?
\r
274 CAIN C,EOL ;OR END OF LINE?
\r
276 CAIN C,"]" ;CLOSING LITERAL?
\r
278 JRST STMNT9 ;NO,AT LEAST SKIP ALL THIS NONSENSE
\r
280 STMN2A: JUMPE C,.+2
\r
282 PUSHJ PP,MSRCH ;SEARCH FOR MACRO/OPDEF/SYN
\r
283 JRST STMNT3 ;NOT FOUND, TRY OP CODE
\r
284 LDB SDEL,[POINT 3,ARG,5]
\r
285 JUMPE SDEL,ERRAX ;ERROR IF NO FLAGS
\r
286 SOJE SDEL,OPD1 ;OPDEF IF 1
\r
287 SOJE SDEL,CALLM ;MACRO IF 2
\r
288 JRST STMNT4 ;SYNONYM, PROCESS WITH OP-CODES
\r
290 STMNT3: PUSHJ PP,OPTSCH ;SEARCH OP CODE TABLE
\r
291 JRST STMNT5 ;NOT FOUND
\r
292 STMNT4: HLLZ AC0,V ;PUT CODE IN AC0
\r
293 TRZ V,ADDF ;CLEAR ADDRESS NON-VALID FLAG
\r
294 TRZE V,LITF ;VALID IN LITERAL?
\r
295 SKIPN LITLVL ;NO, ARE WE IN A LITERAL?
\r
296 JRST 0(V) ;NO, GO TO APPROPRIATE PROCESSOR
\r
299 STMNT5: PUSHJ PP,SSRCH ;TRY SYMBOLS
\r
300 JRST STMNT8 ;NOT FOUND
\r
301 TLNE ARG,EXTF!UNDF ;EXTERNAL OR UNDEFINED?
\r
302 JRST STMNT7 ;YES, PROCESS IN EVALEX
\r
303 TLNN RC,-2 ;CHECK FOR EXTERNAL
\r
306 MOVE AC0,V ;FOUND, PUT VALUE IN AC0
\r
307 TLO IO,NUMSW ;FLAG AS NUMERIC
\r
308 STMNT7: TLZ IO,IORPTC
\r
309 STMNT9: PUSHJ PP,EVALHA ;EVALUATE EXPRESSION
\r
310 IFN FORMSW,< MOVE AC1,HWFORM ;USE STANDARD FORM>
\r
311 TLNE FR,FSNSW ;FIELD SEEN?
\r
312 JRST STOW ;YES,STOW THE CODE AND EXIT
\r
313 CAIE C,"]"-40 ;CLOSING LITERAL?
\r
314 TRO ER,ERRQ ;NO, GIVE "Q" ERROR
\r
317 \fSTMNT8: MOVEI V,0 ;ALWAYS START SCAN WITH 0
\r
318 CAIL V,CALNTH ;END OF TABLE?
\r
319 JRST STMN8C ;YES, TRY TTCALLS
\r
320 CAME AC0,CALTBL(V) ;FOUND IT?
\r
321 AOJA V,.-3 ;NO,TRY AGAIN
\r
322 SUBI V,NEGCAL ;CALLI'S START AT -1
\r
323 HRLI V,(CALLI) ;PUT IN UUO
\r
324 STMN8D: MOVSI ARG,OPDF ;SET FLAG FOR OPDEF
\r
325 STMN8B: PUSHJ PP,INSERT ;PUT OPDEF IN TABLE
\r
326 JRST OPD ;AND TREAT AS OPDEF
\r
328 STMN8C: SETZ V, ;START WITH ZERO
\r
329 CAIL V,TTCLTH ;END OF TABLE?
\r
330 JRST STMN8A ;YES, ERROR
\r
331 CAME AC0,TTCTBL(V) ;MATCH?
\r
332 AOJA V,.-3 ;NO, KEEP TRYING
\r
333 LSH V,5 ;PUT IN AC FIELD (RIGHT HALF)
\r
334 HRLZI V,<(TTCALL)>(V) ;PUT UUO IN LEFT HALF
\r
335 JRST STMN8D ;SET OPDEF FLAG
\r
337 STMN8A: SETZB V,RC ;CLEAR VALUE AND RELOCATION
\r
338 TRO ER,ERRO ;FLAG AS UNDEFINED OP-CODE
\r
339 JUMP1 OPD ;TREAT AS STANDARD OP ON PASS1
\r
340 MOVSI ARG,OPDF!UNDF!EXTF ;SET A FEW FLAGS
\r
341 JRST STMN8B ;TO FORCE OUT A MESSAGE
\r
343 ;STATEMENT OUT PASSES REMAINDER OF LINE (CMNT)
\r
344 ;UNTIL A LINE TERMINATOR IS SEEN.
\r
345 STOUTS: TLOA IO,IOENDL!IORPTC
\r
346 STOUT: TLO IO,IORPTC
\r
349 SKIPL STPX ;YES, ERROR IF CODE STORED
\r
353 STOUT1: PUSHJ PP,CHARAC
\r
357 JRST OUTLIN ;OUTPUT THE LINE (BIN AND LST)
\r
358 \f SUBTTL LABEL PROCESSOR
\r
360 LABEL: JUMPAD LABEL4 ;COMPARE IF NON-SYMBOLIC
\r
361 JUMPE AC0,LABEL5 ;ERROR IF BLANK
\r
362 TLO IO,DEFCRS ;THIS IS A DEFINITION
\r
363 PUSHJ PP,SSRCH ;SEARCH FOR OPERAND
\r
364 MOVSI ARG,SYMF!UNDF!TAGF ;NOT FOUND
\r
365 TLNN ARG,EXTF ;OPERAND FOUND (SKIP EXIT)
\r
367 JUMP1 LABEL3 ;ERROR ON PASS1
\r
368 TLNN ARG,UNDF ;UNDEFINED ON PASS1
\r
369 JRST LABEL3 ;NO, FLAG ERROR
\r
370 TLZ ARG,EXTF!PNTF ;TURN OFF EXT FLAG NOW
\r
371 LABEL0: TLZN ARG,UNDF!VARF ;WAS IT PREVIOUSLY DEFINED?
\r
372 JRST LABEL2 ;YES, CHECK EQUALITY
\r
376 PUSHJ PP,PEEK ;GET NEXT CHAR.
\r
377 CAIE C,":" ;SPECIAL CHECK FOR ::
\r
378 JRST LABEL1 ;NO MATCH
\r
379 TLO ARG,INTF ;MAKE IT INTERNAL
\r
380 PUSHJ PP,GETCHR ;PROCESS NEXT CHAR.
\r
381 PUSHJ PP,PEEK ;PREVIEW NEXT CHAR.
\r
382 LABEL1: CAIE C,"!" ;HALF-KILL SIGN
\r
384 TLO ARG,NOOUTF ;YES, SUPPRESS IT
\r
385 PUSHJ PP,GETCHR ;AND GET RID OF IT
\r
386 LABEL6: MOVEM AC0,TAG ;SAVE FOR PASS 1 ERRORS
\r
387 HLLZS TAGINC ;ZERO INCREMENT
\r
388 JRST INSERT ;INSERT/UPDATE AND EXIT
\r
390 LABEL2: HRLOM V,LOCBLK ;SAVE LIST LOCATION
\r
391 CAMN V,LOCA ;DOES IT COMPARE WITH PREVIOUS? WFW
\r
393 LABEL3: TLOA ARG,MDFF ;NO, FLAG MULTIPLY DEFINED AND SKIP
\r
394 JRST LABEL7 ;YES, GET RID OF EXTRA CHARS.
\r
395 TRO ER,ERRM ;FLAG MULTIPLY DEFINED ERROR
\r
396 JRST UPDATE ;UPDATE AND EXIT
\r
398 LABEL4: CAMN AC0,LOCA ;DO THEY COMPARE?
\r
400 LABEL5: TRO ER,ERRP ;NO, FLAG PHASE ERROR
\r
403 LABEL7: SKIPE LITLVL ;LABEL IN A LITERAL?
\r
404 MOVEM AC0,LITLBL ;YES, SAVE LABEL NAME FOR LATER
\r
405 PUSHJ PP,PEEK ;INSPECT A CHAR.
\r
407 PUSHJ PP,GETCHR ;YES, DISPOSE OF IT
\r
408 PUSHJ PP,PEEK ;EXAMINE ONE MORE CHAR.
\r
409 CAIN C,"!" ;EXCLAMATION?
\r
410 JRST GETCHR ;YES, INDEED
\r
412 \fSUBTTL ATOM PROCESSOR
\r
413 ATOM: PUSHJ PP,CELL ;GET FIRST CELL
\r
414 TLNE IO,NUMSW ;IF NON-NUMERIC
\r
415 ATOM1: CAIE C,42 ;OR NOT A BINARY SHIFT,
\r
418 PUSH PP,AC0 ;STACK REGISTERS, ITS A BINARY SHIFT
\r
422 HRRI RX,?D10 ;COMPUTE SHIFT RADIX 10
\r
423 PUSHJ PP,CELLSF ;GET SHIFT
\r
424 MOVE ARG,RC ;SAVE RELOCATION
\r
425 POP PP,RX ;RESTORE REGISTERS
\r
428 MOVN SX,AC0 ;USE NEGATIVE OF SHIFT
\r
430 JUMPN ARG,NUMER2 ;IF NOT ABSOLUTE
\r
431 TLNN IO,NUMSW ;AND NUMERIC,
\r
432 JRST NUMER2 ;FLAG ERROR
\r
435 JRST ATOM1 ;TEST FOR ANOTHER
\r
436 \fCELLSF: TLO IO,FLDSW
\r
437 CELL: SETZB AC0,RC ;CLEAR RESULT AND RELOCATION
\r
438 SETZB AC1,AC2 ;CLEAR WORK REGISTERS
\r
439 MOVEM PP,PPTEMP ;SAVE PUSHDOWN POINTER
\r
441 TLZA FR,NEGSW!DCFSW!RADXSW
\r
443 CELL1: TLO IO,FLDSW
\r
445 LDB V,[POINT 4,CSTAT(C),14] ;GET CODE
\r
446 XCT .+1(V) ;EXECUTE, INDEX VIA BITS 11,12,13,14 OF CSTAT TABLE
\r
447 JRST CELL1 ;0; BLANK, (TAB OR "+")
\r
448 JRST LETTER ;1; LETTER ] $ % ( ) , ; >
\r
449 TLC FR,NEGSW ;2; "-"
\r
450 TLO FR,INDSW ;3; "@"
\r
451 JRST NUM1 ;4; NUMERIC 0 - 9
\r
454 JRST QUOTES ;7; ""","'"
\r
456 JRST PERIOD ;11; "."
\r
457 TROA ER,ERRQ ;12; ERROR, FLAG AND TREAT AS DELIMITER
\r
458 ;12; ! # & * / : = ? \ ?
\r
459 \fLETTER: TLOA AC2,(POINT 6,AC0,) ;SET BYTE POINTER
\r
460 LETTE1: PUSHJ PP,GETCHR ;GET CHARACTER
\r
461 TLNN CS,6 ;ALPHA-NUMERIC?
\r
462 JRST LETTE3 ;NO,TEST FOR VARIABLE
\r
463 TLNE AC2,770000 ;STORE ONLY SIX BYTES
\r
464 LETTE2: IDPB C,AC2 ;RETURN FROM PERIOD
\r
467 LETTE3: CAIE C,03 ;"#"?
\r
469 JUMPE AC0,POPOUT ;TEST FOR NULL
\r
470 PUSHJ PP,PEEK ;PEEK AT NEXT CHAR.
\r
471 CAIN C,"#" ;IS IT 2ND #?
\r
472 JRST LETTE4 ;YES, THEN IT'S AN EXTERN
\r
474 PUSHJ PP,SSRCH ;YES, SEARCH FOR SYMBOL (OPERAND)
\r
475 MOVSI ARG,SYMF!UNDF ;NOT FOUND, FLAGAS UNDEFINED SYM.
\r
476 TLNN ARG,UNDF ;UNDEFINED?
\r
477 JRST GETCHR ;NO, GET NEXT CHAR AND RETURN
\r
478 TLO ARG,VARF ;YES, FLAG AS A VARIABLE
\r
479 TRO ER,ERRU ;SET UNDEFINED ERROR FLAG
\r
480 PUSHJ PP,INSERZ ;INSERT IT WITH A ZERO VALUE
\r
483 LETTE4: PUSHJ PP,GETCHR ;AND SCAN PAST IT
\r
484 PUSHJ PP,GETCHR ;GET RID OF #
\r
485 JRST EXTER1 ;PUT IN SYMBOL TABLE
\r
487 NUMER1: SETZB AC0,RC ;RETURN ZERO
\r
488 NUMER2: TRO ER,ERRN ;FLAG ERROR
\r
490 GETDEL: PUSHJ PP,BYPASS
\r
491 GETDE1: JUMPE C,.-1
\r
493 GETDE3: TLO IO,NUMSW!FLDSW ;FLAG NUMERIC
\r
494 TLNN FR,NEGSW ;IS ATOM NEGATIVE?
\r
499 GETDE2: MOVNS AC0 ;YES, NEGATE VALUE
\r
500 MOVNS RC ;AND RELOCATION
\r
501 POPOUT: POPJ PP, ;EXIT
\r
502 \fQUOTES: CAIE C,"'"-40 ;IS IT "'"
\r
503 JRST QUOTE ;NO MUST BE """
\r
506 QUOTE0: TLNE AC0,376000 ;5 CHARACTERS STORED ALREADY?
\r
507 TRO ER,ERRQ ;YES, GIVE WARNING
\r
510 QUOTE: PUSHJ PP,CHARAC ;GET 7-BIT ASCII
\r
511 CAIG C,15 ;TEST FOR LF, VT, FF OR CR
\r
513 JRST .+2 ;NO, SO ALL IS WELL
\r
514 JRST QUOTE2 ;ESCAPE WITH Q ERROR
\r
517 PUSHJ PP,PEEK ;LOOK AT NEXT CHAR.
\r
519 JRST QUOTE1 ;RESTORE REPEAT LEVEL AND QUIT
\r
520 PUSHJ PP,CHARAC ;GET NEXT CHAR.
\r
521 JRST QUOTE0 ;USE IT
\r
523 QUOTE2: TRO ER,ERRQ ;SET Q ERROR
\r
524 QUOTE1: JRST GETDEL
\r
526 SQUOT0: TLNE AC0,770000 ;SIX CHARS. STORED ALREADY ?
\r
529 IORI AC0,-40(C) ;OR IN SIXBIT CHAR.
\r
531 SQUOTE: PUSHJ PP,CHARAC
\r
544 \fQUAL: PUSHJ PP,BYPAS1 ;SKIP BLANKS, GET NEXT CHARACTER
\r
546 JRST QUAL2 ;YES, RADIX=D2
\r
548 JRST QUAL8 ;YES, RADIX=D8
\r
550 JRST NUMDF ;YES, PROCESS DECIMAL FRACTION
\r
554 JRST NUMER1 ;NO, FLAG NUMERIC ERROR
\r
573 \fSUBTTL LITERAL PROCESSOR
\r
576 PUSH PP,EXTPNT ;ALLOW EXTERN TO PRECEDE LIT IN XWD
\r
578 SKIPE LITLVL ;SAVE SEQNO AND PAGE IF NOT IN LIT ALREADY
\r
584 SQB5: JSP AC2,SVSTOW
\r
585 SQB3: PUSHJ PP,STMNT
\r
586 CAIN C,75 ;CHECK FOR ]
\r
589 TLNE FR,MWLFLG ;CALL IT ] IF NOT MULTI-WORD FLAG
\r
590 JRST SQB2 ;BUT REPEAT LAST CHARACTER
\r
595 SQB4: PUSHJ PP,CHARAC
\r
596 CAIN C,";" ;COMMENT?
\r
597 JRST SQB6 ;YES, IGNORE SQUARE BRACKETS
\r
598 CAIN C,"]" ;LOOK FOR TERMINAL SQB
\r
599 TRNN ER,ERRORS ;IN CASE OF ERROR IN LITERAL
\r
600 JRST .+2 ;NO ALL IS WELL
\r
601 JRST SQB1 ;FINISH THE LITERAL NOW!!
\r
602 CAIG C,CR ;LOOK FOR END OF LINE
\r
605 SQB4A: PUSHJ PP,OUTIML ;DUMP
\r
606 PUSHJ PP,CHARAC ;GET ANOTHER CHAR.
\r
607 SKIPL LIMBO ;CRLF FLAG
\r
608 TLO IO,IORPTC ;NO REPEAT
\r
611 SQB6: PUSHJ PP,CHARAC ;GET A CHARACTER
\r
613 CAIN C,HT ;LOOK FOR END OF LINE CHAR.
\r
617 SQB1: TLZ IO,IORPTC
\r
618 SQB2: PUSHJ PP,STOLIT
\r
620 SKIPE LITLBL ;NEED TO FIXUP A LABEL?
\r
621 PUSHJ PP,RELBLE ;YES, USE LOC OF LITERAL
\r
624 SKIPE LITLVL ;WERE WE NESTED?
\r
625 JUMP1 NUMER2 ;YES, FORCE ERROR IF PASS 1
\r
628 RELBLE: PUSH PP,AC0 ;SAVE LOCATION COUNTER
\r
629 PUSH PP,RC ;AND RELOCATION
\r
630 MOVE AC0,LITLBL ;SYMBOL WE NEED
\r
631 SETZM LITLBL ;ZERO INDICATOR
\r
632 PUSHJ PP,SSRCH ;SEARCH FOR OPERAND
\r
633 JRST RELBL1 ;SHOULD NEVER HAPPEN
\r
634 TLNN ARG,TAGF ;IT BETTER BE A LABEL
\r
635 JRST RELBL1 ;IT WASN'T , GIVE UP BEFORE SOME HARM IS DONE
\r
636 TLZ ARG,UNDF!EXTF!PNTF ;CLEAR FLAGS NOW
\r
637 POP PP,RC ;GET LITERAL RELOCATION
\r
638 MOVE V,(PP) ;GET VALUE (LOC COUNTER)
\r
639 PUSHJ PP,UPDATE ;UPDATE VALUE
\r
640 POP PP,AC0 ;RESTORE LITERAL COUNT
\r
643 RELBL1: POP PP,RC ;RESTORE RC
\r
644 POP PP,AC0 ;AND AC0
\r
645 POPJ PP, ;JUST RETURN
\r
646 \fANGLB: PUSH PP,FR
\r
656 ANGLB1: PUSHJ PP,EVALHA
\r
662 PERIOD: PUSHJ PP,GETCHR ;LOOK AT NEXT CHARACTER
\r
663 TLNN CS,2 ;ALPHABETIC?
\r
664 JRST PERNUM ;NO, TEST NUMERIC
\r
665 MOVSI AC0,(SIXBIT /./) ;YES, PUT PERIOD IN AC0
\r
666 MOVSI AC2,(POINT 6,AC0,5) ;SET BYTE POINTER
\r
667 JRST LETTE2 ;AND TREAT AS SYMBOL
\r
669 PERNUM: TLNE CS,4 ;IS IT A NUMBER
\r
671 MOVE AC0,LOCA ;NO. CURRENT LOC SYMBOL (.)
\r
672 MOVE RC,MODA ;SET TO CURRENT ASSEMBLY MODE
\r
673 JRST GETDE1 ;GET DELIMITER
\r
674 NUMDF: TLO FR,DCFSW ;SET DECIMAL FRACTION FLAG
\r
675 NUM: PUSHJ PP,GETCHR ;GET A CHARACTER
\r
676 TLNN CS,4 ;NUMERIC?
\r
678 NUM1: SUBI C,20 ;CONVERT TO OCTAL
\r
679 PUSH PP,C ;STACK FOR FLOATING POINT
\r
682 ADD AC1,C ;ADD IN LAST VALUE
\r
683 CAIL C,0(RX) ;IS NUMBER LESS THAN CURRENT RADIX?
\r
684 TLO FR,RADXSW ;NO, SET FLAG
\r
685 AOJA AC2,NUM ;YES, AC2=NO. OF DECIMAL PLACES
\r
687 \fNUM10: CAIE C,16 ;PERIOD?
\r
688 TLNE FR,DCFSW ;OR DECIMAL FRACTION?
\r
689 JRST NUM30 ;YES, PROCESS FLOATING POINT
\r
690 LSH AC1,1 ;NO, CLEAR THE SIGN BIT
\r
691 LSHC AC0,?D35 ;AND SHIFT INTO AC0
\r
692 MOVE PP,PPTEMP ;RESTORE PP
\r
693 SOJE AC2,GETDE1 ;NO RADIX ERROR TEST IF ONE DIGIT
\r
694 TLNE FR,RADXSW ;WAS ILLEGAL NUMBER ENCOUNTERED?
\r
695 TRO ER,ERRN ;YES, FLAG N ERROR
\r
698 NUM30: CAIE C,"B"-40 ;IF "B" THEN MISSING "."
\r
699 NUM31: PUSHJ PP,GETCHR
\r
700 TLNN CS,4 ;NUMERIC?
\r
706 NUM40: PUSH PP,FR ;STACK VALUES
\r
711 JRST [PUSHJ PP,PEEK ;GET NEXT CHAR
\r
712 PUSH PP,C ;SAVE NEXT CHAR
\r
713 PUSHJ PP,CELL ;YES, GET EXPONENT
\r
714 POP PP,C ;GET FIRST CHAR. AFTER E
\r
715 CAIN V,4 ;MUST HAVE NUMERICAL STATUS
\r
716 JRST .+2 ;SKIP RETURN
\r
717 CAIN C,"<" ;ALLOW <EXP>
\r
718 JRST .+2 ;SKIP RETURN
\r
719 SKIPN AC0 ;ERROR IF NON-ZERO EXPRESSION
\r
720 TROA ER,ERRQ ;ALLOW E+,E-
\r
721 SETOM RC ;FORCE NUMERICAL ERROR
\r
722 JRST .+2] ;SKIP RETURN
\r
723 MOVEI AC0,0 ;NO, ZERO EXPONENT
\r
729 JUMPN RC,NUMER1 ;EXPONENT MUST BE ABSOLUTE
\r
736 JOV NUM50 ;CLEAR OVERFLOW FLAG
\r
738 NUM50: JSP SDEL,NUMUP ;FLOATING POINT
\r
739 JRST NUM52 ;END OF WHOLE NUMBERS
\r
740 FMPR AC0,[10.0] ;MULTIPLY BY 10
\r
741 TLO AC1,233000 ;CONVERT TO FLOATING POINT
\r
742 FADR AC0,AC1 ;ADD IT IN
\r
745 NUM52: JSP SDEL,NUMDN ;PROCESS FRACTION
\r
747 JOV NUMER1 ;TEST FOR OVERFLOW
\r
752 FADR AC2,AC1 ;ACCUMULATE FRACTION
\r
756 NUM60: JSP SDEL,NUMUP
\r
762 NUM62: LSHC AC1,-?D36
\r
785 GETSYM: MOVEI AC0,0 ;CLEAR AC0
\r
786 MOVSI AC1,(POINT 6,AC0) ;PUT POINTER IN AC1
\r
787 PUSHJ PP,BYPASS ;SKIP LEADING BLANKS
\r
788 TLNN CS,2 ;ALPHABETIC?
\r
789 JRST GETSY1 ;NO, ERROR
\r
791 JRST GETSY2 ;NO, A VALID SYMBOL
\r
792 IDPB C,AC1 ;STORE THE CHARACTER
\r
793 PUSHJ PP,GETCHR ;YES, TEST NEXT CHARACTER
\r
794 TLNN CS,2 ;ALPHABETIC?
\r
795 GETSY1: TROA ER,ERRA
\r
796 GETSY2: AOS 0(PP) ;YES, SET SKIP EXIT
\r
797 GETSY3: TLNN CS,6 ;ALPHA-NUMERIC?
\r
798 JRST BYPAS2 ;NO, GET DELIMITER
\r
799 TLNE AC1,770000 ;YES, HAVE WE STORED SIX?
\r
800 IDPB C,AC1 ;NO, STORE IT
\r
804 \fSUBTTL EXPRESSION EVALUATOR
\r
805 CV== AC0 ;CURRENT VALUE
\r
806 PV== AC1 ;PREVIOUS VALUE
\r
807 RC== RC ;CURRENT RELOCATABILITY
\r
808 PR== AC2 ;PREVIOUS RELOCATABILITY
\r
809 CS= CS ;CURRENT STATUS
\r
810 PS== SDEL ;PREVIOUS STATUS
\r
812 EVALHA: TLO FR,TMPSW
\r
813 EVALCM: PUSHJ PP,EVALEX ;EVALUATE FIRST EXPRESSION
\r
814 PUSH PP,[0] ;MARK PDL
\r
815 JUMPCM EVALC3 ;JUMP IF COMMA
\r
816 TLO IO,IORPTC ;IT'S NOT,SO REPEAT
\r
817 JRST OP ;PROCESS IN OP
\r
819 IFN FORMSW,<PUSH PP,INFORM ;PUT FORM WORD ON STACK>
\r
820 PUSH PP,[0] ;STORE ZERO'S ON PDL
\r
821 PUSH PP,[0] ;.......
\r
822 MOVSI AC2,(POINT 4,(PP),12)
\r
823 JRST OP1B ;PROCESS IN OP
\r
825 EVALEX: TLO IO,FLDSW
\r
826 PUSH PP,[XWD TNODE,0] ;MARK THE LIST 200000,,0
\r
828 EVATOM: PUSHJ PP,ATOM ;GET THE NEXT ATOM
\r
829 JUMPE AC0,EVGETD ;TEST FOR NULL/ZERO
\r
830 TLOE IO,NUMSW ;SET NUMERIC, WAS IT PREVIOUSLY?
\r
831 JRST EVGETD+1 ;YES, TREAT ACCORDINGLY
\r
832 PUSHJ PP,SEARCH ;SEARCH FOR MACRO OR SYMBOL
\r
833 JRST EVOP ;NOT FOUND, TRY FOR OP-CODE
\r
834 JUMPL ARG,.+2 ;SKIP IF OPERAND
\r
835 PUSHJ PP,SSRCH1 ;OPERATOR, TRY FOR SYMBOL (OPERAND)
\r
836 PUSHJ PP,QSRCH ;PERFORM CROSS-REFERENCE
\r
837 JUMPG ARG,EVMAC ;BRANCH IF OPERATOR
\r
838 MOVE AC0,V ;SYMBOL, SET VALUE
\r
839 JRST EVTSTS ;TEST STATUS
\r
841 EVMAC: TLNE FR,NEGSW ;UNARY MINUS?
\r
842 JRST EVERRZ ;YES, INVALID BEFORE OPERATOR
\r
843 LDB SDEL,[POINT 3,ARG,5] ;GET MACF/OPDF/SYNF
\r
844 SOJL SDEL,EVERRZ ;ERROR IF NO FLAGS
\r
846 JUMPE C,.+2 ;NON-BLANK?
\r
847 TLO IO,IORPTC ;YES, REPEAT CHARACTER
\r
848 SOJE SDEL,CALLM ;MACRO IF 2
\r
849 JUMPG SDEL,EVOPS ;SYNONYM IF 4
\r
852 MOVEI V,OP ;SET TRANSFER VECTOR
\r
854 \fEVOP: TLNE FR,NEGSW ;OPCODE, UNARY MINUS?
\r
855 JRST EVERRZ ;YES, ERROR
\r
857 PUSHJ PP,OPTSCH ;SEARCH SYMBOL TABLE
\r
858 JRST EVOPX ;NOT FOUND
\r
859 EVOPS: TRZ V,LITF ;CLEAR LIT INVALID FLAG
\r
860 TRZE V,ADDF ;SYNONYM
\r
861 JRST EVOPX ;PSEUDO-OP THAT GENERATES NO DATA JUMPS
\r
863 EVOPD: JUMPE C,.+2 ;OPDEF, NON-BLANK DELIMITER?
\r
864 TLO IO,IORPTC ;YES, REPEAT CHARACTER
\r
875 EVOPX: MOVSI ARG,SYMF!UNDF
\r
877 EVERRZ: SETZB AC0,RC ;CLEAR CODE AND RELOCATION
\r
878 EVERRU: TRO ER,ERRU
\r
880 \fEVTSTS: TLNE ARG,UNDF
\r
881 JRST [TRO ER,ERRU ;SET UNDEF ERROR
\r
882 JUMP1 EVGETD ;TREAT AS UNDF ON PASS1
\r
883 JRST .+1] ;TREAT AS EXTERNAL ON PASS2
\r
886 HRRZ RC,ARG ;GET ADRES WFW
\r
887 HRRZ ARG,EXTPNT ;SAVE IT WFW
\r
888 HRRM RC,EXTPNT ;WFW
\r
893 EVTSTR: TLNE ARG,MDFF ;MULTIPLY DEFINED?
\r
894 TRO ER,ERRD ;YES, FLAG IT
\r
895 TLNE FR,NEGSW ;NEGATIVE ATOM?
\r
896 PUSHJ PP,GETDE2 ;YES, NEGATE AC0 AND RC
\r
898 EVGETD: TLNE IO,NUMSW ;NON BLANK FIELD
\r
899 TLO FR,FSNSW ;YES,SET FLAG
\r
901 TLNE CS,6 ;ALPHA-NUMERIC?
\r
902 TLO IO,IORPTC ;YES, REPEAT IT
\r
903 EVNUM: POP PP,PS ;POP THE PREVIOUS DELIMITER/TNODE
\r
905 CAMGE PS,CS ;OPERATION REQUIRED?
\r
906 JRST EVPUSH ;NO, PUT VALUES BACK ON STACK
\r
907 TLNN PS,TNODE ;YES, HAVE WE REACHED TERMINAL NODE?
\r
908 JRST EVXCT ;NO, EXECUTION REQUIRED
\r
909 TLNN CS,170000 ;YES, ARE WE POINTING AT DEL? (& ! * / + - ?)
\r
910 POPJ PP, ;YES, EXIT
\r
911 ;NO,FALL INTO EVPUSH
\r
913 \fEVPUSH: PUSH PP,PS ;STACK VALUES
\r
917 JRST EVATOM ;GET NEXT ATOM
\r
919 EVXCT: POP PP,PR ;POP PREVIOUS RELOCATABILITY
\r
920 POP PP,PV ;AND PREVIOUS VALUE
\r
921 LDB PS,[POINT 3,PS,29] ;TYPE OF OPERATION TO PS
\r
922 JRST .+1(PS) ;PERFORM PROPER OPERATION
\r
923 JRST ASSEM1 ;0; SHOULD NEVER GET HERE ;DMN
\r
929 TDOA CV,PV ;6; MERGE PV INTO CV
\r
930 AND CV,PV ;7; AND PV INTO CV
\r
931 JUMPN RC,.+2 ;COMMON RELOCATION TEST
\r
932 EVXCT1: JUMPE PR,EVNUM
\r
933 TRO ER,ERRR ;BOTH MUST BE FIXED
\r
934 JRST EVNUM ;GO TRY AGAIN
\r
944 XDIV: IDIV PR,CV ;CORRECT RELOCATABILITY
\r
946 XDIV1: EXCH PR,RC ;TAKE RELOCATION OF NUMERATOR
\r
949 XMUL: JUMPE PR,XMUL1 ;AT LEAST ONE OPERAND
\r
950 JUMPE RC,XMUL1 ;MUST BE FIXED
\r
952 XMUL1: IORM PR,RC ;GET RELOCATION TO RC
\r
953 CAMGE PV,CV ;FIND THE GREATER
\r
954 EXCH PV,CV ;FIX IN CASE CV=0,OR 1
\r
962 \f SUBTTL LITERAL STORAGE HANDLER
\r
965 IFE FORMSW,< SETZB AC0,RC ;ERROR, NO CODE STORED
\r
966 PUSHJ PP,STOW ;STOW ZERO>
\r
967 IFN FORMSW,< MOVEI AC0,0
\r
969 TRO ER,ERRL ;AND FLAG THE ERROR
\r
971 STOLIT: MOVE SDEL,STPX
\r
972 SUB SDEL,STPY ;COMPUTE NUMBER OF WORDS
\r
973 JUMPE SDEL,STOLER ;ERROR IF NONE STORED
\r
974 TRNN ER,ERRORS ;ANY ERRORS?
\r
976 JUMP2 STOL22 ;YES, NO SEARCH. BRANCH IF PASS2
\r
977 ADDM SDEL,LITCNT ;PASS ONE, UPDATE COUNT
\r
978 JRST STOWI ;INITIALIZE STOW
\r
980 STOL06: MOVEI SX,LITAB ;PREPARE FOR SEARCH
\r
981 MOVE ARG,STPX ;SAVE IN THE EVENT OF MULTIPLE-WORD
\r
985 STOL08: PUSHJ PP,DSTOW ;GET VALUE WFW
\r
987 STOL10: SOJL AC2,STOL24 ;TEST FOR END
\r
988 MOVE SX,0(SX) ;NO, GET NEXT STORAGE CELL
\r
989 MOVE V,-1(SX) ;GET RELOCATION BITS WFW
\r
990 CAMN AC0,-2(SX) ;DO CODES COMPARE? WFW
\r
991 CAME RC,V ;YES, HOW ABOUT RELOCATION?
\r
992 AOJA SDEL,STOL10 ;NO, TRY AGAIN
\r
993 SKIPGE STPX ;YES, MULTI-WORD?
\r
994 JRST STOL26 ;NO, JUST RETURN LOCATION
\r
995 MOVEM AC2,SAVBLK+AC2 ;YES, SAVE STARTING INFO
\r
998 STOL12: SOJL AC2,STOL23 ;TEST FOR END
\r
999 PUSHJ PP,DSTOW ;GET NEXT WORD WFW
\r
1000 MOVE SX,0(SX) ;UPDATE POINTER
\r
1001 MOVE V,-1(SX) ;GET RELOCATION WFW
\r
1002 CAMN AC0,-2(SX) ;COMPARE VALUE WFW
\r
1003 CAME RC,V ;AND RELOCATION
\r
1004 JRST STOL14 ;NO MATCH, TRY AGAIN
\r
1005 SKIPL STPX ;MATCH, HAVE WE FINISHED SEARCH?
\r
1006 JRST STOL12 ;NO, TRY NEXT WORD
\r
1007 JRST STOL26 ;YES, RETURN LOCATION
\r
1009 STOL14: MOVE AC2,SAVBLK+AC2 ;RESTORE STOW POINTERS
\r
1013 AOJA SDEL,STOL08 ;BETTER LUCK NEXT TIME
\r
1015 STOL22: MOVE SDEL,LITNUM
\r
1016 STOL23: PUSHJ PP,DSTOW ;DSTOW AND CONVERT
\r
1017 STOL24: MOVE SX,LITABX ;GET CURRENT STORAGE
\r
1018 PUSHJ PP,GETTOP ;GET NEXT CELL
\r
1019 MOVEM AC0,-2(SX) ;STORE CODE WFW
\r
1020 MOVEM RC,-1(SX) ;WFW
\r
1024 MOVEM SX,LITABX ;SET POINTER TO CURRENT CELL
\r
1025 AOS LITNUM ;INCREMENT NUMBER STORED
\r
1026 AOS LITCNT ;INCREMENT NUMBER RESERVED
\r
1027 SKIPL STPX ;ANY MORE CODE?
\r
1029 STOL26: JUMP1 POPOUT ;EXIT IF PASS ONE
\r
1030 MOVE SX,LITHDX ;GET HEADER BLOCK
\r
1031 HLRZ RC,-1(SX) ;GET BLOCK RELOCATION
\r
1033 ADDI AC0,0(SDEL) ;COMPUTE ACTUAL LOCATION
\r
1036 \fSUBTTL INPUT ROUTINES
\r
1037 GETCHR: PUSHJ PP,CHARAC ;GET ASCII CHARACTER
\r
1038 CAIL C,"A"+40 ;CHECK FOR LOWER CASE
\r
1040 JRST .+2 ;NOT LOWER CASE
\r
1042 TRZA C,100 ;CONVERT LOWER CASE TO SIXBIT
\r
1043 SUBI C,40 ;CONVERT TO SIXBIT
\r
1044 CAIG C,77 ;CHAR GREATER THAN SIXBIT?
\r
1045 JUMPGE C,GETCS ;TEST FOR VALID SIXBIT
\r
1046 ADDI C,40 ;BACK TO ASCII
\r
1047 CAIN C,HT ;CHECK FOR TAB
\r
1048 JRST GETCS2 ;MAKE IT LOOK LIKE SPACE
\r
1049 CAIG C,CR ;GREATER THAN CR
\r
1050 CAIG C,HT ;GREATER THAN TAB
\r
1051 JRST GETCS1 ;IS NOT FF,VT,LF OR CR
\r
1052 MOVEI C,EOL ;LINE OR FORM FEED OR V TAB
\r
1053 TLOA IO,IORPTC ;REPEAT CHARACTER
\r
1054 GETCS2: MOVEI C,0 ;BUT TREAT AS BLANK
\r
1055 GETCS: MOVE CS,CSTAT(C) ;GET STATUS BITS
\r
1058 GETCS1: JUMPE C,GETCS ;IGNORE NULS
\r
1059 TRC C,100 ;MAKE CHAR. VISIBLE
\r
1061 DPB CS,LBUFP ;PUT ? IN OUTPUT
\r
1062 PUSHJ PP,RSW2 ;ALSO MODIFIED CHAR.
\r
1063 TRO ER,ERRQ ;FLAG Q ERROR
\r
1064 JRST GETCHR ;BUT IGNORE CHAR.
\r
1066 CHARAC: TLZE IO,IORPTC ;REPEAT REQUESTED?
\r
1068 RSW0: JUMPN MRP,MREAD ;BRANCH IF TREE POINTER SET
\r
1070 RSW1: SKIPE RPOLVL ;ARE WE IN "REPEAT ONCE"?
\r
1072 RSW2: MOVE CS,LIMBO ;GET LAST CHAR.
\r
1073 MOVEM C,LIMBO ;STORE THIS CHAR. FOR RPTC
\r
1075 CAIE CS,CR ;YES,LAST CHAR. A CR?
\r
1077 HRROS LIMBO ;YES,FLAG
\r
1078 POPJ PP, ;AND EXIT
\r
1080 RSW3: TLNE IO,IOSALL ;MACRO SUPPRESS ALL?
\r
1081 JUMPN MRP,CPOPJ ;YES,DON'T LIST IN MACRO
\r
1082 SOSG CPL ;ANY ROOM IN THE IMAGE BUFFER?
\r
1083 PUSHJ PP,OUTPL ;NO, OUTPUT THE PARTIAL LINE
\r
1084 IDPB C,LBUFP ;YES, STORE IN PRINT AREA
\r
1086 POPJ PP, ;NO, EXIT
\r
1088 ANDCAM C,CPL ;MASK
\r
1089 CHARAX: HRRZ C,LIMBO ;GET LAST CHARACTER
\r
1092 CHARL: PUSHJ PP,CHARAC ;GET AND TEST 7-BIT ASCII
\r
1093 CAIG C,FF ;LINE OR FORM FEED OR VT?
\r
1096 SKIPE LITLVL ;IN LITERAL?
\r
1098 CHARL1: PUSHJ PP,SAVEXS ;SAVE REGISTERS
\r
1099 PUSHJ PP,OUTLIN ;DUMP THE LINE
\r
1100 JRST RSTRXS ;RESTORE REGISTERS AND EXIT
\r
1101 \fSUBTTL CHARACTER STATUS TABLE
\r
1103 DEFINE GENCS (OPLVL,ATOM,AN,SQUOZ,OPTYPE,SEQNO)
\r
1104 <BYTE (6)OPLVL (9)ATOM (3)AN (6)SQUOZ,OPTYPE,SEQNO>
\r
1106 ;OPLVL PRIORITY OF BINARY OPERATORS
\r
1107 ;ATOM INDEX TO JUMP TABLE AT CELL1
\r
1108 ;AN TYPE OF CHARACTER
\r
1109 ; 1=OTHER, 2=ALPHA, 4=NUMERIC
\r
1110 ;SQUOZ VALUE IN RADIX 50
\r
1111 ;OPTYPE INDEX TO JUMP TABLE AT EVXCT
\r
1112 ;SEQNO VALUE IN SIXBIT
\r
1114 GENCS 00,00,1,00,00,00 ; ' '
\r
1115 GENCS 04,12,1,00,06,01 ; '!'
\r
1116 GENCS 00,07,1,00,00,02 ; '"'
\r
1117 GENCS 00,12,1,00,00,03 ; '#'
\r
1118 GENCS 00,01,2,46,00,04 ; '$'
\r
1119 GENCS 00,01,2,47,00,05 ; '%'
\r
1120 GENCS 04,12,1,00,07,06 ; '&'
\r
1121 GENCS 00,07,1,00,00,07 ; '''
\r
1123 GENCS 00,01,1,00,00,10 ; '('
\r
1124 GENCS 00,01,1,00,00,11 ; ')'
\r
1125 GENCS 02,12,1,00,01,12 ; '*'
\r
1126 GENCS 01,00,1,00,03,13 ; '+'
\r
1127 GENCS 40,01,1,00,00,14 ; ','
\r
1128 GENCS 01,02,1,00,04,15 ; '-'
\r
1129 GENCS 00,11,2,45,00,16 ; '.'
\r
1130 GENCS 02,12,1,00,02,17 ; '/'
\r
1132 GENCS 00,04,4,01,00,20 ; '0'
\r
1133 GENCS 00,04,4,02,00,21 ; '1'
\r
1134 GENCS 00,04,4,03,00,22 ; '2'
\r
1135 GENCS 00,04,4,04,00,23 ; '3'
\r
1136 GENCS 00,04,4,05,00,24 ; '4'
\r
1137 GENCS 00,04,4,06,00,25 ; '5'
\r
1138 GENCS 00,04,4,07,00,26 ; '6'
\r
1139 GENCS 00,04,4,10,00,27 ; '7'
\r
1141 GENCS 00,04,4,11,00,30 ; '8'
\r
1142 GENCS 00,04,4,12,00,31 ; '9'
\r
1143 GENCS 00,12,1,00,00,32 ; ':'
\r
1144 GENCS 00,01,1,00,00,33 ; ';'
\r
1145 GENCS 00,05,1,00,00,34 ; '<'
\r
1146 GENCS 00,12,1,00,00,35 ; '='
\r
1147 GENCS 00,01,1,00,00,36 ; '>'
\r
1148 GENCS 00,12,1,00,00,37 ; '?'
\r
1149 \f GENCS 00,03,1,00,00,40 ; '@'
\r
1150 GENCS 00,01,2,13,00,41 ; 'A'
\r
1151 GENCS 00,01,2,14,00,42 ; 'B'
\r
1152 GENCS 00,01,2,15,00,43 ; 'C'
\r
1153 GENCS 00,01,2,16,00,44 ; 'D'
\r
1154 GENCS 00,01,2,17,00,45 ; 'E'
\r
1155 GENCS 00,01,2,20,00,46 ; 'F'
\r
1156 GENCS 00,01,2,21,00,47 ; 'G'
\r
1158 GENCS 00,01,2,22,00,50 ; 'H'
\r
1159 GENCS 00,01,2,23,00,51 ; 'I'
\r
1160 GENCS 00,01,2,24,00,52 ; 'J'
\r
1161 GENCS 00,01,2,25,00,53 ; 'K'
\r
1162 GENCS 00,01,2,26,00,54 ; 'L'
\r
1163 GENCS 00,01,2,27,00,55 ; 'M'
\r
1164 GENCS 00,01,2,30,00,56 ; 'N'
\r
1165 GENCS 00,01,2,31,00,57 ; 'O'
\r
1167 GENCS 00,01,2,32,00,60 ; 'P'
\r
1168 GENCS 00,01,2,33,00,61 ; 'Q'
\r
1169 GENCS 00,01,2,34,00,62 ; 'R'
\r
1170 GENCS 00,01,2,35,00,63 ; 'S'
\r
1171 GENCS 00,01,2,36,00,64 ; 'T'
\r
1172 GENCS 00,01,2,37,00,65 ; 'U'
\r
1173 GENCS 00,01,2,40,00,66 ; 'V'
\r
1174 GENCS 00,01,2,41,00,67 ; 'W'
\r
1176 GENCS 00,01,2,42,00,70 ; 'X'
\r
1177 GENCS 00,01,2,43,00,71 ; 'Y'
\r
1178 GENCS 00,01,2,44,00,72 ; 'Z'
\r
1179 GENCS 00,06,1,00,00,73 ; '['
\r
1180 GENCS 00,12,1,00,00,74 ; '\'
\r
1181 GENCS 00,01,1,00,00,75 ; ']'
\r
1182 GENCS 00,10,1,00,00,76 ; '?'
\r
1183 GENCS 10,12,1,00,05,77 ; '?'
\r
1184 \fSUBTTL LISTING ROUTINES
\r
1186 OUTLIN: TRNN ER,ERRORS-ERRQ ;ANY ERRORS?
\r
1187 TLNE FR,ERRQSW ;NO, IGNORE Q ERRORS?
\r
1188 TRZ ER,ERRQ ;YES, YES, ZERO THE Q ERROR
\r
1189 HRLZ AC0,ER ;PUT ERROR FLAGS IN AC0 LEFT
\r
1191 JUMP1 OUTL30 ;BRANCH IF PASS ONE
\r
1192 JUMPN AC0,OUTL02 ;JUMP IF ANY ERRORS TO FORCE PRINTING
\r
1193 SKIPL STPX ;SKIP IF NO CODE, OTHERWISE
\r
1195 TLNN IO,IOSALL ;YES,SUPPRESS ALL?
\r
1197 JUMPN MRP,CPOPJ ;YES,EXIT IF IN MACRO
\r
1198 LDB C,[XWD 350700,LBUF]
\r
1199 CAIE C,15 ;FIRST CHAR CR?
\r
1200 OUTL01: TLZ IO,IOMAC ;FORCE MACRO PRINTING
\r
1201 OUTL03: TLNN IO,IOMSTR!IOPROG!IOMAC
\r
1202 OUTL02: IOR ER,OUTSW ;FORCE IT.
\r
1203 IDPB AC0,LBUFP ;STORE ZERO TERMINATOR AFTER ASCII SRC LINE
\r
1204 TLNN FR,CREFSW ;CREF?
\r
1205 PUSHJ PP,CLSCRF ;YES, WRITE END OF CREF DATA (177,003)
\r
1206 JUMPE AC0,OUTL20 ;BRANCH IF NO ERRORS
\r
1207 TLZE AC0,ERRM ;M ERROR?
\r
1208 TLO AC0,ERRP ;M ERROR SET - SET P ERROR.
\r
1209 PUSHJ PP,OUTLER ;PROCESS ERRORS
\r
1211 OUTL20: SKIPN RC,ASGBLK
\r
1213 SKIPL STPX ;ANY BINARY?
\r
1214 JRST OUTL23 ;YES, JUMP
\r
1215 JUMPE RC,OUTL22 ;SEQUENCE BREAK AND NO BINARY JUMPS
\r
1216 ILDB C,TABP ;ASSIGNMENT FALLS THROUGH
\r
1217 PUSHJ PP,OUTL ;OUTPUT A TAB.
\r
1218 ILDB C,TABP ;OUTPUT 2ND TAB, LOCATION FIELD
\r
1219 PUSHJ PP,OUTC ;NEXT IS BINARY LISTING FIELD
\r
1220 HLLO CS,LOCBLK ;LEFT HALF OF A 36BIT VALUE
\r
1221 JUMPL RC,.+2 ;SKIP IF LEFT HALF IS NOT RELOC
\r
1222 TRZA CS,1 ;IT IS, SET THE FLAG
\r
1223 TLNE CS,-1 ;SKIP IF ITS A 18BIT VALUE, OTHERWISE
\r
1224 PUSHJ PP,ONC1 ;PRINT LH OF A 36 BIT VALUE IN CS
\r
1225 HRLO CS,LOCBLK ;PICK UP THE RIGHT HALF (18BIT VALUE)
\r
1227 PUSHJ PP,ONC ;PRINT IT
\r
1228 JRST OUTL23 ;SKIP SINGLE QUOTE TEST
\r
1229 \fOUTL22: PUSHJ PP,ONC ;TAB TO RH AND PRINT IT
\r
1233 OUTL23: SKIPL STPX ;ANY BINARY?
\r
1234 PUSHJ PP,BOUT ;YES, DUMP IT
\r
1235 MOVE CS,@OUTLI2 ;[POINT 7,LBUF]
\r
1241 PUSHJ PP,OUTASC ;OUTPUT TABS
\r
1242 OUTL25: MOVEI CS,LBUF
\r
1243 PUSHJ PP,OUTAS0 ;DUMP THE LINE
\r
1244 TLNE IO,IOSALL ;SUPPRESSING ALL
\r
1245 JUMPN MRP,OUTL27 ;YES,EXTRA CR IF IN MACRO
\r
1246 OUTL26: SKIPGE STPX ;ANY BINARY?
\r
1247 JRST OUTLI ;NO, CLEAN UP AND EXIT
\r
1248 PUSHJ PP,OUTLI2 ;YES, INITIALIZE FOR NEXT LINE
\r
1249 PUSHJ PP,BOUT ;YES, DUMP IT
\r
1250 OUTL27: PUSHJ PP,OUTCR ;OUTPUT CARRIAGE RETURN
\r
1251 JRST OUTL26 ;TEST FOR MORE BINARY
\r
1253 OUTPL: SKIPN LITLVL ;IF IN LITERAL
\r
1254 SKIPL STPX ;OR CODE GENERATED
\r
1255 JRST OUTIM ;JUST OUTPUT THE IMAGE
\r
1256 SKIPN ASGBLK ;SKIP IF AN ASSIGNMENT
\r
1257 JRST OUTIM ;OTHERWISE OUTPUT IMAGE
\r
1258 PUSH PP,C ;SAVE CHAR.
\r
1262 IDPB C,LBUFP ;FINISH WITH CRLF
\r
1263 PUSHJ PP,OUTLIN ;OUTPUT PARTIAL LINE
\r
1264 POP PP,C ;RESTORE CHAR.
\r
1265 JRST OUTLI2 ;INITIALISE REST OF LINE
\r
1266 \fOUTL30: AOS CS,STPX ;PASS ONE
\r
1267 ADDM CS,LOCO ;INCREMENT OUTPUT LOCATION
\r
1268 PUSHJ PP,STOWI ;INITIALIZE STOW
\r
1269 TLZ AC0,ERRORS-ERRM-ERRP-ERRV
\r
1270 JUMPN AC0,OUTL32 ;JUMP IF ERRORS
\r
1271 TLNE IO,IOSALL ;SUPPRESSING ALL/
\r
1272 JUMPN MRP,CPOPJ ;YES,EXIT
\r
1273 JRST OUTLI1 ;NO,INIT LINE
\r
1275 OUTL32: IDPB AC0,LBUFP ;ZERO TERNIMATOR
\r
1276 IOR ER,OUTSW ;LIST ERRORS
\r
1278 PUSHJ PP,OUTSIX ;OUTPUT TAG
\r
1280 PUSHJ PP,DNC ;CONVERT INCREMENT TO DECIMAL
\r
1281 PUSHJ PP,OUTTAB ;OUTPUT TAB
\r
1282 PUSHJ PP,OUTLER ;OUTPUT ERROR FLAGS
\r
1284 MOVEI CS,SEQNO ;ADDRESS OF SEQUENCE NO.
\r
1285 SKIPE SEQNO ;FILE NOT SEQUENCED
\r
1286 PUSHJ PP,OUTAS0 ;OUTPUT IT
\r
1287 JRST OUTL25 ;OUTPUT BASIC LINE
\r
1289 OUTLER: PUSH PP,ER ;SAVE LISTING SWITCHES FOR LATER
\r
1290 TRNE ER,TTYSW ;IF THIS IS ON, LISTING IS ON TTY
\r
1291 TRZ ER,ERRORS ;SO SUPPRESS ON TTY
\r
1292 TDZ ER,OUTSW ;BUT THIS SHOULD ONLY GO TO THE TTY
\r
1293 MOVE CS,INDIR ;GET FILE NAME
\r
1294 CAME CS,LSTFIL ;AND SEE IF SAME
\r
1295 JRST [MOVEM CS,LSTFIL ;SAVE AS LAST ONE
\r
1297 PUSHJ PP,OUTSIX ;LIST NAME
\r
1300 MOVE CS,PAGENO ;PRINT PAGE NUMBER TOO
\r
1302 MOVE CS,PAGENO ;NOW CHECK PAGE NUMBER
\r
1304 OUTLE8: JRST [MOVEM CS,LSTPGN
\r
1305 MOVEI CS,[ASCIZ /PAGE /]
\r
1309 PUSHJ PP,OUTCR ;AND NOW FOR THE ERROR LINE
\r
1311 HLLM ER,(PP) ;RESTORE ER BUT NOT IO (LEFT HALF OF AC)
\r
1313 MOVE CS,[POINT 7,[ASCII / QXADLRUVNOPEM/]]
\r
1314 OUTLE2: ILDB C,CS ;GET ERROR MNEMONIC
\r
1315 JUMPGE AC0,OUTLE4 ;BRANCH IF NOT FLAGGED
\r
1316 PUSHJ PP,OUTL ;OUTPUT THE CHARACTER
\r
1317 AOS ERRCNT ;INCREMENT ERROR COUNT
\r
1318 OUTLE4: LSH AC0,1 ;SHIFT NEXT FLAG INTO SIGN BIT
\r
1319 \f JUMPN AC0,OUTLE2 ;TEST FOR END
\r
1321 \fOUTIM1: TLOA FR,IOSCR ;SUPPRESS CRLF AFTER LINE
\r
1322 OUTIM: TLZ FR,IOSCR ;DON'T FOR PARTIAL LINE
\r
1323 TLNE IO,IOSALL ;SUPPRESSING ALL?
\r
1324 JUMPN MRP,CPOPJ ;YES ,EXIT IF IN MACRO
\r
1325 JUMP1 OUTLI1 ;BYPASS IF PASS ONE
\r
1328 TLNN IO,IOMSTR!IOPROG!IOMAC
\r
1330 PUSH PP,C ;OUTPUT IMAGE
\r
1333 OUTIM2: MOVE CS,TABP
\r
1334 PUSHJ PP,OUTASC ;OUTPUT TABS
\r
1335 IDPB C,LBUFP ;STORE ZERO TERMINATOR
\r
1337 PUSHJ PP,OUTAS0 ;OUTPUT THE IMAGE
\r
1338 TLZN FR,IOSCR ;CRLF SUPPRESS?
\r
1339 PUSHJ PP,OUTCR ;NO,OUTPUT
\r
1345 OUTLI: TLNE IO,IOSALL ;SUPPRESSING ALL
\r
1346 JUMPN MRP,OUTLI3 ;YES,SET FLAG IN REPEATS ALSO
\r
1347 TLNE IO,IOPALL ;MACRO EXPANSION SUPRESS REQUESTED?
\r
1348 SKIPN MACLVL ;YES, ARE WE IN MACRO?
\r
1349 TLZA IO,IOMAC ;NO, CLEAR MAC FLAG
\r
1350 OUTLI3: TLO IO,IOMAC ;YES, SET FLAG
\r
1352 OUTLI1: TRZ ER,ERRORS!LPTSW!TTYSW
\r
1353 OUTLI2: MOVE CS,[POINT 7,LBUF] ;INITIALIZE BUFFERS
\r
1355 IFN FORMSW,<MOVE CS,[POINT 7,TABI]
\r
1356 MOVSS HWFMT ;PUT FLAG IN LEFT HALF
\r
1357 SKIPGE HWFMT ;BUT IF ONLY HALF-WORD FORMAT>
\r
1358 MOVE CS,[POINT 7,TABI,6]
\r
1361 IFN FORMSW,<SKIPL HWFMT ;IF MULTI-FORMAT
\r
1362 SUBI CS,8 ;LINE IS ONE TAB SHORTER
\r
1363 MOVSS HWFMT ;BACK AS IT WAS>
\r
1365 MOVSI CS,(ASCII / /)
\r
1366 SKIPE SEQNO ;HAVE WE SEQUENCE NUMBERS?
\r
1367 MOVEM CS,SEQNO ;YES, STORE TAB IN CASE OF MACRO
\r
1368 MOVEM CS,SEQNO+1 ;STORE TAB AND TERMINATOR
\r
1372 \fOUTIML: TLNE IO,IOSALL ;SUPPRESSING ALL?
\r
1373 JUMPN MRP,CPOPJ ;YES,EXIT IF IN MACRO
\r
1374 TRNN ER,ERRORS-ERRQ ;FOR LITERALS (MULIT-LINE) OUTPUT ERRORS
\r
1378 JUMP1 OUTML1 ;CHECK PASS1 ERRORS
\r
1381 PUSH PP,[0] ;ERRORS SHOULD BE ZEROED
\r
1383 PUSH PP,AC0 ;SAVE AC0 IN CASE CALLED FROM ASCII
\r
1384 MOVE AC0,CS ;ERROR ROUTINE WANTS FLAGS IN AC0
\r
1387 PUSHJ PP,CLSCRF ;FIX CREF
\r
1390 PUSHJ PP,OUTLER ;OUTPUT THEM
\r
1392 JRST OUTIM2 ;AND LINE
\r
1394 OUTML1: TLZ CS,ERRORS-ERRM-ERRP-ERRV
\r
1395 JUMPE CS,OUTLI2 ;NONE
\r
1396 TRZ ER,ERRM!ERRP!ERRV
\r
1399 PUSH PP,C ;SAVE THIS
\r
1400 PUSH PP,AC0 ;AS ABOVE
\r
1409 PUSHJ PP,OUTLER ;DO NOT FORGET ERRORS
\r
1411 MOVEI CS,LBUF ;PRINT REST OF LINE
\r
1417 \fSUBTTL OUTPUT ROUTINES
\r
1418 UOUT: PUSHJ PP,LOOKUP ;SET FOR TABLE SCAN
\r
1419 TRNN ARG,PNTF ;WFW
\r
1421 JRST UOUT13 ;TEST FOR UNDF!EXTF!PNTF ON PASS2
\r
1423 TLNN IO,IOIOPF ;ANY IOP'S SEEN
\r
1424 JRST UOUT12 ;NO,MAKE EXTERNAL
\r
1425 MOVSI CS,PRMTBL-PRMEND;YES LOOKUP IN TABLE
\r
1426 UOUT1: CAME AC0,PRMTBL(CS) ;HAVE WE A MATCH?
\r
1427 AOBJN CS,UOUT2 ;NO,INCREMENT AND JUMP
\r
1428 MOVE ARG,PRMTBL+1(CS);YES,GET VALUE
\r
1429 MOVEM ARG,(SX) ;UPDATE SYMBOL TABLE
\r
1431 UOUT2: AOBJN CS,UOUT1 ;TEST FOR END
\r
1433 UOUT12: PUSHJ PP,EXTER2 ;MAKE IT EXTERNAL
\r
1434 MOVSI ARG,UNDF ;BUT PUT UNDF BACK ON
\r
1435 IORM ARG,(SX) ;SO MESSAGE WILL COME OUT
\r
1436 POPJ PP, ;GET NEXT SYMBOL
\r
1438 UOUT13: JUMP1 CPOPJ ;RECYCLE ON PASS1
\r
1439 TRC ARG,UNDF!EXTF!PNTF ;CHECK FOR ALL THREE ON
\r
1440 TRCE ARG,UNDF!EXTF!PNTF ;ARE THEY?
\r
1441 POPJ PP, ;NO, RECYCLE
\r
1442 UOUT10: PUSHJ PP,OUTCR
\r
1443 PUSHJ PP,OUTSYM ;OUTPUT THE SYMBOL
\r
1444 MOVEI CS,[SIXBIT /UNASSIGNED, DEFINED AS IF EXTERNAL @/]
\r
1445 JRST OUTSIX ;POPJ FOR NEXT SYMBOL
\r
1447 UOUT30: PUSHJ PP,ONC1 ;OUTPUT THE LOCATION
\r
1448 JRST HIGHQ ;EXIT THROUGH HIGHQ
\r
1449 \f ;OUTPUT THE ENTRIES
\r
1451 EOUT: MOVEI C,0 ;INITIALIZE THE COUNT
\r
1454 EOUT1: SOJL SDEL,EOUT2 ;TEST FOR END
\r
1457 ANDCAI ARG,SYMF!INTF!ENTF
\r
1458 JUMPN ARG,EOUT1 ;IF INVALID, DON'T COUNT
\r
1459 AOJA C,EOUT1 ;BUMP COUNT
\r
1461 EOUT2: HRLI C,4 ;BLOCK TYPE 4
\r
1469 EOUT3: SOJL SDEL,POPOUT
\r
1472 ANDCAI C,SYMF!INTF!ENTF
\r
1474 SOJGE V,EOUT4 ;TEST END OF BLOCK
\r
1477 EOUT4: MOVE AC0,-1(SX)
\r
1482 \f ;OUTPUT THE SYMBOLS
\r
1484 SOUT: SKIPN IONSYM ;SKIP IF NOSYM SEEN
\r
1485 TRNN ER,LPTSW!TTYSW ;A LISTING REQUIRED?
\r
1487 MOVEI [ASCIZ /SYMBOL TABLE/]
\r
1488 HRRM SUBTTX ;SET NEW SUB-TITLE
\r
1489 PUSHJ PP,OUTFF ;FORCE NEW PAGE
\r
1490 MOVEI ARG,NCOLS ;SET UP FOR NCOLS ACROSS SYMBOL TABLE
\r
1491 TRNE ER,TTYSW ;IS TTY LISTING DEVICE?
\r
1492 MOVEI ARG,2 ;YES,ONLY 2 COLLUMNS
\r
1493 MOVEM ARG,NCOLLS ;STORE ANSWER
\r
1495 PUSHJ PP,LOUT1 ;OUTPUT THEM
\r
1496 MOVE ARG,SYMCNT ;SEE IF WE ENDED EVEN
\r
1498 PUSHJ PP,OUTCR ;NO, NEED CR
\r
1499 JRST SOUT1 ;NOW FOR BLOCK TYPE 2
\r
1501 LOUT1: PUSHJ PP,LLUKUP ;SET FOR TABLE SCAN
\r
1503 TRNN ARG,MACF!SYNF
\r
1504 TDZA MRP,MRP ;SKIP AND CLEAR MRP
\r
1505 POPJ PP, ;NO, TRY AGAIN
\r
1509 MOVNI MRP,1 ;MRP=-1 FOR EXTERNAL
\r
1510 TRNE ARG,SYNF ;SYNONYM?
\r
1511 JUMPL MRP,POPOUT ;YES, DON'T OUTPUT IF EXTERNAL
\r
1512 TRNE ARG,SUPRBT ;IF SUPRESSED
\r
1513 ; JUMPGE MRP,POPOUT ;DO NOT OUTPUT UNLESS EXTERNAL
\r
1514 POPJ PP, ;DO NOT OUTPUT
\r
1515 AOS (PP) ;SET FOR SKIP RETURN IF SYMBOL IS PRINTED
\r
1516 JUMPGE MRP,LOUT10 ;BRANCH IF NOT EXTERNAL
\r
1517 HLRZ RC,V ;PUT POINTER/FLAGS IN RC
\r
1518 TRNE RC,-2 ;POINTER?
\r
1519 MOVS RC,0(RC) ;YES
\r
1520 HLL V,RC ;STORE LEFT VALUE
\r
1522 LOUT10: PUSH PP,RC ;SAVE FOR LATER
\r
1523 PUSHJ PP,OUTSYM ;OUTPUT THE NAME
\r
1524 MOVE RC,(PP) ;GET COPY
\r
1526 JUMPLE MRP,LOUT15 ;SET DEFFERRED BITS IF EXTERNAL
\r
1527 TLNE RC,-2 ;CHECK FOR LEFT FIXUP
\r
1528 IORI AC1,40 ;AND SET BITS
\r
1529 TRNE RC,-2 ;CHECK FOR RIGHT FIXUP
\r
1530 IORI AC1,20 ;AND SET BITS
\r
1531 LOUT15: TLNE RC,-2 ;FIX RELOC AS 0 IF EXTERNAL
\r
1539 TRNE ARG,ENTF ;ENTRY DMN
\r
1541 TRNE ARG,NOOUTF ;SUPRESS OUTPUT? WFW
\r
1542 ADDI MRP,3 ;YES WFW
\r
1543 TRNE ARG,UNDF ;UNDEFINED IS EXTERNAL
\r
1544 HRRI MRP,2 ;SO FLAG AS UXT
\r
1545 IOR AC1,SOUTC(MRP)
\r
1547 MOVEM AC0,SVSYM ;SAVE IT
\r
1548 MOVE AC0,V ;GET THE VALUE
\r
1549 HLRZ RC,MRP ;AND THE RELOCATION
\r
1551 TRNE RC,2 ;LEFT HALF RELOCATABLE?
\r
1552 TRZA CS,1 ;NO, FLAG AND PRINT
\r
1553 TLNE CS,-1 ;IS THE LEFT HALF ZERO?
\r
1554 PUSHJ PP,ONC1 ;NO, OUTPUT IT
\r
1555 LOUT11: PUSHJ PP,OUTTAB
\r
1557 TDZ CS,RC ;SET RELOCATION
\r
1560 POP PP,RC ;GET BACK RELOC AND CHECK EXTERNAL
\r
1561 LOUT60: MOVEI CS,SOUTC(MRP)
\r
1562 PUSHJ PP,OUTAS0 ;EXT/INT
\r
1563 SOSLE SYMCNT ;SEE IF WE HAVE RUN OUT
\r
1564 JRST OUTTAB ;NOT YET, PRINT ONE TAB
\r
1565 LOUT64: MOVE CS,NCOLLS ;YES, RESET
\r
1566 \f MOVEM CS,SYMCNT
\r
1567 JRST OUTCR ;CARRIAGE RETURN AND TRY FOR ANOTHER
\r
1570 \f SYN IFBLK,SYMBLK ;SOMEWHERE TO STORE THE POINTERS
\r
1572 LLUKUP: POP PP,LOOKX ;INTERCEPT RETURN POP
\r
1575 ADDI SX,2 ;SKIP COUNT OF SYMBOLS
\r
1576 LLUKP2: HRLI SX,-<.LPP-1> ;LENGTH OF PAGE
\r
1577 MOVE V,ARG ;COPY OF ARG
\r
1578 MOVEM SX,SYMBLK(V) ;STORE SYMBOL POINTER IN TABLE
\r
1579 ADDI SX,2*<.LPP-2> ;SYMBOLS PER PAGE
\r
1580 SOJG V,.-2 ;FOR ALL COLUMNS
\r
1587 JRST LLUKP7 ;ENTER LOOP
\r
1589 LLUKP1: MOVEM SX,SYMBLK(ARG) ;SAVE IT
\r
1594 JRST [MOVE ARG,SYMCNT
\r
1595 MOVEM SX,SYMBLK(ARG)
\r
1597 LLUKP7: SOJL SDEL,POPOUT ;TEST FOR END
\r
1598 LLUKP3: MOVE ARG,SYMCNT ;GET PAGE POSITION
\r
1599 MOVE SX,SYMBLK(ARG) ;GET NEXT POINTER
\r
1604 LLUKP6: PUSHJ PP,LOUT64 ;RESET SYMCNT
\r
1605 JUMPE SDEL,POPOUT ;EXIT IF ALL DONE
\r
1609 MOVEM SX,SYMBLK(ARG)
\r
1611 SKIPGE SYMBLK(V) ;TEST IF ALL FINISHED
\r
1613 SOJG V,.-2 ;KEEP GOING
\r
1615 MOVE SX,SYMBLK(SX)
\r
1616 HLRZ V,SX ;GET NUMBER ADVANCED
\r
1617 LSH V,1 ;2 WORDS PER SYMBOL
\r
1618 SUBI SX,2(V) ;BACK UP ONE SYMBOL
\r
1619 SKIPGE LPP ;IF PAGE FULL
\r
1620 JRST .+3 ;DON'T FINISH WITH EXTRA CR-LF
\r
1621 SETZM LPP ;ENSURE END OF PAGE
\r
1624 MOVEM ARG,SYMCNT ;JUST IN CASE
\r
1627 LLUKP5: SOSG SYMCNT ;ON LAST COL?
\r
1629 SKIPGE LPP ;IF PAGE FULL
\r
1630 JRST LLUKP3 ;NO MORE OUTPUT
\r
1631 REPEAT 2,<PUSHJ PP,OUTAB2> ;NO, TAB OUT TO NEXT COLUMN
\r
1633 \fSOUT1: PUSHJ PP,LOOKUP ;SET FOR TABLE SCAN
\r
1635 TRNN ARG,MACF!SYNF
\r
1636 TDZA MRP,MRP ;SKIP AND CLEAR MRP
\r
1637 POPJ PP, ;NO, TRY AGAIN
\r
1641 MOVNI MRP,1 ;MRP=-1 FOR EXTERNAL
\r
1642 TRNE ARG,SYNF ;SYNONYM?
\r
1643 JUMPL MRP,POPOUT ;YES, DON'T OUTPUT IF EXTERNAL
\r
1644 TRNE ARG,SUPRBT ;IF SUPRESSED
\r
1645 ; JUMPGE MRP,POPOUT ;DO NOT OUTPUT UNLESS EXTERNAL
\r
1646 POPJ PP, ;DO NOT OUTPUT
\r
1647 JUMPGE MRP,SOUT10 ;BRANCH IF NOT EXTERNAL
\r
1648 HLRZ RC,V ;PUT POINTER/FLAGS IN RC
\r
1649 TRNE RC,-2 ;POINTER?
\r
1650 MOVS RC,0(RC) ;YES
\r
1651 HLL V,RC ;STORE LEFT VALUE
\r
1653 SOUT10: PUSH PP,RC ;SAVE FOR LATER
\r
1655 JUMPLE MRP,SOUT15 ;SET DEFFERRED BITS IF EXTERNAL
\r
1656 TLNE RC,-2 ;CHECK FOR LEFT FIXUP
\r
1657 IORI AC1,40 ;AND SET BITS
\r
1658 TRNE RC,-2 ;CHECK FOR RIGHT FIXUP
\r
1659 IORI AC1,20 ;AND SET BITS
\r
1660 SOUT15: TLNE RC,-2 ;FIX RELOC AS 0 IF EXTERNAL
\r
1668 TRNE ARG,ENTF ;ENTRY DMN
\r
1670 TRNE ARG,NOOUTF ;SUPRESS OUTPUT? WFW
\r
1671 ADDI MRP,3 ;YES WFW
\r
1672 IOR AC1,SOUTC(MRP)
\r
1674 PUSHJ PP,NOUT2 ;SQUOZE AND DUMP THE SYMBOL
\r
1675 MOVEM AC0,SVSYM ;SAVE IT
\r
1676 MOVE AC0,V ;GET THE VALUE
\r
1677 HLRZ RC,MRP ;AND THE RELOCATION
\r
1679 POP PP,RC ;GET BACK RELOC AND CHECK EXTERNAL
\r
1680 TRNN RC,-2 ;IS IT?
\r
1682 MOVE AC0,1(RC) ;GET NAME
\r
1683 MOVEI ARG,60 ;EXTERNAL REQ
\r
1685 HLLZS RC ;NO RELOC
\r
1686 PUSHJ PP,COUT ;OUTPUT IT
\r
1687 MOVE AC0,SVSYM ;GET SYMBOL NAME
\r
1688 TLO AC0,500000 ;SET AS ADDITIVE SYMBOL
\r
1689 TLZ AC0,200000 ;BUT NOT LEFT HALF ETC
\r
1691 SOUT50: MOVSS RC ;CHECK LEFT HALF
\r
1704 SOUT20: PUSHJ PP,OUTAS0
\r
1707 <ASCII /ENT/>!04 ;DMN
\r
1710 <ASCII /SEN/>!44 ;SUPRESSED ENTRY
\r
1714 <ASCII /UXT/>!60 ;UNDEFINED EXTERNAL
\r
1716 <ASCII /SIN/>!44 ;DMN
\r
1717 \f ;OUTPUT THE BINARY
\r
1719 BOUT: HRLO CS,LOCO ;PICKUP THE LOCATION
\r
1720 PUSHJ PP,ONC ;OUTPUT IT TO THE LISTING FILE
\r
1722 SKIPE MODO ;IF MODE IS NOT ABSOLUTE
\r
1723 PUSHJ PP,OUTC ;PRINT A SINGLE QUOTE
\r
1724 PUSHJ PP,DSTOW ;GET THE CODE
\r
1725 PUSH PP,RC ;SAVE RELOC
\r
1726 PUSH PP,RC ;AND AGAIN
\r
1727 TLNE RC,-2 ;CHECK LEFT EXTERNAL
\r
1728 HRRZS RC ;MAKE LEFT NON-RELOC
\r
1729 TRNN RC,-2 ;RIGHT EXT?
\r
1732 JUMPE AC1,BOUT20 ;PROCESS IF ZERO CODE THERE
\r
1733 HLLZS RC ;MAKE NON-RELOC
\r
1734 JRST BOUT30 ;PROCESS
\r
1737 HRRM AC1,-1(PP) ;FIX RC IN STACK SO NO CONFUSION WFW (AC1 HAS 0)
\r
1738 HRR AC0,0(RC) ;NO, SET ADDRESS LINK
\r
1739 MOVE AC1,LOCO ;GET CURRENT LOCATION
\r
1740 HRRM AC1,0(RC) ;SET NEW LINK
\r
1741 HLRZ AC1,0(RC) ;GET FLAGS/POINTER
\r
1742 TRNN AC1,-2 ;POINTER?
\r
1743 HRR AC1,RC ;NO, SET TO FLAGS
\r
1744 HLR RC,0(AC1) ;PUT FLAGS IN RC
\r
1745 HRL AC1,MODO ;GET CURRENT MODE
\r
1746 TRZE RC,-2 ;LEFT HALF RELOCATABLE+
\r
1747 TLO AC1,2 ;YES, SET FLAG
\r
1748 HLLM AC1,0(AC1) ;STORE NEW FLAGS
\r
1749 BOUT30: HLLO CS,AC0
\r
1750 TLZE RC,1 ;PACK RELOCATION BITS
\r
1752 TRNE RC,2 ;LEFT HALF RELOCATABLE?
\r
1753 TRZ CS,1 ;YES, RESET BIT
\r
1754 PUSH PP,AC0 ;NEED AN AC
\r
1755 HLRZ AC0,-1(PP) ;AC0 = LEFT RELOCATION
\r
1756 CAILE AC0,1 ;EXTERNAL?
\r
1757 XORI CS,EXTF!1 ;YES, SET SWITCH
\r
1760 JUMPN AC0,BOUT3H ;EDIT IN HALF WORD FORMAT IF NOT 0
\r
1761 MOVE AC0,FORM ;GET FORM WORD
\r
1762 MOVEI C,0 ;ZERO FIELD SIZE
\r
1763 BOUT3A: JFFO AC0,BOUT3B ;AC1 = FIELD SIZE -1
\r
1764 JRST BOUT3C ;NO FIELDS LEFT, JUMP
\r
1765 BOUT3B: LSH AC0,1(AC1) ;SHIFT OFF FORM FIELD
\r
1767 IDIVI AC1,3 ;AC1 = COLUMNS USED + 1
\r
1768 ADDI C,(AC1) ;INCREMENT FIELD SIZE
\r
1769 CAIG C,?D23 ;IS FIELD SIZE GTR 23?
\r
1770 JRST BOUT3A ;NO. CONTINUE
\r
1771 MOVE AC1,HWFORM ;USE STANDARD FORM
\r
1773 MOVEI C,?D13 ;SET FIELD SIZE TO 13
\r
1774 BOUT3C: MOVEM C,FLDSIZ ;STORE FIELD SIZE
\r
1775 MOVE AC0,FORM ;AC0 = FORM WORD
\r
1776 TRNN RC,2 ;IS LEFT HALF RELOCATED?
\r
1777 CAMN AC0,HWFORM ;NO. IS FORM HALF WORD?
\r
1778 JRST BOUT3H ;YES. EDIT IN OLD WAY
\r
1779 CAMN AC0,IOFORM ;IS IT I/O WORD
\r
1780 SETOM IOSEEN ;YES,NEED MORE WORK
\r
1784 ILDB C,TABP ;GET A TAB
\r
1785 PUSHJ PP,OUTL ;OUTPUT IT
\r
1786 MOVE AC2,(PP) ;AC2 = INFO TO BE EDITED
\r
1787 PUSH PP,CS ;SAVE CS = C+1
\r
1788 BOUT3D: JFFO AC0,BOUT3E ;AC1 = FIELD LENGTH - 1
\r
1789 BOUT3E: LSH AC0,1(AC1) ;SHIFT OFF FORM FIELD
\r
1792 LSHC AC1,-2(C) ;AC1 = FIELD INFO
\r
1793 IDIVI C,3 ;C = # OF OCTAL DIGITS
\r
1794 MOVE C+1,AC0 ;SAVE AC0
\r
1795 SKIPE IOSEEN ;IS THIS A I/O INST.
\r
1796 PUSHJ PP,BOUT3J ;YES,SET FIELDS CORRECTLY
\r
1802 \fBOUT3F: MOVEI AC0,6 ;EDIT A DIGIT
\r
1805 PUSHJ PP,OUTC ;OUTPUT IT
\r
1807 SOJG C,BOUT3F ;IF MORE DIGITS, GO BACK
\r
1808 JUMPE C+1,BOUT3G ;JUMP IF END OF WORD
\r
1809 MOVE AC0,C+1 ;RESTORE AC0
\r
1811 PUSHJ PP,OUTC ;OUTPUT A SPACE
\r
1812 JRST BOUT3D ;PROCESS NEXT FIELD
\r
1814 BOUT3G: POP PP,CS ;RESTORE CS = C+1
\r
1816 TRNE RC,1 ;RELOCATABLE?
\r
1818 HRRZ AC0,-1(PP) ;AC0 = RIGHT RELOCATION
\r
1819 CAILE AC0,1 ;EXTERNAL?
\r
1821 PUSHJ PP,ONC2 ;STORE POSSIBLE INDICATOR
\r
1823 JRST BOUT3I ;CONTINUE
\r
1825 BOUT3H: MOVEI C,?D15 ;SET SIZE TO 15
\r
1828 POP PP,AC0 ;RESTORE
\r
1831 TDZ CS,RC ;SET RELOCATION
\r
1832 HRRZ C,(PP) ;C = RIGHT RELOCATION
\r
1833 CAILE C,1 ;EXTERNAL
\r
1834 XORI CS,EXTF!1 ;YES, SET SWITCH
\r
1836 BOUT3I: POP PP,CS ;GET RID OF ENTRY ON STACK
\r
1838 TLNE FR,RIMSW!RIM1SW!R1BSW ;RIM OUTPUT?
\r
1839 JRST ROUT ;YES, GO PROCESS
\r
1842 CAME CS,MODLOC ;SEQUENCE OR RELOCATION BREAK?
\r
1843 PUSHJ PP,COUTD ;YES, DUMP THE BUFFER
\r
1844 SKIPL COUTX ;NEW BUFFER?
\r
1845 JRST BOUT40 ;NO, STORE CODE AND EXIT
\r
1846 MOVEM CS,MODLOC ;YES, STORE NEW VALUES
\r
1849 PUSHJ PP,COUT ;STORE BLOCK LOCATION AND MODE
\r
1850 EXCH RC,MODO ;RESTORE CURRENT VALUES
\r
1853 \fBOUT40: PUSHJ PP,COUT ;EMIT CODE
\r
1854 POP PP,RC ;RETRIEVE EXTERNAL BITS
\r
1855 TRNN RC,-2 ;RIGHT EXTERNAL?
\r
1856 JRST BOUT50 ;TRY FOR LEFT
\r
1858 PUSH PP,BLKTYP ;TERMINATE TYPE AND SAVE
\r
1859 MOVEI AC0,2 ;BLOCK TYPE 2
\r
1861 MOVE AC0,1(RC) ;GET SYMBOL
\r
1862 MOVEI ARG,60 ;CODE BITS
\r
1863 PUSHJ PP,SQOZE ;CONVERT TO RADIX 50
\r
1864 HLLZS RC ;SYMBOL HAS NO RELOCATION
\r
1865 PUSHJ PP,COUT ;EMIT
\r
1866 MOVE AC0,LOCO ;GET CURRENT LOC
\r
1867 HRLI AC0,400000 ;ADDITIVE REQ
\r
1868 HRR RC,MODO ;CURRENT MODE
\r
1869 PUSHJ PP,COUT ;EMIT
\r
1870 MOVSS RC ;NOW FOR LEFT
\r
1874 BOUT50: MOVSS RC ;CHECK OTHER HALF
\r
1875 TRNN RC,-2 ;LEFT HALF EXTERNAL?
\r
1876 JRST BOUT80 ;NO, FALSE ALARM
\r
1877 PUSHJ PP,COUTD ;CHANGE MODE
\r
1881 BOUT70: MOVE AC0,1(RC)
\r
1887 HRLI AC0,600000 ;LEFT HALF ADD
\r
1889 PUSHJ PP,COUT ;EMIT
\r
1890 BOUT60: PUSHJ PP,COUTD ;CHANGE MODE
\r
1891 POP PP,BLKTYP ;TO OLD ONE
\r
1896 BOUT3J: MOVSS IOSEEN ;SWAP
\r
1897 SKIPGE IOSEEN ;SKIP IF NOT FIRST FIELD
\r
1898 JRST [HLLZS IOSEEN ;CLEAR RIGHT HALF
\r
1899 POPJ PP,] ;AND RETURN
\r
1900 MOVSS IOSEEN ;SWAP BACK
\r
1901 LSH AC1,2 ;CORRECT MNEMONIC AND OP CODE
\r
1902 CAIE C,1 ;IS IT OP CODE?
\r
1903 POPJ PP, ;NO,JUST RETURN
\r
1904 MOVEI C,2 ;TWO CHAR. WIDE NOW
\r
1905 SETZM IOSEEN ;DON'T COME AGAIN
\r
1908 \fNOUT: MOVE V,[POINT 7,TBUF] ;POINTER TO ASCII LINE
\r
1909 MOVSI CS,(POINT 6,AC0) ;POINTER TO SIXBIT AC0
\r
1911 NOUT1: ILDB C,V ;GET ASCII
\r
1915 TRZA C,100 ;LOWER CASE TO SIXBIT
\r
1916 SUBI C,40 ;CONVERT TO SIXBIT
\r
1917 JUMPLE C,NOUT3 ;TEST FORM NON-SIXBIT
\r
1918 CAILE C,77 ;AND NOT GREATER THAN SIXBIT
\r
1920 IDPB C,CS ;DEPOSIT IN AC0
\r
1921 TLNE CS,770000 ;TEST FOR SIX CHARACTERS
\r
1922 JRST NOUT1 ;NO, GET ANOTHER
\r
1923 NOUT3: SKIPGE UNIVSN ;IF A UNIVERSAL PROG
\r
1924 POPJ PP, ;RETURN TO PUT IT IN THE TABLE
\r
1927 NOUT2: PUSHJ PP,SQOZE ;CONVERT TO SIXBIT
\r
1928 JRST COUT ;DUMP AND EXIT
\r
1931 MOVEI RC,1 ;RELOCATABLE
\r
1933 PUSHJ PP,COUT ;OUTPUT THE HIGHEST LOCATION
\r
1935 ;PUT OUT ABS PORTION OF PROGRAM BREAK
\r
1936 SOJA RC,COUT ;OUTPUT A WORD OF ZERO AND EXIT
\r
1938 VOUT: SKIPN RC,VECREL ;IS VECTOR ABSOLUTE ZERO?
\r
1939 SKIPE VECTOR ;ALSO CHECK RELOCATION
\r
1941 POPJ PP, ;YES, EXIT
\r
1942 MOVE AC0,VECTOR ;AC0 SHOULD BE FLAGS
\r
1944 COUT: AOS C,COUTX ;INCREMENT INDEX
\r
1945 MOVEM AC0,COUTDB(C) ;STORE CODE
\r
1946 IDPB RC,COUTP ;STORE RELOCATION BITS
\r
1947 CAIE C,?D17 ;IS THE BUFFER FULL?
\r
1948 POPJ PP, ;NO, EXIT
\r
1950 COUTD: AOSG C,COUTX ;DUMP THE BUFFER
\r
1951 JRST COUTI ;BUFFER WAS EMPTY
\r
1952 HRL C,BLKTYP ;SET BLOCK TYPE
\r
1953 PUSHJ PP,OUTBIN ;OUTPUT COUNT AND TYPE
\r
1954 SETOB C,COUTY ;INITIALIZE INDEX
\r
1956 COUTD2: MOVE C,COUTDB(C) ;GET RELOCATION BITS/CODE
\r
1957 PUSHJ PP,OUTBIN ;DUMP IT
\r
1958 AOS C,COUTY ;INCREMENT INDEX
\r
1959 CAMGE C,COUTX ;TEST FOR END
\r
1960 JRST COUTD2 ;NO, GET NEXT WORD
\r
1962 COUTI: SETOM COUTX ;INITIALIZE BUFFER INDEX
\r
1963 SETZM COUTRB ;ZERO RELOCATION BITS
\r
1964 MOVE C,[POINT 2,COUTRB]
\r
1965 MOVEM C,COUTP ;INITIALIZE BIT POINTER
\r
1968 IFN FORMSW,< MOVE AC1,HWFORM ;USE STANDARD FORM>
\r
1971 IFN FORMSW,< MOVEM AC1,FORM ;STORE FORM WORD>
\r
1972 JUMP1 STOW20 ;SKIP TEST IF PASS ONE
\r
1973 TRNE RC,-2 ;RIGHT HALF ZERO OR 1?
\r
1974 PUSHJ PP,STOWT ;NO, HANDLE EXTERNAL
\r
1975 TLNN RC,-2 ;LEFT HALF ZERO OR 1? WFW
\r
1976 JRST STOW10 ;YES, SKIP TEST
\r
1977 MOVSS RC ;SWAP HALVES
\r
1978 PUSHJ PP,STOWT1 ;HANDLE EXTERNAL WFW
\r
1979 MOVSS RC ;RESTORE VALUES
\r
1981 STOW10: SKIPE EXTPNT ;ANY EXTERNALS REMAINING?
\r
1982 TRO ER,ERRE ;YES, SET EXTERNAL ERROR FLAG
\r
1984 STOW20: AOS AC1,STPX ;INCREMENT POINTER
\r
1985 MOVEM AC0,STCODE(AC1) ;STOW CODE
\r
1986 MOVEM RC,STOWRC(AC1) ;STOW RELOCATION BITS
\r
1989 POP PP,STFORM(AC1) ;STORE FORM WORD
\r
1991 SKIPN LITLVL ;ARE WE IN LITERAL?
\r
1992 AOS LOCA ;NO, INCREMENT ASSEMBLY LOCATION
\r
1993 CAIGE AC1,.STP-1 ;OVERFLOW?
\r
1994 POPJ PP, ;NO, EXIT
\r
1996 SKIPE LITLVL ;ARE WE IN A LITERAL?
\r
1997 TROA ER,ERRL ;YES, FLAG ERROR BUT DON'T DUMP
\r
1998 JRST CHARL1 ;NO, SAVE REGISTERS AND DUMP THE BUFFER
\r
1999 JRST STOWI ;INITIALIZE BUFFER
\r
2001 DSTOW: AOS AC1,STPY ;INCREMENT POINTER
\r
2002 MOVE AC0,STCODE(AC1) ;FETCH CODE
\r
2003 MOVE RC,STOWRC(AC1) ;FETCH RELOCATION BITS
\r
2005 PUSH PP,STFORM(AC1)
\r
2006 POP PP,FORM ;GET FORM WORD
\r
2008 CAMGE AC1,STPX ;IS THIS THE END?
\r
2009 POPJ PP, ;NO, EXIT
\r
2011 STOWI: SETOM STPX ;INITIALIZE FOR INPUT
\r
2012 SETOM STPY ;INITIALIZE FOR OUTPUT
\r
2015 \fSVSTOW: AOS LITLVL ;NESTED LITERALS
\r
2016 PUSH PP,STPX ;MAKE ROOM FOR ANOTHER
\r
2022 GTSTOW: POP PP,STPY ;BACK UP A LEVEL
\r
2028 STOWT: HRRZ AC1,EXTPNT ;GET RIGHT POINTER
\r
2029 CAIE AC1,(RC) ;DOES IT MATCH
\r
2030 PUSHJ PP,QEXT ;EXTERNAL OR RELOCATION ERROR
\r
2035 STOWT1: HLRZ AC1,EXTPNT ;GET LEFT HALF
\r
2036 CAIE AC1,(RC) ;SEE ABOVE
\r
2040 \fONC: ILDB C,TABP ;ENTRY TO ADVANCE TAB POINTER
\r
2041 PUSHJ PP,OUTL ;OUTPUT A TAB
\r
2042 ;OUTPUT 6 OCT NUMBERS FROM CS LEFT
\r
2043 ONC1: MOVEI C,6 ;CONVERT TO ASCII
\r
2044 LSHC C,3 ;SHIFT IN OCTAL
\r
2045 PUSHJ PP,OUTL ;OUTPUT ASCII FROM C
\r
2046 TRNE CS,-1 ;ARE WE THROUGH?
\r
2047 JRST ONC1 ;NO, GET ANOTHER
\r
2048 MOVEI C,0 ;CLEAR C
\r
2049 TLNN CS,1 ;RELOCATABLE?
\r
2051 TLNN CS,EXTF ;OR EXTERNAL
\r
2053 ONC2: JUMPN C,OUTC ;OUTPUT IF EXTERN OR RELOCATABLE
\r
2054 IFN FORMSW,< SOS FLDSIZ ;DECREMENT FIELD SIZE>
\r
2060 PUSHJ PP,DNC ;RECURSE IF NON-ZERO
\r
2062 ADDI C,"0" ;FORM ASCII
\r
2063 JRST PRINT ;DUMP AND TEST FOR END
\r
2065 OUTAS0: HRLI CS,(POINT 7,,) ;ENTRY TO SET POINTER
\r
2066 OUTASC: ILDB C,CS ;GET NEXT BYTE
\r
2067 JUMPE C,POPOUT ;EXIT ON ZERO DELIMITER
\r
2071 OUTSIX: HRLI CS,(POINT 6,,) ;OUTPUT SIXBIT
\r
2072 ILDB C,CS ;GET SIXBIT
\r
2073 CAIN C,40 ;"@" DELIMITER?
\r
2074 POPJ PP, ;YES, EXIT
\r
2075 ADDI C,40 ;NO, FORM ASCII
\r
2076 PUSHJ PP,OUTL ;OUTPUT ASCII CHAR FROM C
\r
2079 OUTSYM: MOVE CS,AC0 ;PLACE NAME IN CS
\r
2080 OUTSY1: MOVEI C,0 ;CLEAR C
\r
2081 LSHC C,6 ;MOVE NEXT SIXBIT CHARACTER IN
\r
2082 JUMPE C,OUTTAB ;TEST FOR END
\r
2083 ADDI C,40 ;CONVERT TO ASCII
\r
2084 PUSHJ PP,OUTL ;OUTPUT
\r
2086 \fOUTSET: AOS SX,0(PP) ;GET RETURN LOCATION
\r
2087 MOVE SX,-1(SX) ;GET XWD CODE
\r
2088 HLRM SX,BLKTYP ;SET BLOCK TYPE
\r
2090 PUSHJ PP,0(SX) ;GO TO PRESCRIBED ROUTINE
\r
2091 JRST COUTD ;TERMINATE BLOCK AND EXIT
\r
2093 ;LOOKUP SCANS ALL THE SYMBOLS IN THE SYMBOL TABLE
\r
2095 LOOKUP: POP PP,LOOKX ;INTERCEPT RETURN POP
\r
2097 MOVE SDEL,0(SX) ;SET FOR TABLE SCAN
\r
2098 LOOKL: SOJL SDEL,POPOUT ;TEST FOR END
\r
2101 PUSHJ PP,SRCH7 ;LOAD REGISTERS
\r
2103 PUSHJ PP,@LOOKX ;RETURN TO CALLING ROUTINE
\r
2104 JRST LOOKL ;TRY AGAIN
\r
2105 \fEND0: PUSHJ PP,EVALCM ;GET A WORD
\r
2106 SKIPE EXTPNT ;ANY EXTERNALS?
\r
2107 TRO ER,ERRE ;YES, ERROR
\r
2108 SKIPN V,AC0 ;NON-ZERO?
\r
2109 JUMPE RC,.+2 ;OR RELOC?
\r
2110 PUSHJ PP,ASSIG7 ;YES, LIST THE VALUE
\r
2113 PUSHJ PP,VARA ;FILL OUT SELF-DEFINED VARIABLES
\r
2114 PUSHJ PP,STOUTS ;DUMP THE LINE
\r
2115 PUSH PP,IO ;SAVE FLAGS
\r
2116 TLO IO,IOPROG ;XLIST LITS
\r
2118 POP PP,IO ;GET FLAG BACK
\r
2122 TLNN IO,MFLSW ;SKIP IF ONLY PSEND
\r
2124 MOVE INDIR ;SET UP FIRST AS LAST
\r
2125 MOVEM LSTFIL ;PRINTED
\r
2128 TLNE IO,MFLSW ;IF PSEND
\r
2129 POPJ PP, ;BACK TO PSEND0
\r
2130 SKIPE PRGPTR ;HAVE ANY PRGEND'S BEEN SEEN
\r
2131 JRST PSEND3 ;YES,GO SET UP AGAIN
\r
2133 PASS20: SETZM CTLSAV
\r
2135 PUSHJ PP,EOUT ;OUTPUT THE ENTRIES
\r
2137 XWD 6,NOUT ;OUTPUT THE NAME (BLKTYP-6)
\r
2139 HRRM BLKTYP ;SET FOR TYPE 1 BLOCK
\r
2140 TLZ FR,P1 ;SET FOR PASS 2 AND TURN OFF FLAG
\r
2141 TLO IO,IOPALL ;PUT THESE BACK
\r
2142 TLZ IO,IOPROG!IOCREF!DEFCRS ;SO LISTINGS WILL BE THE WAY THEY SHOULD
\r
2146 MOVE CS,[XWD $ST-1-$CKSM,R1BLDR]
\r
2160 DATAI PTR,@$TBL1-$RD+1($A)
\r
2161 XCT $TBL1-$RD+1($A)
\r
2162 XCT $TBL2-$RD+1($A)
\r
2164 $TBL1: CAME $CKSM,$ADR
\r
2173 IF2,< PURGE $ST,$RD,$A,$TBL1,$TBL2,$ADR,$CKSM>
\r
2174 \fENDP2: PUSHJ PP,COUTD ;DUMP THE BUFFER
\r
2175 MOVE AC0,LOCO ;CHECK TO SEE IF LIT DIFFERED
\r
2176 SKIPN MODO ;AND USE SMALLER SINCE AT END
\r
2177 JRST [CAMN AC0,ABSHI
\r
2183 REPEAT 1,<TLNE IO,IOCREF ;CLOSE CREF IF NECESSARY>
\r
2184 REPEAT 0,<TLNE FR,CREFSW ;IF CREFFING
\r
2187 PUSH PP,DBUF+3 ;SO NO PAGE INFO
\r
2188 DPB SDEL,[POINT 7,DBUF+3,13]
\r
2189 IOR ER,OUTSW ;MAKE SURE OF OUTPUT
\r
2191 MOVEI C,20 ;CODE FOR TITLE
\r
2193 PUSH PP,IO ;SAVE THIS
\r
2194 TLZ IO,IOPAGE ;AND PREVENT PAGE DURING TITLE
\r
2199 POP PP,IO ;RESTORE THE IO WORD
\r
2200 POP PP,DBUF+3 > ;NEEDS FIX TO CREF
\r
2201 PUSHJ PP,CLSCR2 ;CLOSE IT UP
\r
2202 ENDP2Q: HRR ER,OUTSW ;SET OUTPUT SWITCH
\r
2205 PUSHJ PP,UOUT ;OUTPUT UNDEFINEDS
\r
2207 SKPINC C ;SEE IF WE CAN INPUT A CHAR.
\r
2208 JFCL ;BUT ONLY TO DEFEAT ?O
\r
2209 SKIPG C,ERRCNT ;GET ERROR COUNT AND CHECK FOR POSITIVE
\r
2210 JRST NOERW ;PRINT NO ERROR MESSAGE
\r
2213 CAIN C,1 ;1 IS A SPECIAL CASE
\r
2214 JRST ONERW ;PRINT MESSAGE
\r
2215 MOVEI C,"?" ;? FOR BATCH
\r
2216 PUSHJ PP,OUTL ;...
\r
2217 MOVE C,ERRCNT ;PRINT NUMBER OF ERRORS
\r
2219 SKIPA CS,[EXP ERRMS1] ;LOAD TO PRINT
\r
2220 ONERW: MOVEI CS,ERRMS2 ;ONE ERROR DETECTED
\r
2221 ONERW1: PUSHJ PP,OUTSIX ;PRINT
\r
2223 NOERW: MOVEI CS,ERRMS3
\r
2224 TLNE IO,MFLSW ;NOR IF MULTI-FILE MODE
\r
2225 TRZ ER,TTYSW ;NO TTY OUTPUT
\r
2226 IOR ER,OUTSW ;UNLESS NEEDED FOR LISTING
\r
2230 \fENDP2A: PUSHJ PP,OUTCR
\r
2231 TLNN IO,MFLSW ;IN A MULTI-PROG FILE?
\r
2233 SKIPE ERRCNT ;ANY ERROR?
\r
2234 PUSHJ PP,[MOVEI CS,[ASCIZ /PROGRAM /]
\r
2235 PUSHJ PP,OUTAS0 ;YES,SO PRINT MESSAGE
\r
2236 MOVEI CS,TBUF ;AND TITLE
\r
2237 PUSHJ PP,OUTAS0 ;FOR IDENTIFICATION
\r
2238 JRST OUTCR] ;AND A CR-LF
\r
2239 TRZA ER,TTYSW ;NO MORE OUTPUT NOW
\r
2241 SKIPA ;SO PRGEND CODE CAN WORK
\r
2244 MOVEI CS,[SIXBIT /PROGRAM BREAK IS @/]
\r
2245 PUSHJ PP,OUTSIX ;OUTPUT PROGRAM BREAK
\r
2246 HRRZ CS,ABSHI ;GET ABS. BREAK
\r
2247 CAIG CS,140 ;ANY ABS. CODE
\r
2248 JRST [HRLO CS,HIGH ;NO
\r
2249 JRST ENDP2B] ;SO DON'T PRINT
\r
2250 HRLO CS,HIGH ;GET PROGRAM BREAK
\r
2253 MOVEI CS,[SIXBIT /ABSLUTE BREAK IS @/]
\r
2256 ENDP2B: PUSHJ PP,ONC1
\r
2258 TLNE FR,RIMSW!R1BSW ;RIM MODE?
\r
2259 PUSHJ PP,RIMFIN ;YES, FINISH IT
\r
2260 TLNN IO,MFLSW ;NOR IF IN MULTI-FILE MODE
\r
2261 TRO ER,TTYSW ;PRINT SIZE
\r
2267 MOVEI CS,[SIXBIT /K CORE USED@/]
\r
2272 XWD 2,SOUT ;OUTPUT THE SYMBOLS (BLKTYP-2)
\r
2274 XWD 7,VOUT ;OUTPUT TRANSFER VECTOR (..-7)
\r
2276 XWD 5,HOUT ;OUTPUT HIGHEST RELOCATABLE (..-5)
\r
2278 TLNN IO,MFLSW ;IS IT PRGEND?
\r
2279 JRST FINIS ;ALAS, FINISHED
\r
2280 MOVEI CS,SBUF ;RESET SBUF POINTER
\r
2281 HRRM CS,SUBTTX ;TO SUBTTL
\r
2282 SETZM PASS2I ;CLEAR PASS2 VARIABLES
\r
2283 MOVE [XWD PASS2I,PASS2I+1]
\r
2284 BLT PASS2Z-1 ;BUT NOT ALL OF VARIABLES
\r
2285 JRST INZ ;RE-INITIALIZE FOR NEXT PROG
\r
2287 RIMFIN: TLNE FR,R1BSW
\r
2296 \fSUBTTL PASS INITIALIZE
\r
2309 HRRES HWFMT ;SET DEFAULT VALUE BACK>
\r
2312 RCPNTR: POINT 1,ARG,?L<RELF>-18 ;POINT 1,ARG,22
\r
2313 \fSUBTTL PSEUDO-OP HANDLERS
\r
2315 TAPE0: PUSHJ PP,STOUTS ;FINISH THIS LINE
\r
2316 JRST GOTEND ;AND IGNORE THE REST OF THIS FILE
\r
2318 RADIX0: PUSHJ PP,EVAL10 ;EVALUATE RADIX D10
\r
2319 CAIG AC0,?D10 ;IF GREATER THAN 10
\r
2320 CAIG AC0,1 ;OR LESS THAN 2,
\r
2321 ERRAX: TROA ER,ERRA ;FLAG ERROR AND SKIP
\r
2322 HRR RX,AC0 ;SET NEW RADIX
\r
2326 XALL0: TLZ IO,IOSALL ;TURN OFF MACRO SUPPRESS ALL
\r
2327 IOSET: JUMP1 POPOUT ;NOSYM (IONSYM), XALL (IOPALL), XLIST (IOPROG)
\r
2328 HLRZ SX,AC0 ;STORE FLAGS
\r
2329 PUSHJ PP,STOUTS ;POLISH OFF LINE
\r
2330 TLO IO,0(SX) ;NOW SUPRESS PRINTING
\r
2333 IORSET: TDZ IO,AC0 ;RESET FLAG IOPALL/IOPROG
\r
2334 TLNE AC0,IONCRF ;RESTORING CREFFING?
\r
2335 TLZ IO,DEFCRS ;YES, CLEAR ANY WAITING DEFINING OCCURENCES
\r
2338 BLOCK0: PUSHJ PP,HIGHQ
\r
2339 PUSHJ PP,EVALEX ;EVALUATE
\r
2340 TRZE RC,-1 ;EXTERNAL OR RELOCATABLE?
\r
2341 PUSHJ PP,QEXT ;YES, DETERMINE TYPE
\r
2342 ADDM AC0,LOCO ;UPDATE ASSEMBLY LOCATION
\r
2343 BLOCK1: EXCH AC0,LOCA ;SAVE START OF BLOCK
\r
2344 ADDM AC0,LOCA ;UPDATE OUTPUT LOCATION
\r
2345 BLOCK2: HRLOM AC0,LOCBLK
\r
2351 PRNTX0: TRO ER,TTYSW ;SET OUTPUT TO TTY
\r
2352 JUMP2 PRNTX2 ;PASS1?
\r
2353 TDOA ER,OUTSW ;YES,OUTPUT TO LSTDEV ALSO
\r
2354 PRNTX2: ANDCM ER,OUTSW ;NO,DON'T OUTPUT TO TTY IF IT IS LSTDEV
\r
2355 PUSHJ PP,BYPASS ;GET FIRST CHAR.
\r
2356 TLOA IO,IORPTC ;REPEAT IT AND SKIP
\r
2357 PRNTX4: PUSHJ PP,PRINT ;PRINT THE CHAR.
\r
2358 PUSHJ PP,CHARAC ;GET ASCII CHAR.
\r
2359 CAIG C,CR ;IF GREATER THAN CR
\r
2360 CAIG C,HT ;OR LESS THAN LF
\r
2361 JRST PRNTX4 ;THEN CONTINUE
\r
2362 PUSHJ PP,OUTCR ;OUTPUT A CRLF
\r
2363 TRZA ER,TTYSW!LPTSW ;TURN OF OUTPUT
\r
2364 CPOPJ1: AOS (PP) ;USEFUL TAG HAS TO GO SOMEWHERE
\r
2365 CPOPJ: POPJ PP, ;EXIT
\r
2367 REMAR0: PUSHJ PP,GETCHR ;GET A CHARACTER
\r
2371 \fLIT0: PUSHJ PP,BLOCK1
\r
2375 ;ON PASS ONE, WE JUST STEP THE LOCATION COUNTER AND CLEAR
\r
2385 LIT20: PUSH PP,LOCA
\r
2393 LIT20A: MOVE SX,LITAB
\r
2394 LIT21: SOSGE LITNUM
\r
2400 MOVE AC0,-2(SX) ;WFW
\r
2401 MOVE RC,-1(SX) ;WFW
\r
2402 MOVE SX,(SX) ;WFW POINTER TO THE NEXT LIT
\r
2403 PUSHJ PP,STOW20 ;STOW CODE
\r
2404 MOVEI C,12 ;SET LINE FEED
\r
2406 PUSHJ PP,OUTLIN ;OUTPUT THE LINE
\r
2408 \fLIT22: HRRZ AC2,LOCO
\r
2413 SUB AC2,LOCO ;COMPUTE LENGTH USED
\r
2414 CAMGE AC0,AC2 ;USE LARGER
\r
2417 LIT24: ADDM AC0,LOCA
\r
2421 LITI: SETZM LITCNT
\r
2427 GETTOP: HRRZ AC1,SX ;VARHD
\r
2430 IFE FORMSW,< MOVEI SX,3 ;WFW>
\r
2431 IFN FORMSW,< MOVEI SX,4 ;ICC>
\r
2435 SUBI SX,1 ;MAKE SX POINT TO LINK
\r
2436 SETZM 0(SX) ;CLEAR FORWARD LINK
\r
2437 HRRM SX,0(AC1) ;STORE ADDRESS IN LAST LINK
\r
2439 \fVAR0: PUSHJ PP,BLOCK1 ;PRINT LOCATION
\r
2443 VARA: MOVE SX,VARHDX
\r
2444 MOVE AC0,LOCA ;GET LOCATION FOR CHECK
\r
2445 JUMP1 VARB ;DO NOT CHECK START ON PASS 1
\r
2446 CAME AC0,-1(SX) ;CHECK START OF VAR AREA
\r
2447 TRO ER,ERRP ;AND GIVE ERROR
\r
2448 VARB: MOVEM AC0,-1(SX) ;SAVE START FOR PASS 2
\r
2456 PUSHJ PP,LOOKUP ;SET FOR TABLE SCAN
\r
2458 POPJ PP, ;NO, EXIT
\r
2459 TRZ ARG,UNDF ;TURN OFF FLAG NOW
\r
2460 MOVSI AC0,1 ;ADD 1
\r
2461 ADDM AC0,0(AC1) ;UPDATE COUNT
\r
2463 IOR ARG,MODA ;SET TO ASSEMBLY MODE
\r
2465 MOVSM ARG,0(SX) ;UPDATE 2ND WRD OF SYM TAB ENTRY
\r
2469 \fIF: PUSH PP,AC0 ;SAVE AC0
\r
2471 PUSHJ PP,EVALXQ ;EVALUATE AND TEST EXTERNAL
\r
2475 IFPOP: POP PP,AC1 ;RETRIEVE SKIP INSTRUCTION
\r
2476 IFSET: TLO IO,IORPTC ;REPEAT CHARACTER
\r
2477 IFXCT: XCT AC1 ;EXECUTE INSTRUCTION
\r
2478 TDZA AC0,AC0 ;FALSE
\r
2480 IFEXIT: JUMPOC REPEA1 ;BRANCH IF IN OP-CODE FIELD
\r
2481 IFEX1: PUSHJ PP,GETCHR ;SEARCH FOR "<"
\r
2482 CAIN C,EOL ;ERROR IF END OF LINE
\r
2486 JUMPE AC0,IFEX2 ;TEST FOR 0
\r
2487 TLO IO,IORPTC ;NO, PROCESS AS CELL
\r
2489 IFN FORMSW,< MOVE AC1,HWFORM ;USE STANDARD FORM>
\r
2490 SETZM INCND ;NOT ANY MORE
\r
2491 JRST STOW ;STOW CODE AND EXIT
\r
2493 IFPASS: HRRI AC0,P1 ;MAKE IT TLNX IO,P1
\r
2494 MOVE AC1,AC0 ;PLACE IT IN AC1
\r
2495 JRST IFSET ;EXECUTE INSTRUCTION
\r
2497 IFB0: HLLO AC1,AC0 ;FORM AND STORE TEST INSTRUCTION
\r
2498 IFB1: PUSHJ PP,CHARL ;GET FIRST NON-BLANK
\r
2501 JRST IFB1 ;SKIP BLANKS AND TABS
\r
2502 CAIG C,CR ;CHECK FOR CARRET AS DELIM.
\r
2509 SETOM INCND ;SAVE INFO. FOR PASS 1 ERRORS
\r
2510 CAIN C,"<" ;LEFT BRACKET?
\r
2511 SETZB C,RC ;YES, PREPARE FOR OLD FORMAT
\r
2512 SKIPA SX,C ;SAVE FOR COMPARISON
\r
2513 IFB3: TRO AC0,1 ;SET FLAG
\r
2514 IFB2: PUSHJ PP,CHARL ;GET ASCII CHARACTER AND LIST
\r
2515 CAMN C,SX ;TEST FOR DELIMITER
\r
2517 CAIE C," " ;BLANK?
\r
2518 CAIN C," " ;OR TAB?
\r
2520 JUMPN SX,IFB3 ;JUMP IF NEW FORMAT
\r
2522 AOJA RC,IFB2 ;YES, INCREMENT COUNT
\r
2524 SOJL RC,IFXCT ;YES, DECREMENT AND EXIT IF DONE
\r
2525 JRST IFB3 ;GET NEXT CHARACTER
\r
2527 \fIFDEF0: HRRI AC0,UNDF ;MAKE IT TLNX ARG,UNDF
\r
2528 PUSH PP,AC0 ;STACK IT
\r
2529 PUSHJ PP,GETSYM ;TAKES SKIP RETURN IF SYM NAME IS LEGAL
\r
2530 TROA ER,ERRA ;ILLEGAL!
\r
2532 JRST [PUSHJ PP,OPTSCH
\r
2535 PUSHJ PP,SSRCH3 ;EMIT TO CREF ANYWAY
\r
2536 JRST IFPOP ;POP AND EXECUTE INSTRUCTION
\r
2538 \fIFIDN0: HLRZS AC0
\r
2539 MOVEI V,2*.IFBLK-1
\r
2540 SETZM IFBLK(V) ;CLEAR COMPARISON BLOCK
\r
2542 SETZM .TEMP ;CLEAR STORED DELIMETER
\r
2543 MOVEI RC,IFBLK ;SET FOR FIRST BLOCK
\r
2544 PUSHJ PP,IFCL ;GET FIRST STRING
\r
2546 PUSHJ PP,IFCL ;GET SECOND STRING
\r
2548 MOVE SX,IFBLK(V) ;GET WORD FROM FIRST STRING
\r
2549 CAMN SX,IFBLKA(V) ;COMPARE WITH SECOND STRING
\r
2550 SOJGE V,.-2 ;EQUAL, TRY NEXT WORD
\r
2551 JUMPL V,IFEXIT ;DID WE FINISH STRING
\r
2552 XORI AC0,1 ;NO, TOGGLE REQUEST
\r
2553 JRST IFEXIT ;DO NOT TURN ON IORPTC WFW
\r
2555 IFCL: PUSHJ PP,CHARAC ;GET AND LIST CHARACTER
\r
2556 CAIE C," " ;SKIP SPACES
\r
2557 CAIG C,CR ;ALSO SKIP CR-LF
\r
2558 CAIGE C,HT ;AND TAB
\r
2559 JRST .+2 ;NOT ONE OF THEM
\r
2560 JRST IFCL ;SO LONG COMPARISONS WILL WORK
\r
2561 ;*** A CROCK SO THAT IFIDN <X>,<X>,<INST.> WILL WORK ***
\r
2562 CAIE C,"," ;IS IT A COMMA?
\r
2564 SKIPN .TEMP ;YES, WAS PREVIOUS FIELD OLD METHOD?
\r
2565 JRST IFCL ;YES, IGNORE COMMA AND SPACES
\r
2567 CAIN C,"<" ;WAS IT LEFT BRACKET?
\r
2568 SETO C, ;SIGNAL OLD METHOD, LOOK FOR RIGHT BRACKET
\r
2569 MOVEM C,.TEMP ;STORE TERMINATOR FOR COMPARISON
\r
2570 MOVEI SX,5*.IFBLK-1 ;LIMIT SEARCH
\r
2571 HRLI RC,(POINT 7,,) ;SET UP BYTE IN RC
\r
2572 IFCLR: PUSHJ PP,CHARAC
\r
2573 SKIPLE .TEMP ;NEW METHOD?
\r
2574 JRST IFCLR1 ;YES, IGNORE ANGLE BRACKET COUNTING
\r
2575 CAIN C,"<" ;ANOTHER LEFT ANGLE?
\r
2576 SOS .TEMP ;YES, KEEP COUNT
\r
2577 CAIN C,">" ;CLOSING ANGLE
\r
2578 AOSGE .TEMP ;MATCHING COUNT?
\r
2579 IFCLR1: CAMN C,.TEMP ;TEST FOR DELIMITER
\r
2580 POPJ PP, ;EXIT ON RIGHT DELIMITER
\r
2581 SOJG SX,.+2 ;ANY ROOM IN COMPARISON BLOCK?
\r
2582 TROA ER,ERRA ;NO, FLAG ERROR BUT KEEP ON GOING
\r
2583 IDPB C,RC ;DEPOSIT BYTE
\r
2587 IFEX2: PUSHJ PP,GETCHR
\r
2588 CAIN C,EOL ;EXIT WITH ERROR IF END OF LINE
\r
2591 AOJA AC0,IFEX2 ;YES, INCREMENT COUNT
\r
2593 JRST IFEX2 ;NO, TRY AGAIN
\r
2594 SOJGE AC0,IFEX2 ;YES, TEST FOR MATCH
\r
2595 PUSHJ PP,BYPASS ;YES, MOVE TO NEXT DELIMITER
\r
2596 SETZM INCND ;OUT OF CONDITIONAL NOW
\r
2597 AOJA AC0,STOWZ1 ;STOW ZERO
\r
2600 INTER0: HLLZM AC0,INTENT ;AC0 CONTAINS INTF/ENTF FLAGS
\r
2602 INTER1: PUSHJ PP,GETSYM ;GET A SYMBOL
\r
2603 JRST INTER3 ;INVALID, SKIP
\r
2604 PUSHJ PP,SSRCH ;SEARCH THE TABLE
\r
2605 MOVSI ARG,SYMF!INTF!UNDF
\r
2606 TLNE ARG,UNDF ;UNDEFINED?
\r
2607 TRO ER,ERRA ;YES, FLAG ERROR
\r
2608 TLNN ARG,SYNF!EXTF
\r
2609 TDOA ARG,INTENT ;SET APPROPRIATE FLAGS
\r
2610 INTER3: TROA ER,ERRA ;FLAG ARG EROR AND SKIP
\r
2611 PUSHJ PP,INSERQ ;INSERT/UPDATE
\r
2613 SETZM EXTPNT ;JUST IN CASE, SO AS NOT TO CONFUSE WORLD
\r
2614 POPJ PP, ;NO, EXIT
\r
2615 \fEXTER0: PUSHJ PP,GETSYM ;GET A SYMBOL
\r
2616 JRST EXTER4 ;INVALID, ERROR
\r
2617 EXTER1: TLO IO,DEFCRS ;FLAG THIS AS A DEFINITION
\r
2618 PUSHJ PP,SSRCH ;OK, SEARCH SYMBOL TABLE
\r
2619 JRST EXTER2 ;NOT THERE, INSERT IT
\r
2620 TLNN ARG,EXTF!VARF!UNDF
\r
2621 TROA ER,ERRE ;FLAG ERROR AND BYPASS
\r
2622 TLNE ARG,EXTF ;VALID, ALREADY DEFINED?
\r
2623 JRST [JUMP1 EXTER3 ;YES, BYPASS
\r
2624 TLZN ARG,UNDF ;SKIP IF UNDEFINED ALSO
\r
2625 JRST EXTER3 ;CONTINUE
\r
2626 ANDM ARG,(SX) ;CLEAR UNDF ON PASS 2
\r
2627 JRST EXTER2] ;SET UP EXTERNAL NOW
\r
2628 EXTER2: MOVEI V,2 ;NO, GET 2 CELLS FROM THE TREE
\r
2630 CAML V,SYMBOL ;HAVE WE RUN OUT OF CORE?
\r
2631 PUSHJ PP,XCEEDS ;YES, TRY TO BORROW SOME MORE
\r
2632 SUBI V,2 ;GET RIGHT CELL FOR POINTER
\r
2633 SETZB RC,0(V) ;ALL SET, ZERO VALUES
\r
2634 MOVSI ARG,SYMF!EXTF
\r
2635 PUSHJ PP,INSERT ;INSERT/UPDATE IT
\r
2638 SKIPA ARG,-1(SX) ;GET THE SIXBIT FOR THE NAME
\r
2639 EXTER4: TROA ER,ERRA ;FLAG AS ERROR
\r
2640 MOVEM ARG,1(V) ;AND STORE THAT IN CASE SYMBOL TABLE MOVES
\r
2641 EXTER3: JUMPCM EXTER0
\r
2642 POPJ PP, ;NO, EXIT
\r
2643 \fEVAL10: PUSH PP,RX
\r
2645 PUSHJ PP,EVALEX ;EVALUATE
\r
2646 POP PP,RX ;RESET RADIX
\r
2647 JUMPE RC,POPOUT ;EXIT IF ABSOLUTE
\r
2649 QEXT: SKIPE EXTPNT ;ANY POSSIBILITIES?
\r
2650 TROA ER,ERRE ;YES, FLAG EXTERNAL ERROR
\r
2651 TRO ER,ERRR ;NO, FLAG RELOCATION ERROR
\r
2652 HLLZS RC ;CLEAR RELOCATION/EXTERNAL
\r
2655 EVALXQ: PUSHJ PP,EVALEX ;EVALUATE EXPRESSION
\r
2656 TLZN RC,-2 ;LEFT HALF EXTERNAL
\r
2657 TRZE RC,-2 ;WAS AN EXTERNAL FOUND?
\r
2658 TRO ER,ERRE ;YES, FLAG ERROR
\r
2660 \fOPDEF0: PUSHJ PP,GETSYM ;GET THE FIRST SYMBOL
\r
2661 POPJ PP, ;ERROR IF INVALID SYMBOL
\r
2663 JRST ERRAX ;NO, ERROR
\r
2664 PUSH PP,AC0 ;STACK MNEMONIC
\r
2665 AOS LITLVL ;SHORT OUT LOCATION INCREMENT
\r
2666 PUSHJ PP,STMNT ;EVALUATE STATEMENT
\r
2667 SKIPGE STPX ;CODE STORED?
\r
2668 TROA ER,ERRA ;NO,"A" ERROR
\r
2669 PUSHJ PP,DSTOW ;GET AND DECODE VALUE
\r
2671 EXCH AC0,0(PP) ;EXCHANGE VALUE FOR MNEMONIC
\r
2672 PUSH PP,RC ;STACK RELOCATION
\r
2673 TLO IO,DEFCRS ;SAY WE ARE DEFINING IT
\r
2674 PUSHJ PP,MSRCH ;SEARCH SYMBOL TABLE
\r
2675 MOVSI ARG,OPDF ;NOT FOUND
\r
2676 POP PP,RC ;RESTORE VALUES
\r
2678 TLNE ARG,SYNF!MACF
\r
2679 TRO ER,ERRA ;YES "A" ERROR
\r
2680 TRNN ER,ERRA ;ERROR?
\r
2681 PUSHJ PP,INSERT ;NO, INSERT/UPDATE
\r
2682 TLZ IO,DEFCRS ;JUST IN CASE
\r
2684 JRST STOWI ;BE SURE STOW IS RESET
\r
2687 DEPHA0: MOVE AC0,LOCO
\r
2688 SKIPA RC,MODO ;SET TO OUTPUT VALUES AND SKIP
\r
2689 PHASE0: PUSHJ PP,EVALXQ ;EVALUATE AND CHECK FOR EXTERNAL
\r
2690 MOVEM AC0,LOCA ;SET ASSEMBLY LOCATION COUNTER
\r
2693 \fASSIGN: JUMPAD ERRAX ;NO, ERROR
\r
2695 TLNE IO,IOSALL ;SUPPRESS ALL?
\r
2696 JUMPN MRP,CPOPJ ;IF IN MACRO
\r
2697 ASSIG7: MOVEM RC,ASGBLK
\r
2698 TRNE RC,-2 ;EXTERNAL
\r
2699 HLLZS ASGBLK ;YES,CLEAR RELOCATION
\r
2700 TLNE RC,1 ;LEFT HALF NOT RELOC?
\r
2702 HRROS ASGBLK ;YES, SET FLAG
\r
2706 ASSIG1: PUSH PP,AC0 ;SAVE SYMBOL
\r
2707 SETZB AC0,EXTPNT ;SPECIAL CHECK FOR == WFW
\r
2708 PUSHJ PP,PEEK ;IS THE NEXT ON =
\r
2711 TLO AC0,NOOUTF ;YES, NOT OUT TO DDT WFW
\r
2712 PUSHJ PP,GETCHR ;PROCESS THE CHAR.
\r
2713 PUSHJ PP,PEEK ;CHECK FOR ==: DMN
\r
2714 ASSIG5: CAIE C,":" ;IS IT
\r
2716 TLO AC0,INTF ;MAKE INTERNAL
\r
2717 PUSHJ PP,GETCHR ;REPEAT IT
\r
2718 ASSIG6: MOVEM AC0,HDAS ;STORE THESE BITS WFW
\r
2719 PUSHJ PP,EVALCM ;EVALUATE EXPRESSION
\r
2720 EXCH AC0,0(PP) ;SWAP VALUE FOR SYMBOL
\r
2722 TRNN RC,-2 ;CHECK EXTERNAL AGREEMENT
\r
2727 PUSHJ PP,QEXT ;EXTERNAL OR RELOCATION ERROR
\r
2728 ASSIG2: HLRZ RC,(PP)
\r
2734 ASSIG3: TLO IO,DEFCRS
\r
2738 TLNE ARG,UNDF ;WAS IT UNDEFINED
\r
2739 TLZ ARG,EXTF!PNTF ;YES,CLEAR EXTF NOW
\r
2740 TLZ ARG,UNDF!VARF ;CANCEL UNDEFINED AND VARIABLE FLAGS
\r
2741 SETZM EXTPNT ;FOR REST OF WORLD
\r
2743 TRNE ER,ERRORS-ERRQ
\r
2744 SETZ RC, ;CLEAR RELOCATION
\r
2746 TRNE ER,ERRU ;WAS VALUE UNDEFINED?
\r
2747 TLO ARG,UNDF ;YES,SO TURN UNDF ON
\r
2748 TLNE ARG,TAGF!EXTF
\r
2752 \fLOC0: PUSHJ PP,HIGHQ ;AC0=0,0
\r
2753 PUSH PP,AC0 ;SAVE MODE REQUESTED
\r
2754 HLRZS AC0 ;PUT MODE IN RIGHT HALF
\r
2755 JUMPN AC0,RELOC0 ;RELOC PSEUDO-OP
\r
2756 CAMN AC0,MODO ;SAME AS PRESENT MODE?
\r
2757 JRST [HRRZ AC0,LOCO ;YES
\r
2758 EXCH AC0,ABSLOC ;EXCH VALUES
\r
2760 HRRZ AC0,LOCO ;NO, GET CURRENT VALUE
\r
2761 MOVEM AC0,RELLOC ;SAVE IT
\r
2762 MOVE AC0,ABSLOC ;GET LAST RELOC VALUE
\r
2763 LOC01: PUSHJ PP,BYPASS ;SKIP BLANKS
\r
2765 CAIE C,EOL ;USE PREVIOUS VALUE IF NULL ARGUMENT
\r
2766 PUSHJ PP,EVALXQ ;GET EXPRESSION AND TEST EXTERNAL
\r
2767 HRRM AC0,(PP) ;STORE NEW VALUE
\r
2768 POP PP,AC0 ;RETRIEVE STORED MODE AND VALUE
\r
2769 LOC10: HRRZM AC0,LOCA ;SET ASSEMBLY LOCATION
\r
2770 HRRZM AC0,LOCO ;AND OUTPUT LOCATION
\r
2771 HLRZM AC0,MODA ;SET MODE
\r
2775 RELOC0: CAMN AC0,MODO
\r
2776 JRST [HRRZ AC0,LOCO
\r
2788 ONFORM: HRRES HWFMT ;ALLOW MULTI-FORMAT LISTING
\r
2790 OFFORM: HRROS HWFMT ;HALF-WORD FORMAT ONLY
\r
2797 HIGHQ1: MOVE V,LOCO ;GET ASSEMBLY LOCATION
\r
2798 SKIPN MODO ;IF ASSEMBLY MODE IS ABSOLUTE
\r
2799 JRST [CAMLE V,ABSHI ;RECORED ABS HIGHEST ALSO
\r
2802 CAMLE V,HIGH ;IS IT GREATER THAN "HIGH"?
\r
2803 MOVEM V,HIGH ;YES, REPLACE WITH LARGER VALUE
\r
2806 ONML: TLZA FR,MWLFLG ;MULTI-WORD LITERALS OK
\r
2807 OFFML: TLO FR,MWLFLG ;NO
\r
2810 OFFSYM: SETOM IONSYM ;SUPRESS SYMBOL TABLE LISTING
\r
2813 SUPRE0: PUSHJ PP,GETSYM ;GET A SYMBOL TO SUPRES
\r
2814 JRST SUPRE1 ;ERROR
\r
2815 PUSHJ PP,SSRCH ;SYMBOL ONLY
\r
2816 JRST SUPRE1 ;GIVE ERROR MESSAGE
\r
2817 TLOA ARG,SUPRBT ;SET THE SUPRESS BIT
\r
2818 SUPRE1: TROA ER,ERRA
\r
2819 IORM ARG,(SX) ;PUT BACK
\r
2820 JUMPCM SUPRE0 ;ANY MORE?
\r
2823 SUPRSA: PUSHJ PP,LOOKUP ;SUPRESS ALL
\r
2826 SUPRS1: SETZM EXTPNT ;JUST IN CASE WE LOOKED ONE UP
\r
2829 XPUNG0: JUMP1 POPOUT
\r
2831 MOVE ARG,(SX) ;GET SYMBOL FLAGS
\r
2832 TLNN ARG,INTF!ENTF!EXTF!SPTR
\r
2833 TLOA ARG,SUPRBT ;LOCAL SYMBOL,SO SUPPRESS IT
\r
2835 MOVEM ARG,(SX) ;RESTORE FLAGS
\r
2837 \fTITLE0: JUMP2 REMAR0
\r
2840 PUSHJ PP,SUBTT1 ;GO READ IT
\r
2841 MOVEM SX,TCNT ;SAVE COUNT OF CHARS. WRITTEN
\r
2842 SKIPE UNIVSN ;WAS IT A UNIVERSAL?
\r
2843 PUSHJ PP,ADDUNV ;YES ADD TO TABLE
\r
2844 TLOE IO,IOTLSN ;HAVE WE SEEN ONE
\r
2845 TRO ER,ERRM ;YES, COMPLAIN
\r
2846 POPJ PP, ;EXIT OTHERWISE
\r
2848 SUBTT0: SKIPE SBUF ;STORE FIRST SUBTTL ON PASS1
\r
2849 JUMP1 REMAR0 ;OTHERWISE EXIT IF PASS ONE
\r
2853 SUBTT1: PUSHJ PP,BYPASS ;BYPASS LEADING BLANKS
\r
2855 SUBTT3: PUSHJ PP,CHARAC ;GET ASCII CHARACTER
\r
2856 IDPB C,AC0 ;STORE IN BLOCK
\r
2857 CAIGE C,40 ;TEST FOR TERMINATOR
\r
2859 SOJG SX,SUBTT3 ;TEST FOR BUFFER FULL
\r
2860 DPB RC,AC0 ;END, STORE TERMINATOR
\r
2861 SOJA SX,CPOPJ ;COUNT NUL AND EXIT
\r
2864 \fSYN0: PUSHJ PP,GETSYM ;GET THE FIRST SYMBOL
\r
2865 JRST ERRAX ;ERROR, EXIT
\r
2866 PUSHJ PP,MSRCH ;TRY FOR MACRO/OPDEF
\r
2867 JRST SYN3 ;NO,0THRY FOR OPERAND
\r
2868 SYN1: MOVEI SX,MSRCH ;YES, SET FLAG
\r
2869 SYN2: PUSHJ PP,SAVEXS ;SAVE REGISTERS
\r
2870 JUMPNC ERRAX ;ERROR IF NO COMMA
\r
2871 PUSHJ PP,GETSYM ;GET THE SECOND SYMBOL
\r
2873 PUSHJ PP,@SAVBLK+SX ;SEARCH FOR SECOND SYMBOL
\r
2875 MOVE ARG,SAVBLK+ARG ;GET VALUES
\r
2878 TLNE ARG,MACF ;MACRO?
\r
2879 PUSHJ PP,REFINC ;YES, INCREMENT REFERENCE
\r
2880 JRST INSERT ;INSERT AND EXIT
\r
2882 SYN3: PUSHJ PP,SSRCH ;SEARCH FOR OPERAND
\r
2883 JRST SYN4 ;NOT FOUND, TRY OP CODE
\r
2884 TLO ARG,SYNF ;FLAG AS SYNONYM
\r
2885 TLNE ARG,EXTF ;EXTERNAL?
\r
2886 HRRZ V,ARG ;YES, RELPACE WITH POINTER
\r
2887 MOVEI SX,SSRCH ;SET FLAG
\r
2888 TLNN ARG,VARF ;DO NOT LET HIM SYN A VARIABLE
\r
2892 SYN4: PUSHJ PP,OPTSCH ;SEARCH FOR OP-CODE
\r
2893 JRST ERRAX ;NOT FOUND, EXIT WITH ERROR
\r
2894 MOVSI ARG,SYNF ;FLAG AS SYNONYM
\r
2896 \fPURGE0: PUSHJ PP,GETSYM ;GET A MNEMONIC
\r
2897 JRST [TRZ ER,ERRA ;CLEAR ERROR
\r
2898 POPJ PP,] ;AND RETURN
\r
2899 PUSHJ PP,MSRCH ;SEARCH MACRO SYMBOL TABLE
\r
2900 JRST PURGE2 ;NOT FOUND, TRY SYMBOLS
\r
2901 PUSH PP,CS ;SAVE CS AS IT MAY GET GARBAGED
\r
2902 TLNE ARG,MACF ;MACRO?
\r
2903 PUSHJ PP,REFDEC ;YES, DECREMENT THE REFERENCE
\r
2905 JRST PURGE4 ;REMOVE SYMBOL FROM TABLE
\r
2907 PURGE2: PUSHJ PP,SSRCH ;TRY OPERAND SYMBOL TABLE
\r
2908 JRST PURGE5 ;NOT FOUND GET NEXT SYMBOL
\r
2909 TRNN RC,-2 ;CHECK COMPLEX EXTERNAL
\r
2914 TLNE ARG,EXTF!UNDF ;ERROR IF EXTERNAL OR UNDEFINED
\r
2915 TLNE ARG,SYNF ;BUT NOT A SYNONYM
\r
2917 PURGE3: TROA ER,ERRA ;NOT FOUND, ERROR
\r
2918 PURGE4: PUSHJ PP,REMOVE ;REMOVE FROM THE SYMBOL TABLE
\r
2919 PURGE5: JUMPCM PURGE0
\r
2921 \fOPD1: TLNE ARG,UNDF ;IF OPDEF IS UNDEFINED
\r
2922 TRO ER,ERRO ;GIVE "O" ERROR
\r
2923 OPD: MOVE AC0,V ;PUT VALUE IN AC0
\r
2925 IOP: MOVSI AC2,(POINT 9,0(PP),11)
\r
2926 IFE FORMSW,< TLOA IO,IOIOPF ;SET "IOP SEEN" AND SKIP>
\r
2927 IFN FORMSW,< PUSH PP,IOFORM ;USE I/O FORM
\r
2928 TLO IO,IOIOPF ;SET "IOP" SEEN
\r
2930 OP: MOVSI AC2,(POINT 4,0(PP),12)
\r
2931 IFN FORMSW,< PUSH PP,INFORM ;USE INST. FORM>
\r
2933 PUSH PP,AC0 ;STACK CODE
\r
2935 PUSHJ PP,EVALEX ;EVALUATE FIRST EXPRESSION
\r
2938 OP1B: PUSHJ PP,GETCHR ;GET A CHARACTER
\r
2939 IFE FORMSW,<JUMPCM XWD5 ;PROCESS COMMA COMMA IN XWD>
\r
2940 IFN FORMSW,<JUMPNC .+4 ;JUMP IF NO COMMA
\r
2941 MOVE AC2,HWFORM ;GET FORM WORD FOR XWD
\r
2942 MOVEM AC2,-2(PP) ;REPLACE INSTRUCTION FORM
\r
2943 JRST XWD5 ;PROCESS COMMA COMMA IN XWD>
\r
2944 TLO IO,IORPTC ;NOT A COMMA,REPEAT IT
\r
2948 JUMPE RC,OP1A ;EXTERNAL OR RELOCATABLE?
\r
2949 PUSHJ PP,QEXT ;YES, DETERMINE WHICH AND FLAG AN ERROR
\r
2951 OP1A: PUSHJ PP,EVALEX ;GET ADDRESS PART
\r
2952 OP2: PUSHJ PP,EVADR ;EVALUATE STANDARD ADDRESS
\r
2953 OP3: POP PP,AC0 ;PUT IN AC0
\r
2955 IFN FORMSW,< POP PP,AC1 ;GET FORM WORD>
\r
2956 SKIPE (PP) ;CAME FROM EVALCM?
\r
2957 JRST STOW ;NO,STOW CODE AND EXIT
\r
2958 POP PP,AC1 ;YES,EXIT IMMEDIATELY
\r
2961 \fEVADR: ;EVALUATE STANDARD ADDRESS
\r
2962 IFE IIISW,<TLNN AC0,-1 ;OK IF ALL 0'S
\r
2964 TLC AC0,-1 ;CHANGE ALL ONES TO ZEROS
\r
2965 TLCE AC0,-1 ;OK IF ALL 1'S
\r
2966 TRO ER,ERRQ ;NO,FLAG Q ERROR>
\r
2967 ADD AC0,-1(PP) ;ADD ADDRESS PORTIONS
\r
2968 HLL AC0,-1(PP) ;GET LEFT HALF
\r
2969 TLZE FR,INDSW ;INDIRECT BIT?
\r
2970 TLO AC0,(Z @) ;YES, PUT IT IN
\r
2971 MOVEM AC0,-1(PP) ;RE-STACK CODE
\r
2972 ADD RC,-2(PP) ;UPDATE RELOCATION
\r
2973 HRRM RC,-2(PP) ;USE HALF WORD ADD
\r
2975 POPJ PP, ;NO, EXIT
\r
2978 PUSHJ PP,EVALCM ;EVALUATE
\r
2980 MOVSS V,AC0 ;SWAP HALVES
\r
2981 IFE IIISW,<MOVSS SX,RC
\r
2982 IOR SX,V ;MERGE RELOCATION
\r
2983 TRNN SX,-1 ;RIGHT HALF ZERO?
\r
2984 JRST OP2A ;YES, DO SIMPLE ADD
\r
2985 MOVE ARG,RC ;NO, SWAP RC INTO ARG>
\r
2986 IFN IIISW,<MOVSS ARG,RC>
\r
2987 ADD V,-1(PP) ;ADD RIGHT HALVES
\r
2989 HRRM V,-1(PP) ;UPDATE WITHOUT CARRY
\r
2991 HLLZS AC0 ;PREPARE LEFT HALVES
\r
2993 IFE IIISW,<TLNE SX,-1 ;IS LEFT HALF ZERO?
\r
2994 TRO ER,ERRQ ;NO FLAG FORMAT ERROR
\r
2995 OP2A: TLNE RC,-1 ;RELOCATION FOR LEFT HALF?
\r
2996 PUSHJ PP,OP2A1 ;YES,IS IT LEGAL?
\r
2997 TLNE AC0,777000 ;OP CODE FIELD USED?
\r
2998 JRST [EXCH AC0,-1(PP);YES, GET STORED CODE
\r
2999 TLNE AC0,777000 ;OP CODE FIELD BEEN SET?
\r
3000 TRO ER,ERRQ ;YES, MOST LIKELY AN ERROR
\r
3002 JRST .+1] ;RETURN TO ADD >
\r
3003 ADDM AC0,-1(PP) ;MERGE WITH PREVIOUS VALUE
\r
3006 JRST ERRAX ;NO, FLAG ERROR
\r
3007 ;YES, BYPASS PARENTHESIS
\r
3009 BYPAS1: PUSHJ PP,GETCHR
\r
3010 BYPAS2: JUMPE C,.-1 ;SKIP TRAILING BLANKS
\r
3014 OP2A1: EXCH RC,-2(PP) ;GET STORED CODE
\r
3015 TLNN RC,-1 ;OK IF ALL ZERO
\r
3016 JRST OP2A2 ;OK SO RETURN
\r
3017 TLC RC,-1 ;CHANGE ALL ONES TO ZEROS
\r
3018 TLCE RC,-1 ;OK IF ALL ONES
\r
3019 TRO ER,ERRQ ;OTHERWISE A "Q" ERROR
\r
3020 OP2A2: EXCH RC,-2(PP) ;GET RC,BACK
\r
3021 POPJ PP, ;AND RETURN>
\r
3024 EXPRES: HRLZ AC0,RX ;FUDGE FOR OCT0
\r
3028 OCT1: PUSHJ PP,EVALEX ;EVALUATE
\r
3029 IFN FORMSW,< MOVE AC1,HWFORM>
\r
3030 PUSHJ PP,STOW ;STOW CODE
\r
3032 POP PP,RX ;YES, RESTORE RADIX
\r
3034 \fSIXB10: MOVSI RC,(POINT 6,AC0) ;SET UP POINTER
\r
3035 MOVEI AC0,0 ;CLEAR WORD
\r
3037 SIXB20: PUSHJ PP,CHARL ;GET NEXT CHARACTER
\r
3038 CAMN C,SX ;IS THIS PRESET DELIMITER?
\r
3039 IFE FORMSW,< JRST ASC60 ;YES>
\r
3041 JRST [PUSHJ PP,BYPAS1
\r
3049 TRZA C,100 ;CONVERT LOWER CASE TO SIXBIT
\r
3050 SUBI C,40 ;CONVERT TO SIXBIT
\r
3051 JUMPL C,ASC55 ;TEST FOR INVALID CHARACTER
\r
3052 IDPB C,RC ;NO, DEPOSIT THE BYTE
\r
3053 TLNE RC,770000 ;IS THE WORD FULL?
\r
3054 JRST SIXB20 ;NO, GET NEXT CHARACTER
\r
3055 IFN FORMSW,< MOVE AC1,SXFORM ;SIXBIT FORM>
\r
3056 PUSHJ PP,STOWZ ;YES, STORE
\r
3057 JRST SIXB10 ;GET NEXT WORD
\r
3058 \fASCII0: HLLZ SDEL,AC0 ;STORE ASCII/ASCIZ FLAG
\r
3059 ASC10: PUSHJ PP,CHARL ;GET FIRST NON-BLANK
\r
3063 CAIG C,CR ;CHECK FOR CRRET AS DELIM
\r
3067 MOVEM SX,TXTSEQ ;SAVE SEQ AND PAGE
\r
3071 MOVE SX,C ;SAVE FOR COMPARISON
\r
3072 JUMPG SDEL,SIXB10 ;BRANCH IF SIXBIT
\r
3074 ASC20: MOVSI RC,(POINT 7,AC0) ;SET UP POINTER
\r
3075 TLNE SDEL,200000 ;THIS BIT (AND BIT0) IN FOR COMMENT
\r
3076 MOVSI RC,440000 ;SO NOTHING WILL BE DEPOSITED
\r
3077 IFE IIISW,<MOVEI AC0,0 ;CLEAR WORD>
\r
3078 IFN IIISW,<TLNE SDEL,100000 ;ASCID?
\r
3079 TLZA SDEL,400000 ;YES, ZERO ASCIZ BIT
\r
3080 TDZA AC0,AC0 ;NO, ZERO WORD
\r
3081 MOVE AC0,[BYTE (7) 10,10,10,10,10 (1) 1] ;YES, A WORD FULL OF BACKSPACES>
\r
3082 ASC30: PUSHJ PP,CHARL ;GET ASCII CHARACTER AND LIST
\r
3083 CAMN C,SX ;TEST FOR DELIMITER
\r
3085 IDPB C,RC ;DEPOSIT BYTE
\r
3086 TLNE RC,760000 ;HAVE WE FINISHED WORD?
\r
3087 JRST ASC30 ;NO,GET NEXT CHARACTER
\r
3088 IFN FORMSW,< MOVE AC1,ASCIIF ;USE ASCII FORM WORD>
\r
3089 PUSHJ PP,STOWZ ;YES, STOW IT
\r
3090 JRST ASC20 ;GET NEXT WORD
\r
3092 ASC55: TDZA CS,CS ;ZERO CS IN CASE NESTED
\r
3093 ASC50: TDZA RC,SDEL ;TEST FOR ASCIIZ
\r
3094 TROA ER,ERRA ;SIXBIT ERROR EXIT
\r
3095 ASC60: PUSHJ PP,BYPAS1 ;POLISH OFF TERMINATOR
\r
3096 SETZM INTXT ;WE ARE OUT OF IT
\r
3097 IFN FORMSW,< MOVE AC1,ASCIIF ;USE ASCII FORM WORD>
\r
3098 IFN IIISW,<TLNN SDEL,100000 ;NO EXTRA WORDS FOR ASCID>
\r
3099 ANDCM RC,STPX ;STORE AT LEAST ONE WORD
\r
3100 TLNN SDEL,200000 ;GET OUT WITHOUT STORING
\r
3101 JUMPGE RC,STOWZ ;STOW
\r
3102 POPJ PP, ;ASCII, NO BYTES STORED, SO EXIT
\r
3104 IFN FORMSW,< PUSH PP,BPFORM ;USE BYTE POINTER FORM WORD>
\r
3105 PUSH PP,RC ;STACK REGISTERS
\r
3107 PUSHJ PP,EVAL10 ;EVALUATE RADIX 10
\r
3108 DPB AC0,[POINT 6,0(PP),11] ;STORE BYTE SIZE
\r
3110 PUSHJ PP,EVALEX ;NO, GET ADDRESS
\r
3111 PUSHJ PP,EVADR ;EVALUATE STANDARD ADDRESS
\r
3113 PUSHJ PP,EVAL10 ;EVALUATE RADIX 10
\r
3114 TLNE IO,NUMSW ;IF NUMERIC
\r
3115 TDCA AC0,[-1] ;POSITION=D35-RHB
\r
3116 POINT2: MOVEI AC0,0 ;OTHERWISE SET TO D36
\r
3119 ADDM AC0,0(PP) ;UPDATE VALUE
\r
3122 IFN FORMSW,< PUSH PP,HWFORM ;USE HALF WORD FORM>
\r
3124 PUSH PP,AC0 ;STORE ZERO ON STACK
\r
3125 PUSHJ PP,EVALEX ;EVALUATE EXPRESSION
\r
3127 XWD5: SKIPN (PP) ;ANY CODE YET?
\r
3128 JRST XWD10 ;NO,USE VALUE IN AC0
\r
3129 JUMPE AC0,.+2 ;ANYTHING IN AC0?
\r
3130 TRO ER,ERRQ ;YES,FLAG "Q"ERROR
\r
3131 MOVE AC0,(PP) ;USE PREVIOUS VALUE
\r
3132 MOVE RC,-1(PP) ;AND RELOCATION
\r
3133 XWD10: HRLZM AC0,0(PP) ;SET LEFT HALF
\r
3136 JRST OP1A ;EXIT THROUGH OP
\r
3138 IOWD0: PUSHJ PP,EVALXQ ;EVALUATE AND TEST FOR EXTERNAL
\r
3140 JRST [SKIPN AC0 ;IF NZERO AND NO "," SEEN
\r
3141 TRO ER,ERRQ ;TREAT AS Q ERROR
\r
3142 IFN FORMSW,< MOVE AC1,HWFORM ;USE HALF WORD FORM>
\r
3143 SOJA AC0,STOW] ;NO, TREAT AS RIGHT HALF
\r
3144 PUSH PP,AC0 ;YES, STACK LEFT HALF
\r
3145 PUSHJ PP,EVALEX ;WFW
\r
3147 POP PP,AC1 ;RETRIEVE LEFT HALF
\r
3150 IFN FORMSW,< MOVE AC1,HWFORM ;USE HALF WORD FORM>
\r
3151 JRST STOW ;STOW CODE AND EXIT
\r
3152 \fBYTE0: PUSHJ PP,BYPASS ;GET FIRST NON-BLANK
\r
3154 JRST ERRAX ;NO, FLAG ERROR AND EXIT
\r
3160 PUSH PP,AC0 ;INITIALIZE STACK TO ZERO
\r
3161 MOVSI ARG,(POINT -1,(PP))
\r
3163 BYTE1: PUSH PP,ARG
\r
3164 PUSHJ PP,EVAL10 ;EVALUATE RADIX 10
\r
3166 CAIG AC0,?D36 ;TEST SIZE
\r
3169 DPB AC0,[POINT 6,ARG,11] ;STORE BYTE SIZE
\r
3171 BYTE2: IBP ARG ;INCREMENT BYTE
\r
3172 TRZN ARG,-1 ;OVERFLOW?
\r
3175 EXCH AC0,0(PP) ;GET CURRENT VALUES
\r
3176 EXCH RC,-1(PP) ;AND STACK ZEROS
\r
3178 MOVE AC1,HWFORM ;USE STANDARD FORM
\r
3179 EXCH AC1,-2(PP) ;GET FORM WORD
\r
3181 PUSHJ PP,STOW ;STOW FULL WORD
\r
3183 BYTE3: PUSH PP,ARG
\r
3184 PUSHJ PP,EVALEX ;COMPUTE NEXT BYTE
\r
3186 DPB AC0,ARG ;STORE BYTE
\r
3188 DPB RC,AC0 ;STORE RELOCATION
\r
3193 DPB AC0,ARG ;STORE FORM BYTE
\r
3198 JRST BYTE1 ;YES, GET NEW BYTE SIZE
\r
3199 JRST OP3 ;NO, EXIT
\r
3200 \fRADX50: PUSHJ PP,EVALEX ;EVALUATE CODE
\r
3201 JUMPN RC,ERRAX ;ERROR IF NOT ABSOLUTE
\r
3204 PUSHJ PP,GETSYM ;YES, GET SYMBOL
\r
3205 TRZ ER,ERRA ;CLEAR ERROR
\r
3206 PUSHJ PP,SQOZE ;SQUOZE SIXBIT AND ADD CODE
\r
3207 IFN FORMSW,< MOVE AC1,HWFORM ;USE STANDARD FORM>
\r
3208 JRST STOW ;STOW CODE AND EXIT
\r
3211 SQOZE: MOVE AC1+1,AC0 ;PUT SIXBIT IN AC1+1
\r
3212 MOVEI AC0,0 ;CLEAR RESULT
\r
3213 SQOZ1: MOVEI AC1,0
\r
3214 LSHC AC1,6 ;PUT 6-BIT CHARACTER IN AC1
\r
3215 LDB AC1,[POINT 6,CSTAT(AC1),23] ;CONVERT TO RADIX50
\r
3216 IMULI AC0,50 ;MULTIPLY PREVIOUS RESULT
\r
3217 ADD AC0,AC1 ;ADD NEW CHARACTER
\r
3218 JUMPN AC1+1,SQOZ1 ;TEST FOR END
\r
3219 LSH ARG,?D30 ;LEFT-JUSTIFY CODE
\r
3220 IOR AC0,ARG ;MERGE WITH RESULT
\r
3222 \fREPEAT 0,< EXPLANATION OF ARRAY AND LVAR FEATURES
\r
3224 WHEN A VARIABLE IS SEEN EITHER BY #, INTEGER OR ARRAY
\r
3225 THE VALUE PORTION OF THE SYMBOL TABLE ENTRY (RH OF 2ND WORD)
\r
3226 IS USE TO HOLD THE DESIRED SIZE-1. THE CORRECT VALUE IS
\r
3227 ASSIGNED BY THE VAR PSEUDO OP.
\r
3229 WHEN LVAR IS SEEN, A SEARCH OF THE SYMBOL TABLE IS MADE
\r
3230 FOR ALL VARIABLES. THE VARF (VARIABLE) FLAG IS
\r
3231 LEFT ON AND EXTF AND PNTF ARE TURNED ON SO THAT THE
\r
3232 VARIABLE LOOKS LIKE AN EXTERNAL. THE POINTER
\r
3233 (RH OF 2ND WORD OF THE SYMBOL TABLE ENTRY) POINTS
\r
3234 TO THE HEADER BLOCK. THE HEADER BLOCK IS FORMATTED AS FOLLOWS:
\r
3235 WORD 1: LEFT HALF IS A POINTER TO SYMBOL TABLE FIXUP BLOCKS
\r
3236 RIGHT HALF IS A POINTER TO CODE FIXUP BLOCKS
\r
3237 WORD 2: 0 THIS IS USED TO DISTINGUISH IT FROM NORMAL EXTERNALS
\r
3238 WHICH HAVE THE SYMBOL NAME HERE
\r
3239 WORD 3: THE LOCATION RELATIVE TO THE START OF THE LOW CORE
\r
3242 CORE FIXUP BLOCKS ARE SET UP BY BOUT
\r
3244 WORD1: RH LINK TO NEXT CORE FIXUP BLOCK 0 IF END OF CHAIN
\r
3245 LH OFFSET. NUMBER TO BE ADDED TO SYMBOL VALUE BEFORE
\r
3247 WORD 2: POINTER TO A FIXUP CHAIN FOR RIGHT HALVES
\r
3248 LEFT HALF IS RELOCATION RH IS ADDRESS
\r
3249 WORD 3: SAME AS WORD 2 BUT FOR LEFT HALF FIXUPS
\r
3251 NOTE ALL THESE FIXUPS ARE CHAINED EVEN IF IN LEFT HALF.
\r
3252 SIMILARY ALL REFERENCES TO SAY A+1 ARE CHAINED
\r
3254 SYMBOL TABLE FIXUP BLOCKS. THESE ARE GENERATED BY SOUT
\r
3255 AS THE SYMBOL TABLE IS PUT OUT. THESE FIXUPS ARE ADDITIVE
\r
3258 WORD 1: RH LINK TO NEXT BLOCK
\r
3260 WORD 2: RADIX50 FOR THE SYMBOL
\r
3261 WORD 3: 200000,,0 IF RH FIXUP
\r
3262 600000,,0 IF LH FIXUP
\r
3264 SOUT ALSO SETS UP FIXLNK. FIXLNK POINTS TO THE CHAIN OF
\r
3265 ALL LVAR FIXUPS TO BE DONE. IT POINTS TO THE SECOND WORD
\r
3266 \fOF A 2 WORD BLOCK
\r
3268 WORD 1: LINK TO 2ND WORD OF NEXT BLOCK 0 IF END
\r
3269 WORD 2: RH POINTER TO A HEADER BLOCK
\r
3272 FIXUPS ARE BLOCK TYPE 13 AS FOLLOWS
\r
3273 WORD 1: THE PROGRAM BREAK (AS BLOCK TYPE 5)
\r
3274 WORD 2: THE NUMBER OF LOCATION USED FOR VARIABLES IN THE
\r
3277 REMAINING WORDS COME IN PAIRS AS FOLLOWS:
\r
3278 1ST WORD BIT 0=0 RH FIXUP
\r
3280 BIT 1=0 CORE FIXUP
\r
3281 WORD 2 LH POINTER TO CHAIN
\r
3283 BIT 1=1 SYMBOL FIXUP
\r
3288 REPEAT 0,< EXPLANATION OF ICC FEATURES
\r
3290 IF FORMSW IS SET NON ZERO THE FORM OF THE OCTAL LISTING OUTPUT
\r
3291 IS CHANGED FROM STANDARD HALF WORD FORM TO THE FOLLOWING:-
\r
3293 IF INSTRUCTION BYTE 9,4,1,4,18
\r
3294 IF I/O INSTRUCTION BYTE 3,7,3,1,4,18
\r
3295 IF BYTE POINTER BYTE 6,6,2,4,18
\r
3296 IF ASCII BYTE 7,7,7,7,7
\r
3297 IF SIXBIT BYTE 6,6,6,6,6,6
\r
3299 ALL OTHERS ARE STANDARD HALF WORD
\r
3301 THIS FEATURE CAN BE OVER RIDDEN BY USE OF /H SWITCH
\r
3302 STANDARD HALF WORD FORM IS THEN USED.
\r
3303 HOWEVER BECAUSE OF EXTRA SPACING THE OUTPUT IS PUSHED MORE
\r
3304 TO THE RIGHT AND LONG COMMENTS OVERFLOW THE LINE
\r
3306 \f; PSEUDO-END STATEMENT FOR MULTI-FILE CAPABILITY
\r
3308 ; HERE IF PRGEND (PASS 1)
\r
3309 PSEND0: TLO IO,MFLSW ;PSEND SEEN
\r
3310 PUSHJ PP,END0 ;AS IF END STATEMENT
\r
3311 HLLZS IO ;CLEAR ER(RH)
\r
3312 SETZM ERRCNT ;CLEAR ERROR COUNT FOR EACH PROG.
\r
3313 JUMP2 PSEND2 ;DIFFERENT ON PASS2
\r
3314 SKIPE UNIVSN ;SEEN A UNIVERSAL
\r
3315 PUSHJ PP,UNISYM ;YES, STORE SYMBOLS
\r
3316 PUSHJ PP,PSEND4 ;SAVE SYMBOLS, POINTERS AND TITLE
\r
3317 TLZ IO,IOTLSN ;CLEAR TITLE SEEN FLAG
\r
3318 PSEND1: TLZ IO,MFLSW ;FOR NEXT FILE
\r
3319 SETZM UNISCH ;CLEAR UNIVERSAL SEARCH TABLE
\r
3320 MOVE AC0,[UNISCH,,UNISCH+1]
\r
3321 BLT AC0,UNISCH+.UNIV-1
\r
3322 PUSHJ PP,OUTFF ;RESET PAGE COUNT
\r
3323 MOVSI AC0,1 ;SET SO RELOC 0 WORKS
\r
3324 JRST LOC10 ;FOR RELOC 0
\r
3326 ; HERE IF PRGEND (PASS 2)
\r
3327 PSEND2: SETZM SBUF ;SO SUBTTL IS NOT WRONG
\r
3328 PUSHJ PP,PSEND5 ;PUT TITLE BACK
\r
3329 PUSHJ PP,PSEND1 ;COMMON CODE
\r
3330 JRST PASS20 ;OUTPUT THE ENTRIES
\r
3332 ; HERE IF END (PASS 1)
\r
3333 PSEND3: PUSHJ PP,PSEND4 ;SAVE LAST PROGRAM
\r
3334 HLRS PRGPTR ;REINITIALIZE POINTER
\r
3335 PUSHJ PP,PSEND5 ;READ BACK FIRST PROGRAM
\r
3337 \f;HERE TO SAVE AND RESTORE SYMBOL TABLE, TITLE AND OTHER USEFUL LOCATIONS
\r
3338 XTRA==4 ;NUMBER OF OTHER LOCATIONS TO SAVE
\r
3340 PSEND4: MOVE V,FREE ;GET NEXT FREE LOCATION
\r
3341 ADDI V,LENGTH+.TBUF/5+XTRA
\r
3342 CAML V,SYMBOL ;WILL WORST CASE FIT?
\r
3343 PUSHJ PP,XCEED ;NO, EXPAND
\r
3345 HRR V,PRGPTR ;LAST PRGEND BLOCK
\r
3346 HLRM V,(V) ;LINK THIS BLOCK
\r
3347 SKIPN PRGPTR ;IF FIRST TIME
\r
3348 HLLZM V,PRGPTR ;SET LINK TO START OF CHAIN
\r
3349 HLRM V,PRGPTR ;POINTER TO IT
\r
3350 SETZM @FREE ;CLEAR LINK WORD
\r
3351 AOS FREE ;THIS LOCATION USED NOW
\r
3352 MOVS AC0,SYMBOL ;BOTTOM OF SYMBOL TABLE
\r
3353 HRR AC0,FREE ;FREE SPACE
\r
3354 MOVE V,@SYMBOL ;GET NUMBER OF SYMBOLS
\r
3355 ASH V,1 ;TWO WORDS PER SYMBOL
\r
3356 ADDI V,1 ;ONE MORE FOR COUNT
\r
3357 ADDB V,FREE ;END OF TABLE WHEN MOVED
\r
3358 BLT AC0,(V) ;MOVE TABLE
\r
3359 HRRZ AC0,JOBREL ;TOP OF CORE
\r
3361 MOVEM AC0,SYMTOP ;FOR NEXT SYMBOL TABLE
\r
3362 SUBI AC0,LENGTH ;LENGTH OF INITIAL SYMBOLS
\r
3363 MOVEM AC0,SYMBOL ;SET POINTER TO COUNT OF SYMBOLS
\r
3364 HRLI AC0,SYMNUM ;BLT POINTER
\r
3365 BLT AC0,@SYMTOP ;SET UP INITIAL SYMBOL TABLE
\r
3366 PUSHJ PP,SRCHI ;SET UP SEARCH POINTER
\r
3367 MOVEI AC0,.TBUF ;MAX NUMBER OF CHARS. IN TITLE
\r
3368 SUB AC0,TCNT ;ACTUAL NUMBER
\r
3369 IDIVI AC0,5 ;NUMBER OF WORDS
\r
3370 SKIPE AC1 ;REMAINDER?
\r
3372 MOVEM AC0,@FREE ;STORE COUNT
\r
3373 AOS FREE ;THIS LOCATION USED NOW
\r
3374 EXCH AC0,FREE ;SET UP AC0 FOR BLT
\r
3375 ADDM AC0,FREE ;WILL BE AFTER TITLE MOVES
\r
3376 HRLI AC0,TBUF ;BLT POINTER
\r
3377 BLT AC0,@FREE ;MOVE TITLE
\r
3378 MOVE AC2,LITHDX ;POINTER TO LIT INFO.
\r
3379 MOVE AC0,-1(AC2) ;SIZE OF PASS1 LOCO
\r
3380 PUSHJ PP,STORIT ;SAVE IT IN SYMBOL TABLE
\r
3381 MOVE AC2,VARHDX ;SAME FOR VARS
\r
3384 PSEND6: MOVE AC0,FREE ;GET NEXT FREE LOCATION
\r
3385 SUBI AC0,1 ;LAST ONE USED
\r
3386 HRRZ V,PRGPTR ;POINTER TO START OF DATA BLOCK
\r
3387 HRLM AC0,(V) ;LINK TO END OF BLOCK
\r
3390 \fPSENDX: PUSHJ PP,XCEED ;NEED TO EXPAND CORE FIRST
\r
3391 PSEND5: HRRZ AC0,JOBREL ;GET TOP OF CORE
\r
3393 MOVEM AC0,SYMTOP ;TOP OF NEW SYMBOL TABLE
\r
3394 HRRZ V,PRGPTR ;ADDRESS OF THIS BLOCK
\r
3395 JUMPE V,PSNDER ;ERROR LINK NOT SET UP
\r
3396 MOVE AC1,(V) ;NEXT LINK
\r
3397 MOVE V,1(V) ;GET ITS SYMBOL COUNT
\r
3398 ASH V,1 ;NUMBER OF WORDS
\r
3399 ADDI V,1 ;PLUS ONE FOR COUNT
\r
3400 SUBI AC0,(V) ;START OF NEW SYMBOL TABLE
\r
3401 CAMG AC0,FREE ;WILL IT FIT
\r
3402 JRST PSENDX ;NO, NEED TO EXPAND AND RESET AC0
\r
3403 ADD V,PRGPTR ;POINT TO END OF SYMBOL TABLE
\r
3404 MOVEI V,1(V) ;THEN TO BEG OF TITLE
\r
3405 MOVEM AC0,SYMBOL ;BOTTOM OF NEW TABLE
\r
3406 HRL AC0,PRGPTR ;ADDRESS OF FIRST WORD OF BLOCK
\r
3407 ADD AC0,[1,,0] ;MAKE BLT POINTER
\r
3408 HRRM AC1,PRGPTR ;POINT TO NEXT BLOCK
\r
3409 BLT AC0,@SYMTOP ;MOVE TABLE
\r
3410 PUSHJ PP,SRCHI ;SET UP POINTER
\r
3411 MOVE AC1,(V) ;NUMBER OF WORDS OF TITLE
\r
3412 MOVEI AC0,1(V) ;START OF STORED TITLE
\r
3413 ADD V,AC1 ;INCREMENT PAST TITLE
\r
3414 ADDI AC1,TBUF-1 ;END OF TITLE
\r
3415 HRLI AC0,TBUF ;WHERE TO PUT IT
\r
3416 MOVSS AC0 ;BLT POINTER
\r
3417 BLT AC0,(AC1) ;MOVE TITLE
\r
3418 TLO IO,IOTLSN ;SET AS IF TITLE SEEN
\r
3419 MOVE AC2,LITHDX ;INVERSE OF ABOVE
\r
3422 MOVE AC2,VARHDX ;SAME FOR VARS
\r
3427 STORIT: MOVEM AC0,@FREE ;STORE IT IN DATA BLOCK
\r
3428 AOS FREE ;ADVANCE POINTER
\r
3431 GETIT: MOVE AC0,1(V) ;FILL AC0 OUT OF PRGEND BLOCK
\r
3432 AOJA V,CPOPJ ;INCREMENT AND RETURN
\r
3434 PSNDER: HRROI RC,[SIXBIT /PRGEND ERROR @/]
\r
3436 \f;MULTIPLE SYMBOL TABLE FEATURE PSEUDO-OPS
\r
3438 UNIV0: JUMP2 TITLE0 ;DO IT ALL ON PASS 1
\r
3439 HRRZ SX,UNIVNO ;GET NUMBER OF UNIVERSALS SEEN
\r
3440 CAIL SX,.UNIV ;ALLOW ONE MORE?
\r
3441 JRST UNVERR ;NO, GIVE FATAL ERROR
\r
3442 AOS UNIVNO ;ONE MORE NOW
\r
3443 SETOM UNIVSN ;AND SET SEEN A UNIVERSAL
\r
3444 JRST TITLE0 ;CONTINUE AS IF TITLE
\r
3447 ADDUNV: PUSH PP,RC ;AN AC TO USE
\r
3448 PUSHJ PP,NOUT ;CONVERT TO SIXBIT
\r
3449 HRRZ RC,UNIVNO ;GET ENTRY INDEX
\r
3450 MOVEM AC0,UNITBL(RC) ;STORE SIXBIT NAME IN TABLE
\r
3451 HRRZS UNIVSN ;ONLY DO IT ONCE
\r
3452 POP PP,RC ;RESTORE RC
\r
3453 POPJ PP, ;AND RETURN
\r
3455 UNVERR: HRROI RC,[SIXBIT /TOO MANY UNIVERSALS@/]
\r
3458 UNISYM: HRRZ AC0,FREE ;GET HIGHEST FREE LOCATION
\r
3459 MOVEM AC0,JOBFF ;INTO JOBFF
\r
3460 PUSHJ PP,SUPRSA ;TURN ON SUPPRESS BIT
\r
3461 PUSH PP,SYMBOL ;NEED TO SAVE INCASE PRGEND
\r
3462 MOVE AC0,SYMTOP ;TOP OF TABLE
\r
3463 SUB AC0,SYMBOL ;GET LENGTH OF TABLE
\r
3464 HRL ARG,SYMBOL ;BOTTOM OF TABLE
\r
3465 HRR ARG,JOBFF ;WHERE TO GO
\r
3466 HRRZ RC,UNIVNO ;GET TABLE INDEX
\r
3467 HRRM ARG,SYMBOL ;WILL BE THERE SOON
\r
3468 HRRZM ARG,UNIPTR(RC) ;STORE IN CORRESPONDING PLACE
\r
3469 ADDB AC0,JOBFF ;WHERE TO END
\r
3470 HRLM AC0,UNIPTR(RC) ;SAVE NEW SYMTOP
\r
3471 BLT ARG,@JOBFF ;MOVE TABLE
\r
3472 HRRZM AC0,UNITOP ;SAVE TOP OF TABLES+1
\r
3473 CAMLE AC0,MACSIZ ;IN CASE OVER A K BOUND
\r
3474 MOVEM AC0,MACSIZ ;DON'T REDUCE SO FAR NOW
\r
3475 MOVEM AC0,FREE ;JUST IN CASE IN MACRO
\r
3476 MOVE AC0,SRCHX ;SAVE OLD SEARCH POINTER
\r
3477 PUSHJ PP,SRCHI ;GET SEARCH POINTER
\r
3479 MOVEM AC0,UNISHX(RC) ;SAVE IT
\r
3480 SETZM UNIVSN ;CLEAR FLAG INCASE PRGEND
\r
3481 POP PP,SYMBOL ;RESTORE OLD VALUE
\r
3484 \fSERCH0: PUSHJ PP,GETSYM ;GET A SYMBOL
\r
3485 JRST ERRAX ;ERROR IF NOT VALID
\r
3486 MOVEI RC,1 ;START AT ENTRY ONE
\r
3487 CAIL RC,.UNIV ;CHECK FOR CONSISTENCY ERROR
\r
3488 JRST SCHERR ;CANNOT FIND THIS ONE
\r
3489 CAME AC0,UNITBL(RC) ;LOOK FOR MATCH
\r
3490 AOJA RC,.-3 ;NOT FOUND YET
\r
3491 MOVE AC0,RC ;STORE TABLE ENTRY NUMBER
\r
3492 MOVEI RC,1 ;START AT ENTRY ONE
\r
3493 CAIL RC,.UNIV ;CHECK FOR CONSISTENCY ERROR
\r
3494 JRST SCHERR ;SHOULD NEVER HAPPEN!!
\r
3495 SKIPE UNISCH(RC) ;LOOK FOR AN EMPTY SLOT
\r
3496 AOJA RC,.-3 ;NOT FOUND YET
\r
3497 MOVEM AC0,UNISCH(RC) ;STORE INDEX IN TABLE
\r
3498 JUMPCM SERCH0 ;LOOK FOR MORE NAMES
\r
3499 POPJ PP, ;FINISHED
\r
3501 SCHERR: MOVSI RC,[SIXBIT /CANNOT FIND UNIVERSAL@/]
\r
3502 JRST ERRFIN ;NAME IN AC0
\r
3504 ;MESSAGE FOR CASE WHERE FILES AFTER UNIVERSAL USED MORE BUFFER SPACE THAN FIRST UNIVERSAL
\r
3505 UNIERR: HRROI RC,[SIXBIT /UNIVERSAL PROGRAM(S) MUST HAVE SAME OUTPUT SPECIFICATION AS OTHER FILES@/]
\r
3507 \fSUBTTL MACRO/REPEAT HANDLERS
\r
3509 REPEA0: PUSHJ PP,EVALXQ ;EVALUATE REPEAT EXP, EXTERNS ARE ILL.
\r
3512 REPEA1: JUMPLE AC0,REPZ ;PASS THE EXP., DONT PROCESS
\r
3513 SOJE AC0,REPO ;REPEAT ONCE
\r
3514 REPEA2: PUSHJ PP,GCHARQ ;GET STARTING "<"
\r
3517 PUSHJ PP,SKELI1 ;INITIALIZE SKELETON
\r
3520 PUSH MP,REPPNT ;STACK PREVIOUS REPEAT POINTER
\r
3521 MOVEM ARG,REPPNT ;STORE NEW POINTER
\r
3522 TDZA SDEL,SDEL ;YES, INITIALIZE BRACKET COUNT AND SKIP
\r
3524 REPEA4: PUSHJ PP,WCHARQ ;WRITE A CHARACTER
\r
3525 PUSHJ PP,GCHARQ ;GET A CHARACTER
\r
3527 AOJA SDEL,REPEA4 ;YES, INCREMENT AND WRITE
\r
3529 JRST REPEA4 ;NO, WRITE THE CHARACTER
\r
3530 SOJGE SDEL,REPEA4 ;YES, WRITE IF NON-NEGATIVE COUNT
\r
3531 MOVSI CS,(BYTE (7) 177,3) ;SET "REPEAT" END
\r
3532 PUSHJ PP,WWRXE ;WRITE END
\r
3533 SKIPN LITLVL ;LITERAL MIGHT END ON LINE
\r
3534 SKIPE MACLVL ;IF IN MACRO DARE NOT PROCESS
\r
3535 JRST .+3 ;REST OF LINE SINCE MACRO MIGHT END ON IT
\r
3536 PUSHJ PP,BYPASS ;BYPASS
\r
3537 PUSHJ PP,STOUTS ;POLISH OF LINE BEFORE PROCESSING REPEAT
\r
3538 PUSH MP,MRP ;STACK PREVIOUS READ POINTER
\r
3539 PUSH MP,RCOUNT ;SAVE WORD COUNT
\r
3540 HRRZ MRP,REPPNT ;SET UP READ POINTER
\r
3541 SKIPN MACLVL ;IF IN MACRO GIVE CR-LF FIRST
\r
3542 SKIPE LITLVL ;SAME FOR LITERAL
\r
3544 AOJA MRP,POPOUT ;BYPASS ARG COUNT
\r
3546 REPEA7: HRRZ MRP,REPPNT ;SET UP READ POINTER
\r
3547 ADDI MRP,1 ;BYPASS ARG COUNT
\r
3548 REPEA8: MOVEI C,CR
\r
3551 REPEND: SOSL REPEXP
\r
3553 HRRZ V,REPPNT ;GET START OF TREE
\r
3554 PUSHJ PP,REFDEC ;DECREMENT REFERENCE
\r
3559 SKIPN LITLVL ;IF IN LITERAL OR
\r
3560 SKIPE MACLVL ;IF IN MACRO
\r
3561 JRST RSW0 ;FINISH OF LINE NOW
\r
3564 \fREPZ: MOVE SDEL,SEQNO2 ;SAVE IN CASE OF END OF FILE
\r
3569 MOVEI SDEL,0 ;SET COUNT
\r
3570 REPZ1: PUSHJ PP,GCHAR ;GET NEXT CHARACTER
\r
3572 AOJA SDEL,REPZ1 ;YES, INCREMENT COUNT
\r
3574 SOJLE SDEL,REPZ2 ;YES, EXIT IF MATCHING
\r
3575 JRST REPZ1 ;NO, RECYCLE
\r
3576 REPZ2: SETZM INREP ;FLAG OUT OF IT
\r
3577 SETZM INCND ;AND CONDITIONAL ALSO
\r
3578 JRST STMNT ;AND EXIT
\r
3580 REPO: PUSHJ PP,GCHAR ;GET "<"
\r
3583 SKIPE RPOLVL ;ARE WE NESTED?
\r
3584 AOS RPOLVL ;YES, DECREMENT CURRENT
\r
3597 \fDEFIN0: PUSHJ PP,GETSYM ;GET MACRO NAME
\r
3598 JRST ERRAX ;EXIT ON ERROR
\r
3599 MOVEM PP,PPTMP1 ;SAVE POINTER
\r
3600 MOVEM AC0,PPTMP2 ;SAVE NAME
\r
3602 MOVE SX,SEQNO2 ;SAVE IN CASE OF EOF
\r
3606 SETOM INDEF ;AND FLAG IN DEFINE
\r
3607 SYN .TEMP,COMSW ;SAVE SPACE
\r
3608 SETZB SX,COMSW ;SET ARGUMENT AND REFERENCE COUNT AND COMMENT SWITCH
\r
3609 DEF02: PUSHJ PP,GCHAR ;SEARCH FOR "(" OR "<"
\r
3610 CAIG C,FF ;SEARCH FOR END OF LINE
\r
3611 CAIGE C,LF ;LF,VT, OR FF
\r
3612 JRST .+2 ;WASN'T ANY OF THEM
\r
3613 SETZM COMSW ;RESET COMMENT SWITCH
\r
3614 CAIN C,";" ;COMMENT?
\r
3615 SETOM COMSW ;YES, SET COMMENT SWITCH
\r
3616 SKIPE COMSW ;INSIDE A COMMENT?
\r
3617 JRST DEF02 ;YES, IGNORE CHARACTER
\r
3622 DEF10: PUSHJ PP,GETSYM ;YES, GET DUMMY SYMBOL
\r
3623 TRO ER,ERRA ;FLAG ERROR
\r
3624 ADDI SX,1 ;INCREMENT ARG COUNT
\r
3625 PUSH PP,AC0 ;STACK IT
\r
3626 CAIN C,'<' ;A DEFAULT ARGUMENT COMING UP?
\r
3627 JRST DEF80 ;YES, STORE IT AWAY
\r
3629 JRST DEF10 ;NO, GET NEXT DUMMY SYMBOL
\r
3630 DEF12: PUSHJ PP,GCHAR
\r
3633 DEF20: PUSH PP,[0] ;YES, MARK THE LIST
\r
3634 LSH SX,9 ;SHIFT ARG COUNT
\r
3636 PUSHJ PP,SKELI ;INITIALIZE MACRO SKELETON
\r
3637 MOVE AC0,PPTMP2 ;GET NAME
\r
3639 PUSHJ PP,MSRCH ;SEARCH THE TABLE
\r
3640 JRST DEF24 ;NOT FOUND
\r
3641 TLNN ARG,MACF ;FOUND, IS IT A MACRO?
\r
3642 TROA ER,ERRX ;NO, FLAG ERROR AND SKIP
\r
3643 PUSHJ PP,REFDEC ;YES, DECREMENT THE REFERENCE
\r
3644 DEF24: HRRZ V,WWRXX ;GET START OF TREE
\r
3645 SKIPN .TEMP ;ANY DEFAULT ARGUMENTS TO TAKE CARE OF?
\r
3647 HRRZ C,1(V) ;GET SHIFTED ARG COUNT
\r
3648 LSH C,-9 ;GET ARG COUNT BACK
\r
3649 ADDI C,1 ;ONE MORE FOR TERMINAL ZERO
\r
3650 ADD C,.TEMP ;NUMBER OF ITEMS IN STACK
\r
3652 SUB PP,C ;BACK UP STACK
\r
3653 MOVE SDEL,.TEMP ;NUMBER OF WORDS NEEDED
\r
3654 ADDB SDEL,FREE ;FROM FREE CORE
\r
3655 CAML SDEL,SYMBOL ;MORE CORE NEEDED
\r
3656 PUSHJ PP,XCEEDS ;YES, TRY TO GET IT
\r
3657 SUB SDEL,.TEMP ;FORM POINTER
\r
3658 HRLM SDEL,1(V) ;STORE IT WITH ARG COUNT IN MACRO
\r
3659 SUBI SDEL,1 ;TO USE FOR PUSHING POINTER INTO STORAGE
\r
3660 MOVEI C,1(PP) ;POINT TO START OF STACK
\r
3661 DEF26: MOVE ARG,(C) ;GET AN ITEM OFF STACK
\r
3662 TLNN ARG,-40 ;A POINTER?
\r
3663 JUMPN ARG,[PUSH SDEL,ARG ;YES, STORE IT
\r
3664 \f AOJA C,DEF26] ;GET NEXT
\r
3665 PUSH PP,ARG ;RESTACK ARGUMENT
\r
3666 SKIPE ARG ;FINISHED IF ZERO
\r
3667 AOJA C,DEF26 ;GET NEXT
\r
3668 PUSH SDEL,ARG ;STORE ZERO IN DEFAULT LIST ALSO
\r
3669 \fDEF25: MOVSI ARG,MACF
\r
3670 MOVEM PP,PPTMP2 ;STORE TEMP STORAGE POINTER
\r
3671 PUSHJ PP,INSERT ;INSERT/UPDATE
\r
3672 TLZ IO,DEFCRS ;JUST IN CASE
\r
3673 SETZM ARGF ;NO ARGUMENT SEEN
\r
3674 SETZM SQFLG ;AND NO ' SEEN
\r
3675 TDZA SDEL,SDEL ;CLEAR BRACKET COUNT
\r
3676 DEF30: PUSHJ PP,WCHAR ;WRITE CHARACTER
\r
3677 DEF31: PUSHJ PP,GCHAR ;GET A CHARACTER
\r
3678 DEF32: MOVE CS,C ;GET A COPY
\r
3679 CAIN C,";" ;IS IT A COMMENT
\r
3680 JRST CPEEK ;YES CHECK FOR ;;
\r
3681 DEF33: CAIG CS,"Z"+40 ;CONVERT LOWER CASE
\r
3685 \f CAIGE CS,40 ;TEST FOR CONTROL CHAR.
\r
3686 JRST [SKIPN SQFLG ;HAS SINGLE QUOTE BEEN SEEN?
\r
3687 JRST DEF30 ;NO, OUTPUT THIS CHAR.
\r
3688 PUSH PP,C ;YES, SAVE CURRENT CHAR
\r
3689 MOVEI C,47 ;SET UP QUOTE
\r
3690 PUSHJ PP,WCHAR;WRITE IT
\r
3691 POP PP,C ;GET BACK CURRENT CHAR.
\r
3692 SETZM SQFLG ;RESET FLAG
\r
3693 JRST DEF30] ;AND CONTINUE
\r
3695 JRST DEF30 ;TEST FOR SPECIAL
\r
3696 MOVE CS,CSTAT-40(CS) ;GET STATUS BITS
\r
3697 \f TLNE CS,6 ;ALPHA-NUMERIC?
\r
3699 SKIPN SQFLG ;WAS A ' SEEN?
\r
3700 JRST DEF36 ;NO, PROCESH
\r
3701 PUSH PP,C ;YES, SAVE CURRENT CHARACTER
\r
3702 MOVEI C,47 ;AND PUT IN A '
\r
3703 PUSHJ PP,WCHAR ;...
\r
3704 POP PP,C ;RESTORE CURRENT CHARACTER
\r
3705 SETZM SQFLG ;AND RESET FLAG
\r
3706 DEF36: CAIE C,47 ;IS THIS A '?
\r
3708 SKIPN ARGF ;YES, WAS LAST THING SEEN AN ARG?
\r
3709 SETOM SQFLG ;IF NOT, SET SNGL QUOT FLAG
\r
3710 SETZM ARGF ;BUT NOT ARGUMENT IN ANY CASE
\r
3711 JRST DEF31 ;GO GET NEXT CHARACTER
\r
3712 \fDEF35: SETZM ARGF ;THIS IS NOT AN ARGUMENT
\r
3714 AOJA SDEL,DEF30 ;YES, INCREMENT COUNT AND WRITE
\r
3716 SOJL SDEL,DEF70 ;YES, TEST FOR END
\r
3717 JRST DEF30 ;NO, WRITE IT
\r
3719 CPEEK: TLNN IO,IOPALL ;IF LALL IS ON
\r
3720 JRST DEF33 ;JUST RETURN
\r
3721 PUSHJ PP,PEEK ;LOOK AT NEXT CHAR.
\r
3722 CAIN C,";" ;IS IT ;;?
\r
3724 MOVE C,CS ;RESTORE C
\r
3725 JRST DEF33 ;AND RETURN
\r
3727 CPEEK1: PUSHJ PP,GCHAR ;GET THE CHAR.
\r
3728 CAIE C,">" ;RETURN IF END OF MACRO
\r
3729 CAIG C,CR ;IS CHAR ONE OF
\r
3730 CAIGE C,LF ;LF,VT,FF,CR
\r
3731 JRST CPEEK1 ;NO,SO GET NEXT CHAR.
\r
3732 JRST DEF32 ;YES,RETURN AND STORE
\r
3733 \fDEF40: MOVEI AC0,0 ;CLEAR ATOM
\r
3734 MOVSI AC1,(POINT 6,AC0) ;SET POINTER
\r
3735 DEF42: PUSH PP,C ;STACK CHARACTER
\r
3736 TLNE AC1,770000 ;HAVE WE STORED 6?
\r
3737 IDPB CS,AC1 ;NO, STORE IN ATOM
\r
3738 PUSHJ PP,GCHAR ;GET NEXT CHARACTER
\r
3743 SUBI CS,40 ;CONVERT LOWER TO UPPER
\r
3746 JRST DEF44 ;TEST SPECIAL
\r
3747 MOVE CS,CSTAT-40(CS) ;GET STATUS
\r
3748 TLNE CS,6 ;ALPHA-NUMERIC?
\r
3749 JRST DEF42 ;YES, GET ANOTHER
\r
3750 DEF44: PUSH PP,[0] ;NO, MARK THE LIST
\r
3751 MOVE SX,PPTMP1 ;GET POINTER TO TOP
\r
3753 DEF46: SKIPN 1(SX) ;END OF LIST?
\r
3755 CAME AC0,1(SX) ;NO, DO THEY COMPARE?
\r
3756 AOJA SX,DEF46 ;NO, TRY AGAIN
\r
3757 SUB SX,PPTMP1 ;YES, GET DUMMY SYMBOL NUMBER
\r
3759 MOVSI CS,<(BYTE (7) 177,101)>(SX) ;SET ESCAPE CODE MACEND
\r
3762 TLO CS,1000 ;YES, SET CRESYM FLAG
\r
3763 PUSHJ PP,WWORD ;WRITE THE WORD
\r
3764 SETOM ARGF ;SET ARGUMENT SEEN FLAG
\r
3765 SETZM SQFLG ;AND IGNORE ANY ' WAITING TO GET INTO STRING
\r
3766 DEF48: MOVE PP,PPTMP2 ;RESET PUSHDOWN POINTER
\r
3767 TLO IO,IORPTC ;ECHO LAST CHARACTER
\r
3768 JRST DEF31 ;RECYCLE
\r
3771 SKIPN SQFLG ;HAVE WE SEEN A '?
\r
3773 MOVEI C,47 ;YES, PUT IT IN
\r
3774 PUSHJ PP,WCHAR ;...
\r
3775 SETZM SQFLG ;AND CLEAR FLAG
\r
3776 DEF51: MOVE C,2(SX) ;GET CHARACTER
\r
3777 JUMPE C,DEF48 ;CLEAN UP IF END
\r
3778 PUSHJ PP,WCHAR ;WRITE THE CHARACTER
\r
3779 AOJA SX,DEF51 ;GET NEXT
\r
3781 DEF70: MOVE PP,PPTMP1 ;RESTORE PUSHDOWN POINTER
\r
3782 MOVSI CS,(BYTE (7) 177,1)
\r
3783 PUSHJ PP,WWRXE ;WRITE END
\r
3784 SETZM INDEF ;OUT OF IT
\r
3786 \f; HERE TO STORE DEFAULT ARGUMENTS
\r
3788 DEF80: AOS .TEMP ;COUNT ONE MORE
\r
3789 PUSHJ PP,SKELI1 ;INITIALIZE SKELETON
\r
3790 HRL V,SX ;SYMBOL NUMBER
\r
3791 PUSH PP,V ;STORE POINTER
\r
3792 TDZA SDEL,SDEL ;ZERO BRACKET COUNT
\r
3793 DEF81: PUSHJ PP,WCHARQ ;WRITE A CHARACTER
\r
3794 PUSHJ PP,GCHARQ ;GET A CHARACTER
\r
3795 CAIN C,"<" ;ANOTHER "<"?
\r
3796 AOJA SDEL,DEF81 ;YES, INCREMENT AND WRITE
\r
3797 CAIE C,">" ;CLOSING ANGLE?
\r
3798 JRST DEF81 ;NO, JUST WRITE THE CHAR.
\r
3799 SOJGE SDEL,DEF81 ;YES, WRITE IF NOT END
\r
3800 MOVSI CS,(BYTE (7) 177,2)
\r
3801 PUSHJ PP,WWRXE ;WRITE END OF DUMMY ARGUMENT
\r
3802 PUSHJ PP,GCHAR ;READ AT NEXT CHAR.
\r
3803 CAIE C,")" ;END OF ARGUMENT LIST?
\r
3804 JRST DEF10 ;NO, GET NEXT SYMBOL
\r
3805 JRST DEF12 ;YES, LOOK FOR "<"
\r
3806 \fSUBTTL MACRO CALL PROCESSOR
\r
3807 CALLM: SKIPGE MACENL ;ARE WE TRYING TO RE-ENTER?
\r
3808 JRST ERRAX ;YES, BOMB OUT WITH ERROR
\r
3809 HRROS MACENL ;FLAG "CALLM IN PROGRESS"
\r
3811 PUSH MP,V ;STACK FOR REFDEC
\r
3813 MOVEM AC0,CALNAM ;SAVE MACRO NAME INCASE OF ERROR
\r
3814 MOVE SDEL,SEQNO2 ;SAVE IN CASE OF EOF
\r
3818 ADDI V,1 ;POINT TO DUMMY SYMBOL COUNT
\r
3819 AOS SDEL,0(V) ;INCREMENT ARG COUNT
\r
3820 HLLZM SDEL,.TEMP ;DEFAULT ARG POINTER IF NON-ZERO
\r
3821 LSHC SDEL,-?D<9+36> ;ZERO SDEL, GET ARG COUNT IN SX
\r
3823 SKIPE .TEMP ;IF AT LEAST ONE DEFAULT ARG
\r
3824 HRRM SX,.TEMP ;STORE COUNT OF ARGS
\r
3825 PUSH PP,V ;STACK FOR MRP
\r
3826 PUSH PP,RP ;STACK FOR MACPNT
\r
3827 JUMPE SX,MAC20 ;TEST FOR NO ARGS
\r
3830 TROA SDEL,-1 ;NO, FUDGE PAREN COUNT AND SKIP
\r
3832 MAC10: PUSHJ PP,GCHAR ;GET A CHARACTER, LOOK FOR AN ARG
\r
3836 JRST MAC21 ;YES, END OF ARGUMENT STRING
\r
3838 PUSHJ PP,SKELI1 ;NO, INITIALIZE SKELETON
\r
3840 JRST MAC30 ;YES, PROCESS AS SPECIAL
\r
3843 JRST MAC40 ;YES, PROCESS SYMBOL
\r
3845 MAC14: CAIN C,"," ;","?
\r
3846 JRST MAC16 ;YES; NULL SYMBOL
\r
3848 ADDI SDEL,1 ;YES, INCREMENT COUNT
\r
3850 SOJL SDEL,MAC16 ;YES, TEST FOR END
\r
3851 PUSHJ PP,WCHAR ;WRITE INTO SKELETON
\r
3852 MAC14A: PUSHJ PP,CHARAC ;GET NEXT CHARACTER
\r
3856 JRST MAC15 ;TEST FOR END OF LINE
\r
3858 JRST MAC14 ;YES, END OF LINE
\r
3860 MAC15: TLO IO,IORPTC
\r
3861 MAC16: MOVSI CS,(BYTE (7) 177,2)
\r
3862 PUSHJ PP,WWRXE ;WRITE END
\r
3866 SOJLE SX,MAC20 ;BRANCH IF NO MORE ARGS
\r
3867 JUMPGE SDEL,MAC10 ;HAVEN'T SEEN TERMINAL ")" YET
\r
3868 \fMAC20: TLZN IO,IORPTC
\r
3871 JUMPE SX,MAC21B ;NO MISSING ARGS
\r
3872 MAC21A: PUSH MP,[-1] ;FILL IN MISSING ARGS
\r
3873 SKIPN .TEMP ;ANY DEFAULT ARGS?
\r
3875 HRRZ C,.TEMP ;GET ARG COUNT
\r
3876 SUBI C,-1(SX) ;ACCOUNT FOR THOSE GIVEN
\r
3877 HRLZS C ;PUT IN LEFT HALF
\r
3878 HLRZ SDEL,.TEMP ;ADDRESS OF TABLE
\r
3879 MAC21D: SKIPN (SDEL) ;END OF LIST
\r
3881 XOR C,(SDEL) ;TEST FOR CORRECT ARG
\r
3882 TLNN C,-1 ;WAS IT?
\r
3884 XOR C,(SDEL) ;BACK THE WAY IT WAS
\r
3885 AOJA SDEL,MAC21D ;AND TRY AGAIN
\r
3887 MAC21E: MOVEM C,(MP) ;REPLACE -1 WITH TREE POINTER
\r
3888 AOS 1(C) ;INCREMENT REFERENCE
\r
3889 MAC21C: SOJG SX,MAC21A
\r
3890 MAC21B: PUSH MP,[0] ;SET TERMINAL
\r
3892 TLNN IO,IOSALL ;SUPPRESSING ALL?
\r
3894 JUMPN MRP,MAC27 ;IN MACRO?
\r
3895 CAIE C,";" ;NO,IN COMMENT?
\r
3897 MAC22: PUSHJ PP,CHARAC ;YES,GET IT INTO THE LBUF
\r
3898 CAIG C,CR ;LESS THAN CR?
\r
3899 CAIGE C,LF ;AND GREATER THAN LF?
\r
3900 JRST MAC22 ;NO GET ANOTHER
\r
3901 MAC26: HRLZI SX,70000 ;DECREMENT BYTE POINTER
\r
3906 MAC27: HRLI C,-1 ;SET FLAG
\r
3909 MAC23: MOVEI SX,"?"
\r
3910 JUMPAD MAC24 ;BRANCH IF ADDRESS FIELD
\r
3911 CAIN C,";" ;IF SEMI-COLON
\r
3912 SKIPE LITLVL ;AND NOT IN A LITERAL
\r
3913 JRST MAC24 ;NOT BOTH TRUE
\r
3914 JUMPN MRP,MAC24 ;OR IN A MACRO
\r
3915 PUSHJ PP,STOUT ;LIST COMMENT OR CR-LF
\r
3916 TLNE IO,IOPALL ;MACRO EXPANSION SUPPRESSION?
\r
3917 TLO IO,IOMAC ; NO, SET TEMP BIT
\r
3918 TDOA C,[-1] ;FLAG LAST CHARACTER
\r
3919 MAC24: DPB SX,LBUFP ;SET ? INTO LINE BUFFER
\r
3920 MAC25: PUSH MP,MACPNT
\r
3923 PUSH MP,RCOUNT ;STACK WORD COUNT
\r
3924 PUSH MP,MRP ;STACK MACRO POINTER
\r
3925 POP PP,MRP ;SET NEW READ POINTER
\r
3928 HRRZS MACENL ;RESET "CALLM IN PROGRESS"
\r
3929 JUMPOC STMNT2 ;OP-CODE FIELD
\r
3930 JRST EVATOM ;ADDRESS FIELD
\r
3932 \fMAC30: MOVEI AC0,0 ;INITIALIZE BRACKET COUNTER
\r
3933 MAC31: PUSHJ PP,GCHAR ;GET A CHARACTER
\r
3935 ADDI AC0,1 ;YES, INCREMENT COUNT
\r
3937 SOJL AC0,MAC14A ;YES, EXIT IF MATCHING
\r
3938 PUSHJ PP,WCHAR ;WRITE INTO SKELETON
\r
3939 JRST MAC31 ;GO BACK FOR ANOTHER
\r
3941 MAC40: PUSH PP,SX ;STACK REGISTERS
\r
3943 HLLM IO,TAGINC ;SAVE IO FLAGS
\r
3944 PUSHJ PP,CELL ;GET AN ATOM
\r
3945 MOVE V,AC0 ;ASSUME NUMERIC
\r
3946 TLNE IO,NUMSW ;GOOD GUESS?
\r
3948 PUSHJ PP,SSRCH ;SEARCH THE SYMBOL TABLE
\r
3949 TROA ER,ERRX ;NOT FOUND, ERROR
\r
3950 MAC41: PUSHJ PP,MAC42 ;FORM ASCII STRING
\r
3951 HLL IO,TAGINC ;RESTORE IO FLAGS
\r
3954 TLO IO,IORPTC ;REPEAT LAST CHARACTER
\r
3955 JRST MAC14A ;RETURN TO MAIN SCAN
\r
3958 MAC44: LSHC C,-?D35
\r
3960 DIVI C,0(RX) ;DIVIDE BY CURRENT RADIX
\r
3962 JUMPE C,.+2 ;TEST FOR END
\r
3965 ADDI C,"0" ;FORM TEXT
\r
3966 JRST WCHAR ;WRITE INTO SKELETON
\r
3967 \fMACEN0: SOS MACENL
\r
3968 MACEND: SKIPGE C,MACENL ;TEST "CALLM IN PROGRESS"
\r
3969 AOS MACENL ;INCREMENT END LEVEL AND EXIT
\r
3972 POP MP,MRP ;RETRIEVE READ POINTER
\r
3973 POP MP,RCOUNT ;AND WORD COUNT
\r
3975 SKIPL 0(MP) ;TEST FLAG
\r
3976 PUSHJ PP,RSW2 ;MARK END OF SUBSTITUTION
\r
3979 SKIPA MP,MACPNT ;RESET MP AND SKIP
\r
3980 MACEN1: PUSHJ PP,REFDEC ;DECREMENT REFERENCE
\r
3981 MACEN2: AOS V,MACPNT ;GET POINTER
\r
3983 JUMPG V,MACEN1 ;IF >0, DECREMENT REFERENCE
\r
3984 JUMPL V,MACEN2 ;IF <0, BYPASS
\r
3985 POP MP,V ;IF=0, RETRIEVE POINTER
\r
3986 PUSHJ PP,REFDEC ;DECREMENT REFERENCE
\r
3990 SKIPN MACENL ;CHECK UNPROCESSED END LEVEL
\r
3991 JRST MACEN3 ;NONE TO PROCESS
\r
3992 TRNN MRP,-1 ;MRP AT END OF TEXT
\r
3993 JRST MACEN0 ;THEN POP THE MACRO STACK NOW
\r
3994 MACEN3: TRNN C,77400 ;SALL FLAG?
\r
3995 HRLI C,0 ;YES,TURN IT OFF
\r
3996 JUMPL C,REPEA8 ;IF FLAG SET SUBSTITUTE
\r
3998 \fIRP0: SKIPN MACLVL ;ARE WE IN A MACRO?
\r
3999 JRST ERRAX ;NO, BOMB OUT
\r
4000 IRP10: PUSHJ PP,MREADS ;YES, GET DATA SPEC
\r
4001 CAIE C,40 ;SKIP LEADING BLANKS
\r
4003 JRST IRP10 ;YES, BYPASS
\r
4006 CAIE C,177 ;NO, IS IT SPECIAL?
\r
4007 JRST ERRAX ;NO, ERROR
\r
4008 PUSHJ PP,MREADS ;YES
\r
4009 TRZN C,100 ;CREATED?
\r
4011 CAIL C,40 ;TOO BIG?
\r
4013 ADD C,MACPNT ;NO, FORM POINTER TO STACK
\r
4014 PUSH MP,IRPCF ;STACK PREVIOUS POINTERS
\r
4023 MOVEM AC0,IRPCF ;IRPC FLAG FOUND IN AC0
\r
4024 SETOM IRPSW ;RESET IRP SWITCH
\r
4030 JRST .-2 ;NO, SEARCH UNTIL FOUND
\r
4031 PUSHJ PP,SKELI1 ;INITIALIZE NEW STRING
\r
4032 MOVEM ARG,IRPPOI ;SET NEW POINTER
\r
4034 TDZA SDEL,SDEL ;ZERO BRACKET COUNT AND SKIP
\r
4035 IRP20: PUSHJ PP,WCHAR1
\r
4038 AOJA SDEL,IRP20 ;YES, INCREMENT COUNT AND WRITE
\r
4040 JRST IRP20 ;NO, JUST WRITE IT
\r
4041 SOJGE SDEL,IRP20 ;YES, WRITE IF NOT MATCHING
\r
4042 MOVE CS,[BYTE (7) 15,177,4]
\r
4043 PUSHJ PP,WWRXE ;WRITE END
\r
4044 PUSH MP,MRP ;STACK PREVIOUS READ POINTER
\r
4045 PUSH MP,RCOUNT ;AND WORD COUNT
\r
4047 JRST IRPPOP ;EXIT IF NOT VALID ARGUMENT
\r
4048 MOVEI C,1(CS) ;INITIALIZE POINTER
\r
4050 \fIRPSET: EXCH MRP,IRPARG ;SWAP READ POINTERS
\r
4051 MOVE SX,RCOUNT ;SWAP COUNT OF WORDS TO READ
\r
4054 PUSHJ PP,SKELI1 ;INITIALIZE SKELETON FOR DATA
\r
4055 HRRZM ARG,@IRPARP ;STORE NEW DS POINTER
\r
4056 SETZB SX,SDEL ;ZERO FOUND FLAG AND BRACKET COUNT
\r
4057 LDB C,MRP ;GET LAST CHAR
\r
4059 SKIPE IRPCF ;IN IRPC
\r
4061 MOVEI SX,1 ;FORCE ARGUMENT
\r
4062 IRPSE1: PUSHJ PP,MREADS
\r
4063 CAIE C,177 ;SPECIAL?
\r
4064 AOJA SX,IRPSE2 ;NO, FLAG AS FOUND
\r
4065 PUSHJ PP,PEEKM ;LOOK AT NEXT CHARACTER
\r
4066 SETZM IRPSW ;SET IRP SWITCH
\r
4067 JUMPG SX,IRPSE4 ;IF ARG FOUND, PROCESS IT
\r
4068 JRST IRPPOP ;NO, CLEAN UP AND EXIT
\r
4070 IRPSE2: SKIPE IRPCF ;IRPC?
\r
4071 JRST IRPSE3 ;YES, WRITE IT
\r
4072 CAIN C,"," ;NO, IS IT A COMMA?
\r
4073 JUMPE SDEL,IRPSE4 ;YES, EXIT IF NOT NESTED
\r
4075 ADDI SDEL,1 ;YES, INCREMENT COUNT
\r
4077 SUBI SDEL,1 ;YES, DECREMENT COUNT
\r
4079 IRPSE3: PUSHJ PP,WCHAR
\r
4080 SKIPN IRPCF ;IRPC?
\r
4081 JRST IRPSE1 ;NO, GET NEXT CHARACTER
\r
4083 IRPSE4: MOVSI CS,(BYTE (7) 177,2)
\r
4084 PUSHJ PP,WWRXE ;WRITE END
\r
4085 MOVEM MRP,IRPARG ;SAVE POINTER
\r
4086 MOVE MRP,RCOUNT ;SAVE COUNT
\r
4088 HRRZ MRP,IRPPOI ;SET FOR NEW SCAN
\r
4089 AOJA MRP,REPEA8 ;ON ARG COUNT
\r
4090 \fSTOPI0: SKIPN IRPARP ;IRP IN PROGRESS?
\r
4091 JRST ERRAX ;NO, ERROR
\r
4092 SETZM IRPSW ;YES, SET SWITCH
\r
4095 IRPEND: MOVE V,@IRPARP
\r
4097 SKIPE IRPSW ;MORE TO COME?
\r
4100 IRPPOP: MOVE V,IRPPOI
\r
4101 PUSHJ PP,REFDEC ;DECREMENT REFERENCE
\r
4103 POP MP,MRP ;RESTORE CELLS
\r
4112 \fGETDS: ;GET DUMMY SYMBOL NUMBER
\r
4113 MOVE CS,C ;USE CS FOR WORK REGISTER
\r
4115 ADD CS,MACPNT ;ADD BASE ADDRESS
\r
4116 MOVE V,0(CS) ;GET POINTER FLAG
\r
4117 JUMPG V,GETDS1 ;BRANCH IF POINTER
\r
4118 TRNN C,40 ;NOT POINTER, SHOULD WE CREATE?
\r
4119 JRST RSW0 ;NO, FORGET THIS ARG
\r
4121 PUSH PP,MWP ;STACK MACRO WRITE POINTER
\r
4122 PUSH PP,WCOUNT ;SAVE WORD COUNT
\r
4123 PUSHJ PP,SKELI1 ;INITIALIZE SKELETON
\r
4124 MOVEM ARG,0(CS) ;STORE POINTER
\r
4125 MOVE CS,[BYTE (7) 0,170,170,170,171] ;CREATE A SYMBOL
\r
4126 ADD CS,LSTSYM ;LSTSYM= # OF LAST CREATED
\r
4127 TDZ CS,[BYTE (7) 0,170,170,170,170]
\r
4129 IOR CS,[ASCII /.0000/]
\r
4132 PUSHJ PP,WWORD ;WRITE INTO SKELETON
\r
4133 MOVSI CS,(BYTE (7) 177,2)
\r
4134 PUSHJ PP,WWRXE ;WRITE END CODE
\r
4135 POP PP,WCOUNT ;RESTORE WORD COUNT
\r
4136 POP PP,MWP ;RESTORE MACRO WRITE POINTER
\r
4138 MOVE V,ARG ;SET UP FOR REFINC
\r
4140 GETDS1: PUSHJ PP,REFINC ;INCREMENT REFERENCE
\r
4141 HRL V,RCOUNT ;SAVE WORD COUNT
\r
4142 PUSH MP,V ;STACK V FOR DECREMENT
\r
4143 PUSH MP,MRP ;STACK READ POINTER
\r
4144 MOVEI MRP,1(V) ;FORM READ POINTER
\r
4149 HLREM V,RCOUNT ;RESTORE WORD COUNT
\r
4150 HRRZS V ;CLEAR COUNT
\r
4151 PUSHJ PP,REFDEC ;DECREMENT REFERENCE
\r
4153 \fSKELI1: MOVEI ARG,1 ;ENTRY FOR SINGLE ARG
\r
4154 SKELI: SETZ MWP, ;SIGNAL FIRST TIME THROUGH
\r
4155 PUSHJ PP,SKELWL ;GET POINTER WORD
\r
4156 HRRZM MWP,WWRXX ;SAVE FIRST ADDRESS
\r
4157 HRRZM MWP,LADR ;SAVE START OF LINKED LIST
\r
4158 HRRZM ARG,1(MWP) ;STORE COUNT
\r
4159 SOS WCOUNT ;ACCOUNT FOR WORD
\r
4160 HRRZ ARG,WWRXX ;SET FIRST ADDRESS
\r
4161 ADDI MWP,2 ;BUMP POINTER
\r
4162 HRLI MWP,(POINT 7) ;SET FOR 5 ASCII BYTES
\r
4163 ;SKELW RETURNS WITH ADR OF NEXT FREE LOC IN V (RIGHT)
\r
4165 SKELW: SOSLE WCOUNT ;STILL SOME SPACE IN LEAF?
\r
4166 POPJ PP, ;YES, RETURN
\r
4167 SKELWL: SKIPE V,NEXT ;GET FIRST FREE ADDRESS
\r
4168 JRST SKELW1 ;IF NON-ZERO, UPDATE FREE
\r
4169 MOVE V,FREE ;GET FREE
\r
4170 ADDI V,.LEAF ;INCREMENT BY LEAF SIZE
\r
4171 CAML V,SYMBOL ;OVERFLOW?
\r
4172 PUSHJ PP,XCEED ;YES, BOMB OUT
\r
4173 EXCH V,FREE ;UPDATE FREE
\r
4174 SETZM (V) ;CLEAR LINK
\r
4176 SKELW1: HLL V,0(V) ;GET ADDRESS
\r
4177 HLRM V,NEXT ;UPDATE NEXT
\r
4178 SKIPE MWP ;IF FIRST TIME
\r
4179 HRLM V,1-.LEAF(MWP) ;STORE LINK IN FIRST WORD OF LEAF
\r
4180 MOVEI MWP,.LEAF ;SIZE OF LEAF
\r
4181 MOVEM MWP,WCOUNT ;STORE FOR COUNT DOWN
\r
4182 MOVEI MWP,(V) ;SET UP WRITE POINTER
\r
4183 TLO MWP,(POINT 7,,21) ;2 ASCII CHARS
\r
4186 ;WWRXX POINTS TO END OF TREE
\r
4187 ;MWP IDPB POINTER TO NEXT HOLE
\r
4188 ;NEXT FIRST OF A LINKED PORTION THAT IS NOT BEING USED (LEAVES)
\r
4189 ;FREE POINTS TO FREE CORE BETWEEN TREE AND SYM-TABLE
\r
4190 ;LADR POINTS TO BEG OF LINKED PORTION.
\r
4191 \fGCHARQ: JUMPN MRP,MREADS ;IF GETTING CHAR. FROM TREE
\r
4192 GCHAR: PUSHJ PP,CHARAC ;GET ASCII CHARACTER
\r
4193 CAIG C,FF ;TEST FOR LF, VT OR FF
\r
4196 JRST OUTIM1 ;YES, LIST IT
\r
4200 WCHAR1: TLNN MWP,760000 ;END OF WORD?
\r
4201 PUSHJ PP,SKELW ;YES, GET ANOTHER
\r
4202 IDPB C,MWP ;STORE CHARACTER
\r
4205 WWORD: LSHC C,7 ;MOVE ASCII INTO C
\r
4206 PUSHJ PP,WCHAR1 ;STORE IT
\r
4207 JUMPN CS,WWORD ;TEST FOR END
\r
4208 POPJ PP, ;YES, EXIT
\r
4210 WWRXE: PUSHJ PP,WWORD ;WRITE LAST WORD
\r
4211 ADD MWP,WCOUNT ;GET TO END OF LEAF
\r
4212 SUBI MWP,.LEAF ;NOW POINT TO START OF IT
\r
4213 HRRZS (MWP) ;ZERO LEFT HALF OF LAST LEAF
\r
4214 HRRM MWP,@WWRXX ;SET POINTER TO END
\r
4216 \fMREAD: PUSHJ PP,MREADS ;READ ONE CHARACTER
\r
4217 CAIE C,177 ;SPECIAL?
\r
4218 JRST RSW1 ;NO, EXIT
\r
4219 PUSHJ PP,MREADS ;YES, GET CODE WORD
\r
4220 TRZE C,100 ;SYMBOL?
\r
4222 CAILE C,4 ;POSSIBLY ILLEGAL
\r
4224 HRRI MRP,0 ;NO, SIGNAL END OF TEXT
\r
4227 JRST MACEND ;1; END OF MACRO
\r
4228 JRST DSEND ;2; END OF DUMMY SYMBOL
\r
4229 JRST REPEND ;3; END OF REPEAT
\r
4230 JRST IRPEND ;4; END OF IRP
\r
4232 MREADI: HRLI MRP,700 ;SET UP BYTE POINTER
\r
4233 MOVEI C,.LEAF-1 ;NUMBER OF WORDS
\r
4235 MREADS: TLNN MRP,-1 ;FIRST TIME HERE?
\r
4236 JRST MREADI ;YES, SET UP MRP AND RCOUNT
\r
4237 TLNN MRP,760000 ;HAVE WE FINISHED WORD?
\r
4238 SOSLE RCOUNT ;YES, STILL ROOM IN LEAF?
\r
4239 JRST MREADC ;STILL CHAR. IN LEAF
\r
4240 HLRZ MRP,1-.LEAF(MRP);YES, GET LINK
\r
4241 HRLI MRP,(POINT 7,,21) ;SET POINTER
\r
4242 MOVEI C,.LEAF ;RESET COUNT
\r
4244 MREADC: ILDB C,MRP ;GET CHARACTER
\r
4247 PEEK: JUMPN MRP,PEEKM ;THIS IS A MACRO READ
\r
4248 PUSHJ PP,CHARAC ;READ AN ASCII CHAR.
\r
4249 TLO IO,IORPTC ;REPEAT FOR NEXT
\r
4250 POPJ PP, ;AND RETURN
\r
4252 PEEKM: PUSH PP,MRP ;SAVE MACRO READ POINTER
\r
4253 PUSH PP,RCOUNT ;SAVE WORD COUNT
\r
4254 PUSHJ PP,MREADS ;READ IN A CHAR.
\r
4255 POP PP,RCOUNT ;RESTORE WORD COUNT
\r
4256 POP PP,MRP ;RESET READ POINTER
\r
4257 POPJ PP, ;IORPTC IS NOT SET
\r
4258 \fREFINC: MOVEI CS,1(V) ;GET POINTER TO TREE
\r
4259 AOS 0(CS) ;INCREMENT REFERENCE
\r
4262 REFDEC: JUMPLE V,DECERR ;CATASTROPHIC ERROR SOMEWHERE
\r
4263 MOVEI CS,1(V) ;GET POINTER TO TREE
\r
4264 SOS CS,0(CS) ;DECREMENT REFERENCE
\r
4265 TRNE CS,000777 ;IS IT ZERO?
\r
4266 POPJ PP, ;NO, EXIT
\r
4267 HRRZ CS,0(V) ;YES, GET POINTER TO END
\r
4268 HRL CS,NEXT ;GET POINTER TO NEXT RE-USABLE
\r
4269 HLLM CS,0(CS) ;SET LINK
\r
4270 HRRM V,NEXT ;RESET NEXT
\r
4273 DECERR: MOVE AC0,CALNAM ;GET MACRO NAME
\r
4274 MOVSI RC,[SIXBIT /ERROR WHILE EXPANDING@/]
\r
4276 JRST ERRNE2 ;COMMON MESSAGE
\r
4277 \fA== 0 ;ASCII MODE
\r
4278 AL== 1 ;ASCII LINE MODE
\r
4279 IB== 13 ;IMAGE BINARY MODE
\r
4280 B== 14 ;BINARY MODE
\r
4281 IFE RUNSW,<DMP==16 ;DUMP MODE>
\r
4283 CTL== 0 ;CONTROL DEVICE NUMBER
\r
4284 BIN== 1 ;BINARY DEVICE NUMBER
\r
4285 CHAR== 2 ;INPUT DEVICE NUMBER
\r
4286 LST== 3 ;LISTING DEVICE NUMBER
\r
4288 ; COMMAND STRING ACCUMULATORS
\r
4292 ACEXT== 3 ;EXTENSION
\r
4294 ACDEL== 4 ;DELIMITER
\r
4295 ACPNTR==5 ;BYTE POINTER
\r
4303 DIRBIT==4 ;DIRECTORY DEVICE
\r
4307 DISBIT==2000 ;DISPLAY
\r
4308 CONBIT==20000 ;CONTROLING TTY
\r
4309 LPTBIT==40000 ;LPT
\r
4310 DSKBIT==200000 ;DSK
\r
4312 ;GETSTS ERROR BITS
\r
4314 IOIMPM==400000 ;IMPROPER MODE (WRITE LOCK)
\r
4315 IODERR==200000 ;DEVICE DATA ERROR
\r
4316 IODTER==100000 ;CHECKSUM OR PARITY ERROR
\r
4317 IOBKTL== 40000 ;BLOCK TOO LARGE
\r
4318 ERRBIT==IOIMPM!IODERR!IODTER!IOBKTL
\r
4321 \fSUBTTL I/O ROUTINES
\r
4323 HRRZ MRP,JOBREL ;GET LOWSEG SIZE
\r
4324 MOVEM MRP,MACSIZ ;SAVE CORE SIZE
\r
4325 ;DECODE VERSION NUMBER
\r
4326 MOVEI PP,JOBFFI ;TEMP PUSH DOWN STACK
\r
4327 PUSH PP,[0] ;MARK BOTTOM OF STACK
\r
4328 LDB 0,[POINT 3,JOBVER,2] ;GET USER BITS
\r
4329 JUMPE 0,GETE ;NOT SET IF ZERO
\r
4330 ADDI 0,"0" ;FORM NUMBER
\r
4331 PUSH PP,0 ;STACK IT
\r
4332 MOVEI 0,"-" ;SEPARATE BY HYPHEN
\r
4333 PUSH PP,0 ;STACK IT ALSO
\r
4334 GETE: HRRZ 0,JOBVER ;GET EDIT NUMBER
\r
4335 JUMPE 0,GETU ;SKIP ALL THIS IF ZERO
\r
4336 MOVEI 1,")" ;ENCLOSE IN PARENS.
\r
4338 GETED: IDIVI 0,8 ;GET OCTAL DIGITS
\r
4339 ADDI 1,"0" ;MAKE ASCII
\r
4340 PUSH PP,1 ;STACK IT
\r
4341 JUMPN 0,GETED ;LOOP TIL DONE
\r
4342 MOVEI 0,"(" ;OTHER PAREN.
\r
4344 GETU: LDB 0,[POINT 6,JOBVER,17] ;UPDATE NUMBER
\r
4345 JUMPE 0,GETV ;SKIP IF ZERO
\r
4346 IDIVI 0,8 ;MIGHT BE TWO DIGITS
\r
4347 ADDI 1,"@" ;FORM ALPHA
\r
4349 JUMPN 0,GETU+1 ;LOOP IF NOT DONE
\r
4350 GETV: LDB 0,[POINT 9,JOBVER,11] ;GET VERSION NUMBER
\r
4351 IDIVI 0,8 ;GET DIGIT
\r
4352 ADDI 1,"0" ;TO ASCII
\r
4354 JUMPN 0,GETV+1 ;LOOP
\r
4355 MOVE 1,[POINT 7,VBUF+1,13] ;POINTER TO DEPOSIT IN VBUF
\r
4356 POP PP,0 ;GET CHARACTER
\r
4357 IDPB 0,1 ;DEPOSIT IT
\r
4358 JUMPN 0,.-2 ;KEEP GOING IF NOT ZERO
\r
4359 IFN FORMSW,<IFE DFRMSW,<
\r
4360 SETOM PHWFMT ;HALF WORD UNLESS CHANGED BY SWITCH>>
\r
4363 RESET ;INITIALIZE PROGRAM
\r
4364 SETZM BINDEV ;CLEAR INCASE NOT USED NEXT TIME
\r
4365 SETZM LSTDEV ;SAME REASON
\r
4366 SETZM INDEV ;INCASE OF ERROR
\r
4367 HRRZ MRP,MACSIZ ;GET INITIAL SIZE
\r
4368 CORE MRP, ;BACK TO ORIGINAL SIZ4
\r
4369 JFCL ;SHOULD NEVER FAIL
\r
4371 MOVE [XWD PASS1I,PASS1I+1]
\r
4372 BLT PASS2X-1 ;ZERO THE PASS1 AND PASS2 VARIABLES
\r
4373 MOVEI PP,JOBFFI ;SET TEMP PUSH-DOWN POINTER
\r
4374 MOVE CS,[POINT 7,DBUF,6] ;INITIALIZE FOR DATE
\r
4375 MSTIME 2, ;GET TIME FROM MONITOR
\r
4376 PUSHJ PP,TIMOUT ;TIME FORMAT OUTPUT
\r
4378 IBP CS ;PASS OVER PRESET SPACE
\r
4379 PUSHJ PP,DATOUT ;DATE FORMAT OUTPUT
\r
4380 MOVSI FR,P1!CREFSW
\r
4382 MOVSI IO,IOPALL ;ZERO FLAGS
\r
4383 INIT CTL,AL ;INITIALIZE USER CONSOLE
\r
4386 EXIT ;NO TTY, NO ASSEMBLY
\r
4387 MOVSI C,(SIXBIT /TTY/)
\r
4388 DEVCHR C, ;GET CHARACTERISTICS
\r
4389 TLNN C,10 ;IS IT REALLY A TTY
\r
4391 INBUF CTL,1 ;INITIALIZE SINGLE CONTROL
\r
4392 OUTBUF CTL,1 ;BUFFERS
\r
4393 PUSHJ PP,CRLF ;OUTPUT CARRIAGE RETURN - LINE FEED
\r
4399 \fBINSET: PUSHJ PP,NAME1 ;GET FIRST NAME
\r
4400 TLNN FR,CREFSW ;CROSS REF REQUESTED?
\r
4401 JRST LSTSE1 ;YES, SKIP BINARY
\r
4402 CAIN C,"," ;COMMA?
\r
4403 JUMPE ACDEV,LSTSET ;YES, SKIP BINARY IF NO DEVICE SPECIFIED
\r
4404 CAIN C,"?" ;LEFT ARROW?
\r
4405 JUMPE ACDEV,LSTSE1 ;YES, SKIP BINARY IF NO DEVICE SPECIFIED
\r
4406 JUMPE ACDEV,M ;IGNORE IF JUST <CR-LF>
\r
4407 TLO FR,PNCHSW ;OK, SET SWITCH
\r
4408 MOVEM ACDEV,BINDEV ;STORE DEVICE NAME
\r
4409 MOVEM ACFILE,BINDIR ;STORE FILE NAME IN DIRECTORY
\r
4410 JUMPN ACEXT,.+2 ;EXTENSION SPECIFIED?
\r
4411 MOVSI ACEXT,(SIXBIT /REL/) ;NO, ASSUME RELOCATABLE BINARY
\r
4412 MOVEM ACEXT,BINDIR+1 ;STORE IN DIRECTORY
\r
4413 MOVEM ACPPN,BINDIR+3 ;SET PPN
\r
4414 OPEN BIN,BININI ;INITIALIZE BINARY
\r
4416 TLZE TIO,TIOLE ;SKIP TO EOT
\r
4418 TLZE TIO,TIORW ;REWIND REQUESTED?
\r
4420 JUMPGE CS,BINSE2 ;BRANCH IF NO BACK-SPACE
\r
4421 MTAPE BIN,17 ;BACK-SPACE A FILE
\r
4422 AOJL CS,.-1 ;TEST FOR END
\r
4424 STATO BIN,1B24 ;LOAD POINT?
\r
4425 MTAPE BIN,16 ;NO, GO FORWARD ONE
\r
4426 BINSE2: SOJG CS,.-1 ;TEST FORWARD SPACING
\r
4428 TLNE TIO,TIOCLD ;DIRECTORY CLEAR REQUESTED?
\r
4429 UTPCLR BIN, ;YES, CLEAR IT
\r
4430 OUTBUF BIN,2 ;SET UP TWO RING BUFFER
\r
4432 JRST GETSET ;NO LISTING
\r
4433 \fLSTSET: PUSHJ PP,NAME1 ;GET NEXT DEVICE
\r
4434 LSTSE1: CAIE C,"?"
\r
4436 TLNE FR,CREFSW ;CROSS-REF REQUESTED?
\r
4437 JRST LSTSE2 ;NO, BRANCH
\r
4438 JUMPN ACDEV,.+2 ;YES, WAS DEVICE SPECIFIED?
\r
4439 MOVSI ACDEV,(SIXBIT /DSK/) ;NO, ASSUME DSK
\r
4441 MOVE ACFILE,[SIXBIT /CREF/]
\r
4443 MOVSI ACEXT,(SIXBIT /CRF/)
\r
4444 LSTSE2: JUMPE ACDEV,GETSET ;FORGET LISTING IF NO DEVICE SPECIFIED
\r
4446 DEVCHR AC0, ;GET CHARACTERISTICS
\r
4447 TLNE AC0,LPTBIT!DISBIT!TTYBIT
\r
4448 TLNE FR,CREFSW ; WAS CROSS-REF REQUESTED?
\r
4449 AOSA OUTSW+0*TTYSW ;NO, ASSUME TTY
\r
4450 JRST ERRCM ;YES, ERROR - CREF DEV MUST NOT BE LPT, DIS, OR TTY
\r
4451 TLNE AC0,CONBIT ;CONTROLING TELETYPE LISTING?
\r
4452 JRST GETSET ;YES, BUFFER ALREADY SET
\r
4453 MOVEM ACDEV,LSTDEV ;STORE DEVICE NAME
\r
4454 AOS OUTSW+0*LPTSW ;SET FOR LPT
\r
4455 MOVEM ACFILE,LSTDIR ;STORE FILE NAME
\r
4457 MOVSI ACEXT,(SIXBIT /LST/)
\r
4458 MOVEM ACEXT,LSTDIR+1
\r
4459 MOVEM ACPPN,LSTDIR+3 ;SET PPN
\r
4460 OPEN LST,LSTINI ;INITIALIZE LISTING OUTPUT
\r
4464 TLZE TIO,TIORW ;REWIND REQUESTED?
\r
4472 LSTSE3: SOJG CS,.-1
\r
4473 TLNE TIO,TIOCLD ;DIRECTORY CLEAR REQUESTED?
\r
4474 UTPCLR LST, ;YES, CLEAR IT
\r
4475 OUTBUF LST,2 ;SET UP A TWO RING BUFFER
\r
4476 \fGETSET: MOVEI 3,PDPERR
\r
4477 HRRM 3,JOBAPR ;SET TRAP LOCATION
\r
4478 MOVEI 3,1B19 ;SET FOR PUSH-DOWN OVERFLOW
\r
4480 SOS 3,PDP ;GET PDP REQUEST MINUS 1
\r
4481 IMULI 3,.PDP ;COMPUTE SIZE (50*<NUMBER OF /P'S +1>)
\r
4483 HRR MP,JOBFF ;SET BASIC POINTER
\r
4486 MOVEM PP,RP ;SET RP
\r
4488 ASH 3,1 ;DOUBLE SIZE OF BASIC POINTER
\r
4490 SUBM PP,3 ;COMPUTE TOP LOCATION
\r
4491 SKIPN UNITOP ;IF ANY UNIVERSALS HAVE BEEN SEEN
\r
4493 HRRZS 3 ;GET TOP OF BUFFERS AND STACKS
\r
4494 CAMLE 3,UNISIZ ;HOPE ITS NOT BIGGER THAN UNIVERSAL ONE
\r
4495 JRST UNIERR ;IT WAS, YOU LOSE
\r
4496 SKIPA 3,UNITOP ;DON'T LOSE THEM
\r
4497 GETSE0: HRRZM 3,UNISIZ ;STORE UNTIL A UNIVERSAL IS SEEN
\r
4498 HRRZM 3,LADR ;SET START OF MACRO TREE
\r
4501 GETSE1: HRRZ JOBREL
\r
4503 MOVEM SYMTOP ;SET TOP OF SYMBOL TABLE
\r
4504 SUBI LENGTH ;SET POINTER FOR INITIAL SYMBOLS
\r
4505 CAMLE LADR ;HAVE WE ROOM?
\r
4508 HRRZ 2,JOBREL ;NO, TRY FOR MORE CORE
\r
4511 JRST XCEED2 ;NO MORE, INFORM USER
\r
4512 JRST GETSE1 ;TRY AGAIN
\r
4514 GETSE2: MOVEM SYMBOL ;SET START OF SYMBOL TABLE
\r
4516 BLT @SYMTOP ;STORE SYMBOLS
\r
4517 PUSHJ PP,SRCHI ;INITIALIZE TABLE
\r
4518 MOVE [XWD CTIBUF+1,CTLSAV] ;SAVE CONTROL INPUT BUFFER
\r
4519 BLT CTLS1 ;FOR RESCAN ON PASS 2
\r
4520 IFN FTDISK,<MOVSI (SIXBIT /DSK/) ;SET INPUT TO TAKE DSK AS DEV
\r
4522 PUSHJ PP,COUTI ;INIT OUTPUT JUST IN CASE
\r
4523 PUSHJ PP,INSET ;GET FIRST INPUT FILE
\r
4525 MOVE CS,INDIR ;SET UP NAME OF FIRST FILE
\r
4526 MOVEM CS,LSTFIL ;AS LAST PRINTED
\r
4528 JRST ASSEMB ;START ASSEMBLY
\r
4529 \fFINIS: CLOSE BIN, ;DUMP BUFFER
\r
4530 TLNE FR,PNCHSW ;PUNCH REQUESTED?
\r
4531 PUSHJ PP,TSTBIN ;YES, TEST FOR ERRORS
\r
4534 SOSLE OUTSW+0*LPTSW ;LPT TYPE OUTPUT?
\r
4535 PUSHJ PP,TSTLST ;YES, TEST FOR ERRORS
\r
4538 OUTPUT CTL,0 ;FLUSH TTY OUTPUT
\r
4539 SKIPE UNIVSN ;SKIP IF NOT ASSEMBLING UNIVERSAL
\r
4540 PUSHJ PP,UNISYM ;STORE SYMBOLS ETC. FIRST
\r
4541 JRST M ;RETURN FOR NEXT ASSEMBLY
\r
4542 \fINSET: MOVEI JOBFFI ;POINTER TO INPUT BUFFER
\r
4543 HRRM JOBFF ;INFORM SYSTEM OF BUFFER AREA
\r
4544 PUSHJ PP,NAME2 ;GET NEXT COMMAND NAME
\r
4545 JUMPE ACDEV,ERRNE ;ERROR IF NONE LEFT
\r
4546 MOVEM ACDEV,INDEV ;STORE DEVICE
\r
4547 MOVEM ACFILE,INDIR ;STORE FILE IN DIRECTORY
\r
4548 MOVEM ACPPN,INDIR+3 ;STORE PPN BEFORE WE LOSE IT
\r
4551 DEVCHR ACDEV, ;TEST CHARACTERISTICS
\r
4552 TLNN ACDEV,MTABIT ;MAG TAPE?
\r
4554 TLZN FR,MTAPSW ;FIRST MAG TAPE IN PASS 2?
\r
4556 TLNN TIO,TIORW ;YES, REWIND REQUESTED?
\r
4557 SUB CS,RECCNT ;NO, PREPARE TO BACK-SPACE TAPE
\r
4558 INSET1: AOS RECCNT ;INCREMENT FILE COUNTER
\r
4559 ADDM CS,RECCNT ;UPDATE COUNT
\r
4562 TLZE TIO,TIORW ;REWIND?
\r
4571 INSET2: SOJGE CS,.-1
\r
4573 INSET3: INBUF CHAR,1
\r
4574 MOVEI ACPNTR,JOBFFI
\r
4576 SUBI ACPNTR,JOBFFI
\r
4577 MOVEI ACDEL,NUMBUF*203+1
\r
4579 INBUF CHAR,(ACDEL)
\r
4580 JUMPN ACEXT,INSET4 ;TAKE USER'S EXTENSION IF NON-BLANK
\r
4581 MOVSI ACEXT,(SIXBIT /MAC/) ;BLANK, TRY .MAC FIRST
\r
4583 INSET4: PUSHJ PP,INSETI
\r
4584 JUMPE ACEXT,ERRCF ;ERROR IF ZERO
\r
4585 TLNE ACDEV,TTYBIT ;TELETYPE?
\r
4586 SETSTS CHAR,AL ;YES, CHANGE TO ASCII LINE
\r
4587 \f ;DO ALL ENTERS HERE FOR LEVEL D
\r
4588 SKIPE ENTERS ;HAVE ENTERS BEEN DONE ALREADY?
\r
4589 JRST ENTRDN ;YES, DON'T DO TWICE
\r
4590 SKIPN ACEXT,LSTDEV ;IS THERE A LIST DEVICE?
\r
4591 JRST LSTSE5 ;NO SO DON'T DO ENTER
\r
4592 SKIPN ACFILE,LSTDIR ;GET FILE NAME INCASE OF ERROR
\r
4593 JRST [DEVCHR ACEXT,
\r
4594 TLNE ACEXT,DIRBIT ;DOES IT HAVE A DIRECTORY?
\r
4595 JRST LSTSE4 ;YES, GIVE UP BEFORE HARM IS DONE
\r
4596 SKIPE ACFILE,INDIR ;USE INPUT FILE NAME
\r
4597 MOVEM ACFILE,LSTDIR ;TOO BAD IF ZERO ALSO
\r
4599 HLLZ ACEXT,LSTDIR+1 ;EXT ALSO
\r
4600 MOVE ACPPN,LSTDIR+3 ;SAVE PPN
\r
4601 LOOKUP LST,LSTDIR ;PREVIOUS ONE STILL THERE
\r
4603 SETZM LSTDIR ;YES,CLEAR NAME
\r
4604 MOVEM ACPPN,LSTDIR+3 ;RESET PPN
\r
4606 CLOSE LST, ;IGNORE FAILURE
\r
4607 MOVEM ACFILE,LSTDIR ;RESTORE NAME
\r
4608 HLLZS LSTDIR+1 ;BH 11/19/74 FOR DATE75. CLEAR RH.
\r
4609 SETZM LSTDIR+2 ;CLEAR PROTECTION AND DATE
\r
4610 MOVEM ACPPN,LSTDIR+3 ;SET PPN AGAIN
\r
4613 ENTER LST,LSTDIR ;SET UP DIRECTORY
\r
4615 LSTSE5: SKIPN ACEXT,BINDEV ;A BINARY DEVICE THEN ?
\r
4617 SKIPN ACFILE,BINDIR ;INCASE OF ERROR
\r
4618 JRST [DEVCHR ACEXT,
\r
4619 TLNE ACEXT,DIRBIT ;DOES IT HAVE A DIRECTORY?
\r
4620 JRST .+1 ;YES, GIVE UP BEFORE HARM IS DONE
\r
4621 SKIPE ACFILE,INDIR ;USE INPUT FILE NAME
\r
4622 MOVEM ACFILE,BINDIR ;TOO BAD IF ZERO ALSO
\r
4625 HLLZS ACEXT,BINDIR+1 ;BH 11/19/74 DATE75. WAS HLLZ.
\r
4626 ENTER BIN,BINDIR ;ENTER FILE NAME
\r
4629 ENTRDN: SETOM ENTERS ;MAKE SURE ONLY DONE ONCE
\r
4630 MOVE CS,[POINT 7,DEVBUF]
\r
4631 PUSH PP,1 ;SAVE THE ACCS
\r
4634 SKIPN 2,INDIR ;GET INPUT NAME
\r
4635 JRST FINDEV ;FINISHED WITH DEVICE
\r
4636 SETZ 1, ;CLEAR FOR RECEIVING
\r
4637 LSHC 1,6 ;SHIFT ONE CHAR. IN
\r
4638 ADDI 1,40 ;FORM ASCII
\r
4639 IDPB 1,CS ;STORE CHAR.
\r
4640 JUMPN 2,.-4 ;MORE TO DO?
\r
4641 MOVEI 1," " ;SEPARATE BY TAB
\r
4643 HLLZ 2,INDIR+1 ;GET EXT
\r
4644 JUMPE 2,FINEXT ;NO EXT
\r
4646 LSHC 1,6 ;SAME LOOP AS ABOVE
\r
4650 FINEXT: MOVEI 1," "
\r
4651 IDPB 1,CS ;SEPARATE BY TAB
\r
4652 LDB 1,[POINT 12,INDIR+2,35] ;GET DATE
\r
4653 LDB 2,[POINT 3,INDIR+1,20] ;BH 11/19/74 DATE75.
\r
4654 DPB 2,[POINT 3,1,23] ;BH 11/19/74 DATE75.
\r
4655 JUMPE 1,FINDEV ;NO DATE?
\r
4656 PUSHJ PP,DATOUT ;STORE IT
\r
4657 LDB 2,[POINT 11,INDIR+2,23] ;GET CREATION TIME
\r
4658 JUMPE 2,FINDEV ;NO TIME (DECTAPE)
\r
4659 MOVEI 1," " ;SEPARATE BY SPACE
\r
4661 PUSHJ PP,TIMOU1 ;STORE TIME
\r
4663 MOVEI 2," " ;FINAL TAB
\r
4665 IDPB 1,CS ;TERMINATE FOR NOW
\r
4666 POP PP,3 ;RESTORE ACCS
\r
4669 SKIPN PAGENO ;IF FIRST TIME THRU
\r
4670 JRST OUTFF ;START NEW PAGE
\r
4671 SETZM PAGENO ;ON NEW FILE, RESET PAGES
\r
4672 JRST OUTFF2 ;DON'T START NEW PAGE UNLESS FF
\r
4674 INSETI: HLLZM ACEXT,INDIR+1 ;STORE EXTENSION
\r
4675 MOVE ACPPN,INDIR+3 ;SAVE PPN
\r
4677 SKIPA ACEXT,INDIR+1 ;GET ERROR CODE
\r
4678 JRST CPOPJ1 ;SKIP-RETURN IF FOUND
\r
4679 TRNE ACEXT,-1 ;ERROR CODE OF 0 IS FILE NOT FOUND
\r
4680 JRST ERRCF ;FILE THERE BUT NOT READABLE
\r
4681 SETZ ACEXT, ;CLEAR EXT AND TRY AGAIN
\r
4682 MOVEM ACPPN,INDIR+3 ;RESTORE PPN
\r
4684 \fREC2: MOVS [XWD CTIBUF+1,CTLSAV] ;RESCAN CONTROL (FROM PASS1 END STMNT)
\r
4685 BLT CTIBUF+2 ;INPUT BUFFER
\r
4687 HRLM ACDELX ;FUDGE PREVIOUS DELIMITER
\r
4689 MOVE [XWD PASS2I,PASS2I+1]
\r
4690 BLT PASS2X-1 ;ZERO PASS2 VARIABLES
\r
4691 TLO FR,MTAPSW!LOADSW ;SET FLAGS
\r
4693 GOTEND: MOVE INDEV ;GET LAST DEVICE
\r
4694 DEVCHR ;GET ITS CHARACTERISTICS
\r
4695 TLNE 4 ;TEST FOR DIRECTORY (DSK OR DTA)
\r
4696 JRST EOT ;YES, SO DON'T WASTE TIME
\r
4697 JRST .+3 ;NO, INPUT BUFFER BY BUFFER
\r
4699 JRST .-1 ;NO ERRORS
\r
4700 STATO CHAR,1B22 ;TEST FOR EOF
\r
4701 JRST .-3 ;IGNORE ERRORS
\r
4703 EOT: PUSHJ PP,SAVEXS ;SAVE REGISTERS
\r
4704 PUSHJ PP,INSET ;GET THE NEXT INPUT DEVICE
\r
4705 HRROI RC,[SIXBIT /END OF PASS 1@/] ;ASSUME END OF PASS
\r
4706 TLZN FR,LOADSW ;ZERO ONLY ON END OF PASS 1
\r
4707 HRROI RC,[SIXBIT /LOAD THE NEXT FILE@/] ;NOT END OF PASS
\r
4708 TLNN ACDEV,(1B13!1B15) ;WAS ALL THAT WORK NECESSARY?
\r
4709 PUSHJ PP,TYPMSG ;YES
\r
4711 RSTRXS: MOVSI RC,SAVBLK ;SET POINTER
\r
4712 BLT RC,RC-1 ;RESTORE REGISTERS
\r
4713 MOVE RC,SAVERC ;RESTORE RC
\r
4716 SAVEXS: MOVEM RC,SAVERC ;SAVE RC
\r
4717 MOVEI RC,SAVBLK ;SET POINTER
\r
4718 BLT RC,SAVBLK+RC-1 ;BLT ALL REGISTERS BELOW RC
\r
4720 \fNAME1: SETZM ACDEVX ;ENTRY FOR DESTINATION
\r
4721 NAME2: SETZB ACDEV,INDIR+2 ;ENTRY FOR SOURCE
\r
4722 MOVEI ACFILE,0 ;CLEAR FILE
\r
4723 HLRZ ACDEL,ACDELX ;GET PREVIOUS DELIMITER
\r
4725 SETZB ACEXT,INDIR+3 ;RESET EXTENSION AND PROGRAM-NUMBER PAIR
\r
4726 SETZM PPN ;CLEAR PPN
\r
4727 NAME3: MOVSI ACPNTR,(POINT 6,AC0) ;SET POINTER
\r
4728 TDZA AC0,AC0 ;CLEAR SYMBOL
\r
4730 SLASH: PUSHJ PP,SW0
\r
4731 GETIOC: PUSHJ PP,TTYIN ;GET INPUT CHARACTER
\r
4740 CAIE C,33 ;CHECK FOR THREE FLAVORS OF ALT-MODE
\r
4743 CAIG C,CR ;LESS THAN CR?
\r
4744 CAIGE C,LF ;AND GREATER THAN LF?
\r
4745 CAIN C,175 ;OR 3RD ALTMOD
\r
4747 IFN FTDISK,<CAIN C,"["
\r
4748 JRST PROGNP ;GET PROGRAMER NUMBER PAIR>
\r
4749 CAIN C,"=" ;EQUALS IS SAME AS LEFT ARROW
\r
4750 TRCA C,142 ;SO MAKE IT A "?" AND SKIP
\r
4754 CAIGE C,40 ;VALID AS SIXBIT?
\r
4755 JRST [CAIN C,"Z"-100 ;NO,IS IT ?Z
\r
4756 EXIT ;YES,EXIT FOR BATCH
\r
4757 JRST GETIOC] ;JUST IGNORE
\r
4758 SUBI C,40 ;CONVERT TO 6-BIT
\r
4759 TLNE ACPNTR,770000 ;HAVE WE STORED SIX BYTES?
\r
4760 IDPB C,ACPNTR ;NO, STORE IT
\r
4761 JRST GETIOC ;GET NEXT CHARACTER
\r
4763 DEVICE: JUMPN ACDEV,ERRCM ;ERROR IF ALREADY SET
\r
4764 MOVE ACDEV,AC0 ;DEVICE NAME
\r
4765 JRST DEVNAM ;COMMON CODE
\r
4767 NAME: JUMPN ACFILE,ERRCM ;ERROR IF ALREADY SET
\r
4768 MOVE ACFILE,AC0 ;FILE NAME
\r
4769 DEVNAM: MOVE ACDEL,C ;SET DELIMITER
\r
4770 JRST NAME3 ;GET NEXT SYMBOL
\r
4772 TERM: JUMPE ACDEL,TERM1 ;IF NO PREVIOUS TERMINATOR, THEN FILENAME
\r
4773 CAIN ACDEL,"?" ;...
\r
4775 CAIE ACDEL,":" ;IF PREVIOUS DELIMITER
\r
4776 CAIN ACDEL,"," ;WAS COLON OR COMMA
\r
4777 TERM1: MOVE ACFILE,AC0 ;SET FILE
\r
4778 CAIN ACDEL,"." ;IF PERIOD,
\r
4779 HLLZ ACEXT,AC0 ;SET EXTENSION
\r
4780 HRLM C,ACDELX ;SAVE PREVIOUS DELIMITER
\r
4781 JUMPN ACDEV,.+2 ;IF DEVICE SET USE IT
\r
4782 SKIPA ACDEV,ACDEVX ;OTHERWISE USE LAST DEVICE
\r
4783 MOVEM ACDEV,ACDEVX ;AND DEVICE
\r
4784 MOVE ACPPN,PPN ;PUT PPN IN RIGHT PLACE
\r
4785 IFN FTDISK,<CAIN C,"!" ;IMPERATIVE?
\r
4786 POPJ PP, ;YES, DON'T ASSUME DEV
\r
4787 JUMPE ACFILE,CPOPJ ;IF THERE IS A FILE,
\r
4788 JUMPN ACDEV,.+2 ;BUT NO DEVICE
\r
4789 MOVSI ACDEV,(SIXBIT /DSK/) ;THEN ASSUME DISK>
\r
4791 \fERRCM: HRROI RC,[SIXBIT /COMMAND ERROR@/]
\r
4794 IFN FTDISK,<PROGNP:
\r
4795 PROGN1: HRLZM RC,PPN ;COMMA, STORE LEFT HALF
\r
4796 PROGN2: MOVEI RC,0 ;CLEAR AC
\r
4797 PROGN3: PUSHJ PP,TTYIN
\r
4799 JRST PROGN1 ;STORE LEFT HALF
\r
4800 HRRM RC,PPN ;ASSUME TERMINAL
\r
4802 JRST GETIOC ;YES, RETURN TO MAIN SCAN
\r
4803 CAIL C,"0" ;CHECK FOR VALID NUMBERS
\r
4805 JRST ERRCM ;NOT VALID
\r
4806 LSH RC,3 ;SHIFT PREVIOUS RESULT
\r
4807 ADDI RC,-"0"(C) ;ADD IN NEW NUMBER
\r
4808 JRST PROGN3 ;GET NEXT CHARACTER>
\r
4809 \fSWITC0: PUSHJ PP,SW1 ;PROCESS CHARACTER
\r
4810 SWITCH: PUSHJ PP,TTYIN ;GET NEXT CHARACTER
\r
4811 CAIE C,")" ;END OF STRING?
\r
4815 SW0: PUSHJ PP,TTYIN
\r
4816 SW1: MOVEI C,-"A"(C) ;CONVERT FROM ASCII TO NUMERIC
\r
4817 CAILE C,"Z"-"A" ;WITHIN BOUNDS? (IS IT ALPHA?)
\r
4818 JRST ERRCM ;NO, ERROR
\r
4819 MOVE RC,[POINT 4,BYTAB]
\r
4821 SOJGE C,.-1 ;MOVE TO PROPER BYTE
\r
4822 LDB C,RC ;PICK UP BYTE
\r
4823 JUMPE C,ERRCM ;TEST FOR VALID SWITCH
\r
4824 CAIG C,SWTABT-SWTAB ;LEGAL ON SOURCE?
\r
4825 JUMPL PP,ERRCM ;NO, TEST FOR SOURCE
\r
4826 LDB RC,[POINT 4,SWTAB-1(C),12]
\r
4828 SKIPN CTLSAV ;IF PASS2 OR IO SWITCH,
\r
4829 XCT SWTAB-1(C) ;EXECUTE INSTRUCTION
\r
4831 TLZ IO,IOSALL ;TAKE CARE OF /X
\r
4834 DEFINE HELP (TEXT)<
\r
4841 /A advance one file
\r
4842 /B backspace one file
\r
4843 /C produce a cref listing
\r
4844 /E list macro expansions (LALL)
\r
4845 /F list in new format (.MFRMT)
\r
4846 /G list in old format (.HWFRMT)
\r
4848 /L reinstate listing (LIST)
\r
4849 /M suppress ascii in macro and repeat expansion (SALL)
\r
4850 /N suppress error printout on tty
\r
4851 /O set MLOFF pseudo-op
\r
4852 /P increase size of the pushdown stack
\r
4853 /Q suppress Q errors on the listing
\r
4854 /S suppress listing (XLIST)
\r
4856 /X suppress all macro expansions (XALL)
\r
4857 /Z zero the directory
\r
4858 Switches A,B,C,T,W,X, and Z must immediately follow
\r
4859 the device or file to which they refer.
\r
4861 \f DEFINE SETSW (LETTER,INSTRUCTION) < INSTRUCTION
\r
4862 J= <"LETTER"-"A">-?D9*<I=<"LETTER"-"A">/?D9>
\r
4865 DEFINE SETCOD (I,J)
\r
4866 <BYTAB'I=BYTAB'I!<.-SWTAB>B<4*J+3>>
\r
4868 BYTAB0= 0 ;INITIALIZE TABLE
\r
4873 SETSW Z,<TLO TIO,TIOCLD >
\r
4874 SETSW C,<TLZ FR,CREFSW >
\r
4875 SETSW P,<SOS PDP >
\r
4876 SWTABT: ;THE ABOVE SW'S ARE LEGAL ON OUTPUT ONLY
\r
4877 SETSW A,<ADDI CS,1 >
\r
4878 SETSW B,<SUBI CS,1 >
\r
4879 SETSW E,<TLZ IO,IOPALL!IOSALL >
\r
4880 IFN FORMSW,< SETSW F,<SETZM HWFMT>
\r
4881 SETSW G,<SETOM HWFMT>>
\r
4882 SETSW H,<OUTSTR HLPMES>
\r
4883 SETSW L,<TLZ IO,IOMSTR >
\r
4884 SETSW M,<TLO IO,IOPALL!IOSALL >
\r
4885 SETSW N,<HLLOS TYPERR >
\r
4886 SETSW O,<XCT OFFML >
\r
4887 SETSW Q,<TLO FR,ERRQSW >
\r
4888 SETSW S,<TLO IO,IOMSTR >
\r
4889 SETSW T,<TLO TIO,TIOLE >
\r
4890 SETSW W,<TLO TIO,TIORW >
\r
4891 SETSW X,<TLOA IO,IOPALL >
\r
4893 BYTAB: ;BYTAB CONTAINS AN INDEX TO SWTAB
\r
4894 ;IT CONSIST OF 9 4BIT BYTES/WORD
\r
4895 ;OR ONE BYTE FOR EACH LETTER
\r
4897 +BYTAB0 ;A-I BYTE = 1 THROUGH 17 = INDEX
\r
4898 +BYTAB1 ;J-R BYTE = 0 = COMMAND ERROR
\r
4901 IF2,<PURGE I,J,BYTAB0,BYTAB1,BYTAB2>
\r
4902 \fTTYIN: SOSGE CTIBUF+2 ;ENUF CHAR.?
\r
4904 ILDB C,CTIBUF+1 ;GET CHARACTER
\r
4905 CAIE C," " ;SKIP BLANKS
\r
4906 CAIN C,HT ;AND TABS
\r
4909 SETZM CTIBUF+2 ;YES,IGNORE REST OF LINE
\r
4910 CAIG C,"Z"+40 ;CHECK FOR LOWER CASE
\r
4914 POPJ PP, ;YES, EXIT
\r
4916 TTYERR: SKIPN INDEV ;INPUT DEVICE SEEN?
\r
4917 JRST ERRCM ;NO, SO MISSING "?"
\r
4918 ERRNE: HRROI RC,[SIXBIT /?NO END STATEMENT ENCOUNTERED ON INPUT FILE@/]
\r
4919 ERRNE0: SKPINC V ;SEE IF WE CAN INPUT A CHAR.
\r
4920 JFCL ;BUT ONLY TO DEFEAT ?O
\r
4921 PUSHJ PP,TYPMSG ;OUTPUT IT
\r
4922 SKIPE LITLVL ;SEE IF IN LITERAL
\r
4923 SKIPN LITPG ;PAGE 0 MEANS NOT IN A LITERAL REALY
\r
4924 JRST ERRNE1 ;NO, TRY OTHERS
\r
4925 MOVE V,[XWD [SIXBIT /IN LITERAL@/],LITPG]
\r
4926 PUSHJ PP,PRNUM ;GO PRINT INFORMATION
\r
4927 ERRNE1: MOVEI V,0 ;CHECK FOR OTHER PLACES
\r
4929 MOVE V,[XWD [SIXBIT /IN DEFINE@/],DEFPG]
\r
4931 MOVE V,[XWD [SIXBIT /IN TEXT@/],TXTPG]
\r
4933 MOVE V,[XWD [SIXBIT /IN CONDITIONAL OR REPEAT@/],REPPG]
\r
4935 MOVE V,[XWD [SIXBIT /IN CONDITIONAL@/],CNDPG]
\r
4937 ERRNE2: MOVE V,[XWD [SIXBIT /IN MACRO CALL@/],CALPG]
\r
4939 SKIPN LITLVL ;HAD ONE PAGE NUMBER ALREADY
\r
4940 SKIPA V,[XWD [SIXBIT /@/],PAGENO] ;BETTER THAN NOTHING
\r
4942 ERRNE3: PUSHJ PP,PRNUM
\r
4943 HRROI RC,[SIXBIT /@/] ;WILL GET A RETURN
\r
4946 ERRMS1: SIXBIT / ERRORS DETECTED@/
\r
4947 ERRMS2: SIXBIT /?1 ERROR DETECTED@/
\r
4948 ERRMS3: SIXBIT /NO ERRORS DETECTED@/
\r
4949 EINIT: MOVE RC,[XWD ACDEV,[SIXBIT /NOT AVAILABLE@/]]
\r
4951 \fERRCL: HRRZ RC,LSTDIR+1 ;GET LST DEV ERROR CODE
\r
4952 JRST .+2 ;GET ERROR MESSAGE
\r
4953 ERRCB: HRRZ RC,BINDIR+1 ;GET BIN DEV ERROR CODE
\r
4955 SOJA RC,ERRTYP ;SPECIAL CASE IF ERROR CODE 0
\r
4957 ERRCF: HRRZ RC,INDIR+1 ;GET INPUT DEV ERROR CODE
\r
4958 HLLZ ACEXT,INDIR+1 ;SET UP EXT
\r
4960 ERRTYP: CAIL RC,TABLND-TABLE ;IS ERROR CODE LEGAL?
\r
4961 SKIPA RC,TABLND ;NO, GIVE CATCH ALL MESSAGE
\r
4962 MOVE RC,TABLE(RC) ;YES, PICK UP MESSAGE
\r
4964 ERRFIN: SKPINC C ;SEE IN WE CAN INPUT A CHAR.
\r
4965 JFCL ;BUT ONLY TO DEFEAT ?O
\r
4970 CLOSE LST, ;GIVE USER A PARTIAL LISTING
\r
4971 CLOSE BIN,40 ;BUT NEVER A BUM REL FILE
\r
4974 [SIXBIT /(0) ILLEGAL FILE NAME@/],,ACFILE
\r
4975 TABLE: [SIXBIT /(0) FILE WAS NOT FOUND@/],,ACFILE
\r
4976 [SIXBIT /(1) NO DIRECTORY FOR PROJECT-PROGRAMMER NUMBER@/],,ACFILE
\r
4977 [SIXBIT /(2) PROTECTION FAILURE@/],,ACFILE
\r
4978 [SIXBIT /(3) FILE WAS BEING MODIFIED@/],,ACFILE
\r
4979 [SIXBIT /(4) RENAME FILE NAME ALREADY EXISTS@/],,ACFILE
\r
4980 [SIXBIT /(5) ILLEGAL SEQUENCE OF UUOS@/],,ACFILE
\r
4981 [SIXBIT /(6) BAD UFD OR BAD RIB@/],,ACFILE
\r
4982 [SIXBIT /(7) NOT A SAV FILE@/],,ACFILE
\r
4983 [SIXBIT /(10) NOT ENOUGH CORE@/],,ACFILE
\r
4984 [SIXBIT /(11) DEVICE NOT AVAILABLE@/],,ACFILE
\r
4985 [SIXBIT /(12) NO SUCH DEVICE@/],,ACFILE
\r
4986 [SIXBIT /(13) NOT TWO RELOC REG. CAPABILITY@/],,ACFILE
\r
4987 [SIXBIT /(14) NO ROOM OR QUOTA EXCEEDED@/],,ACFILE
\r
4988 [SIXBIT /(15) WRITE LOCK ERROR@/],,ACFILE
\r
4989 [SIXBIT /(16) NOT ENOUGH MONITOR TABLE SPACE@/],,ACFILE
\r
4990 [SIXBIT /(17) PARTIAL ALLOCATION ONLY@/],,ACFILE
\r
4991 [SIXBIT /(20) BLOCK NOT FREE ON ALLOCATION@/],,ACFILE
\r
4992 [SIXBIT /(21) CAN'T SUPERSEDE (ENTER) AN EXISTING DIRECTORY@/],,ACFILE
\r
4993 [SIXBIT /(22) CAN'T DELETE (RENAME) A NON-EMPTY DIRECTORY@/],,ACFILE
\r
4994 [SIXBIT /(23) SFD NOT FOUND@/],,ACFILE
\r
4995 [SIXBIT /(24) SEARCH LIST EMPTY@/],,ACFILE
\r
4996 [SIXBIT /(25) SFD NESTED TOO DEEPLY@/],,ACFILE
\r
4997 [SIXBIT /(26) NO-CREATE ON FOR SPECIFIED PATH@/],,ACFILE
\r
4999 TABLND: [SIXBIT /(?) LOOKUP, ENTER, OR RENAME ERROR@/],,ACFILE
\r
5000 \fTYPMSG: PUSHJ PP,CRLF ;MOVE TO NEXT LINE
\r
5001 TYPMS1: HLRZ CS,RC ;GET FIRST MESSAGE
\r
5002 CAIE CS,-1 ;SKIP IF MINUS ONE
\r
5003 PUSHJ PP,TYPM2 ;TYPE MESSAGE
\r
5004 HRRZ CS,RC ;GET SECOND HALF
\r
5007 CRLF: MOVEI C,CR ;OUTPUT CARRIAGE RETURN
\r
5009 MOVEI C,LF ;AND LINE FEED
\r
5011 TYO: SOSG CTOBUF+2 ;BUFFER FULL?
\r
5012 OUTPUT CTL,0 ;YES, DUMP IT
\r
5013 IDPB C,CTOBUF+1 ;STORE BYTE
\r
5014 CAIG C,FF ;FORM FEED?
\r
5015 CAIGE C,LF ;V TAB OR LINE FEED?
\r
5018 POPJ PP, ;AND EXIT
\r
5020 TYPM2: MOVSI C,(1B0) ;ANTICIPATE REGISTER WORD
\r
5021 CAIN CS,ACFILE ;FILE NAME ?
\r
5022 JRST [JUMPE ACEXT,.+1 ;YES, TEST FOR EXT
\r
5023 LSH ACEXT,-6 ;MAKE SPACE FOR "."
\r
5024 IOR ACEXT,[SIXBIT /. @/]
\r
5026 CAIG CS,17 ;IS IT?
\r
5028 TYPM2A: HRLI CS,(POINT 6,,) ;FORM BYTE POINTER
\r
5030 TYPM3: ILDB C,CS ;GET A SIXBIT BYTE
\r
5032 JRST TYO ;YES, TYPE SPACE AND EXIT
\r
5033 ADDI C,40 ;NO, FORM 7-BIT ASCII
\r
5034 PUSHJ PP,TYO ;OUTPUT CHARACTER
\r
5037 \fXCEEDS: ADDI SX,2000 ;ADJUST SYMBOL POINTER
\r
5038 XCEED: PUSHJ PP,SAVEXS ;SAVE THE REGISTERS
\r
5039 HRRZ 1,JOBREL ;GET CURRENT TOP
\r
5041 CORE 0, ;REQUEST MORE CORE
\r
5042 JRST XCEED2 ;ERROR, BOMB OUT
\r
5043 HRRZ 2,JOBREL ;GET NEW TOP
\r
5045 XCEED1: MOVE 0,0(1) ;GET ORIGIONAL
\r
5046 MOVEM 0,0(2) ;STORE IN NEW LOCATION
\r
5047 SUBI 2,1 ;DECREMENT UPPER
\r
5048 CAMLE 1,SYMBOL ;HAVE WE ARRIVED?
\r
5049 SOJA 1,XCEED1 ;NO, GET ANOTHER
\r
5053 PUSHJ PP,SRCHI ;RE-INITIALIZE SYMBOL TABLE
\r
5054 JRST RSTRXS ;RESTORE REGISTERS AND EXIT
\r
5056 XCEED2: HRROI RC,[SIXBIT /INSUFFICIENT CORE@/]
\r
5058 PDPERR: HRROI RC,[SIXBIT .PDP OVERFLOW, TRY /P@.]
\r
5061 PRNUM: HLRZ CS,V ;GET MESSAGE
\r
5063 MOVEI CS,[SIXBIT /ON PAGE@/]
\r
5065 MOVE AC0,(V) ;GET PAGE
\r
5066 PUSHJ PP,DP1 ;PRINT NUMBER
\r
5069 SKIPN AC1,1(V) ;GET SEQ NUM IF THERE
\r
5070 POPJ PP, ;NO, RETURN
\r
5072 MOVEI CS,[SIXBIT /LINE@/]
\r
5074 MOVEI AC0,OUTSQ ;PRINT IT
\r
5075 OUTPUT CTL,0 ;TO MAKE THINGS PRINT IN RIGHT ORDER
\r
5078 JRST TYO ;AND RETURN
\r
5080 DP1: IDIVI AC0,?D10
\r
5087 \fRIM0: TDO FR,AC0 ;SET RIM/RIM10 FLAG
\r
5088 TLNE FR,PNCHSW ;FORGET IT IF PUNCH RESET
\r
5089 SETSTS BIN,IB ;SET TO IMAGE BINARY MODE
\r
5092 ROUT: EXCH CS,RIMLOC
\r
5093 SUB PP,[XWD 1,1] ;CLEAR OUT STACK WFW
\r
5098 JUMPE CS,ROUT1 ;RIM10 OUTPUT
\r
5105 ROUT1: MOVSI C,(DATAI PTR,) ;RIM OUTPUT
\r
5106 HRR C,LOCO ;GET ADDRESS
\r
5107 TLNE FR,RIM1SW ;NO DATAI IF RIM10
\r
5109 PUSHJ PP,PTPBIN ;OUTPUT
\r
5111 AOSA LOCO ;INCREMENT CURRENT LOCATION
\r
5113 OUTBIN: TLNN FR,RIMSW!RIM1SW!R1BSW ;EXIT IF RIM MODE
\r
5114 PTPBIN: TLNN FR,PNCHSW ;EXIT IF PUNCH NOT REQUESTED
\r
5116 SOSG BINBUF+2 ;TEST FOR BUFFER FULL
\r
5117 PUSHJ PP,DMPBIN ;YES, DUMP IT
\r
5118 IDPB C,BINBUF+1 ;DEPOSIT BYTE
\r
5121 \fDMPBIN: OUT BIN,0 ;DUMP THE BUFFER
\r
5122 POPJ PP, ;NO ERRORS
\r
5123 TSTBIN: GETSTS BIN,C ;GET STSTUS BITS
\r
5124 TRNN C,ERRBIT ;ERROR?
\r
5125 POPJ PP, ;NO, EXIT
\r
5126 MOVE AC0,BINDEV ;YES, GET TAG
\r
5127 JRST ERRLST ;TYPE MESSAGE AND ABORT
\r
5129 DMPLST: OUT LST,0 ;OUTPUT BUFFER
\r
5130 POPJ PP, ;NO ERRORS
\r
5131 TSTLST: GETSTS LST,C ;ANY ERRORS?
\r
5133 POPJ PP, ;NO, EXIT
\r
5135 ERRLST: MOVSI RC,[SIXBIT /OUTPUT WRITE-LOCK ERROR DEVICE@/]
\r
5136 TRNE C,IOIMPM ;IMPROPER MODE?
\r
5138 MOVSI RC,[SIXBIT /OUTPUT DATA ERROR DEVICE@/]
\r
5139 TRNE C,IODERR ;DEVICE DATA ERROR?
\r
5141 MOVSI RC,[SIXBIT /OUTPUT CHECKSUM OR PARITY ERROR DEVICE@/]
\r
5142 TRNE C,IODTER ;IS IT
\r
5144 MOVE CS,AC0 ;GET DEVICE
\r
5145 DEVCHR CS, ;FIND OUT WHAT IT IS
\r
5146 MOVSI RC,[SIXBIT /OUTPUT QUOTA EXCEEDED ON DEVICE@/]
\r
5147 TLNN CS,DSKBIT ;SKIP IF DSK OUTPUT
\r
5148 MOVSI RC,[SIXBIT /OUTPUT BLOCK TOO LARGE DEVICE@/]
\r
5151 R1BDMP: SETCM CS,R1BCNT
\r
5159 R1BDM1: MOVE C,0(CS)
\r
5165 R1BI: SETOM R1BCNT
\r
5170 ROUT6: CAME CS,RIMLOC
\r
5173 MOVEM AC0,R1BBLK(C)
\r
5181 \fREAD0: PUSHJ PP,EOT ;END OF TAPE
\r
5183 READ: SOSGE IBUF+2 ;BUFFER EMPTY?
\r
5185 READ1: ILDB C,IBUF+1 ;PLACE CHARACTER IN C
\r
5186 MOVE CS,@IBUF+1 ;CHECK FOR SEQUENCE NUMBER
\r
5189 CAIN CS,1 ;CHECK FOR SPECIAL
\r
5190 MOVE CS,[<ASCII/ />+1]
\r
5194 ADDM CS,IBUF+2 ;ADJUST WORD COUNT
\r
5195 REPEAT 4,< IBP IBUF+1> ;SKIP SEQ NO
\r
5196 PUSHJ PP,READ ;AND THE TAB
\r
5197 JRST READ ;GET NEXT CHARACTER
\r
5199 READ1A: JUMPE C,READ ;IGNORE NULL
\r
5200 CAIN C,32 ;IF IT'S A "?Z"
\r
5201 MOVEI C,LF ;TREAT IT AS A "LF"
\r
5202 CAIE C,37 ;CONTROL ?
\r
5204 MOVEI C,"?" ;MAKE CONTROL-SHIFT ? VISIBLE
\r
5208 READ2: PUSHJ PP,READ ;YES, TEST FOR LINE FEED
\r
5209 PUSHJ PP,RSW2 ;LIST IN ANY EVENT
\r
5210 CAIG C,FF ;IS IT ONE OF
\r
5211 CAIGE C,LF ;LF, VT, OR FF?
\r
5213 PUSHJ PP,OUTIM1 ;YES, DUMP THE LINE
\r
5214 JRST READ ;RETURN NEXT CHARACTER
\r
5216 READ3: IN CHAR,0 ;GET NEXT BUFFER
\r
5217 JRST READ ;NO ERRORS
\r
5219 TRNN C,ERRBIT!2000 ;ERRORS?
\r
5222 MOVSI RC,[SIXBIT/ INPUT PHYSICAL END OF TAPE DEVICE@/]
\r
5224 JRST ERRFIN ;E-O-T
\r
5225 MOVSI RC,[SIXBIT /MONITOR DETECTED SOFTWARE INPUT ERROR DEVICE@/]
\r
5226 TRNE C,IOIMPM ;IMPROPER MODE?
\r
5228 MOVSI RC,[SIXBIT /INPUT DATA ERROR DEVICE@/]
\r
5229 TRNE C,IODERR ;DEVICE DATA ERROR?
\r
5231 MOVSI RC,[SIXBIT /INPUT CHECKSUM OR PARITY ERROR DEVICE@/]
\r
5233 MOVSI RC,[SIXBIT /INPUT BLOCK TOO LARGE DEVICE@/]
\r
5236 \fOUTAB2: PUSHJ PP,OUTTAB ;PRINT TWO TABS
\r
5237 OUTTAB: MOVEI C,HT
\r
5238 PRINT: CAIE C,CR ;IS THIS A CR?
\r
5240 JRST OUTCR ;YES, GO PROCESS
\r
5241 CAIN C,FF ;FORM FEED?
\r
5242 JRST OUTFF ;YES, FORCE NEW PAGE
\r
5245 OUTCR: TRNN ER,ERRORS!LPTSW!TTYSW
\r
5247 MOVEI C,CR ;CARRIAGE RETURN, LINE FEED
\r
5249 SOSGE LPP ;END OF PAGE?
\r
5250 TLO IO,IOPAGE ;YES, SET FLAG
\r
5251 TRCA C,7 ;FORM LINE FEED AND SKIP
\r
5253 OUTL: TLZN IO,IOPAGE ;NEW PAGE REQUESTED?
\r
5255 JUMP1 OUTC ;YES, BYPASS IF PASS ONE
\r
5256 PUSH PP,C ;SAVE C AND CS
\r
5259 TLNN IO,IOMSTR!IOPROG
\r
5261 TLNE IO,IOCREF ;IF DOING CREF OUTPUT NOW
\r
5262 TLNE FR,CREFSW ;AND CREFFING (JUST IN CASE)
\r
5264 PUSHJ PP,CLSC3 ;CLOSE IT OUT
\r
5265 HLLM IO,(PP) ;SAVE THIS NEW STATE OF IO
\r
5267 MOVEM C,LPP ;SET NEW COUNTER
\r
5271 PUSHJ PP,OUTC ;OUTPUT FORM FEED
\r
5273 PUSHJ PP,OUTAS0 ;OUTPUT TITLE
\r
5275 PUSHJ PP,OUTAS0 ;OUTPUT VERSION
\r
5277 PUSHJ PP,OUTAS0 ; AND DATE
\r
5279 PUSHJ PP,DNC ;OUTPUT PAGE NUMBER
\r
5280 AOSG PAGEN. ;FIRST PAGE OF THIS NUMBER?
\r
5282 MOVEI C,"-" ;NO, PUT OUT MODIFIER
\r
5286 OUTL1: PUSHJ PP,OUTCR
\r
5289 HRRZ CS,SUBTTX ;SWITCH FOR SUB-TITLE
\r
5290 SKIPE 0(CS) ;IS THERE A SUB-TITLE?
\r
5291 PUSHJ PP,OUTTAB ;YES, OUTPUT A TAB
\r
5292 PUSHJ PP,SOUT20 ;OUTPUT ASCII WITH CARRIAGE RETURN
\r
5295 POP PP,CS ;RESTORE REGISTERS
\r
5298 OUTC: TRNE ER,ERRORS!TTYSW
\r
5302 OUTLST: SOSG LSTBUF+2 ;BUFFER FULL?
\r
5303 PUSHJ PP,DMPLST ;YES, DUMP IT
\r
5304 COMMENT $ REG DOESN'T LIKE THIS FEATURE ANY MORE 9-5-72
\r
5306 IDPB C,LSTBUF+1 ;STORE BYTE
\r
5309 \fPAGE0: PUSHJ PP,STOUTS ;PAGE PSEUDO-OP
\r
5310 OUTFF1: TLNE IO,IOCREF ;CURRENTLY DOING CREF?
\r
5311 TLNE IO,IOPROG ;AND NOT XLISTED?
\r
5317 OUTFF: TLO IO,IOPAGE
\r
5318 OUTFF2: SETOM PAGEN.
\r
5322 TIMOUT: IDIVI 2,?D60*?D1000
\r
5323 TIMOU1: IDIVI 2,?D60
\r
5324 PUSH PP,3 ;SAVE MINUTES
\r
5325 PUSHJ PP,OTOD ;STORE HOURS
\r
5326 MOVEI 3,":" ;SEPARATE BY COLON
\r
5328 POP PP,2 ;STORE MINUTES
\r
5329 OTOD: IDIVI 2,?D10
\r
5330 ADDI 2,60 ;FORM ASCII
\r
5336 DATOUT: IDIVI 1,?D31 ;GET DAY
\r
5338 CAIG 2,?D9 ;TWO DIGITS?
\r
5339 ADDI 2,7760*?D10 ;NO, PUT IN SPACE
\r
5340 PUSHJ PP,OTOD ;STORE DAY
\r
5341 IDIVI 1,?D12 ;GET MONTH
\r
5342 MOVE 2,DTAB(2) ;GET MNEMONIC
\r
5343 IDPB 2,CS ;DEPOSIT RIGHT MOST 7 BITS
\r
5344 LSH 2,-7 ;SHIFT NEXT IN
\r
5345 JUMPN 2,.-2 ;DEPOSIT IFIT EXISTS
\r
5346 MOVEI 2,?D64(1) ;GET YEAR
\r
5347 JRST OTOD ;STORE IT
\r
5361 \fSUBTTL MACHINE INSTRUCTION SEARCH ROUTINES
\r
5363 OPTSCH: MOVEI RC,0
\r
5364 MOVEI ARG,1B?L<OP1END-OP1TOP> ;SET UP INDEX
\r
5365 MOVEI V,1B?L<OP1END-OP1TOP>/2 ;SET UP INCREMENT
\r
5367 OPT1A: CAMN AC0,OP1TOP(ARG) ;ARE WE POINTING AT SYMBOL?
\r
5368 JRST OPT1D ;YES, GET THE CODE
\r
5369 JUMPE V,POPOUT ;TEST FOR END
\r
5370 CAML AC0,OP1TOP(ARG) ;NO, SHOULD WE MOVE DOWN?
\r
5371 TDOA ARG,V ;NO, INCREMENT
\r
5372 OPT1B: SUB ARG,V ;YES, DECREMENT
\r
5373 ASH V,-1 ;HALVE INCREMENT
\r
5374 CAIG ARG,OP1END-OP1TOP ;ARE WE OUT OF BOUNDS?
\r
5375 JRST OPT1A ;NO, TRY AGAIN
\r
5376 JRST OPT1B ;YES, BRING IT DOWN A PEG
\r
5380 OPTSCH: MOVE ARG,AC0 ;GET SIXBIT NAME
\r
5381 TLZ ARG,400000 ;CLEAR SIGN BIT
\r
5382 IDIVI ARG,PRIME ;REM. GOES IN V
\r
5383 CAMN AC0,OP1TOP(V) ;ARE WE POINTING AT SYMBOL?
\r
5385 SKIPN OP1TOP(V) ;TEST FOR END
\r
5386 POPJ PP, ;SYMBOL NOT FOUND
\r
5387 HLRZ RC,ARG ;SAVE LHS OF QUOTIENT
\r
5388 SKIPA ARG,RC ;GET IT BACK
\r
5389 OPT1A: ADDI ARG,(RC) ;INCREMENT ARG
\r
5390 ADDI V,(ARG) ;QUADRATIC INCREASE TO V
\r
5391 CAIL V,PRIME ;V IS MODULO PRIME
\r
5392 JRST [SUBI V,PRIME
\r
5394 CAMN AC0,OP1TOP(V) ;IS THIS IT?
\r
5396 SKIPE OP1TOP(V) ;END?
\r
5397 JRST OPT1A ;TRY AGAIN
\r
5401 IFN OPHSH,< SETZ RC, ;CLEAR RELOCATION
\r
5402 MOVE ARG,V ;GET INDEX IN RIGHT ACC.>
\r
5403 IDIVI ARG,4 ;ARG HAS INDEX USED IN OPTTAB
\r
5404 LDB V,OPTTAB(V) ;V HAS INDEX TO OPTTAB
\r
5405 CAIL V,700 ;PSEUDO-OP OR IO INSTRUCTION?
\r
5407 ROT V,-?D9 ;LEFT JUSTIFY
\r
5408 HRRI V,OP ;POINT TO BASIC FORMAT
\r
5409 OPT1F: AOS 0(PP) ;SET FOR SKIP EXIT
\r
5410 MOVEI SDEL,%OP ;SET OP-CODE CROSS-REF FLAG
\r
5411 JRST CREF ;TEST AND OUTPUT, AC0=SYMBOL, V=VALUE
\r
5413 OPT1G: JUMPG AC0,.+3 ;IF ".","$",OR "%" USE TABLE 1
\r
5414 TLNN AC0,200000 ;PSEUDO-OP OR IO INST., TEST FOR PROPER TABLE
\r
5415 SKIPA V,OP2TAB-700(V) ;2ND TABLE, FIRST LETTER IS "A" TO "O"
\r
5416 MOVE V,OP1TAB-700(V) ;1ST TABLE, ..."P" TO "Z"
\r
5420 IFE OPHSH,< POINT 9,OP1COD-1(ARG),35>
\r
5421 POINT 9,OP1COD (ARG), 8
\r
5422 POINT 9,OP1COD (ARG),17
\r
5423 POINT 9,OP1COD (ARG),26
\r
5424 IFN OPHSH,< POINT 9,OP1COD (ARG),35>
\r
5426 \fIFDEF .XCREF,< .XCREF ;DON'T CREF THIS MESS>
\r
5433 DEFINE X <N1=N1+1 ;>>
\r
5440 DEFINE X (SYMBOL,CODE)
\r
5442 CC=CC+CODE?<N2=N2-9>
\r
5450 SYN X,XX ;JUST THE SAME MACRO>
\r
5453 DEFINE XX (SB,CD)<> ;A NUL MACRO
\r
5454 OP1TOP: IF1,< BLOCK PRIME>
\r
5455 IF1,<DEFINE X (SB,CD)<>>
\r
5457 DEFINE OPSTOR (RM)<.$'RM=.$'RM+<OPCODE?<9*<3-R&3>>>>
\r
5462 R=SXB&-1?-1-Q*PRIME
\r
5467 IFL PRIME-TRY,<PRINTX HASH FAILURE>>
\r
5469 DEFINE ITEM (QT,RM)<
\r
5471 IFL PRIME-R,<R=R-R/PRIME*PRIME>
\r
5473 IFGE PRIME-<TRY=TRY+1>,<ITEM Q,\R>>
\r
5474 IFE .%'RM,<.%'RM=SXB
\r
5477 DEFINE GETSYM (N)<.%'N=0>
\r
5481 REPEAT PRIME,<GETSYM \N
\r
5483 DEFINE GETSYM (N)<.$'N=0>
\r
5485 REPEAT <PRIME/4+1>,<GETSYM \N
\r
5490 ;MACRO TO HANDLE KI10 OP-CODES
\r
5491 DEFINE XK (SB,CD) <> ;NUL MACRO
\r
5492 \fIFN OPHSH,< ;PUT THE MOST USED OP CODES FIRST
\r
5565 IFN IIISW,<X ASCID , 771>
\r
6028 IF2,<IFE OPHSH,<SUBTL:>>
\r
6139 \fIFN OPHSH,< ;NO-OPS, OLD MNEMONICS,F4 UUOS
\r
6166 OP1COD: BLOCK N1/4
\r
6170 DEFINE SETVAL (N)<EXP .%'N
\r
6174 REPEAT PRIME,<SETVAL \N
\r
6178 OP1COD: IF1,< BLOCK <PRIME/4+1>>
\r
6180 DEFINE SETVAL (N)<EXP .$'N
\r
6184 REPEAT <PRIME/4+1>,<SETVAL \N
\r
6189 IFDEF .CREF,< .CREF ;START CREFFING AGAIN>
\r
6190 \fSUBTTL PERMANENT SYMBOLS
\r
6191 SYMNUM: EXP LENGTH/2 ;NUMBER OF PERMANENT SYMBOLS
\r
6194 XWD SYMF!NOOUTF,B>
\r
6197 P ??????, 0(SUPRBT)
\r
6199 LENGTH= .-SYMNUM-1 ;LENGTH OF INITIAL SYMBOLS
\r
6201 PRMTBL: ;PERMANENT SYMBOLS
\r
6237 PRMEND: ;END OF PERMANENT SYMBOLS
\r
6239 \f OPDEF ZL [Z LITF] ;INVALID IN LITERALS
\r
6240 OPDEF ZA [Z ADDF] ;INVALID IN ADDRESSES
\r
6241 OPDEF ZAL [Z ADDF!LITF]
\r
6252 Z RADX50 ;RADIX50,SQUOZE
\r
6253 ZAL LOC0 (1) ;RELOC
\r
6254 ZAL REMAR0 ;REMARK
\r
6256 ZA SUPRE0 ;SUPRESS
\r
6257 ZAL PSEND0 ;PRGEND
\r
6258 ZAL RIM0 (RIMSW) ;RIM
\r
6260 Z ASCII0 (1) ;SIXBIT
\r
6261 ZAL IOSET (IOPALL!IOSALL) ;SALL
\r
6262 ZAL SERCH0 ;SEARCH
\r
6264 ZA SUBTT0 (Z (POINT 7,,)) ;SUBTTL
\r
6267 ZA TITLE0 (Z (POINT 7,,)) ;TITLE
\r
6271 ZAL TWSEG0 ;TWOSEGMENTS
\r
6272 ZAL XALL0 (IOPALL) ;XALL
\r
6273 ZAL IOSET (IOPROG) ;XLIST
\r
6275 ZAL RIM0 (RIM1SW) ;RIM10
\r
6276 ZAL RIM0 (R1BSW) ;RIM10B
\r
6277 ZA UNIV0 (Z (POINT 7,,)) ;UNIVERSAL
\r
6278 ZAL IORSET (IONCRF) ;.CREF
\r
6279 ZAL IOSET (IONCRF) ;.XCREF
\r
6280 ZA OFFORM ;.HWFRMT
\r
6284 Z ASCII0 (0) ;ASCII
\r
6285 Z ASCII0 (1B18) ;ASCIZ
\r
6289 ZA SUPRSA ;ASUPPRESS
\r
6298 Z OCT0 (?D10) ;DEC
\r
6301 ZAL DEPHA0 ;DEPHASE
\r
6303 ZA INTER0 (INTF!ENTF) ;ENTRY
\r
6307 TLNN FR,IFPASS ;IF1
\r
6308 TLNE FR,IFPASS ;IF2
\r
6310 TRNE AC0,IFB0 ;IFB
\r
6311 TLNE ARG,IFDEF0 ;IFDEF
\r
6312 Z IFIDN0 (0) ;IFDIF
\r
6316 Z IFIDN0 (1) ;IFIDN
\r
6321 TRNN AC0,IFB0 ;IFNB
\r
6322 TLNN ARG,IFDEF0 ;IFNDEF
\r
6323 ZA INTER0 (INTF) ;INTERN
\r
6326 Z IRP0 (400000) ;IRPC
\r
6334 ZAL IORSET (IOPALL!IOSALL) ;LALL
\r
6335 ZAL IORSET (IOPROG) ;LIST
\r
6344 Z ASCII0 (3B19) ;COMMENT
\r
6345 Z ASCII0 (5B20) ;ASCID
\r
6348 ;USER DEFINED CALLI'S GO HERE
\r
6349 SIXBIT /LIGHTS/ ;-1
\r
6350 CALLI0: SIXBIT /RESET/ ; 0
\r
6351 SIXBIT /DDTIN/ ; 1
\r
6352 SIXBIT /SETDDT/ ; 2
\r
6353 SIXBIT /DDTOUT/ ; 3
\r
6354 SIXBIT /DEVCHR/ ; 4
\r
6355 SIXBIT /DDTGT/ ; 5
\r
6356 SIXBIT /GETCHR/ ; 6
\r
6357 SIXBIT /DDTRL/ ; 7
\r
6361 SIXBIT /UTPCLR/ ;13
\r
6363 SIXBIT /LOGIN/ ;15
\r
6364 SIXBIT /APRENB/ ;16
\r
6365 SIXBIT /LOGOUT/ ;17
\r
6366 SIXBIT /SWITCH/ ;20
\r
6367 SIXBIT /REASSI/ ;21
\r
6368 SIXBIT /TIMER/ ;22
\r
6369 SIXBIT /MSTIME/ ;23
\r
6370 SIXBIT /GETPPN/ ;24
\r
6371 SIXBIT /TRPSET/ ;25
\r
6372 SIXBIT /TRPJEN/ ;26
\r
6373 SIXBIT /RUNTIM/ ;27
\r
6375 SIXBIT /SLEEP/ ;31
\r
6376 SIXBIT /SETPOV/ ;32
\r
6378 SIXBIT /GETLIN/ ;34
\r
6380 SIXBIT /SETUWP/ ;36
\r
6381 SIXBIT /REMAP/ ;37
\r
6382 SIXBIT /GETSEG/ ;40
\r
6383 SIXBIT /GETTAB/ ;41
\r
6385 SIXBIT /SETNAM/ ;43
\r
6386 SIXBIT /TMPCOR/ ;44
\r
6387 SIXBIT /DSKCHR/ ;45
\r
6388 SIXBIT /SYSSTR/ ;46
\r
6389 SIXBIT /JOBSTR/ ;47
\r
6390 SIXBIT /STRUUO/ ;50
\r
6391 SIXBIT /SYSPHY/ ;51
\r
6392 SIXBIT /FRECHN/ ;52
\r
6393 SIXBIT /DEVTYP/ ;53
\r
6394 SIXBIT /DEVSTS/ ;54
\r
6395 SIXBIT /DEVPPN/ ;55
\r
6397 SIXBIT /RTTRP/ ;57
\r
6399 SIXBIT /JOBSTS/ ;61
\r
6400 SIXBIT /LOCATE/ ;62
\r
6401 SIXBIT /WHERE/ ;63
\r
6402 SIXBIT /DEVNAM/ ;64
\r
6403 SIXBIT /CTLJOB/ ;65
\r
6404 SIXBIT /GOBSTR/ ;66
\r
6408 SIXBIT /HIBER/ ;72
\r
6410 SIXBIT /CHGPPN/ ;74
\r
6411 SIXBIT /SETUUO/ ;75
\r
6412 SIXBIT /DEVGEN/ ;76
\r
6413 SIXBIT /OTHUSR/ ;77
\r
6414 SIXBIT /CHKACC/ ;100
\r
6415 SIXBIT /DEVSIZ/ ;101
\r
6416 SIXBIT /DAEMON/ ;102
\r
6417 SIXBIT /JOBPEK/ ;103
\r
6418 SIXBIT /ATTACH/ ;104
\r
6419 SIXBIT /DAEFIN/ ;105
\r
6420 SIXBIT /FRCUUO/ ;106
\r
6421 SIXBIT /DEVLNM/ ;107
\r
6422 SIXBIT /PATH./ ;110
\r
6425 NEGCAL==CALLI0-CALTBL ;NUMBER OF NEGATIVE CALLI'S
\r
6427 TTCTBL: SIXBIT /INCHRW/ ; 0 INPUT A CHAR. AND WAIT
\r
6428 SIXBIT /OUTCHR/ ; 1 OUTPUT A CHAR.
\r
6429 SIXBIT /INCHRS/ ; 2 INPUT A CHAR. AND SKIP
\r
6430 SIXBIT /OUTSTR/ ; 3 OUTPUT A STRING
\r
6431 SIXBIT /INCHWL/ ; 4 INPUT CHAR., WAIT, LINE MODE
\r
6432 SIXBIT /INCHSL/ ; 5 INPUT CHAR., SKIP, LINE MODE
\r
6433 SIXBIT /GETLCH/ ; 6 GET LINE CHARACTERISTICS
\r
6434 SIXBIT /SETLCH/ ; 7 SET LINE CHARACTERISTICS
\r
6435 SIXBIT /RESCAN/ ;10 RESET INPUT STREAM TO COMMAND
\r
6436 SIXBIT /CLRBFI/ ;11 CLEAR TYPEIN BUFFER
\r
6437 SIXBIT /CLRBFO/ ;12 CLEAR TYPEOUT BUFFER
\r
6438 SIXBIT /SKPINC/ ;13 SKIPS IF A CHAR. CAN BE INPUT
\r
6439 SIXBIT /SKPINL/ ;14 SKIPS IF A LINE CAN BE INPUT
\r
6440 SIXBIT /IONEOU/ ;15 OUTPUT AS AN IMAGE CHAR.
\r
6443 SUBTTL USER-DEFINED SYMBOL SEARCH ROUTINES
\r
6444 MSRCH: PUSHJ PP,SEARCH ;PERFORM GENERAL SEARCH
\r
6445 POPJ PP, ;NOT FOUND, EXIT
\r
6446 JUMPG ARG,MSRCH2 ;SKIP-EXIT AND CROSS-REF IF FOUND
\r
6447 CAME AC0,1(SX) ;WE ARE LOOKING AT SYMBOL, TRY ONE ABOVE
\r
6448 POPJ PP, ;NO, EXIT
\r
6449 ADDI SX,2 ;YES, POINT TO IT
\r
6450 PUSHJ PP,SRCH5 ;LOAD REGISTERS
\r
6451 MSRCH2: AOSA 0(PP) ;SET SKIP-EXIT
\r
6452 QSRCH: JUMPL ARG,SSRCH3 ;BRANCH IF OPERAND
\r
6453 MOVEI SDEL,%MAC ;SET OPERATOR FLAG
\r
6454 TLZE IO,DEFCRS ;IS IT A DEFINITION?
\r
6455 MOVEI SDEL,%DMAC ;YES
\r
6456 JRST CREF ;CROSS-REF AND EXIT
\r
6458 SSRCH: PUSHJ PP,SEARCH ;PERFORM GENERAL SEARCH
\r
6459 POPJ PP, ;NOT FOUND, EXIT
\r
6460 JUMPL ARG,SSRCH2 ;SKIP-EXIT AND CROSS-REF IF FOUND
\r
6461 SSRCH1: CAME AC0,-3(SX) ;WE ARE LOOKING AT MACRO, LOOK ONE SLOT BELOW
\r
6462 POPJ PP, ;NO DICE, EXIT
\r
6463 SUBI SX,2 ;YES, POINT TO IT
\r
6464 PUSHJ PP,SRCH5 ;LOAD REGISTERS
\r
6465 SSRCH2: AOS 0(PP) ;SET FOR SKIP-EXIT
\r
6466 SSRCH3: MOVEI SDEL,%SYM ;SET OPERAND FLAG
\r
6468 CREF: TLNN IO,IONCRF ;NO CREFFING FOR THIS SYMBOL?
\r
6469 TLNE FR,P1!CREFSW ;PASS ONE OR CROSS-REF SUPPRESSION?
\r
6470 POPJ PP, ;YES, EXIT
\r
6471 EXCH SDEL,C ;PUT FLAG IN C, SACE C
\r
6473 TLNE IO,IOCREF ;HAVE WE PUT OUT THE 177,102
\r
6475 PUSH PP,C ;START OF CREF DATA
\r
6477 \fREPEAT 0,< ;NEEDS CHANGE TO CREF
\r
6482 TLO IO,IOCREF ;WE NOW ARE IN THAT STATE
\r
6483 POP PP,C ;WE HAVE NOW
\r
6484 CREF3: JUMPE C,NOFLG ;JUST CLOSE IT
\r
6485 PUSHJ PP,OUTLST ;TYPE OF SYMBOL (%MAC,%DMAC,%SYM)
\r
6486 MOVSI CS,770000 ;COUNT CHRS
\r
6487 TDZA C,C ;STARTING AT 0
\r
6488 LSH CS,-6 ;TRY NEXT
\r
6489 TDNE AC0,CS ;IS THAT ONE THERE?
\r
6491 PUSHJ PP,OUTLST ;PRINT NUMBER OF SYMBOL CONSTITUENTS
\r
6497 PUSHJ PP,OUTLST ;THE ASCII SYMBOL
\r
6501 PUSHJ PP,OUTLST ;MARK IT AS A DEFINING OCCURENCE
\r
6502 NOFLG: MOVE C,SDEL
\r
6506 CLSCRF: TRNN ER,LPTSW
\r
6507 POPJ PP, ;LEAVE IF WE SHOULD NOT BE PRINTING
\r
6508 CLSCR2: MOVEI C,177
\r
6510 TLZE IO,IOCREF ;WAS IT OPEN?
\r
6511 JRST CLSCR1 ;YES, JUST CLOSE IT
\r
6512 MOVEI C,102 ;NO, OPEN IT FIRST
\r
6513 PUSHJ PP,OUTLST ;MARK BEGINNING OF CREF DATA
\r
6516 CLSCR1: MOVEI C,103
\r
6517 JRST OUTLST ;MARK END OF CREF DATA
\r
6519 CLSC3: TLZ IO,IOCREF
\r
6523 JRST OUTLST ;177,104 CLOSES IT FOR NOW
\r
6524 > ;END OF REPEAT 0
\r
6525 \fREPEAT 1,< ;WORKS WITH EXISTING CREF
\r
6527 PUSHJ PP,CRFHDR ;GET CORRECT SUBTTL
\r
6532 TLO IO,IOCREF ;WE NOW ARE IN THAT STATE
\r
6533 POP PP,C ;WE HAVE NOW
\r
6534 CREF3: PUSHJ PP,OUTLST ;TYPE OF SYMBOL (%MAC,%DMAC,%SYM)
\r
6535 MOVSI CS,770000 ;COUNT CHRS
\r
6536 TDZA C,C ;STARTING AT 0
\r
6537 LSH CS,-6 ;TRY NEXT
\r
6538 TDNE AC0,CS ;IS THAT ONE THERE?
\r
6540 PUSHJ PP,OUTLST ;PRINT NUMBER OF SYMBOL CONSTITUENTS
\r
6546 PUSHJ PP,OUTLST ;THE ASCII SYMBOL
\r
6550 PUSHJ PP,OUTLST ;MARK IT AS A DEFINING OCCURENCE
\r
6556 SUBTL: SIXBIT /SUBTTL/>
\r
6557 CRFHDR: CAME AC0,SUBTL ;IS FIRST SYMBOL "SUBTTL"
\r
6560 PUSHJ PP,SUBTT0 ;UPDATE SUBTTL
\r
6561 MOVE AC0,SUBTL ;RESTORE ARG.
\r
6567 CLSCRF: TRNN ER,LPTSW
\r
6568 POPJ PP, ;LEAVE IF WE SHOULD NOT BE PRINTING
\r
6569 CLSCR2: TLZE IO,IOCREF ;FINISH UP LINE
\r
6572 TLNE IO,IOPAGE ;NEW PAGE?
\r
6573 PUSHJ PP,OUTL ;YES,GIVE IT A ROUSING SENDOFF!
\r
6577 PUSHJ PP,OUTLST ;MARK BEGINNING OF CREF DATA
\r
6578 CLSCR1: MOVEI C,177
\r
6581 JRST OUTLST ;MARK END OF CREF DATA
\r
6582 > ;END OF REPEAT 1
\r
6583 \fSEARCH: HLRZ SX,SRCHX
\r
6586 SRCH1: CAML AC0,-1(SX)
\r
6588 SRCH2: SUB SX,SDEL
\r
6593 SOJA SX,SRCHNO ;NOT FOUND
\r
6595 SRCH3: CAMN AC0,-1(SX)
\r
6596 JRST SRCH4 ;NORMAL / FOUND EXIT
\r
6602 SOJA SX,SRCHNO ;NOT FOUND
\r
6604 SRCH4: AOS 0(PP) ;SET FOR SKIP EXIT
\r
6605 SRCH5: MOVSI ARG,SUPRBT ;HE IS USING IT, TURN OFF BIT
\r
6606 ANDCAM ARG,(SX) ; IN THE TABLE
\r
6607 SRCH7: MOVE ARG,0(SX) ;FLAG AND VALUE TO ARG
\r
6608 LDB RC,RCPNTR ;POINT 1,ARG,17
\r
6609 TLNE ARG,LELF ;CHECK LEFT RELOCATE
\r
6612 TLNE ARG,SPTR ;CHECK SPECIAL EXTESN POINTER
\r
6615 MOVE V,0(ARG) ;36BIT VALUE TO V
\r
6618 SRCH6: MOVE V,0(ARG) ;VALUE
\r
6619 MOVE RC,1(ARG) ;AND RELOC
\r
6620 TLNE RC,-2 ;CHECK AND SET EXTPNT
\r
6625 SRCHNO: SKIPN UNISCH+1 ;ALLOWED TO SEARCH OTHER TABLES
\r
6626 POPJ PP, ;NO, JUST RETURN
\r
6627 AOS V,UNISCH ;GET NEXT INDEX TO TABLE
\r
6628 CAIE V,1 ;FIRST TIME IN
\r
6629 JRST SRCHN1 ;YES, SAVE SYMBOL INFO
\r
6630 HRLM SX,UNISCH ;SAVE SX AND SET FLAG
\r
6631 MOVE ARG,SRCHX ;SEARCH POINTER
\r
6632 MOVEM ARG,UNISHX ;TO A SAFE PLACE
\r
6635 MOVEM ARG,UNIPTR ;STORE ALSO
\r
6636 SRCHN1: MOVE V,UNISCH(V) ;GET TRUE INDEX
\r
6637 JUMPE V,SRCHKO ;IF ZERO ALL TABLE SCANNED
\r
6638 MOVE ARG,UNISHX(V) ;NEW SRCHX
\r
6639 MOVEM ARG,SRCHX ;SET IT UP
\r
6640 MOVE ARG,UNIPTR(V) ;SYMTOP,,SYMBOL
\r
6643 JRST SEARCH ;TRY AGAIN
\r
6645 SRCHKO: SETZ ARG, ;CLEAR ARG SO ZERO STORED
\r
6646 SRCHOK: SKIPN UNISCH ;HAVE WE SEARCH OTHER TABLES
\r
6647 POPJ PP, ;NO, JUST RETURN
\r
6648 SYMBCK: HLRZ SX,UNISCH ;RESTORE SX
\r
6649 SETZM UNISCH ;CLEAR SYMBCK FLAG
\r
6650 PUSH PP,V ;SAVE AN AC
\r
6651 MOVE V,UNISHX ;SRCHX
\r
6652 MOVEM V,SRCHX ;RESTORE ORIGINAL
\r
6653 MOVE V,UNIPTR ;SYMTOP,,SYMBOL
\r
6656 JUMPE ARG,SRCHK2 ;TOTALLY UNDEFINED
\r
6657 PUSH PP,RC ;SAVE SOME ACCS
\r
6660 SETZB ARG,EXTPNT ;CLEAR ALL SYMBOL DATA
\r
6662 PUSHJ PP,INSERT ;INSERT SYMBOL IN TABLE
\r
6663 POP PP,EXTPNT ;RESTORE ACCS ETC.
\r
6666 MOVEM ARG,(SX) ;SET FLAGS AND VALUE AS IT SHOULD BE
\r
6670 \fINSERQ: TLNE ARG,UNDF!VARF
\r
6671 INSERZ: SETZB RC,V
\r
6672 INSERT: CAME AC0,-1(SX) ;ARE WE LOOKING AT MATCHING MNEMONIC?
\r
6673 JRST INSRT2 ;NO, JUST INSERT
\r
6674 JUMPL ARG,INSRT1 ;YES, BRANCH IF OPERAND
\r
6675 SKIPL 0(SX) ;OPERATOR, ARE WE LOOKING AT ONE?
\r
6676 JRST UPDATE ;YES, UPDATE
\r
6677 JRST INSRT2 ;NO, INSERT
\r
6679 INSRT1: SKIPG 0(SX) ;OPERAND, ARE WE LOOKING AT ONE?
\r
6680 JRST UPDATE ;YES, UPDATE
\r
6681 SUBI SX,2 ;NO, MOVE UNDER OPERATOR AND INSERT
\r
6682 INSRT2: MOVE SDEL,SYMBOL
\r
6688 INSRT3: MOVEM SDEL,SYMBOL ;MAKE ROOM FOR A TWO WORD ENTRY
\r
6690 BLT SDEL,-2(SX) ;PUSH EVERYONE DOWN TWO LOACTIONS
\r
6691 AOS @SYMBOL ;INCREMENT THE SYMBOL COUNT
\r
6692 TLNN RC,-2 ;NEED SPECIAL?
\r
6693 TRNE RC,-2 ;LEFT OR RIGHT EXTERNAL?
\r
6694 JRST INSRT5 ;YES, JUMP
\r
6695 TLNN V,-1 ;SKIP IF V IS A 36BIT VALUE
\r
6696 JRST INSRT4 ;JUMP, ITS A 18BIT VALUE
\r
6697 AOS SDEL,FREE ;36BIT, SO GET A CELL FROM FREE CORE
\r
6698 CAML SDEL,SYMBOL ;MORE CORE NEEDED?
\r
6699 PUSHJ PP,XCEEDS ;YES
\r
6700 HRRI ARG,-1(SDEL) ;POINTER TO ARG
\r
6701 MOVEM V,0(ARG) ;36BIT VALUE TO FREE CORE
\r
6702 TLOA ARG,PNTF ;NOTE THAT ARG IS APOINTER, NOT A 18BIT VALUE
\r
6704 INSRT4: HRR ARG,V ;18BIT VALUE TO ARG
\r
6705 DPB RC,RCPNTR ;FIX RIGHT RELOCATION
\r
6707 TLO ARG,LELF ;FIX LEFT RELOCATION
\r
6708 INSRT6: MOVEM ARG,0(SX) ;INSERT FLAGS AND VALUE.
\r
6709 MOVEM AC0,-1(SX) ;INSERT SYMBOL NAME.
\r
6710 PUSHJ PP,SRCHI ;INITILIAZE SRCHX
\r
6711 JRST QSRCH ;EXIT THROUGH CREF
\r
6713 INSRT5: MOVEI SDEL,2 ;GET TWO CELLS FROM FREE CORE
\r
6715 CAML SDEL,SYMBOL;MORE CORE NEEDED?
\r
6716 PUSHJ PP,XCEEDS ;YES
\r
6718 HRRI ARG,-2(SDEL) ;POINTER TO ARG
\r
6720 TLO ARG,SPTR ;SET SPECIAL POINTER, POINTS TO TWO CELLS
\r
6722 \fREMOVE: SUBI SX,2 ;MOVE EVERYONE UP TWO LOCATIONS
\r
6723 REMOV1: MOVE 0(SX)
\r
6724 MOVEM 2(SX) ;OVERWRITE THE DELETED SYMBOL
\r
6725 CAME SX,SYMBOL ;SKIP WHEN DONE
\r
6729 SOS 0(SX) ;DECREMENT THE SYMBOL COUNT
\r
6731 SRCHI: MOVEI AC2,0 ;THIS CODE SETS UP SRCHX
\r
6740 POPJ PP, ;SRCHX=XWD <SYMTBL+LENGTH/2>,LENGTH/4
\r
6742 \fUPDATE: DPB RC,RCPNTR ;FIX RIGHT RELOCATION
\r
6743 TLNE ARG,SPTR ;SKIP IF THERE IS NO SPECIAL POINTER
\r
6744 JRST UPDAT4 ;YES, USE THE TWO CELLS
\r
6745 TLNN RC,-2 ;NEED TO CHANGE
\r
6746 TRNE RC,-2 ;ANY CURRENT EXTERNS?
\r
6747 JRST UPDAT5 ;YES ,JUMP
\r
6748 TLZ ARG,LELF ;CLEAR LELF
\r
6749 TLNE RC,1 ;LEFT RELOCATABLE?
\r
6750 TLO ARG,LELF ;YES, SET THE FLAG
\r
6751 TLNE ARG,PNTF ;WAS THERE A 36BIT VALUE?
\r
6752 JRST UPDAT2 ;YES, USE IT.
\r
6753 TLNE V,-1 ;NO,IS THERE A 36BIT VALUE?
\r
6754 JRST UPDAT1 ;YES, GET A CELL
\r
6755 HRR ARG,V ;NO, USE RH OF ARG
\r
6756 UPDAT3: MOVEM ARG,0(SX) ;OVERWRITE THE ONE IN THE TABLE
\r
6757 POPJ PP, ;AND EXIT
\r
6759 UPDAT1: AOS SDEL,FREE ;GET ONE CELL
\r
6760 CAML SDEL,SYMBOL ;NEED MORE CORE?
\r
6761 PUSHJ PP,XCEEDS ;YES
\r
6762 HRRI ARG,-1(SDEL) ;POINTER TO ARG
\r
6763 TLO ARG,PNTF ;AND NOTE IT.
\r
6764 UPDAT2: TLNE ARG,EXTF ;IS THERE A EXTERNAL?
\r
6765 JRST UPDAT3 ;YES, - JUST SAVE A LOCATION
\r
6766 MOVEM ARG,0(SX) ;NO, OVERWRITE THE POINTER IN THE TABLE
\r
6767 MOVEM V,0(ARG) ;STORE VALUE AS A 36BIT VALUE
\r
6768 POPJ PP, ;AND EXIT
\r
6770 UPDAT4: MOVEM ARG,0(SX) ;WE HAVE TWO CELLS, WE USE THEM
\r
6771 MOVEM V,0(ARG) ;SAVE AS 36BIT VALUE
\r
6772 MOVEM RC,1(ARG) ;SAVE RELOCATION BITS
\r
6773 POPJ PP, ;AND EXIT
\r
6775 UPDAT5: MOVEI SDEL,2 ;THERE IS A EXTERNAL
\r
6776 ADDB SDEL,FREE ;SO WE NEED TWO LOACTIONS
\r
6777 CAML SDEL,SYMBOL ;NEED MORE CORE?
\r
6778 PUSHJ PP,XCEEDS ;YES
\r
6779 MOVEM RC,-1(SDEL) ;SAVE RELOCATION BITS
\r
6780 HRRI ARG,-2(SDEL) ;SAVE THE POINTER IN ARG
\r
6781 MOVEM V,0(ARG) ;SAVE A 36BIT VALUE
\r
6782 TLO ARG,SPTR ;SET SPECIAL PNTR FLAG
\r
6783 TLZ ARG,PNTF ;CLEAR POINTER FLAG
\r
6784 JRST UPDAT3 ;SAVE THE POINTER AND EXIT
\r
6786 \f SUBTTL CONSTANTS
\r
6790 HWFORM: BYTE (18) 1,1
\r
6791 INFORM: BYTE (9) 1 (4) 1 (1) 1 (4) 1 (18) 1
\r
6792 IOFORM: BYTE (3) 1 (7) 1 (3) 1 (1) 1 (4) 1 (18) 1
\r
6793 BPFORM: BYTE (6) 1,1 (2) 1 (4) 1 (18) 1
\r
6794 ASCIIF: BYTE (7) 1,1,1,1,1
\r
6795 SXFORM: BYTE (6) 1,1,1,1,1,1
\r
6798 \f SUBTTL PHASED CODE
\r
6800 SIXBIT /@/ ;SYMBOL TO STOP PRINTING
\r
6804 IFE FORMSW,< BYTE (7) 0, 11, 11, 11, 11>
\r
6805 IFN FORMSW,< BYTE (7) 11,11, 11, 11, 11>
\r
6817 DBUF: ASCIZ / TI:ME DY-MON-YR PAGE /
\r
6818 VBUF: ASCIZ / MACRO / ;MUST BE LAST LOCATIONS IN BLOCK
\r
6819 BLOCK 3 ;ALLOW FOR LONG TITLE
\r
6822 \fSUBTTL STORAGE CELLS
\r
6837 ACDELX: ;LEFT HALF
\r
6838 BLKTYP: BLOCK 1 ;RIGHT HALF
\r
6844 COUTDB: BLOCK ?D18
\r
6848 IFBLK: BLOCK .IFBLK
\r
6849 IFBLKA: BLOCK .IFBLK
\r
6854 LBUF: BLOCK <.CPL+5>/5
\r
6874 SBUF: BLOCK .SBUF/5
\r
6884 STCODE: BLOCK .STP
\r
6885 STOWRC: BLOCK .STP
\r
6888 STFORM: BLOCK .STP
\r
6895 TCNT: BLOCK 1 ;COUNT OF CHARS. LEFT IN TBUF
\r
6896 TBUF: BLOCK .TBUF/5
\r
6897 DEVBUF: BLOCK 6 ;STORE NAME.EXT CREATION DATE AND TIME
\r
6899 IONSYM: BLOCK 1 ;-1 SUPRESS LISTING OF SYMBOLS
\r
6900 PRGPTR: BLOCK 1 ;POINTER TO CHAIN OF PRGEND BLOCKS
\r
6901 ENTERS: BLOCK 1 ;-1 WHEN ENTERS HAVE BEEN DONE
\r
6902 UNIVSN: BLOCK 1 ;-1 WHEN A UNIVERSAL SEEN
\r
6938 LITLBL: BLOCK 1 ;NAME OF LABEL DEFINED INSIDE A LITERAL
\r
6963 R1BBLK: BLOCK .R1B
\r
6969 .TEMP: BLOCK 1 ;TEMPORARY STORAGE
\r
6970 UNISCH: BLOCK .UNIV ;SEARCH TABLE FOR UNIVERSALS
\r
6977 RCOUNT: BLOCK 1 ;COUNT OF WORDS STILL TO READ IN LEAF
\r
6978 WCOUNT: BLOCK 1 ;COUNT OF WORDS STILL FREE IN LEAF
\r
6979 PASS2Z: ;ONLY CLEAR TO HERE ON PRGEND
\r
6985 \fSUBTTL MULTI-ASSEMBLY STORAGE CELLS
\r
6989 IFN FORMSW,<PHWFMT: BLOCK 1>
\r
6990 MACSIZ: BLOCK 1 ;INITIAL SIZE OF LOW SEG
\r
6991 UNISIZ: BLOCK 1 ;TOP OF BUFFERS AND STACKS
\r
6992 UNITOP: BLOCK 1 ;TOP OF UNIVERSAL SYMBOL TABLE
\r
6993 UNIVNO: BLOCK 1 ;NUMBER OF UNIVERSALS SEEN
\r
6994 UNITBL: BLOCK .UNIV ;TABLE OF UNIVERSAL NAMES
\r
6995 UNIPTR: BLOCK .UNIV ;TABLE OF SYMBOL POINTERS
\r
6996 UNISHX: BLOCK .UNIV ;TABLE OF SRCHX POINTERS
\r
6997 VAR ;CLEAR VARIABLES
\r
6999 JOBFFI: BLOCK 203*NUMBUF+1 ;INPUT BUFFER PLUS ONE
\r