2 LPTWID==^D120 ;120 CHARACTERS/LINE ON LPT AT STANFORD
\r
4 SUBTTL RPG/CMF/JF/PMH/DMN 7-SEPT-71
\r
5 ;COPYRIGHT 1968,1969,1970,1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS.
\r
7 VMACRO==10 ;VERSION NUMBER
\r
8 VUPDATE==0 ;DEC UPDATE LEVEL
\r
9 VEDIT==0 ;EDIT NUMBER
\r
10 VCUSTOM==0 ;NON-DEC UPDATE LEVEL
\r
14 <VCUSTOM>B2+<VMACRO>B11+<VUPDATE>B17+VEDIT
\r
18 COMMENT * ASSEMBLY FEATURE SWITCHES (ACTION WHEN NON-ZERO)
\r
20 SWITCHES ON (NON-ZERO) IN DEC VERSION
\r
21 CCLSW GIVES RAPID PROGRAM GENERATION FEATURE
\r
22 FTDISK GIVES DISK FEATURES
\r
23 RENTSW ASSEMBLE REENTRANT PROGRAMS
\r
25 SWITCHES OFF (ZERO) IN DEC VERSION
\r
26 LNSSW GIVES LNS VERSION
\r
27 IIISW GIVES III FEATURES
\r
28 OPHSH GIVES HASH SEARCH OF OPCODES
\r
30 \fSUBTTL DEFAULT ASSEMBLY SWITCH SETTINGS
\r
33 IFNDEF RENTSW,<RENTSW==0>
\r
35 IFNDEF LNSSW,<LNSSW==0>
\r
36 IFN LNSSW,<FTDISK==0>
\r
38 IFNDEF CCLSW,<CCLSW==1>
\r
39 IFN CCLSW,<FTDISK==1>
\r
41 IFNDEF UNIVR,<UNIVR==0>
\r
43 IFNDEF FTDISK,<FTDISK==0>
\r
45 IFNDEF IIISW,<IIISW==0>
\r
47 IFNDEF OPHSH,<OPHSH==0>
\r
49 \fSUBTTL OTHER PARAMETERS
\r
51 .PDP== ^D50 ;BASIC PUSH-DOWN POINTER
\r
52 IFNDEF LPTWID,<LPTWID==^D132> ;DEFAULT WIDTH OF PRINTER
\r
53 .LPTWD==8*<LPTWID/8> ;USEFUL WIDTH IN MAIN LISTING
\r
54 .CPL== .LPTWD-^D32 ;WIDTH AVAIABLE FOR TEXT WHEN
\r
55 ;BINARY IS IN HALFWORD FORMAT
\r
56 .LPP==^D55 ;LINES/PAGE
\r
57 .STP== ^D40 ;STOW SIZE
\r
58 .TBUF== ^D80 ;TITLE BUFFER
\r
59 .SBUF== ^D80 ;SUB-TITLE BUFFER
\r
60 .IFBLK==^D20 ;IFIDN COMPARISON BLOCK SIZE
\r
62 .UNIV==^D10 ;NUMBER OF UNIVERSAL DEFINITIONS
\r
63 .LEAF==4 ;SIZE OF BLOCKS IN MACRO TREE
\r
65 NCOLS==1 ;NUMBER OF COLUMNS IN SYMBOL TABLE
\r
66 IFN CCLSW,<IFNDEF CTLSIZ,<CTLSIZ==^D200>>
\r
67 IFN OPHSH,<IFNDEF PRIME,<PRIME==^D701>>
\r
69 IFE LNSSW,<NUMBUF==2 ;NUMBER OF INPUT BUFFERS>
\r
70 IFN LNSSW,<NUMBUF==4 ;DOUBLE BUFFER FOR DOUBLE SIZE DEVICES>
\r
73 EXTERN JOBREL,JOBSYM,JOBDDT,JOBFF,JOBAPR,JOBSA
\r
74 IFN CCLSW,< EXTERN JOBERR>
\r
76 SALL ;SUPPRESS ALL MACROS
\r
78 ;SOME ASCII CHARACTERS
\r
90 SDEL= 3 ;SEARCH INCREMENT
\r
91 SX= SDEL+1 ;SEARCH INDEX
\r
94 C= 7 ;CURRENT CHARACTER
\r
95 CS= C+1 ;CHARACTER STATUS BITS
\r
96 RC= 11 ;RELOCATION BITS
\r
97 MWP= 12 ;MACRO WRITE POINTER
\r
98 MRP= 13 ;MACRO READ POINTER
\r
99 IO= 14 ;IO REGISTER (LEFT)
\r
100 ER== IO ;ERROR REGISTER (RIGHT)
\r
101 FR= 15 ;FLAG REGISTER (LEFT)
\r
102 RX== FR ;CURRENT RADIX (RIGHT)
\r
103 MP= 16 ;MACRO PUSHDOWN POINTER
\r
104 PP= 17 ;BASIC PUSHDOWN POINTER
\r
112 OPDEF RESET [CALLI 0]
\r
113 OPDEF SETDDT [CALLI 2]
\r
114 OPDEF DDTOUT [CALLI 3]
\r
115 OPDEF DEVCHR [CALLI 4]
\r
116 OPDEF WAIT [MTAPE 0]
\r
117 OPDEF CORE [CALLI 11]
\r
118 OPDEF EXIT [CALLI 12]
\r
119 OPDEF UTPCLR [CALLI 13]
\r
120 OPDEF DATE [CALLI 14]
\r
121 OPDEF APRENB [CALLI 16]
\r
122 OPDEF MSTIME [CALLI 23]
\r
123 OPDEF PJOB [CALLI 30]
\r
124 OPDEF RUN [CALLI 35]
\r
125 OPDEF TMPCOR [CALLI 44]
\r
127 \f ;FR FLAG REGISTER (FR/RX)
\r
128 IOSCR== 000001 ;NO CR AFTER LINE
\r
129 MTAPSW==000004 ;MAG TAPE
\r
130 ERRQSW==000010 ;IGNORE Q ERRORS
\r
131 LOADSW==000020 ;END OF PASS1 & NO EOF YET
\r
132 DCFSW== 000040 ;DECIMAL FRACTION
\r
133 RIM1SW==000100 ;RIM10 MODE
\r
134 NEGSW== 000200 ;NEGATIVE ATOM
\r
135 RIMSW== 000400 ;RIM OUTPUT
\r
136 PNCHSW==001000 ;RIM/BIN OUTPUT WANTED
\r
138 R1BSW== 004000 ;RIM10 BINARY OUTPUT
\r
139 TMPSW== 010000 ;EVALUATE CURRENT ATOM
\r
140 INDSW== 020000 ;INDIRECT ADDRESSING WANTED
\r
141 RADXSW==040000 ;RADIX ERROR SWITCH
\r
142 FSNSW== 100000 ;NON BLANK FIELD SEEN
\r
143 MWLFLG==200000 ;ON FOR DON'T ALLOW MULTI-WORD LITERALS
\r
146 ;IO FLAG REGISTER (IO/ER)
\r
147 FLDSW== 400000 ;ADDRESS FIELD
\r
149 ARPGSW==100000 ;ALLOW RAPID PROGRAM GENERATION
\r
150 IOPROG==040000 ;SUPRESS LISTING (LIST/XLIST PSEUDO OP)
\r
152 IOMAC== 010000 ;MACRO EXPANSION IN PROGRESS
\r
153 IOPALL==004000 ;SUPRESS LISTING OF MACRO EXPANSIONS
\r
154 IONCRF==002000 ;SUPRESS OUTPUT OF CREF INFORMATION
\r
155 CRPGSW==001000 ;CURRENTLY IN PROGRESS ON RPG
\r
156 IOCREF==000400 ;WE ARE NOW OUTPUTTING CREF INFO
\r
157 IOENDL==000200 ;BEEN TO STOUT
\r
159 DEFCRS==000040 ;THIS IS A DEFINING OCCURANCE (MACROS)
\r
160 IOIOPF==000020 ;IOP INSTRUCTION SEEN
\r
161 MFLSW== 000010 ;MULTI-FILE MODE,PRGEND SEEN
\r
162 IORPTC==000004 ;REPEAT CURRENT CHARACTER
\r
163 IOTLSN==000002 ;TITLE SEEN
\r
164 IOSALL==000001 ;SUPPRESS MACRO LISTING EVEN IF BINARY IS GENERATED
\r
166 OPDEF JUMP1 [JUMPL FR, ] ;JUMP IF PASS 1
\r
167 OPDEF JUMP2 [JUMPGE FR, ] ;JUMP IF PASS 2
\r
169 OPDEF JUMPOC [JUMPGE IO, ] ;JUMP IF IN OP-CODE FIELD
\r
170 OPDEF JUMPAD [JUMPL IO, ] ;JUMP IF IN ADDRESS FIELD
\r
172 OPDEF JUMPCM [JUMPL CS, ] ;JUMP IF CURRENT CHAR IS COMMA
\r
173 OPDEF JUMPNC [JUMPGE CS, ] ;JUMP IF CURRENT CHAR IS NON-COMMA
\r
175 \f ;ER ERROR REGISTERS (IO/ER)
\r
176 ERRM== 000020 ;MULTIPLY DEFINED SYMBOL
\r
177 ERRE== 000040 ;ILLEGAL USE OF EXTERNAL
\r
178 ERRP== 000100 ;PHASE DISCREPANCY
\r
179 ERRO== 000200 ;UNDEFINED OP CODE
\r
180 ERRN== 000400 ;NUMBER ERROR
\r
181 ERRV== 001000 ;VALUE PREVIOUSLY UNDEFINED
\r
182 ERRU== 002000 ;UNDEFINED SYMBOL
\r
183 ERRR== 004000 ;RELOCATION ERROR
\r
184 ERRL== 010000 ;LITERAL ERROR
\r
185 ERRD== 020000 ;REFERENCE TO MULTIPLY DEFINED SYMBOL
\r
186 ERRA== 040000 ;PECULIAR ARGUMENT
\r
187 ERRX== 100000 ;MACRO DEFINITION ERROR
\r
188 ERRQ== 200000 ;QUESTIONABLE, NON-FATAL ERROR
\r
193 ;SYMBOL TABLE FLAGS
\r
194 SYMF== 400000 ;SYMBOL
\r
196 NOOUTF==100000 ;NO DDT OUTPUT WFW
\r
197 SYNF== 040000 ;SYNONYM
\r
198 MACF== SYNF_-1 ;MACRO
\r
199 OPDF== SYNF_-2 ;OPDEF
\r
200 PNTF== 004000 ;"VALUE" IN SYMBOL TBL IS PNTR TO 36BIT VALUE
\r
201 UNDF== 002000 ;UNDEFINED
\r
202 EXTF== 001000 ;EXTERNAL
\r
203 INTF== 000400 ;INTERNAL
\r
204 ENTF== 000200 ;ENTRY
\r
205 VARF== 000100 ;VARIABLE
\r
206 MDFF== 000020 ;MULTIPLY DEFINED
\r
207 SPTR== 000010 ;SPECIAL EXTERNAL POINTER
\r
208 SUPRBT==000004 ;SUPRESS OUTPUT TO DDT
\r
209 LELF== 000002 ;LEFT HAND RELOCATABLE
\r
210 RELF== 000001 ;RIGHT HAND RELOCATABLE
\r
212 LITF== 200000 ;FLAG FOR PSEUDO-OPS INVALID IN LIT'S
\r
213 ADDF== 100000 ;FLAG FOR PSEUDO-OPS INVALID IN ADDRESSES
\r
215 TNODE== 200000 ;TERMINAL NODE FOR EVALEX
\r
219 ;THIS CODE MUST BE IN FIRST 1K TO ALLOW MAXIMUM SPACE
\r
221 ; 74 APPEARS BECAUSE ONLY LOCS 74 AND BEYOND ARE SAVED BY "SAVE"
\r
223 IFN CCLSW,<NUNCOM: IOWD 0,INHERE ;WHERE TO DO IO
\r
224 0 ;TERMINATE COMMAND LIST
\r
225 NUNGO2: IN BIN,NUNCOM ;READ FILE
\r
226 JRST NUNGO3 ;THERE ARE NO ERRORS
\r
227 NUNERR: DDTOUT NUNPNT, ;COMPLAIN
\r
229 NUNERM: ASCIZ /?LINKAGE ERROR/
\r
230 NUNGO3: SKIPE 12,INHERE+133-74 ;LOOK AT JOBCOR
\r
231 ;DOES JOB WANT TO RUN IN MORE CORE?
\r
232 CAMG 12,JOBREL ;MORE CORE THAN CURRENTLY USED?
\r
233 JRST NUNGO4 ;NO, GO BLT PROG
\r
234 CORE 12, ;ASK FOR MORE CORE
\r
235 JRST NUNERR ;NOT AVAILABLE
\r
236 JRST NUNGO4 ;GO BLT PROGRAM
\r
238 \f;THIS CODE MUST BE IN FIRST 1K
\r
239 NUNSET: JUMPN ACDEV,.+2 ;DEVICE SPECIFIED?
\r
240 MOVSI ACDEV,(SIXBIT /SYS/) ;NO, USE SYSTEM DEVICE
\r
241 JUMPN ACEXT,.+2 ;EXT SPECIFIED?
\r
242 MOVSI ACEXT,(SIXBIT /SAV/) ;NO, USE "SAV"
\r
243 MOVEM ACDEV,NUNDEV ;DEVICE NAME TO USE
\r
244 OPEN BIN,NUNINI ;INIT THE DEVICE
\r
246 MOVEM ACFILE,NUNDIR ;IS THE FILE AVAILABLE?
\r
247 HLLZM ACEXT,NUNDIR+1 ;STASH EXTENSION
\r
248 SETZM NUNDIR+3 ;CLEAR PPN
\r
249 LOOKUP BIN,NUNDIR ;LOOK FOR FILE
\r
250 JRST [HLRZ ACEXT,NUNDIR+1 ;WAS EXTENSION "SAV"?
\r
251 CAIE ACEXT,(SIXBIT /SAV/) ;...
\r
252 JRST ERRCF ;GO COMPLAIN
\r
253 MOVSI ACEXT,(SIXBIT /DMP/) ;TRY "DMP" EXTENSION
\r
254 JRST .-3 ] ;TRA -3,4
\r
255 PUSHJ PP,DELETE ;COMMAND FILE
\r
256 MOVE 15,NUNDIR ;GET THE NAME
\r
257 CALLI 15,43 ;TELL SYSTEM "SETNAM"
\r
258 HLRO 15,NUNDIR+3 ;GET WORD COUNT
\r
259 HRLM 15,NUNCOM ;STASH COUNT
\r
260 MOVNS 15 ;NEGATIVE COUNT
\r
261 MOVEI 16,73(15) ;WHERE TO STOP BLT
\r
262 ADDI 15,INHERE ;HOW BIG TO MAKE CORE
\r
263 IORI 15,1777 ;AN EVEN MULTIPLE OF 1K
\r
264 CORE 15, ;ASK TS EXEC FOR CORE
\r
265 JRST [HRROI RC,[SIXBIT /NOT ENUF CORE FOR LINKAGE@/]
\r
266 JRST ERRFIN ];GO COMPLAIN
\r
268 BLT NUNTOP,NUNTOP ;SET ACS
\r
270 TLNN IO,CRPGSW ;WAS RPG IN PROGRESS?
\r
271 TLZ NUNAOS,577000 ;NO, DON'T MAKE NEXT AN RPG
\r
275 NUNGO4: MOVE NUNLAC,INHERE+74-74 ;SETUP FOR NEW DDT
\r
276 SETDDT NUNLAC, ;...
\r
278 JOBS41=122 ;LOADER WILL GIVE MUL. DEF. GLOBAL IF CHANGED
\r
281 MOVE NUNLAC,JOBS41+INHERE-74 ;RESTORE LOC 41
\r
282 MOVEM NUNLAC,JOB41 ;...
\r
283 NUNBLT: BLT NUNTOP,.-. ;MOVE PRGM TO WHERE IT BELONGS
\r
284 RESET ;RESET ALL I/O
\r
285 NUNAOS: AOS 1,JOBSA ;GET STARTING ADDR FOR RPG
\r
286 JRST 0(1) ;GET ON WITH THE GAME
\r
287 NUNPNT: NUNERM ;ERROR MESSAGE POINTER
\r
288 NUNTOP: XWD INHERE+1,75
\r
294 \fDELETE: HRRZ EXTMP ;IF THE EXTENSION
\r
295 CAIE (SIXBIT/TMP/) ;IS .TMP
\r
297 CLOSE CTL2, ;DELETE
\r
298 SETZB 4,5 ;THE COMMAND FILE.
\r
304 \fSUBTTL START ASSEMBLING
\r
306 ASSEMB: PUSHJ PP,INZ ;INITIALIZE FOR PASS
\r
307 MOVE [ASCII /.MAIN/]
\r
312 ASSEM1: PUSHJ PP,CHARAC ;TEST FOR FORM FEED
\r
313 SKIPGE LIMBO ;CRLF FLAG?
\r
314 JRST ASSEM1 ;YES ,IGNORE LF
\r
323 CAIN C,"\" ;BACK-SLASH?
\r
324 TLZA IO,IOMAC ;YES, LIST IF IN MACRO
\r
326 PUSHJ PP,STMNT ;OFF WE GO
\r
327 TLZN IO,IOENDL ;WAS STOUT PRE-EMPTED?
\r
328 PUSHJ PP,STOUT ;NO, POLISH OFF LINE
\r
331 \fSUBTTL STATEMENT PROCESSOR
\r
333 STMNT: TLZ FR,INDSW!FSNSW
\r
335 STMNT1: PUSHJ PP,LABEL
\r
336 STMNT2: PUSHJ PP,ATOM ;GET THE FIRST ATOM
\r
341 JUMPAD STMNT7 ;NUMERIC EXPRESSION
\r
342 JUMPN AC0,STMN2A ;JUMP IF NON NULL FIELD
\r
343 SKIPN LITLVL ;ALLOW COMMA IN LITERALS
\r
344 CAIE C,14 ;NULL, COMMA?
\r
345 CAIN C,EOL ;OR END OF LINE?
\r
347 CAIN C,"]" ;CLOSING LITERAL?
\r
349 JRST STMNT9 ;NO,AT LEAST SKIP ALL THIS NONSENSE
\r
351 STMN2A: JUMPE C,.+2
\r
353 PUSHJ PP,MSRCH ;SEARCH FOR MACRO/OPDEF/SYN
\r
354 JRST STMNT3 ;NOT FOUND, TRY OP CODE
\r
355 LDB SDEL,[POINT 3,ARG,5]
\r
356 JUMPE SDEL,ERRAX ;ERROR IF NO FLAGS
\r
357 SOJE SDEL,OPD1 ;OPDEF IF 1
\r
358 SOJE SDEL,CALLM ;MACRO IF 2
\r
359 JRST STMNT4 ;SYNONYM, PROCESS WITH OP-CODES
\r
361 STMNT3: PUSHJ PP,OPTSCH ;SEARCH OP CODE TABLE
\r
362 JRST STMNT5 ;NOT FOUND
\r
363 STMNT4: HLLZ AC0,V ;PUT CODE IN AC0
\r
364 TRZ V,ADDF ;CLEAR ADDRESS NON-VALID FLAG
\r
365 TRZE V,LITF ;VALID IN LITERAL?
\r
366 SKIPN LITLVL ;NO, ARE WE IN A LITERAL?
\r
367 JRST 0(V) ;NO, GO TO APPROPRIATE PROCESSOR
\r
370 STMNT5: PUSHJ PP,SSRCH ;TRY SYMBOLS
\r
371 JRST STMNT8 ;NOT FOUND
\r
372 TLNE ARG,EXTF!UNDF ;EXTERNAL OR UNDEFINED?
\r
373 JRST STMNT7 ;YES, PROCESS IN EVALEX
\r
374 TLNN RC,-2 ;CHECK FOR EXTERNAL
\r
377 MOVE AC0,V ;FOUND, PUT VALUE IN AC0
\r
378 TLO IO,NUMSW ;FLAG AS NUMERIC
\r
379 STMNT7: TLZ IO,IORPTC
\r
380 STMNT9: PUSHJ PP,EVALHA ;EVALUATE EXPRESSION
\r
381 TLNE FR,FSNSW ;FIELD SEEN?
\r
382 JRST STOW ;YES,STOW THE CODE AND EXIT
\r
383 CAIE C,"]"-40 ;CLOSING LITERAL?
\r
384 TRO ER,ERRQ ;NO, GIVE "Q" ERROR
\r
387 \fSTMNT8: MOVEI V,0 ;ALWAYS START SCAN WITH 0
\r
388 CAIL V,CALNTH ;END OF TABLE?
\r
389 JRST STMN8C ;YES, TRY TTCALLS
\r
390 CAME AC0,CALTBL(V) ;FOUND IT?
\r
391 AOJA V,.-3 ;NO,TRY AGAIN
\r
392 SUBI V,NEGCAL ;CALLI'S START AT -1
\r
393 HRLI V,(CALLI) ;PUT IN UUO
\r
394 STMN8D: MOVSI ARG,OPDF ;SET FLAG FOR OPDEF
\r
395 STMN8B: PUSHJ PP,INSERT ;PUT OPDEF IN TABLE
\r
396 JRST OPD ;AND TREAT AS OPDEF
\r
398 STMN8C: SETZ V, ;START WITH ZERO
\r
399 CAIL V,TTCLTH ;END OF TABLE?
\r
400 JRST STMN8A ;YES, ERROR
\r
401 CAME AC0,TTCTBL(V) ;MATCH?
\r
402 AOJA V,.-3 ;NO, KEEP TRYING
\r
403 LSH V,5 ;PUT IN AC FIELD (RIGHT HALF)
\r
404 HRLZI V,<(TTCALL)>(V) ;PUT UUO IN LEFT HALF
\r
405 JRST STMN8D ;SET OPDEF FLAG
\r
407 STMN8A: SETZB V,RC ;CLEAR VALUE AND RELOCATION
\r
408 TRO ER,ERRO ;FLAG AS UNDEFINED OP-CODE
\r
409 JUMP1 OPD ;TREAT AS STANDARD OP ON PASS1
\r
410 MOVSI ARG,OPDF!UNDF!EXTF ;SET A FEW FLAGS
\r
411 JRST STMN8B ;TO FORCE OUT A MESSAGE
\r
413 ;STATEMENT OUT PASSES REMAINDER OF LINE (CMNT)
\r
414 ;UNTIL A LINE TERMINATOR IS SEEN.
\r
415 STOUTS: TLOA IO,IOENDL!IORPTC
\r
416 STOUT: TLO IO,IORPTC
\r
419 SKIPL STPX ;YES, ERROR IF CODE STORED
\r
423 STOUT1: PUSHJ PP,CHARAC
\r
427 JRST OUTLIN ;OUTPUT THE LINE (BIN AND LST)
\r
428 \f SUBTTL LABEL PROCESSOR
\r
430 LABEL: JUMPAD LABEL4 ;COMPARE IF NON-SYMBOLIC
\r
431 JUMPE AC0,LABEL5 ;ERROR IF BLANK
\r
432 TLO IO,DEFCRS ;THIS IS A DEFINITION
\r
433 PUSHJ PP,SSRCH ;SEARCH FOR OPERAND
\r
434 MOVSI ARG,SYMF!UNDF!TAGF ;NOT FOUND
\r
435 TLNN ARG,EXTF ;OPERAND FOUND (SKIP EXIT)
\r
437 JUMP1 LABEL3 ;ERROR ON PASS1
\r
438 TLNN ARG,UNDF ;UNDEFINED ON PASS1
\r
439 JRST LABEL3 ;NO, FLAG ERROR
\r
440 TLZ ARG,EXTF!PNTF ;TURN OFF EXT FLAG NOW
\r
441 LABEL0: TLZN ARG,UNDF!VARF ;WAS IT PREVIOUSLY DEFINED?
\r
442 JRST LABEL2 ;YES, CHECK EQUALITY
\r
446 PUSHJ PP,PEEK ;GET NEXT CHAR.
\r
447 CAIE C,":" ;SPECIAL CHECK FOR ::
\r
448 JRST LABEL1 ;NO MATCH
\r
449 TLO ARG,INTF ;MAKE IT INTERNAL
\r
450 PUSHJ PP,GETCHR ;PROCESS NEXT CHAR.
\r
451 PUSHJ PP,PEEK ;PREVIEW NEXT CHAR.
\r
452 LABEL1: CAIE C,"!" ;HALF-KILL SIGN
\r
454 TLO ARG,NOOUTF ;YES, SUPPRESS IT
\r
455 PUSHJ PP,GETCHR ;AND GET RID OF IT
\r
456 LABEL6: MOVEM AC0,TAG ;SAVE FOR PASS 1 ERRORS
\r
457 HLLZS TAGINC ;ZERO INCREMENT
\r
458 JRST INSERT ;INSERT/UPDATE AND EXIT
\r
460 LABEL2: HRLOM V,LOCBLK ;SAVE LIST LOCATION
\r
461 CAMN V,LOCA ;DOES IT COMPARE WITH PREVIOUS? WFW
\r
463 LABEL3: TLOA ARG,MDFF ;NO, FLAG MULTIPLY DEFINED AND SKIP
\r
464 JRST LABEL7 ;YES, GET RID OF EXTRA CHARS.
\r
465 TRO ER,ERRM ;FLAG MULTIPLY DEFINED ERROR
\r
466 JRST UPDATE ;UPDATE AND EXIT
\r
468 LABEL4: CAMN AC0,LOCA ;DO THEY COMPARE?
\r
470 LABEL5: TRO ER,ERRP ;NO, FLAG PHASE ERROR
\r
473 LABEL7: SKIPE LITLVL ;LABEL IN A LITERAL?
\r
474 MOVEM AC0,LITLBL ;YES, SAVE LABEL NAME FOR LATER
\r
475 PUSHJ PP,PEEK ;INSPECT A CHAR.
\r
477 PUSHJ PP,GETCHR ;YES, DISPOSE OF IT
\r
478 PUSHJ PP,PEEK ;EXAMINE ONE MORE CHAR.
\r
479 CAIN C,"!" ;EXCLAMATION?
\r
480 JRST GETCHR ;YES, INDEED
\r
482 \fSUBTTL ATOM PROCESSOR
\r
483 ATOM: PUSHJ PP,CELL ;GET FIRST CELL
\r
484 TLNE IO,NUMSW ;IF NON-NUMERIC
\r
485 ATOM1: CAIE C,42 ;OR NOT A BINARY SHIFT,
\r
488 PUSH PP,AC0 ;STACK REGISTERS, ITS A BINARY SHIFT
\r
492 HRRI RX,^D10 ;COMPUTE SHIFT RADIX 10
\r
493 PUSHJ PP,CELLSF ;GET SHIFT
\r
494 MOVE ARG,RC ;SAVE RELOCATION
\r
495 POP PP,RX ;RESTORE REGISTERS
\r
498 MOVN SX,AC0 ;USE NEGATIVE OF SHIFT
\r
500 JUMPN ARG,NUMER2 ;IF NOT ABSOLUTE
\r
501 TLNN IO,NUMSW ;AND NUMERIC,
\r
502 JRST NUMER2 ;FLAG ERROR
\r
505 JRST ATOM1 ;TEST FOR ANOTHER
\r
506 \fCELLSF: TLO IO,FLDSW
\r
507 CELL: SETZB AC0,RC ;CLEAR RESULT AND RELOCATION
\r
508 SETZB AC1,AC2 ;CLEAR WORK REGISTERS
\r
509 MOVEM PP,PPTEMP ;SAVE PUSHDOWN POINTER
\r
511 TLZA FR,NEGSW!DCFSW!RADXSW
\r
513 CELL1: TLO IO,FLDSW
\r
515 LDB V,[POINT 4,CSTAT(C),14] ;GET CODE
\r
516 XCT .+1(V) ;EXECUTE, INDEX VIA BITS 11,12,13,14 OF CSTAT TABLE
\r
517 JRST CELL1 ;0; BLANK, (TAB OR "+")
\r
518 JRST LETTER ;1; LETTER ] $ % ( ) , ; >
\r
519 TLC FR,NEGSW ;2; "-"
\r
520 TLO FR,INDSW ;3; "@"
\r
521 JRST NUM1 ;4; NUMERIC 0 - 9
\r
524 JRST QUOTES ;7; ""","'"
\r
526 JRST PERIOD ;11; "."
\r
527 TROA ER,ERRQ ;12; ERROR, FLAG AND TREAT AS DELIMITER
\r
528 ;12; ! # & * / : = ? \ _
\r
529 \fLETTER: TLOA AC2,(POINT 6,AC0,) ;SET BYTE POINTER
\r
530 LETTE1: PUSHJ PP,GETCHR ;GET CHARACTER
\r
531 TLNN CS,6 ;ALPHA-NUMERIC?
\r
532 JRST LETTE3 ;NO,TEST FOR VARIABLE
\r
533 TLNE AC2,770000 ;STORE ONLY SIX BYTES
\r
534 LETTE2: IDPB C,AC2 ;RETURN FROM PERIOD
\r
537 LETTE3: CAIE C,03 ;"#"?
\r
539 JUMPE AC0,POPOUT ;TEST FOR NULL
\r
540 PUSHJ PP,PEEK ;PEEK AT NEXT CHAR.
\r
541 CAIN C,"#" ;IS IT 2ND #?
\r
542 JRST LETTE4 ;YES, THEN IT'S AN EXTERN
\r
544 PUSHJ PP,SSRCH ;YES, SEARCH FOR SYMBOL (OPERAND)
\r
545 MOVSI ARG,SYMF!UNDF ;NOT FOUND, FLAGAS UNDEFINED SYM.
\r
546 TLNN ARG,UNDF ;UNDEFINED?
\r
547 JRST GETCHR ;NO, GET NEXT CHAR AND RETURN
\r
548 TLO ARG,VARF ;YES, FLAG AS A VARIABLE
\r
549 TRO ER,ERRU ;SET UNDEFINED ERROR FLAG
\r
550 PUSHJ PP,INSERZ ;INSERT IT WITH A ZERO VALUE
\r
553 LETTE4: PUSHJ PP,GETCHR ;AND SCAN PAST IT
\r
554 PUSHJ PP,GETCHR ;GET RID OF #
\r
555 JRST EXTER1 ;PUT IN SYMBOL TABLE
\r
557 NUMER1: SETZB AC0,RC ;RETURN ZERO
\r
558 NUMER2: TRO ER,ERRN ;FLAG ERROR
\r
560 GETDEL: PUSHJ PP,BYPASS
\r
561 GETDE1: JUMPE C,.-1
\r
563 GETDE3: TLO IO,NUMSW!FLDSW ;FLAG NUMERIC
\r
564 TLNN FR,NEGSW ;IS ATOM NEGATIVE?
\r
569 GETDE2: MOVNS AC0 ;YES, NEGATE VALUE
\r
570 MOVNS RC ;AND RELOCATION
\r
571 POPOUT: POPJ PP, ;EXIT
\r
572 \fQUOTES: CAIE C,"'"-40 ;IS IT "'"
\r
573 JRST QUOTE ;NO MUST BE """
\r
576 QUOTE0: TLNE AC0,376000 ;5 CHARACTERS STORED ALREADY?
\r
577 TRO ER,ERRQ ;YES, GIVE WARNING
\r
580 QUOTE: PUSHJ PP,CHARAC ;GET 7-BIT ASCII
\r
581 CAIG C,15 ;TEST FOR LF, VT, FF OR CR
\r
583 JRST .+2 ;NO, SO ALL IS WELL
\r
584 JRST QUOTE2 ;ESCAPE WITH Q ERROR
\r
587 PUSHJ PP,PEEK ;LOOK AT NEXT CHAR.
\r
589 JRST QUOTE1 ;RESTORE REPEAT LEVEL AND QUIT
\r
590 PUSHJ PP,CHARAC ;GET NEXT CHAR.
\r
591 JRST QUOTE0 ;USE IT
\r
593 QUOTE2: TRO ER,ERRQ ;SET Q ERROR
\r
594 QUOTE1: JRST GETDEL
\r
596 SQUOT0: TLNE AC0,770000 ;SIX CHARS. STORED ALREADY ?
\r
599 IORI AC0,-40(C) ;OR IN SIXBIT CHAR.
\r
601 SQUOTE: PUSHJ PP,CHARAC
\r
614 \fQUAL: PUSHJ PP,BYPAS1 ;SKIP BLANKS, GET NEXT CHARACTER
\r
616 JRST QUAL2 ;YES, RADIX=D2
\r
618 JRST QUAL8 ;YES, RADIX=D8
\r
620 JRST NUMDF ;YES, PROCESS DECIMAL FRACTION
\r
624 JRST NUMER1 ;NO, FLAG NUMERIC ERROR
\r
643 \fSUBTTL LITERAL PROCESSOR
\r
646 PUSH PP,EXTPNT ;ALLOW EXTERN TO PRECEDE LIT IN XWD
\r
648 SKIPE LITLVL ;SAVE SEQNO AND PAGE IF NOT IN LIT ALREADY
\r
654 SQB5: JSP AC2,SVSTOW
\r
655 SQB3: PUSHJ PP,STMNT
\r
656 CAIN C,75 ;CHECK FOR ]
\r
659 TLNE FR,MWLFLG ;CALL IT ] IF NOT MULTI-WORD FLAG
\r
660 JRST SQB2 ;BUT REPEAT LAST CHARACTER
\r
665 SQB4: PUSHJ PP,CHARAC
\r
666 CAIN C,";" ;COMMENT?
\r
667 JRST SQB6 ;YES, IGNORE SQUARE BRACKETS
\r
668 CAIN C,"]" ;LOOK FOR TERMINAL SQB
\r
669 TRNN ER,ERRORS ;IN CASE OF ERROR IN LITERAL
\r
670 JRST .+2 ;NO ALL IS WELL
\r
671 JRST SQB1 ;FINISH THE LITERAL NOW!!
\r
672 CAIG C,CR ;LOOK FOR END OF LINE
\r
675 SQB4A: PUSHJ PP,OUTIML ;DUMP
\r
676 PUSHJ PP,CHARAC ;GET ANOTHER CHAR.
\r
677 SKIPL LIMBO ;CRLF FLAG
\r
678 TLO IO,IORPTC ;NO REPEAT
\r
681 SQB6: PUSHJ PP,CHARAC ;GET A CHARACTER
\r
683 CAIN C,HT ;LOOK FOR END OF LINE CHAR.
\r
687 SQB1: TLZ IO,IORPTC
\r
688 SQB2: PUSHJ PP,STOLIT
\r
690 SKIPE LITLBL ;NEED TO FIXUP A LABEL?
\r
691 PUSHJ PP,RELBLE ;YES, USE LOC OF LITERAL
\r
694 SKIPE LITLVL ;WERE WE NESTED?
\r
695 JUMP1 NUMER2 ;YES, FORCE ERROR IF PASS 1
\r
698 RELBLE: PUSH PP,AC0 ;SAVE LOCATION COUNTER
\r
699 PUSH PP,RC ;AND RELOCATION
\r
700 MOVE AC0,LITLBL ;SYMBOL WE NEED
\r
701 SETZM LITLBL ;ZERO INDICATOR
\r
702 PUSHJ PP,SSRCH ;SEARCH FOR OPERAND
\r
703 JRST RELBL1 ;SHOULD NEVER HAPPEN
\r
704 TLNN ARG,TAGF ;IT BETTER BE A LABEL
\r
705 JRST RELBL1 ;IT WASN'T , GIVE UP BEFORE SOME HARM IS DONE
\r
706 TLZ ARG,UNDF!EXTF!PNTF ;CLEAR FLAGS NOW
\r
707 POP PP,RC ;GET LITERAL RELOCATION
\r
708 MOVE V,(PP) ;GET VALUE (LOC COUNTER)
\r
709 PUSHJ PP,UPDATE ;UPDATE VALUE
\r
710 POP PP,AC0 ;RESTORE LITERAL COUNT
\r
713 RELBL1: POP PP,RC ;RESTORE RC
\r
714 POP PP,AC0 ;AND AC0
\r
715 POPJ PP, ;JUST RETURN
\r
716 \fANGLB: PUSH PP,FR
\r
726 ANGLB1: PUSHJ PP,EVALHA
\r
732 PERIOD: PUSHJ PP,GETCHR ;LOOK AT NEXT CHARACTER
\r
733 TLNN CS,2 ;ALPHABETIC?
\r
734 JRST PERNUM ;NO, TEST NUMERIC
\r
735 MOVSI AC0,(SIXBIT /./) ;YES, PUT PERIOD IN AC0
\r
736 MOVSI AC2,(POINT 6,AC0,5) ;SET BYTE POINTER
\r
737 JRST LETTE2 ;AND TREAT AS SYMBOL
\r
739 PERNUM: TLNE CS,4 ;IS IT A NUMBER
\r
741 MOVE AC0,LOCA ;NO. CURRENT LOC SYMBOL (.)
\r
742 MOVE RC,MODA ;SET TO CURRENT ASSEMBLY MODE
\r
743 JRST GETDE1 ;GET DELIMITER
\r
744 NUMDF: TLO FR,DCFSW ;SET DECIMAL FRACTION FLAG
\r
745 NUM: PUSHJ PP,GETCHR ;GET A CHARACTER
\r
746 TLNN CS,4 ;NUMERIC?
\r
748 NUM1: SUBI C,20 ;CONVERT TO OCTAL
\r
749 PUSH PP,C ;STACK FOR FLOATING POINT
\r
752 ADD AC1,C ;ADD IN LAST VALUE
\r
753 CAIL C,0(RX) ;IS NUMBER LESS THAN CURRENT RADIX?
\r
754 TLO FR,RADXSW ;NO, SET FLAG
\r
755 AOJA AC2,NUM ;YES, AC2=NO. OF DECIMAL PLACES
\r
757 \fNUM10: CAIE C,16 ;PERIOD?
\r
758 TLNE FR,DCFSW ;OR DECIMAL FRACTION?
\r
759 JRST NUM30 ;YES, PROCESS FLOATING POINT
\r
760 LSH AC1,1 ;NO, CLEAR THE SIGN BIT
\r
761 LSHC AC0,^D35 ;AND SHIFT INTO AC0
\r
762 MOVE PP,PPTEMP ;RESTORE PP
\r
763 SOJE AC2,GETDE1 ;NO RADIX ERROR TEST IF ONE DIGIT
\r
764 TLNE FR,RADXSW ;WAS ILLEGAL NUMBER ENCOUNTERED?
\r
765 TRO ER,ERRN ;YES, FLAG N ERROR
\r
768 NUM30: CAIE C,"B"-40 ;IF "B" THEN MISSING "."
\r
769 NUM31: PUSHJ PP,GETCHR
\r
770 TLNN CS,4 ;NUMERIC?
\r
776 NUM40: PUSH PP,FR ;STACK VALUES
\r
781 JRST [PUSHJ PP,PEEK ;GET NEXT CHAR
\r
782 PUSH PP,C ;SAVE NEXT CHAR
\r
783 PUSHJ PP,CELL ;YES, GET EXPONENT
\r
784 POP PP,C ;GET FIRST CHAR. AFTER E
\r
785 CAIN V,4 ;MUST HAVE NUMERICAL STATUS
\r
786 JRST .+2 ;SKIP RETURN
\r
787 CAIN C,"<" ;ALLOW <EXP>
\r
788 JRST .+2 ;SKIP RETURN
\r
789 SKIPN AC0 ;ERROR IF NON-ZERO EXPRESSION
\r
790 TROA ER,ERRQ ;ALLOW E+,E-
\r
791 SETOM RC ;FORCE NUMERICAL ERROR
\r
792 JRST .+2] ;SKIP RETURN
\r
793 MOVEI AC0,0 ;NO, ZERO EXPONENT
\r
799 JUMPN RC,NUMER1 ;EXPONENT MUST BE ABSOLUTE
\r
806 JOV NUM50 ;CLEAR OVERFLOW FLAG
\r
808 NUM50: JSP SDEL,NUMUP ;FLOATING POINT
\r
809 JRST NUM52 ;END OF WHOLE NUMBERS
\r
810 FMPR AC0,[10.0] ;MULTIPLY BY 10
\r
811 TLO AC1,233000 ;CONVERT TO FLOATING POINT
\r
812 FADR AC0,AC1 ;ADD IT IN
\r
815 NUM52: JSP SDEL,NUMDN ;PROCESS FRACTION
\r
817 JOV NUMER1 ;TEST FOR OVERFLOW
\r
822 FADR AC2,AC1 ;ACCUMULATE FRACTION
\r
826 NUM60: JSP SDEL,NUMUP
\r
832 NUM62: LSHC AC1,-^D36
\r
855 GETSYM: MOVEI AC0,0 ;CLEAR AC0
\r
856 MOVSI AC1,(POINT 6,AC0) ;PUT POINTER IN AC1
\r
857 PUSHJ PP,BYPASS ;SKIP LEADING BLANKS
\r
858 TLNN CS,2 ;ALPHABETIC?
\r
859 JRST GETSY1 ;NO, ERROR
\r
861 JRST GETSY2 ;NO, A VALID SYMBOL
\r
862 IDPB C,AC1 ;STORE THE CHARACTER
\r
863 PUSHJ PP,GETCHR ;YES, TEST NEXT CHARACTER
\r
864 TLNN CS,2 ;ALPHABETIC?
\r
865 GETSY1: TROA ER,ERRA
\r
866 GETSY2: AOS 0(PP) ;YES, SET SKIP EXIT
\r
867 GETSY3: TLNN CS,6 ;ALPHA-NUMERIC?
\r
868 JRST BYPAS2 ;NO, GET DELIMITER
\r
869 TLNE AC1,770000 ;YES, HAVE WE STORED SIX?
\r
870 IDPB C,AC1 ;NO, STORE IT
\r
874 \fSUBTTL EXPRESSION EVALUATOR
\r
875 CV== AC0 ;CURRENT VALUE
\r
876 PV== AC1 ;PREVIOUS VALUE
\r
877 RC== RC ;CURRENT RELOCATABILITY
\r
878 PR== AC2 ;PREVIOUS RELOCATABILITY
\r
879 CS= CS ;CURRENT STATUS
\r
880 PS== SDEL ;PREVIOUS STATUS
\r
882 EVALHA: TLO FR,TMPSW
\r
883 EVALCM: PUSHJ PP,EVALEX ;EVALUATE FIRST EXPRESSION
\r
884 PUSH PP,[0] ;MARK PDL
\r
885 JUMPCM EVALC3 ;JUMP IF COMMA
\r
886 TLO IO,IORPTC ;IT'S NOT,SO REPEAT
\r
887 JRST OP ;PROCESS IN OP
\r
889 PUSH PP,[0] ;STORE ZERO'S ON PDL
\r
890 PUSH PP,[0] ;.......
\r
891 MOVSI AC2,(POINT 4,(PP),12)
\r
892 JRST OP1B ;PROCESS IN OP
\r
894 EVALEX: TLO IO,FLDSW
\r
895 PUSH PP,[XWD TNODE,0] ;MARK THE LIST 200000,,0
\r
897 EVATOM: PUSHJ PP,ATOM ;GET THE NEXT ATOM
\r
898 JUMPE AC0,EVGETD ;TEST FOR NULL/ZERO
\r
899 TLOE IO,NUMSW ;SET NUMERIC, WAS IT PREVIOUSLY?
\r
900 JRST EVGETD+1 ;YES, TREAT ACCORDINGLY
\r
901 PUSHJ PP,SEARCH ;SEARCH FOR MACRO OR SYMBOL
\r
902 JRST EVOP ;NOT FOUND, TRY FOR OP-CODE
\r
903 JUMPL ARG,.+2 ;SKIP IF OPERAND
\r
904 PUSHJ PP,SSRCH1 ;OPERATOR, TRY FOR SYMBOL (OPERAND)
\r
905 PUSHJ PP,QSRCH ;PERFORM CROSS-REFERENCE
\r
906 JUMPG ARG,EVMAC ;BRANCH IF OPERATOR
\r
907 MOVE AC0,V ;SYMBOL, SET VALUE
\r
908 JRST EVTSTS ;TEST STATUS
\r
910 EVMAC: TLNE FR,NEGSW ;UNARY MINUS?
\r
911 JRST EVERRZ ;YES, INVALID BEFORE OPERATOR
\r
912 LDB SDEL,[POINT 3,ARG,5] ;GET MACF/OPDF/SYNF
\r
913 SOJL SDEL,EVERRZ ;ERROR IF NO FLAGS
\r
915 JUMPE C,.+2 ;NON-BLANK?
\r
916 TLO IO,IORPTC ;YES, REPEAT CHARACTER
\r
917 SOJE SDEL,CALLM ;MACRO IF 2
\r
918 JUMPG SDEL,EVOPS ;SYNONYM IF 4
\r
921 MOVEI V,OP ;SET TRANSFER VECTOR
\r
923 \fEVOP: TLNE FR,NEGSW ;OPCODE, UNARY MINUS?
\r
924 JRST EVERRZ ;YES, ERROR
\r
926 PUSHJ PP,OPTSCH ;SEARCH SYMBOL TABLE
\r
927 JRST EVOPX ;NOT FOUND
\r
928 EVOPS: TRZ V,LITF ;CLEAR LIT INVALID FLAG
\r
929 TRZE V,ADDF ;SYNONYM
\r
930 JRST EVOPX ;PSEUDO-OP THAT GENERATES NO DATA JUMPS
\r
932 EVOPD: JUMPE C,.+2 ;OPDEF, NON-BLANK DELIMITER?
\r
933 TLO IO,IORPTC ;YES, REPEAT CHARACTER
\r
944 EVOPX: MOVSI ARG,SYMF!UNDF
\r
946 EVERRZ: SETZB AC0,RC ;CLEAR CODE AND RELOCATION
\r
947 EVERRU: TRO ER,ERRU
\r
949 \fEVTSTS: TLNE ARG,UNDF
\r
950 JRST [TRO ER,ERRU ;SET UNDEF ERROR
\r
951 JUMP1 EVGETD ;TREAT AS UNDF ON PASS1
\r
952 JRST .+1] ;TREAT AS EXTERNAL ON PASS2
\r
955 HRRZ RC,ARG ;GET ADRES WFW
\r
956 HRRZ ARG,EXTPNT ;SAVE IT WFW
\r
957 HRRM RC,EXTPNT ;WFW
\r
962 EVTSTR: TLNE ARG,MDFF ;MULTIPLY DEFINED?
\r
963 TRO ER,ERRD ;YES, FLAG IT
\r
964 TLNE FR,NEGSW ;NEGATIVE ATOM?
\r
965 PUSHJ PP,GETDE2 ;YES, NEGATE AC0 AND RC
\r
967 EVGETD: TLNE IO,NUMSW ;NON BLANK FIELD
\r
968 TLO FR,FSNSW ;YES,SET FLAG
\r
970 TLNE CS,6 ;ALPHA-NUMERIC?
\r
971 TLO IO,IORPTC ;YES, REPEAT IT
\r
972 EVNUM: POP PP,PS ;POP THE PREVIOUS DELIMITER/TNODE
\r
974 CAMGE PS,CS ;OPERATION REQUIRED?
\r
975 JRST EVPUSH ;NO, PUT VALUES BACK ON STACK
\r
976 TLNN PS,TNODE ;YES, HAVE WE REACHED TERMINAL NODE?
\r
977 JRST EVXCT ;NO, EXECUTION REQUIRED
\r
978 TLNN CS,170000 ;YES, ARE WE POINTING AT DEL? (& ! * / + - _)
\r
979 POPJ PP, ;YES, EXIT
\r
980 ;NO,FALL INTO EVPUSH
\r
982 \fEVPUSH: PUSH PP,PS ;STACK VALUES
\r
986 JRST EVATOM ;GET NEXT ATOM
\r
988 EVXCT: POP PP,PR ;POP PREVIOUS RELOCATABILITY
\r
989 POP PP,PV ;AND PREVIOUS VALUE
\r
990 LDB PS,[POINT 3,PS,29] ;TYPE OF OPERATION TO PS
\r
991 JRST .+1(PS) ;PERFORM PROPER OPERATION
\r
992 JRST ASSEM1 ;0; SHOULD NEVER GET HERE ;DMN
\r
998 TDOA CV,PV ;6; MERGE PV INTO CV
\r
999 AND CV,PV ;7; AND PV INTO CV
\r
1000 JUMPN RC,.+2 ;COMMON RELOCATION TEST
\r
1001 EVXCT1: JUMPE PR,EVNUM
\r
1002 TRO ER,ERRR ;BOTH MUST BE FIXED
\r
1003 JRST EVNUM ;GO TRY AGAIN
\r
1013 XDIV: IDIV PR,CV ;CORRECT RELOCATABILITY
\r
1015 XDIV1: EXCH PR,RC ;TAKE RELOCATION OF NUMERATOR
\r
1018 XMUL: JUMPE PR,XMUL1 ;AT LEAST ONE OPERAND
\r
1019 JUMPE RC,XMUL1 ;MUST BE FIXED
\r
1021 XMUL1: IORM PR,RC ;GET RELOCATION TO RC
\r
1022 CAMGE PV,CV ;FIND THE GREATER
\r
1023 EXCH PV,CV ;FIX IN CASE CV=0,OR 1
\r
1031 \f SUBTTL LITERAL STORAGE HANDLER
\r
1034 SETZB AC0,RC ;ERROR, NO CODE STORED
\r
1035 PUSHJ PP,STOW ;STOW ZERO
\r
1036 TRO ER,ERRL ;AND FLAG THE ERROR
\r
1038 STOLIT: MOVE SDEL,STPX
\r
1039 SUB SDEL,STPY ;COMPUTE NUMBER OF WORDS
\r
1040 JUMPE SDEL,STOLER ;ERROR IF NONE STORED
\r
1041 TRNN ER,ERRORS ;ANY ERRORS?
\r
1043 JUMP2 STOL22 ;YES, NO SEARCH. BRANCH IF PASS2
\r
1044 ADDM SDEL,LITCNT ;PASS ONE, UPDATE COUNT
\r
1045 JRST STOWI ;INITIALIZE STOW
\r
1047 STOL06: MOVEI SX,LITAB ;PREPARE FOR SEARCH
\r
1048 MOVE ARG,STPX ;SAVE IN THE EVENT OF MULTIPLE-WORD
\r
1052 STOL08: PUSHJ PP,DSTOW ;GET VALUE WFW
\r
1054 STOL10: SOJL AC2,STOL24 ;TEST FOR END
\r
1055 MOVE SX,0(SX) ;NO, GET NEXT STORAGE CELL
\r
1056 MOVE V,-1(SX) ;GET RELOCATION BITS WFW
\r
1057 CAMN AC0,-2(SX) ;DO CODES COMPARE? WFW
\r
1058 CAME RC,V ;YES, HOW ABOUT RELOCATION?
\r
1059 AOJA SDEL,STOL10 ;NO, TRY AGAIN
\r
1060 SKIPGE STPX ;YES, MULTI-WORD?
\r
1061 JRST STOL26 ;NO, JUST RETURN LOCATION
\r
1062 MOVEM AC2,SAVBLK+AC2 ;YES, SAVE STARTING INFO
\r
1063 MOVEM SX,SAVBLK+SX
\r
1065 STOL12: SOJL AC2,STOL23 ;TEST FOR END
\r
1066 PUSHJ PP,DSTOW ;GET NEXT WORD WFW
\r
1067 MOVE SX,0(SX) ;UPDATE POINTER
\r
1068 MOVE V,-1(SX) ;GET RELOCATION WFW
\r
1069 CAMN AC0,-2(SX) ;COMPARE VALUE WFW
\r
1070 CAME RC,V ;AND RELOCATION
\r
1071 JRST STOL14 ;NO MATCH, TRY AGAIN
\r
1072 SKIPL STPX ;MATCH, HAVE WE FINISHED SEARCH?
\r
1073 JRST STOL12 ;NO, TRY NEXT WORD
\r
1074 JRST STOL26 ;YES, RETURN LOCATION
\r
1076 STOL14: MOVE AC2,SAVBLK+AC2 ;RESTORE STOW POINTERS
\r
1080 AOJA SDEL,STOL08 ;BETTER LUCK NEXT TIME
\r
1082 STOL22: MOVE SDEL,LITNUM
\r
1083 STOL23: PUSHJ PP,DSTOW ;DSTOW AND CONVERT
\r
1084 STOL24: MOVE SX,LITABX ;GET CURRENT STORAGE
\r
1085 PUSHJ PP,GETTOP ;GET NEXT CELL
\r
1086 MOVEM AC0,-2(SX) ;STORE CODE WFW
\r
1087 MOVEM RC,-1(SX) ;WFW
\r
1088 MOVEM SX,LITABX ;SET POINTER TO CURRENT CELL
\r
1089 AOS LITNUM ;INCREMENT NUMBER STORED
\r
1090 AOS LITCNT ;INCREMENT NUMBER RESERVED
\r
1091 SKIPL STPX ;ANY MORE CODE?
\r
1093 STOL26: JUMP1 POPOUT ;EXIT IF PASS ONE
\r
1094 MOVE SX,LITHDX ;GET HEADER BLOCK
\r
1095 HLRZ RC,-1(SX) ;GET BLOCK RELOCATION
\r
1097 ADDI AC0,0(SDEL) ;COMPUTE ACTUAL LOCATION
\r
1100 \fSUBTTL INPUT ROUTINES
\r
1101 GETCHR: PUSHJ PP,CHARAC ;GET ASCII CHARACTER
\r
1102 CAIL C,"A"+40 ;CHECK FOR LOWER CASE
\r
1104 JRST .+2 ;NOT LOWER CASE
\r
1105 TRZA C,100 ;CONVERT LOWER CASE TO SIXBIT
\r
1106 SUBI C,40 ;CONVERT TO SIXBIT
\r
1107 CAIG C,77 ;CHAR GREATER THAN SIXBIT?
\r
1108 JUMPGE C,GETCS ;TEST FOR VALID SIXBIT
\r
1109 ADDI C,40 ;BACK TO ASCII
\r
1110 CAIN C,HT ;CHECK FOR TAB
\r
1111 JRST GETCS2 ;MAKE IT LOOK LIKE SPACE
\r
1112 CAIG C,CR ;GREATER THAN CR
\r
1113 CAIG C,HT ;GREATER THAN TAB
\r
1114 JRST GETCS1 ;IS NOT FF,VT,LF OR CR
\r
1115 MOVEI C,EOL ;LINE OR FORM FEED OR V TAB
\r
1116 TLOA IO,IORPTC ;REPEAT CHARACTER
\r
1117 GETCS2: MOVEI C,0 ;BUT TREAT AS BLANK
\r
1118 GETCS: MOVE CS,CSTAT(C) ;GET STATUS BITS
\r
1121 GETCS1: JUMPE C,GETCS ;IGNORE NULS
\r
1122 TRC C,100 ;MAKE CHAR. VISIBLE
\r
1124 DPB CS,LBUFP ;PUT ^ IN OUTPUT
\r
1125 PUSHJ PP,RSW2 ;ALSO MODIFIED CHAR.
\r
1126 TRO ER,ERRQ ;FLAG Q ERROR
\r
1127 JRST GETCHR ;BUT IGNORE CHAR.
\r
1129 CHARAC: TLZE IO,IORPTC ;REPEAT REQUESTED?
\r
1131 RSW0: JUMPN MRP,MREAD ;BRANCH IF TREE POINTER SET
\r
1133 RSW1: SKIPE RPOLVL ;ARE WE IN "REPEAT ONCE"?
\r
1135 RSW2: MOVE CS,LIMBO ;GET LAST CHAR.
\r
1136 MOVEM C,LIMBO ;STORE THIS CHAR. FOR RPTC
\r
1138 CAIE CS,CR ;YES,LAST CHAR. A CR?
\r
1140 HRROS LIMBO ;YES,FLAG
\r
1141 POPJ PP, ;AND EXIT
\r
1143 RSW3: TLNE IO,IOSALL ;MACRO SUPPRESS ALL?
\r
1144 JUMPN MRP,CPOPJ ;YES,DON'T LIST IN MACRO
\r
1145 SOSG CPL ;ANY ROOM IN THE IMAGE BUFFER?
\r
1146 PUSHJ PP,OUTPL ;NO, OUTPUT THE PARTIAL LINE
\r
1147 IDPB C,LBUFP ;YES, STORE IN PRINT AREA
\r
1149 POPJ PP, ;NO, EXIT
\r
1151 ANDCAM C,CPL ;MASK
\r
1152 CHARAX: HRRZ C,LIMBO ;GET LAST CHARACTER
\r
1155 CHARL: PUSHJ PP,CHARAC ;GET AND TEST 7-BIT ASCII
\r
1156 CAIG C,FF ;LINE OR FORM FEED OR VT?
\r
1159 SKIPE LITLVL ;IN LITERAL?
\r
1161 CHARL1: PUSHJ PP,SAVEXS ;SAVE REGISTERS
\r
1162 PUSHJ PP,OUTLIN ;DUMP THE LINE
\r
1163 JRST RSTRXS ;RESTORE REGISTERS AND EXIT
\r
1164 \fSUBTTL CHARACTER STATUS TABLE
\r
1166 DEFINE GENCS (OPLVL,ATOM,AN,SQUOZ,OPTYPE,SEQNO)
\r
1167 <BYTE (6)OPLVL (9)ATOM (3)AN (6)SQUOZ,OPTYPE,SEQNO>
\r
1169 ;OPLVL PRIORITY OF BINARY OPERATORS
\r
1170 ;ATOM INDEX TO JUMP TABLE AT CELL1
\r
1171 ;AN TYPE OF CHARACTER
\r
1172 ; 1=OTHER, 2=ALPHA, 4=NUMERIC
\r
1173 ;SQUOZ VALUE IN RADIX 50
\r
1174 ;OPTYPE INDEX TO JUMP TABLE AT EVXCT
\r
1175 ;SEQNO VALUE IN SIXBIT
\r
1177 GENCS 00,00,1,00,00,00 ; ' '
\r
1178 GENCS 04,12,1,00,06,01 ; '!'
\r
1179 GENCS 00,07,1,00,00,02 ; '"'
\r
1180 GENCS 00,12,1,00,00,03 ; '#'
\r
1181 GENCS 00,01,2,46,00,04 ; '$'
\r
1182 GENCS 00,01,2,47,00,05 ; '%'
\r
1183 GENCS 04,12,1,00,07,06 ; '&'
\r
1184 GENCS 00,07,1,00,00,07 ; '''
\r
1186 GENCS 00,01,1,00,00,10 ; '('
\r
1187 GENCS 00,01,1,00,00,11 ; ')'
\r
1188 GENCS 02,12,1,00,01,12 ; '*'
\r
1189 GENCS 01,00,1,00,03,13 ; '+'
\r
1190 GENCS 40,01,1,00,00,14 ; ','
\r
1191 GENCS 01,02,1,00,04,15 ; '-'
\r
1192 GENCS 00,11,2,45,00,16 ; '.'
\r
1193 GENCS 02,12,1,00,02,17 ; '/'
\r
1195 GENCS 00,04,4,01,00,20 ; '0'
\r
1196 GENCS 00,04,4,02,00,21 ; '1'
\r
1197 GENCS 00,04,4,03,00,22 ; '2'
\r
1198 GENCS 00,04,4,04,00,23 ; '3'
\r
1199 GENCS 00,04,4,05,00,24 ; '4'
\r
1200 GENCS 00,04,4,06,00,25 ; '5'
\r
1201 GENCS 00,04,4,07,00,26 ; '6'
\r
1202 GENCS 00,04,4,10,00,27 ; '7'
\r
1204 GENCS 00,04,4,11,00,30 ; '8'
\r
1205 GENCS 00,04,4,12,00,31 ; '9'
\r
1206 GENCS 00,12,1,00,00,32 ; ':'
\r
1207 GENCS 00,01,1,00,00,33 ; ';'
\r
1208 GENCS 00,05,1,00,00,34 ; '<'
\r
1209 GENCS 00,12,1,00,00,35 ; '='
\r
1210 GENCS 00,01,1,00,00,36 ; '>'
\r
1211 GENCS 00,12,1,00,00,37 ; '?'
\r
1212 \f GENCS 00,03,1,00,00,40 ; '@'
\r
1213 GENCS 00,01,2,13,00,41 ; 'A'
\r
1214 GENCS 00,01,2,14,00,42 ; 'B'
\r
1215 GENCS 00,01,2,15,00,43 ; 'C'
\r
1216 GENCS 00,01,2,16,00,44 ; 'D'
\r
1217 GENCS 00,01,2,17,00,45 ; 'E'
\r
1218 GENCS 00,01,2,20,00,46 ; 'F'
\r
1219 GENCS 00,01,2,21,00,47 ; 'G'
\r
1221 GENCS 00,01,2,22,00,50 ; 'H'
\r
1222 GENCS 00,01,2,23,00,51 ; 'I'
\r
1223 GENCS 00,01,2,24,00,52 ; 'J'
\r
1224 GENCS 00,01,2,25,00,53 ; 'K'
\r
1225 GENCS 00,01,2,26,00,54 ; 'L'
\r
1226 GENCS 00,01,2,27,00,55 ; 'M'
\r
1227 GENCS 00,01,2,30,00,56 ; 'N'
\r
1228 GENCS 00,01,2,31,00,57 ; 'O'
\r
1230 GENCS 00,01,2,32,00,60 ; 'P'
\r
1231 GENCS 00,01,2,33,00,61 ; 'Q'
\r
1232 GENCS 00,01,2,34,00,62 ; 'R'
\r
1233 GENCS 00,01,2,35,00,63 ; 'S'
\r
1234 GENCS 00,01,2,36,00,64 ; 'T'
\r
1235 GENCS 00,01,2,37,00,65 ; 'U'
\r
1236 GENCS 00,01,2,40,00,66 ; 'V'
\r
1237 GENCS 00,01,2,41,00,67 ; 'W'
\r
1239 GENCS 00,01,2,42,00,70 ; 'X'
\r
1240 GENCS 00,01,2,43,00,71 ; 'Y'
\r
1241 GENCS 00,01,2,44,00,72 ; 'Z'
\r
1242 GENCS 00,06,1,00,00,73 ; '['
\r
1243 GENCS 00,12,1,00,00,74 ; '\'
\r
1244 GENCS 00,01,1,00,00,75 ; ']'
\r
1245 GENCS 00,10,1,00,00,76 ; '^'
\r
1246 GENCS 10,12,1,00,05,77 ; '_'
\r
1247 \fSUBTTL LISTING ROUTINES
\r
1249 OUTLIN: TRNN ER,ERRORS-ERRQ ;ANY ERRORS?
\r
1250 TLNE FR,ERRQSW ;NO, IGNORE Q ERRORS?
\r
1251 TRZ ER,ERRQ ;YES, YES, ZERO THE Q ERROR
\r
1252 HRLZ AC0,ER ;PUT ERROR FLAGS IN AC0 LEFT
\r
1254 JUMP1 OUTL30 ;BRANCH IF PASS ONE
\r
1255 JUMPN AC0,OUTL02 ;JUMP IF ANY ERRORS TO FORCE PRINTING
\r
1256 SKIPL STPX ;SKIP IF NO CODE, OTHERWISE
\r
1258 TLNN IO,IOSALL ;YES,SUPPRESS ALL?
\r
1260 JUMPN MRP,CPOPJ ;YES,EXIT IF IN MACRO
\r
1261 LDB C,[XWD 350700,LBUF]
\r
1262 CAIE C,15 ;FIRST CHAR CR?
\r
1263 OUTL01: TLZ IO,IOMAC ;FORCE MACRO PRINTING
\r
1264 OUTL03: TLNN IO,IOMSTR!IOPROG!IOMAC
\r
1265 OUTL02: IOR ER,OUTSW ;FORCE IT.
\r
1266 IDPB AC0,LBUFP ;STORE ZERO TERMINATOR AFTER ASCII SRC LINE
\r
1267 TLNN FR,CREFSW ;CREF?
\r
1268 PUSHJ PP,CLSCRF ;YES, WRITE END OF CREF DATA (177,003)
\r
1269 JUMPE AC0,OUTL20 ;BRANCH IF NO ERRORS
\r
1270 TLZE AC0,ERRM ;M ERROR?
\r
1271 TLO AC0,ERRP ;M ERROR SET - SET P ERROR.
\r
1272 PUSHJ PP,OUTLER ;PROCESS ERRORS
\r
1274 OUTL20: SKIPN RC,ASGBLK
\r
1276 SKIPL STPX ;ANY BINARY?
\r
1277 JRST OUTL23 ;YES, JUMP
\r
1278 JUMPE RC,OUTL22 ;SEQUENCE BREAK AND NO BINARY JUMPS
\r
1279 ILDB C,TABP ;ASSIGNMENT FALLS THROUGH
\r
1280 PUSHJ PP,OUTL ;OUTPUT A TAB.
\r
1281 ILDB C,TABP ;OUTPUT 2ND TAB, LOCATION FIELD
\r
1282 PUSHJ PP,OUTC ;NEXT IS BINARY LISTING FIELD
\r
1283 HLLO CS,LOCBLK ;LEFT HALF OF A 36BIT VALUE
\r
1284 JUMPL RC,.+2 ;SKIP IF LEFT HALF IS NOT RELOC
\r
1285 TRZA CS,1 ;IT IS, SET THE FLAG
\r
1286 TLNE CS,-1 ;SKIP IF ITS A 18BIT VALUE, OTHERWISE
\r
1287 PUSHJ PP,ONC1 ;PRINT LH OF A 36 BIT VALUE IN CS
\r
1288 HRLO CS,LOCBLK ;PICK UP THE RIGHT HALF (18BIT VALUE)
\r
1290 PUSHJ PP,ONC ;PRINT IT
\r
1291 JRST OUTL23 ;SKIP SINGLE QUOTE TEST
\r
1292 \fOUTL22: PUSHJ PP,ONC ;TAB TO RH AND PRINT IT
\r
1296 OUTL23: SKIPL STPX ;ANY BINARY?
\r
1297 PUSHJ PP,BOUT ;YES, DUMP IT
\r
1298 MOVE CS,@OUTLI2 ;[POINT 7,LBUF]
\r
1304 PUSHJ PP,OUTASC ;OUTPUT TABS
\r
1305 OUTL25: MOVEI CS,LBUF
\r
1306 PUSHJ PP,OUTAS0 ;DUMP THE LINE
\r
1307 TLNE IO,IOSALL ;SUPPRESSING ALL
\r
1308 JUMPN MRP,OUTL27 ;YES,EXTRA CR IF IN MACRO
\r
1309 OUTL26: SKIPGE STPX ;ANY BINARY?
\r
1310 JRST OUTLI ;NO, CLEAN UP AND EXIT
\r
1311 PUSHJ PP,OUTLI2 ;YES, INITIALIZE FOR NEXT LINE
\r
1312 PUSHJ PP,BOUT ;YES, DUMP IT
\r
1313 OUTL27: PUSHJ PP,OUTCR ;OUTPUT CARRIAGE RETURN
\r
1314 JRST OUTL26 ;TEST FOR MORE BINARY
\r
1316 OUTPL: SKIPN LITLVL ;IF IN LITERAL
\r
1317 SKIPL STPX ;OR CODE GENERATED
\r
1318 JRST OUTIM ;JUST OUTPUT THE IMAGE
\r
1319 SKIPN ASGBLK ;SKIP IF AN ASSIGNMENT
\r
1320 JRST OUTIM ;OTHERWISE OUTPUT IMAGE
\r
1321 PUSH PP,C ;SAVE CHAR.
\r
1325 IDPB C,LBUFP ;FINISH WITH CRLF
\r
1326 PUSHJ PP,OUTLIN ;OUTPUT PARTIAL LINE
\r
1327 POP PP,C ;RESTORE CHAR.
\r
1328 JRST OUTLI2 ;INITIALISE REST OF LINE
\r
1329 \fOUTL30: AOS CS,STPX ;PASS ONE
\r
1330 ADDM CS,LOCO ;INCREMENT OUTPUT LOCATION
\r
1331 PUSHJ PP,STOWI ;INITIALIZE STOW
\r
1332 TLZ AC0,ERRORS-ERRM-ERRP-ERRV
\r
1333 JUMPN AC0,OUTL32 ;JUMP IF ERRORS
\r
1334 TLNE IO,IOSALL ;SUPPRESSING ALL/
\r
1335 JUMPN MRP,CPOPJ ;YES,EXIT
\r
1336 JRST OUTLI1 ;NO,INIT LINE
\r
1338 OUTL32: IDPB AC0,LBUFP ;ZERO TERNIMATOR
\r
1339 IOR ER,OUTSW ;LIST ERRORS
\r
1341 PUSHJ PP,OUTSIX ;OUTPUT TAG
\r
1343 PUSHJ PP,DNC ;CONVERT INCREMENT TO DECIMAL
\r
1344 PUSHJ PP,OUTTAB ;OUTPUT TAB
\r
1345 PUSHJ PP,OUTLER ;OUTPUT ERROR FLAGS
\r
1347 MOVEI CS,SEQNO ;ADDRESS OF SEQUENCE NO.
\r
1348 SKIPE SEQNO ;FILE NOT SEQUENCED
\r
1349 PUSHJ PP,OUTAS0 ;OUTPUT IT
\r
1350 JRST OUTL25 ;OUTPUT BASIC LINE
\r
1352 OUTLER: PUSH PP,ER ;SAVE LISTING SWITCHES FOR LATER
\r
1353 TRNE ER,TTYSW ;IF THIS IS ON, LISTING IS ON TTY
\r
1354 TRZ ER,ERRORS ;SO SUPPRESS ON TTY
\r
1355 TDZ ER,OUTSW ;BUT THIS SHOULD ONLY GO TO THE TTY
\r
1356 MOVE CS,INDIR ;GET FILE NAME
\r
1357 CAME CS,LSTFIL ;AND SEE IF SAME
\r
1358 JRST [MOVEM CS,LSTFIL ;SAVE AS LAST ONE
\r
1360 PUSHJ PP,OUTSIX ;LIST NAME
\r
1363 MOVE CS,PAGENO ;PRINT PAGE NUMBER TOO
\r
1365 MOVE CS,PAGENO ;NOW CHECK PAGE NUMBER
\r
1367 OUTLE8: JRST [MOVEM CS,LSTPGN
\r
1368 MOVEI CS,[ASCIZ /PAGE /]
\r
1372 PUSHJ PP,OUTCR ;AND NOW FOR THE ERROR LINE
\r
1374 HLLM ER,(PP) ;RESTORE ER BUT NOT IO (LEFT HALF OF AC)
\r
1376 MOVE CS,[POINT 7,[ASCII / QXADLRUVNOPEM/]]
\r
1377 OUTLE2: ILDB C,CS ;GET ERROR MNEMONIC
\r
1378 JUMPGE AC0,OUTLE4 ;BRANCH IF NOT FLAGGED
\r
1379 PUSHJ PP,OUTL ;OUTPUT THE CHARACTER
\r
1380 AOS ERRCNT ;INCREMENT ERROR COUNT
\r
1381 OUTLE4: LSH AC0,1 ;SHIFT NEXT FLAG INTO SIGN BIT
\r
1382 \f JUMPN AC0,OUTLE2 ;TEST FOR END
\r
1384 \fOUTIM1: TLOA FR,IOSCR ;SUPPRESS CRLF AFTER LINE
\r
1385 OUTIM: TLZ FR,IOSCR ;DON'T FOR PARTIAL LINE
\r
1386 TLNE IO,IOSALL ;SUPPRESSING ALL?
\r
1387 JUMPN MRP,CPOPJ ;YES ,EXIT IF IN MACRO
\r
1388 JUMP1 OUTLI1 ;BYPASS IF PASS ONE
\r
1391 TLNN IO,IOMSTR!IOPROG!IOMAC
\r
1393 PUSH PP,C ;OUTPUT IMAGE
\r
1396 OUTIM2: MOVE CS,TABP
\r
1397 PUSHJ PP,OUTASC ;OUTPUT TABS
\r
1398 IDPB C,LBUFP ;STORE ZERO TERMINATOR
\r
1400 PUSHJ PP,OUTAS0 ;OUTPUT THE IMAGE
\r
1401 TLZN FR,IOSCR ;CRLF SUPPRESS?
\r
1402 PUSHJ PP,OUTCR ;NO,OUTPUT
\r
1408 OUTLI: TLNE IO,IOSALL ;SUPPRESSING ALL
\r
1409 JUMPN MRP,OUTLI3 ;YES,SET FLAG IN REPEATS ALSO
\r
1410 TLNE IO,IOPALL ;MACRO EXPANSION SUPRESS REQUESTED?
\r
1411 SKIPN MACLVL ;YES, ARE WE IN MACRO?
\r
1412 TLZA IO,IOMAC ;NO, CLEAR MAC FLAG
\r
1413 OUTLI3: TLO IO,IOMAC ;YES, SET FLAG
\r
1415 OUTLI1: TRZ ER,ERRORS!LPTSW!TTYSW
\r
1416 OUTLI2: MOVE CS,[POINT 7,LBUF] ;INITIALIZE BUFFERS
\r
1418 MOVE CS,[POINT 7,TABI,6]
\r
1422 MOVSI CS,(ASCII / /)
\r
1423 SKIPE SEQNO ;HAVE WE SEQUENCE NUMBERS?
\r
1424 MOVEM CS,SEQNO ;YES, STORE TAB IN CASE OF MACRO
\r
1425 MOVEM CS,SEQNO+1 ;STORE TAB AND TERMINATOR
\r
1429 \fOUTIML: TLNE IO,IOSALL ;SUPPRESSING ALL?
\r
1430 JUMPN MRP,CPOPJ ;YES,EXIT IF IN MACRO
\r
1431 TRNN ER,ERRORS-ERRQ ;FOR LITERALS (MULIT-LINE) OUTPUT ERRORS
\r
1435 JUMP1 OUTML1 ;CHECK PASS1 ERRORS
\r
1438 PUSH PP,[0] ;ERRORS SHOULD BE ZEROED
\r
1440 PUSH PP,AC0 ;SAVE AC0 IN CASE CALLED FROM ASCII
\r
1441 MOVE AC0,CS ;ERROR ROUTINE WANTS FLAGS IN AC0
\r
1444 PUSHJ PP,CLSCRF ;FIX CREF
\r
1447 PUSHJ PP,OUTLER ;OUTPUT THEM
\r
1449 JRST OUTIM2 ;AND LINE
\r
1451 OUTML1: TLZ CS,ERRORS-ERRM-ERRP-ERRV
\r
1452 JUMPE CS,OUTLI2 ;NONE
\r
1453 TRZ ER,ERRM!ERRP!ERRV
\r
1456 PUSH PP,C ;SAVE THIS
\r
1457 PUSH PP,AC0 ;AS ABOVE
\r
1466 PUSHJ PP,OUTLER ;DO NOT FORGET ERRORS
\r
1468 MOVEI CS,LBUF ;PRINT REST OF LINE
\r
1474 \fSUBTTL OUTPUT ROUTINES
\r
1475 UOUT: PUSHJ PP,LOOKUP ;SET FOR TABLE SCAN
\r
1476 TRNN ARG,PNTF ;WFW
\r
1478 JRST UOUT13 ;TEST FOR UNDF!EXTF!PNTF ON PASS2
\r
1480 TLNN IO,IOIOPF ;ANY IOP'S SEEN
\r
1481 JRST UOUT12 ;NO,MAKE EXTERNAL
\r
1482 MOVSI CS,PRMTBL-PRMEND;YES LOOKUP IN TABLE
\r
1483 UOUT1: CAME AC0,PRMTBL(CS) ;HAVE WE A MATCH?
\r
1484 AOBJN CS,UOUT2 ;NO,INCREMENT AND JUMP
\r
1485 MOVE ARG,PRMTBL+1(CS);YES,GET VALUE
\r
1486 MOVEM ARG,(SX) ;UPDATE SYMBOL TABLE
\r
1488 UOUT2: AOBJN CS,UOUT1 ;TEST FOR END
\r
1490 UOUT12: PUSHJ PP,EXTER2 ;MAKE IT EXTERNAL
\r
1491 MOVSI ARG,UNDF ;BUT PUT UNDF BACK ON
\r
1492 IORM ARG,(SX) ;SO MESSAGE WILL COME OUT
\r
1493 POPJ PP, ;GET NEXT SYMBOL
\r
1495 UOUT13: JUMP1 CPOPJ ;RECYCLE ON PASS1
\r
1496 TRC ARG,UNDF!EXTF!PNTF ;CHECK FOR ALL THREE ON
\r
1497 TRCE ARG,UNDF!EXTF!PNTF ;ARE THEY?
\r
1498 POPJ PP, ;NO, RECYCLE
\r
1499 UOUT10: PUSHJ PP,OUTCR
\r
1500 PUSHJ PP,OUTSYM ;OUTPUT THE SYMBOL
\r
1501 MOVEI CS,[SIXBIT /UNASSIGNED, DEFINED AS IF EXTERNAL @/]
\r
1502 JRST OUTSIX ;POPJ FOR NEXT SYMBOL
\r
1504 UOUT30: PUSHJ PP,ONC1 ;OUTPUT THE LOCATION
\r
1505 JRST HIGHQ ;EXIT THROUGH HIGHQ
\r
1506 \f ;OUTPUT THE ENTRIES
\r
1508 EOUT: MOVEI C,0 ;INITIALIZE THE COUNT
\r
1511 EOUT1: SOJL SDEL,EOUT2 ;TEST FOR END
\r
1514 ANDCAI ARG,SYMF!INTF!ENTF
\r
1515 JUMPN ARG,EOUT1 ;IF INVALID, DON'T COUNT
\r
1516 AOJA C,EOUT1 ;BUMP COUNT
\r
1518 EOUT2: HRLI C,4 ;BLOCK TYPE 4
\r
1526 EOUT3: SOJL SDEL,POPOUT
\r
1529 ANDCAI C,SYMF!INTF!ENTF
\r
1531 SOJGE V,EOUT4 ;TEST END OF BLOCK
\r
1534 EOUT4: MOVE AC0,-1(SX)
\r
1539 \f ;OUTPUT THE SYMBOLS
\r
1541 SOUT: SKIPN IONSYM ;SKIP IF NOSYM SEEN
\r
1542 TRNN ER,LPTSW!TTYSW ;A LISTING REQUIRED?
\r
1544 MOVEI [ASCIZ /SYMBOL TABLE/]
\r
1545 HRRM SUBTTX ;SET NEW SUB-TITLE
\r
1546 PUSHJ PP,OUTFF ;FORCE NEW PAGE
\r
1547 PUSHJ PP,LOUT1 ;OUTPUT THEM
\r
1548 JRST SOUT1 ;NOW FOR BLOCK TYPE 2
\r
1550 LOUT1: PUSHJ PP,LLUKUP ;SET FOR TABLE SCAN
\r
1552 TRNN ARG,MACF!SYNF
\r
1553 TDZA MRP,MRP ;SKIP AND CLEAR MRP
\r
1554 POPJ PP, ;NO, TRY AGAIN
\r
1558 MOVNI MRP,1 ;MRP=-1 FOR EXTERNAL
\r
1559 TRNE ARG,SYNF ;SYNONYM?
\r
1560 JUMPL MRP,POPOUT ;YES, DON'T OUTPUT IF EXTERNAL
\r
1561 TRNE ARG,SUPRBT ;IF SUPRESSED
\r
1562 ; JUMPGE MRP,POPOUT ;DO NOT OUTPUT UNLESS EXTERNAL
\r
1563 POPJ PP, ;DO NOT OUTPUT
\r
1564 AOS (PP) ;SET FOR SKIP RETURN IF SYMBOL IS PRINTED
\r
1565 JUMPGE MRP,LOUT10 ;BRANCH IF NOT EXTERNAL
\r
1566 HLRZ RC,V ;PUT POINTER/FLAGS IN RC
\r
1567 TRNE RC,-2 ;POINTER?
\r
1568 MOVS RC,0(RC) ;YES
\r
1569 HLL V,RC ;STORE LEFT VALUE
\r
1571 LOUT10: PUSH PP,RC ;SAVE FOR LATER
\r
1572 PUSHJ PP,OUTSYM ;OUTPUT THE NAME
\r
1573 MOVE RC,(PP) ;GET COPY
\r
1575 JUMPLE MRP,LOUT15 ;SET DEFFERRED BITS IF EXTERNAL
\r
1576 TLNE RC,-2 ;CHECK FOR LEFT FIXUP
\r
1577 IORI AC1,40 ;AND SET BITS
\r
1578 TRNE RC,-2 ;CHECK FOR RIGHT FIXUP
\r
1579 IORI AC1,20 ;AND SET BITS
\r
1580 LOUT15: TLNE RC,-2 ;FIX RELOC AS 0 IF EXTERNAL
\r
1588 TRNE ARG,ENTF ;ENTRY DMN
\r
1590 TRNE ARG,NOOUTF ;SUPRESS OUTPUT? WFW
\r
1591 ADDI MRP,3 ;YES WFW
\r
1592 TRNE ARG,UNDF ;UNDEFINED IS EXTERNAL
\r
1593 HRRI MRP,2 ;SO FLAG AS UXT
\r
1594 IOR AC1,SOUTC(MRP)
\r
1596 MOVEM AC0,SVSYM ;SAVE IT
\r
1597 MOVE AC0,V ;GET THE VALUE
\r
1598 HLRZ RC,MRP ;AND THE RELOCATION
\r
1600 TRNE RC,2 ;LEFT HALF RELOCATABLE?
\r
1601 TRZA CS,1 ;NO, FLAG AND PRINT
\r
1602 TLNE CS,-1 ;IS THE LEFT HALF ZERO?
\r
1603 PUSHJ PP,ONC1 ;NO, OUTPUT IT
\r
1604 LOUT11: PUSHJ PP,OUTTAB
\r
1606 TDZ CS,RC ;SET RELOCATION
\r
1609 POP PP,RC ;GET BACK RELOC AND CHECK EXTERNAL
\r
1610 LOUT60: MOVEI CS,SOUTC(MRP)
\r
1611 PUSHJ PP,OUTAS0 ;EXT/INT
\r
1612 LOUT64: JRST OUTCR ;CARRIAGE RETURN AND TRY FOR ANOTHER
\r
1615 \f SYN IFBLK,SYMBLK ;SOMEWHERE TO STORE THE POINTERS
\r
1617 LLUKUP: POP PP,LOOKX ;INTERCEPT RETURN POP
\r
1620 ADDI SX,2 ;SKIP COUNT OF SYMBOLS
\r
1621 LLUKP2: MOVEM SX,SYMBLK ;STORE SYMBOL POINTER IN TABLE
\r
1623 JRST LLUKP7 ;ENTER LOOP
\r
1625 LLUKP1: MOVEM SX,SYMBLK ;SAVE IT
\r
1630 JRST [MOVEM SX,SYMBLK
\r
1632 LLUKP7: SOJL SDEL,POPOUT ;TEST FOR END
\r
1633 LLUKP3: MOVE SX,SYMBLK ;GET NEXT POINTER
\r
1638 LLUKP6: PUSHJ PP,LOUT64 ;RESET SYMCNT
\r
1639 JUMPE SDEL,POPOUT ;EXIT IF ALL DONE
\r
1645 \fSOUT1: PUSHJ PP,LOOKUP ;SET FOR TABLE SCAN
\r
1647 TRNN ARG,MACF!SYNF
\r
1648 TDZA MRP,MRP ;SKIP AND CLEAR MRP
\r
1649 POPJ PP, ;NO, TRY AGAIN
\r
1653 MOVNI MRP,1 ;MRP=-1 FOR EXTERNAL
\r
1654 TRNE ARG,SYNF ;SYNONYM?
\r
1655 JUMPL MRP,POPOUT ;YES, DON'T OUTPUT IF EXTERNAL
\r
1656 TRNE ARG,SUPRBT ;IF SUPRESSED
\r
1657 ; JUMPGE MRP,POPOUT ;DO NOT OUTPUT UNLESS EXTERNAL
\r
1658 POPJ PP, ;DO NOT OUTPUT
\r
1659 JUMPGE MRP,SOUT10 ;BRANCH IF NOT EXTERNAL
\r
1660 HLRZ RC,V ;PUT POINTER/FLAGS IN RC
\r
1661 TRNE RC,-2 ;POINTER?
\r
1662 MOVS RC,0(RC) ;YES
\r
1663 HLL V,RC ;STORE LEFT VALUE
\r
1665 SOUT10: PUSH PP,RC ;SAVE FOR LATER
\r
1667 JUMPLE MRP,SOUT15 ;SET DEFFERRED BITS IF EXTERNAL
\r
1668 TLNE RC,-2 ;CHECK FOR LEFT FIXUP
\r
1669 IORI AC1,40 ;AND SET BITS
\r
1670 TRNE RC,-2 ;CHECK FOR RIGHT FIXUP
\r
1671 IORI AC1,20 ;AND SET BITS
\r
1672 SOUT15: TLNE RC,-2 ;FIX RELOC AS 0 IF EXTERNAL
\r
1680 TRNE ARG,ENTF ;ENTRY DMN
\r
1682 TRNE ARG,NOOUTF ;SUPRESS OUTPUT? WFW
\r
1683 ADDI MRP,3 ;YES WFW
\r
1684 IOR AC1,SOUTC(MRP)
\r
1686 PUSHJ PP,NOUT2 ;SQUOZE AND DUMP THE SYMBOL
\r
1687 MOVEM AC0,SVSYM ;SAVE IT
\r
1688 MOVE AC0,V ;GET THE VALUE
\r
1689 HLRZ RC,MRP ;AND THE RELOCATION
\r
1691 POP PP,RC ;GET BACK RELOC AND CHECK EXTERNAL
\r
1692 TRNN RC,-2 ;IS IT?
\r
1694 MOVE AC0,1(RC) ;GET NAME
\r
1695 MOVEI ARG,60 ;EXTERNAL REQ
\r
1697 HLLZS RC ;NO RELOC
\r
1698 PUSHJ PP,COUT ;OUTPUT IT
\r
1699 MOVE AC0,SVSYM ;GET SYMBOL NAME
\r
1700 TLO AC0,500000 ;SET AS ADDITIVE SYMBOL
\r
1701 TLZ AC0,200000 ;BUT NOT LEFT HALF ETC
\r
1703 SOUT50: MOVSS RC ;CHECK LEFT HALF
\r
1716 SOUT20: PUSHJ PP,OUTAS0
\r
1719 <ASCII /ENT/>!04 ;DMN
\r
1722 <ASCII /SEN/>!44 ;SUPRESSED ENTRY
\r
1726 <ASCII /UXT/>!60 ;UNDEFINED EXTERNAL
\r
1728 <ASCII /SIN/>!44 ;DMN
\r
1729 \f ;OUTPUT THE BINARY
\r
1731 BOUT: HRLO CS,LOCO ;PICKUP THE LOCATION
\r
1732 PUSHJ PP,ONC ;OUTPUT IT TO THE LISTING FILE
\r
1734 SKIPE MODO ;IF MODE IS NOT ABSOLUTE
\r
1735 PUSHJ PP,OUTC ;PRINT A SINGLE QUOTE
\r
1736 PUSHJ PP,DSTOW ;GET THE CODE
\r
1737 PUSH PP,RC ;SAVE RELOC
\r
1738 PUSH PP,RC ;AND AGAIN
\r
1739 TLNE RC,-2 ;CHECK LEFT EXTERNAL
\r
1740 HRRZS RC ;MAKE LEFT NON-RELOC
\r
1741 TRNN RC,-2 ;RIGHT EXT?
\r
1744 JUMPE AC1,BOUT20 ;PROCESS IF ZERO CODE THERE
\r
1745 HLLZS RC ;MAKE NON-RELOC
\r
1746 JRST BOUT30 ;PROCESS
\r
1749 HRRM AC1,-1(PP) ;FIX RC IN STACK SO NO CONFUSION WFW (AC1 HAS 0)
\r
1750 HRR AC0,0(RC) ;NO, SET ADDRESS LINK
\r
1751 MOVE AC1,LOCO ;GET CURRENT LOCATION
\r
1752 HRRM AC1,0(RC) ;SET NEW LINK
\r
1753 HLRZ AC1,0(RC) ;GET FLAGS/POINTER
\r
1754 TRNN AC1,-2 ;POINTER?
\r
1755 HRR AC1,RC ;NO, SET TO FLAGS
\r
1756 HLR RC,0(AC1) ;PUT FLAGS IN RC
\r
1757 HRL AC1,MODO ;GET CURRENT MODE
\r
1758 TRZE RC,-2 ;LEFT HALF RELOCATABLE+
\r
1759 TLO AC1,2 ;YES, SET FLAG
\r
1760 HLLM AC1,0(AC1) ;STORE NEW FLAGS
\r
1761 BOUT30: HLLO CS,AC0
\r
1762 TLZE RC,1 ;PACK RELOCATION BITS
\r
1764 TRNE RC,2 ;LEFT HALF RELOCATABLE?
\r
1765 TRZ CS,1 ;YES, RESET BIT
\r
1766 PUSH PP,AC0 ;NEED AN AC
\r
1767 HLRZ AC0,-1(PP) ;AC0 = LEFT RELOCATION
\r
1768 CAILE AC0,1 ;EXTERNAL?
\r
1769 XORI CS,EXTF!1 ;YES, SET SWITCH
\r
1770 \f POP PP,AC0 ;RESTORE
\r
1773 TDZ CS,RC ;SET RELOCATION
\r
1774 HRRZ C,(PP) ;C = RIGHT RELOCATION
\r
1775 CAILE C,1 ;EXTERNAL
\r
1776 XORI CS,EXTF!1 ;YES, SET SWITCH
\r
1778 BOUT3I: POP PP,CS ;GET RID OF ENTRY ON STACK
\r
1780 TLNE FR,RIMSW!RIM1SW!R1BSW ;RIM OUTPUT?
\r
1781 JRST ROUT ;YES, GO PROCESS
\r
1784 CAME CS,MODLOC ;SEQUENCE OR RELOCATION BREAK?
\r
1785 PUSHJ PP,COUTD ;YES, DUMP THE BUFFER
\r
1786 SKIPL COUTX ;NEW BUFFER?
\r
1787 JRST BOUT40 ;NO, STORE CODE AND EXIT
\r
1788 MOVEM CS,MODLOC ;YES, STORE NEW VALUES
\r
1791 PUSHJ PP,COUT ;STORE BLOCK LOCATION AND MODE
\r
1792 EXCH RC,MODO ;RESTORE CURRENT VALUES
\r
1795 \fBOUT40: PUSHJ PP,COUT ;EMIT CODE
\r
1796 POP PP,RC ;RETRIEVE EXTERNAL BITS
\r
1797 TRNN RC,-2 ;RIGHT EXTERNAL?
\r
1798 JRST BOUT50 ;TRY FOR LEFT
\r
1800 PUSH PP,BLKTYP ;TERMINATE TYPE AND SAVE
\r
1801 MOVEI AC0,2 ;BLOCK TYPE 2
\r
1803 MOVE AC0,1(RC) ;GET SYMBOL
\r
1804 MOVEI ARG,60 ;CODE BITS
\r
1805 PUSHJ PP,SQOZE ;CONVERT TO RADIX 50
\r
1806 HLLZS RC ;SYMBOL HAS NO RELOCATION
\r
1807 PUSHJ PP,COUT ;EMIT
\r
1808 MOVE AC0,LOCO ;GET CURRENT LOC
\r
1809 HRLI AC0,400000 ;ADDITIVE REQ
\r
1810 HRR RC,MODO ;CURRENT MODE
\r
1811 PUSHJ PP,COUT ;EMIT
\r
1812 MOVSS RC ;NOW FOR LEFT
\r
1816 BOUT50: MOVSS RC ;CHECK OTHER HALF
\r
1817 TRNN RC,-2 ;LEFT HALF EXTERNAL?
\r
1818 JRST BOUT80 ;NO, FALSE ALARM
\r
1819 PUSHJ PP,COUTD ;CHANGE MODE
\r
1823 BOUT70: MOVE AC0,1(RC)
\r
1829 HRLI AC0,600000 ;LEFT HALF ADD
\r
1831 PUSHJ PP,COUT ;EMIT
\r
1832 BOUT60: PUSHJ PP,COUTD ;CHANGE MODE
\r
1833 POP PP,BLKTYP ;TO OLD ONE
\r
1838 \fNOUT: MOVE V,[POINT 7,TBUF] ;POINTER TO ASCII LINE
\r
1839 MOVSI CS,(POINT 6,AC0) ;POINTER TO SIXBIT AC0
\r
1841 NOUT1: ILDB C,V ;GET ASCII
\r
1845 TRZA C,100 ;LOWER CASE TO SIXBIT
\r
1846 SUBI C,40 ;CONVERT TO SIXBIT
\r
1847 JUMPLE C,NOUT3 ;TEST FORM NON-SIXBIT
\r
1848 CAILE C,77 ;AND NOT GREATER THAN SIXBIT
\r
1850 IDPB C,CS ;DEPOSIT IN AC0
\r
1851 TLNE CS,770000 ;TEST FOR SIX CHARACTERS
\r
1852 JRST NOUT1 ;NO, GET ANOTHER
\r
1854 IFN UNIVR,<SKIPGE UNIVSN ;IF A UNIVERSAL PROG>
\r
1855 POPJ PP, ;RETURN TO PUT IT IN THE TABLE
\r
1857 IFN CCLSW,< TLNN IO,IOTLSN ;AND IF WE HAVE NOT SEEN A TITLE
\r
1858 PUSHJ PP,PRNAM ;THEN PRINT THE NAME>
\r
1859 NOUT2: PUSHJ PP,SQOZE ;CONVERT TO SIXBIT
\r
1860 JRST COUT ;DUMP AND EXIT
\r
1863 MOVEI RC,1 ;RELOCATABLE
\r
1865 MOVE AC0,HHIGH ;GET HIGH SEG IF TWO SEGMENTS
\r
1866 JUMPE AC0,.+2 ;NOT TWO SEGMENTS
\r
1867 PUSHJ PP,COUT ;OUTPUT IT >
\r
1870 SKIPE HHIGH ;ANY TWOSEG HIGH STUFF
\r
1871 JRST COUT ;YES,SO NO ABS.>
\r
1872 PUSHJ PP,COUT ;OUTPUT THE HIGHEST LOCATION
\r
1874 ;PUT OUT ABS PORTION OF PROGRAM BREAK
\r
1875 SOJA RC,COUT ;OUTPUT A WORD OF ZERO AND EXIT
\r
1878 HSOUT: SETZM HISNSW ;CLEAR FOR PASS2
\r
1879 MOVE AC0,SVTYP3 ;GET HISEG ARG
\r
1880 JUMPGE AC0,.+4 ;JUMP IF ONLY HISEG
\r
1881 HRL AC0,HIGH1 ;GET BREAK FROM PASS 1
\r
1882 JUMPL AC0,.+2 ;OK IF GREATER THAN 400000
\r
1883 HRLS AC0 ;SIGNAL TWO SEGMENT TO LOADER
\r
1884 MOVEI RC,1 ;ASSUME RELOCATABLE
\r
1885 JRST COUT ;OUTPUT THE WORD>
\r
1887 VOUT: SKIPN RC,VECREL ;IS VECTOR ABSOLUTE ZERO?
\r
1888 SKIPE VECTOR ;ALSO CHECK RELOCATION
\r
1890 POPJ PP, ;YES, EXIT
\r
1891 MOVE AC0,VECTOR ;AC0 SHOULD BE FLAGS
\r
1893 COUT: AOS C,COUTX ;INCREMENT INDEX
\r
1894 MOVEM AC0,COUTDB(C) ;STORE CODE
\r
1895 IDPB RC,COUTP ;STORE RELOCATION BITS
\r
1896 CAIE C,^D17 ;IS THE BUFFER FULL?
\r
1897 POPJ PP, ;NO, EXIT
\r
1899 COUTD: AOSG C,COUTX ;DUMP THE BUFFER
\r
1900 JRST COUTI ;BUFFER WAS EMPTY
\r
1901 HRL C,BLKTYP ;SET BLOCK TYPE
\r
1902 PUSHJ PP,OUTBIN ;OUTPUT COUNT AND TYPE
\r
1903 SETOB C,COUTY ;INITIALIZE INDEX
\r
1905 COUTD2: MOVE C,COUTDB(C) ;GET RELOCATION BITS/CODE
\r
1906 PUSHJ PP,OUTBIN ;DUMP IT
\r
1907 AOS C,COUTY ;INCREMENT INDEX
\r
1908 CAMGE C,COUTX ;TEST FOR END
\r
1909 JRST COUTD2 ;NO, GET NEXT WORD
\r
1911 COUTI: SETOM COUTX ;INITIALIZE BUFFER INDEX
\r
1912 SETZM COUTRB ;ZERO RELOCATION BITS
\r
1913 MOVE C,[POINT 2,COUTRB]
\r
1914 MOVEM C,COUTP ;INITIALIZE BIT POINTER
\r
1919 JUMP1 STOW20 ;SKIP TEST IF PASS ONE
\r
1920 TRNE RC,-2 ;RIGHT HALF ZERO OR 1?
\r
1921 PUSHJ PP,STOWT ;NO, HANDLE EXTERNAL
\r
1922 TLNN RC,-2 ;LEFT HALF ZERO OR 1? WFW
\r
1923 JRST STOW10 ;YES, SKIP TEST
\r
1924 MOVSS RC ;SWAP HALVES
\r
1925 PUSHJ PP,STOWT1 ;HANDLE EXTERNAL WFW
\r
1926 MOVSS RC ;RESTORE VALUES
\r
1928 STOW10: SKIPE EXTPNT ;ANY EXTERNALS REMAINING?
\r
1929 TRO ER,ERRE ;YES, SET EXTERNAL ERROR FLAG
\r
1931 STOW20: AOS AC1,STPX ;INCREMENT POINTER
\r
1932 MOVEM AC0,STCODE(AC1) ;STOW CODE
\r
1933 MOVEM RC,STOWRC(AC1) ;STOW RELOCATION BITS
\r
1934 SKIPN LITLVL ;ARE WE IN LITERAL?
\r
1935 AOS LOCA ;NO, INCREMENT ASSEMBLY LOCATION
\r
1936 CAIGE AC1,.STP-1 ;OVERFLOW?
\r
1937 POPJ PP, ;NO, EXIT
\r
1939 SKIPE LITLVL ;ARE WE IN A LITERAL?
\r
1940 TROA ER,ERRL ;YES, FLAG ERROR BUT DON'T DUMP
\r
1941 JRST CHARL1 ;NO, SAVE REGISTERS AND DUMP THE BUFFER
\r
1942 JRST STOWI ;INITIALIZE BUFFER
\r
1944 DSTOW: AOS AC1,STPY ;INCREMENT POINTER
\r
1945 MOVE AC0,STCODE(AC1) ;FETCH CODE
\r
1946 MOVE RC,STOWRC(AC1) ;FETCH RELOCATION BITS
\r
1947 CAMGE AC1,STPX ;IS THIS THE END?
\r
1948 POPJ PP, ;NO, EXIT
\r
1950 STOWI: SETOM STPX ;INITIALIZE FOR INPUT
\r
1951 SETOM STPY ;INITIALIZE FOR OUTPUT
\r
1954 \fSVSTOW: AOS LITLVL ;NESTED LITERALS
\r
1955 PUSH PP,STPX ;MAKE ROOM FOR ANOTHER
\r
1961 GTSTOW: POP PP,STPY ;BACK UP A LEVEL
\r
1967 STOWT: HRRZ AC1,EXTPNT ;GET RIGHT POINTER
\r
1968 CAIE AC1,(RC) ;DOES IT MATCH
\r
1969 PUSHJ PP,QEXT ;EXTERNAL OR RELOCATION ERROR
\r
1974 STOWT1: HLRZ AC1,EXTPNT ;GET LEFT HALF
\r
1975 CAIE AC1,(RC) ;SEE ABOVE
\r
1979 \fONC: ILDB C,TABP ;ENTRY TO ADVANCE TAB POINTER
\r
1980 PUSHJ PP,OUTL ;OUTPUT A TAB
\r
1981 ;OUTPUT 6 OCT NUMBERS FROM CS LEFT
\r
1982 ONC1: MOVEI C,6 ;CONVERT TO ASCII
\r
1983 LSHC C,3 ;SHIFT IN OCTAL
\r
1984 PUSHJ PP,OUTL ;OUTPUT ASCII FROM C
\r
1985 TRNE CS,-1 ;ARE WE THROUGH?
\r
1986 JRST ONC1 ;NO, GET ANOTHER
\r
1987 MOVEI C,0 ;CLEAR C
\r
1988 TLNN CS,1 ;RELOCATABLE?
\r
1990 TLNN CS,EXTF ;OR EXTERNAL
\r
1992 ONC2: JUMPN C,OUTC ;OUTPUT IF EXTERN OR RELOCATABLE
\r
1998 PUSHJ PP,DNC ;RECURSE IF NON-ZERO
\r
2000 ADDI C,"0" ;FORM ASCII
\r
2001 JRST PRINT ;DUMP AND TEST FOR END
\r
2003 OUTAS0: HRLI CS,(POINT 7,,) ;ENTRY TO SET POINTER
\r
2004 OUTASC: ILDB C,CS ;GET NEXT BYTE
\r
2005 JUMPE C,POPOUT ;EXIT ON ZERO DELIMITER
\r
2009 OUTSIX: HRLI CS,(POINT 6,,) ;OUTPUT SIXBIT
\r
2010 ILDB C,CS ;GET SIXBIT
\r
2011 CAIN C,40 ;"@" DELIMITER?
\r
2012 POPJ PP, ;YES, EXIT
\r
2013 ADDI C,40 ;NO, FORM ASCII
\r
2014 PUSHJ PP,OUTL ;OUTPUT ASCII CHAR FROM C
\r
2017 OUTSYM: MOVE CS,AC0 ;PLACE NAME IN CS
\r
2018 OUTSY1: MOVEI C,0 ;CLEAR C
\r
2019 LSHC C,6 ;MOVE NEXT SIXBIT CHARACTER IN
\r
2020 JUMPE C,OUTTAB ;TEST FOR END
\r
2021 ADDI C,40 ;CONVERT TO ASCII
\r
2022 PUSHJ PP,OUTL ;OUTPUT
\r
2024 \fOUTSET: AOS SX,0(PP) ;GET RETURN LOCATION
\r
2025 MOVE SX,-1(SX) ;GET XWD CODE
\r
2026 HLRM SX,BLKTYP ;SET BLOCK TYPE
\r
2028 PUSHJ PP,0(SX) ;GO TO PRESCRIBED ROUTINE
\r
2029 JRST COUTD ;TERMINATE BLOCK AND EXIT
\r
2031 ;LOOKUP SCANS ALL THE SYMBOLS IN THE SYMBOL TABLE
\r
2033 LOOKUP: POP PP,LOOKX ;INTERCEPT RETURN POP
\r
2035 MOVE SDEL,0(SX) ;SET FOR TABLE SCAN
\r
2036 LOOKL: SOJL SDEL,POPOUT ;TEST FOR END
\r
2039 PUSHJ PP,SRCH7 ;LOAD REGISTERS
\r
2041 PUSHJ PP,@LOOKX ;RETURN TO CALLING ROUTINE
\r
2042 JRST LOOKL ;TRY AGAIN
\r
2043 \fEND0: PUSHJ PP,EVALCM ;GET A WORD
\r
2044 SKIPE EXTPNT ;ANY EXTERNALS?
\r
2045 TRO ER,ERRE ;YES, ERROR
\r
2046 SKIPN V,AC0 ;NON-ZERO?
\r
2047 JUMPE RC,.+2 ;OR RELOC?
\r
2048 PUSHJ PP,ASSIG7 ;YES, LIST THE VALUE
\r
2051 PUSHJ PP,VARA ;FILL OUT SELF-DEFINED VARIABLES
\r
2052 PUSHJ PP,STOUTS ;DUMP THE LINE
\r
2053 PUSH PP,IO ;SAVE FLAGS
\r
2054 TLO IO,IOPROG ;XLIST LITS
\r
2056 POP PP,IO ;GET FLAG BACK
\r
2060 TLNN IO,MFLSW ;SKIP IF ONLY PSEND
\r
2062 MOVE INDIR ;SET UP FIRST AS LAST
\r
2063 MOVEM LSTFIL ;PRINTED
\r
2066 TLNE IO,MFLSW ;IF PSEND
\r
2067 POPJ PP, ;BACK TO PSEND0
\r
2068 SKIPE PRGPTR ;HAVE ANY PRGEND'S BEEN SEEN
\r
2069 JRST PSEND3 ;YES,GO SET UP AGAIN
\r
2071 PASS20: SETZM CTLSAV
\r
2073 PUSHJ PP,EOUT ;OUTPUT THE ENTRIES
\r
2075 XWD 6,NOUT ;OUTPUT THE NAME (BLKTYP-6)
\r
2077 SKIPN HISNSW ;PUT OUT BLOCK TYPE 3?
\r
2080 XWD 3,HSOUT ;OUTPUT THE HISEG BLOCK
\r
2083 HRRM BLKTYP ;SET FOR TYPE 1 BLOCK
\r
2084 TLZ FR,P1 ;SET FOR PASS 2 AND TURN OFF FLAG
\r
2085 TLO IO,IOPALL ;PUT THESE BACK
\r
2086 TLZ IO,IOPROG!IOCREF!DEFCRS ;SO LISTINGS WILL BE THE WAY THEY SHOULD
\r
2090 MOVE CS,[XWD $ST-1-$CKSM,R1BLDR]
\r
2104 DATAI PTR,@$TBL1-$RD+1($A)
\r
2105 XCT $TBL1-$RD+1($A)
\r
2106 XCT $TBL2-$RD+1($A)
\r
2108 $TBL1: CAME $CKSM,$ADR
\r
2117 IF2,< PURGE $ST,$RD,$A,$TBL1,$TBL2,$ADR,$CKSM>
\r
2118 \fENDP2: PUSHJ PP,COUTD ;DUMP THE BUFFER
\r
2119 MOVE AC0,LOCO ;CHECK TO SEE IF LIT DIFFERED
\r
2120 SKIPN MODO ;AND USE SMALLER SINCE AT END
\r
2121 JRST [CAMN AC0,ABSHI
\r
2124 IFN RENTSW,<SKIPE HHIGH ;SKIP IF NOT TWO SEGMENTS
\r
2125 JRST [CAMN AC0,HHIGH
\r
2131 REPEAT 1,<TLNE IO,IOCREF ;CLOSE CREF IF NECESSARY>
\r
2132 REPEAT 0,<TLNE FR,CREFSW ;IF CREFFING
\r
2135 PUSH PP,DBUF+3 ;SO NO PAGE INFO
\r
2136 DPB SDEL,[POINT 7,DBUF+3,13]
\r
2137 IOR ER,OUTSW ;MAKE SURE OF OUTPUT
\r
2139 MOVEI C,20 ;CODE FOR TITLE
\r
2141 PUSH PP,IO ;SAVE THIS
\r
2142 TLZ IO,IOPAGE ;AND PREVENT PAGE DURING TITLE
\r
2147 POP PP,IO ;RESTORE THE IO WORD
\r
2148 POP PP,DBUF+3 > ;NEEDS FIX TO CREF
\r
2149 PUSHJ PP,CLSCR2 ;CLOSE IT UP
\r
2150 ENDP2Q: HRR ER,OUTSW ;SET OUTPUT SWITCH
\r
2153 PUSHJ PP,UOUT ;OUTPUT UNDEFINEDS
\r
2155 SKPINC C ;SEE IF WE CAN INPUT A CHAR.
\r
2156 JFCL ;BUT ONLY TO DEFEAT ^O
\r
2157 SKIPG C,ERRCNT ;GET ERROR COUNT AND CHECK FOR POSITIVE
\r
2158 JRST NOERW ;PRINT NO ERROR MESSAGE
\r
2159 IFN CCLSW,<ADDM C,JOBERR ;REMEMBER ERROR COUNT FOR EXECUTION DELETION>
\r
2162 CAIN C,1 ;1 IS A SPECIAL CASE
\r
2163 JRST ONERW ;PRINT MESSAGE
\r
2164 MOVEI C,"?" ;? FOR BATCH
\r
2165 PUSHJ PP,OUTL ;...
\r
2166 MOVE C,ERRCNT ;PRINT NUMBER OF ERRORS
\r
2168 SKIPA CS,[EXP ERRMS1] ;LOAD TO PRINT
\r
2169 ONERW: MOVEI CS,ERRMS2 ;ONE ERROR DETECTED
\r
2170 ONERW1: PUSHJ PP,OUTSIX ;PRINT
\r
2172 NOERW: MOVEI CS,ERRMS3
\r
2173 IFN CCLSW,<TLNE IO,CRPGSW!MFLSW ;IF RPG, DON'T PRINT MESSAGE>
\r
2174 IFE CCLSW,<TLNE IO,MFLSW ;NOR IF MULTI-FILE MODE>
\r
2175 TRZ ER,TTYSW ;NO TTY OUTPUT
\r
2176 IOR ER,OUTSW ;UNLESS NEEDED FOR LISTING
\r
2180 \fENDP2A: PUSHJ PP,OUTCR
\r
2181 TLNN IO,MFLSW ;IN A MULTI-PROG FILE?
\r
2183 SKIPE ERRCNT ;ANY ERROR?
\r
2184 PUSHJ PP,[MOVEI CS,[ASCIZ /PROGRAM /]
\r
2185 PUSHJ PP,OUTAS0 ;YES,SO PRINT MESSAGE
\r
2186 MOVEI CS,TBUF ;AND TITLE
\r
2187 PUSHJ PP,OUTAS0 ;FOR IDENTIFICATION
\r
2188 JRST OUTCR] ;AND A CR-LF
\r
2189 TRZA ER,TTYSW ;NO MORE OUTPUT NOW
\r
2191 IFN CCLSW,<TLNE IO,CRPGSW ;IF RPG, DON'T PRINT PGM BREAK
\r
2192 TRZ ER,TTYSW ;...>
\r
2193 IFE CCLSW,< SKIPA ;SO PRGEND CODE CAN WORK>
\r
2197 MOVEI CS,[SIXBIT /HI-SEG. BREAK IS @/]
\r
2198 SKIPN HHIGH ;DON'T PRINT IF ZERO
\r
2199 JRST ENDP2C ;IT WAS
\r
2201 HRLO CS,HHIGH ;GET THE BREAK
\r
2205 MOVEI CS,[SIXBIT /PROGRAM BREAK IS @/]
\r
2206 PUSHJ PP,OUTSIX ;OUTPUT PROGRAM BREAK
\r
2207 HRRZ CS,ABSHI ;GET ABS. BREAK
\r
2208 CAIG CS,140 ;ANY ABS. CODE
\r
2209 JRST [HRLO CS,HIGH ;NO
\r
2210 JRST ENDP2B] ;SO DON'T PRINT
\r
2211 HRLO CS,HIGH ;GET PROGRAM BREAK
\r
2214 MOVEI CS,[SIXBIT /ABSLUTE BREAK IS @/]
\r
2217 ENDP2B: PUSHJ PP,ONC1
\r
2219 TLNE FR,RIMSW!R1BSW ;RIM MODE?
\r
2220 PUSHJ PP,RIMFIN ;YES, FINISH IT
\r
2221 IFN CCLSW,<TLNN IO,CRPGSW!MFLSW ;IF NOT IN CCL MODE>
\r
2222 IFE CCLSW,<TLNN IO,MFLSW ;NOR IF IN MULTI-FILE MODE>
\r
2223 TRO ER,TTYSW ;PRINT SIZE
\r
2229 MOVEI CS,[SIXBIT /K CORE USED@/]
\r
2234 XWD 2,SOUT ;OUTPUT THE SYMBOLS (BLKTYP-2)
\r
2236 XWD 7,VOUT ;OUTPUT TRANSFER VECTOR (..-7)
\r
2238 XWD 5,HOUT ;OUTPUT HIGHEST RELOCATABLE (..-5)
\r
2240 TLNN IO,MFLSW ;IS IT PRGEND?
\r
2241 JRST FINIS ;ALAS, FINISHED
\r
2242 MOVEI CS,SBUF ;RESET SBUF POINTER
\r
2243 HRRM CS,SUBTTX ;TO SUBTTL
\r
2244 SETZM PASS2I ;CLEAR PASS2 VARIABLES
\r
2245 MOVE [XWD PASS2I,PASS2I+1]
\r
2246 BLT PASS2Z-1 ;BUT NOT ALL OF VARIABLES
\r
2247 JRST INZ ;RE-INITIALIZE FOR NEXT PROG
\r
2250 RIMFIN: TLNE FR,R1BSW
\r
2259 \fSUBTTL PASS INITIALIZE
\r
2273 RCPNTR: POINT 1,ARG,^L<RELF>-18 ;POINT 1,ARG,22
\r
2274 \fSUBTTL PSEUDO-OP HANDLERS
\r
2276 TAPE0: PUSHJ PP,STOUTS ;FINISH THIS LINE
\r
2277 JRST GOTEND ;AND IGNORE THE REST OF THIS FILE
\r
2279 RADIX0: PUSHJ PP,EVAL10 ;EVALUATE RADIX D10
\r
2280 CAIG AC0,^D10 ;IF GREATER THAN 10
\r
2281 CAIG AC0,1 ;OR LESS THAN 2,
\r
2282 ERRAX: TROA ER,ERRA ;FLAG ERROR AND SKIP
\r
2283 HRR RX,AC0 ;SET NEW RADIX
\r
2287 XALL0: TLZ IO,IOSALL ;TURN OFF MACRO SUPPRESS ALL
\r
2288 IOSET: JUMP1 POPOUT ;NOSYM (IONSYM), XALL (IOPALL), XLIST (IOPROG)
\r
2289 HLRZ SX,AC0 ;STORE FLAGS
\r
2290 PUSHJ PP,STOUTS ;POLISH OFF LINE
\r
2291 TLO IO,0(SX) ;NOW SUPRESS PRINTING
\r
2294 IORSET: TDZ IO,AC0 ;RESET FLAG IOPALL/IOPROG
\r
2295 TLNE AC0,IONCRF ;RESTORING CREFFING?
\r
2296 TLZ IO,DEFCRS ;YES, CLEAR ANY WAITING DEFINING OCCURENCES
\r
2299 BLOCK0: PUSHJ PP,HIGHQ
\r
2300 PUSHJ PP,EVALEX ;EVALUATE
\r
2301 TRZE RC,-1 ;EXTERNAL OR RELOCATABLE?
\r
2302 PUSHJ PP,QEXT ;YES, DETERMINE TYPE
\r
2303 ADDM AC0,LOCO ;UPDATE ASSEMBLY LOCATION
\r
2304 BLOCK1: EXCH AC0,LOCA ;SAVE START OF BLOCK
\r
2305 ADDM AC0,LOCA ;UPDATE OUTPUT LOCATION
\r
2306 BLOCK2: HRLOM AC0,LOCBLK
\r
2312 PRNTX0: TRO ER,TTYSW ;SET OUTPUT TO TTY
\r
2313 JUMP2 PRNTX2 ;PASS1?
\r
2314 TDOA ER,OUTSW ;YES,OUTPUT TO LSTDEV ALSO
\r
2315 PRNTX2: ANDCM ER,OUTSW ;NO,DON'T OUTPUT TO TTY IF IT IS LSTDEV
\r
2316 PUSHJ PP,BYPASS ;GET FIRST CHAR.
\r
2317 TLOA IO,IORPTC ;REPEAT IT AND SKIP
\r
2318 PRNTX4: PUSHJ PP,PRINT ;PRINT THE CHAR.
\r
2319 PUSHJ PP,CHARAC ;GET ASCII CHAR.
\r
2320 CAIG C,CR ;IF GREATER THAN CR
\r
2321 CAIG C,HT ;OR LESS THAN LF
\r
2322 JRST PRNTX4 ;THEN CONTINUE
\r
2323 PUSHJ PP,OUTCR ;OUTPUT A CRLF
\r
2324 TRZA ER,TTYSW!LPTSW ;TURN OF OUTPUT
\r
2325 CPOPJ1: AOS (PP) ;USEFUL TAG HAS TO GO SOMEWHERE
\r
2326 CPOPJ: POPJ PP, ;EXIT
\r
2328 REMAR0: PUSHJ PP,GETCHR ;GET A CHARACTER
\r
2332 \fLIT0: PUSHJ PP,BLOCK1
\r
2336 ;ON PASS ONE, WE JUST STEP THE LOCATION COUNTER AND CLEAR
\r
2346 LIT20: PUSH PP,LOCA
\r
2354 LIT20A: MOVE SX,LITAB
\r
2355 LIT21: SOSGE LITNUM
\r
2357 MOVE AC0,-2(SX) ;WFW
\r
2358 MOVE RC,-1(SX) ;WFW
\r
2359 MOVE SX,(SX) ;WFW POINTER TO THE NEXT LIT
\r
2360 PUSHJ PP,STOW20 ;STOW CODE
\r
2361 MOVEI C,12 ;SET LINE FEED
\r
2363 PUSHJ PP,OUTLIN ;OUTPUT THE LINE
\r
2365 \fLIT22: HRRZ AC2,LOCO
\r
2370 SUB AC2,LOCO ;COMPUTE LENGTH USED
\r
2371 CAMGE AC0,AC2 ;USE LARGER
\r
2374 LIT24: ADDM AC0,LOCA
\r
2378 LITI: SETZM LITCNT
\r
2384 GETTOP: HRRZ AC1,SX ;VARHD
\r
2391 SUBI SX,1 ;MAKE SX POINT TO LINK
\r
2392 SETZM 0(SX) ;CLEAR FORWARD LINK
\r
2393 HRRM SX,0(AC1) ;STORE ADDRESS IN LAST LINK
\r
2395 \fVAR0: PUSHJ PP,BLOCK1 ;PRINT LOCATION
\r
2399 VARA: MOVE SX,VARHDX
\r
2400 MOVE AC0,LOCA ;GET LOCATION FOR CHECK
\r
2401 JUMP1 VARB ;DO NOT CHECK START ON PASS 1
\r
2402 CAME AC0,-1(SX) ;CHECK START OF VAR AREA
\r
2403 TRO ER,ERRP ;AND GIVE ERROR
\r
2404 VARB: MOVEM AC0,-1(SX) ;SAVE START FOR PASS 2
\r
2412 PUSHJ PP,LOOKUP ;SET FOR TABLE SCAN
\r
2414 POPJ PP, ;NO, EXIT
\r
2415 TRZ ARG,UNDF ;TURN OFF FLAG NOW
\r
2416 MOVSI AC0,1 ;ADD 1
\r
2417 ADDM AC0,0(AC1) ;UPDATE COUNT
\r
2419 IOR ARG,MODA ;SET TO ASSEMBLY MODE
\r
2421 MOVSM ARG,0(SX) ;UPDATE 2ND WRD OF SYM TAB ENTRY
\r
2425 \fIF: PUSH PP,AC0 ;SAVE AC0
\r
2427 PUSHJ PP,EVALXQ ;EVALUATE AND TEST EXTERNAL
\r
2431 IFPOP: POP PP,AC1 ;RETRIEVE SKIP INSTRUCTION
\r
2432 IFSET: TLO IO,IORPTC ;REPEAT CHARACTER
\r
2433 IFXCT: XCT AC1 ;EXECUTE INSTRUCTION
\r
2434 TDZA AC0,AC0 ;FALSE
\r
2436 IFEXIT: JUMPOC REPEA1 ;BRANCH IF IN OP-CODE FIELD
\r
2437 IFEX1: PUSHJ PP,GETCHR ;SEARCH FOR "<"
\r
2438 CAIN C,EOL ;ERROR IF END OF LINE
\r
2442 JUMPE AC0,IFEX2 ;TEST FOR 0
\r
2443 TLO IO,IORPTC ;NO, PROCESS AS CELL
\r
2445 SETZM INCND ;NOT ANY MORE
\r
2446 JRST STOW ;STOW CODE AND EXIT
\r
2448 IFPASS: HRRI AC0,P1 ;MAKE IT TLNX IO,P1
\r
2449 MOVE AC1,AC0 ;PLACE IT IN AC1
\r
2450 JRST IFSET ;EXECUTE INSTRUCTION
\r
2452 IFB0: HLLO AC1,AC0 ;FORM AND STORE TEST INSTRUCTION
\r
2453 IFB1: PUSHJ PP,CHARL ;GET FIRST NON-BLANK
\r
2456 JRST IFB1 ;SKIP BLANKS AND TABS
\r
2457 CAIG C,CR ;CHECK FOR CARRET AS DELIM.
\r
2464 SETOM INCND ;SAVE INFO. FOR PASS 1 ERRORS
\r
2465 CAIN C,"<" ;LEFT BRACKET?
\r
2466 SETZB C,RC ;YES, PREPARE FOR OLD FORMAT
\r
2467 SKIPA SX,C ;SAVE FOR COMPARISON
\r
2468 IFB3: TRO AC0,1 ;SET FLAG
\r
2469 IFB2: PUSHJ PP,CHARL ;GET ASCII CHARACTER AND LIST
\r
2470 CAMN C,SX ;TEST FOR DELIMITER
\r
2472 CAIE C," " ;BLANK?
\r
2473 CAIN C," " ;OR TAB?
\r
2475 JUMPN SX,IFB3 ;JUMP IF NEW FORMAT
\r
2477 AOJA RC,IFB2 ;YES, INCREMENT COUNT
\r
2479 SOJL RC,IFXCT ;YES, DECREMENT AND EXIT IF DONE
\r
2480 JRST IFB3 ;GET NEXT CHARACTER
\r
2482 \fIFDEF0: HRRI AC0,UNDF ;MAKE IT TLNX ARG,UNDF
\r
2483 PUSH PP,AC0 ;STACK IT
\r
2484 PUSHJ PP,GETSYM ;TAKES SKIP RETURN IF SYM NAME IS LEGAL
\r
2485 TROA ER,ERRA ;ILLEGAL!
\r
2487 JRST [PUSHJ PP,OPTSCH
\r
2490 PUSHJ PP,SSRCH3 ;EMIT TO CREF ANYWAY
\r
2491 JRST IFPOP ;POP AND EXECUTE INSTRUCTION
\r
2493 \fIFIDN0: HLRZS AC0
\r
2494 MOVEI V,2*.IFBLK-1
\r
2495 SETZM IFBLK(V) ;CLEAR COMPARISON BLOCK
\r
2497 SETZM .TEMP ;CLEAR STORED DELIMETER
\r
2498 MOVEI RC,IFBLK ;SET FOR FIRST BLOCK
\r
2499 PUSHJ PP,IFCL ;GET FIRST STRING
\r
2501 PUSHJ PP,IFCL ;GET SECOND STRING
\r
2503 MOVE SX,IFBLK(V) ;GET WORD FROM FIRST STRING
\r
2504 CAMN SX,IFBLKA(V) ;COMPARE WITH SECOND STRING
\r
2505 SOJGE V,.-2 ;EQUAL, TRY NEXT WORD
\r
2506 JUMPL V,IFEXIT ;DID WE FINISH STRING
\r
2507 XORI AC0,1 ;NO, TOGGLE REQUEST
\r
2508 JRST IFEXIT ;DO NOT TURN ON IORPTC WFW
\r
2510 IFCL: PUSHJ PP,CHARAC ;GET AND LIST CHARACTER
\r
2511 CAIE C," " ;SKIP SPACES
\r
2512 CAIG C,CR ;ALSO SKIP CR-LF
\r
2513 CAIGE C,HT ;AND TAB
\r
2514 JRST .+2 ;NOT ONE OF THEM
\r
2515 JRST IFCL ;SO LONG COMPARISONS WILL WORK
\r
2516 ;*** A CROCK SO THAT IFIDN <X>,<X>,<INST.> WILL WORK ***
\r
2517 CAIE C,"," ;IS IT A COMMA?
\r
2519 SKIPN .TEMP ;YES, WAS PREVIOUS FIELD OLD METHOD?
\r
2520 JRST IFCL ;YES, IGNORE COMMA AND SPACES
\r
2522 CAIN C,"<" ;WAS IT LEFT BRACKET?
\r
2523 SETO C, ;SIGNAL OLD METHOD, LOOK FOR RIGHT BRACKET
\r
2524 MOVEM C,.TEMP ;STORE TERMINATOR FOR COMPARISON
\r
2525 MOVEI SX,5*.IFBLK-1 ;LIMIT SEARCH
\r
2526 HRLI RC,(POINT 7,,) ;SET UP BYTE IN RC
\r
2527 IFCLR: PUSHJ PP,CHARAC
\r
2528 SKIPLE .TEMP ;NEW METHOD?
\r
2529 JRST IFCLR1 ;YES, IGNORE ANGLE BRACKET COUNTING
\r
2530 CAIN C,"<" ;ANOTHER LEFT ANGLE?
\r
2531 SOS .TEMP ;YES, KEEP COUNT
\r
2532 CAIN C,">" ;CLOSING ANGLE
\r
2533 AOSGE .TEMP ;MATCHING COUNT?
\r
2534 IFCLR1: CAMN C,.TEMP ;TEST FOR DELIMITER
\r
2535 POPJ PP, ;EXIT ON RIGHT DELIMITER
\r
2536 SOJG SX,.+2 ;ANY ROOM IN COMPARISON BLOCK?
\r
2537 TROA ER,ERRA ;NO, FLAG ERROR BUT KEEP ON GOING
\r
2538 IDPB C,RC ;DEPOSIT BYTE
\r
2542 IFEX2: PUSHJ PP,GETCHR
\r
2543 CAIN C,EOL ;EXIT WITH ERROR IF END OF LINE
\r
2546 AOJA AC0,IFEX2 ;YES, INCREMENT COUNT
\r
2548 JRST IFEX2 ;NO, TRY AGAIN
\r
2549 SOJGE AC0,IFEX2 ;YES, TEST FOR MATCH
\r
2550 PUSHJ PP,BYPASS ;YES, MOVE TO NEXT DELIMITER
\r
2551 SETZM INCND ;OUT OF CONDITIONAL NOW
\r
2552 AOJA AC0,STOWZ1 ;STOW ZERO
\r
2555 INTER0: HLLZM AC0,INTENT ;AC0 CONTAINS INTF/ENTF FLAGS
\r
2557 INTER1: PUSHJ PP,GETSYM ;GET A SYMBOL
\r
2558 JRST INTER3 ;INVALID, SKIP
\r
2559 PUSHJ PP,SSRCH ;SEARCH THE TABLE
\r
2560 MOVSI ARG,SYMF!INTF!UNDF
\r
2561 TLNE ARG,UNDF ;UNDEFINED?
\r
2562 TRO ER,ERRA ;YES, FLAG ERROR
\r
2563 TLNN ARG,SYNF!EXTF
\r
2564 TDOA ARG,INTENT ;SET APPROPRIATE FLAGS
\r
2565 INTER3: TROA ER,ERRA ;FLAG ARG EROR AND SKIP
\r
2566 PUSHJ PP,INSERQ ;INSERT/UPDATE
\r
2568 SETZM EXTPNT ;JUST IN CASE, SO AS NOT TO CONFUSE WORLD
\r
2569 POPJ PP, ;NO, EXIT
\r
2570 \fEXTER0: PUSHJ PP,GETSYM ;GET A SYMBOL
\r
2571 JRST EXTER4 ;INVALID, ERROR
\r
2572 EXTER1: TLO IO,DEFCRS ;FLAG THIS AS A DEFINITION
\r
2573 PUSHJ PP,SSRCH ;OK, SEARCH SYMBOL TABLE
\r
2574 JRST EXTER2 ;NOT THERE, INSERT IT
\r
2575 TLNN ARG,EXTF!VARF!UNDF
\r
2576 TROA ER,ERRE ;FLAG ERROR AND BYPASS
\r
2577 TLNE ARG,EXTF ;VALID, ALREADY DEFINED?
\r
2578 JRST [JUMP1 EXTER3 ;YES, BYPASS
\r
2579 TLZN ARG,UNDF ;SKIP IF UNDEFINED ALSO
\r
2580 JRST EXTER3 ;CONTINUE
\r
2581 ANDM ARG,(SX) ;CLEAR UNDF ON PASS 2
\r
2582 JRST EXTER2] ;SET UP EXTERNAL NOW
\r
2583 EXTER2: MOVEI V,2 ;NO, GET 2 CELLS FROM THE TREE
\r
2585 CAML V,SYMBOL ;HAVE WE RUN OUT OF CORE?
\r
2586 PUSHJ PP,XCEEDS ;YES, TRY TO BORROW SOME MORE
\r
2587 SUBI V,2 ;GET RIGHT CELL FOR POINTER
\r
2588 SETZB RC,0(V) ;ALL SET, ZERO VALUES
\r
2589 MOVSI ARG,SYMF!EXTF
\r
2590 PUSHJ PP,INSERT ;INSERT/UPDATE IT
\r
2593 SKIPA ARG,-1(SX) ;GET THE SIXBIT FOR THE NAME
\r
2594 EXTER4: TROA ER,ERRA ;FLAG AS ERROR
\r
2595 MOVEM ARG,1(V) ;AND STORE THAT IN CASE SYMBOL TABLE MOVES
\r
2596 EXTER3: JUMPCM EXTER0
\r
2597 POPJ PP, ;NO, EXIT
\r
2598 \fEVAL10: PUSH PP,RX
\r
2600 PUSHJ PP,EVALEX ;EVALUATE
\r
2601 POP PP,RX ;RESET RADIX
\r
2602 JUMPE RC,POPOUT ;EXIT IF ABSOLUTE
\r
2604 QEXT: SKIPE EXTPNT ;ANY POSSIBILITIES?
\r
2605 TROA ER,ERRE ;YES, FLAG EXTERNAL ERROR
\r
2606 TRO ER,ERRR ;NO, FLAG RELOCATION ERROR
\r
2607 HLLZS RC ;CLEAR RELOCATION/EXTERNAL
\r
2610 EVALXQ: PUSHJ PP,EVALEX ;EVALUATE EXPRESSION
\r
2611 TLZN RC,-2 ;LEFT HALF EXTERNAL
\r
2612 TRZE RC,-2 ;WAS AN EXTERNAL FOUND?
\r
2613 TRO ER,ERRE ;YES, FLAG ERROR
\r
2615 \fOPDEF0: PUSHJ PP,GETSYM ;GET THE FIRST SYMBOL
\r
2616 POPJ PP, ;ERROR IF INVALID SYMBOL
\r
2618 JRST ERRAX ;NO, ERROR
\r
2619 PUSH PP,AC0 ;STACK MNEMONIC
\r
2620 AOS LITLVL ;SHORT OUT LOCATION INCREMENT
\r
2621 PUSHJ PP,STMNT ;EVALUATE STATEMENT
\r
2622 SKIPGE STPX ;CODE STORED?
\r
2623 TROA ER,ERRA ;NO,"A" ERROR
\r
2624 PUSHJ PP,DSTOW ;GET AND DECODE VALUE
\r
2626 EXCH AC0,0(PP) ;EXCHANGE VALUE FOR MNEMONIC
\r
2627 PUSH PP,RC ;STACK RELOCATION
\r
2628 TLO IO,DEFCRS ;SAY WE ARE DEFINING IT
\r
2629 PUSHJ PP,MSRCH ;SEARCH SYMBOL TABLE
\r
2630 MOVSI ARG,OPDF ;NOT FOUND
\r
2631 POP PP,RC ;RESTORE VALUES
\r
2633 TLNE ARG,SYNF!MACF
\r
2634 TRO ER,ERRA ;YES "A" ERROR
\r
2635 TRNN ER,ERRA ;ERROR?
\r
2636 PUSHJ PP,INSERT ;NO, INSERT/UPDATE
\r
2637 TLZ IO,DEFCRS ;JUST IN CASE
\r
2639 JRST STOWI ;BE SURE STOW IS RESET
\r
2642 DEPHA0: MOVE AC0,LOCO
\r
2643 SKIPA RC,MODO ;SET TO OUTPUT VALUES AND SKIP
\r
2644 PHASE0: PUSHJ PP,EVALXQ ;EVALUATE AND CHECK FOR EXTERNAL
\r
2645 MOVEM AC0,LOCA ;SET ASSEMBLY LOCATION COUNTER
\r
2648 \fASSIGN: JUMPAD ERRAX ;NO, ERROR
\r
2650 TLNE IO,IOSALL ;SUPPRESS ALL?
\r
2651 JUMPN MRP,CPOPJ ;IF IN MACRO
\r
2652 ASSIG7: MOVEM RC,ASGBLK
\r
2653 TRNE RC,-2 ;EXTERNAL
\r
2654 HLLZS ASGBLK ;YES,CLEAR RELOCATION
\r
2655 TLNE RC,1 ;LEFT HALF NOT RELOC?
\r
2657 HRROS ASGBLK ;YES, SET FLAG
\r
2661 ASSIG1: PUSH PP,AC0 ;SAVE SYMBOL
\r
2662 SETZB AC0,EXTPNT ;SPECIAL CHECK FOR == WFW
\r
2663 PUSHJ PP,PEEK ;IS THE NEXT ON =
\r
2666 TLO AC0,NOOUTF ;YES, NOT OUT TO DDT WFW
\r
2667 PUSHJ PP,GETCHR ;PROCESS THE CHAR.
\r
2668 PUSHJ PP,PEEK ;CHECK FOR ==: DMN
\r
2669 ASSIG5: CAIE C,":" ;IS IT
\r
2671 TLO AC0,INTF ;MAKE INTERNAL
\r
2672 PUSHJ PP,GETCHR ;REPEAT IT
\r
2673 ASSIG6: MOVEM AC0,HDAS ;STORE THESE BITS WFW
\r
2674 PUSHJ PP,EVALCM ;EVALUATE EXPRESSION
\r
2675 EXCH AC0,0(PP) ;SWAP VALUE FOR SYMBOL
\r
2677 TRNN RC,-2 ;CHECK EXTERNAL AGREEMENT
\r
2682 PUSHJ PP,QEXT ;EXTERNAL OR RELOCATION ERROR
\r
2683 ASSIG2: HLRZ RC,(PP)
\r
2689 ASSIG3: TLO IO,DEFCRS
\r
2693 TLNE ARG,UNDF ;WAS IT UNDEFINED
\r
2694 TLZ ARG,EXTF!PNTF ;YES,CLEAR EXTF NOW
\r
2695 TLZ ARG,UNDF!VARF ;CANCEL UNDEFINED AND VARIABLE FLAGS
\r
2696 SETZM EXTPNT ;FOR REST OF WORLD
\r
2698 TRNE ER,ERRORS-ERRQ
\r
2699 SETZ RC, ;CLEAR RELOCATION
\r
2701 TRNE ER,ERRU ;WAS VALUE UNDEFINED?
\r
2702 TLO ARG,UNDF ;YES,SO TURN UNDF ON
\r
2703 TLNE ARG,TAGF!EXTF
\r
2707 \fLOC0: PUSHJ PP,HIGHQ ;AC0=0,0
\r
2708 PUSH PP,AC0 ;SAVE MODE REQUESTED
\r
2709 HLRZS AC0 ;PUT MODE IN RIGHT HALF
\r
2710 JUMPN AC0,RELOC0 ;RELOC PSEUDO-OP
\r
2711 CAMN AC0,MODO ;SAME AS PRESENT MODE?
\r
2712 JRST [HRRZ AC0,LOCO ;YES
\r
2713 EXCH AC0,ABSLOC ;EXCH VALUES
\r
2715 HRRZ AC0,LOCO ;NO, GET CURRENT VALUE
\r
2716 MOVEM AC0,RELLOC ;SAVE IT
\r
2717 MOVE AC0,ABSLOC ;GET LAST RELOC VALUE
\r
2718 LOC01: PUSHJ PP,BYPASS ;SKIP BLANKS
\r
2720 CAIE C,EOL ;USE PREVIOUS VALUE IF NULL ARGUMENT
\r
2721 PUSHJ PP,EVALXQ ;GET EXPRESSION AND TEST EXTERNAL
\r
2722 HRRM AC0,(PP) ;STORE NEW VALUE
\r
2723 POP PP,AC0 ;RETRIEVE STORED MODE AND VALUE
\r
2724 LOC10: HRRZM AC0,LOCA ;SET ASSEMBLY LOCATION
\r
2725 HRRZM AC0,LOCO ;AND OUTPUT LOCATION
\r
2726 HLRZM AC0,MODA ;SET MODE
\r
2730 RELOC0: CAMN AC0,MODO
\r
2731 JRST [HRRZ AC0,LOCO
\r
2740 HISEG1: PUSHJ PP,HIGHQ ;SET CURRENT PROGRAM BREAK
\r
2741 PUSHJ PP,COUTD ;DUMP CURRENT TYPE OF BLOCK
\r
2742 SKIPN HISNSW ;IF WE HAVE SEEN IT BEFORE
\r
2743 SKIPE HIGH ;OR ANY RELOC CODE PUT OUT
\r
2744 TRO ER,ERRQ ;FLAG AS AN ERROR
\r
2745 PUSHJ PP,BYPASS ;GO GET EXPRESSION
\r
2747 PUSHJ PP,EVALXQ ;CHECK FOR EXTERNAL
\r
2748 ANDCMI AC0,1777 ;ONLY ALLOWED TO START ON NEW K BOUND
\r
2749 HRRZM AC0,LOCA ;SET LOC COUNTERS
\r
2751 MOVEI RC,1 ;ASSUME RELOCATABLE
\r
2754 TWSEG0: PUSHJ PP,HISEG1 ;COMMON CODE
\r
2755 JUMPN AC0,.+2 ;ARGUMENT SEEN
\r
2756 MOVEI AC0,400000 ;ASSUME 400000
\r
2757 HRRZM AC0,HMIN ;SET OFSET OF HIGH SEG.
\r
2758 HRRZM AC0,HHIGH ;INCASE NO HISEG CODE
\r
2759 TLOA AC0,(1B0) ;SIGNAL TWO SEGMENTS AND SKIP
\r
2761 HISEG0: PUSHJ PP,HISEG1 ;COMMON CODE
\r
2762 HISEG2: MOVEM AC0,SVTYP3 ;SAVE THE HISEG ARG
\r
2763 MOVEM RC,MODA ;SET MODES
\r
2765 SETOM HISNSW ;WE HAVE ALREADY PUT ONE OUT
\r
2766 JRST BLOCK2 ;MAKE LISTING HAPPEN RIGHT>
\r
2775 HIGHQ1: MOVE V,LOCO ;GET ASSEMBLY LOCATION
\r
2776 SKIPN MODO ;IF ASSEMBLY MODE IS ABSOLUTE
\r
2777 JRST [CAMLE V,ABSHI ;RECORED ABS HIGHEST ALSO
\r
2780 IFN RENTSW,<SKIPE HMIN ;IS IT A TWO SEGMENT PROGRAM?
\r
2781 JRST [CAMGE V,HMIN ;YES,IS THIS HIGH SEG.?
\r
2782 JRST .+1 ;NO,STORE LOW SEGMENT
\r
2783 CAMLE V,HHIGH ;YES,IS IT GREATER THAN "HHIGH"?
\r
2784 MOVEM V,HHIGH ;YES,REPLACE WITH LARGER VALUE
\r
2786 CAMLE V,HIGH ;IS IT GREATER THAN "HIGH"?
\r
2787 MOVEM V,HIGH ;YES, REPLACE WITH LARGER VALUE
\r
2790 ONML: TLZA FR,MWLFLG ;MULTI-WORD LITERALS OK
\r
2791 OFFML: TLO FR,MWLFLG ;NO
\r
2794 OFFSYM: SETOM IONSYM ;SUPRESS SYMBOL TABLE LISTING
\r
2797 SUPRE0: PUSHJ PP,GETSYM ;GET A SYMBOL TO SUPRES
\r
2798 JRST SUPRE1 ;ERROR
\r
2799 PUSHJ PP,SSRCH ;SYMBOL ONLY
\r
2800 JRST SUPRE1 ;GIVE ERROR MESSAGE
\r
2801 TLOA ARG,SUPRBT ;SET THE SUPRESS BIT
\r
2802 SUPRE1: TROA ER,ERRA
\r
2803 IORM ARG,(SX) ;PUT BACK
\r
2804 JUMPCM SUPRE0 ;ANY MORE?
\r
2807 SUPRSA: PUSHJ PP,LOOKUP ;SUPRESS ALL
\r
2810 SUPRS1: SETZM EXTPNT ;JUST IN CASE WE LOOKED ONE UP
\r
2813 XPUNG0: JUMP1 POPOUT
\r
2815 MOVE ARG,(SX) ;GET SYMBOL FLAGS
\r
2816 TLNN ARG,INTF!ENTF!EXTF!SPTR
\r
2817 TLOA ARG,SUPRBT ;LOCAL SYMBOL,SO SUPPRESS IT
\r
2819 MOVEM ARG,(SX) ;RESTORE FLAGS
\r
2821 \fTITLE0: JUMP2 REMAR0
\r
2824 PUSHJ PP,SUBTT1 ;GO READ IT
\r
2825 MOVEM SX,TCNT ;SAVE COUNT OF CHARS. WRITTEN
\r
2826 IFN UNIVR,<SKIPE UNIVSN ;WAS IT A UNIVERSAL?
\r
2827 PUSHJ PP,ADDUNV ;YES ADD TO TABLE>
\r
2828 TLOE IO,IOTLSN ;HAVE WE SEEN ONE
\r
2829 IFE CCLSW,<TRO ER,ERRM ;YES, COMPLAIN>
\r
2830 IFN CCLSW,<TROA ER,ERRM ;YES, MESSAGE
\r
2831 JRST PRNAM ;PRINT NAME IF FIRST ONE>
\r
2832 POPJ PP, ;EXIT OTHERWISE
\r
2834 SUBTT0: SKIPE SBUF ;STORE FIRST SUBTTL ON PASS1
\r
2835 JUMP1 REMAR0 ;OTHERWISE EXIT IF PASS ONE
\r
2839 SUBTT1: PUSHJ PP,BYPASS ;BYPASS LEADING BLANKS
\r
2841 SUBTT3: PUSHJ PP,CHARAC ;GET ASCII CHARACTER
\r
2842 IDPB C,AC0 ;STORE IN BLOCK
\r
2843 CAIGE C,40 ;TEST FOR TERMINATOR
\r
2845 SOJG SX,SUBTT3 ;TEST FOR BUFFER FULL
\r
2846 DPB RC,AC0 ;END, STORE TERMINATOR
\r
2847 SOJA SX,CPOPJ ;COUNT NUL AND EXIT
\r
2850 PRNAM: TLNN IO,CRPGSW ;NOT IF NOT RPG
\r
2852 PUSH PP,AC0 ;SAVE AC0 DMN
\r
2853 PUSH PP,RC ;AND RC
\r
2854 MOVE AC0,[POINT 7,TBUF]
\r
2855 MOVE SX,[POINT 7,OTBUF]
\r
2856 MOVEI RC,6 ;MAX OF SIX CHRS
\r
2858 CAILE C," " ;CHECK FOR LEGAL
\r
2859 CAILE C,"Z"+40 ;CHECK AGAINST LOWER CASE Z
\r
2861 IDPB C,SX ;PUT IN OUTPUT BUFFER
\r
2862 SOJG RC,PN1 ;GET MORE
\r
2864 IDPB C,SX ;TERMINATOR
\r
2869 POP PP,AC0 ;RESTORE AC0 DMN
\r
2872 \fSYN0: PUSHJ PP,GETSYM ;GET THE FIRST SYMBOL
\r
2873 JRST ERRAX ;ERROR, EXIT
\r
2874 PUSHJ PP,MSRCH ;TRY FOR MACRO/OPDEF
\r
2875 JRST SYN3 ;NO,0THRY FOR OPERAND
\r
2876 SYN1: MOVEI SX,MSRCH ;YES, SET FLAG
\r
2877 SYN2: PUSHJ PP,SAVEXS ;SAVE REGISTERS
\r
2878 JUMPNC ERRAX ;ERROR IF NO COMMA
\r
2879 PUSHJ PP,GETSYM ;GET THE SECOND SYMBOL
\r
2881 PUSHJ PP,@SAVBLK+SX ;SEARCH FOR SECOND SYMBOL
\r
2883 MOVE ARG,SAVBLK+ARG ;GET VALUES
\r
2886 TLNE ARG,MACF ;MACRO?
\r
2887 PUSHJ PP,REFINC ;YES, INCREMENT REFERENCE
\r
2888 JRST INSERT ;INSERT AND EXIT
\r
2890 SYN3: PUSHJ PP,SSRCH ;SEARCH FOR OPERAND
\r
2891 JRST SYN4 ;NOT FOUND, TRY OP CODE
\r
2892 TLO ARG,SYNF ;FLAG AS SYNONYM
\r
2893 TLNE ARG,EXTF ;EXTERNAL?
\r
2894 HRRZ V,ARG ;YES, RELPACE WITH POINTER
\r
2895 MOVEI SX,SSRCH ;SET FLAG
\r
2896 TLNN ARG,VARF ;DO NOT LET HIM SYN A VARIABLE
\r
2900 SYN4: PUSHJ PP,OPTSCH ;SEARCH FOR OP-CODE
\r
2901 JRST ERRAX ;NOT FOUND, EXIT WITH ERROR
\r
2902 MOVSI ARG,SYNF ;FLAG AS SYNONYM
\r
2904 \fPURGE0: PUSHJ PP,GETSYM ;GET A MNEMONIC
\r
2905 JRST [TRZ ER,ERRA ;CLEAR ERROR
\r
2906 POPJ PP,] ;AND RETURN
\r
2907 PUSHJ PP,MSRCH ;SEARCH MACRO SYMBOL TABLE
\r
2908 JRST PURGE2 ;NOT FOUND, TRY SYMBOLS
\r
2909 PUSH PP,CS ;SAVE CS AS IT MAY GET GARBAGED
\r
2910 TLNE ARG,MACF ;MACRO?
\r
2911 PUSHJ PP,REFDEC ;YES, DECREMENT THE REFERENCE
\r
2913 JRST PURGE4 ;REMOVE SYMBOL FROM TABLE
\r
2915 PURGE2: PUSHJ PP,SSRCH ;TRY OPERAND SYMBOL TABLE
\r
2916 JRST PURGE5 ;NOT FOUND GET NEXT SYMBOL
\r
2917 TRNN RC,-2 ;CHECK COMPLEX EXTERNAL
\r
2922 TLNE ARG,EXTF!UNDF ;ERROR IF EXTERNAL OR UNDEFINED
\r
2923 TLNE ARG,SYNF ;BUT NOT A SYNONYM
\r
2925 PURGE3: TROA ER,ERRA ;NOT FOUND, ERROR
\r
2926 PURGE4: PUSHJ PP,REMOVE ;REMOVE FROM THE SYMBOL TABLE
\r
2927 PURGE5: JUMPCM PURGE0
\r
2929 \fOPD1: TLNE ARG,UNDF ;IF OPDEF IS UNDEFINED
\r
2930 TRO ER,ERRO ;GIVE "O" ERROR
\r
2931 OPD: MOVE AC0,V ;PUT VALUE IN AC0
\r
2933 IOP: MOVSI AC2,(POINT 9,0(PP),11)
\r
2934 TLOA IO,IOIOPF ;SET "IOP SEEN" AND SKIP
\r
2935 OP: MOVSI AC2,(POINT 4,0(PP),12)
\r
2937 PUSH PP,AC0 ;STACK CODE
\r
2939 PUSHJ PP,EVALEX ;EVALUATE FIRST EXPRESSION
\r
2942 OP1B: PUSHJ PP,GETCHR ;GET A CHARACTER
\r
2943 JUMPCM 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 SKIPE (PP) ;CAME FROM EVALCM?
\r
2956 JRST STOW ;NO,STOW CODE AND EXIT
\r
2957 POP PP,AC1 ;YES,EXIT IMMEDIATELY
\r
2960 \fEVADR: ;EVALUATE STANDARD ADDRESS
\r
2961 IFE IIISW,<TLNN AC0,-1 ;OK IF ALL 0'S
\r
2963 TLC AC0,-1 ;CHANGE ALL ONES TO ZEROS
\r
2964 TLCE AC0,-1 ;OK IF ALL 1'S
\r
2965 TRO ER,ERRQ ;NO,FLAG Q ERROR>
\r
2966 ADD AC0,-1(PP) ;ADD ADDRESS PORTIONS
\r
2967 HLL AC0,-1(PP) ;GET LEFT HALF
\r
2968 TLZE FR,INDSW ;INDIRECT BIT?
\r
2969 TLO AC0,(Z @) ;YES, PUT IT IN
\r
2970 MOVEM AC0,-1(PP) ;RE-STACK CODE
\r
2971 ADD RC,-2(PP) ;UPDATE RELOCATION
\r
2972 HRRM RC,-2(PP) ;USE HALF WORD ADD
\r
2974 POPJ PP, ;NO, EXIT
\r
2977 PUSHJ PP,EVALCM ;EVALUATE
\r
2979 MOVSS V,AC0 ;SWAP HALVES
\r
2980 IFE IIISW,<MOVSS SX,RC
\r
2981 IOR SX,V ;MERGE RELOCATION
\r
2982 TRNN SX,-1 ;RIGHT HALF ZERO?
\r
2983 JRST OP2A ;YES, DO SIMPLE ADD
\r
2984 MOVE ARG,RC ;NO, SWAP RC INTO ARG>
\r
2985 IFN IIISW,<MOVSS ARG,RC>
\r
2986 ADD V,-1(PP) ;ADD RIGHT HALVES
\r
2988 HRRM V,-1(PP) ;UPDATE WITHOUT CARRY
\r
2990 HLLZS AC0 ;PREPARE LEFT HALVES
\r
2992 IFE IIISW,<TLNE SX,-1 ;IS LEFT HALF ZERO?
\r
2993 TRO ER,ERRQ ;NO FLAG FORMAT ERROR
\r
2994 OP2A: TLNE RC,-1 ;RELOCATION FOR LEFT HALF?
\r
2995 PUSHJ PP,OP2A1 ;YES,IS IT LEGAL?
\r
2996 TLNE AC0,777000 ;OP CODE FIELD USED?
\r
2997 JRST [EXCH AC0,-1(PP);YES, GET STORED CODE
\r
2998 TLNE AC0,777000 ;OP CODE FIELD BEEN SET?
\r
2999 TRO ER,ERRQ ;YES, MOST LIKELY AN ERROR
\r
3001 JRST .+1] ;RETURN TO ADD >
\r
3002 ADDM AC0,-1(PP) ;MERGE WITH PREVIOUS VALUE
\r
3005 JRST ERRAX ;NO, FLAG ERROR
\r
3006 ;YES, BYPASS PARENTHESIS
\r
3008 BYPAS1: PUSHJ PP,GETCHR
\r
3009 BYPAS2: JUMPE C,.-1 ;SKIP TRAILING BLANKS
\r
3013 OP2A1: EXCH RC,-2(PP) ;GET STORED CODE
\r
3014 TLNN RC,-1 ;OK IF ALL ZERO
\r
3015 JRST OP2A2 ;OK SO RETURN
\r
3016 TLC RC,-1 ;CHANGE ALL ONES TO ZEROS
\r
3017 TLCE RC,-1 ;OK IF ALL ONES
\r
3018 TRO ER,ERRQ ;OTHERWISE A "Q" ERROR
\r
3019 OP2A2: EXCH RC,-2(PP) ;GET RC,BACK
\r
3020 POPJ PP, ;AND RETURN>
\r
3023 EXPRES: HRLZ AC0,RX ;FUDGE FOR OCT0
\r
3027 OCT1: PUSHJ PP,EVALEX ;EVALUATE
\r
3028 PUSHJ PP,STOW ;STOW CODE
\r
3030 POP PP,RX ;YES, RESTORE RADIX
\r
3032 \fSIXB10: MOVSI RC,(POINT 6,AC0) ;SET UP POINTER
\r
3033 MOVEI AC0,0 ;CLEAR WORD
\r
3035 SIXB20: PUSHJ PP,CHARL ;GET NEXT CHARACTER
\r
3036 CAMN C,SX ;IS THIS PRESET DELIMITER?
\r
3041 TRZA C,100 ;CONVERT LOWER CASE TO SIXBIT
\r
3042 SUBI C,40 ;CONVERT TO SIXBIT
\r
3043 JUMPL C,ASC55 ;TEST FOR INVALID CHARACTER
\r
3044 IDPB C,RC ;NO, DEPOSIT THE BYTE
\r
3045 TLNE RC,770000 ;IS THE WORD FULL?
\r
3046 JRST SIXB20 ;NO, GET NEXT CHARACTER
\r
3047 PUSHJ PP,STOWZ ;YES, STORE
\r
3048 JRST SIXB10 ;GET NEXT WORD
\r
3049 \fASCII0: HLLZ SDEL,AC0 ;STORE ASCII/ASCIZ FLAG
\r
3050 ASC10: PUSHJ PP,CHARL ;GET FIRST NON-BLANK
\r
3054 CAIG C,CR ;CHECK FOR CRRET AS DELIM
\r
3058 MOVEM SX,TXTSEQ ;SAVE SEQ AND PAGE
\r
3062 MOVE SX,C ;SAVE FOR COMPARISON
\r
3063 JUMPG SDEL,SIXB10 ;BRANCH IF SIXBIT
\r
3065 ASC20: MOVSI RC,(POINT 7,AC0) ;SET UP POINTER
\r
3066 TLNE SDEL,200000 ;THIS BIT (AND BIT0) IN FOR COMMENT
\r
3067 MOVSI RC,440000 ;SO NOTHING WILL BE DEPOSITED
\r
3068 IFE IIISW,<MOVEI AC0,0 ;CLEAR WORD>
\r
3069 IFN IIISW,<TLNE SDEL,100000 ;ASCID?
\r
3070 TLZA SDEL,400000 ;YES, ZERO ASCIZ BIT
\r
3071 TDZA AC0,AC0 ;NO, ZERO WORD
\r
3072 MOVE AC0,[BYTE (7) 10,10,10,10,10 (1) 1] ;YES, A WORD FULL OF BACKSPACES>
\r
3073 ASC30: PUSHJ PP,CHARL ;GET ASCII CHARACTER AND LIST
\r
3074 CAMN C,SX ;TEST FOR DELIMITER
\r
3076 IDPB C,RC ;DEPOSIT BYTE
\r
3077 TLNE RC,760000 ;HAVE WE FINISHED WORD?
\r
3078 JRST ASC30 ;NO,GET NEXT CHARACTER
\r
3079 PUSHJ PP,STOWZ ;YES, STOW IT
\r
3080 JRST ASC20 ;GET NEXT WORD
\r
3082 ASC55: TDZA CS,CS ;ZERO CS IN CASE NESTED
\r
3083 ASC50: TDZA RC,SDEL ;TEST FOR ASCIIZ
\r
3084 TROA ER,ERRA ;SIXBIT ERROR EXIT
\r
3085 ASC60: PUSHJ PP,BYPAS1 ;POLISH OFF TERMINATOR
\r
3086 SETZM INTXT ;WE ARE OUT OF IT
\r
3087 IFN IIISW,<TLNN SDEL,100000 ;NO EXTRA WORDS FOR ASCID>
\r
3088 ANDCM RC,STPX ;STORE AT LEAST ONE WORD
\r
3089 TLNN SDEL,200000 ;GET OUT WITHOUT STORING
\r
3090 JUMPGE RC,STOWZ ;STOW
\r
3091 POPJ PP, ;ASCII, NO BYTES STORED, SO EXIT
\r
3093 PUSH PP,RC ;STACK REGISTERS
\r
3095 PUSHJ PP,EVAL10 ;EVALUATE RADIX 10
\r
3096 DPB AC0,[POINT 6,0(PP),11] ;STORE BYTE SIZE
\r
3098 PUSHJ PP,EVALEX ;NO, GET ADDRESS
\r
3099 PUSHJ PP,EVADR ;EVALUATE STANDARD ADDRESS
\r
3101 PUSHJ PP,EVAL10 ;EVALUATE RADIX 10
\r
3102 TLNE IO,NUMSW ;IF NUMERIC
\r
3103 TDCA AC0,[-1] ;POSITION=D35-RHB
\r
3104 POINT2: MOVEI AC0,0 ;OTHERWISE SET TO D36
\r
3107 ADDM AC0,0(PP) ;UPDATE VALUE
\r
3111 PUSH PP,AC0 ;STORE ZERO ON STACK
\r
3112 PUSHJ PP,EVALEX ;EVALUATE EXPRESSION
\r
3114 XWD5: SKIPN (PP) ;ANY CODE YET?
\r
3115 JRST XWD10 ;NO,USE VALUE IN AC0
\r
3116 JUMPE AC0,.+2 ;ANYTHING IN AC0?
\r
3117 TRO ER,ERRQ ;YES,FLAG "Q"ERROR
\r
3118 MOVE AC0,(PP) ;USE PREVIOUS VALUE
\r
3119 MOVE RC,-1(PP) ;AND RELOCATION
\r
3120 XWD10: HRLZM AC0,0(PP) ;SET LEFT HALF
\r
3123 JRST OP1A ;EXIT THROUGH OP
\r
3125 IOWD0: PUSHJ PP,EVALXQ ;EVALUATE AND TEST FOR EXTERNAL
\r
3127 JRST [SKIPN AC0 ;IF NZERO AND NO "," SEEN
\r
3128 TRO ER,ERRQ ;TREAT AS Q ERROR
\r
3129 SOJA AC0,STOW] ;NO, TREAT AS RIGHT HALF
\r
3130 PUSH PP,AC0 ;YES, STACK LEFT HALF
\r
3131 PUSHJ PP,EVALEX ;WFW
\r
3133 POP PP,AC1 ;RETRIEVE LEFT HALF
\r
3136 JRST STOW ;STOW CODE AND EXIT
\r
3137 \fBYTE0: PUSHJ PP,BYPASS ;GET FIRST NON-BLANK
\r
3139 JRST ERRAX ;NO, FLAG ERROR AND EXIT
\r
3141 PUSH PP,AC0 ;INITIALIZE STACK TO ZERO
\r
3142 MOVSI ARG,(POINT -1,(PP))
\r
3144 BYTE1: PUSH PP,ARG
\r
3145 PUSHJ PP,EVAL10 ;EVALUATE RADIX 10
\r
3147 CAIG AC0,^D36 ;TEST SIZE
\r
3150 DPB AC0,[POINT 6,ARG,11] ;STORE BYTE SIZE
\r
3152 BYTE2: IBP ARG ;INCREMENT BYTE
\r
3153 TRZN ARG,-1 ;OVERFLOW?
\r
3156 EXCH AC0,0(PP) ;GET CURRENT VALUES
\r
3157 EXCH RC,-1(PP) ;AND STACK ZEROS
\r
3158 PUSHJ PP,STOW ;STOW FULL WORD
\r
3160 BYTE3: PUSH PP,ARG
\r
3161 PUSHJ PP,EVALEX ;COMPUTE NEXT BYTE
\r
3163 DPB AC0,ARG ;STORE BYTE
\r
3165 DPB RC,AC0 ;STORE RELOCATION
\r
3169 JRST BYTE1 ;YES, GET NEW BYTE SIZE
\r
3170 JRST OP3 ;NO, EXIT
\r
3171 \fRADX50: PUSHJ PP,EVALEX ;EVALUATE CODE
\r
3172 JUMPN RC,ERRAX ;ERROR IF NOT ABSOLUTE
\r
3175 PUSHJ PP,GETSYM ;YES, GET SYMBOL
\r
3176 TRZ ER,ERRA ;CLEAR ERROR
\r
3177 PUSHJ PP,SQOZE ;SQUOZE SIXBIT AND ADD CODE
\r
3178 JRST STOW ;STOW CODE AND EXIT
\r
3181 SQOZE: MOVE AC1+1,AC0 ;PUT SIXBIT IN AC1+1
\r
3182 MOVEI AC0,0 ;CLEAR RESULT
\r
3183 SQOZ1: MOVEI AC1,0
\r
3184 LSHC AC1,6 ;PUT 6-BIT CHARACTER IN AC1
\r
3185 LDB AC1,[POINT 6,CSTAT(AC1),23] ;CONVERT TO RADIX50
\r
3186 IMULI AC0,50 ;MULTIPLY PREVIOUS RESULT
\r
3187 ADD AC0,AC1 ;ADD NEW CHARACTER
\r
3188 JUMPN AC1+1,SQOZ1 ;TEST FOR END
\r
3189 LSH ARG,^D30 ;LEFT-JUSTIFY CODE
\r
3190 IOR AC0,ARG ;MERGE WITH RESULT
\r
3193 \f; PSEUDO-END STATEMENT FOR MULTI-FILE CAPABILITY
\r
3195 ; HERE IF PRGEND (PASS 1)
\r
3196 PSEND0: TLO IO,MFLSW ;PSEND SEEN
\r
3197 PUSHJ PP,END0 ;AS IF END STATEMENT
\r
3198 HLLZS IO ;CLEAR ER(RH)
\r
3199 SETZM ERRCNT ;CLEAR ERROR COUNT FOR EACH PROG.
\r
3200 JUMP2 PSEND2 ;DIFFERENT ON PASS2
\r
3201 IFN UNIVR,<SKIPE UNIVSN ;SEEN A UNIVERSAL
\r
3202 PUSHJ PP,UNISYM ;YES, STORE SYMBOLS>
\r
3203 PUSHJ PP,PSEND4 ;SAVE SYMBOLS, POINTERS AND TITLE
\r
3204 TLZ IO,IOTLSN ;CLEAR TITLE SEEN FLAG
\r
3205 PSEND1: TLZ IO,MFLSW ;FOR NEXT FILE
\r
3206 IFN UNIVR,<SETZM UNISCH ;CLEAR UNIVERSAL SEARCH TABLE
\r
3207 MOVE AC0,[UNISCH,,UNISCH+1]
\r
3208 BLT AC0,UNISCH+.UNIV-1
\r
3209 PUSHJ PP,OUTFF ;RESET PAGE COUNT>
\r
3210 MOVSI AC0,1 ;SET SO RELOC 0 WORKS
\r
3211 JRST LOC10 ;FOR RELOC 0
\r
3213 ; HERE IF PRGEND (PASS 2)
\r
3214 PSEND2: SETZM SBUF ;SO SUBTTL IS NOT WRONG
\r
3215 PUSHJ PP,PSEND5 ;PUT TITLE BACK
\r
3216 PUSHJ PP,PSEND1 ;COMMON CODE
\r
3217 JRST PASS20 ;OUTPUT THE ENTRIES
\r
3219 ; HERE IF END (PASS 1)
\r
3220 PSEND3: PUSHJ PP,PSEND4 ;SAVE LAST PROGRAM
\r
3221 HLRS PRGPTR ;REINITIALIZE POINTER
\r
3222 PUSHJ PP,PSEND5 ;READ BACK FIRST PROGRAM
\r
3224 \f;HERE TO SAVE AND RESTORE SYMBOL TABLE, TITLE AND OTHER USEFUL LOCATIONS
\r
3225 XTRA==4 ;NUMBER OF OTHER LOCATIONS TO SAVE
\r
3227 PSEND4: MOVE V,FREE ;GET NEXT FREE LOCATION
\r
3228 ADDI V,LENGTH+.TBUF/5+XTRA
\r
3229 CAML V,SYMBOL ;WILL WORST CASE FIT?
\r
3230 PUSHJ PP,XCEED ;NO, EXPAND
\r
3232 HRR V,PRGPTR ;LAST PRGEND BLOCK
\r
3233 HLRM V,(V) ;LINK THIS BLOCK
\r
3234 SKIPN PRGPTR ;IF FIRST TIME
\r
3235 HLLZM V,PRGPTR ;SET LINK TO START OF CHAIN
\r
3236 HLRM V,PRGPTR ;POINTER TO IT
\r
3237 SETZM @FREE ;CLEAR LINK WORD
\r
3238 AOS FREE ;THIS LOCATION USED NOW
\r
3239 MOVS AC0,SYMBOL ;BOTTOM OF SYMBOL TABLE
\r
3240 HRR AC0,FREE ;FREE SPACE
\r
3241 MOVE V,@SYMBOL ;GET NUMBER OF SYMBOLS
\r
3242 ASH V,1 ;TWO WORDS PER SYMBOL
\r
3243 ADDI V,1 ;ONE MORE FOR COUNT
\r
3244 ADDB V,FREE ;END OF TABLE WHEN MOVED
\r
3245 BLT AC0,(V) ;MOVE TABLE
\r
3246 HRRZ AC0,JOBREL ;TOP OF CORE
\r
3248 MOVEM AC0,SYMTOP ;FOR NEXT SYMBOL TABLE
\r
3249 SUBI AC0,LENGTH ;LENGTH OF INITIAL SYMBOLS
\r
3250 MOVEM AC0,SYMBOL ;SET POINTER TO COUNT OF SYMBOLS
\r
3251 HRLI AC0,SYMNUM ;BLT POINTER
\r
3252 BLT AC0,@SYMTOP ;SET UP INITIAL SYMBOL TABLE
\r
3253 PUSHJ PP,SRCHI ;SET UP SEARCH POINTER
\r
3254 MOVEI AC0,.TBUF ;MAX NUMBER OF CHARS. IN TITLE
\r
3255 SUB AC0,TCNT ;ACTUAL NUMBER
\r
3256 IDIVI AC0,5 ;NUMBER OF WORDS
\r
3257 SKIPE AC1 ;REMAINDER?
\r
3259 MOVEM AC0,@FREE ;STORE COUNT
\r
3260 AOS FREE ;THIS LOCATION USED NOW
\r
3261 EXCH AC0,FREE ;SET UP AC0 FOR BLT
\r
3262 ADDM AC0,FREE ;WILL BE AFTER TITLE MOVES
\r
3263 HRLI AC0,TBUF ;BLT POINTER
\r
3264 BLT AC0,@FREE ;MOVE TITLE
\r
3265 MOVE AC2,LITHDX ;POINTER TO LIT INFO.
\r
3266 MOVE AC0,-1(AC2) ;SIZE OF PASS1 LOCO
\r
3267 PUSHJ PP,STORIT ;SAVE IT IN SYMBOL TABLE
\r
3268 MOVE AC2,VARHDX ;SAME FOR VARS
\r
3272 MOVE AC0,HISNSW ;GET TWOSEG/HISEG FLAG
\r
3273 HRR AC0,HIGH1 ;AND PASS1 BREAK
\r
3275 JUMPGE AC0,PSEND6 ;NOT TWOSEG
\r
3276 MOVE AC0,SVTYP3 ;HIGH SEGMENT OFFSET
\r
3277 PUSHJ PP,STORIT ;SAVE IT ALSO>
\r
3278 PSEND6: MOVE AC0,FREE ;GET NEXT FREE LOCATION
\r
3279 SUBI AC0,1 ;LAST ONE USED
\r
3280 HRRZ V,PRGPTR ;POINTER TO START OF DATA BLOCK
\r
3281 HRLM AC0,(V) ;LINK TO END OF BLOCK
\r
3284 \fPSENDX: PUSHJ PP,XCEED ;NEED TO EXPAND CORE FIRST
\r
3285 PSEND5: HRRZ AC0,JOBREL ;GET TOP OF CORE
\r
3287 MOVEM AC0,SYMTOP ;TOP OF NEW SYMBOL TABLE
\r
3288 HRRZ V,PRGPTR ;ADDRESS OF THIS BLOCK
\r
3289 JUMPE V,PSNDER ;ERROR LINK NOT SET UP
\r
3290 MOVE AC1,(V) ;NEXT LINK
\r
3291 MOVE V,1(V) ;GET ITS SYMBOL COUNT
\r
3292 ASH V,1 ;NUMBER OF WORDS
\r
3293 ADDI V,1 ;PLUS ONE FOR COUNT
\r
3294 SUBI AC0,(V) ;START OF NEW SYMBOL TABLE
\r
3295 CAMG AC0,FREE ;WILL IT FIT
\r
3296 JRST PSENDX ;NO, NEED TO EXPAND AND RESET AC0
\r
3297 ADD V,PRGPTR ;POINT TO END OF SYMBOL TABLE
\r
3298 MOVEI V,1(V) ;THEN TO BEG OF TITLE
\r
3299 MOVEM AC0,SYMBOL ;BOTTOM OF NEW TABLE
\r
3300 HRL AC0,PRGPTR ;ADDRESS OF FIRST WORD OF BLOCK
\r
3301 ADD AC0,[1,,0] ;MAKE BLT POINTER
\r
3302 HRRM AC1,PRGPTR ;POINT TO NEXT BLOCK
\r
3303 BLT AC0,@SYMTOP ;MOVE TABLE
\r
3304 PUSHJ PP,SRCHI ;SET UP POINTER
\r
3305 MOVE AC1,(V) ;NUMBER OF WORDS OF TITLE
\r
3306 MOVEI AC0,1(V) ;START OF STORED TITLE
\r
3307 ADD V,AC1 ;INCREMENT PAST TITLE
\r
3308 ADDI AC1,TBUF-1 ;END OF TITLE
\r
3309 HRLI AC0,TBUF ;WHERE TO PUT IT
\r
3310 MOVSS AC0 ;BLT POINTER
\r
3311 BLT AC0,(AC1) ;MOVE TITLE
\r
3312 TLO IO,IOTLSN ;SET AS IF TITLE SEEN
\r
3313 MOVE AC2,LITHDX ;INVERSE OF ABOVE
\r
3316 MOVE AC2,VARHDX ;SAME FOR VARS
\r
3320 PUSHJ PP,GETIT ;GET TWO HALF WORDS
\r
3321 HRRZM AC0,HIGH1 ;PASS1 BREAK
\r
3322 HLLEM AC0,HISNSW ;TWOSEG/HISEG FLAG
\r
3323 JUMPGE AC0,CPOPJ ;NOT TWOSEG
\r
3325 MOVEM AC0,SVTYP3 ;BLOCK 3 WORD>
\r
3328 STORIT: MOVEM AC0,@FREE ;STORE IT IN DATA BLOCK
\r
3329 AOS FREE ;ADVANCE POINTER
\r
3332 GETIT: MOVE AC0,1(V) ;FILL AC0 OUT OF PRGEND BLOCK
\r
3333 AOJA V,CPOPJ ;INCREMENT AND RETURN
\r
3335 PSNDER: HRROI RC,[SIXBIT /PRGEND ERROR @/]
\r
3337 \f;MULTIPLE SYMBOL TABLE FEATURE PSEUDO-OPS
\r
3340 UNIV0: JUMP2 TITLE0 ;DO IT ALL ON PASS 1
\r
3341 HRRZ SX,UNIVNO ;GET NUMBER OF UNIVERSALS SEEN
\r
3342 CAIL SX,.UNIV ;ALLOW ONE MORE?
\r
3343 JRST UNVERR ;NO, GIVE FATAL ERROR
\r
3344 AOS UNIVNO ;ONE MORE NOW
\r
3345 SETOM UNIVSN ;AND SET SEEN A UNIVERSAL
\r
3346 JRST TITLE0 ;CONTINUE AS IF TITLE
\r
3349 ADDUNV: PUSH PP,RC ;AN AC TO USE
\r
3350 PUSHJ PP,NOUT ;CONVERT TO SIXBIT
\r
3351 HRRZ RC,UNIVNO ;GET ENTRY INDEX
\r
3352 MOVEM AC0,UNITBL(RC) ;STORE SIXBIT NAME IN TABLE
\r
3353 HRRZS UNIVSN ;ONLY DO IT ONCE
\r
3354 POP PP,RC ;RESTORE RC
\r
3355 POPJ PP, ;AND RETURN
\r
3357 UNVERR: HRROI RC,[SIXBIT /TOO MANY UNIVERSALS@/]
\r
3360 UNISYM: HRRZ AC0,FREE ;GET HIGHEST FREE LOCATION
\r
3361 MOVEM AC0,JOBFF ;INTO JOBFF
\r
3362 PUSHJ PP,SUPRSA ;TURN ON SUPPRESS BIT
\r
3363 PUSH PP,SYMBOL ;NEED TO SAVE INCASE PRGEND
\r
3364 MOVE AC0,SYMTOP ;TOP OF TABLE
\r
3365 SUB AC0,SYMBOL ;GET LENGTH OF TABLE
\r
3366 HRL ARG,SYMBOL ;BOTTOM OF TABLE
\r
3367 HRR ARG,JOBFF ;WHERE TO GO
\r
3368 HRRZ RC,UNIVNO ;GET TABLE INDEX
\r
3369 HRRM ARG,SYMBOL ;WILL BE THERE SOON
\r
3370 HRRZM ARG,UNIPTR(RC) ;STORE IN CORRESPONDING PLACE
\r
3371 ADDB AC0,JOBFF ;WHERE TO END
\r
3372 HRLM AC0,UNIPTR(RC) ;SAVE NEW SYMTOP
\r
3373 BLT ARG,@JOBFF ;MOVE TABLE
\r
3374 HRRZM AC0,UNITOP ;SAVE TOP OF TABLES+1
\r
3375 CAMLE AC0,MACSIZ ;IN CASE OVER A K BOUND
\r
3376 MOVEM AC0,MACSIZ ;DON'T REDUCE SO FAR NOW
\r
3377 MOVEM AC0,FREE ;JUST IN CASE IN MACRO
\r
3378 MOVE AC0,SRCHX ;SAVE OLD SEARCH POINTER
\r
3379 PUSHJ PP,SRCHI ;GET SEARCH POINTER
\r
3381 MOVEM AC0,UNISHX(RC) ;SAVE IT
\r
3382 SETZM UNIVSN ;CLEAR FLAG INCASE PRGEND
\r
3383 POP PP,SYMBOL ;RESTORE OLD VALUE
\r
3386 \fSERCH0: PUSHJ PP,GETSYM ;GET A SYMBOL
\r
3387 JRST ERRAX ;ERROR IF NOT VALID
\r
3388 MOVEI RC,1 ;START AT ENTRY ONE
\r
3389 CAIL RC,.UNIV ;CHECK FOR CONSISTENCY ERROR
\r
3390 JRST SCHERR ;CANNOT FIND THIS ONE
\r
3391 CAME AC0,UNITBL(RC) ;LOOK FOR MATCH
\r
3392 AOJA RC,.-3 ;NOT FOUND YET
\r
3393 MOVE AC0,RC ;STORE TABLE ENTRY NUMBER
\r
3394 MOVEI RC,1 ;START AT ENTRY ONE
\r
3395 CAIL RC,.UNIV ;CHECK FOR CONSISTENCY ERROR
\r
3396 JRST SCHERR ;SHOULD NEVER HAPPEN!!
\r
3397 SKIPE UNISCH(RC) ;LOOK FOR AN EMPTY SLOT
\r
3398 AOJA RC,.-3 ;NOT FOUND YET
\r
3399 MOVEM AC0,UNISCH(RC) ;STORE INDEX IN TABLE
\r
3400 JUMPCM SERCH0 ;LOOK FOR MORE NAMES
\r
3401 POPJ PP, ;FINISHED
\r
3403 SCHERR: MOVSI RC,[SIXBIT /CANNOT FIND UNIVERSAL@/]
\r
3404 JRST ERRFIN ;NAME IN AC0
\r
3406 ;MESSAGE FOR CASE WHERE FILES AFTER UNIVERSAL USED MORE BUFFER SPACE THAN FIRST UNIVERSAL
\r
3407 UNIERR: HRROI RC,[SIXBIT /UNIVERSAL PROGRAM(S) MUST HAVE SAME OUTPUT SPECIFICATION AS OTHER FILES@/]
\r
3410 \fSUBTTL MACRO/REPEAT HANDLERS
\r
3412 REPEA0: PUSHJ PP,EVALXQ ;EVALUATE REPEAT EXP, EXTERNS ARE ILL.
\r
3415 REPEA1: JUMPLE AC0,REPZ ;PASS THE EXP., DONT PROCESS
\r
3416 SOJE AC0,REPO ;REPEAT ONCE
\r
3417 REPEA2: PUSHJ PP,GCHARQ ;GET STARTING "<"
\r
3420 PUSHJ PP,SKELI1 ;INITIALIZE SKELETON
\r
3423 PUSH MP,REPPNT ;STACK PREVIOUS REPEAT POINTER
\r
3424 MOVEM ARG,REPPNT ;STORE NEW POINTER
\r
3425 TDZA SDEL,SDEL ;YES, INITIALIZE BRACKET COUNT AND SKIP
\r
3427 REPEA4: PUSHJ PP,WCHARQ ;WRITE A CHARACTER
\r
3428 PUSHJ PP,GCHARQ ;GET A CHARACTER
\r
3430 AOJA SDEL,REPEA4 ;YES, INCREMENT AND WRITE
\r
3432 JRST REPEA4 ;NO, WRITE THE CHARACTER
\r
3433 SOJGE SDEL,REPEA4 ;YES, WRITE IF NON-NEGATIVE COUNT
\r
3434 MOVSI CS,(BYTE (7) 177,3) ;SET "REPEAT" END
\r
3435 PUSHJ PP,WWRXE ;WRITE END
\r
3436 SKIPN LITLVL ;LITERAL MIGHT END ON LINE
\r
3437 SKIPE MACLVL ;IF IN MACRO DARE NOT PROCESS
\r
3438 JRST .+3 ;REST OF LINE SINCE MACRO MIGHT END ON IT
\r
3439 PUSHJ PP,BYPASS ;BYPASS
\r
3440 PUSHJ PP,STOUTS ;POLISH OF LINE BEFORE PROCESSING REPEAT
\r
3441 PUSH MP,MRP ;STACK PREVIOUS READ POINTER
\r
3442 PUSH MP,RCOUNT ;SAVE WORD COUNT
\r
3443 HRRZ MRP,REPPNT ;SET UP READ POINTER
\r
3444 SKIPN MACLVL ;IF IN MACRO GIVE CR-LF FIRST
\r
3445 SKIPE LITLVL ;SAME FOR LITERAL
\r
3447 AOJA MRP,POPOUT ;BYPASS ARG COUNT
\r
3449 REPEA7: HRRZ MRP,REPPNT ;SET UP READ POINTER
\r
3450 ADDI MRP,1 ;BYPASS ARG COUNT
\r
3451 REPEA8: MOVEI C,CR
\r
3454 REPEND: SOSL REPEXP
\r
3456 HRRZ V,REPPNT ;GET START OF TREE
\r
3457 PUSHJ PP,REFDEC ;DECREMENT REFERENCE
\r
3462 SKIPN LITLVL ;IF IN LITERAL OR
\r
3463 SKIPE MACLVL ;IF IN MACRO
\r
3464 JRST RSW0 ;FINISH OF LINE NOW
\r
3467 \fREPZ: MOVE SDEL,SEQNO2 ;SAVE IN CASE OF END OF FILE
\r
3472 MOVEI SDEL,0 ;SET COUNT
\r
3473 REPZ1: PUSHJ PP,GCHAR ;GET NEXT CHARACTER
\r
3475 AOJA SDEL,REPZ1 ;YES, INCREMENT COUNT
\r
3477 SOJLE SDEL,REPZ2 ;YES, EXIT IF MATCHING
\r
3478 JRST REPZ1 ;NO, RECYCLE
\r
3479 REPZ2: SETZM INREP ;FLAG OUT OF IT
\r
3480 SETZM INCND ;AND CONDITIONAL ALSO
\r
3481 JRST STMNT ;AND EXIT
\r
3483 REPO: PUSHJ PP,GCHAR ;GET "<"
\r
3486 SKIPE RPOLVL ;ARE WE NESTED?
\r
3487 AOS RPOLVL ;YES, DECREMENT CURRENT
\r
3500 \fDEFIN0: PUSHJ PP,GETSYM ;GET MACRO NAME
\r
3501 JRST ERRAX ;EXIT ON ERROR
\r
3502 MOVEM PP,PPTMP1 ;SAVE POINTER
\r
3503 MOVEM AC0,PPTMP2 ;SAVE NAME
\r
3505 MOVE SX,SEQNO2 ;SAVE IN CASE OF EOF
\r
3509 SETOM INDEF ;AND FLAG IN DEFINE
\r
3510 SYN .TEMP,COMSW ;SAVE SPACE
\r
3511 SETZB SX,COMSW ;SET ARGUMENT AND REFERENCE COUNT AND COMMENT SWITCH
\r
3512 DEF02: PUSHJ PP,GCHAR ;SEARCH FOR "(" OR "<"
\r
3513 CAIG C,FF ;SEARCH FOR END OF LINE
\r
3514 CAIGE C,LF ;LF,VT, OR FF
\r
3515 JRST .+2 ;WASN'T ANY OF THEM
\r
3516 SETZM COMSW ;RESET COMMENT SWITCH
\r
3517 CAIN C,";" ;COMMENT?
\r
3518 SETOM COMSW ;YES, SET COMMENT SWITCH
\r
3519 SKIPE COMSW ;INSIDE A COMMENT?
\r
3520 JRST DEF02 ;YES, IGNORE CHARACTER
\r
3525 DEF10: PUSHJ PP,GETSYM ;YES, GET DUMMY SYMBOL
\r
3526 TRO ER,ERRA ;FLAG ERROR
\r
3527 ADDI SX,1 ;INCREMENT ARG COUNT
\r
3528 PUSH PP,AC0 ;STACK IT
\r
3529 CAIN C,'<' ;A DEFAULT ARGUMENT COMING UP?
\r
3530 JRST DEF80 ;YES, STORE IT AWAY
\r
3532 JRST DEF10 ;NO, GET NEXT DUMMY SYMBOL
\r
3533 DEF12: PUSHJ PP,GCHAR
\r
3536 DEF20: PUSH PP,[0] ;YES, MARK THE LIST
\r
3537 LSH SX,9 ;SHIFT ARG COUNT
\r
3539 PUSHJ PP,SKELI ;INITIALIZE MACRO SKELETON
\r
3540 MOVE AC0,PPTMP2 ;GET NAME
\r
3542 PUSHJ PP,MSRCH ;SEARCH THE TABLE
\r
3543 JRST DEF24 ;NOT FOUND
\r
3544 TLNN ARG,MACF ;FOUND, IS IT A MACRO?
\r
3545 TROA ER,ERRX ;NO, FLAG ERROR AND SKIP
\r
3546 PUSHJ PP,REFDEC ;YES, DECREMENT THE REFERENCE
\r
3547 DEF24: HRRZ V,WWRXX ;GET START OF TREE
\r
3548 SKIPN .TEMP ;ANY DEFAULT ARGUMENTS TO TAKE CARE OF?
\r
3550 HRRZ C,1(V) ;GET SHIFTED ARG COUNT
\r
3551 LSH C,-9 ;GET ARG COUNT BACK
\r
3552 ADDI C,1 ;ONE MORE FOR TERMINAL ZERO
\r
3553 ADD C,.TEMP ;NUMBER OF ITEMS IN STACK
\r
3555 SUB PP,C ;BACK UP STACK
\r
3556 MOVE SDEL,.TEMP ;NUMBER OF WORDS NEEDED
\r
3557 ADDB SDEL,FREE ;FROM FREE CORE
\r
3558 CAML SDEL,SYMBOL ;MORE CORE NEEDED
\r
3559 PUSHJ PP,XCEEDS ;YES, TRY TO GET IT
\r
3560 SUB SDEL,.TEMP ;FORM POINTER
\r
3561 HRLM SDEL,1(V) ;STORE IT WITH ARG COUNT IN MACRO
\r
3562 SUBI SDEL,1 ;TO USE FOR PUSHING POINTER INTO STORAGE
\r
3563 MOVEI C,1(PP) ;POINT TO START OF STACK
\r
3564 DEF26: MOVE ARG,(C) ;GET AN ITEM OFF STACK
\r
3565 TLNN ARG,-40 ;A POINTER?
\r
3566 JUMPN ARG,[PUSH SDEL,ARG ;YES, STORE IT
\r
3567 \f AOJA C,DEF26] ;GET NEXT
\r
3568 PUSH PP,ARG ;RESTACK ARGUMENT
\r
3569 SKIPE ARG ;FINISHED IF ZERO
\r
3570 AOJA C,DEF26 ;GET NEXT
\r
3571 PUSH SDEL,ARG ;STORE ZERO IN DEFAULT LIST ALSO
\r
3572 \fDEF25: MOVSI ARG,MACF
\r
3573 MOVEM PP,PPTMP2 ;STORE TEMP STORAGE POINTER
\r
3574 PUSHJ PP,INSERT ;INSERT/UPDATE
\r
3575 TLZ IO,DEFCRS ;JUST IN CASE
\r
3576 SETZM ARGF ;NO ARGUMENT SEEN
\r
3577 SETZM SQFLG ;AND NO ' SEEN
\r
3578 TDZA SDEL,SDEL ;CLEAR BRACKET COUNT
\r
3579 DEF30: PUSHJ PP,WCHAR ;WRITE CHARACTER
\r
3580 DEF31: PUSHJ PP,GCHAR ;GET A CHARACTER
\r
3581 DEF32: MOVE CS,C ;GET A COPY
\r
3582 CAIN C,";" ;IS IT A COMMENT
\r
3583 JRST CPEEK ;YES CHECK FOR ;;
\r
3584 DEF33: CAIG CS,"Z"+40 ;CONVERT LOWER CASE
\r
3588 \f CAIGE CS,40 ;TEST FOR CONTROL CHAR.
\r
3589 JRST [SKIPN SQFLG ;HAS SINGLE QUOTE BEEN SEEN?
\r
3590 JRST DEF30 ;NO, OUTPUT THIS CHAR.
\r
3591 PUSH PP,C ;YES, SAVE CURRENT CHAR
\r
3592 MOVEI C,47 ;SET UP QUOTE
\r
3593 PUSHJ PP,WCHAR;WRITE IT
\r
3594 POP PP,C ;GET BACK CURRENT CHAR.
\r
3595 SETZM SQFLG ;RESET FLAG
\r
3596 JRST DEF30] ;AND CONTINUE
\r
3598 JRST DEF30 ;TEST FOR SPECIAL
\r
3599 MOVE CS,CSTAT-40(CS) ;GET STATUS BITS
\r
3600 \f TLNE CS,6 ;ALPHA-NUMERIC?
\r
3602 SKIPN SQFLG ;WAS A ' SEEN?
\r
3603 JRST DEF36 ;NO, PROCESH
\r
3604 PUSH PP,C ;YES, SAVE CURRENT CHARACTER
\r
3605 MOVEI C,47 ;AND PUT IN A '
\r
3606 PUSHJ PP,WCHAR ;...
\r
3607 POP PP,C ;RESTORE CURRENT CHARACTER
\r
3608 SETZM SQFLG ;AND RESET FLAG
\r
3609 DEF36: CAIE C,47 ;IS THIS A '?
\r
3611 SKIPN ARGF ;YES, WAS LAST THING SEEN AN ARG?
\r
3612 SETOM SQFLG ;IF NOT, SET SNGL QUOT FLAG
\r
3613 SETZM ARGF ;BUT NOT ARGUMENT IN ANY CASE
\r
3614 JRST DEF31 ;GO GET NEXT CHARACTER
\r
3615 \fDEF35: SETZM ARGF ;THIS IS NOT AN ARGUMENT
\r
3617 AOJA SDEL,DEF30 ;YES, INCREMENT COUNT AND WRITE
\r
3619 SOJL SDEL,DEF70 ;YES, TEST FOR END
\r
3620 JRST DEF30 ;NO, WRITE IT
\r
3622 CPEEK: TLNN IO,IOPALL ;IF LALL IS ON
\r
3623 JRST DEF33 ;JUST RETURN
\r
3624 PUSHJ PP,PEEK ;LOOK AT NEXT CHAR.
\r
3625 CAIN C,";" ;IS IT ;;?
\r
3627 MOVE C,CS ;RESTORE C
\r
3628 JRST DEF33 ;AND RETURN
\r
3630 CPEEK1: PUSHJ PP,GCHAR ;GET THE CHAR.
\r
3631 CAIE C,">" ;RETURN IF END OF MACRO
\r
3632 CAIG C,CR ;IS CHAR ONE OF
\r
3633 CAIGE C,LF ;LF,VT,FF,CR
\r
3634 JRST CPEEK1 ;NO,SO GET NEXT CHAR.
\r
3635 JRST DEF32 ;YES,RETURN AND STORE
\r
3636 \fDEF40: MOVEI AC0,0 ;CLEAR ATOM
\r
3637 MOVSI AC1,(POINT 6,AC0) ;SET POINTER
\r
3638 DEF42: PUSH PP,C ;STACK CHARACTER
\r
3639 TLNE AC1,770000 ;HAVE WE STORED 6?
\r
3640 IDPB CS,AC1 ;NO, STORE IN ATOM
\r
3641 PUSHJ PP,GCHAR ;GET NEXT CHARACTER
\r
3646 SUBI CS,40 ;CONVERT LOWER TO UPPER
\r
3649 JRST DEF44 ;TEST SPECIAL
\r
3650 MOVE CS,CSTAT-40(CS) ;GET STATUS
\r
3651 TLNE CS,6 ;ALPHA-NUMERIC?
\r
3652 JRST DEF42 ;YES, GET ANOTHER
\r
3653 DEF44: PUSH PP,[0] ;NO, MARK THE LIST
\r
3654 MOVE SX,PPTMP1 ;GET POINTER TO TOP
\r
3656 DEF46: SKIPN 1(SX) ;END OF LIST?
\r
3658 CAME AC0,1(SX) ;NO, DO THEY COMPARE?
\r
3659 AOJA SX,DEF46 ;NO, TRY AGAIN
\r
3660 SUB SX,PPTMP1 ;YES, GET DUMMY SYMBOL NUMBER
\r
3662 MOVSI CS,<(BYTE (7) 177,101)>(SX) ;SET ESCAPE CODE MACEND
\r
3665 TLO CS,1000 ;YES, SET CRESYM FLAG
\r
3666 PUSHJ PP,WWORD ;WRITE THE WORD
\r
3667 SETOM ARGF ;SET ARGUMENT SEEN FLAG
\r
3668 SETZM SQFLG ;AND IGNORE ANY ' WAITING TO GET INTO STRING
\r
3669 DEF48: MOVE PP,PPTMP2 ;RESET PUSHDOWN POINTER
\r
3670 TLO IO,IORPTC ;ECHO LAST CHARACTER
\r
3671 JRST DEF31 ;RECYCLE
\r
3674 SKIPN SQFLG ;HAVE WE SEEN A '?
\r
3676 MOVEI C,47 ;YES, PUT IT IN
\r
3677 PUSHJ PP,WCHAR ;...
\r
3678 SETZM SQFLG ;AND CLEAR FLAG
\r
3679 DEF51: MOVE C,2(SX) ;GET CHARACTER
\r
3680 JUMPE C,DEF48 ;CLEAN UP IF END
\r
3681 PUSHJ PP,WCHAR ;WRITE THE CHARACTER
\r
3682 AOJA SX,DEF51 ;GET NEXT
\r
3684 DEF70: MOVE PP,PPTMP1 ;RESTORE PUSHDOWN POINTER
\r
3685 MOVSI CS,(BYTE (7) 177,1)
\r
3686 PUSHJ PP,WWRXE ;WRITE END
\r
3687 SETZM INDEF ;OUT OF IT
\r
3689 \f; HERE TO STORE DEFAULT ARGUMENTS
\r
3691 DEF80: AOS .TEMP ;COUNT ONE MORE
\r
3692 PUSHJ PP,SKELI1 ;INITIALIZE SKELETON
\r
3693 HRL V,SX ;SYMBOL NUMBER
\r
3694 PUSH PP,V ;STORE POINTER
\r
3695 TDZA SDEL,SDEL ;ZERO BRACKET COUNT
\r
3696 DEF81: PUSHJ PP,WCHARQ ;WRITE A CHARACTER
\r
3697 PUSHJ PP,GCHARQ ;GET A CHARACTER
\r
3698 CAIN C,"<" ;ANOTHER "<"?
\r
3699 AOJA SDEL,DEF81 ;YES, INCREMENT AND WRITE
\r
3700 CAIE C,">" ;CLOSING ANGLE?
\r
3701 JRST DEF81 ;NO, JUST WRITE THE CHAR.
\r
3702 SOJGE SDEL,DEF81 ;YES, WRITE IF NOT END
\r
3703 MOVSI CS,(BYTE (7) 177,2)
\r
3704 PUSHJ PP,WWRXE ;WRITE END OF DUMMY ARGUMENT
\r
3705 PUSHJ PP,GCHAR ;READ AT NEXT CHAR.
\r
3706 CAIE C,")" ;END OF ARGUMENT LIST?
\r
3707 JRST DEF10 ;NO, GET NEXT SYMBOL
\r
3708 JRST DEF12 ;YES, LOOK FOR "<"
\r
3709 \fSUBTTL MACRO CALL PROCESSOR
\r
3710 CALLM: SKIPGE MACENL ;ARE WE TRYING TO RE-ENTER?
\r
3711 JRST ERRAX ;YES, BOMB OUT WITH ERROR
\r
3712 HRROS MACENL ;FLAG "CALLM IN PROGRESS"
\r
3714 PUSH MP,V ;STACK FOR REFDEC
\r
3716 MOVEM AC0,CALNAM ;SAVE MACRO NAME INCASE OF ERROR
\r
3717 MOVE SDEL,SEQNO2 ;SAVE IN CASE OF EOF
\r
3721 ADDI V,1 ;POINT TO DUMMY SYMBOL COUNT
\r
3722 AOS SDEL,0(V) ;INCREMENT ARG COUNT
\r
3723 HLLZM SDEL,.TEMP ;DEFAULT ARG POINTER IF NON-ZERO
\r
3724 LSHC SDEL,-^D<9+36> ;ZERO SDEL, GET ARG COUNT IN SX
\r
3726 SKIPE .TEMP ;IF AT LEAST ONE DEFAULT ARG
\r
3727 HRRM SX,.TEMP ;STORE COUNT OF ARGS
\r
3728 PUSH PP,V ;STACK FOR MRP
\r
3729 PUSH PP,RP ;STACK FOR MACPNT
\r
3730 JUMPE SX,MAC20 ;TEST FOR NO ARGS
\r
3733 TROA SDEL,-1 ;NO, FUDGE PAREN COUNT AND SKIP
\r
3735 MAC10: PUSHJ PP,GCHAR ;GET A CHARACTER, LOOK FOR AN ARG
\r
3739 JRST MAC21 ;YES, END OF ARGUMENT STRING
\r
3741 PUSHJ PP,SKELI1 ;NO, INITIALIZE SKELETON
\r
3743 JRST MAC30 ;YES, PROCESS AS SPECIAL
\r
3746 JRST MAC40 ;YES, PROCESS SYMBOL
\r
3748 MAC14: CAIN C,"," ;","?
\r
3749 JRST MAC16 ;YES; NULL SYMBOL
\r
3751 ADDI SDEL,1 ;YES, INCREMENT COUNT
\r
3753 SOJL SDEL,MAC16 ;YES, TEST FOR END
\r
3754 PUSHJ PP,WCHAR ;WRITE INTO SKELETON
\r
3755 MAC14A: PUSHJ PP,CHARAC ;GET NEXT CHARACTER
\r
3759 JRST MAC15 ;TEST FOR END OF LINE
\r
3761 JRST MAC14 ;YES, END OF LINE
\r
3763 MAC15: TLO IO,IORPTC
\r
3764 MAC16: MOVSI CS,(BYTE (7) 177,2)
\r
3765 PUSHJ PP,WWRXE ;WRITE END
\r
3769 SOJLE SX,MAC20 ;BRANCH IF NO MORE ARGS
\r
3770 JUMPGE SDEL,MAC10 ;HAVEN'T SEEN TERMINAL ")" YET
\r
3771 \fMAC20: TLZN IO,IORPTC
\r
3774 JUMPE SX,MAC21B ;NO MISSING ARGS
\r
3775 MAC21A: PUSH MP,[-1] ;FILL IN MISSING ARGS
\r
3776 SKIPN .TEMP ;ANY DEFAULT ARGS?
\r
3778 HRRZ C,.TEMP ;GET ARG COUNT
\r
3779 SUBI C,-1(SX) ;ACCOUNT FOR THOSE GIVEN
\r
3780 HRLZS C ;PUT IN LEFT HALF
\r
3781 HLRZ SDEL,.TEMP ;ADDRESS OF TABLE
\r
3782 MAC21D: SKIPN (SDEL) ;END OF LIST
\r
3784 XOR C,(SDEL) ;TEST FOR CORRECT ARG
\r
3785 TLNN C,-1 ;WAS IT?
\r
3787 XOR C,(SDEL) ;BACK THE WAY IT WAS
\r
3788 AOJA SDEL,MAC21D ;AND TRY AGAIN
\r
3790 MAC21E: MOVEM C,(MP) ;REPLACE -1 WITH TREE POINTER
\r
3791 AOS 1(C) ;INCREMENT REFERENCE
\r
3792 MAC21C: SOJG SX,MAC21A
\r
3793 MAC21B: PUSH MP,[0] ;SET TERMINAL
\r
3795 TLNN IO,IOSALL ;SUPPRESSING ALL?
\r
3797 JUMPN MRP,MAC27 ;IN MACRO?
\r
3798 CAIE C,";" ;NO,IN COMMENT?
\r
3800 MAC22: PUSHJ PP,CHARAC ;YES,GET IT INTO THE LBUF
\r
3801 CAIG C,CR ;LESS THAN CR?
\r
3802 CAIGE C,LF ;AND GREATER THAN LF?
\r
3803 JRST MAC22 ;NO GET ANOTHER
\r
3804 MAC26: HRLZI SX,70000 ;DECREMENT BYTE POINTER
\r
3809 MAC27: HRLI C,-1 ;SET FLAG
\r
3812 MAC23: MOVEI SX,"^"
\r
3813 JUMPAD MAC24 ;BRANCH IF ADDRESS FIELD
\r
3814 CAIN C,";" ;IF SEMI-COLON
\r
3815 SKIPE LITLVL ;AND NOT IN A LITERAL
\r
3816 JRST MAC24 ;NOT BOTH TRUE
\r
3817 JUMPN MRP,MAC24 ;OR IN A MACRO
\r
3818 PUSHJ PP,STOUT ;LIST COMMENT OR CR-LF
\r
3819 TLNE IO,IOPALL ;MACRO EXPANSION SUPPRESSION?
\r
3820 TLO IO,IOMAC ; NO, SET TEMP BIT
\r
3821 TDOA C,[-1] ;FLAG LAST CHARACTER
\r
3822 MAC24: DPB SX,LBUFP ;SET ^ INTO LINE BUFFER
\r
3823 MAC25: PUSH MP,MACPNT
\r
3826 PUSH MP,RCOUNT ;STACK WORD COUNT
\r
3827 PUSH MP,MRP ;STACK MACRO POINTER
\r
3828 POP PP,MRP ;SET NEW READ POINTER
\r
3831 HRRZS MACENL ;RESET "CALLM IN PROGRESS"
\r
3832 JUMPOC STMNT2 ;OP-CODE FIELD
\r
3833 JRST EVATOM ;ADDRESS FIELD
\r
3835 \fMAC30: MOVEI AC0,0 ;INITIALIZE BRACKET COUNTER
\r
3836 MAC31: PUSHJ PP,GCHAR ;GET A CHARACTER
\r
3838 ADDI AC0,1 ;YES, INCREMENT COUNT
\r
3840 SOJL AC0,MAC14A ;YES, EXIT IF MATCHING
\r
3841 PUSHJ PP,WCHAR ;WRITE INTO SKELETON
\r
3842 JRST MAC31 ;GO BACK FOR ANOTHER
\r
3844 MAC40: PUSH PP,SX ;STACK REGISTERS
\r
3846 HLLM IO,TAGINC ;SAVE IO FLAGS
\r
3847 PUSHJ PP,CELL ;GET AN ATOM
\r
3848 MOVE V,AC0 ;ASSUME NUMERIC
\r
3849 TLNE IO,NUMSW ;GOOD GUESS?
\r
3851 PUSHJ PP,SSRCH ;SEARCH THE SYMBOL TABLE
\r
3852 TROA ER,ERRX ;NOT FOUND, ERROR
\r
3853 MAC41: PUSHJ PP,MAC42 ;FORM ASCII STRING
\r
3854 HLL IO,TAGINC ;RESTORE IO FLAGS
\r
3857 TLO IO,IORPTC ;REPEAT LAST CHARACTER
\r
3858 JRST MAC14A ;RETURN TO MAIN SCAN
\r
3861 MAC44: LSHC C,-^D35
\r
3863 DIVI C,0(RX) ;DIVIDE BY CURRENT RADIX
\r
3865 JUMPE C,.+2 ;TEST FOR END
\r
3868 ADDI C,"0" ;FORM TEXT
\r
3869 JRST WCHAR ;WRITE INTO SKELETON
\r
3870 \fMACEN0: SOS MACENL
\r
3871 MACEND: SKIPGE C,MACENL ;TEST "CALLM IN PROGRESS"
\r
3872 AOS MACENL ;INCREMENT END LEVEL AND EXIT
\r
3875 POP MP,MRP ;RETRIEVE READ POINTER
\r
3876 POP MP,RCOUNT ;AND WORD COUNT
\r
3878 SKIPL 0(MP) ;TEST FLAG
\r
3879 PUSHJ PP,RSW2 ;MARK END OF SUBSTITUTION
\r
3882 SKIPA MP,MACPNT ;RESET MP AND SKIP
\r
3883 MACEN1: PUSHJ PP,REFDEC ;DECREMENT REFERENCE
\r
3884 MACEN2: AOS V,MACPNT ;GET POINTER
\r
3886 JUMPG V,MACEN1 ;IF >0, DECREMENT REFERENCE
\r
3887 JUMPL V,MACEN2 ;IF <0, BYPASS
\r
3888 POP MP,V ;IF=0, RETRIEVE POINTER
\r
3889 PUSHJ PP,REFDEC ;DECREMENT REFERENCE
\r
3893 SKIPN MACENL ;CHECK UNPROCESSED END LEVEL
\r
3894 JRST MACEN3 ;NONE TO PROCESS
\r
3895 TRNN MRP,-1 ;MRP AT END OF TEXT
\r
3896 JRST MACEN0 ;THEN POP THE MACRO STACK NOW
\r
3897 MACEN3: TRNN C,77400 ;SALL FLAG?
\r
3898 HRLI C,0 ;YES,TURN IT OFF
\r
3899 JUMPL C,REPEA8 ;IF FLAG SET SUBSTITUTE
\r
3901 \fIRP0: SKIPN MACLVL ;ARE WE IN A MACRO?
\r
3902 JRST ERRAX ;NO, BOMB OUT
\r
3903 IRP10: PUSHJ PP,MREADS ;YES, GET DATA SPEC
\r
3904 CAIE C,40 ;SKIP LEADING BLANKS
\r
3906 JRST IRP10 ;YES, BYPASS
\r
3909 CAIE C,177 ;NO, IS IT SPECIAL?
\r
3910 JRST ERRAX ;NO, ERROR
\r
3911 PUSHJ PP,MREADS ;YES
\r
3912 TRZN C,100 ;CREATED?
\r
3914 CAIL C,40 ;TOO BIG?
\r
3916 ADD C,MACPNT ;NO, FORM POINTER TO STACK
\r
3917 PUSH MP,IRPCF ;STACK PREVIOUS POINTERS
\r
3926 MOVEM AC0,IRPCF ;IRPC FLAG FOUND IN AC0
\r
3927 SETOM IRPSW ;RESET IRP SWITCH
\r
3933 JRST .-2 ;NO, SEARCH UNTIL FOUND
\r
3934 PUSHJ PP,SKELI1 ;INITIALIZE NEW STRING
\r
3935 MOVEM ARG,IRPPOI ;SET NEW POINTER
\r
3937 TDZA SDEL,SDEL ;ZERO BRACKET COUNT AND SKIP
\r
3938 IRP20: PUSHJ PP,WCHAR1
\r
3941 AOJA SDEL,IRP20 ;YES, INCREMENT COUNT AND WRITE
\r
3943 JRST IRP20 ;NO, JUST WRITE IT
\r
3944 SOJGE SDEL,IRP20 ;YES, WRITE IF NOT MATCHING
\r
3945 MOVE CS,[BYTE (7) 15,177,4]
\r
3946 PUSHJ PP,WWRXE ;WRITE END
\r
3947 PUSH MP,MRP ;STACK PREVIOUS READ POINTER
\r
3948 PUSH MP,RCOUNT ;AND WORD COUNT
\r
3950 JRST IRPPOP ;EXIT IF NOT VALID ARGUMENT
\r
3951 MOVEI C,1(CS) ;INITIALIZE POINTER
\r
3953 \fIRPSET: EXCH MRP,IRPARG ;SWAP READ POINTERS
\r
3954 MOVE SX,RCOUNT ;SWAP COUNT OF WORDS TO READ
\r
3957 PUSHJ PP,SKELI1 ;INITIALIZE SKELETON FOR DATA
\r
3958 HRRZM ARG,@IRPARP ;STORE NEW DS POINTER
\r
3959 SETZB SX,SDEL ;ZERO FOUND FLAG AND BRACKET COUNT
\r
3960 LDB C,MRP ;GET LAST CHAR
\r
3962 SKIPE IRPCF ;IN IRPC
\r
3964 MOVEI SX,1 ;FORCE ARGUMENT
\r
3965 IRPSE1: PUSHJ PP,MREADS
\r
3966 CAIE C,177 ;SPECIAL?
\r
3967 AOJA SX,IRPSE2 ;NO, FLAG AS FOUND
\r
3968 PUSHJ PP,PEEKM ;LOOK AT NEXT CHARACTER
\r
3969 SETZM IRPSW ;SET IRP SWITCH
\r
3970 JUMPG SX,IRPSE4 ;IF ARG FOUND, PROCESS IT
\r
3971 JRST IRPPOP ;NO, CLEAN UP AND EXIT
\r
3973 IRPSE2: SKIPE IRPCF ;IRPC?
\r
3974 JRST IRPSE3 ;YES, WRITE IT
\r
3975 CAIN C,"," ;NO, IS IT A COMMA?
\r
3976 JUMPE SDEL,IRPSE4 ;YES, EXIT IF NOT NESTED
\r
3978 ADDI SDEL,1 ;YES, INCREMENT COUNT
\r
3980 SUBI SDEL,1 ;YES, DECREMENT COUNT
\r
3982 IRPSE3: PUSHJ PP,WCHAR
\r
3983 SKIPN IRPCF ;IRPC?
\r
3984 JRST IRPSE1 ;NO, GET NEXT CHARACTER
\r
3986 IRPSE4: MOVSI CS,(BYTE (7) 177,2)
\r
3987 PUSHJ PP,WWRXE ;WRITE END
\r
3988 MOVEM MRP,IRPARG ;SAVE POINTER
\r
3989 MOVE MRP,RCOUNT ;SAVE COUNT
\r
3991 HRRZ MRP,IRPPOI ;SET FOR NEW SCAN
\r
3992 AOJA MRP,REPEA8 ;ON ARG COUNT
\r
3993 \fSTOPI0: SKIPN IRPARP ;IRP IN PROGRESS?
\r
3994 JRST ERRAX ;NO, ERROR
\r
3995 SETZM IRPSW ;YES, SET SWITCH
\r
3998 IRPEND: MOVE V,@IRPARP
\r
4000 SKIPE IRPSW ;MORE TO COME?
\r
4003 IRPPOP: MOVE V,IRPPOI
\r
4004 PUSHJ PP,REFDEC ;DECREMENT REFERENCE
\r
4006 POP MP,MRP ;RESTORE CELLS
\r
4015 \fGETDS: ;GET DUMMY SYMBOL NUMBER
\r
4016 MOVE CS,C ;USE CS FOR WORK REGISTER
\r
4018 ADD CS,MACPNT ;ADD BASE ADDRESS
\r
4019 MOVE V,0(CS) ;GET POINTER FLAG
\r
4020 JUMPG V,GETDS1 ;BRANCH IF POINTER
\r
4021 TRNN C,40 ;NOT POINTER, SHOULD WE CREATE?
\r
4022 JRST RSW0 ;NO, FORGET THIS ARG
\r
4024 PUSH PP,MWP ;STACK MACRO WRITE POINTER
\r
4025 PUSH PP,WCOUNT ;SAVE WORD COUNT
\r
4026 PUSHJ PP,SKELI1 ;INITIALIZE SKELETON
\r
4027 MOVEM ARG,0(CS) ;STORE POINTER
\r
4028 MOVE CS,[BYTE (7) 0,170,170,170,171] ;CREATE A SYMBOL
\r
4029 ADD CS,LSTSYM ;LSTSYM= # OF LAST CREATED
\r
4030 TDZ CS,[BYTE (7) 0,170,170,170,170]
\r
4032 IOR CS,[ASCII /.0000/]
\r
4035 PUSHJ PP,WWORD ;WRITE INTO SKELETON
\r
4036 MOVSI CS,(BYTE (7) 177,2)
\r
4037 PUSHJ PP,WWRXE ;WRITE END CODE
\r
4038 POP PP,WCOUNT ;RESTORE WORD COUNT
\r
4039 POP PP,MWP ;RESTORE MACRO WRITE POINTER
\r
4041 MOVE V,ARG ;SET UP FOR REFINC
\r
4043 GETDS1: PUSHJ PP,REFINC ;INCREMENT REFERENCE
\r
4044 HRL V,RCOUNT ;SAVE WORD COUNT
\r
4045 PUSH MP,V ;STACK V FOR DECREMENT
\r
4046 PUSH MP,MRP ;STACK READ POINTER
\r
4047 MOVEI MRP,1(V) ;FORM READ POINTER
\r
4052 HLREM V,RCOUNT ;RESTORE WORD COUNT
\r
4053 HRRZS V ;CLEAR COUNT
\r
4054 PUSHJ PP,REFDEC ;DECREMENT REFERENCE
\r
4056 \fSKELI1: MOVEI ARG,1 ;ENTRY FOR SINGLE ARG
\r
4057 SKELI: SETZ MWP, ;SIGNAL FIRST TIME THROUGH
\r
4058 PUSHJ PP,SKELWL ;GET POINTER WORD
\r
4059 HRRZM MWP,WWRXX ;SAVE FIRST ADDRESS
\r
4060 HRRZM MWP,LADR ;SAVE START OF LINKED LIST
\r
4061 HRRZM ARG,1(MWP) ;STORE COUNT
\r
4062 SOS WCOUNT ;ACCOUNT FOR WORD
\r
4063 HRRZ ARG,WWRXX ;SET FIRST ADDRESS
\r
4064 ADDI MWP,2 ;BUMP POINTER
\r
4065 HRLI MWP,(POINT 7) ;SET FOR 5 ASCII BYTES
\r
4066 ;SKELW RETURNS WITH ADR OF NEXT FREE LOC IN V (RIGHT)
\r
4068 SKELW: SOSLE WCOUNT ;STILL SOME SPACE IN LEAF?
\r
4069 POPJ PP, ;YES, RETURN
\r
4070 SKELWL: SKIPE V,NEXT ;GET FIRST FREE ADDRESS
\r
4071 JRST SKELW1 ;IF NON-ZERO, UPDATE FREE
\r
4072 MOVE V,FREE ;GET FREE
\r
4073 ADDI V,.LEAF ;INCREMENT BY LEAF SIZE
\r
4074 CAML V,SYMBOL ;OVERFLOW?
\r
4075 PUSHJ PP,XCEED ;YES, BOMB OUT
\r
4076 EXCH V,FREE ;UPDATE FREE
\r
4077 SETZM (V) ;CLEAR LINK
\r
4079 SKELW1: HLL V,0(V) ;GET ADDRESS
\r
4080 HLRM V,NEXT ;UPDATE NEXT
\r
4081 SKIPE MWP ;IF FIRST TIME
\r
4082 HRLM V,1-.LEAF(MWP) ;STORE LINK IN FIRST WORD OF LEAF
\r
4083 MOVEI MWP,.LEAF ;SIZE OF LEAF
\r
4084 MOVEM MWP,WCOUNT ;STORE FOR COUNT DOWN
\r
4085 MOVEI MWP,(V) ;SET UP WRITE POINTER
\r
4086 TLO MWP,(POINT 7,,21) ;2 ASCII CHARS
\r
4089 ;WWRXX POINTS TO END OF TREE
\r
4090 ;MWP IDPB POINTER TO NEXT HOLE
\r
4091 ;NEXT FIRST OF A LINKED PORTION THAT IS NOT BEING USED (LEAVES)
\r
4092 ;FREE POINTS TO FREE CORE BETWEEN TREE AND SYM-TABLE
\r
4093 ;LADR POINTS TO BEG OF LINKED PORTION.
\r
4094 \fGCHARQ: JUMPN MRP,MREADS ;IF GETTING CHAR. FROM TREE
\r
4095 GCHAR: PUSHJ PP,CHARAC ;GET ASCII CHARACTER
\r
4096 CAIG C,FF ;TEST FOR LF, VT OR FF
\r
4099 JRST OUTIM1 ;YES, LIST IT
\r
4103 WCHAR1: TLNN MWP,760000 ;END OF WORD?
\r
4104 PUSHJ PP,SKELW ;YES, GET ANOTHER
\r
4105 IDPB C,MWP ;STORE CHARACTER
\r
4108 WWORD: LSHC C,7 ;MOVE ASCII INTO C
\r
4109 PUSHJ PP,WCHAR1 ;STORE IT
\r
4110 JUMPN CS,WWORD ;TEST FOR END
\r
4111 POPJ PP, ;YES, EXIT
\r
4113 WWRXE: PUSHJ PP,WWORD ;WRITE LAST WORD
\r
4114 ADD MWP,WCOUNT ;GET TO END OF LEAF
\r
4115 SUBI MWP,.LEAF ;NOW POINT TO START OF IT
\r
4116 HRRZS (MWP) ;ZERO LEFT HALF OF LAST LEAF
\r
4117 HRRM MWP,@WWRXX ;SET POINTER TO END
\r
4119 \fMREAD: PUSHJ PP,MREADS ;READ ONE CHARACTER
\r
4120 CAIE C,177 ;SPECIAL?
\r
4121 JRST RSW1 ;NO, EXIT
\r
4122 PUSHJ PP,MREADS ;YES, GET CODE WORD
\r
4123 TRZE C,100 ;SYMBOL?
\r
4125 CAILE C,4 ;POSSIBLY ILLEGAL
\r
4127 HRRI MRP,0 ;NO, SIGNAL END OF TEXT
\r
4130 JRST MACEND ;1; END OF MACRO
\r
4131 JRST DSEND ;2; END OF DUMMY SYMBOL
\r
4132 JRST REPEND ;3; END OF REPEAT
\r
4133 JRST IRPEND ;4; END OF IRP
\r
4135 MREADI: HRLI MRP,700 ;SET UP BYTE POINTER
\r
4136 MOVEI C,.LEAF-1 ;NUMBER OF WORDS
\r
4138 MREADS: TLNN MRP,-1 ;FIRST TIME HERE?
\r
4139 JRST MREADI ;YES, SET UP MRP AND RCOUNT
\r
4140 TLNN MRP,760000 ;HAVE WE FINISHED WORD?
\r
4141 SOSLE RCOUNT ;YES, STILL ROOM IN LEAF?
\r
4142 JRST MREADC ;STILL CHAR. IN LEAF
\r
4143 HLRZ MRP,1-.LEAF(MRP);YES, GET LINK
\r
4144 HRLI MRP,(POINT 7,,21) ;SET POINTER
\r
4145 MOVEI C,.LEAF ;RESET COUNT
\r
4147 MREADC: ILDB C,MRP ;GET CHARACTER
\r
4150 PEEK: JUMPN MRP,PEEKM ;THIS IS A MACRO READ
\r
4151 PUSHJ PP,CHARAC ;READ AN ASCII CHAR.
\r
4152 TLO IO,IORPTC ;REPEAT FOR NEXT
\r
4153 POPJ PP, ;AND RETURN
\r
4155 PEEKM: PUSH PP,MRP ;SAVE MACRO READ POINTER
\r
4156 PUSH PP,RCOUNT ;SAVE WORD COUNT
\r
4157 PUSHJ PP,MREADS ;READ IN A CHAR.
\r
4158 POP PP,RCOUNT ;RESTORE WORD COUNT
\r
4159 POP PP,MRP ;RESET READ POINTER
\r
4160 POPJ PP, ;IORPTC IS NOT SET
\r
4161 \fREFINC: MOVEI CS,1(V) ;GET POINTER TO TREE
\r
4162 AOS 0(CS) ;INCREMENT REFERENCE
\r
4165 REFDEC: JUMPLE V,DECERR ;CATASTROPHIC ERROR SOMEWHERE
\r
4166 MOVEI CS,1(V) ;GET POINTER TO TREE
\r
4167 SOS CS,0(CS) ;DECREMENT REFERENCE
\r
4168 TRNE CS,000777 ;IS IT ZERO?
\r
4169 POPJ PP, ;NO, EXIT
\r
4170 HRRZ CS,0(V) ;YES, GET POINTER TO END
\r
4171 HRL CS,NEXT ;GET POINTER TO NEXT RE-USABLE
\r
4172 HLLM CS,0(CS) ;SET LINK
\r
4173 HRRM V,NEXT ;RESET NEXT
\r
4176 DECERR: MOVE AC0,CALNAM ;GET MACRO NAME
\r
4177 MOVSI RC,[SIXBIT /ERROR WHILE EXPANDING@/]
\r
4179 JRST ERRNE2 ;COMMON MESSAGE
\r
4180 \fA== 0 ;ASCII MODE
\r
4181 AL== 1 ;ASCII LINE MODE
\r
4182 IB== 13 ;IMAGE BINARY MODE
\r
4183 B== 14 ;BINARY MODE
\r
4184 DMP==16 ;DUMP MODE
\r
4186 CTL== 0 ;CONTROL DEVICE NUMBER
\r
4187 IFN CCLSW,<CTL2==4 ;INPUT DEV FOR CCL FILE>
\r
4188 BIN== 1 ;BINARY DEVICE NUMBER
\r
4189 CHAR== 2 ;INPUT DEVICE NUMBER
\r
4190 LST== 3 ;LISTING DEVICE NUMBER
\r
4192 ; COMMAND STRING ACCUMULATORS
\r
4196 ACEXT== 3 ;EXTENSION
\r
4198 ACDEL== 4 ;DELIMITER
\r
4199 ACPNTR==5 ;BYTE POINTER
\r
4207 DIRBIT==4 ;DIRECTORY DEVICE
\r
4211 DISBIT==2000 ;DISPLAY
\r
4212 CONBIT==20000 ;CONTROLING TTY
\r
4213 LPTBIT==40000 ;LPT
\r
4214 DSKBIT==200000 ;DSK
\r
4216 ;GETSTS ERROR BITS
\r
4218 IOIMPM==400000 ;IMPROPER MODE (WRITE LOCK)
\r
4219 IODERR==200000 ;DEVICE DATA ERROR
\r
4220 IODTER==100000 ;CHECKSUM OR PARITY ERROR
\r
4221 IOBKTL== 40000 ;BLOCK TOO LARGE
\r
4222 ERRBIT==IOIMPM!IODERR!IODTER!IOBKTL
\r
4225 \fSUBTTL I/O ROUTINES
\r
4227 IFN CCLSW,<TLZA IO,ARPGSW ;DON'T ALLOW RAPID PROGRAM GENERATION
\r
4228 TLO IO,ARPGSW ;ALLOW RAPID PROGRAM GENERATION>
\r
4229 HRRZ MRP,JOBREL ;GET LOWSEG SIZE
\r
4230 MOVEM MRP,MACSIZ ;SAVE CORE SIZE
\r
4231 ;DECODE VERSION NUMBER
\r
4232 MOVEI PP,JOBFFI ;TEMP PUSH DOWN STACK
\r
4233 PUSH PP,[0] ;MARK BOTTOM OF STACK
\r
4234 LDB 0,[POINT 3,JOBVER,2] ;GET USER BITS
\r
4235 JUMPE 0,GETE ;NOT SET IF ZERO
\r
4236 ADDI 0,"0" ;FORM NUMBER
\r
4237 PUSH PP,0 ;STACK IT
\r
4238 MOVEI 0,"-" ;SEPARATE BY HYPHEN
\r
4239 PUSH PP,0 ;STACK IT ALSO
\r
4240 GETE: HRRZ 0,JOBVER ;GET EDIT NUMBER
\r
4241 JUMPE 0,GETU ;SKIP ALL THIS IF ZERO
\r
4242 MOVEI 1,")" ;ENCLOSE IN PARENS.
\r
4244 GETED: IDIVI 0,8 ;GET OCTAL DIGITS
\r
4245 ADDI 1,"0" ;MAKE ASCII
\r
4246 PUSH PP,1 ;STACK IT
\r
4247 JUMPN 0,GETED ;LOOP TIL DONE
\r
4248 MOVEI 0,"(" ;OTHER PAREN.
\r
4250 GETU: LDB 0,[POINT 6,JOBVER,17] ;UPDATE NUMBER
\r
4251 JUMPE 0,GETV ;SKIP IF ZERO
\r
4252 IDIVI 0,8 ;MIGHT BE TWO DIGITS
\r
4253 ADDI 1,"@" ;FORM ALPHA
\r
4255 JUMPN 0,GETU+1 ;LOOP IF NOT DONE
\r
4256 GETV: LDB 0,[POINT 9,JOBVER,11] ;GET VERSION NUMBER
\r
4257 IDIVI 0,8 ;GET DIGIT
\r
4258 ADDI 1,"0" ;TO ASCII
\r
4260 JUMPN 0,GETV+1 ;LOOP
\r
4261 MOVE 1,[POINT 7,VBUF+1,13] ;POINTER TO DEPOSIT IN VBUF
\r
4262 POP PP,0 ;GET CHARACTER
\r
4263 IDPB 0,1 ;DEPOSIT IT
\r
4264 JUMPN 0,.-2 ;KEEP GOING IF NOT ZERO
\r
4266 TLZA IO,CRPGSW ;SET TO INIT NEW COMMAND FILE
\r
4267 M: TLNN IO,CRPGSW ;CURRENTLY DOING RPG?>
\r
4269 RESET ;INITIALIZE PROGRAM
\r
4270 SETZM BINDEV ;CLEAR INCASE NOT USED NEXT TIME
\r
4271 SETZM LSTDEV ;SAME REASON
\r
4272 SETZM INDEV ;INCASE OF ERROR
\r
4273 HRRZ MRP,MACSIZ ;GET INITIAL SIZE
\r
4274 CORE MRP, ;BACK TO ORIGINAL SIZ4
\r
4275 JFCL ;SHOULD NEVER FAIL
\r
4277 MOVE [XWD PASS1I,PASS1I+1]
\r
4278 BLT PASS2X-1 ;ZERO THE PASS1 AND PASS2 VARIABLES
\r
4279 MOVEI PP,JOBFFI ;SET TEMP PUSH-DOWN POINTER
\r
4280 MOVE CS,[POINT 7,DBUF,6] ;INITIALIZE FOR DATE
\r
4281 MSTIME 2, ;GET TIME FROM MONITOR
\r
4282 PUSHJ PP,TIMOUT ;TIME FORMAT OUTPUT
\r
4284 IBP CS ;PASS OVER PRESET SPACE
\r
4285 PUSHJ PP,DATOUT ;DATE FORMAT OUTPUT
\r
4286 MOVSI FR,P1!CREFSW
\r
4287 IFN CCLSW,<TLNE IO,CRPGSW ;RPG IN PROGRESS?
\r
4288 JRST GOSET ;YES, GO READ NEXT COMMAND
\r
4289 TLNE IO,ARPGSW ;NO, RPG ALLOWED?
\r
4290 JRST RPGSET ;YES, GO TRY
\r
4291 CTLSET: RELEASE CTL2, ;IN CASE OF LOOKUP FAILURE>
\r
4292 IFE CCLSW,<CTLSET:>
\r
4293 MOVSI IO,IOPALL ;ZERO FLAGS
\r
4294 INIT CTL,AL ;INITIALIZE USER CONSOLE
\r
4297 EXIT ;NO TTY, NO ASSEMBLY
\r
4298 MOVSI C,(SIXBIT /TTY/)
\r
4299 DEVCHR C, ;GET CHARACTERISTICS
\r
4300 TLNN C,10 ;IS IT REALLY A TTY
\r
4302 INBUF CTL,1 ;INITIALIZE SINGLE CONTROL
\r
4303 OUTBUF CTL,1 ;BUFFERS
\r
4304 PUSHJ PP,CRLF ;OUTPUT CARRIAGE RETURN - LINE FEED
\r
4309 \fIFN CCLSW,<JRST BINSET ;BEGIN WITH BINARY FILE
\r
4312 INIT CTL2,AL ;LOOK FOR DISK
\r
4315 JRST CTLSET ;DSK NOT THERE
\r
4317 HRLZI 3,(SIXBIT /MAC/) ;###MAC
\r
4319 PJOB AC1, ;RETURNS JOB NO. TO AC1
\r
4320 RPGLUP: IDIVI AC1,12 ;CONVERT
\r
4321 ADDI AC2,"0"-40 ;SIXBITIZE IT
\r
4323 SOJG 0,RPGLUP ;3 TIMES
\r
4324 MOVEM 3,CTLBUF ;###MAC
\r
4325 HRLZI (SIXBIT /TMP/) ;
\r
4326 MOVEM CTLBUF+1 ;TMP
\r
4327 SETZM CTLBUF+3 ;PROG-PRO
\r
4328 LOOKUP CTL2,CTLBUF ;COMMAND FILE
\r
4329 JRST CTLSET ;NOT THERE
\r
4330 HLRM EXTMP ;SAVE THE EXTENSION
\r
4332 RPGS2: INBUF CTL2,1 ;SINGLE BUFFERED
\r
4333 RPGS2A: INIT CTL,AL ;TTY FOR CONSOLE MESSAGES
\r
4336 EXIT ;NO TTY, NO ASSEMBLY
\r
4337 OUTBUF CTL,1 ;SINGLE BUFFERED
\r
4338 MOVE JOBFF ;REMEMBER WHERE BINARY BUFFERS BEGIN
\r
4340 HRRZ JOBREL ;TOP OF CORE
\r
4341 CAMLE MACSIZ ;SEE IF IT HAS GROWN
\r
4342 MOVEM MACSIZ ;PREVENTS ADDRESS CHECK ON EXIT
\r
4343 TLNE IO,CRPGSW ;ARE WE ALREADY IN RPG MODE?
\r
4344 JRST M ;MUST HAVE COME FROM @ COMMAND, RESET
\r
4346 \fGOSET: MOVSI IO,IOPALL!CRPGSW ;SET INITIAL FLAGS
\r
4347 MOVEI CS,CTLSIZ ;MAXIMUM CHARS IN A LINE
\r
4348 MOVE AC1,CTLBLK+2 ;NUMBER OF CHARACTERS
\r
4349 MOVEM AC1,CTIBUF+2 ;SAVE FOR PASS 2
\r
4350 MOVE AC1,[POINT 7,CTLBUF] ;WHERE TO STASH CHARS
\r
4351 MOVEM AC1,CTIBUF+1 ;...
\r
4352 GOSET1: SOSG CTLBLK+2 ;ANY MORE CHARS?
\r
4353 PUSHJ PP,[IN CTL2, ;READ ANOTHER BUFFERFUL
\r
4354 POPJ PP, ;EVERYTHING OK, RETURN
\r
4355 STATO CTL2,20000 ;EOF?
\r
4356 JRST [HRROI RC,[SIXBIT /ERROR READING COMMAND FILE@/]
\r
4357 JRST ERRFIN] ;GO COMPLAIN
\r
4358 PUSHJ PP,DELETE ;CMD FILE
\r
4359 EXIT] ;EOF AND FINISHED
\r
4360 ILDB C,CTLBLK+1 ;GET NEXT CHAR
\r
4361 MOVE RC,@CTLBLK+1 ;CHECK FOR SEQUENCE NUMBERS
\r
4363 JRST [AOS CTLBLK+1 ;SKIP OVER ANOTHER 5 CHARS
\r
4365 ADDM RC,CTLBLK+2 ;...
\r
4366 JRST GOSET1 ] ;GO READ ANOTHER CHAR
\r
4367 JUMPE C,GOSET1 ;IGNORE NULLS
\r
4368 IDPB C,CTIBUF+1 ;STASH AWAY
\r
4369 AOS CTIBUF+2 ;INCREMENT CHAR. COUNT
\r
4370 CAIE C,12 ;LINE FEED OR
\r
4371 CAIN C,175 ;ALTMODE?
\r
4372 JRST GOSET2 ;YES, FINISHED WITH COMMAND
\r
4375 JRST GOSET2 ;ALTMODE.
\r
4376 SOJG CS,GOSET1 ;GO READ ANOTHER
\r
4377 HRROI RC,[SIXBIT /COMMAND LINE TOO LONG@/]
\r
4378 JRST ERRFIN ;GO COMPLAIN
\r
4379 GOSET2: MOVEI C,12 ;MAKE SURE THERE'S A LF
\r
4380 IDPB C,CTIBUF+1 ;...
\r
4381 MOVEM AC1,CTIBUF+1 ;SET POINTER TO BEGINNING
\r
4382 AOS CTIBUF+2 ;ADD I TO COUNT
\r
4383 MOVE SAVFF ;RESET JOBFF FOR NEW BINARY
\r
4387 RPGS1: PUSHJ PP,DELETE ;DELETE COMMAND FILE
\r
4388 MOVEM ACDEV,RPGDEV ;GET SET TO INIT
\r
4389 OPEN CTL2,RPGINI ;DO IT
\r
4391 MOVEM ACFILE,INDIR ;USE INPUT BLOCK
\r
4392 MOVEM ACPPN,INDIR+3 ;SET PPN
\r
4393 MOVEM ACEXT,INDIR+1
\r
4395 JRST [JUMPN ACEXT,RPGLOS ;GIVE UP ,EXPLICIT EXTENSION
\r
4396 MOVSI ACEXT,(SIXBIT /CCL/) ;IF BLANK TRY CCL
\r
4398 HLRM ACEXT,EXTMP ;SAVE THE EXTENSION
\r
4399 HLRZ JOBSA ;RESET JOBFF TO ORIGINAL
\r
4401 TLO IO,CRPGSW ;TURN ON SWITCH SO WE RESET WORLD
\r
4402 JRST RPGS2 ;AND GO
\r
4403 RPGLOS: RELEAS CTL2,0
\r
4404 TLZ IO,CRPGSW ;STOPS IO TO UNASGD CHAN
\r
4405 JRST ERRCF ;NO FILE FOUND
\r
4407 \fBINSET: PUSHJ PP,NAME1 ;GET FIRST NAME
\r
4408 IFN CCLSW,<CAIN C,"!" ;WAS THIS AN IMPERATIVE?
\r
4409 JRST NUNSET ;GET THEE TO A NUNNERY
\r
4410 CAIN C,"@" ;CHEK FOR A NEW RPG FILE
\r
4412 TLNN FR,CREFSW ;CROSS REF REQUESTED?
\r
4413 JRST LSTSE1 ;YES, SKIP BINARY
\r
4414 CAIN C,"," ;COMMA?
\r
4415 JUMPE ACDEV,LSTSET ;YES, SKIP BINARY IF NO DEVICE SPECIFIED
\r
4416 CAIN C,"_" ;LEFT ARROW?
\r
4417 JUMPE ACDEV,LSTSE1 ;YES, SKIP BINARY IF NO DEVICE SPECIFIED
\r
4418 JUMPE ACDEV,M ;IGNORE IF JUST <CR-LF>
\r
4419 TLO FR,PNCHSW ;OK, SET SWITCH
\r
4420 MOVEM ACDEV,BINDEV ;STORE DEVICE NAME
\r
4421 MOVEM ACFILE,BINDIR ;STORE FILE NAME IN DIRECTORY
\r
4422 JUMPN ACEXT,.+2 ;EXTENSION SPECIFIED?
\r
4423 MOVSI ACEXT,(SIXBIT /REL/) ;NO, ASSUME RELOCATABLE BINARY
\r
4424 MOVEM ACEXT,BINDIR+1 ;STORE IN DIRECTORY
\r
4425 MOVEM ACPPN,BINDIR+3 ;SET PPN
\r
4426 OPEN BIN,BININI ;INITIALIZE BINARY
\r
4428 TLZE TIO,TIOLE ;SKIP TO EOT
\r
4430 TLZE TIO,TIORW ;REWIND REQUESTED?
\r
4432 JUMPGE CS,BINSE2 ;BRANCH IF NO BACK-SPACE
\r
4433 MTAPE BIN,17 ;BACK-SPACE A FILE
\r
4434 AOJL CS,.-1 ;TEST FOR END
\r
4436 STATO BIN,1B24 ;LOAD POINT?
\r
4437 MTAPE BIN,16 ;NO, GO FORWARD ONE
\r
4438 BINSE2: SOJG CS,.-1 ;TEST FORWARD SPACING
\r
4440 TLNE TIO,TIOCLD ;DIRECTORY CLEAR REQUESTED?
\r
4441 UTPCLR BIN, ;YES, CLEAR IT
\r
4442 OUTBUF BIN,2 ;SET UP TWO RING BUFFER
\r
4444 JRST GETSET ;NO LISTING
\r
4445 \fLSTSET: PUSHJ PP,NAME1 ;GET NEXT DEVICE
\r
4446 LSTSE1: CAIE C,"_"
\r
4448 TLNE FR,CREFSW ;CROSS-REF REQUESTED?
\r
4449 JRST LSTSE2 ;NO, BRANCH
\r
4450 JUMPN ACDEV,.+2 ;YES, WAS DEVICE SPECIFIED?
\r
4451 MOVSI ACDEV,(SIXBIT /DSK/) ;NO, ASSUME DSK
\r
4453 MOVE ACFILE,[SIXBIT /CREF/]
\r
4455 MOVSI ACEXT,(SIXBIT /CRF/)
\r
4456 LSTSE2: JUMPE ACDEV,GETSET ;FORGET LISTING IF NO DEVICE SPECIFIED
\r
4458 DEVCHR AC0, ;GET CHARACTERISTICS
\r
4459 TLNE AC0,LPTBIT!DISBIT!TTYBIT
\r
4460 TLNE FR,CREFSW ; WAS CROSS-REF REQUESTED?
\r
4461 AOSA OUTSW+0*TTYSW ;NO, ASSUME TTY
\r
4462 JRST ERRCM ;YES, ERROR - CREF DEV MUST NOT BE LPT, DIS, OR TTY
\r
4463 TLNE AC0,CONBIT ;CONTROLING TELETYPE LISTING?
\r
4464 JRST GETSET ;YES, BUFFER ALREADY SET
\r
4465 MOVEM ACDEV,LSTDEV ;STORE DEVICE NAME
\r
4466 AOS OUTSW+0*LPTSW ;SET FOR LPT
\r
4467 MOVEM ACFILE,LSTDIR ;STORE FILE NAME
\r
4469 MOVSI ACEXT,(SIXBIT /LST/)
\r
4470 MOVEM ACEXT,LSTDIR+1
\r
4471 MOVEM ACPPN,LSTDIR+3 ;SET PPN
\r
4472 OPEN LST,LSTINI ;INITIALIZE LISTING OUTPUT
\r
4476 TLZE TIO,TIORW ;REWIND REQUESTED?
\r
4484 LSTSE3: SOJG CS,.-1
\r
4485 TLNE TIO,TIOCLD ;DIRECTORY CLEAR REQUESTED?
\r
4486 UTPCLR LST, ;YES, CLEAR IT
\r
4487 OUTBUF LST,2 ;SET UP A TWO RING BUFFER
\r
4488 \fGETSET: MOVEI 3,PDPERR
\r
4489 HRRM 3,JOBAPR ;SET TRAP LOCATION
\r
4490 MOVEI 3,1B19 ;SET FOR PUSH-DOWN OVERFLOW
\r
4492 SOS 3,PDP ;GET PDP REQUEST MINUS 1
\r
4493 IMULI 3,.PDP ;COMPUTE SIZE (50*<NUMBER OF /P'S +1>)
\r
4495 HRR MP,JOBFF ;SET BASIC POINTER
\r
4498 MOVEM PP,RP ;SET RP
\r
4500 ASH 3,1 ;DOUBLE SIZE OF BASIC POINTER
\r
4502 SUBM PP,3 ;COMPUTE TOP LOCATION
\r
4503 IFN UNIVR,<SKIPN UNITOP ;IF ANY UNIVERSALS HAVE BEEN SEEN
\r
4505 HRRZS 3 ;GET TOP OF BUFFERS AND STACKS
\r
4506 CAMLE 3,UNISIZ ;HOPE ITS NOT BIGGER THAN UNIVERSAL ONE
\r
4507 JRST UNIERR ;IT WAS, YOU LOSE
\r
4508 SKIPA 3,UNITOP ;DON'T LOSE THEM
\r
4509 GETSE0: HRRZM 3,UNISIZ ;STORE UNTIL A UNIVERSAL IS SEEN>
\r
4510 HRRZM 3,LADR ;SET START OF MACRO TREE
\r
4513 GETSE1: HRRZ JOBREL
\r
4515 MOVEM SYMTOP ;SET TOP OF SYMBOL TABLE
\r
4516 SUBI LENGTH ;SET POINTER FOR INITIAL SYMBOLS
\r
4517 CAMLE LADR ;HAVE WE ROOM?
\r
4520 HRRZ 2,JOBREL ;NO, TRY FOR MORE CORE
\r
4523 JRST XCEED2 ;NO MORE, INFORM USER
\r
4524 JRST GETSE1 ;TRY AGAIN
\r
4526 GETSE2: MOVEM SYMBOL ;SET START OF SYMBOL TABLE
\r
4528 BLT @SYMTOP ;STORE SYMBOLS
\r
4529 PUSHJ PP,SRCHI ;INITIALIZE TABLE
\r
4530 MOVE [XWD CTIBUF+1,CTLSAV] ;SAVE CONTROL INPUT BUFFER
\r
4531 BLT CTLS1 ;FOR RESCAN ON PASS 2
\r
4532 IFN FTDISK,<MOVSI (SIXBIT /DSK/) ;SET INPUT TO TAKE DSK AS DEV
\r
4534 PUSHJ PP,COUTI ;INIT OUTPUT JUST IN CASE
\r
4535 PUSHJ PP,INSET ;GET FIRST INPUT FILE
\r
4537 IFN CCLSW,<TLNE IO,CRPGSW ;BUT ONLY IF DOING RPG
\r
4538 TTCALL 3,[ASCIZ /MACRO: /] ;PUBLISH COMPILER NAME>
\r
4539 MOVE CS,INDIR ;SET UP NAME OF FIRST FILE
\r
4540 MOVEM CS,LSTFIL ;AS LAST PRINTED
\r
4542 JRST ASSEMB ;START ASSEMBLY
\r
4543 \fFINIS: CLOSE BIN, ;DUMP BUFFER
\r
4544 TLNE FR,PNCHSW ;PUNCH REQUESTED?
\r
4545 PUSHJ PP,TSTBIN ;YES, TEST FOR ERRORS
\r
4548 SOSLE OUTSW+0*LPTSW ;LPT TYPE OUTPUT?
\r
4549 PUSHJ PP,TSTLST ;YES, TEST FOR ERRORS
\r
4552 OUTPUT CTL,0 ;FLUSH TTY OUTPUT
\r
4553 IFN UNIVR,<SKIPE UNIVSN ;SKIP IF NOT ASSEMBLING UNIVERSAL
\r
4554 PUSHJ PP,UNISYM ;STORE SYMBOLS ETC. FIRST>
\r
4555 JRST M ;RETURN FOR NEXT ASSEMBLY
\r
4556 \fINSET: MOVEI JOBFFI ;POINTER TO INPUT BUFFER
\r
4557 HRRM JOBFF ;INFORM SYSTEM OF BUFFER AREA
\r
4558 PUSHJ PP,NAME2 ;GET NEXT COMMAND NAME
\r
4559 JUMPE ACDEV,ERRNE ;ERROR IF NONE LEFT
\r
4560 MOVEM ACDEV,INDEV ;STORE DEVICE
\r
4561 MOVEM ACFILE,INDIR ;STORE FILE IN DIRECTORY
\r
4562 MOVEM ACPPN,INDIR+3 ;STORE PPN BEFORE WE LOSE IT
\r
4565 DEVCHR ACDEV, ;TEST CHARACTERISTICS
\r
4566 TLNN ACDEV,MTABIT ;MAG TAPE?
\r
4568 TLZN FR,MTAPSW ;FIRST MAG TAPE IN PASS 2?
\r
4570 TLNN TIO,TIORW ;YES, REWIND REQUESTED?
\r
4571 SUB CS,RECCNT ;NO, PREPARE TO BACK-SPACE TAPE
\r
4572 INSET1: AOS RECCNT ;INCREMENT FILE COUNTER
\r
4573 ADDM CS,RECCNT ;UPDATE COUNT
\r
4576 TLZE TIO,TIORW ;REWIND?
\r
4585 INSET2: SOJGE CS,.-1
\r
4587 INSET3: INBUF CHAR,1
\r
4588 MOVEI ACPNTR,JOBFFI
\r
4590 SUBI ACPNTR,JOBFFI
\r
4591 MOVEI ACDEL,NUMBUF*203+1
\r
4593 INBUF CHAR,(ACDEL)
\r
4594 JUMPN ACEXT,INSET4 ;TAKE USER'S EXTENSION IF NON-BLANK
\r
4595 MOVSI ACEXT,(SIXBIT /MAC/) ;BLANK, TRY .MAC FIRST
\r
4597 INSET4: PUSHJ PP,INSETI
\r
4598 JUMPE ACEXT,ERRCF ;ERROR IF ZERO
\r
4599 TLNE ACDEV,TTYBIT ;TELETYPE?
\r
4600 SETSTS CHAR,AL ;YES, CHANGE TO ASCII LINE
\r
4601 \f ;DO ALL ENTERS HERE FOR LEVEL D
\r
4602 SKIPE ENTERS ;HAVE ENTERS BEEN DONE ALREADY?
\r
4603 JRST ENTRDN ;YES, DON'T DO TWICE
\r
4604 SKIPN ACEXT,LSTDEV ;IS THERE A LIST DEVICE?
\r
4605 JRST LSTSE5 ;NO SO DON'T DO ENTER
\r
4606 SKIPN ACFILE,LSTDIR ;GET FILE NAME INCASE OF ERROR
\r
4607 JRST [DEVCHR ACEXT,
\r
4608 TLNE ACEXT,DIRBIT ;DOES IT HAVE A DIRECTORY?
\r
4609 JRST LSTSE4 ;YES, GIVE UP BEFORE HARM IS DONE
\r
4610 SKIPE ACFILE,INDIR ;USE INPUT FILE NAME
\r
4611 MOVEM ACFILE,LSTDIR ;TOO BAD IF ZERO ALSO
\r
4613 HLLZ ACEXT,LSTDIR+1 ;EXT ALSO
\r
4614 MOVE ACPPN,LSTDIR+3 ;SAVE PPN
\r
4615 LOOKUP LST,LSTDIR ;PREVIOUS ONE STILL THERE
\r
4617 SETZM LSTDIR ;YES,CLEAR NAME
\r
4618 MOVEM ACPPN,LSTDIR+3 ;RESET PPN
\r
4620 CLOSE LST, ;IGNORE FAILURE
\r
4621 MOVEM ACFILE,LSTDIR ;RESTORE NAME
\r
4622 HLLZS LSTDIR+1 ;BH 11/19/74 FOR DATE75. CLEAR RH.
\r
4623 SETZM LSTDIR+2 ;CLEAR PROTECTION AND DATE
\r
4624 MOVEM ACPPN,LSTDIR+3 ;SET PPN AGAIN
\r
4626 ENTER LST,LSTDIR ;SET UP DIRECTORY
\r
4628 LSTSE5: SKIPN ACEXT,BINDEV ;A BINARY DEVICE THEN ?
\r
4630 SKIPN ACFILE,BINDIR ;INCASE OF ERROR
\r
4631 JRST [DEVCHR ACEXT,
\r
4632 TLNE ACEXT,DIRBIT ;DOES IT HAVE A DIRECTORY?
\r
4633 JRST .+1 ;YES, GIVE UP BEFORE HARM IS DONE
\r
4634 SKIPE ACFILE,INDIR ;USE INPUT FILE NAME
\r
4635 MOVEM ACFILE,BINDIR ;TOO BAD IF ZERO ALSO
\r
4637 HLLZS ACEXT,BINDIR+1 ;BH 11/19/74 DATE75. WAS HLLZ.
\r
4638 ENTER BIN,BINDIR ;ENTER FILE NAME
\r
4641 ENTRDN: SETOM ENTERS ;MAKE SURE ONLY DONE ONCE
\r
4642 MOVE CS,[POINT 7,DEVBUF]
\r
4643 PUSH PP,1 ;SAVE THE ACCS
\r
4646 SKIPN 2,INDIR ;GET INPUT NAME
\r
4647 JRST FINDEV ;FINISHED WITH DEVICE
\r
4648 SETZ 1, ;CLEAR FOR RECEIVING
\r
4649 LSHC 1,6 ;SHIFT ONE CHAR. IN
\r
4650 ADDI 1,40 ;FORM ASCII
\r
4651 IDPB 1,CS ;STORE CHAR.
\r
4652 JUMPN 2,.-4 ;MORE TO DO?
\r
4653 MOVEI 1," " ;SEPARATE BY TAB
\r
4655 HLLZ 2,INDIR+1 ;GET EXT
\r
4656 JUMPE 2,FINEXT ;NO EXT
\r
4658 LSHC 1,6 ;SAME LOOP AS ABOVE
\r
4662 FINEXT: MOVEI 1," "
\r
4663 IDPB 1,CS ;SEPARATE BY TAB
\r
4664 LDB 1,[POINT 12,INDIR+2,35] ;GET DATE
\r
4665 LDB 2,[POINT 3,INDIR+1,20] ;BH 11/19/74 DATE75.
\r
4666 DPB 2,[POINT 3,1,23] ;BH 11/19/74 DATE75.
\r
4667 JUMPE 1,FINDEV ;NO DATE?
\r
4668 PUSHJ PP,DATOUT ;STORE IT
\r
4669 LDB 2,[POINT 11,INDIR+2,23] ;GET CREATION TIME
\r
4670 JUMPE 2,FINDEV ;NO TIME (DECTAPE)
\r
4671 MOVEI 1," " ;SEPARATE BY SPACE
\r
4673 PUSHJ PP,TIMOU1 ;STORE TIME
\r
4675 MOVEI 2," " ;FINAL TAB
\r
4677 IDPB 1,CS ;TERMINATE FOR NOW
\r
4678 POP PP,3 ;RESTORE ACCS
\r
4681 SKIPN PAGENO ;IF FIRST TIME THRU
\r
4682 JRST OUTFF ;START NEW PAGE
\r
4683 SETZM PAGENO ;ON NEW FILE, RESET PAGES
\r
4684 JRST OUTFF2 ;DON'T START NEW PAGE UNLESS FF
\r
4686 INSETI: HLLZM ACEXT,INDIR+1 ;STORE EXTENSION
\r
4687 MOVE ACPPN,INDIR+3 ;SAVE PPN
\r
4689 SKIPA ACEXT,INDIR+1 ;GET ERROR CODE
\r
4690 JRST CPOPJ1 ;SKIP-RETURN IF FOUND
\r
4691 TRNE ACEXT,-1 ;ERROR CODE OF 0 IS FILE NOT FOUND
\r
4692 JRST ERRCF ;FILE THERE BUT NOT READABLE
\r
4693 SETZ ACEXT, ;CLEAR EXT AND TRY AGAIN
\r
4694 MOVEM ACPPN,INDIR+3 ;RESTORE PPN
\r
4696 \fREC2: MOVS [XWD CTIBUF+1,CTLSAV] ;RESCAN CONTROL (FROM PASS1 END STMNT)
\r
4697 BLT CTIBUF+2 ;INPUT BUFFER
\r
4699 HRLM ACDELX ;FUDGE PREVIOUS DELIMITER
\r
4700 IFN RENTSW,<MOVE HHIGH ;GET HI-SEG BREAK
\r
4701 MOVEM HIGH1 ;SAVE THE ONE WE GOT ON PASS1 (FOR HISEG)>
\r
4703 MOVE [XWD PASS2I,PASS2I+1]
\r
4704 BLT PASS2X-1 ;ZERO PASS2 VARIABLES
\r
4705 TLO FR,MTAPSW!LOADSW ;SET FLAGS
\r
4707 GOTEND: MOVE INDEV ;GET LAST DEVICE
\r
4708 DEVCHR ;GET ITS CHARACTERISTICS
\r
4709 TLNE 4 ;TEST FOR DIRECTORY (DSK OR DTA)
\r
4710 JRST EOT ;YES, SO DON'T WASTE TIME
\r
4711 JRST .+3 ;NO, INPUT BUFFER BY BUFFER
\r
4713 JRST .-1 ;NO ERRORS
\r
4714 STATO CHAR,1B22 ;TEST FOR EOF
\r
4715 JRST .-3 ;IGNORE ERRORS
\r
4717 EOT: PUSHJ PP,SAVEXS ;SAVE REGISTERS
\r
4718 PUSHJ PP,INSET ;GET THE NEXT INPUT DEVICE
\r
4719 HRROI RC,[SIXBIT /END OF PASS 1@/] ;ASSUME END OF PASS
\r
4720 TLZN FR,LOADSW ;ZERO ONLY ON END OF PASS 1
\r
4721 HRROI RC,[SIXBIT /LOAD THE NEXT FILE@/] ;NOT END OF PASS
\r
4722 TLNN ACDEV,(1B13!1B15) ;WAS ALL THAT WORK NECESSARY?
\r
4723 PUSHJ PP,TYPMSG ;YES
\r
4725 RSTRXS: MOVSI RC,SAVBLK ;SET POINTER
\r
4726 BLT RC,RC-1 ;RESTORE REGISTERS
\r
4727 MOVE RC,SAVERC ;RESTORE RC
\r
4730 SAVEXS: MOVEM RC,SAVERC ;SAVE RC
\r
4731 MOVEI RC,SAVBLK ;SET POINTER
\r
4732 BLT RC,SAVBLK+RC-1 ;BLT ALL REGISTERS BELOW RC
\r
4734 \fNAME1: SETZM ACDEVX ;ENTRY FOR DESTINATION
\r
4735 NAME2: SETZB ACDEV,INDIR+2 ;ENTRY FOR SOURCE
\r
4736 MOVEI ACFILE,0 ;CLEAR FILE
\r
4737 HLRZ ACDEL,ACDELX ;GET PREVIOUS DELIMITER
\r
4739 SETZB ACEXT,INDIR+3 ;RESET EXTENSION AND PROGRAM-NUMBER PAIR
\r
4740 SETZM PPN ;CLEAR PPN
\r
4741 NAME3: MOVSI ACPNTR,(POINT 6,AC0) ;SET POINTER
\r
4742 TDZA AC0,AC0 ;CLEAR SYMBOL
\r
4744 SLASH: PUSHJ PP,SW0
\r
4745 GETIOC: PUSHJ PP,TTYIN ;GET INPUT CHARACTER
\r
4754 IFN CCLSW,<CAIE C,"!" ;IS CHAR AN IMPERATIVE?
\r
4756 JRST TERM ;YES, GO DO IT>
\r
4757 CAIE C,33 ;CHECK FOR THREE FLAVORS OF ALT-MODE
\r
4760 CAIG C,CR ;LESS THAN CR?
\r
4761 CAIGE C,LF ;AND GREATER THAN LF?
\r
4762 CAIN C,175 ;OR 3RD ALTMOD
\r
4764 IFN FTDISK,<CAIN C,"["
\r
4765 JRST PROGNP ;GET PROGRAMER NUMBER PAIR>
\r
4766 CAIN C,"=" ;EQUALS IS SAME AS LEFT ARROW
\r
4767 TRCA C,142 ;SO MAKE IT A "_" AND SKIP
\r
4771 CAIGE C,40 ;VALID AS SIXBIT?
\r
4772 JRST [CAIN C,"Z"-100 ;NO,IS IT ^Z
\r
4773 EXIT ;YES,EXIT FOR BATCH
\r
4774 JRST GETIOC] ;JUST IGNORE
\r
4775 SUBI C,40 ;CONVERT TO 6-BIT
\r
4776 TLNE ACPNTR,770000 ;HAVE WE STORED SIX BYTES?
\r
4777 IDPB C,ACPNTR ;NO, STORE IT
\r
4778 JRST GETIOC ;GET NEXT CHARACTER
\r
4780 DEVICE: JUMPN ACDEV,ERRCM ;ERROR IF ALREADY SET
\r
4781 MOVE ACDEV,AC0 ;DEVICE NAME
\r
4782 JRST DEVNAM ;COMMON CODE
\r
4784 NAME: JUMPN ACFILE,ERRCM ;ERROR IF ALREADY SET
\r
4785 MOVE ACFILE,AC0 ;FILE NAME
\r
4786 DEVNAM: MOVE ACDEL,C ;SET DELIMITER
\r
4787 JRST NAME3 ;GET NEXT SYMBOL
\r
4789 TERM: JUMPE ACDEL,TERM1 ;IF NO PREVIOUS TERMINATOR, THEN FILENAME
\r
4790 CAIN ACDEL,"_" ;...
\r
4792 CAIE ACDEL,":" ;IF PREVIOUS DELIMITER
\r
4793 CAIN ACDEL,"," ;WAS COLON OR COMMA
\r
4794 TERM1: MOVE ACFILE,AC0 ;SET FILE
\r
4795 CAIN ACDEL,"." ;IF PERIOD,
\r
4796 HLLZ ACEXT,AC0 ;SET EXTENSION
\r
4797 HRLM C,ACDELX ;SAVE PREVIOUS DELIMITER
\r
4798 JUMPN ACDEV,.+2 ;IF DEVICE SET USE IT
\r
4799 SKIPA ACDEV,ACDEVX ;OTHERWISE USE LAST DEVICE
\r
4800 MOVEM ACDEV,ACDEVX ;AND DEVICE
\r
4801 MOVE ACPPN,PPN ;PUT PPN IN RIGHT PLACE
\r
4802 IFN FTDISK,<CAIN C,"!" ;IMPERATIVE?
\r
4803 POPJ PP, ;YES, DON'T ASSUME DEV
\r
4804 JUMPE ACFILE,CPOPJ ;IF THERE IS A FILE,
\r
4805 JUMPN ACDEV,.+2 ;BUT NO DEVICE
\r
4806 MOVSI ACDEV,(SIXBIT /DSK/) ;THEN ASSUME DISK>
\r
4808 \fERRCM: HRROI RC,[SIXBIT /COMMAND ERROR@/]
\r
4811 IFN FTDISK,<PROGNP:
\r
4812 PROGN1: HRLZM RC,PPN ;COMMA, STORE LEFT HALF
\r
4813 PROGN2: MOVEI RC,0 ;CLEAR AC
\r
4814 PROGN3: PUSHJ PP,TTYIN
\r
4816 JRST PROGN1 ;STORE LEFT HALF
\r
4817 HRRM RC,PPN ;ASSUME TERMINAL
\r
4819 JRST GETIOC ;YES, RETURN TO MAIN SCAN
\r
4820 CAIL C,"0" ;CHECK FOR VALID NUMBERS
\r
4822 JRST ERRCM ;NOT VALID
\r
4823 LSH RC,3 ;SHIFT PREVIOUS RESULT
\r
4824 ADDI RC,-"0"(C) ;ADD IN NEW NUMBER
\r
4825 JRST PROGN3 ;GET NEXT CHARACTER>
\r
4826 \fSWITC0: PUSHJ PP,SW1 ;PROCESS CHARACTER
\r
4827 SWITCH: PUSHJ PP,TTYIN ;GET NEXT CHARACTER
\r
4828 CAIE C,")" ;END OF STRING?
\r
4832 SW0: PUSHJ PP,TTYIN
\r
4833 SW1: MOVEI C,-"A"(C) ;CONVERT FROM ASCII TO NUMERIC
\r
4834 CAILE C,"Z"-"A" ;WITHIN BOUNDS? (IS IT ALPHA?)
\r
4835 JRST ERRCM ;NO, ERROR
\r
4836 MOVE RC,[POINT 4,BYTAB]
\r
4838 SOJGE C,.-1 ;MOVE TO PROPER BYTE
\r
4839 LDB C,RC ;PICK UP BYTE
\r
4840 JUMPE C,ERRCM ;TEST FOR VALID SWITCH
\r
4841 CAIG C,SWTABT-SWTAB ;LEGAL ON SOURCE?
\r
4842 JUMPL PP,ERRCM ;NO, TEST FOR SOURCE
\r
4843 LDB RC,[POINT 4,SWTAB-1(C),12]
\r
4845 SKIPN CTLSAV ;IF PASS2 OR IO SWITCH,
\r
4846 XCT SWTAB-1(C) ;EXECUTE INSTRUCTION
\r
4848 TLZ IO,IOSALL ;TAKE CARE OF /X
\r
4851 DEFINE HELP (TEXT)<
\r
4858 */A advance one file
\r
4859 */B backspace one file
\r
4860 /C produce a cref listing
\r
4861 */E list macro expansions (LALL)
\r
4862 */F list in new format (.MFRMT)
\r
4863 /G list in old format (.HWFRMT)
\r
4865 */L reinstate listing (LIST)
\r
4866 /M suppress ascii in macro and repeat expansion (SALL)
\r
4867 */N suppress error printout on tty
\r
4868 /O set MLOFF pseudo-op
\r
4869 /P increase size of the pushdown stack
\r
4870 /Q suppress Q errors on the listing
\r
4871 */S suppress listing (XLIST)
\r
4873 */X suppress all macro expansions (XALL)
\r
4874 */Z zero the directory
\r
4875 Switches A,B,C,T,W,X, and Z must immediately follow
\r
4876 the device or file to which they refer.
\r
4878 \f DEFINE SETSW (LETTER,INSTRUCTION) < INSTRUCTION
\r
4879 J= <"LETTER"-"A">-^D9*<I=<"LETTER"-"A">/^D9>
\r
4882 DEFINE SETCOD (I,J)
\r
4883 <BYTAB'I=BYTAB'I!<.-SWTAB>B<4*J+3>>
\r
4885 BYTAB0= 0 ;INITIALIZE TABLE
\r
4890 SETSW Z,<TLO TIO,TIOCLD >
\r
4891 SETSW C,<TLZ FR,CREFSW >
\r
4892 SETSW P,<SOS PDP >
\r
4893 SWTABT: ;THE ABOVE SW'S ARE LEGAL ON OUTPUT ONLY
\r
4894 SETSW A,<ADDI CS,1 >
\r
4895 SETSW B,<SUBI CS,1 >
\r
4896 SETSW E,<TLZ IO,IOPALL!IOSALL >
\r
4897 SETSW H,<OUTSTR HLPMES>
\r
4898 SETSW L,<TLZ IO,IOMSTR >
\r
4899 SETSW M,<TLO IO,IOPALL!IOSALL >
\r
4900 SETSW N,<HLLOS TYPERR >
\r
4901 SETSW O,<XCT OFFML >
\r
4902 SETSW Q,<TLO FR,ERRQSW >
\r
4903 SETSW S,<TLO IO,IOMSTR >
\r
4904 SETSW T,<TLO TIO,TIOLE >
\r
4905 SETSW W,<TLO TIO,TIORW >
\r
4906 SETSW X,<TLOA IO,IOPALL >
\r
4908 BYTAB: ;BYTAB CONTAINS AN INDEX TO SWTAB
\r
4909 ;IT CONSIST OF 9 4BIT BYTES/WORD
\r
4910 ;OR ONE BYTE FOR EACH LETTER
\r
4912 +BYTAB0 ;A-I BYTE = 1 THROUGH 17 = INDEX
\r
4913 +BYTAB1 ;J-R BYTE = 0 = COMMAND ERROR
\r
4916 IF2,<PURGE I,J,BYTAB0,BYTAB1,BYTAB2>
\r
4917 \fTTYIN: SOSGE CTIBUF+2 ;ENUF CHAR.?
\r
4919 ILDB C,CTIBUF+1 ;GET CHARACTER
\r
4920 CAIE C," " ;SKIP BLANKS
\r
4921 CAIN C,HT ;AND TABS
\r
4924 SETZM CTIBUF+2 ;YES,IGNORE REST OF LINE
\r
4925 CAIG C,"Z"+40 ;CHECK FOR LOWER CASE
\r
4929 POPJ PP, ;YES, EXIT
\r
4931 TTYERR: SKIPN INDEV ;INPUT DEVICE SEEN?
\r
4932 JRST ERRCM ;NO, SO MISSING "_"
\r
4933 ERRNE: HRROI RC,[SIXBIT /?NO END STATEMENT ENCOUNTERED ON INPUT FILE@/]
\r
4934 ERRNE0: SKPINC V ;SEE IF WE CAN INPUT A CHAR.
\r
4935 JFCL ;BUT ONLY TO DEFEAT ^O
\r
4936 PUSHJ PP,TYPMSG ;OUTPUT IT
\r
4937 SKIPE LITLVL ;SEE IF IN LITERAL
\r
4938 SKIPN LITPG ;PAGE 0 MEANS NOT IN A LITERAL REALY
\r
4939 JRST ERRNE1 ;NO, TRY OTHERS
\r
4940 MOVE V,[XWD [SIXBIT /IN LITERAL@/],LITPG]
\r
4941 PUSHJ PP,PRNUM ;GO PRINT INFORMATION
\r
4942 ERRNE1: MOVEI V,0 ;CHECK FOR OTHER PLACES
\r
4944 MOVE V,[XWD [SIXBIT /IN DEFINE@/],DEFPG]
\r
4946 MOVE V,[XWD [SIXBIT /IN TEXT@/],TXTPG]
\r
4948 MOVE V,[XWD [SIXBIT /IN CONDITIONAL OR REPEAT@/],REPPG]
\r
4950 MOVE V,[XWD [SIXBIT /IN CONDITIONAL@/],CNDPG]
\r
4952 ERRNE2: MOVE V,[XWD [SIXBIT /IN MACRO CALL@/],CALPG]
\r
4954 SKIPN LITLVL ;HAD ONE PAGE NUMBER ALREADY
\r
4955 SKIPA V,[XWD [SIXBIT /@/],PAGENO] ;BETTER THAN NOTHING
\r
4957 ERRNE3: PUSHJ PP,PRNUM
\r
4958 HRROI RC,[SIXBIT /@/] ;WILL GET A RETURN
\r
4961 ERRMS1: SIXBIT / ERRORS DETECTED@/
\r
4962 ERRMS2: SIXBIT /?1 ERROR DETECTED@/
\r
4963 ERRMS3: SIXBIT /NO ERRORS DETECTED@/
\r
4964 EINIT: MOVE RC,[XWD ACDEV,[SIXBIT /NOT AVAILABLE@/]]
\r
4966 \fERRCL: HRRZ RC,LSTDIR+1 ;GET LST DEV ERROR CODE
\r
4967 JRST .+2 ;GET ERROR MESSAGE
\r
4968 ERRCB: HRRZ RC,BINDIR+1 ;GET BIN DEV ERROR CODE
\r
4970 SOJA RC,ERRTYP ;SPECIAL CASE IF ERROR CODE 0
\r
4972 ERRCF: HRRZ RC,INDIR+1 ;GET INPUT DEV ERROR CODE
\r
4973 HLLZ ACEXT,INDIR+1 ;SET UP EXT
\r
4975 ERRTYP: CAIL RC,TABLND-TABLE ;IS ERROR CODE LEGAL?
\r
4976 SKIPA RC,TABLND ;NO, GIVE CATCH ALL MESSAGE
\r
4977 MOVE RC,TABLE(RC) ;YES, PICK UP MESSAGE
\r
4979 ERRFIN: SKPINC C ;SEE IN WE CAN INPUT A CHAR.
\r
4980 JFCL ;BUT ONLY TO DEFEAT ^O
\r
4985 CLOSE LST, ;GIVE USER A PARTIAL LISTING
\r
4986 CLOSE BIN,40 ;BUT NEVER A BUM REL FILE
\r
4987 IFN CCLSW,<AOS JOBERR ;RECORD ERROR SO EXECUTION DELETED>
\r
4990 [SIXBIT /(0) ILLEGAL FILE NAME@/],,ACFILE
\r
4991 TABLE: [SIXBIT /(0) FILE WAS NOT FOUND@/],,ACFILE
\r
4992 [SIXBIT /(1) NO DIRECTORY FOR PROJECT-PROGRAMMER NUMBER@/],,ACFILE
\r
4993 [SIXBIT /(2) PROTECTION FAILURE@/],,ACFILE
\r
4994 [SIXBIT /(3) FILE WAS BEING MODIFIED@/],,ACFILE
\r
4995 [SIXBIT /(4) RENAME FILE NAME ALREADY EXISTS@/],,ACFILE
\r
4996 [SIXBIT /(5) ILLEGAL SEQUENCE OF UUOS@/],,ACFILE
\r
4997 [SIXBIT /(6) BAD UFD OR BAD RIB@/],,ACFILE
\r
4998 [SIXBIT /(7) NOT A SAV FILE@/],,ACFILE
\r
4999 [SIXBIT /(10) NOT ENOUGH CORE@/],,ACFILE
\r
5000 [SIXBIT /(11) DEVICE NOT AVAILABLE@/],,ACFILE
\r
5001 [SIXBIT /(12) NO SUCH DEVICE@/],,ACFILE
\r
5002 [SIXBIT /(13) NOT TWO RELOC REG. CAPABILITY@/],,ACFILE
\r
5003 [SIXBIT /(14) NO ROOM OR QUOTA EXCEEDED@/],,ACFILE
\r
5004 [SIXBIT /(15) WRITE LOCK ERROR@/],,ACFILE
\r
5005 [SIXBIT /(16) NOT ENOUGH MONITOR TABLE SPACE@/],,ACFILE
\r
5006 [SIXBIT /(17) PARTIAL ALLOCATION ONLY@/],,ACFILE
\r
5007 [SIXBIT /(20) BLOCK NOT FREE ON ALLOCATION@/],,ACFILE
\r
5008 [SIXBIT /(21) CAN'T SUPERSEDE (ENTER) AN EXISTING DIRECTORY@/],,ACFILE
\r
5009 [SIXBIT /(22) CAN'T DELETE (RENAME) A NON-EMPTY DIRECTORY@/],,ACFILE
\r
5010 [SIXBIT /(23) SFD NOT FOUND@/],,ACFILE
\r
5011 [SIXBIT /(24) SEARCH LIST EMPTY@/],,ACFILE
\r
5012 [SIXBIT /(25) SFD NESTED TOO DEEPLY@/],,ACFILE
\r
5013 [SIXBIT /(26) NO-CREATE ON FOR SPECIFIED PATH@/],,ACFILE
\r
5015 TABLND: [SIXBIT /(?) LOOKUP, ENTER, OR RENAME ERROR@/],,ACFILE
\r
5016 \fTYPMSG: PUSHJ PP,CRLF ;MOVE TO NEXT LINE
\r
5017 TYPMS1: HLRZ CS,RC ;GET FIRST MESSAGE
\r
5018 CAIE CS,-1 ;SKIP IF MINUS ONE
\r
5019 PUSHJ PP,TYPM2 ;TYPE MESSAGE
\r
5020 HRRZ CS,RC ;GET SECOND HALF
\r
5023 CRLF: MOVEI C,CR ;OUTPUT CARRIAGE RETURN
\r
5025 MOVEI C,LF ;AND LINE FEED
\r
5027 TYO: SOSG CTOBUF+2 ;BUFFER FULL?
\r
5028 OUTPUT CTL,0 ;YES, DUMP IT
\r
5029 IDPB C,CTOBUF+1 ;STORE BYTE
\r
5030 CAIG C,FF ;FORM FEED?
\r
5031 CAIGE C,LF ;V TAB OR LINE FEED?
\r
5034 POPJ PP, ;AND EXIT
\r
5036 TYPM2: MOVSI C,(1B0) ;ANTICIPATE REGISTER WORD
\r
5037 CAIN CS,ACFILE ;FILE NAME ?
\r
5038 JRST [JUMPE ACEXT,.+1 ;YES, TEST FOR EXT
\r
5039 LSH ACEXT,-6 ;MAKE SPACE FOR "."
\r
5040 IOR ACEXT,[SIXBIT /. @/]
\r
5042 CAIG CS,17 ;IS IT?
\r
5044 TYPM2A: HRLI CS,(POINT 6,,) ;FORM BYTE POINTER
\r
5046 TYPM3: ILDB C,CS ;GET A SIXBIT BYTE
\r
5048 JRST TYO ;YES, TYPE SPACE AND EXIT
\r
5049 ADDI C,40 ;NO, FORM 7-BIT ASCII
\r
5050 PUSHJ PP,TYO ;OUTPUT CHARACTER
\r
5053 \fXCEEDS: ADDI SX,2000 ;ADJUST SYMBOL POINTER
\r
5054 XCEED: PUSHJ PP,SAVEXS ;SAVE THE REGISTERS
\r
5055 HRRZ 1,JOBREL ;GET CURRENT TOP
\r
5057 CORE 0, ;REQUEST MORE CORE
\r
5058 JRST XCEED2 ;ERROR, BOMB OUT
\r
5059 HRRZ 2,JOBREL ;GET NEW TOP
\r
5061 XCEED1: MOVE 0,0(1) ;GET ORIGIONAL
\r
5062 MOVEM 0,0(2) ;STORE IN NEW LOCATION
\r
5063 SUBI 2,1 ;DECREMENT UPPER
\r
5064 CAMLE 1,SYMBOL ;HAVE WE ARRIVED?
\r
5065 SOJA 1,XCEED1 ;NO, GET ANOTHER
\r
5069 PUSHJ PP,SRCHI ;RE-INITIALIZE SYMBOL TABLE
\r
5070 JRST RSTRXS ;RESTORE REGISTERS AND EXIT
\r
5072 XCEED2: HRROI RC,[SIXBIT /INSUFFICIENT CORE@/]
\r
5074 PDPERR: HRROI RC,[SIXBIT .PDP OVERFLOW, TRY /P@.]
\r
5077 PRNUM: HLRZ CS,V ;GET MESSAGE
\r
5079 MOVEI CS,[SIXBIT /ON PAGE@/]
\r
5081 MOVE AC0,(V) ;GET PAGE
\r
5082 PUSHJ PP,DP1 ;PRINT NUMBER
\r
5085 SKIPN AC1,1(V) ;GET SEQ NUM IF THERE
\r
5086 POPJ PP, ;NO, RETURN
\r
5088 MOVEI CS,[SIXBIT /LINE@/]
\r
5090 MOVEI AC0,OUTSQ ;PRINT IT
\r
5091 OUTPUT CTL,0 ;TO MAKE THINGS PRINT IN RIGHT ORDER
\r
5094 JRST TYO ;AND RETURN
\r
5096 DP1: IDIVI AC0,^D10
\r
5103 \fRIM0: TDO FR,AC0 ;SET RIM/RIM10 FLAG
\r
5104 TLNE FR,PNCHSW ;FORGET IT IF PUNCH RESET
\r
5105 SETSTS BIN,IB ;SET TO IMAGE BINARY MODE
\r
5108 ROUT: EXCH CS,RIMLOC
\r
5109 SUB PP,[XWD 1,1] ;CLEAR OUT STACK WFW
\r
5114 JUMPE CS,ROUT1 ;RIM10 OUTPUT
\r
5121 ROUT1: MOVSI C,(DATAI PTR,) ;RIM OUTPUT
\r
5122 HRR C,LOCO ;GET ADDRESS
\r
5123 TLNE FR,RIM1SW ;NO DATAI IF RIM10
\r
5125 PUSHJ PP,PTPBIN ;OUTPUT
\r
5127 AOSA LOCO ;INCREMENT CURRENT LOCATION
\r
5129 OUTBIN: TLNN FR,RIMSW!RIM1SW!R1BSW ;EXIT IF RIM MODE
\r
5130 PTPBIN: TLNN FR,PNCHSW ;EXIT IF PUNCH NOT REQUESTED
\r
5132 SOSG BINBUF+2 ;TEST FOR BUFFER FULL
\r
5133 PUSHJ PP,DMPBIN ;YES, DUMP IT
\r
5134 IDPB C,BINBUF+1 ;DEPOSIT BYTE
\r
5137 \fDMPBIN: OUT BIN,0 ;DUMP THE BUFFER
\r
5138 POPJ PP, ;NO ERRORS
\r
5139 TSTBIN: GETSTS BIN,C ;GET STSTUS BITS
\r
5140 TRNN C,ERRBIT ;ERROR?
\r
5141 POPJ PP, ;NO, EXIT
\r
5142 MOVE AC0,BINDEV ;YES, GET TAG
\r
5143 JRST ERRLST ;TYPE MESSAGE AND ABORT
\r
5145 DMPLST: OUT LST,0 ;OUTPUT BUFFER
\r
5146 POPJ PP, ;NO ERRORS
\r
5147 TSTLST: GETSTS LST,C ;ANY ERRORS?
\r
5149 POPJ PP, ;NO, EXIT
\r
5151 ERRLST: MOVSI RC,[SIXBIT /OUTPUT WRITE-LOCK ERROR DEVICE@/]
\r
5152 TRNE C,IOIMPM ;IMPROPER MODE?
\r
5154 MOVSI RC,[SIXBIT /OUTPUT DATA ERROR DEVICE@/]
\r
5155 TRNE C,IODERR ;DEVICE DATA ERROR?
\r
5157 MOVSI RC,[SIXBIT /OUTPUT CHECKSUM OR PARITY ERROR DEVICE@/]
\r
5158 TRNE C,IODTER ;IS IT
\r
5160 MOVE CS,AC0 ;GET DEVICE
\r
5161 DEVCHR CS, ;FIND OUT WHAT IT IS
\r
5162 MOVSI RC,[SIXBIT /OUTPUT QUOTA EXCEEDED ON DEVICE@/]
\r
5163 TLNN CS,DSKBIT ;SKIP IF DSK OUTPUT
\r
5164 MOVSI RC,[SIXBIT /OUTPUT BLOCK TOO LARGE DEVICE@/]
\r
5167 R1BDMP: SETCM CS,R1BCNT
\r
5175 R1BDM1: MOVE C,0(CS)
\r
5181 R1BI: SETOM R1BCNT
\r
5186 ROUT6: CAME CS,RIMLOC
\r
5189 MOVEM AC0,R1BBLK(C)
\r
5197 \fREAD0: PUSHJ PP,EOT ;END OF TAPE
\r
5199 READ: SOSGE IBUF+2 ;BUFFER EMPTY?
\r
5201 READ1: ILDB C,IBUF+1 ;PLACE CHARACTER IN C
\r
5202 MOVE CS,@IBUF+1 ;CHECK FOR SEQUENCE NUMBER
\r
5205 CAIN CS,1 ;CHECK FOR SPECIAL
\r
5206 MOVE CS,[<ASCII/ />+1]
\r
5210 ADDM CS,IBUF+2 ;ADJUST WORD COUNT
\r
5211 REPEAT 4,< IBP IBUF+1> ;SKIP SEQ NO
\r
5212 PUSHJ PP,READ ;AND THE TAB
\r
5213 JRST READ ;GET NEXT CHARACTER
\r
5215 READ1A: JUMPE C,READ ;IGNORE NULL
\r
5216 CAIN C,32 ;IF IT'S A "^Z"
\r
5217 MOVEI C,LF ;TREAT IT AS A "LF"
\r
5218 CAIE C,37 ;CONTROL _
\r
5220 MOVEI C,"^" ;MAKE CONTROL-SHIFT _ VISIBLE
\r
5224 READ2: PUSHJ PP,READ ;YES, TEST FOR LINE FEED
\r
5225 PUSHJ PP,RSW2 ;LIST IN ANY EVENT
\r
5226 CAIG C,FF ;IS IT ONE OF
\r
5227 CAIGE C,LF ;LF, VT, OR FF?
\r
5229 PUSHJ PP,OUTIM1 ;YES, DUMP THE LINE
\r
5230 JRST READ ;RETURN NEXT CHARACTER
\r
5232 READ3: IN CHAR,0 ;GET NEXT BUFFER
\r
5233 JRST READ ;NO ERRORS
\r
5235 TRNN C,ERRBIT!2000 ;ERRORS?
\r
5238 MOVSI RC,[SIXBIT/ INPUT PHYSICAL END OF TAPE DEVICE@/]
\r
5240 JRST ERRFIN ;E-O-T
\r
5241 MOVSI RC,[SIXBIT /MONITOR DETECTED SOFTWARE INPUT ERROR DEVICE@/]
\r
5242 TRNE C,IOIMPM ;IMPROPER MODE?
\r
5244 MOVSI RC,[SIXBIT /INPUT DATA ERROR DEVICE@/]
\r
5245 TRNE C,IODERR ;DEVICE DATA ERROR?
\r
5247 MOVSI RC,[SIXBIT /INPUT CHECKSUM OR PARITY ERROR DEVICE@/]
\r
5249 MOVSI RC,[SIXBIT /INPUT BLOCK TOO LARGE DEVICE@/]
\r
5252 \fOUTAB2: PUSHJ PP,OUTTAB ;PRINT TWO TABS
\r
5253 OUTTAB: MOVEI C,HT
\r
5254 PRINT: CAIE C,CR ;IS THIS A CR?
\r
5256 JRST OUTCR ;YES, GO PROCESS
\r
5257 CAIN C,FF ;FORM FEED?
\r
5258 JRST OUTFF ;YES, FORCE NEW PAGE
\r
5261 OUTCR: TRNN ER,ERRORS!LPTSW!TTYSW
\r
5263 MOVEI C,CR ;CARRIAGE RETURN, LINE FEED
\r
5265 SOSGE LPP ;END OF PAGE?
\r
5266 TLO IO,IOPAGE ;YES, SET FLAG
\r
5267 TRCA C,7 ;FORM LINE FEED AND SKIP
\r
5269 OUTL: TLZN IO,IOPAGE ;NEW PAGE REQUESTED?
\r
5271 JUMP1 OUTC ;YES, BYPASS IF PASS ONE
\r
5272 PUSH PP,C ;SAVE C AND CS
\r
5275 TLNN IO,IOMSTR!IOPROG
\r
5277 TLNE IO,IOCREF ;IF DOING CREF OUTPUT NOW
\r
5278 TLNE FR,CREFSW ;AND CREFFING (JUST IN CASE)
\r
5280 PUSHJ PP,CLSC3 ;CLOSE IT OUT
\r
5281 HLLM IO,(PP) ;SAVE THIS NEW STATE OF IO
\r
5283 MOVEM C,LPP ;SET NEW COUNTER
\r
5287 PUSHJ PP,OUTC ;OUTPUT FORM FEED
\r
5289 PUSHJ PP,OUTAS0 ;OUTPUT TITLE
\r
5291 PUSHJ PP,OUTAS0 ;OUTPUT VERSION
\r
5293 PUSHJ PP,OUTAS0 ; AND DATE
\r
5295 PUSHJ PP,DNC ;OUTPUT PAGE NUMBER
\r
5296 AOSG PAGEN. ;FIRST PAGE OF THIS NUMBER?
\r
5298 MOVEI C,"-" ;NO, PUT OUT MODIFIER
\r
5302 OUTL1: PUSHJ PP,OUTCR
\r
5305 HRRZ CS,SUBTTX ;SWITCH FOR SUB-TITLE
\r
5306 SKIPE 0(CS) ;IS THERE A SUB-TITLE?
\r
5307 PUSHJ PP,OUTTAB ;YES, OUTPUT A TAB
\r
5308 PUSHJ PP,SOUT20 ;OUTPUT ASCII WITH CARRIAGE RETURN
\r
5311 POP PP,CS ;RESTORE REGISTERS
\r
5314 OUTC: TRNE ER,ERRORS!TTYSW
\r
5318 OUTLST: SOSG LSTBUF+2 ;BUFFER FULL?
\r
5319 PUSHJ PP,DMPLST ;YES, DUMP IT
\r
5320 COMMENT $ REG DOESN'T LIKE THIS FEATURE ANY MORE 9-5-72
\r
5322 IDPB C,LSTBUF+1 ;STORE BYTE
\r
5325 \fPAGE0: PUSHJ PP,STOUTS ;PAGE PSEUDO-OP
\r
5326 OUTFF1: TLNE IO,IOCREF ;CURRENTLY DOING CREF?
\r
5327 TLNE IO,IOPROG ;AND NOT XLISTED?
\r
5333 OUTFF: TLO IO,IOPAGE
\r
5334 OUTFF2: SETOM PAGEN.
\r
5338 TIMOUT: IDIVI 2,^D60*^D1000
\r
5339 TIMOU1: IDIVI 2,^D60
\r
5340 PUSH PP,3 ;SAVE MINUTES
\r
5341 PUSHJ PP,OTOD ;STORE HOURS
\r
5342 MOVEI 3,":" ;SEPARATE BY COLON
\r
5344 POP PP,2 ;STORE MINUTES
\r
5345 OTOD: IDIVI 2,^D10
\r
5346 ADDI 2,60 ;FORM ASCII
\r
5352 DATOUT: IDIVI 1,^D31 ;GET DAY
\r
5354 CAIG 2,^D9 ;TWO DIGITS?
\r
5355 ADDI 2,7760*^D10 ;NO, PUT IN SPACE
\r
5356 PUSHJ PP,OTOD ;STORE DAY
\r
5357 IDIVI 1,^D12 ;GET MONTH
\r
5358 MOVE 2,DTAB(2) ;GET MNEMONIC
\r
5359 IDPB 2,CS ;DEPOSIT RIGHT MOST 7 BITS
\r
5360 LSH 2,-7 ;SHIFT NEXT IN
\r
5361 JUMPN 2,.-2 ;DEPOSIT IFIT EXISTS
\r
5362 MOVEI 2,^D64(1) ;GET YEAR
\r
5363 JRST OTOD ;STORE IT
\r
5377 \fSUBTTL MACHINE INSTRUCTION SEARCH ROUTINES
\r
5379 OPTSCH: MOVEI RC,0
\r
5380 MOVEI ARG,1B^L<OP1END-OP1TOP> ;SET UP INDEX
\r
5381 MOVEI V,1B^L<OP1END-OP1TOP>/2 ;SET UP INCREMENT
\r
5383 OPT1A: CAMN AC0,OP1TOP(ARG) ;ARE WE POINTING AT SYMBOL?
\r
5384 JRST OPT1D ;YES, GET THE CODE
\r
5385 JUMPE V,POPOUT ;TEST FOR END
\r
5386 CAML AC0,OP1TOP(ARG) ;NO, SHOULD WE MOVE DOWN?
\r
5387 TDOA ARG,V ;NO, INCREMENT
\r
5388 OPT1B: SUB ARG,V ;YES, DECREMENT
\r
5389 ASH V,-1 ;HALVE INCREMENT
\r
5390 CAIG ARG,OP1END-OP1TOP ;ARE WE OUT OF BOUNDS?
\r
5391 JRST OPT1A ;NO, TRY AGAIN
\r
5392 JRST OPT1B ;YES, BRING IT DOWN A PEG
\r
5396 OPTSCH: MOVE ARG,AC0 ;GET SIXBIT NAME
\r
5397 TLZ ARG,400000 ;CLEAR SIGN BIT
\r
5398 IDIVI ARG,PRIME ;REM. GOES IN V
\r
5399 CAMN AC0,OP1TOP(V) ;ARE WE POINTING AT SYMBOL?
\r
5401 SKIPN OP1TOP(V) ;TEST FOR END
\r
5402 POPJ PP, ;SYMBOL NOT FOUND
\r
5403 HLRZ RC,ARG ;SAVE LHS OF QUOTIENT
\r
5404 SKIPA ARG,RC ;GET IT BACK
\r
5405 OPT1A: ADDI ARG,(RC) ;INCREMENT ARG
\r
5406 ADDI V,(ARG) ;QUADRATIC INCREASE TO V
\r
5407 CAIL V,PRIME ;V IS MODULO PRIME
\r
5408 JRST [SUBI V,PRIME
\r
5410 CAMN AC0,OP1TOP(V) ;IS THIS IT?
\r
5412 SKIPE OP1TOP(V) ;END?
\r
5413 JRST OPT1A ;TRY AGAIN
\r
5417 IFN OPHSH,< SETZ RC, ;CLEAR RELOCATION
\r
5418 MOVE ARG,V ;GET INDEX IN RIGHT ACC.>
\r
5419 IDIVI ARG,4 ;ARG HAS INDEX USED IN OPTTAB
\r
5420 LDB V,OPTTAB(V) ;V HAS INDEX TO OPTTAB
\r
5421 CAIL V,700 ;PSEUDO-OP OR IO INSTRUCTION?
\r
5423 ROT V,-^D9 ;LEFT JUSTIFY
\r
5424 HRRI V,OP ;POINT TO BASIC FORMAT
\r
5425 OPT1F: AOS 0(PP) ;SET FOR SKIP EXIT
\r
5426 MOVEI SDEL,%OP ;SET OP-CODE CROSS-REF FLAG
\r
5427 JRST CREF ;TEST AND OUTPUT, AC0=SYMBOL, V=VALUE
\r
5429 OPT1G: JUMPG AC0,.+3 ;IF ".","$",OR "%" USE TABLE 1
\r
5430 TLNN AC0,200000 ;PSEUDO-OP OR IO INST., TEST FOR PROPER TABLE
\r
5431 SKIPA V,OP2TAB-700(V) ;2ND TABLE, FIRST LETTER IS "A" TO "O"
\r
5432 MOVE V,OP1TAB-700(V) ;1ST TABLE, ..."P" TO "Z"
\r
5436 IFE OPHSH,< POINT 9,OP1COD-1(ARG),35>
\r
5437 POINT 9,OP1COD (ARG), 8
\r
5438 POINT 9,OP1COD (ARG),17
\r
5439 POINT 9,OP1COD (ARG),26
\r
5440 IFN OPHSH,< POINT 9,OP1COD (ARG),35>
\r
5442 \fIFDEF .XCREF,< .XCREF ;DON'T CREF THIS MESS>
\r
5449 DEFINE X <N1=N1+1 ;>>
\r
5456 DEFINE X (SYMBOL,CODE)
\r
5458 CC=CC+CODE_<N2=N2-9>
\r
5466 SYN X,XX ;JUST THE SAME MACRO>
\r
5469 DEFINE XX (SB,CD)<> ;A NUL MACRO
\r
5470 OP1TOP: IF1,< BLOCK PRIME>
\r
5471 IF1,<DEFINE X (SB,CD)<>>
\r
5473 DEFINE OPSTOR (RM)<.$'RM=.$'RM+<OPCODE_<9*<3-R&3>>>>
\r
5478 R=SXB&-1_-1-Q*PRIME
\r
5483 IFL PRIME-TRY,<PRINTX HASH FAILURE>>
\r
5485 DEFINE ITEM (QT,RM)<
\r
5487 IFL PRIME-R,<R=R-R/PRIME*PRIME>
\r
5489 IFGE PRIME-<TRY=TRY+1>,<ITEM Q,\R>>
\r
5490 IFE .%'RM,<.%'RM=SXB
\r
5493 DEFINE GETSYM (N)<.%'N=0>
\r
5497 REPEAT PRIME,<GETSYM \N
\r
5499 DEFINE GETSYM (N)<.$'N=0>
\r
5501 REPEAT <PRIME/4+1>,<GETSYM \N
\r
5506 \fIFN OPHSH,< ;PUT THE MOST USED OP CODES FIRST
\r
5579 IFN IIISW,<X ASCID , 771>
\r
5974 IFN UNIVR,<X SEARCH, 721>
\r
6046 IF2,<IFE OPHSH,<SUBTL:>>
\r
6127 IFN UNIVR,<X UNIVER, 737>
\r
6157 \fIFN OPHSH,< ;NO-OPS, OLD MNEMONICS,F4 UUOS
\r
6184 OP1COD: BLOCK N1/4
\r
6188 DEFINE SETVAL (N)<EXP .%'N
\r
6192 REPEAT PRIME,<SETVAL \N
\r
6196 OP1COD: IF1,< BLOCK <PRIME/4+1>>
\r
6198 DEFINE SETVAL (N)<EXP .$'N
\r
6202 REPEAT <PRIME/4+1>,<SETVAL \N
\r
6207 IFDEF .CREF,< .CREF ;START CREFFING AGAIN>
\r
6208 \fSUBTTL PERMANENT SYMBOLS
\r
6209 SYMNUM: EXP LENGTH/2 ;NUMBER OF PERMANENT SYMBOLS
\r
6212 XWD SYMF!NOOUTF,B>
\r
6215 P ??????, 0(SUPRBT)
\r
6217 LENGTH= .-SYMNUM-1 ;LENGTH OF INITIAL SYMBOLS
\r
6219 PRMTBL: ;PERMANENT SYMBOLS
\r
6253 IFE LNSSW,< XLIST >
\r
6254 IFN LNSSW,< ;SPECIAL DEVICES FOR PEPR
\r
6277 PRMEND: ;END OF PERMANENT SYMBOLS
\r
6279 \f OPDEF ZL [Z LITF] ;INVALID IN LITERALS
\r
6280 OPDEF ZA [Z ADDF] ;INVALID IN ADDRESSES
\r
6281 OPDEF ZAL [Z ADDF!LITF]
\r
6292 Z RADX50 ;RADIX50,SQUOZE
\r
6293 ZAL LOC0 (1) ;RELOC
\r
6294 ZAL REMAR0 ;REMARK
\r
6296 ZA SUPRE0 ;SUPRESS
\r
6297 ZAL PSEND0 ;PRGEND
\r
6298 ZAL RIM0 (RIMSW) ;RIM
\r
6300 Z ASCII0 (1) ;SIXBIT
\r
6301 ZAL IOSET (IOPALL!IOSALL) ;SALL
\r
6302 IFN UNIVR,< ZAL SERCH0 ;SEARCH>
\r
6305 ZA SUBTT0 (Z (POINT 7,,)) ;SUBTTL
\r
6308 ZA TITLE0 (Z (POINT 7,,)) ;TITLE
\r
6312 ZAL TWSEG0 ;TWOSEGMENTS
\r
6313 ZAL XALL0 (IOPALL) ;XALL
\r
6314 ZAL IOSET (IOPROG) ;XLIST
\r
6316 ZAL RIM0 (RIM1SW) ;RIM10
\r
6317 ZAL RIM0 (R1BSW) ;RIM10B
\r
6318 IFN UNIVR,< ZA UNIV0 (Z (POINT 7,,)) ;UNIVERSAL>
\r
6319 IFE UNIVR,< Z 0 ;UNIVERSAL>
\r
6320 ZAL IORSET (IONCRF) ;.CREF
\r
6321 ZAL IOSET (IONCRF) ;.XCREF
\r
6322 ZA OFFORM ;.HWFRMT
\r
6326 Z ASCII0 (0) ;ASCII
\r
6327 Z ASCII0 (1B18) ;ASCIZ
\r
6331 ZA SUPRSA ;ASUPPRESS
\r
6340 Z OCT0 (^D10) ;DEC
\r
6343 ZAL DEPHA0 ;DEPHASE
\r
6345 ZA INTER0 (INTF!ENTF) ;ENTRY
\r
6349 TLNN FR,IFPASS ;IF1
\r
6350 TLNE FR,IFPASS ;IF2
\r
6352 TRNE AC0,IFB0 ;IFB
\r
6353 TLNE ARG,IFDEF0 ;IFDEF
\r
6354 Z IFIDN0 (0) ;IFDIF
\r
6358 Z IFIDN0 (1) ;IFIDN
\r
6363 TRNN AC0,IFB0 ;IFNB
\r
6364 TLNN ARG,IFDEF0 ;IFNDEF
\r
6365 ZA INTER0 (INTF) ;INTERN
\r
6368 Z IRP0 (400000) ;IRPC
\r
6376 ZAL IORSET (IOPALL!IOSALL) ;LALL
\r
6377 ZAL IORSET (IOPROG) ;LIST
\r
6386 Z ASCII0 (3B19) ;COMMENT
\r
6388 Z ASCII0 (5B20) ;ASCID>
\r
6391 ;USER DEFINED CALLI'S GO HERE
\r
6392 SIXBIT /LIGHTS/ ;-1
\r
6393 CALLI0: SIXBIT /RESET/ ; 0
\r
6394 SIXBIT /DDTIN/ ; 1
\r
6395 SIXBIT /SETDDT/ ; 2
\r
6396 SIXBIT /DDTOUT/ ; 3
\r
6397 SIXBIT /DEVCHR/ ; 4
\r
6398 SIXBIT /DDTGT/ ; 5
\r
6399 SIXBIT /GETCHR/ ; 6
\r
6400 SIXBIT /DDTRL/ ; 7
\r
6404 SIXBIT /UTPCLR/ ;13
\r
6406 SIXBIT /LOGIN/ ;15
\r
6407 SIXBIT /APRENB/ ;16
\r
6408 SIXBIT /LOGOUT/ ;17
\r
6409 SIXBIT /SWITCH/ ;20
\r
6410 SIXBIT /REASSI/ ;21
\r
6411 SIXBIT /TIMER/ ;22
\r
6412 SIXBIT /MSTIME/ ;23
\r
6413 SIXBIT /GETPPN/ ;24
\r
6414 SIXBIT /TRPSET/ ;25
\r
6415 SIXBIT /TRPJEN/ ;26
\r
6416 SIXBIT /RUNTIM/ ;27
\r
6418 SIXBIT /SLEEP/ ;31
\r
6419 SIXBIT /SETPOV/ ;32
\r
6421 SIXBIT /GETLIN/ ;34
\r
6423 SIXBIT /SETUWP/ ;36
\r
6424 SIXBIT /REMAP/ ;37
\r
6425 SIXBIT /GETSEG/ ;40
\r
6426 SIXBIT /GETTAB/ ;41
\r
6428 SIXBIT /SETNAM/ ;43
\r
6429 SIXBIT /TMPCOR/ ;44
\r
6430 SIXBIT /DSKCHR/ ;45
\r
6431 SIXBIT /SYSSTR/ ;46
\r
6432 SIXBIT /JOBSTR/ ;47
\r
6433 SIXBIT /STRUUO/ ;50
\r
6434 SIXBIT /SYSPHY/ ;51
\r
6435 SIXBIT /FRECHN/ ;52
\r
6436 SIXBIT /DEVTYP/ ;53
\r
6437 SIXBIT /DEVSTS/ ;54
\r
6438 SIXBIT /DEVPPN/ ;55
\r
6440 SIXBIT /RTTRP/ ;57
\r
6442 SIXBIT /JOBSTS/ ;61
\r
6443 SIXBIT /LOCATE/ ;62
\r
6444 SIXBIT /WHERE/ ;63
\r
6445 SIXBIT /DEVNAM/ ;64
\r
6446 SIXBIT /CTLJOB/ ;65
\r
6447 SIXBIT /GOBSTR/ ;66
\r
6451 SIXBIT /HIBER/ ;72
\r
6453 SIXBIT /CHGPPN/ ;74
\r
6454 SIXBIT /SETUUO/ ;75
\r
6455 SIXBIT /DEVGEN/ ;76
\r
6456 SIXBIT /OTHUSR/ ;77
\r
6457 SIXBIT /CHKACC/ ;100
\r
6458 SIXBIT /DEVSIZ/ ;101
\r
6459 SIXBIT /DAEMON/ ;102
\r
6460 SIXBIT /JOBPEK/ ;103
\r
6461 SIXBIT /ATTACH/ ;104
\r
6462 SIXBIT /DAEFIN/ ;105
\r
6463 SIXBIT /FRCUUO/ ;106
\r
6464 SIXBIT /DEVLNM/ ;107
\r
6465 SIXBIT /PATH./ ;110
\r
6468 NEGCAL==CALLI0-CALTBL ;NUMBER OF NEGATIVE CALLI'S
\r
6470 TTCTBL: SIXBIT /INCHRW/ ; 0 INPUT A CHAR. AND WAIT
\r
6471 SIXBIT /OUTCHR/ ; 1 OUTPUT A CHAR.
\r
6472 SIXBIT /INCHRS/ ; 2 INPUT A CHAR. AND SKIP
\r
6473 SIXBIT /OUTSTR/ ; 3 OUTPUT A STRING
\r
6474 SIXBIT /INCHWL/ ; 4 INPUT CHAR., WAIT, LINE MODE
\r
6475 SIXBIT /INCHSL/ ; 5 INPUT CHAR., SKIP, LINE MODE
\r
6476 SIXBIT /GETLCH/ ; 6 GET LINE CHARACTERISTICS
\r
6477 SIXBIT /SETLCH/ ; 7 SET LINE CHARACTERISTICS
\r
6478 SIXBIT /RESCAN/ ;10 RESET INPUT STREAM TO COMMAND
\r
6479 SIXBIT /CLRBFI/ ;11 CLEAR TYPEIN BUFFER
\r
6480 SIXBIT /CLRBFO/ ;12 CLEAR TYPEOUT BUFFER
\r
6481 SIXBIT /SKPINC/ ;13 SKIPS IF A CHAR. CAN BE INPUT
\r
6482 SIXBIT /SKPINL/ ;14 SKIPS IF A LINE CAN BE INPUT
\r
6483 SIXBIT /IONEOU/ ;15 OUTPUT AS AN IMAGE CHAR.
\r
6486 SUBTTL USER-DEFINED SYMBOL SEARCH ROUTINES
\r
6487 MSRCH: PUSHJ PP,SEARCH ;PERFORM GENERAL SEARCH
\r
6488 POPJ PP, ;NOT FOUND, EXIT
\r
6489 JUMPG ARG,MSRCH2 ;SKIP-EXIT AND CROSS-REF IF FOUND
\r
6490 CAME AC0,1(SX) ;WE ARE LOOKING AT SYMBOL, TRY ONE ABOVE
\r
6491 POPJ PP, ;NO, EXIT
\r
6492 ADDI SX,2 ;YES, POINT TO IT
\r
6493 PUSHJ PP,SRCH5 ;LOAD REGISTERS
\r
6494 MSRCH2: AOSA 0(PP) ;SET SKIP-EXIT
\r
6495 QSRCH: JUMPL ARG,SSRCH3 ;BRANCH IF OPERAND
\r
6496 MOVEI SDEL,%MAC ;SET OPERATOR FLAG
\r
6497 TLZE IO,DEFCRS ;IS IT A DEFINITION?
\r
6498 MOVEI SDEL,%DMAC ;YES
\r
6499 JRST CREF ;CROSS-REF AND EXIT
\r
6501 SSRCH: PUSHJ PP,SEARCH ;PERFORM GENERAL SEARCH
\r
6502 POPJ PP, ;NOT FOUND, EXIT
\r
6503 JUMPL ARG,SSRCH2 ;SKIP-EXIT AND CROSS-REF IF FOUND
\r
6504 SSRCH1: CAME AC0,-3(SX) ;WE ARE LOOKING AT MACRO, LOOK ONE SLOT BELOW
\r
6505 POPJ PP, ;NO DICE, EXIT
\r
6506 SUBI SX,2 ;YES, POINT TO IT
\r
6507 PUSHJ PP,SRCH5 ;LOAD REGISTERS
\r
6508 SSRCH2: AOS 0(PP) ;SET FOR SKIP-EXIT
\r
6509 SSRCH3: MOVEI SDEL,%SYM ;SET OPERAND FLAG
\r
6511 CREF: TLNN IO,IONCRF ;NO CREFFING FOR THIS SYMBOL?
\r
6512 TLNE FR,P1!CREFSW ;PASS ONE OR CROSS-REF SUPPRESSION?
\r
6513 POPJ PP, ;YES, EXIT
\r
6514 EXCH SDEL,C ;PUT FLAG IN C, SACE C
\r
6516 TLNE IO,IOCREF ;HAVE WE PUT OUT THE 177,102
\r
6518 PUSH PP,C ;START OF CREF DATA
\r
6520 \fREPEAT 0,< ;NEEDS CHANGE TO CREF
\r
6525 TLO IO,IOCREF ;WE NOW ARE IN THAT STATE
\r
6526 POP PP,C ;WE HAVE NOW
\r
6527 CREF3: JUMPE C,NOFLG ;JUST CLOSE IT
\r
6528 PUSHJ PP,OUTLST ;TYPE OF SYMBOL (%MAC,%DMAC,%SYM)
\r
6529 MOVSI CS,770000 ;COUNT CHRS
\r
6530 TDZA C,C ;STARTING AT 0
\r
6531 LSH CS,-6 ;TRY NEXT
\r
6532 TDNE AC0,CS ;IS THAT ONE THERE?
\r
6534 PUSHJ PP,OUTLST ;PRINT NUMBER OF SYMBOL CONSTITUENTS
\r
6540 PUSHJ PP,OUTLST ;THE ASCII SYMBOL
\r
6544 PUSHJ PP,OUTLST ;MARK IT AS A DEFINING OCCURENCE
\r
6545 NOFLG: MOVE C,SDEL
\r
6549 CLSCRF: TRNN ER,LPTSW
\r
6550 POPJ PP, ;LEAVE IF WE SHOULD NOT BE PRINTING
\r
6551 CLSCR2: MOVEI C,177
\r
6553 TLZE IO,IOCREF ;WAS IT OPEN?
\r
6554 JRST CLSCR1 ;YES, JUST CLOSE IT
\r
6555 MOVEI C,102 ;NO, OPEN IT FIRST
\r
6556 PUSHJ PP,OUTLST ;MARK BEGINNING OF CREF DATA
\r
6559 CLSCR1: MOVEI C,103
\r
6560 JRST OUTLST ;MARK END OF CREF DATA
\r
6562 CLSC3: TLZ IO,IOCREF
\r
6566 JRST OUTLST ;177,104 CLOSES IT FOR NOW
\r
6567 > ;END OF REPEAT 0
\r
6568 \fREPEAT 1,< ;WORKS WITH EXISTING CREF
\r
6570 PUSHJ PP,CRFHDR ;GET CORRECT SUBTTL
\r
6575 TLO IO,IOCREF ;WE NOW ARE IN THAT STATE
\r
6576 POP PP,C ;WE HAVE NOW
\r
6577 CREF3: PUSHJ PP,OUTLST ;TYPE OF SYMBOL (%MAC,%DMAC,%SYM)
\r
6578 MOVSI CS,770000 ;COUNT CHRS
\r
6579 TDZA C,C ;STARTING AT 0
\r
6580 LSH CS,-6 ;TRY NEXT
\r
6581 TDNE AC0,CS ;IS THAT ONE THERE?
\r
6583 PUSHJ PP,OUTLST ;PRINT NUMBER OF SYMBOL CONSTITUENTS
\r
6589 PUSHJ PP,OUTLST ;THE ASCII SYMBOL
\r
6593 PUSHJ PP,OUTLST ;MARK IT AS A DEFINING OCCURENCE
\r
6599 SUBTL: SIXBIT /SUBTTL/>
\r
6600 CRFHDR: CAME AC0,SUBTL ;IS FIRST SYMBOL "SUBTTL"
\r
6603 PUSHJ PP,SUBTT0 ;UPDATE SUBTTL
\r
6604 MOVE AC0,SUBTL ;RESTORE ARG.
\r
6610 CLSCRF: TRNN ER,LPTSW
\r
6611 POPJ PP, ;LEAVE IF WE SHOULD NOT BE PRINTING
\r
6612 CLSCR2: TLZE IO,IOCREF ;FINISH UP LINE
\r
6615 TLNE IO,IOPAGE ;NEW PAGE?
\r
6616 PUSHJ PP,OUTL ;YES,GIVE IT A ROUSING SENDOFF!
\r
6620 PUSHJ PP,OUTLST ;MARK BEGINNING OF CREF DATA
\r
6621 CLSCR1: MOVEI C,177
\r
6624 JRST OUTLST ;MARK END OF CREF DATA
\r
6625 > ;END OF REPEAT 1
\r
6626 \fSEARCH: HLRZ SX,SRCHX
\r
6629 SRCH1: CAML AC0,-1(SX)
\r
6631 SRCH2: SUB SX,SDEL
\r
6636 SOJA SX,SRCHNO ;NOT FOUND
\r
6638 SRCH3: CAMN AC0,-1(SX)
\r
6639 JRST SRCH4 ;NORMAL / FOUND EXIT
\r
6645 SOJA SX,SRCHNO ;NOT FOUND
\r
6647 SRCH4: AOS 0(PP) ;SET FOR SKIP EXIT
\r
6648 SRCH5: MOVSI ARG,SUPRBT ;HE IS USING IT, TURN OFF BIT
\r
6649 ANDCAM ARG,(SX) ; IN THE TABLE
\r
6650 SRCH7: MOVE ARG,0(SX) ;FLAG AND VALUE TO ARG
\r
6651 LDB RC,RCPNTR ;POINT 1,ARG,17
\r
6652 TLNE ARG,LELF ;CHECK LEFT RELOCATE
\r
6655 TLNE ARG,SPTR ;CHECK SPECIAL EXTESN POINTER
\r
6658 MOVE V,0(ARG) ;36BIT VALUE TO V
\r
6661 SRCH6: MOVE V,0(ARG) ;VALUE
\r
6662 MOVE RC,1(ARG) ;AND RELOC
\r
6663 TLNE RC,-2 ;CHECK AND SET EXTPNT
\r
6668 SRCHNO:IFN UNIVR,<SKIPN UNISCH+1 ;ALLOWED TO SEARCH OTHER TABLES>
\r
6669 POPJ PP, ;NO, JUST RETURN
\r
6670 IFN UNIVR,<AOS V,UNISCH ;GET NEXT INDEX TO TABLE
\r
6671 CAIE V,1 ;FIRST TIME IN
\r
6672 JRST SRCHN1 ;YES, SAVE SYMBOL INFO
\r
6673 HRLM SX,UNISCH ;SAVE SX AND SET FLAG
\r
6674 MOVE ARG,SRCHX ;SEARCH POINTER
\r
6675 MOVEM ARG,UNISHX ;TO A SAFE PLACE
\r
6678 MOVEM ARG,UNIPTR ;STORE ALSO
\r
6679 SRCHN1: MOVE V,UNISCH(V) ;GET TRUE INDEX
\r
6680 JUMPE V,SRCHKO ;IF ZERO ALL TABLE SCANNED
\r
6681 MOVE ARG,UNISHX(V) ;NEW SRCHX
\r
6682 MOVEM ARG,SRCHX ;SET IT UP
\r
6683 MOVE ARG,UNIPTR(V) ;SYMTOP,,SYMBOL
\r
6686 JRST SEARCH ;TRY AGAIN>
\r
6688 SRCHKO: SETZ ARG, ;CLEAR ARG SO ZERO STORED
\r
6689 SRCHOK: IFN UNIVR,<SKIPN UNISCH ;HAVE WE SEARCH OTHER TABLES>
\r
6690 POPJ PP, ;NO, JUST RETURN
\r
6692 SYMBCK: HLRZ SX,UNISCH ;RESTORE SX
\r
6693 SETZM UNISCH ;CLEAR SYMBCK FLAG
\r
6694 PUSH PP,V ;SAVE AN AC
\r
6695 MOVE V,UNISHX ;SRCHX
\r
6696 MOVEM V,SRCHX ;RESTORE ORIGINAL
\r
6697 MOVE V,UNIPTR ;SYMTOP,,SYMBOL
\r
6700 JUMPE ARG,SRCHK2 ;TOTALLY UNDEFINED
\r
6701 PUSH PP,RC ;SAVE SOME ACCS
\r
6704 SETZB ARG,EXTPNT ;CLEAR ALL SYMBOL DATA
\r
6706 PUSHJ PP,INSERT ;INSERT SYMBOL IN TABLE
\r
6707 POP PP,EXTPNT ;RESTORE ACCS ETC.
\r
6710 MOVEM ARG,(SX) ;SET FLAGS AND VALUE AS IT SHOULD BE
\r
6714 \fINSERQ: TLNE ARG,UNDF!VARF
\r
6715 INSERZ: SETZB RC,V
\r
6716 INSERT: CAME AC0,-1(SX) ;ARE WE LOOKING AT MATCHING MNEMONIC?
\r
6717 JRST INSRT2 ;NO, JUST INSERT
\r
6718 JUMPL ARG,INSRT1 ;YES, BRANCH IF OPERAND
\r
6719 SKIPL 0(SX) ;OPERATOR, ARE WE LOOKING AT ONE?
\r
6720 JRST UPDATE ;YES, UPDATE
\r
6721 JRST INSRT2 ;NO, INSERT
\r
6723 INSRT1: SKIPG 0(SX) ;OPERAND, ARE WE LOOKING AT ONE?
\r
6724 JRST UPDATE ;YES, UPDATE
\r
6725 SUBI SX,2 ;NO, MOVE UNDER OPERATOR AND INSERT
\r
6726 INSRT2: MOVE SDEL,SYMBOL
\r
6732 INSRT3: MOVEM SDEL,SYMBOL ;MAKE ROOM FOR A TWO WORD ENTRY
\r
6734 BLT SDEL,-2(SX) ;PUSH EVERYONE DOWN TWO LOACTIONS
\r
6735 AOS @SYMBOL ;INCREMENT THE SYMBOL COUNT
\r
6736 TLNN RC,-2 ;NEED SPECIAL?
\r
6737 TRNE RC,-2 ;LEFT OR RIGHT EXTERNAL?
\r
6738 JRST INSRT5 ;YES, JUMP
\r
6739 TLNN V,-1 ;SKIP IF V IS A 36BIT VALUE
\r
6740 JRST INSRT4 ;JUMP, ITS A 18BIT VALUE
\r
6741 AOS SDEL,FREE ;36BIT, SO GET A CELL FROM FREE CORE
\r
6742 CAML SDEL,SYMBOL ;MORE CORE NEEDED?
\r
6743 PUSHJ PP,XCEEDS ;YES
\r
6744 HRRI ARG,-1(SDEL) ;POINTER TO ARG
\r
6745 MOVEM V,0(ARG) ;36BIT VALUE TO FREE CORE
\r
6746 TLOA ARG,PNTF ;NOTE THAT ARG IS APOINTER, NOT A 18BIT VALUE
\r
6748 INSRT4: HRR ARG,V ;18BIT VALUE TO ARG
\r
6749 DPB RC,RCPNTR ;FIX RIGHT RELOCATION
\r
6751 TLO ARG,LELF ;FIX LEFT RELOCATION
\r
6752 INSRT6: MOVEM ARG,0(SX) ;INSERT FLAGS AND VALUE.
\r
6753 MOVEM AC0,-1(SX) ;INSERT SYMBOL NAME.
\r
6754 PUSHJ PP,SRCHI ;INITILIAZE SRCHX
\r
6755 JRST QSRCH ;EXIT THROUGH CREF
\r
6757 INSRT5: MOVEI SDEL,2 ;GET TWO CELLS FROM FREE CORE
\r
6759 CAML SDEL,SYMBOL;MORE CORE NEEDED?
\r
6760 PUSHJ PP,XCEEDS ;YES
\r
6762 HRRI ARG,-2(SDEL) ;POINTER TO ARG
\r
6764 TLO ARG,SPTR ;SET SPECIAL POINTER, POINTS TO TWO CELLS
\r
6766 \fREMOVE: SUBI SX,2 ;MOVE EVERYONE UP TWO LOCATIONS
\r
6767 REMOV1: MOVE 0(SX)
\r
6768 MOVEM 2(SX) ;OVERWRITE THE DELETED SYMBOL
\r
6769 CAME SX,SYMBOL ;SKIP WHEN DONE
\r
6773 SOS 0(SX) ;DECREMENT THE SYMBOL COUNT
\r
6775 SRCHI: MOVEI AC2,0 ;THIS CODE SETS UP SRCHX
\r
6784 POPJ PP, ;SRCHX=XWD <SYMTBL+LENGTH/2>,LENGTH/4
\r
6786 \fUPDATE: DPB RC,RCPNTR ;FIX RIGHT RELOCATION
\r
6787 TLNE ARG,SPTR ;SKIP IF THERE IS NO SPECIAL POINTER
\r
6788 JRST UPDAT4 ;YES, USE THE TWO CELLS
\r
6789 TLNN RC,-2 ;NEED TO CHANGE
\r
6790 TRNE RC,-2 ;ANY CURRENT EXTERNS?
\r
6791 JRST UPDAT5 ;YES ,JUMP
\r
6792 TLZ ARG,LELF ;CLEAR LELF
\r
6793 TLNE RC,1 ;LEFT RELOCATABLE?
\r
6794 TLO ARG,LELF ;YES, SET THE FLAG
\r
6795 TLNE ARG,PNTF ;WAS THERE A 36BIT VALUE?
\r
6796 JRST UPDAT2 ;YES, USE IT.
\r
6797 TLNE V,-1 ;NO,IS THERE A 36BIT VALUE?
\r
6798 JRST UPDAT1 ;YES, GET A CELL
\r
6799 HRR ARG,V ;NO, USE RH OF ARG
\r
6800 UPDAT3: MOVEM ARG,0(SX) ;OVERWRITE THE ONE IN THE TABLE
\r
6801 POPJ PP, ;AND EXIT
\r
6803 UPDAT1: AOS SDEL,FREE ;GET ONE CELL
\r
6804 CAML SDEL,SYMBOL ;NEED MORE CORE?
\r
6805 PUSHJ PP,XCEEDS ;YES
\r
6806 HRRI ARG,-1(SDEL) ;POINTER TO ARG
\r
6807 TLO ARG,PNTF ;AND NOTE IT.
\r
6808 UPDAT2: TLNE ARG,EXTF ;IS THERE A EXTERNAL?
\r
6809 JRST UPDAT3 ;YES, - JUST SAVE A LOCATION
\r
6810 MOVEM ARG,0(SX) ;NO, OVERWRITE THE POINTER IN THE TABLE
\r
6811 MOVEM V,0(ARG) ;STORE VALUE AS A 36BIT VALUE
\r
6812 POPJ PP, ;AND EXIT
\r
6814 UPDAT4: MOVEM ARG,0(SX) ;WE HAVE TWO CELLS, WE USE THEM
\r
6815 MOVEM V,0(ARG) ;SAVE AS 36BIT VALUE
\r
6816 MOVEM RC,1(ARG) ;SAVE RELOCATION BITS
\r
6817 POPJ PP, ;AND EXIT
\r
6819 UPDAT5: MOVEI SDEL,2 ;THERE IS A EXTERNAL
\r
6820 ADDB SDEL,FREE ;SO WE NEED TWO LOACTIONS
\r
6821 CAML SDEL,SYMBOL ;NEED MORE CORE?
\r
6822 PUSHJ PP,XCEEDS ;YES
\r
6823 MOVEM RC,-1(SDEL) ;SAVE RELOCATION BITS
\r
6824 HRRI ARG,-2(SDEL) ;SAVE THE POINTER IN ARG
\r
6825 MOVEM V,0(ARG) ;SAVE A 36BIT VALUE
\r
6826 TLO ARG,SPTR ;SET SPECIAL PNTR FLAG
\r
6827 TLZ ARG,PNTF ;CLEAR POINTER FLAG
\r
6828 JRST UPDAT3 ;SAVE THE POINTER AND EXIT
\r
6830 \f SUBTTL CONSTANTS
\r
6833 \f SUBTTL PHASED CODE
\r
6834 SUBTTL PHASED CODE
\r
6836 SIXBIT /@/ ;SYMBOL TO STOP PRINTING
\r
6840 BYTE (7) 0, 11, 11, 11, 11
\r
6860 DBUF: ASCIZ / TI:ME DY-MON-YR PAGE /
\r
6861 VBUF: ASCIZ / MACRO / ;MUST BE LAST LOCATIONS IN BLOCK
\r
6862 BLOCK 3 ;ALLOW FOR LONG TITLE
\r
6864 \fSUBTTL STORAGE CELLS
\r
6870 IFE CCLSW,<CTIBUF: BLOCK 3
\r
6873 IFN CCLSW,<CTLBUF: BLOCK <CTLSIZ+5>/5
\r
6878 IFN CCLSW,<NUNDIR:>
\r
6883 ACDELX: ;LEFT HALF
\r
6884 BLKTYP: BLOCK 1 ;RIGHT HALF
\r
6890 COUTDB: BLOCK ^D18
\r
6894 IFN RENTSW,<HIGH1: BLOCK 1
\r
6897 HMIN: BLOCK 1 ;START OF HIGH SEG. IN TWO SEG. PROG.>
\r
6898 IFBLK: BLOCK .IFBLK
\r
6899 IFBLKA: BLOCK .IFBLK
\r
6904 LBUF: BLOCK <.CPL+5>/5
\r
6924 SBUF: BLOCK .SBUF/5
\r
6933 STCODE: BLOCK .STP
\r
6934 STOWRC: BLOCK .STP
\r
6937 TCNT: BLOCK 1 ;COUNT OF CHARS. LEFT IN TBUF
\r
6938 TBUF: BLOCK .TBUF/5
\r
6939 DEVBUF: BLOCK 6 ;STORE NAME.EXT CREATION DATE AND TIME
\r
6941 IONSYM: BLOCK 1 ;-1 SUPRESS LISTING OF SYMBOLS
\r
6942 PRGPTR: BLOCK 1 ;POINTER TO CHAIN OF PRGEND BLOCKS
\r
6943 ENTERS: BLOCK 1 ;-1 WHEN ENTERS HAVE BEEN DONE
\r
6944 IFN UNIVR,<UNIVSN: BLOCK 1 ;-1 WHEN A UNIVERSAL SEEN>
\r
6950 IFN RENTSW,<HHIGH: BLOCK 1 ;SAVE BREAK OF HIGH SEG. IN TWO SEG PROG.>
\r
6981 LITLBL: BLOCK 1 ;NAME OF LABEL DEFINED INSIDE A LITERAL
\r
6994 IFN CCLSW,<OTBUF: BLOCK 2>
\r
7007 R1BBLK: BLOCK .R1B
\r
7013 .TEMP: BLOCK 1 ;TEMPORARY STORAGE
\r
7014 IFN UNIVR,<UNISCH: BLOCK .UNIV ;SEARCH TABLE FOR UNIVERSALS>
\r
7021 RCOUNT: BLOCK 1 ;COUNT OF WORDS STILL TO READ IN LEAF
\r
7022 WCOUNT: BLOCK 1 ;COUNT OF WORDS STILL FREE IN LEAF
\r
7023 PASS2Z: ;ONLY CLEAR TO HERE ON PRGEND
\r
7029 \fSUBTTL MULTI-ASSEMBLY STORAGE CELLS
\r
7033 IFN CCLSW,<EXTMP: BLOCK 1 ;HOLDS EXT OF COMMAND FILE (RH)
\r
7038 MACSIZ: BLOCK 1 ;INITIAL SIZE OF LOW SEG
\r
7040 UNISIZ: BLOCK 1 ;TOP OF BUFFERS AND STACKS
\r
7041 UNITOP: BLOCK 1 ;TOP OF UNIVERSAL SYMBOL TABLE
\r
7042 UNIVNO: BLOCK 1 ;NUMBER OF UNIVERSALS SEEN
\r
7043 UNITBL: BLOCK .UNIV ;TABLE OF UNIVERSAL NAMES
\r
7044 UNIPTR: BLOCK .UNIV ;TABLE OF SYMBOL POINTERS
\r
7045 UNISHX: BLOCK .UNIV ;TABLE OF SRCHX POINTERS>
\r
7046 VAR ;CLEAR VARIABLES
\r
7048 JOBFFI: BLOCK 203*NUMBUF+1 ;INPUT BUFFER PLUS ONE
\r