1 TITLE MACRO V.46(52)
\r
2 SUBTTL RPG/CMF/JF/PMH/DMN 7-SEPT-71
\r
3 ;COPYRIGHT 1968,1969,1970,1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS.
\r
5 VMACRO==36 ;VERSION NUMBER
\r
6 VUPDATE==0 ;DEC UPDATE LEVEL
\r
7 VEDIT==0 ;EDIT NUMBER
\r
8 VCUSTOM==0 ;NON-DEC UPDATE LEVEL
\r
12 <VCUSTOM>B2+<VMACRO>B11+<VUPDATE>B17+VEDIT
\r
16 COMMENT * ASSEMBLY FEATURE SWITCHES (ACTION WHEN NON-ZERO)
\r
18 SWITCHES ON (NON-ZERO) IN DEC VERSION
\r
19 SEG2SW GIVES TWO SEGMENT MACRO
\r
20 PURESW GIVES VARIABLES IN LOW SEGMENT
\r
21 CCLSW GIVES RAPID PROGRAM GENERATION FEATURE
\r
22 FTDISK GIVES DISK FEATURES
\r
23 RUNSW USE RUN UUO FOR "DEV:NAME!"
\r
24 TEMP TMPCOR UUO IS TO BE USED
\r
25 RENTSW ASSEMBLE REENTRANT PROGRAMS
\r
26 FORMSW USE MORE READABLE FORMATS FOR LISTING (ICCSW)
\r
27 DFRMSW DEFAULT CONDITION OF FORMAT PRINTING (MULTI-FORM IF ON)
\r
29 SWITCHES OFF (ZERO) IN DEC VERSION
\r
30 STANSW GIVES STANFORD FEATURES
\r
31 LNSSW GIVES LNS VERSION
\r
32 WFWSW GIVES ARRAY, INTEGER AND LVAR FEATURES
\r
33 IIISW GIVES III FEATURES
\r
34 OPHSH GIVES HASH SEARCH OF OPCODES
\r
35 KI10 GIVES KI10 OP-CODES
\r
37 \fSUBTTL DEFAULT ASSEMBLY SWITCH SETTINGS
\r
39 IFDEF TWOSEG,<IFNDEF SEG2SW,<SEG2SW==1>>
\r
40 IFNDEF SEG2SW,<SEG2SW==0>
\r
41 IFN SEG2SW,<PURESW==1>
\r
43 IFNDEF PURESW,<PURESW==1>
\r
45 IFNDEF STANSW,<STANSW==0>
\r
47 IFNDEF RENTSW,<RENTSW==1>
\r
49 IFNDEF LNSSW,<LNSSW==0>
\r
50 IFN LNSSW,<FTDISK==0>
\r
52 IFNDEF RUNSW,<RUNSW==0>
\r
54 IFNDEF CCLSW,<CCLSW==1>
\r
55 IFN CCLSW,<FTDISK==1>
\r
57 IFNDEF TEMP,<TEMP==0>
\r
59 IFNDEF WFWSW,<WFWSW==0>
\r
62 IFNDEF FTDISK,<FTDISK==0>
\r
63 IFNDEF DFRMSW,<DFRMSW==0>
\r
64 IFN DFRMSW,<FORMSW==0>
\r
65 IFDEF ICCSW,<FORMSW==ICCSW> ;SAME SWITCH
\r
66 IFNDEF FORMSW,<FORMSW==0>
\r
68 IFNDEF IIISW,<IIISW==0>
\r
70 IFNDEF OPHSH,<OPHSH==0>
\r
72 IFNDEF KI10,<KI10==0>
\r
73 \fSUBTTL OTHER PARAMETERS
\r
75 .PDP== ^D50 ;BASIC PUSH-DOWN POINTER
\r
76 IFNDEF LPTWID,<LPTWID==^D120> ;DEFAULT WIDTH OF PRINTER
\r
77 .LPTWD==8*<LPTWID/8> ;USEFUL WIDTH IN MAIN LISTING
\r
78 .CPL== .LPTWD-^D32 ;WIDTH AVAIABLE FOR TEXT WHEN
\r
79 ;BINARY IS IN HALFWORD FORMAT
\r
80 IFE STANSW,<.LPP==^D55 ;LINES/PAGE>
\r
81 IFN STANSW,<.LPP==^D52 ;LINES/PAGE>
\r
82 .STP== ^D40 ;STOW SIZE
\r
83 .TBUF== ^D80 ;TITLE BUFFER
\r
84 .SBUF== ^D80 ;SUB-TITLE BUFFER
\r
85 .IFBLK==^D20 ;IFIDN COMPARISON BLOCK SIZE
\r
87 .UNIV==^D10 ;NUMBER OF UNIVERSAL DEFINITIONS
\r
88 .LEAF==4 ;SIZE OF BLOCKS IN MACRO TREE
\r
90 NCOLS==LPTWID/^D32 ;NUMBER OF COLUMNS IN SYMBOL TABLE
\r
91 IFN CCLSW,<IFNDEF CTLSIZ,<CTLSIZ==^D200>>
\r
92 IFN OPHSH,<IFNDEF PRIME,<PRIME==^D701>>
\r
94 IFE STANSW!LNSSW,<NUMBUF==2 ;NUMBER OF INPUT BUFFERS>
\r
95 IFN STANSW,<NUMBUF==5 ;NUMBER OF INPUT BUFFERS>
\r
96 IFN LNSSW,<NUMBUF==4 ;DOUBLE BUFFER FOR DOUBLE SIZE DEVICES>
\r
99 EXTERN JOBREL,JOBSYM,JOBDDT,JOBFF,JOBAPR,JOBSA
\r
100 IFN CCLSW,< EXTERN JOBERR>
\r
104 IFN SEG2SW,<TWOSEGMENTS
\r
105 LOWL: ;START OF LOW SEGMENT
\r
108 SALL ;SUPPRESS ALL MACROS
\r
110 ;SOME ASCII CHARACTERS
\r
122 SDEL= 3 ;SEARCH INCREMENT
\r
123 SX= SDEL+1 ;SEARCH INDEX
\r
126 C= 7 ;CURRENT CHARACTER
\r
127 CS= C+1 ;CHARACTER STATUS BITS
\r
128 RC= 11 ;RELOCATION BITS
\r
129 MWP= 12 ;MACRO WRITE POINTER
\r
130 MRP= 13 ;MACRO READ POINTER
\r
131 IO= 14 ;IO REGISTER (LEFT)
\r
132 ER== IO ;ERROR REGISTER (RIGHT)
\r
133 FR= 15 ;FLAG REGISTER (LEFT)
\r
134 RX== FR ;CURRENT RADIX (RIGHT)
\r
135 MP= 16 ;MACRO PUSHDOWN POINTER
\r
136 PP= 17 ;BASIC PUSHDOWN POINTER
\r
144 OPDEF RESET [CALLI 0]
\r
145 OPDEF SETDDT [CALLI 2]
\r
146 OPDEF DDTOUT [CALLI 3]
\r
147 OPDEF DEVCHR [CALLI 4]
\r
148 OPDEF WAIT [MTAPE 0]
\r
149 OPDEF CORE [CALLI 11]
\r
150 OPDEF EXIT [CALLI 12]
\r
151 OPDEF UTPCLR [CALLI 13]
\r
152 OPDEF DATE [CALLI 14]
\r
153 OPDEF APRENB [CALLI 16]
\r
154 OPDEF MSTIME [CALLI 23]
\r
155 OPDEF PJOB [CALLI 30]
\r
156 OPDEF RUN [CALLI 35]
\r
157 OPDEF TMPCOR [CALLI 44]
\r
159 IFN STANSW,< OPDEF SWAP [CALLI 400004] >
\r
160 \f ;FR FLAG REGISTER (FR/RX)
\r
161 IOSCR== 000001 ;NO CR AFTER LINE
\r
162 MTAPSW==000004 ;MAG TAPE
\r
163 ERRQSW==000010 ;IGNORE Q ERRORS
\r
164 LOADSW==000020 ;END OF PASS1 & NO EOF YET
\r
165 DCFSW== 000040 ;DECIMAL FRACTION
\r
166 RIM1SW==000100 ;RIM10 MODE
\r
167 NEGSW== 000200 ;NEGATIVE ATOM
\r
168 RIMSW== 000400 ;RIM OUTPUT
\r
169 PNCHSW==001000 ;RIM/BIN OUTPUT WANTED
\r
171 R1BSW== 004000 ;RIM10 BINARY OUTPUT
\r
172 TMPSW== 010000 ;EVALUATE CURRENT ATOM
\r
173 INDSW== 020000 ;INDIRECT ADDRESSING WANTED
\r
174 RADXSW==040000 ;RADIX ERROR SWITCH
\r
175 FSNSW== 100000 ;NON BLANK FIELD SEEN
\r
176 MWLFLG==200000 ;ON FOR DON'T ALLOW MULTI-WORD LITERALS
\r
179 ;IO FLAG REGISTER (IO/ER)
\r
180 FLDSW== 400000 ;ADDRESS FIELD
\r
182 ARPGSW==100000 ;ALLOW RAPID PROGRAM GENERATION
\r
183 IOPROG==040000 ;SUPRESS LISTING (LIST/XLIST PSEUDO OP)
\r
185 IOMAC== 010000 ;MACRO EXPANSION IN PROGRESS
\r
186 IOPALL==004000 ;SUPRESS LISTING OF MACRO EXPANSIONS
\r
187 IONCRF==002000 ;SUPRESS OUTPUT OF CREF INFORMATION
\r
188 CRPGSW==001000 ;CURRENTLY IN PROGRESS ON RPG
\r
189 IOCREF==000400 ;WE ARE NOW OUTPUTTING CREF INFO
\r
190 IOENDL==000200 ;BEEN TO STOUT
\r
192 DEFCRS==000040 ;THIS IS A DEFINING OCCURANCE (MACROS)
\r
193 IOIOPF==000020 ;IOP INSTRUCTION SEEN
\r
194 MFLSW== 000010 ;MULTI-FILE MODE,PRGEND SEEN
\r
195 IORPTC==000004 ;REPEAT CURRENT CHARACTER
\r
196 IOTLSN==000002 ;TITLE SEEN
\r
197 IOSALL==000001 ;SUPPRESS MACRO LISTING EVEN IF BINARY IS GENERATED
\r
199 OPDEF JUMP1 [JUMPL FR, ] ;JUMP IF PASS 1
\r
200 OPDEF JUMP2 [JUMPGE FR, ] ;JUMP IF PASS 2
\r
202 OPDEF JUMPOC [JUMPGE IO, ] ;JUMP IF IN OP-CODE FIELD
\r
203 OPDEF JUMPAD [JUMPL IO, ] ;JUMP IF IN ADDRESS FIELD
\r
205 OPDEF JUMPCM [JUMPL CS, ] ;JUMP IF CURRENT CHAR IS COMMA
\r
206 OPDEF JUMPNC [JUMPGE CS, ] ;JUMP IF CURRENT CHAR IS NON-COMMA
\r
208 \f ;ER ERROR REGISTERS (IO/ER)
\r
209 ERRM== 000020 ;MULTIPLY DEFINED SYMBOL
\r
210 ERRE== 000040 ;ILLEGAL USE OF EXTERNAL
\r
211 ERRP== 000100 ;PHASE DISCREPANCY
\r
212 ERRO== 000200 ;UNDEFINED OP CODE
\r
213 ERRN== 000400 ;NUMBER ERROR
\r
214 ERRV== 001000 ;VALUE PREVIOUSLY UNDEFINED
\r
215 ERRU== 002000 ;UNDEFINED SYMBOL
\r
216 ERRR== 004000 ;RELOCATION ERROR
\r
217 ERRL== 010000 ;LITERAL ERROR
\r
218 ERRD== 020000 ;REFERENCE TO MULTIPLY DEFINED SYMBOL
\r
219 ERRA== 040000 ;PECULIAR ARGUMENT
\r
220 ERRX== 100000 ;MACRO DEFINITION ERROR
\r
221 ERRQ== 200000 ;QUESTIONABLE, NON-FATAL ERROR
\r
226 ;SYMBOL TABLE FLAGS
\r
227 SYMF== 400000 ;SYMBOL
\r
229 NOOUTF==100000 ;NO DDT OUTPUT WFW
\r
230 SYNF== 040000 ;SYNONYM
\r
231 MACF== SYNF_-1 ;MACRO
\r
232 OPDF== SYNF_-2 ;OPDEF
\r
233 PNTF== 004000 ;"VALUE" IN SYMBOL TBL IS PNTR TO 36BIT VALUE
\r
234 UNDF== 002000 ;UNDEFINED
\r
235 EXTF== 001000 ;EXTERNAL
\r
236 INTF== 000400 ;INTERNAL
\r
237 ENTF== 000200 ;ENTRY
\r
238 VARF== 000100 ;VARIABLE
\r
239 MDFF== 000020 ;MULTIPLY DEFINED
\r
240 SPTR== 000010 ;SPECIAL EXTERNAL POINTER
\r
241 SUPRBT==000004 ;SUPRESS OUTPUT TO DDT
\r
242 LELF== 000002 ;LEFT HAND RELOCATABLE
\r
243 RELF== 000001 ;RIGHT HAND RELOCATABLE
\r
245 LITF== 200000 ;FLAG FOR PSEUDO-OPS INVALID IN LIT'S
\r
246 ADDF== 100000 ;FLAG FOR PSEUDO-OPS INVALID IN ADDRESSES
\r
248 TNODE== 200000 ;TERMINAL NODE FOR EVALEX
\r
252 IFN RUNSW,< XLIST >
\r
254 ;THIS CODE MUST BE IN FIRST 1K TO ALLOW MAXIMUM SPACE
\r
256 ; 74 APPEARS BECAUSE ONLY LOCS 74 AND BEYOND ARE SAVED BY "SAVE"
\r
258 IFN CCLSW,<NUNCOM: IOWD 0,INHERE ;WHERE TO DO IO
\r
259 0 ;TERMINATE COMMAND LIST
\r
260 NUNGO2: IN BIN,NUNCOM ;READ FILE
\r
261 JRST NUNGO3 ;THERE ARE NO ERRORS
\r
262 NUNERR: DDTOUT NUNPNT, ;COMPLAIN
\r
264 NUNERM: ASCIZ /?LINKAGE ERROR/
\r
265 NUNGO3: SKIPE 12,INHERE+133-74 ;LOOK AT JOBCOR
\r
266 ;DOES JOB WANT TO RUN IN MORE CORE?
\r
267 CAMG 12,JOBREL ;MORE CORE THAN CURRENTLY USED?
\r
268 JRST NUNGO4 ;NO, GO BLT PROG
\r
269 CORE 12, ;ASK FOR MORE CORE
\r
270 JRST NUNERR ;NOT AVAILABLE
\r
271 JRST NUNGO4 ;GO BLT PROGRAM
\r
273 \f;THIS CODE MUST BE IN FIRST 1K
\r
274 NUNSET: JUMPN ACDEV,.+2 ;DEVICE SPECIFIED?
\r
275 MOVSI ACDEV,(SIXBIT /SYS/) ;NO, USE SYSTEM DEVICE
\r
276 JUMPN ACEXT,.+2 ;EXT SPECIFIED?
\r
277 MOVSI ACEXT,(SIXBIT /SAV/) ;NO, USE "SAV"
\r
278 MOVEM ACDEV,NUNDEV ;DEVICE NAME TO USE
\r
279 OPEN BIN,NUNINI ;INIT THE DEVICE
\r
281 MOVEM ACFILE,NUNDIR ;IS THE FILE AVAILABLE?
\r
282 HLLZM ACEXT,NUNDIR+1 ;STASH EXTENSION
\r
283 SETZM NUNDIR+3 ;CLEAR PPN
\r
284 LOOKUP BIN,NUNDIR ;LOOK FOR FILE
\r
285 JRST [HLRZ ACEXT,NUNDIR+1 ;WAS EXTENSION "SAV"?
\r
286 CAIE ACEXT,(SIXBIT /SAV/) ;...
\r
287 JRST ERRCF ;GO COMPLAIN
\r
288 MOVSI ACEXT,(SIXBIT /DMP/) ;TRY "DMP" EXTENSION
\r
289 JRST .-3 ] ;TRA -3,4
\r
290 PUSHJ PP,DELETE ;COMMAND FILE
\r
291 MOVE 15,NUNDIR ;GET THE NAME
\r
292 CALLI 15,43 ;TELL SYSTEM "SETNAM"
\r
293 HLRO 15,NUNDIR+3 ;GET WORD COUNT
\r
294 HRLM 15,NUNCOM ;STASH COUNT
\r
295 MOVNS 15 ;NEGATIVE COUNT
\r
296 MOVEI 16,73(15) ;WHERE TO STOP BLT
\r
297 ADDI 15,INHERE ;HOW BIG TO MAKE CORE
\r
298 IORI 15,1777 ;AN EVEN MULTIPLE OF 1K
\r
299 CORE 15, ;ASK TS EXEC FOR CORE
\r
300 JRST [HRROI RC,[SIXBIT /NOT ENUF CORE FOR LINKAGE@/]
\r
301 JRST ERRFIN ];GO COMPLAIN
\r
303 BLT NUNTOP,NUNTOP ;SET ACS
\r
305 TLNN IO,CRPGSW ;WAS RPG IN PROGRESS?
\r
306 TLZ NUNAOS,577000 ;NO, DON'T MAKE NEXT AN RPG
\r
310 NUNGO4: MOVE NUNLAC,INHERE+74-74 ;SETUP FOR NEW DDT
\r
311 SETDDT NUNLAC, ;...
\r
313 JOBS41=122 ;LOADER WILL GIVE MUL. DEF. GLOBAL IF CHANGED
\r
316 MOVE NUNLAC,JOBS41+INHERE-74 ;RESTORE LOC 41
\r
317 MOVEM NUNLAC,JOB41 ;...
\r
318 NUNBLT: BLT NUNTOP,.-. ;MOVE PRGM TO WHERE IT BELONGS
\r
319 RESET ;RESET ALL I/O
\r
320 NUNAOS: AOS 1,JOBSA ;GET STARTING ADDR FOR RPG
\r
321 JRST 0(1) ;GET ON WITH THE GAME
\r
322 NUNPNT: NUNERM ;ERROR MESSAGE POINTER
\r
323 NUNTOP: XWD INHERE+1,75
\r
329 \fIFN RUNSW,< ;ASSEMBLE IF RUN UUO IMPLEMENTED
\r
330 NUNSET: JUMPN ACDEV,.+2
\r
331 MOVSI ACDEV,(SIXBIT /SYS/) ;USE SYS IF NONE SPECIFIED
\r
334 MOVEM ACFILE,RUNFIL ;STORE FILE NAME
\r
335 PUSHJ PP,DELETE ;COMMAND FILE
\r
337 MOVEI 16,RUNDEV ;XWD 0,RUNDEV
\r
338 TLNE IO,CRPGSW ;WAS RPG IN PROGRESS?
\r
339 HRLI 16,1 ;YES. START NEXT AT C(JOBSA)+1
\r
340 RUN 16, ;DO "RUN DEV:NAME"
\r
343 MOVEM ACFILE,RUNDEV+1
\r
347 TLNE IO,CRPGSW ;ARE WE DOING RPG?
\r
348 AOS RUNDEV+3 ;YES SET STARTING ADDRESS INCREMENT
\r
349 MOVEI 16,RUNDEV ;ADDRESS OF SWAPBLOCK
\r
352 HALT ;SHOULDN'T RETURN. HALT IF IT DOES
\r
355 DELETE: HRRZ EXTMP ;IF THE EXTENSION
\r
356 CAIE (SIXBIT/TMP/) ;IS .TMP
\r
358 CLOSE CTL2, ;DELETE
\r
359 SETZB 4,5 ;THE COMMAND FILE.
\r
365 \fSUBTTL START ASSEMBLING
\r
367 ASSEMB: PUSHJ PP,INZ ;INITIALIZE FOR PASS
\r
368 MOVE [ASCII /.MAIN/]
\r
373 ASSEM1: PUSHJ PP,CHARAC ;TEST FOR FORM FEED
\r
374 SKIPGE LIMBO ;CRLF FLAG?
\r
375 JRST ASSEM1 ;YES ,IGNORE LF
\r
384 CAIN C,"\" ;BACK-SLASH?
\r
385 TLZA IO,IOMAC ;YES, LIST IF IN MACRO
\r
387 PUSHJ PP,STMNT ;OFF WE GO
\r
388 TLZN IO,IOENDL ;WAS STOUT PRE-EMPTED?
\r
389 PUSHJ PP,STOUT ;NO, POLISH OFF LINE
\r
392 \fSUBTTL STATEMENT PROCESSOR
\r
394 STMNT: TLZ FR,INDSW!FSNSW
\r
396 STMNT1: PUSHJ PP,LABEL
\r
397 STMNT2: PUSHJ PP,ATOM ;GET THE FIRST ATOM
\r
402 JUMPAD STMNT7 ;NUMERIC EXPRESSION
\r
403 JUMPN AC0,STMN2A ;JUMP IF NON NULL FIELD
\r
404 SKIPN LITLVL ;ALLOW COMMA IN LITERALS
\r
405 CAIE C,14 ;NULL, COMMA?
\r
406 CAIN C,EOL ;OR END OF LINE?
\r
408 CAIN C,"]" ;CLOSING LITERAL?
\r
410 JRST STMNT9 ;NO,AT LEAST SKIP ALL THIS NONSENSE
\r
412 STMN2A: JUMPE C,.+2
\r
414 PUSHJ PP,MSRCH ;SEARCH FOR MACRO/OPDEF/SYN
\r
415 JRST STMNT3 ;NOT FOUND, TRY OP CODE
\r
416 LDB SDEL,[POINT 3,ARG,5]
\r
417 JUMPE SDEL,ERRAX ;ERROR IF NO FLAGS
\r
418 SOJE SDEL,OPD1 ;OPDEF IF 1
\r
419 SOJE SDEL,CALLM ;MACRO IF 2
\r
420 JRST STMNT4 ;SYNONYM, PROCESS WITH OP-CODES
\r
422 STMNT3: PUSHJ PP,OPTSCH ;SEARCH OP CODE TABLE
\r
423 JRST STMNT5 ;NOT FOUND
\r
424 STMNT4: HLLZ AC0,V ;PUT CODE IN AC0
\r
425 TRZ V,ADDF ;CLEAR ADDRESS NON-VALID FLAG
\r
426 TRZE V,LITF ;VALID IN LITERAL?
\r
427 SKIPN LITLVL ;NO, ARE WE IN A LITERAL?
\r
428 JRST 0(V) ;NO, GO TO APPROPRIATE PROCESSOR
\r
431 STMNT5: PUSHJ PP,SSRCH ;TRY SYMBOLS
\r
432 JRST STMNT8 ;NOT FOUND
\r
433 TLNE ARG,EXTF!UNDF ;EXTERNAL OR UNDEFINED?
\r
434 JRST STMNT7 ;YES, PROCESS IN EVALEX
\r
435 TLNN RC,-2 ;CHECK FOR EXTERNAL
\r
438 MOVE AC0,V ;FOUND, PUT VALUE IN AC0
\r
439 TLO IO,NUMSW ;FLAG AS NUMERIC
\r
440 STMNT7: TLZ IO,IORPTC
\r
441 STMNT9: PUSHJ PP,EVALHA ;EVALUATE EXPRESSION
\r
442 IFN FORMSW,< MOVE AC1,HWFORM ;USE STANDARD FORM>
\r
443 TLNE FR,FSNSW ;FIELD SEEN?
\r
444 JRST STOW ;YES,STOW THE CODE AND EXIT
\r
445 CAIE C,"]"-40 ;CLOSING LITERAL?
\r
446 TRO ER,ERRQ ;NO, GIVE "Q" ERROR
\r
449 \fSTMNT8: MOVEI V,0 ;ALWAYS START SCAN WITH 0
\r
450 CAIL V,CALNTH ;END OF TABLE?
\r
451 JRST STMN8C ;YES, TRY TTCALLS
\r
452 CAME AC0,CALTBL(V) ;FOUND IT?
\r
453 AOJA V,.-3 ;NO,TRY AGAIN
\r
454 SUBI V,NEGCAL ;CALLI'S START AT -1
\r
455 HRLI V,(CALLI) ;PUT IN UUO
\r
456 STMN8D: MOVSI ARG,OPDF ;SET FLAG FOR OPDEF
\r
457 STMN8B: PUSHJ PP,INSERT ;PUT OPDEF IN TABLE
\r
458 JRST OPD ;AND TREAT AS OPDEF
\r
460 STMN8C: SETZ V, ;START WITH ZERO
\r
461 CAIL V,TTCLTH ;END OF TABLE?
\r
462 JRST STMN8A ;YES, ERROR
\r
463 CAME AC0,TTCTBL(V) ;MATCH?
\r
464 AOJA V,.-3 ;NO, KEEP TRYING
\r
465 LSH V,5 ;PUT IN AC FIELD (RIGHT HALF)
\r
466 HRLZI V,<(TTCALL)>(V) ;PUT UUO IN LEFT HALF
\r
467 JRST STMN8D ;SET OPDEF FLAG
\r
469 STMN8A: SETZB V,RC ;CLEAR VALUE AND RELOCATION
\r
470 TRO ER,ERRO ;FLAG AS UNDEFINED OP-CODE
\r
471 JUMP1 OPD ;TREAT AS STANDARD OP ON PASS1
\r
472 MOVSI ARG,OPDF!UNDF!EXTF ;SET A FEW FLAGS
\r
473 JRST STMN8B ;TO FORCE OUT A MESSAGE
\r
475 ;STATEMENT OUT PASSES REMAINDER OF LINE (CMNT)
\r
476 ;UNTIL A LINE TERMINATOR IS SEEN.
\r
477 STOUTS: TLOA IO,IOENDL!IORPTC
\r
478 STOUT: TLO IO,IORPTC
\r
481 SKIPL STPX ;YES, ERROR IF CODE STORED
\r
485 STOUT1: PUSHJ PP,CHARAC
\r
489 JRST OUTLIN ;OUTPUT THE LINE (BIN AND LST)
\r
490 \f SUBTTL LABEL PROCESSOR
\r
492 LABEL: JUMPAD LABEL4 ;COMPARE IF NON-SYMBOLIC
\r
493 JUMPE AC0,LABEL5 ;ERROR IF BLANK
\r
494 TLO IO,DEFCRS ;THIS IS A DEFINITION
\r
495 PUSHJ PP,SSRCH ;SEARCH FOR OPERAND
\r
496 MOVSI ARG,SYMF!UNDF!TAGF ;NOT FOUND
\r
497 TLNN ARG,EXTF ;OPERAND FOUND (SKIP EXIT)
\r
499 JUMP1 LABEL3 ;ERROR ON PASS1
\r
500 TLNN ARG,UNDF ;UNDEFINED ON PASS1
\r
501 JRST LABEL3 ;NO, FLAG ERROR
\r
502 TLZ ARG,EXTF!PNTF ;TURN OFF EXT FLAG NOW
\r
503 LABEL0: TLZN ARG,UNDF!VARF ;WAS IT PREVIOUSLY DEFINED?
\r
504 JRST LABEL2 ;YES, CHECK EQUALITY
\r
508 PUSHJ PP,PEEK ;GET NEXT CHAR.
\r
509 CAIE C,":" ;SPECIAL CHECK FOR ::
\r
510 JRST LABEL1 ;NO MATCH
\r
511 TLO ARG,INTF ;MAKE IT INTERNAL
\r
512 PUSHJ PP,GETCHR ;PROCESS NEXT CHAR.
\r
513 PUSHJ PP,PEEK ;PREVIEW NEXT CHAR.
\r
514 LABEL1: CAIE C,"!" ;HALF-KILL SIGN
\r
516 TLO ARG,NOOUTF ;YES, SUPPRESS IT
\r
517 PUSHJ PP,GETCHR ;AND GET RID OF IT
\r
518 LABEL6: MOVEM AC0,TAG ;SAVE FOR PASS 1 ERRORS
\r
519 HLLZS TAGINC ;ZERO INCREMENT
\r
520 JRST INSERT ;INSERT/UPDATE AND EXIT
\r
522 LABEL2: HRLOM V,LOCBLK ;SAVE LIST LOCATION
\r
523 CAMN V,LOCA ;DOES IT COMPARE WITH PREVIOUS? WFW
\r
525 LABEL3: TLOA ARG,MDFF ;NO, FLAG MULTIPLY DEFINED AND SKIP
\r
526 JRST LABEL7 ;YES, GET RID OF EXTRA CHARS.
\r
527 TRO ER,ERRM ;FLAG MULTIPLY DEFINED ERROR
\r
528 JRST UPDATE ;UPDATE AND EXIT
\r
530 LABEL4: CAMN AC0,LOCA ;DO THEY COMPARE?
\r
532 LABEL5: TRO ER,ERRP ;NO, FLAG PHASE ERROR
\r
535 LABEL7: SKIPE LITLVL ;LABEL IN A LITERAL?
\r
536 MOVEM AC0,LITLBL ;YES, SAVE LABEL NAME FOR LATER
\r
537 PUSHJ PP,PEEK ;INSPECT A CHAR.
\r
539 PUSHJ PP,GETCHR ;YES, DISPOSE OF IT
\r
540 PUSHJ PP,PEEK ;EXAMINE ONE MORE CHAR.
\r
541 CAIN C,"!" ;EXCLAMATION?
\r
542 JRST GETCHR ;YES, INDEED
\r
544 \fSUBTTL ATOM PROCESSOR
\r
545 ATOM: PUSHJ PP,CELL ;GET FIRST CELL
\r
546 TLNE IO,NUMSW ;IF NON-NUMERIC
\r
547 ATOM1: CAIE C,42 ;OR NOT A BINARY SHIFT,
\r
550 PUSH PP,AC0 ;STACK REGISTERS, ITS A BINARY SHIFT
\r
554 HRRI RX,^D10 ;COMPUTE SHIFT RADIX 10
\r
555 PUSHJ PP,CELLSF ;GET SHIFT
\r
556 MOVE ARG,RC ;SAVE RELOCATION
\r
557 POP PP,RX ;RESTORE REGISTERS
\r
560 MOVN SX,AC0 ;USE NEGATIVE OF SHIFT
\r
562 JUMPN ARG,NUMER2 ;IF NOT ABSOLUTE
\r
563 TLNN IO,NUMSW ;AND NUMERIC,
\r
564 JRST NUMER2 ;FLAG ERROR
\r
567 JRST ATOM1 ;TEST FOR ANOTHER
\r
568 \fCELLSF: TLO IO,FLDSW
\r
569 CELL: SETZB AC0,RC ;CLEAR RESULT AND RELOCATION
\r
570 SETZB AC1,AC2 ;CLEAR WORK REGISTERS
\r
571 MOVEM PP,PPTEMP ;SAVE PUSHDOWN POINTER
\r
573 TLZA FR,NEGSW!DCFSW!RADXSW
\r
575 CELL1: TLO IO,FLDSW
\r
577 LDB V,[POINT 4,CSTAT(C),14] ;GET CODE
\r
578 XCT .+1(V) ;EXECUTE, INDEX VIA BITS 11,12,13,14 OF CSTAT TABLE
\r
579 JRST CELL1 ;0; BLANK, (TAB OR "+")
\r
580 JRST LETTER ;1; LETTER ] $ % ( ) , ; >
\r
581 TLC FR,NEGSW ;2; "-"
\r
582 TLO FR,INDSW ;3; "@"
\r
583 JRST NUM1 ;4; NUMERIC 0 - 9
\r
586 JRST QUOTES ;7; ""","'"
\r
588 JRST PERIOD ;11; "."
\r
589 TROA ER,ERRQ ;12; ERROR, FLAG AND TREAT AS DELIMITER
\r
590 ;12; ! # & * / : = ? \ _
\r
591 \fLETTER: TLOA AC2,(POINT 6,AC0,) ;SET BYTE POINTER
\r
592 LETTE1: PUSHJ PP,GETCHR ;GET CHARACTER
\r
593 TLNN CS,6 ;ALPHA-NUMERIC?
\r
594 JRST LETTE3 ;NO,TEST FOR VARIABLE
\r
595 TLNE AC2,770000 ;STORE ONLY SIX BYTES
\r
596 LETTE2: IDPB C,AC2 ;RETURN FROM PERIOD
\r
599 LETTE3: CAIE C,03 ;"#"?
\r
601 JUMPE AC0,POPOUT ;TEST FOR NULL
\r
602 PUSHJ PP,PEEK ;PEEK AT NEXT CHAR.
\r
603 CAIN C,"#" ;IS IT 2ND #?
\r
604 JRST LETTE4 ;YES, THEN IT'S AN EXTERN
\r
606 PUSHJ PP,SSRCH ;YES, SEARCH FOR SYMBOL (OPERAND)
\r
607 MOVSI ARG,SYMF!UNDF ;NOT FOUND, FLAGAS UNDEFINED SYM.
\r
608 TLNN ARG,UNDF ;UNDEFINED?
\r
609 JRST GETCHR ;NO, GET NEXT CHAR AND RETURN
\r
610 TLO ARG,VARF ;YES, FLAG AS A VARIABLE
\r
611 TRO ER,ERRU ;SET UNDEFINED ERROR FLAG
\r
612 PUSHJ PP,INSERZ ;INSERT IT WITH A ZERO VALUE
\r
615 LETTE4: PUSHJ PP,GETCHR ;AND SCAN PAST IT
\r
616 PUSHJ PP,GETCHR ;GET RID OF #
\r
617 JRST EXTER1 ;PUT IN SYMBOL TABLE
\r
619 NUMER1: SETZB AC0,RC ;RETURN ZERO
\r
620 NUMER2: TRO ER,ERRN ;FLAG ERROR
\r
622 GETDEL: PUSHJ PP,BYPASS
\r
623 GETDE1: JUMPE C,.-1
\r
625 GETDE3: TLO IO,NUMSW!FLDSW ;FLAG NUMERIC
\r
626 TLNN FR,NEGSW ;IS ATOM NEGATIVE?
\r
631 GETDE2: MOVNS AC0 ;YES, NEGATE VALUE
\r
632 MOVNS RC ;AND RELOCATION
\r
633 POPOUT: POPJ PP, ;EXIT
\r
634 \fQUOTES: CAIE C,"'"-40 ;IS IT "'"
\r
635 JRST QUOTE ;NO MUST BE """
\r
638 QUOTE0: TLNE AC0,376000 ;5 CHARACTERS STORED ALREADY?
\r
639 TRO ER,ERRQ ;YES, GIVE WARNING
\r
642 QUOTE: PUSHJ PP,CHARAC ;GET 7-BIT ASCII
\r
643 CAIG C,15 ;TEST FOR LF, VT, FF OR CR
\r
645 JRST .+2 ;NO, SO ALL IS WELL
\r
646 JRST QUOTE2 ;ESCAPE WITH Q ERROR
\r
649 PUSHJ PP,PEEK ;LOOK AT NEXT CHAR.
\r
651 JRST QUOTE1 ;RESTORE REPEAT LEVEL AND QUIT
\r
652 PUSHJ PP,CHARAC ;GET NEXT CHAR.
\r
653 JRST QUOTE0 ;USE IT
\r
655 QUOTE2: TRO ER,ERRQ ;SET Q ERROR
\r
656 QUOTE1: JRST GETDEL
\r
658 SQUOT0: TLNE AC0,770000 ;SIX CHARS. STORED ALREADY ?
\r
661 IORI AC0,-40(C) ;OR IN SIXBIT CHAR.
\r
663 SQUOTE: PUSHJ PP,CHARAC
\r
676 \fQUAL: PUSHJ PP,BYPAS1 ;SKIP BLANKS, GET NEXT CHARACTER
\r
678 JRST QUAL2 ;YES, RADIX=D2
\r
680 JRST QUAL8 ;YES, RADIX=D8
\r
682 JRST NUMDF ;YES, PROCESS DECIMAL FRACTION
\r
686 JRST NUMER1 ;NO, FLAG NUMERIC ERROR
\r
705 \fSUBTTL LITERAL PROCESSOR
\r
708 PUSH PP,EXTPNT ;ALLOW EXTERN TO PRECEDE LIT IN XWD
\r
710 SKIPE LITLVL ;SAVE SEQNO AND PAGE IF NOT IN LIT ALREADY
\r
716 SQB5: JSP AC2,SVSTOW
\r
717 SQB3: PUSHJ PP,STMNT
\r
718 CAIN C,75 ;CHECK FOR ]
\r
721 TLNE FR,MWLFLG ;CALL IT ] IF NOT MULTI-WORD FLAG
\r
722 JRST SQB2 ;BUT REPEAT LAST CHARACTER
\r
727 SQB4: PUSHJ PP,CHARAC
\r
728 CAIN C,";" ;COMMENT?
\r
729 JRST SQB6 ;YES, IGNORE SQUARE BRACKETS
\r
730 CAIN C,"]" ;LOOK FOR TERMINAL SQB
\r
731 TRNN ER,ERRORS ;IN CASE OF ERROR IN LITERAL
\r
732 JRST .+2 ;NO ALL IS WELL
\r
733 JRST SQB1 ;FINISH THE LITERAL NOW!!
\r
734 CAIG C,CR ;LOOK FOR END OF LINE
\r
737 SQB4A: PUSHJ PP,OUTIML ;DUMP
\r
738 PUSHJ PP,CHARAC ;GET ANOTHER CHAR.
\r
739 SKIPL LIMBO ;CRLF FLAG
\r
740 TLO IO,IORPTC ;NO REPEAT
\r
743 SQB6: PUSHJ PP,CHARAC ;GET A CHARACTER
\r
745 CAIN C,HT ;LOOK FOR END OF LINE CHAR.
\r
749 SQB1: TLZ IO,IORPTC
\r
750 SQB2: PUSHJ PP,STOLIT
\r
752 SKIPE LITLBL ;NEED TO FIXUP A LABEL?
\r
753 PUSHJ PP,RELBLE ;YES, USE LOC OF LITERAL
\r
756 SKIPE LITLVL ;WERE WE NESTED?
\r
757 JUMP1 NUMER2 ;YES, FORCE ERROR IF PASS 1
\r
760 RELBLE: PUSH PP,AC0 ;SAVE LOCATION COUNTER
\r
761 PUSH PP,RC ;AND RELOCATION
\r
762 MOVE AC0,LITLBL ;SYMBOL WE NEED
\r
763 SETZM LITLBL ;ZERO INDICATOR
\r
764 PUSHJ PP,SSRCH ;SEARCH FOR OPERAND
\r
765 JRST RELBL1 ;SHOULD NEVER HAPPEN
\r
766 TLNN ARG,TAGF ;IT BETTER BE A LABEL
\r
767 JRST RELBL1 ;IT WASN'T , GIVE UP BEFORE SOME HARM IS DONE
\r
768 TLZ ARG,UNDF!EXTF!PNTF ;CLEAR FLAGS NOW
\r
769 POP PP,RC ;GET LITERAL RELOCATION
\r
770 MOVE V,(PP) ;GET VALUE (LOC COUNTER)
\r
771 PUSHJ PP,UPDATE ;UPDATE VALUE
\r
772 POP PP,AC0 ;RESTORE LITERAL COUNT
\r
775 RELBL1: POP PP,RC ;RESTORE RC
\r
776 POP PP,AC0 ;AND AC0
\r
777 POPJ PP, ;JUST RETURN
\r
778 \fANGLB: PUSH PP,FR
\r
788 ANGLB1: PUSHJ PP,EVALHA
\r
794 PERIOD: PUSHJ PP,GETCHR ;LOOK AT NEXT CHARACTER
\r
795 TLNN CS,2 ;ALPHABETIC?
\r
796 JRST PERNUM ;NO, TEST NUMERIC
\r
797 MOVSI AC0,(SIXBIT /./) ;YES, PUT PERIOD IN AC0
\r
798 MOVSI AC2,(POINT 6,AC0,5) ;SET BYTE POINTER
\r
799 JRST LETTE2 ;AND TREAT AS SYMBOL
\r
801 PERNUM: TLNE CS,4 ;IS IT A NUMBER
\r
803 MOVE AC0,LOCA ;NO. CURRENT LOC SYMBOL (.)
\r
804 MOVE RC,MODA ;SET TO CURRENT ASSEMBLY MODE
\r
805 JRST GETDE1 ;GET DELIMITER
\r
806 NUMDF: TLO FR,DCFSW ;SET DECIMAL FRACTION FLAG
\r
807 NUM: PUSHJ PP,GETCHR ;GET A CHARACTER
\r
808 TLNN CS,4 ;NUMERIC?
\r
810 NUM1: SUBI C,20 ;CONVERT TO OCTAL
\r
811 PUSH PP,C ;STACK FOR FLOATING POINT
\r
814 ADD AC1,C ;ADD IN LAST VALUE
\r
815 CAIL C,0(RX) ;IS NUMBER LESS THAN CURRENT RADIX?
\r
816 TLO FR,RADXSW ;NO, SET FLAG
\r
817 AOJA AC2,NUM ;YES, AC2=NO. OF DECIMAL PLACES
\r
819 \fNUM10: CAIE C,16 ;PERIOD?
\r
820 TLNE FR,DCFSW ;OR DECIMAL FRACTION?
\r
821 JRST NUM30 ;YES, PROCESS FLOATING POINT
\r
822 LSH AC1,1 ;NO, CLEAR THE SIGN BIT
\r
823 LSHC AC0,^D35 ;AND SHIFT INTO AC0
\r
824 MOVE PP,PPTEMP ;RESTORE PP
\r
825 SOJE AC2,GETDE1 ;NO RADIX ERROR TEST IF ONE DIGIT
\r
826 TLNE FR,RADXSW ;WAS ILLEGAL NUMBER ENCOUNTERED?
\r
827 TRO ER,ERRN ;YES, FLAG N ERROR
\r
830 NUM30: CAIE C,"B"-40 ;IF "B" THEN MISSING "."
\r
831 NUM31: PUSHJ PP,GETCHR
\r
832 TLNN CS,4 ;NUMERIC?
\r
838 NUM40: PUSH PP,FR ;STACK VALUES
\r
843 JRST [PUSHJ PP,PEEK ;GET NEXT CHAR
\r
844 PUSH PP,C ;SAVE NEXT CHAR
\r
845 PUSHJ PP,CELL ;YES, GET EXPONENT
\r
846 POP PP,C ;GET FIRST CHAR. AFTER E
\r
847 CAIN V,4 ;MUST HAVE NUMERICAL STATUS
\r
848 JRST .+2 ;SKIP RETURN
\r
849 CAIN C,"<" ;ALLOW <EXP>
\r
850 JRST .+2 ;SKIP RETURN
\r
851 SKIPN AC0 ;ERROR IF NON-ZERO EXPRESSION
\r
852 TROA ER,ERRQ ;ALLOW E+,E-
\r
853 SETOM RC ;FORCE NUMERICAL ERROR
\r
854 JRST .+2] ;SKIP RETURN
\r
855 MOVEI AC0,0 ;NO, ZERO EXPONENT
\r
861 JUMPN RC,NUMER1 ;EXPONENT MUST BE ABSOLUTE
\r
868 JOV NUM50 ;CLEAR OVERFLOW FLAG
\r
870 NUM50: JSP SDEL,NUMUP ;FLOATING POINT
\r
871 JRST NUM52 ;END OF WHOLE NUMBERS
\r
872 FMPR AC0,[10.0] ;MULTIPLY BY 10
\r
873 TLO AC1,233000 ;CONVERT TO FLOATING POINT
\r
874 FADR AC0,AC1 ;ADD IT IN
\r
877 NUM52: JSP SDEL,NUMDN ;PROCESS FRACTION
\r
879 JOV NUMER1 ;TEST FOR OVERFLOW
\r
884 FADR AC2,AC1 ;ACCUMULATE FRACTION
\r
888 NUM60: JSP SDEL,NUMUP
\r
894 NUM62: LSHC AC1,-^D36
\r
917 GETSYM: MOVEI AC0,0 ;CLEAR AC0
\r
918 MOVSI AC1,(POINT 6,AC0) ;PUT POINTER IN AC1
\r
919 PUSHJ PP,BYPASS ;SKIP LEADING BLANKS
\r
920 TLNN CS,2 ;ALPHABETIC?
\r
921 JRST GETSY1 ;NO, ERROR
\r
923 JRST GETSY2 ;NO, A VALID SYMBOL
\r
924 IDPB C,AC1 ;STORE THE CHARACTER
\r
925 PUSHJ PP,GETCHR ;YES, TEST NEXT CHARACTER
\r
926 TLNN CS,2 ;ALPHABETIC?
\r
927 GETSY1: TROA ER,ERRA
\r
928 GETSY2: AOS 0(PP) ;YES, SET SKIP EXIT
\r
929 GETSY3: TLNN CS,6 ;ALPHA-NUMERIC?
\r
930 JRST BYPAS2 ;NO, GET DELIMITER
\r
931 TLNE AC1,770000 ;YES, HAVE WE STORED SIX?
\r
932 IDPB C,AC1 ;NO, STORE IT
\r
936 \fSUBTTL EXPRESSION EVALUATOR
\r
937 CV== AC0 ;CURRENT VALUE
\r
938 PV== AC1 ;PREVIOUS VALUE
\r
939 RC== RC ;CURRENT RELOCATABILITY
\r
940 PR== AC2 ;PREVIOUS RELOCATABILITY
\r
941 CS= CS ;CURRENT STATUS
\r
942 PS== SDEL ;PREVIOUS STATUS
\r
944 EVALHA: TLO FR,TMPSW
\r
945 EVALCM: PUSHJ PP,EVALEX ;EVALUATE FIRST EXPRESSION
\r
946 PUSH PP,[0] ;MARK PDL
\r
947 JUMPCM EVALC3 ;JUMP IF COMMA
\r
948 TLO IO,IORPTC ;IT'S NOT,SO REPEAT
\r
949 JRST OP ;PROCESS IN OP
\r
951 IFN FORMSW,<PUSH PP,INFORM ;PUT FORM WORD ON STACK>
\r
952 PUSH PP,[0] ;STORE ZERO'S ON PDL
\r
953 PUSH PP,[0] ;.......
\r
954 MOVSI AC2,(POINT 4,(PP),12)
\r
955 JRST OP1B ;PROCESS IN OP
\r
957 EVALEX: TLO IO,FLDSW
\r
958 PUSH PP,[XWD TNODE,0] ;MARK THE LIST 200000,,0
\r
960 EVATOM: PUSHJ PP,ATOM ;GET THE NEXT ATOM
\r
961 JUMPE AC0,EVGETD ;TEST FOR NULL/ZERO
\r
962 TLOE IO,NUMSW ;SET NUMERIC, WAS IT PREVIOUSLY?
\r
963 JRST EVGETD+1 ;YES, TREAT ACCORDINGLY
\r
964 PUSHJ PP,SEARCH ;SEARCH FOR MACRO OR SYMBOL
\r
965 JRST EVOP ;NOT FOUND, TRY FOR OP-CODE
\r
966 JUMPL ARG,.+2 ;SKIP IF OPERAND
\r
967 PUSHJ PP,SSRCH1 ;OPERATOR, TRY FOR SYMBOL (OPERAND)
\r
968 PUSHJ PP,QSRCH ;PERFORM CROSS-REFERENCE
\r
969 JUMPG ARG,EVMAC ;BRANCH IF OPERATOR
\r
970 MOVE AC0,V ;SYMBOL, SET VALUE
\r
971 JRST EVTSTS ;TEST STATUS
\r
973 EVMAC: TLNE FR,NEGSW ;UNARY MINUS?
\r
974 JRST EVERRZ ;YES, INVALID BEFORE OPERATOR
\r
975 LDB SDEL,[POINT 3,ARG,5] ;GET MACF/OPDF/SYNF
\r
976 SOJL SDEL,EVERRZ ;ERROR IF NO FLAGS
\r
978 JUMPE C,.+2 ;NON-BLANK?
\r
979 TLO IO,IORPTC ;YES, REPEAT CHARACTER
\r
980 SOJE SDEL,CALLM ;MACRO IF 2
\r
981 JUMPG SDEL,EVOPS ;SYNONYM IF 4
\r
984 MOVEI V,OP ;SET TRANSFER VECTOR
\r
986 \fEVOP: TLNE FR,NEGSW ;OPCODE, UNARY MINUS?
\r
987 JRST EVERRZ ;YES, ERROR
\r
989 PUSHJ PP,OPTSCH ;SEARCH SYMBOL TABLE
\r
990 JRST EVOPX ;NOT FOUND
\r
991 EVOPS: TRZ V,LITF ;CLEAR LIT INVALID FLAG
\r
992 TRZE V,ADDF ;SYNONYM
\r
993 JRST EVOPX ;PSEUDO-OP THAT GENERATES NO DATA JUMPS
\r
995 EVOPD: JUMPE C,.+2 ;OPDEF, NON-BLANK DELIMITER?
\r
996 TLO IO,IORPTC ;YES, REPEAT CHARACTER
\r
1007 EVOPX: MOVSI ARG,SYMF!UNDF
\r
1009 EVERRZ: SETZB AC0,RC ;CLEAR CODE AND RELOCATION
\r
1010 EVERRU: TRO ER,ERRU
\r
1012 \fEVTSTS: TLNE ARG,UNDF
\r
1013 JRST [TRO ER,ERRU ;SET UNDEF ERROR
\r
1014 JUMP1 EVGETD ;TREAT AS UNDF ON PASS1
\r
1015 JRST .+1] ;TREAT AS EXTERNAL ON PASS2
\r
1018 HRRZ RC,ARG ;GET ADRES WFW
\r
1019 HRRZ ARG,EXTPNT ;SAVE IT WFW
\r
1020 HRRM RC,EXTPNT ;WFW
\r
1025 EVTSTR: TLNE ARG,MDFF ;MULTIPLY DEFINED?
\r
1026 TRO ER,ERRD ;YES, FLAG IT
\r
1027 TLNE FR,NEGSW ;NEGATIVE ATOM?
\r
1028 PUSHJ PP,GETDE2 ;YES, NEGATE AC0 AND RC
\r
1030 EVGETD: TLNE IO,NUMSW ;NON BLANK FIELD
\r
1031 TLO FR,FSNSW ;YES,SET FLAG
\r
1033 TLNE CS,6 ;ALPHA-NUMERIC?
\r
1034 TLO IO,IORPTC ;YES, REPEAT IT
\r
1035 EVNUM: POP PP,PS ;POP THE PREVIOUS DELIMITER/TNODE
\r
1037 CAMGE PS,CS ;OPERATION REQUIRED?
\r
1038 JRST EVPUSH ;NO, PUT VALUES BACK ON STACK
\r
1039 TLNN PS,TNODE ;YES, HAVE WE REACHED TERMINAL NODE?
\r
1040 JRST EVXCT ;NO, EXECUTION REQUIRED
\r
1041 TLNN CS,170000 ;YES, ARE WE POINTING AT DEL? (& ! * / + - _)
\r
1042 POPJ PP, ;YES, EXIT
\r
1043 ;NO,FALL INTO EVPUSH
\r
1045 \fEVPUSH: PUSH PP,PS ;STACK VALUES
\r
1049 JRST EVATOM ;GET NEXT ATOM
\r
1051 EVXCT: POP PP,PR ;POP PREVIOUS RELOCATABILITY
\r
1052 POP PP,PV ;AND PREVIOUS VALUE
\r
1053 LDB PS,[POINT 3,PS,29] ;TYPE OF OPERATION TO PS
\r
1054 JRST .+1(PS) ;PERFORM PROPER OPERATION
\r
1055 JRST ASSEM1 ;0; SHOULD NEVER GET HERE ;DMN
\r
1061 TDOA CV,PV ;6; MERGE PV INTO CV
\r
1062 AND CV,PV ;7; AND PV INTO CV
\r
1063 JUMPN RC,.+2 ;COMMON RELOCATION TEST
\r
1064 EVXCT1: JUMPE PR,EVNUM
\r
1065 TRO ER,ERRR ;BOTH MUST BE FIXED
\r
1066 JRST EVNUM ;GO TRY AGAIN
\r
1076 XDIV: IDIV PR,CV ;CORRECT RELOCATABILITY
\r
1078 XDIV1: EXCH PR,RC ;TAKE RELOCATION OF NUMERATOR
\r
1081 XMUL: JUMPE PR,XMUL1 ;AT LEAST ONE OPERAND
\r
1082 JUMPE RC,XMUL1 ;MUST BE FIXED
\r
1084 XMUL1: IORM PR,RC ;GET RELOCATION TO RC
\r
1085 CAMGE PV,CV ;FIND THE GREATER
\r
1086 EXCH PV,CV ;FIX IN CASE CV=0,OR 1
\r
1094 \f SUBTTL LITERAL STORAGE HANDLER
\r
1097 IFE FORMSW,< SETZB AC0,RC ;ERROR, NO CODE STORED
\r
1098 PUSHJ PP,STOW ;STOW ZERO>
\r
1099 IFN FORMSW,< MOVEI AC0,0
\r
1101 TRO ER,ERRL ;AND FLAG THE ERROR
\r
1103 STOLIT: MOVE SDEL,STPX
\r
1104 SUB SDEL,STPY ;COMPUTE NUMBER OF WORDS
\r
1105 JUMPE SDEL,STOLER ;ERROR IF NONE STORED
\r
1106 TRNN ER,ERRORS ;ANY ERRORS?
\r
1108 JUMP2 STOL22 ;YES, NO SEARCH. BRANCH IF PASS2
\r
1109 ADDM SDEL,LITCNT ;PASS ONE, UPDATE COUNT
\r
1110 JRST STOWI ;INITIALIZE STOW
\r
1112 STOL06: MOVEI SX,LITAB ;PREPARE FOR SEARCH
\r
1113 MOVE ARG,STPX ;SAVE IN THE EVENT OF MULTIPLE-WORD
\r
1117 STOL08: PUSHJ PP,DSTOW ;GET VALUE WFW
\r
1119 STOL10: SOJL AC2,STOL24 ;TEST FOR END
\r
1120 MOVE SX,0(SX) ;NO, GET NEXT STORAGE CELL
\r
1121 MOVE V,-1(SX) ;GET RELOCATION BITS WFW
\r
1122 CAMN AC0,-2(SX) ;DO CODES COMPARE? WFW
\r
1123 CAME RC,V ;YES, HOW ABOUT RELOCATION?
\r
1124 AOJA SDEL,STOL10 ;NO, TRY AGAIN
\r
1125 SKIPGE STPX ;YES, MULTI-WORD?
\r
1126 JRST STOL26 ;NO, JUST RETURN LOCATION
\r
1127 MOVEM AC2,SAVBLK+AC2 ;YES, SAVE STARTING INFO
\r
1128 MOVEM SX,SAVBLK+SX
\r
1130 STOL12: SOJL AC2,STOL23 ;TEST FOR END
\r
1131 PUSHJ PP,DSTOW ;GET NEXT WORD WFW
\r
1132 MOVE SX,0(SX) ;UPDATE POINTER
\r
1133 MOVE V,-1(SX) ;GET RELOCATION WFW
\r
1134 CAMN AC0,-2(SX) ;COMPARE VALUE WFW
\r
1135 CAME RC,V ;AND RELOCATION
\r
1136 JRST STOL14 ;NO MATCH, TRY AGAIN
\r
1137 SKIPL STPX ;MATCH, HAVE WE FINISHED SEARCH?
\r
1138 JRST STOL12 ;NO, TRY NEXT WORD
\r
1139 JRST STOL26 ;YES, RETURN LOCATION
\r
1141 STOL14: MOVE AC2,SAVBLK+AC2 ;RESTORE STOW POINTERS
\r
1145 AOJA SDEL,STOL08 ;BETTER LUCK NEXT TIME
\r
1147 STOL22: MOVE SDEL,LITNUM
\r
1148 STOL23: PUSHJ PP,DSTOW ;DSTOW AND CONVERT
\r
1149 STOL24: MOVE SX,LITABX ;GET CURRENT STORAGE
\r
1150 PUSHJ PP,GETTOP ;GET NEXT CELL
\r
1151 MOVEM AC0,-2(SX) ;STORE CODE WFW
\r
1152 MOVEM RC,-1(SX) ;WFW
\r
1156 MOVEM SX,LITABX ;SET POINTER TO CURRENT CELL
\r
1157 AOS LITNUM ;INCREMENT NUMBER STORED
\r
1158 AOS LITCNT ;INCREMENT NUMBER RESERVED
\r
1159 SKIPL STPX ;ANY MORE CODE?
\r
1161 STOL26: JUMP1 POPOUT ;EXIT IF PASS ONE
\r
1162 MOVE SX,LITHDX ;GET HEADER BLOCK
\r
1163 HLRZ RC,-1(SX) ;GET BLOCK RELOCATION
\r
1165 ADDI AC0,0(SDEL) ;COMPUTE ACTUAL LOCATION
\r
1168 \fSUBTTL INPUT ROUTINES
\r
1169 GETCHR: PUSHJ PP,CHARAC ;GET ASCII CHARACTER
\r
1170 CAIL C,"A"+40 ;CHECK FOR LOWER CASE
\r
1172 JRST .+2 ;NOT LOWER CASE
\r
1184 TRZA C,100 ;CONVERT LOWER CASE TO SIXBIT>
\r
1185 SUBI C,40 ;CONVERT TO SIXBIT
\r
1186 CAIG C,77 ;CHAR GREATER THAN SIXBIT?
\r
1187 JUMPGE C,GETCS ;TEST FOR VALID SIXBIT
\r
1188 ADDI C,40 ;BACK TO ASCII
\r
1189 CAIN C,HT ;CHECK FOR TAB
\r
1190 JRST GETCS2 ;MAKE IT LOOK LIKE SPACE
\r
1191 CAIG C,CR ;GREATER THAN CR
\r
1192 CAIG C,HT ;GREATER THAN TAB
\r
1193 JRST GETCS1 ;IS NOT FF,VT,LF OR CR
\r
1194 MOVEI C,EOL ;LINE OR FORM FEED OR V TAB
\r
1195 TLOA IO,IORPTC ;REPEAT CHARACTER
\r
1196 GETCS2: MOVEI C,0 ;BUT TREAT AS BLANK
\r
1197 GETCS: MOVE CS,CSTAT(C) ;GET STATUS BITS
\r
1200 GETCS1: JUMPE C,GETCS ;IGNORE NULS
\r
1201 TRC C,100 ;MAKE CHAR. VISIBLE
\r
1203 DPB CS,LBUFP ;PUT ^ IN OUTPUT
\r
1204 PUSHJ PP,RSW2 ;ALSO MODIFIED CHAR.
\r
1205 TRO ER,ERRQ ;FLAG Q ERROR
\r
1206 JRST GETCHR ;BUT IGNORE CHAR.
\r
1208 CHARAC: TLZE IO,IORPTC ;REPEAT REQUESTED?
\r
1210 RSW0: JUMPN MRP,MREAD ;BRANCH IF TREE POINTER SET
\r
1212 RSW1: SKIPE RPOLVL ;ARE WE IN "REPEAT ONCE"?
\r
1214 RSW2: MOVE CS,LIMBO ;GET LAST CHAR.
\r
1215 MOVEM C,LIMBO ;STORE THIS CHAR. FOR RPTC
\r
1217 CAIE CS,CR ;YES,LAST CHAR. A CR?
\r
1219 HRROS LIMBO ;YES,FLAG
\r
1220 POPJ PP, ;AND EXIT
\r
1222 RSW3: TLNE IO,IOSALL ;MACRO SUPPRESS ALL?
\r
1223 JUMPN MRP,CPOPJ ;YES,DON'T LIST IN MACRO
\r
1224 SOSG CPL ;ANY ROOM IN THE IMAGE BUFFER?
\r
1225 PUSHJ PP,OUTPL ;NO, OUTPUT THE PARTIAL LINE
\r
1226 IDPB C,LBUFP ;YES, STORE IN PRINT AREA
\r
1228 POPJ PP, ;NO, EXIT
\r
1230 ANDCAM C,CPL ;MASK
\r
1231 CHARAX: HRRZ C,LIMBO ;GET LAST CHARACTER
\r
1234 CHARL: PUSHJ PP,CHARAC ;GET AND TEST 7-BIT ASCII
\r
1235 CAIG C,FF ;LINE OR FORM FEED OR VT?
\r
1238 SKIPE LITLVL ;IN LITERAL?
\r
1240 CHARL1: PUSHJ PP,SAVEXS ;SAVE REGISTERS
\r
1241 PUSHJ PP,OUTLIN ;DUMP THE LINE
\r
1242 JRST RSTRXS ;RESTORE REGISTERS AND EXIT
\r
1243 \fSUBTTL CHARACTER STATUS TABLE
\r
1245 DEFINE GENCS (OPLVL,ATOM,AN,SQUOZ,OPTYPE,SEQNO)
\r
1246 <BYTE (6)OPLVL (9)ATOM (3)AN (6)SQUOZ,OPTYPE,SEQNO>
\r
1248 ;OPLVL PRIORITY OF BINARY OPERATORS
\r
1249 ;ATOM INDEX TO JUMP TABLE AT CELL1
\r
1250 ;AN TYPE OF CHARACTER
\r
1251 ; 1=OTHER, 2=ALPHA, 4=NUMERIC
\r
1252 ;SQUOZ VALUE IN RADIX 50
\r
1253 ;OPTYPE INDEX TO JUMP TABLE AT EVXCT
\r
1254 ;SEQNO VALUE IN SIXBIT
\r
1256 GENCS 00,00,1,00,00,00 ; ' '
\r
1257 GENCS 04,12,1,00,06,01 ; '!'
\r
1258 GENCS 00,07,1,00,00,02 ; '"'
\r
1259 GENCS 00,12,1,00,00,03 ; '#'
\r
1260 GENCS 00,01,2,46,00,04 ; '$'
\r
1261 GENCS 00,01,2,47,00,05 ; '%'
\r
1262 GENCS 04,12,1,00,07,06 ; '&'
\r
1263 GENCS 00,07,1,00,00,07 ; '''
\r
1265 GENCS 00,01,1,00,00,10 ; '('
\r
1266 GENCS 00,01,1,00,00,11 ; ')'
\r
1267 GENCS 02,12,1,00,01,12 ; '*'
\r
1268 GENCS 01,00,1,00,03,13 ; '+'
\r
1269 GENCS 40,01,1,00,00,14 ; ','
\r
1270 GENCS 01,02,1,00,04,15 ; '-'
\r
1271 GENCS 00,11,2,45,00,16 ; '.'
\r
1272 GENCS 02,12,1,00,02,17 ; '/'
\r
1274 GENCS 00,04,4,01,00,20 ; '0'
\r
1275 GENCS 00,04,4,02,00,21 ; '1'
\r
1276 GENCS 00,04,4,03,00,22 ; '2'
\r
1277 GENCS 00,04,4,04,00,23 ; '3'
\r
1278 GENCS 00,04,4,05,00,24 ; '4'
\r
1279 GENCS 00,04,4,06,00,25 ; '5'
\r
1280 GENCS 00,04,4,07,00,26 ; '6'
\r
1281 GENCS 00,04,4,10,00,27 ; '7'
\r
1283 GENCS 00,04,4,11,00,30 ; '8'
\r
1284 GENCS 00,04,4,12,00,31 ; '9'
\r
1285 GENCS 00,12,1,00,00,32 ; ':'
\r
1286 GENCS 00,01,1,00,00,33 ; ';'
\r
1287 GENCS 00,05,1,00,00,34 ; '<'
\r
1288 GENCS 00,12,1,00,00,35 ; '='
\r
1289 GENCS 00,01,1,00,00,36 ; '>'
\r
1290 GENCS 00,12,1,00,00,37 ; '?'
\r
1291 \f GENCS 00,03,1,00,00,40 ; '@'
\r
1292 GENCS 00,01,2,13,00,41 ; 'A'
\r
1293 GENCS 00,01,2,14,00,42 ; 'B'
\r
1294 GENCS 00,01,2,15,00,43 ; 'C'
\r
1295 GENCS 00,01,2,16,00,44 ; 'D'
\r
1296 GENCS 00,01,2,17,00,45 ; 'E'
\r
1297 GENCS 00,01,2,20,00,46 ; 'F'
\r
1298 GENCS 00,01,2,21,00,47 ; 'G'
\r
1300 GENCS 00,01,2,22,00,50 ; 'H'
\r
1301 GENCS 00,01,2,23,00,51 ; 'I'
\r
1302 GENCS 00,01,2,24,00,52 ; 'J'
\r
1303 GENCS 00,01,2,25,00,53 ; 'K'
\r
1304 GENCS 00,01,2,26,00,54 ; 'L'
\r
1305 GENCS 00,01,2,27,00,55 ; 'M'
\r
1306 GENCS 00,01,2,30,00,56 ; 'N'
\r
1307 GENCS 00,01,2,31,00,57 ; 'O'
\r
1309 GENCS 00,01,2,32,00,60 ; 'P'
\r
1310 GENCS 00,01,2,33,00,61 ; 'Q'
\r
1311 GENCS 00,01,2,34,00,62 ; 'R'
\r
1312 GENCS 00,01,2,35,00,63 ; 'S'
\r
1313 GENCS 00,01,2,36,00,64 ; 'T'
\r
1314 GENCS 00,01,2,37,00,65 ; 'U'
\r
1315 GENCS 00,01,2,40,00,66 ; 'V'
\r
1316 GENCS 00,01,2,41,00,67 ; 'W'
\r
1318 GENCS 00,01,2,42,00,70 ; 'X'
\r
1319 GENCS 00,01,2,43,00,71 ; 'Y'
\r
1320 GENCS 00,01,2,44,00,72 ; 'Z'
\r
1321 GENCS 00,06,1,00,00,73 ; '['
\r
1322 GENCS 00,12,1,00,00,74 ; '\'
\r
1323 GENCS 00,01,1,00,00,75 ; ']'
\r
1324 GENCS 00,10,1,00,00,76 ; '^'
\r
1325 GENCS 10,12,1,00,05,77 ; '_'
\r
1326 \fSUBTTL LISTING ROUTINES
\r
1328 OUTLIN: TRNN ER,ERRORS-ERRQ ;ANY ERRORS?
\r
1329 TLNE FR,ERRQSW ;NO, IGNORE Q ERRORS?
\r
1330 TRZ ER,ERRQ ;YES, YES, ZERO THE Q ERROR
\r
1331 HRLZ AC0,ER ;PUT ERROR FLAGS IN AC0 LEFT
\r
1333 JUMP1 OUTL30 ;BRANCH IF PASS ONE
\r
1334 JUMPN AC0,OUTL02 ;JUMP IF ANY ERRORS TO FORCE PRINTING
\r
1335 SKIPL STPX ;SKIP IF NO CODE, OTHERWISE
\r
1337 TLNN IO,IOSALL ;YES,SUPPRESS ALL?
\r
1339 JUMPN MRP,CPOPJ ;YES,EXIT IF IN MACRO
\r
1340 LDB C,[XWD 350700,LBUF]
\r
1341 CAIE C,15 ;FIRST CHAR CR?
\r
1342 OUTL01: TLZ IO,IOMAC ;FORCE MACRO PRINTING
\r
1343 OUTL03: TLNN IO,IOMSTR!IOPROG!IOMAC
\r
1344 OUTL02: IOR ER,OUTSW ;FORCE IT.
\r
1345 IDPB AC0,LBUFP ;STORE ZERO TERMINATOR AFTER ASCII SRC LINE
\r
1346 TLNN FR,CREFSW ;CREF?
\r
1347 PUSHJ PP,CLSCRF ;YES, WRITE END OF CREF DATA (177,003)
\r
1348 JUMPE AC0,OUTL20 ;BRANCH IF NO ERRORS
\r
1349 TLZE AC0,ERRM ;M ERROR?
\r
1350 TLO AC0,ERRP ;M ERROR SET - SET P ERROR.
\r
1351 PUSHJ PP,OUTLER ;PROCESS ERRORS
\r
1353 OUTL20: SKIPN RC,ASGBLK
\r
1355 SKIPL STPX ;ANY BINARY?
\r
1356 JRST OUTL23 ;YES, JUMP
\r
1357 JUMPE RC,OUTL22 ;SEQUENCE BREAK AND NO BINARY JUMPS
\r
1358 ILDB C,TABP ;ASSIGNMENT FALLS THROUGH
\r
1359 PUSHJ PP,OUTL ;OUTPUT A TAB.
\r
1360 ILDB C,TABP ;OUTPUT 2ND TAB, LOCATION FIELD
\r
1361 PUSHJ PP,OUTC ;NEXT IS BINARY LISTING FIELD
\r
1362 HLLO CS,LOCBLK ;LEFT HALF OF A 36BIT VALUE
\r
1363 JUMPL RC,.+2 ;SKIP IF LEFT HALF IS NOT RELOC
\r
1364 TRZA CS,1 ;IT IS, SET THE FLAG
\r
1365 TLNE CS,-1 ;SKIP IF ITS A 18BIT VALUE, OTHERWISE
\r
1366 PUSHJ PP,ONC1 ;PRINT LH OF A 36 BIT VALUE IN CS
\r
1367 HRLO CS,LOCBLK ;PICK UP THE RIGHT HALF (18BIT VALUE)
\r
1369 PUSHJ PP,ONC ;PRINT IT
\r
1370 JRST OUTL23 ;SKIP SINGLE QUOTE TEST
\r
1371 \fOUTL22: PUSHJ PP,ONC ;TAB TO RH AND PRINT IT
\r
1375 OUTL23: SKIPL STPX ;ANY BINARY?
\r
1376 PUSHJ PP,BOUT ;YES, DUMP IT
\r
1377 MOVE CS,@OUTLI2 ;[POINT 7,LBUF]
\r
1383 PUSHJ PP,OUTASC ;OUTPUT TABS
\r
1384 OUTL25: MOVEI CS,LBUF
\r
1385 PUSHJ PP,OUTAS0 ;DUMP THE LINE
\r
1386 TLNE IO,IOSALL ;SUPPRESSING ALL
\r
1387 JUMPN MRP,OUTL27 ;YES,EXTRA CR IF IN MACRO
\r
1388 OUTL26: SKIPGE STPX ;ANY BINARY?
\r
1389 JRST OUTLI ;NO, CLEAN UP AND EXIT
\r
1390 PUSHJ PP,OUTLI2 ;YES, INITIALIZE FOR NEXT LINE
\r
1391 PUSHJ PP,BOUT ;YES, DUMP IT
\r
1392 OUTL27: PUSHJ PP,OUTCR ;OUTPUT CARRIAGE RETURN
\r
1393 JRST OUTL26 ;TEST FOR MORE BINARY
\r
1395 OUTPL: SKIPN LITLVL ;IF IN LITERAL
\r
1396 SKIPL STPX ;OR CODE GENERATED
\r
1397 JRST OUTIM ;JUST OUTPUT THE IMAGE
\r
1398 SKIPN ASGBLK ;SKIP IF AN ASSIGNMENT
\r
1399 JRST OUTIM ;OTHERWISE OUTPUT IMAGE
\r
1400 PUSH PP,C ;SAVE CHAR.
\r
1404 IDPB C,LBUFP ;FINISH WITH CRLF
\r
1405 PUSHJ PP,OUTLIN ;OUTPUT PARTIAL LINE
\r
1406 POP PP,C ;RESTORE CHAR.
\r
1407 JRST OUTLI2 ;INITIALISE REST OF LINE
\r
1408 \fOUTL30: AOS CS,STPX ;PASS ONE
\r
1409 ADDM CS,LOCO ;INCREMENT OUTPUT LOCATION
\r
1410 PUSHJ PP,STOWI ;INITIALIZE STOW
\r
1411 TLZ AC0,ERRORS-ERRM-ERRP-ERRV
\r
1412 JUMPN AC0,OUTL32 ;JUMP IF ERRORS
\r
1413 TLNE IO,IOSALL ;SUPPRESSING ALL/
\r
1414 JUMPN MRP,CPOPJ ;YES,EXIT
\r
1415 JRST OUTLI1 ;NO,INIT LINE
\r
1417 OUTL32: IDPB AC0,LBUFP ;ZERO TERNIMATOR
\r
1418 IOR ER,OUTSW ;LIST ERRORS
\r
1420 PUSHJ PP,OUTSIX ;OUTPUT TAG
\r
1422 PUSHJ PP,DNC ;CONVERT INCREMENT TO DECIMAL
\r
1423 PUSHJ PP,OUTTAB ;OUTPUT TAB
\r
1424 PUSHJ PP,OUTLER ;OUTPUT ERROR FLAGS
\r
1426 MOVEI CS,SEQNO ;ADDRESS OF SEQUENCE NO.
\r
1427 SKIPE SEQNO ;FILE NOT SEQUENCED
\r
1428 PUSHJ PP,OUTAS0 ;OUTPUT IT
\r
1429 JRST OUTL25 ;OUTPUT BASIC LINE
\r
1431 OUTLER: PUSH PP,ER ;SAVE LISTING SWITCHES FOR LATER
\r
1432 TRNE ER,TTYSW ;IF THIS IS ON, LISTING IS ON TTY
\r
1433 TRZ ER,ERRORS ;SO SUPPRESS ON TTY
\r
1434 TDZ ER,OUTSW ;BUT THIS SHOULD ONLY GO TO THE TTY
\r
1435 MOVE CS,INDIR ;GET FILE NAME
\r
1436 CAME CS,LSTFIL ;AND SEE IF SAME
\r
1437 JRST [MOVEM CS,LSTFIL ;SAVE AS LAST ONE
\r
1439 PUSHJ PP,OUTSIX ;LIST NAME
\r
1442 MOVE CS,PAGENO ;PRINT PAGE NUMBER TOO
\r
1444 MOVE CS,PAGENO ;NOW CHECK PAGE NUMBER
\r
1446 OUTLE8: JRST [MOVEM CS,LSTPGN
\r
1447 MOVEI CS,[ASCIZ /PAGE /]
\r
1451 PUSHJ PP,OUTCR ;AND NOW FOR THE ERROR LINE
\r
1453 HLLM ER,(PP) ;RESTORE ER BUT NOT IO (LEFT HALF OF AC)
\r
1455 MOVE CS,[POINT 7,[ASCII / QXADLRUVNOPEM/]]
\r
1456 OUTLE2: ILDB C,CS ;GET ERROR MNEMONIC
\r
1457 JUMPGE AC0,OUTLE4 ;BRANCH IF NOT FLAGGED
\r
1458 PUSHJ PP,OUTL ;OUTPUT THE CHARACTER
\r
1459 AOS ERRCNT ;INCREMENT ERROR COUNT
\r
1460 OUTLE4: LSH AC0,1 ;SHIFT NEXT FLAG INTO SIGN BIT
\r
1461 \f JUMPN AC0,OUTLE2 ;TEST FOR END
\r
1463 \fOUTIM1: TLOA FR,IOSCR ;SUPPRESS CRLF AFTER LINE
\r
1464 OUTIM: TLZ FR,IOSCR ;DON'T FOR PARTIAL LINE
\r
1465 TLNE IO,IOSALL ;SUPPRESSING ALL?
\r
1466 JUMPN MRP,CPOPJ ;YES ,EXIT IF IN MACRO
\r
1467 JUMP1 OUTLI1 ;BYPASS IF PASS ONE
\r
1470 TLNN IO,IOMSTR!IOPROG!IOMAC
\r
1472 PUSH PP,C ;OUTPUT IMAGE
\r
1475 OUTIM2: MOVE CS,TABP
\r
1476 PUSHJ PP,OUTASC ;OUTPUT TABS
\r
1477 IDPB C,LBUFP ;STORE ZERO TERMINATOR
\r
1479 PUSHJ PP,OUTAS0 ;OUTPUT THE IMAGE
\r
1480 TLZN FR,IOSCR ;CRLF SUPPRESS?
\r
1481 PUSHJ PP,OUTCR ;NO,OUTPUT
\r
1487 OUTLI: TLNE IO,IOSALL ;SUPPRESSING ALL
\r
1488 JUMPN MRP,OUTLI3 ;YES,SET FLAG IN REPEATS ALSO
\r
1489 TLNE IO,IOPALL ;MACRO EXPANSION SUPRESS REQUESTED?
\r
1490 SKIPN MACLVL ;YES, ARE WE IN MACRO?
\r
1491 TLZA IO,IOMAC ;NO, CLEAR MAC FLAG
\r
1492 OUTLI3: TLO IO,IOMAC ;YES, SET FLAG
\r
1494 OUTLI1: TRZ ER,ERRORS!LPTSW!TTYSW
\r
1495 OUTLI2: MOVE CS,[POINT 7,LBUF] ;INITIALIZE BUFFERS
\r
1497 IFN FORMSW,<MOVE CS,[POINT 7,TABI]
\r
1498 MOVSS HWFMT ;PUT FLAG IN LEFT HALF
\r
1499 SKIPGE HWFMT ;BUT IF ONLY HALF-WORD FORMAT>
\r
1500 MOVE CS,[POINT 7,TABI,6]
\r
1503 IFN FORMSW,<SKIPL HWFMT ;IF MULTI-FORMAT
\r
1504 SUBI CS,8 ;LINE IS ONE TAB SHORTER
\r
1505 MOVSS HWFMT ;BACK AS IT WAS>
\r
1507 MOVSI CS,(ASCII / /)
\r
1508 SKIPE SEQNO ;HAVE WE SEQUENCE NUMBERS?
\r
1509 MOVEM CS,SEQNO ;YES, STORE TAB IN CASE OF MACRO
\r
1510 MOVEM CS,SEQNO+1 ;STORE TAB AND TERMINATOR
\r
1514 \fOUTIML: TLNE IO,IOSALL ;SUPPRESSING ALL?
\r
1515 JUMPN MRP,CPOPJ ;YES,EXIT IF IN MACRO
\r
1516 TRNN ER,ERRORS-ERRQ ;FOR LITERALS (MULIT-LINE) OUTPUT ERRORS
\r
1520 JUMP1 OUTML1 ;CHECK PASS1 ERRORS
\r
1523 PUSH PP,[0] ;ERRORS SHOULD BE ZEROED
\r
1525 PUSH PP,AC0 ;SAVE AC0 IN CASE CALLED FROM ASCII
\r
1526 MOVE AC0,CS ;ERROR ROUTINE WANTS FLAGS IN AC0
\r
1529 PUSHJ PP,CLSCRF ;FIX CREF
\r
1532 PUSHJ PP,OUTLER ;OUTPUT THEM
\r
1534 JRST OUTIM2 ;AND LINE
\r
1536 OUTML1: TLZ CS,ERRORS-ERRM-ERRP-ERRV
\r
1537 JUMPE CS,OUTLI2 ;NONE
\r
1538 TRZ ER,ERRM!ERRP!ERRV
\r
1541 PUSH PP,C ;SAVE THIS
\r
1542 PUSH PP,AC0 ;AS ABOVE
\r
1551 PUSHJ PP,OUTLER ;DO NOT FORGET ERRORS
\r
1553 MOVEI CS,LBUF ;PRINT REST OF LINE
\r
1559 \fSUBTTL OUTPUT ROUTINES
\r
1560 UOUT: PUSHJ PP,LOOKUP ;SET FOR TABLE SCAN
\r
1561 TRNN ARG,PNTF ;WFW
\r
1563 JRST UOUT13 ;TEST FOR UNDF!EXTF!PNTF ON PASS2
\r
1565 TLNN IO,IOIOPF ;ANY IOP'S SEEN
\r
1566 JRST UOUT12 ;NO,MAKE EXTERNAL
\r
1567 MOVSI CS,PRMTBL-PRMEND;YES LOOKUP IN TABLE
\r
1568 UOUT1: CAME AC0,PRMTBL(CS) ;HAVE WE A MATCH?
\r
1569 AOBJN CS,UOUT2 ;NO,INCREMENT AND JUMP
\r
1570 MOVE ARG,PRMTBL+1(CS);YES,GET VALUE
\r
1571 MOVEM ARG,(SX) ;UPDATE SYMBOL TABLE
\r
1573 UOUT2: AOBJN CS,UOUT1 ;TEST FOR END
\r
1575 UOUT12: PUSHJ PP,EXTER2 ;MAKE IT EXTERNAL
\r
1576 MOVSI ARG,UNDF ;BUT PUT UNDF BACK ON
\r
1577 IORM ARG,(SX) ;SO MESSAGE WILL COME OUT
\r
1578 POPJ PP, ;GET NEXT SYMBOL
\r
1580 UOUT13: JUMP1 CPOPJ ;RECYCLE ON PASS1
\r
1581 TRC ARG,UNDF!EXTF!PNTF ;CHECK FOR ALL THREE ON
\r
1582 TRCE ARG,UNDF!EXTF!PNTF ;ARE THEY?
\r
1583 POPJ PP, ;NO, RECYCLE
\r
1584 UOUT10: PUSHJ PP,OUTCR
\r
1585 PUSHJ PP,OUTSYM ;OUTPUT THE SYMBOL
\r
1586 MOVEI CS,[SIXBIT /UNASSIGNED, DEFINED AS IF EXTERNAL @/]
\r
1587 JRST OUTSIX ;POPJ FOR NEXT SYMBOL
\r
1589 UOUT30: PUSHJ PP,ONC1 ;OUTPUT THE LOCATION
\r
1590 JRST HIGHQ ;EXIT THROUGH HIGHQ
\r
1591 \f ;OUTPUT THE ENTRIES
\r
1593 EOUT: MOVEI C,0 ;INITIALIZE THE COUNT
\r
1596 EOUT1: SOJL SDEL,EOUT2 ;TEST FOR END
\r
1599 ANDCAI ARG,SYMF!INTF!ENTF
\r
1600 JUMPN ARG,EOUT1 ;IF INVALID, DON'T COUNT
\r
1601 AOJA C,EOUT1 ;BUMP COUNT
\r
1603 EOUT2: HRLI C,4 ;BLOCK TYPE 4
\r
1611 EOUT3: SOJL SDEL,POPOUT
\r
1614 ANDCAI C,SYMF!INTF!ENTF
\r
1616 SOJGE V,EOUT4 ;TEST END OF BLOCK
\r
1619 EOUT4: MOVE AC0,-1(SX)
\r
1624 \f ;OUTPUT THE SYMBOLS
\r
1626 SOUT: SKIPN IONSYM ;SKIP IF NOSYM SEEN
\r
1627 TRNN ER,LPTSW!TTYSW ;A LISTING REQUIRED?
\r
1629 MOVEI [ASCIZ /SYMBOL TABLE/]
\r
1630 HRRM SUBTTX ;SET NEW SUB-TITLE
\r
1631 PUSHJ PP,OUTFF ;FORCE NEW PAGE
\r
1632 MOVEI ARG,NCOLS ;SET UP FOR NCOLS ACROSS SYMBOL TABLE
\r
1633 TRNE ER,TTYSW ;IS TTY LISTING DEVICE?
\r
1634 MOVEI ARG,2 ;YES,ONLY 2 COLLUMNS
\r
1635 MOVEM ARG,NCOLLS ;STORE ANSWER
\r
1637 PUSHJ PP,LOUT1 ;OUTPUT THEM
\r
1638 MOVE ARG,SYMCNT ;SEE IF WE ENDED EVEN
\r
1640 PUSHJ PP,OUTCR ;NO, NEED CR
\r
1641 JRST SOUT1 ;NOW FOR BLOCK TYPE 2
\r
1643 LOUT1: PUSHJ PP,LLUKUP ;SET FOR TABLE SCAN
\r
1645 TRNN ARG,MACF!SYNF
\r
1646 TDZA MRP,MRP ;SKIP AND CLEAR MRP
\r
1647 POPJ PP, ;NO, TRY AGAIN
\r
1651 MOVNI MRP,1 ;MRP=-1 FOR EXTERNAL
\r
1652 TRNE ARG,SYNF ;SYNONYM?
\r
1653 JUMPL MRP,POPOUT ;YES, DON'T OUTPUT IF EXTERNAL
\r
1654 TRNE ARG,SUPRBT ;IF SUPRESSED
\r
1655 ; JUMPGE MRP,POPOUT ;DO NOT OUTPUT UNLESS EXTERNAL
\r
1656 POPJ PP, ;DO NOT OUTPUT
\r
1657 AOS (PP) ;SET FOR SKIP RETURN IF SYMBOL IS PRINTED
\r
1658 JUMPGE MRP,LOUT10 ;BRANCH IF NOT EXTERNAL
\r
1659 HLRZ RC,V ;PUT POINTER/FLAGS IN RC
\r
1660 TRNE RC,-2 ;POINTER?
\r
1661 MOVS RC,0(RC) ;YES
\r
1662 HLL V,RC ;STORE LEFT VALUE
\r
1664 LOUT10: PUSH PP,RC ;SAVE FOR LATER
\r
1665 PUSHJ PP,OUTSYM ;OUTPUT THE NAME
\r
1666 MOVE RC,(PP) ;GET COPY
\r
1668 JUMPLE MRP,LOUT15 ;SET DEFFERRED BITS IF EXTERNAL
\r
1669 TLNE RC,-2 ;CHECK FOR LEFT FIXUP
\r
1670 IORI AC1,40 ;AND SET BITS
\r
1671 TRNE RC,-2 ;CHECK FOR RIGHT FIXUP
\r
1672 IORI AC1,20 ;AND SET BITS
\r
1673 LOUT15: TLNE RC,-2 ;FIX RELOC AS 0 IF EXTERNAL
\r
1681 TRNE ARG,ENTF ;ENTRY DMN
\r
1683 TRNE ARG,NOOUTF ;SUPRESS OUTPUT? WFW
\r
1684 ADDI MRP,3 ;YES WFW
\r
1685 TRNE ARG,UNDF ;UNDEFINED IS EXTERNAL
\r
1686 HRRI MRP,2 ;SO FLAG AS UXT
\r
1687 IOR AC1,SOUTC(MRP)
\r
1689 MOVEM AC0,SVSYM ;SAVE IT
\r
1690 MOVE AC0,V ;GET THE VALUE
\r
1691 HLRZ RC,MRP ;AND THE RELOCATION
\r
1693 TRNE RC,2 ;LEFT HALF RELOCATABLE?
\r
1694 TRZA CS,1 ;NO, FLAG AND PRINT
\r
1695 TLNE CS,-1 ;IS THE LEFT HALF ZERO?
\r
1696 PUSHJ PP,ONC1 ;NO, OUTPUT IT
\r
1697 LOUT11: PUSHJ PP,OUTTAB
\r
1699 TDZ CS,RC ;SET RELOCATION
\r
1702 POP PP,RC ;GET BACK RELOC AND CHECK EXTERNAL
\r
1703 LOUT60: MOVEI CS,SOUTC(MRP)
\r
1704 PUSHJ PP,OUTAS0 ;EXT/INT
\r
1705 SOSLE SYMCNT ;SEE IF WE HAVE RUN OUT
\r
1706 JRST OUTTAB ;NOT YET, PRINT ONE TAB
\r
1707 LOUT64: MOVE CS,NCOLLS ;YES, RESET
\r
1708 \f MOVEM CS,SYMCNT
\r
1709 JRST OUTCR ;CARRIAGE RETURN AND TRY FOR ANOTHER
\r
1712 \f SYN IFBLK,SYMBLK ;SOMEWHERE TO STORE THE POINTERS
\r
1714 LLUKUP: POP PP,LOOKX ;INTERCEPT RETURN POP
\r
1717 ADDI SX,2 ;SKIP COUNT OF SYMBOLS
\r
1718 LLUKP2: HRLI SX,-<.LPP-1> ;LENGTH OF PAGE
\r
1719 MOVE V,ARG ;COPY OF ARG
\r
1720 MOVEM SX,SYMBLK(V) ;STORE SYMBOL POINTER IN TABLE
\r
1721 ADDI SX,2*<.LPP-2> ;SYMBOLS PER PAGE
\r
1722 SOJG V,.-2 ;FOR ALL COLUMNS
\r
1729 JRST LLUKP7 ;ENTER LOOP
\r
1731 LLUKP1: MOVEM SX,SYMBLK(ARG) ;SAVE IT
\r
1736 JRST [MOVE ARG,SYMCNT
\r
1737 MOVEM SX,SYMBLK(ARG)
\r
1739 LLUKP7: SOJL SDEL,POPOUT ;TEST FOR END
\r
1740 LLUKP3: MOVE ARG,SYMCNT ;GET PAGE POSITION
\r
1741 MOVE SX,SYMBLK(ARG) ;GET NEXT POINTER
\r
1746 LLUKP6: PUSHJ PP,LOUT64 ;RESET SYMCNT
\r
1747 JUMPE SDEL,POPOUT ;EXIT IF ALL DONE
\r
1751 MOVEM SX,SYMBLK(ARG)
\r
1753 SKIPGE SYMBLK(V) ;TEST IF ALL FINISHED
\r
1755 SOJG V,.-2 ;KEEP GOING
\r
1757 MOVE SX,SYMBLK(SX)
\r
1758 HLRZ V,SX ;GET NUMBER ADVANCED
\r
1759 LSH V,1 ;2 WORDS PER SYMBOL
\r
1760 SUBI SX,2(V) ;BACK UP ONE SYMBOL
\r
1761 SKIPGE LPP ;IF PAGE FULL
\r
1762 JRST .+3 ;DON'T FINISH WITH EXTRA CR-LF
\r
1763 SETZM LPP ;ENSURE END OF PAGE
\r
1766 MOVEM ARG,SYMCNT ;JUST IN CASE
\r
1769 LLUKP5: SOSG SYMCNT ;ON LAST COL?
\r
1771 SKIPGE LPP ;IF PAGE FULL
\r
1772 JRST LLUKP3 ;NO MORE OUTPUT
\r
1773 REPEAT 2,<PUSHJ PP,OUTAB2> ;NO, TAB OUT TO NEXT COLUMN
\r
1775 \fSOUT1: PUSHJ PP,LOOKUP ;SET FOR TABLE SCAN
\r
1777 TRNN ARG,MACF!SYNF
\r
1778 TDZA MRP,MRP ;SKIP AND CLEAR MRP
\r
1779 POPJ PP, ;NO, TRY AGAIN
\r
1782 IFN WFWSW,<TRNE ARG,VARF ;IF THIS FLAG IS ON SHOULD GO IN LOW SEG
\r
1785 MOVNI MRP,1 ;MRP=-1 FOR EXTERNAL
\r
1786 TRNE ARG,SYNF ;SYNONYM?
\r
1787 JUMPL MRP,POPOUT ;YES, DON'T OUTPUT IF EXTERNAL
\r
1788 TRNE ARG,SUPRBT ;IF SUPRESSED
\r
1789 ; JUMPGE MRP,POPOUT ;DO NOT OUTPUT UNLESS EXTERNAL
\r
1790 POPJ PP, ;DO NOT OUTPUT
\r
1791 JUMPGE MRP,SOUT10 ;BRANCH IF NOT EXTERNAL
\r
1792 HLRZ RC,V ;PUT POINTER/FLAGS IN RC
\r
1793 TRNE RC,-2 ;POINTER?
\r
1794 MOVS RC,0(RC) ;YES
\r
1795 HLL V,RC ;STORE LEFT VALUE
\r
1797 SOUT10: PUSH PP,RC ;SAVE FOR LATER
\r
1799 JUMPLE MRP,SOUT15 ;SET DEFFERRED BITS IF EXTERNAL
\r
1800 TLNE RC,-2 ;CHECK FOR LEFT FIXUP
\r
1801 IORI AC1,40 ;AND SET BITS
\r
1802 TRNE RC,-2 ;CHECK FOR RIGHT FIXUP
\r
1803 IORI AC1,20 ;AND SET BITS
\r
1804 IFN WFWSW,<TRNE ARG,VARF ;IF SO THEN DEFERD
\r
1806 SOUT15: TLNE RC,-2 ;FIX RELOC AS 0 IF EXTERNAL
\r
1814 TRNE ARG,ENTF ;ENTRY DMN
\r
1816 TRNE ARG,NOOUTF ;SUPRESS OUTPUT? WFW
\r
1817 ADDI MRP,3 ;YES WFW
\r
1818 IOR AC1,SOUTC(MRP)
\r
1820 PUSHJ PP,NOUT2 ;SQUOZE AND DUMP THE SYMBOL
\r
1821 MOVEM AC0,SVSYM ;SAVE IT
\r
1822 MOVE AC0,V ;GET THE VALUE
\r
1823 HLRZ RC,MRP ;AND THE RELOCATION
\r
1825 POP PP,RC ;GET BACK RELOC AND CHECK EXTERNAL
\r
1826 TRNN RC,-2 ;IS IT?
\r
1828 MOVE AC0,1(RC) ;GET NAME
\r
1829 IFN WFWSW,<JUMPE AC0,[MOVSI AC0,200000 ;RIGHT DEFERED
\r
1830 PUSHJ PP,INVRSF ;INSERT IN SYMBOL INFORMATION
\r
1832 MOVEI ARG,60 ;EXTERNAL REQ
\r
1834 HLLZS RC ;NO RELOC
\r
1835 PUSHJ PP,COUT ;OUTPUT IT
\r
1836 MOVE AC0,SVSYM ;GET SYMBOL NAME
\r
1837 TLO AC0,500000 ;SET AS ADDITIVE SYMBOL
\r
1838 TLZ AC0,200000 ;BUT NOT LEFT HALF ETC
\r
1840 SOUT50: MOVSS RC ;CHECK LEFT HALF
\r
1844 IFN WFWSW,<JUMPE AC0,[MOVSI AC0,600000 ;LEFT DEFERED
\r
1856 SOUT20: PUSHJ PP,OUTAS0
\r
1859 <ASCII /ENT/>!04 ;DMN
\r
1862 <ASCII /SEN/>!44 ;SUPRESSED ENTRY
\r
1866 <ASCII /UXT/>!60 ;UNDEFINED EXTERNAL
\r
1868 <ASCII /SIN/>!44 ;DMN
\r
1870 INVRSF: MOVEI ARG,3 ;GET A BLOCK
\r
1874 MOVEM AC0,(ARG) ;SAVE WHICH HALF INFO
\r
1875 MOVE AC0,SVSYM ;GET SYMBOL NAME
\r
1876 TLZ AC0,740000 ;GET RID OF CODE BITS
\r
1877 MOVEM AC0,-1(ARG) ;SAVE IT
\r
1878 HLRZ AC0,(RC) ;SYMBOL TABLE FIXUP POINTER
\r
1879 MOVEM AC0,-2(ARG) ;LINK IN THIS BLOCK
\r
1880 SUBI ARG,2 ;POINT TO START OF BLOCK
\r
1884 SOUT1W: HLRZS V ;GET THE SYMBOL TABLE POINTER
\r
1885 MOVEI RC,3 ;SET UP A NEW BLOCK FOR THIS SYMBOL
\r
1888 PUSHJ PP,XCEEDS ;CHECK ON OUT OF ROOM
\r
1889 PUSH PP,ARG ;SAVE ARG AND ACO
\r
1891 MOVEI ARG,0 ;NO CODE BITS
\r
1892 PUSHJ PP,SQOZE ;CONVERT TO RAD50
\r
1893 MOVEM AC0,-1(RC) ;SYMBOL NAME
\r
1895 POP PP,ARG ;RESTORE
\r
1896 HRRZM V,-2(RC) ;LINK TO NEXT BLOCK
\r
1897 MOVSI V,200000 ;FLAG AS SYMBOL TABLE FIXUP
\r
1899 HRRZ V,(SX) ;GET POINTER TO HEADER BLOCK
\r
1900 SUBI RC,2 ;POINT TO HEAD OF BLOCK
\r
1901 HRLM RC,(V) ;PUT IN LINK TO NEW BLOCK
\r
1902 MOVE RC,FIXLNK ;ADD SYMBOL TO CHAIN OF ONES TO DO
\r
1903 MOVEM SX,FIXLNK ;CHAIN THROUGH SYMBOL ENTRY
\r
1904 MOVEM RC,-1(SX) ;WHICH IS NO LONGER NEEDED
\r
1905 SETZB RC,V ;PUT OUT 0 FOR SYMBOL VALUE
\r
1907 \f ;OUTPUT THE BINARY
\r
1909 BOUT: HRLO CS,LOCO ;PICKUP THE LOCATION
\r
1910 PUSHJ PP,ONC ;OUTPUT IT TO THE LISTING FILE
\r
1912 SKIPE MODO ;IF MODE IS NOT ABSOLUTE
\r
1913 PUSHJ PP,OUTC ;PRINT A SINGLE QUOTE
\r
1914 PUSHJ PP,DSTOW ;GET THE CODE
\r
1915 PUSH PP,RC ;SAVE RELOC
\r
1916 PUSH PP,RC ;AND AGAIN
\r
1917 IFE WFWSW,<TLNE RC,-2 ;CHECK LEFT EXTERNAL
\r
1918 HRRZS RC ;MAKE LEFT NON-RELOC>
\r
1919 IFN WFWSW,<TLNE FR,RIMSW!RIM1SW!R1BSW ;CHECK FOR SPECIAL BIN OUT
\r
1920 JRST BOUT30 ;AND LET HIM DISCOVER THE HORROR
\r
1921 TLNN RC,-2 ;LEFT HALF EXTERNAL??
\r
1923 HLRZ AC1,RC ;GET POINTER
\r
1924 SKIPE 1(AC1) ;IS IT SPECIAL LVAR KIND (NAME IS 0)
\r
1926 JRST BOUT11] ;IGNORE FOR NOW
\r
1927 PUSH PP,AC0 ;SAVE WORD
\r
1928 HLRZS AC0 ;GET OFFSET
\r
1929 PUSHJ PP,INCSRC ;FIND A MATCH OR INSERT NEW BLOCK
\r
1930 ADDI AC1,1 ;POINT ONE FURTHER IN BLOCK
\r
1931 PUSHJ PP,LVLINK ;AND SET INFORMATION
\r
1933 HRLM RC,AC0 ;THE LINK
\r
1934 HLLM RC,-1(PP) ;AND ITS RELOC
\r
1935 MOVE RC,-1(PP) ;GET RELOC BACK
\r
1937 TRNN RC,-2 ;RIGHT EXT?
\r
1939 IFN WFWSW,<HRRZ AC1,RC ;GET POINTER
\r
1941 JRST [HRRZ AC1,AC0 ;ORDINARY EXTERNAL, HANDLE
\r
1943 HLLZS RC ;ADD EXTERNAL
\r
1945 PUSH PP,AC0 ;SAVE WORD
\r
1946 HRRZS AC0 ;GET OFFSET
\r
1953 IFE WFWSW,<HRRZ AC1,AC0 ;YES
\r
1954 JUMPE AC1,BOUT20 ;PROCESS IF ZERO CODE THERE
\r
1955 HLLZS RC ;MAKE NON-RELOC>
\r
1956 JRST BOUT30 ;PROCESS
\r
1959 HRRM AC1,-1(PP) ;FIX RC IN STACK SO NO CONFUSION WFW (AC1 HAS 0)
\r
1960 HRR AC0,0(RC) ;NO, SET ADDRESS LINK
\r
1961 MOVE AC1,LOCO ;GET CURRENT LOCATION
\r
1962 HRRM AC1,0(RC) ;SET NEW LINK
\r
1963 HLRZ AC1,0(RC) ;GET FLAGS/POINTER
\r
1964 TRNN AC1,-2 ;POINTER?
\r
1965 HRR AC1,RC ;NO, SET TO FLAGS
\r
1966 HLR RC,0(AC1) ;PUT FLAGS IN RC
\r
1967 HRL AC1,MODO ;GET CURRENT MODE
\r
1968 TRZE RC,-2 ;LEFT HALF RELOCATABLE+
\r
1969 TLO AC1,2 ;YES, SET FLAG
\r
1970 HLLM AC1,0(AC1) ;STORE NEW FLAGS
\r
1971 BOUT30: HLLO CS,AC0
\r
1972 TLZE RC,1 ;PACK RELOCATION BITS
\r
1974 TRNE RC,2 ;LEFT HALF RELOCATABLE?
\r
1975 TRZ CS,1 ;YES, RESET BIT
\r
1976 PUSH PP,AC0 ;NEED AN AC
\r
1977 HLRZ AC0,-1(PP) ;AC0 = LEFT RELOCATION
\r
1978 CAILE AC0,1 ;EXTERNAL?
\r
1979 XORI CS,EXTF!1 ;YES, SET SWITCH
\r
1982 JUMPN AC0,BOUT3H ;EDIT IN HALF WORD FORMAT IF NOT 0
\r
1983 MOVE AC0,FORM ;GET FORM WORD
\r
1984 MOVEI C,0 ;ZERO FIELD SIZE
\r
1985 BOUT3A: JFFO AC0,BOUT3B ;AC1 = FIELD SIZE -1
\r
1986 JRST BOUT3C ;NO FIELDS LEFT, JUMP
\r
1987 BOUT3B: LSH AC0,1(AC1) ;SHIFT OFF FORM FIELD
\r
1989 IDIVI AC1,3 ;AC1 = COLUMNS USED + 1
\r
1990 ADDI C,(AC1) ;INCREMENT FIELD SIZE
\r
1991 CAIG C,^D23 ;IS FIELD SIZE GTR 23?
\r
1992 JRST BOUT3A ;NO. CONTINUE
\r
1993 MOVE AC1,HWFORM ;USE STANDARD FORM
\r
1995 MOVEI C,^D13 ;SET FIELD SIZE TO 13
\r
1996 BOUT3C: MOVEM C,FLDSIZ ;STORE FIELD SIZE
\r
1997 MOVE AC0,FORM ;AC0 = FORM WORD
\r
1998 TRNN RC,2 ;IS LEFT HALF RELOCATED?
\r
1999 CAMN AC0,HWFORM ;NO. IS FORM HALF WORD?
\r
2000 JRST BOUT3H ;YES. EDIT IN OLD WAY
\r
2001 CAMN AC0,IOFORM ;IS IT I/O WORD
\r
2002 SETOM IOSEEN ;YES,NEED MORE WORK
\r
2006 ILDB C,TABP ;GET A TAB
\r
2007 PUSHJ PP,OUTL ;OUTPUT IT
\r
2008 MOVE AC2,(PP) ;AC2 = INFO TO BE EDITED
\r
2009 PUSH PP,CS ;SAVE CS = C+1
\r
2010 BOUT3D: JFFO AC0,BOUT3E ;AC1 = FIELD LENGTH - 1
\r
2011 BOUT3E: LSH AC0,1(AC1) ;SHIFT OFF FORM FIELD
\r
2014 LSHC AC1,-2(C) ;AC1 = FIELD INFO
\r
2015 IDIVI C,3 ;C = # OF OCTAL DIGITS
\r
2016 MOVE C+1,AC0 ;SAVE AC0
\r
2017 SKIPE IOSEEN ;IS THIS A I/O INST.
\r
2018 PUSHJ PP,BOUT3J ;YES,SET FIELDS CORRECTLY
\r
2024 \fBOUT3F: MOVEI AC0,6 ;EDIT A DIGIT
\r
2027 PUSHJ PP,OUTC ;OUTPUT IT
\r
2029 SOJG C,BOUT3F ;IF MORE DIGITS, GO BACK
\r
2030 JUMPE C+1,BOUT3G ;JUMP IF END OF WORD
\r
2031 MOVE AC0,C+1 ;RESTORE AC0
\r
2033 PUSHJ PP,OUTC ;OUTPUT A SPACE
\r
2034 JRST BOUT3D ;PROCESS NEXT FIELD
\r
2036 BOUT3G: POP PP,CS ;RESTORE CS = C+1
\r
2038 TRNE RC,1 ;RELOCATABLE?
\r
2040 HRRZ AC0,-1(PP) ;AC0 = RIGHT RELOCATION
\r
2041 CAILE AC0,1 ;EXTERNAL?
\r
2043 PUSHJ PP,ONC2 ;STORE POSSIBLE INDICATOR
\r
2045 JRST BOUT3I ;CONTINUE
\r
2047 BOUT3H: MOVEI C,^D15 ;SET SIZE TO 15
\r
2050 POP PP,AC0 ;RESTORE
\r
2053 TDZ CS,RC ;SET RELOCATION
\r
2054 HRRZ C,(PP) ;C = RIGHT RELOCATION
\r
2055 CAILE C,1 ;EXTERNAL
\r
2056 XORI CS,EXTF!1 ;YES, SET SWITCH
\r
2058 BOUT3I: POP PP,CS ;GET RID OF ENTRY ON STACK
\r
2060 TLNE FR,RIMSW!RIM1SW!R1BSW ;RIM OUTPUT?
\r
2061 JRST ROUT ;YES, GO PROCESS
\r
2064 CAME CS,MODLOC ;SEQUENCE OR RELOCATION BREAK?
\r
2065 PUSHJ PP,COUTD ;YES, DUMP THE BUFFER
\r
2066 SKIPL COUTX ;NEW BUFFER?
\r
2067 JRST BOUT40 ;NO, STORE CODE AND EXIT
\r
2068 MOVEM CS,MODLOC ;YES, STORE NEW VALUES
\r
2071 PUSHJ PP,COUT ;STORE BLOCK LOCATION AND MODE
\r
2072 EXCH RC,MODO ;RESTORE CURRENT VALUES
\r
2075 \fBOUT40: PUSHJ PP,COUT ;EMIT CODE
\r
2076 POP PP,RC ;RETRIEVE EXTERNAL BITS
\r
2077 TRNN RC,-2 ;RIGHT EXTERNAL?
\r
2078 JRST BOUT50 ;TRY FOR LEFT
\r
2080 PUSH PP,BLKTYP ;TERMINATE TYPE AND SAVE
\r
2081 MOVEI AC0,2 ;BLOCK TYPE 2
\r
2083 MOVE AC0,1(RC) ;GET SYMBOL
\r
2084 MOVEI ARG,60 ;CODE BITS
\r
2085 PUSHJ PP,SQOZE ;CONVERT TO RADIX 50
\r
2086 HLLZS RC ;SYMBOL HAS NO RELOCATION
\r
2087 PUSHJ PP,COUT ;EMIT
\r
2088 MOVE AC0,LOCO ;GET CURRENT LOC
\r
2089 HRLI AC0,400000 ;ADDITIVE REQ
\r
2090 HRR RC,MODO ;CURRENT MODE
\r
2091 PUSHJ PP,COUT ;EMIT
\r
2092 MOVSS RC ;NOW FOR LEFT
\r
2096 BOUT50: MOVSS RC ;CHECK OTHER HALF
\r
2097 TRNN RC,-2 ;LEFT HALF EXTERNAL?
\r
2098 JRST BOUT80 ;NO, FALSE ALARM
\r
2099 PUSHJ PP,COUTD ;CHANGE MODE
\r
2103 BOUT70: MOVE AC0,1(RC)
\r
2109 HRLI AC0,600000 ;LEFT HALF ADD
\r
2111 PUSHJ PP,COUT ;EMIT
\r
2112 BOUT60: PUSHJ PP,COUTD ;CHANGE MODE
\r
2113 POP PP,BLKTYP ;TO OLD ONE
\r
2118 INCSC1: HLRZ RC,(AC1) ;GET OFFSET OF NEXT BLOCK
\r
2119 CAMN RC,AC0 ;IS IT THE SAME??
\r
2120 POPJ PP, ;YES, RETURN AC1 POINTS TO BLOCK
\r
2121 INCSRC: MOVE RC,AC1 ;CURRENT POINTER
\r
2122 HRRZ AC1,(AC1) ;IN CASE THIS COMES UP 0
\r
2123 JUMPN AC1,INCSC1 ;SINCE 0 IS END OF CHAIN. ANY MORE??
\r
2124 MOVEI AC1,3 ;NO, GET A NEW BLOCK
\r
2128 SUBI AC1,2 ;WE MUST BE POINTING RIGHT WHEN WE GET OUT
\r
2129 HRRM AC1,(RC) ;INSERT WHERE END OF CHAIN WAS
\r
2130 HRLZM AC0,(AC1) ;SET OFFSET AND END OF CHAIN
\r
2132 SETZM 2(AC1) ;NO LEFT OR RIGHT HALF FIXUPS
\r
2135 LVLINK: MOVE RC,LOCO ;GET CURRENT LOCATION
\r
2136 HRL RC,MODO ;AND MODE
\r
2137 EXCH RC,1(AC1) ;PUT IN AND GET PLACE TO LINK TO
\r
2141 BOUT3J: MOVSS IOSEEN ;SWAP
\r
2142 SKIPGE IOSEEN ;SKIP IF NOT FIRST FIELD
\r
2143 JRST [HLLZS IOSEEN ;CLEAR RIGHT HALF
\r
2144 POPJ PP,] ;AND RETURN
\r
2145 MOVSS IOSEEN ;SWAP BACK
\r
2146 LSH AC1,2 ;CORRECT MNEMONIC AND OP CODE
\r
2147 CAIE C,1 ;IS IT OP CODE?
\r
2148 POPJ PP, ;NO,JUST RETURN
\r
2149 MOVEI C,2 ;TWO CHAR. WIDE NOW
\r
2150 SETZM IOSEEN ;DON'T COME AGAIN
\r
2153 \fNOUT: MOVE V,[POINT 7,TBUF] ;POINTER TO ASCII LINE
\r
2154 MOVSI CS,(POINT 6,AC0) ;POINTER TO SIXBIT AC0
\r
2156 NOUT1: ILDB C,V ;GET ASCII
\r
2160 TRZA C,100 ;LOWER CASE TO SIXBIT
\r
2161 SUBI C,40 ;CONVERT TO SIXBIT
\r
2162 JUMPLE C,NOUT3 ;TEST FORM NON-SIXBIT
\r
2163 CAILE C,77 ;AND NOT GREATER THAN SIXBIT
\r
2165 IDPB C,CS ;DEPOSIT IN AC0
\r
2166 TLNE CS,770000 ;TEST FOR SIX CHARACTERS
\r
2167 JRST NOUT1 ;NO, GET ANOTHER
\r
2168 NOUT3: SKIPGE UNIVSN ;IF A UNIVERSAL PROG
\r
2169 POPJ PP, ;RETURN TO PUT IT IN THE TABLE
\r
2171 IFN CCLSW,< TLNN IO,IOTLSN ;AND IF WE HAVE NOT SEEN A TITLE
\r
2172 PUSHJ PP,PRNAM ;THEN PRINT THE NAME>
\r
2173 NOUT2: PUSHJ PP,SQOZE ;CONVERT TO SIXBIT
\r
2174 JRST COUT ;DUMP AND EXIT
\r
2177 MOVEI RC,1 ;RELOCATABLE
\r
2179 MOVE AC0,HHIGH ;GET HIGH SEG IF TWO SEGMENTS
\r
2180 JUMPE AC0,.+2 ;NOT TWO SEGMENTS
\r
2181 PUSHJ PP,COUT ;OUTPUT IT >
\r
2184 SKIPE HHIGH ;ANY TWOSEG HIGH STUFF
\r
2185 JRST COUT ;YES,SO NO ABS.>
\r
2186 PUSHJ PP,COUT ;OUTPUT THE HIGHEST LOCATION
\r
2188 ;PUT OUT ABS PORTION OF PROGRAM BREAK
\r
2189 SOJA RC,COUT ;OUTPUT A WORD OF ZERO AND EXIT
\r
2192 HSOUT: SETZM HISNSW ;CLEAR FOR PASS2
\r
2193 MOVE AC0,SVTYP3 ;GET HISEG ARG
\r
2194 JUMPGE AC0,.+4 ;JUMP IF ONLY HISEG
\r
2195 HRL AC0,HIGH1 ;GET BREAK FROM PASS 1
\r
2196 JUMPL AC0,.+2 ;OK IF GREATER THAN 400000
\r
2197 HRLS AC0 ;SIGNAL TWO SEGMENT TO LOADER
\r
2198 MOVEI RC,1 ;ASSUME RELOCATABLE
\r
2199 JRST COUT ;OUTPUT THE WORD>
\r
2201 VOUT: SKIPN RC,VECREL ;IS VECTOR ABSOLUTE ZERO?
\r
2202 SKIPE VECTOR ;ALSO CHECK RELOCATION
\r
2204 POPJ PP, ;YES, EXIT
\r
2205 MOVE AC0,VECTOR ;AC0 SHOULD BE FLAGS
\r
2207 COUT: AOS C,COUTX ;INCREMENT INDEX
\r
2208 MOVEM AC0,COUTDB(C) ;STORE CODE
\r
2209 IDPB RC,COUTP ;STORE RELOCATION BITS
\r
2210 CAIE C,^D17 ;IS THE BUFFER FULL?
\r
2211 POPJ PP, ;NO, EXIT
\r
2213 COUTD: AOSG C,COUTX ;DUMP THE BUFFER
\r
2214 JRST COUTI ;BUFFER WAS EMPTY
\r
2215 HRL C,BLKTYP ;SET BLOCK TYPE
\r
2216 PUSHJ PP,OUTBIN ;OUTPUT COUNT AND TYPE
\r
2217 SETOB C,COUTY ;INITIALIZE INDEX
\r
2219 COUTD2: MOVE C,COUTDB(C) ;GET RELOCATION BITS/CODE
\r
2220 PUSHJ PP,OUTBIN ;DUMP IT
\r
2221 AOS C,COUTY ;INCREMENT INDEX
\r
2222 CAMGE C,COUTX ;TEST FOR END
\r
2223 JRST COUTD2 ;NO, GET NEXT WORD
\r
2225 COUTI: SETOM COUTX ;INITIALIZE BUFFER INDEX
\r
2226 SETZM COUTRB ;ZERO RELOCATION BITS
\r
2227 MOVE C,[POINT 2,COUTRB]
\r
2228 MOVEM C,COUTP ;INITIALIZE BIT POINTER
\r
2231 IFN FORMSW,< MOVE AC1,HWFORM ;USE STANDARD FORM>
\r
2234 IFN FORMSW,< MOVEM AC1,FORM ;STORE FORM WORD>
\r
2235 JUMP1 STOW20 ;SKIP TEST IF PASS ONE
\r
2236 TRNE RC,-2 ;RIGHT HALF ZERO OR 1?
\r
2237 PUSHJ PP,STOWT ;NO, HANDLE EXTERNAL
\r
2238 TLNN RC,-2 ;LEFT HALF ZERO OR 1? WFW
\r
2239 JRST STOW10 ;YES, SKIP TEST
\r
2240 MOVSS RC ;SWAP HALVES
\r
2241 PUSHJ PP,STOWT1 ;HANDLE EXTERNAL WFW
\r
2242 MOVSS RC ;RESTORE VALUES
\r
2244 STOW10: SKIPE EXTPNT ;ANY EXTERNALS REMAINING?
\r
2245 TRO ER,ERRE ;YES, SET EXTERNAL ERROR FLAG
\r
2247 STOW20: AOS AC1,STPX ;INCREMENT POINTER
\r
2248 MOVEM AC0,STCODE(AC1) ;STOW CODE
\r
2249 MOVEM RC,STOWRC(AC1) ;STOW RELOCATION BITS
\r
2252 POP PP,STFORM(AC1) ;STORE FORM WORD
\r
2254 SKIPN LITLVL ;ARE WE IN LITERAL?
\r
2255 AOS LOCA ;NO, INCREMENT ASSEMBLY LOCATION
\r
2256 CAIGE AC1,.STP-1 ;OVERFLOW?
\r
2257 POPJ PP, ;NO, EXIT
\r
2259 SKIPE LITLVL ;ARE WE IN A LITERAL?
\r
2260 TROA ER,ERRL ;YES, FLAG ERROR BUT DON'T DUMP
\r
2261 JRST CHARL1 ;NO, SAVE REGISTERS AND DUMP THE BUFFER
\r
2262 JRST STOWI ;INITIALIZE BUFFER
\r
2264 DSTOW: AOS AC1,STPY ;INCREMENT POINTER
\r
2265 MOVE AC0,STCODE(AC1) ;FETCH CODE
\r
2266 MOVE RC,STOWRC(AC1) ;FETCH RELOCATION BITS
\r
2268 PUSH PP,STFORM(AC1)
\r
2269 POP PP,FORM ;GET FORM WORD
\r
2271 CAMGE AC1,STPX ;IS THIS THE END?
\r
2272 POPJ PP, ;NO, EXIT
\r
2274 STOWI: SETOM STPX ;INITIALIZE FOR INPUT
\r
2275 SETOM STPY ;INITIALIZE FOR OUTPUT
\r
2278 \fSVSTOW: AOS LITLVL ;NESTED LITERALS
\r
2279 PUSH PP,STPX ;MAKE ROOM FOR ANOTHER
\r
2285 GTSTOW: POP PP,STPY ;BACK UP A LEVEL
\r
2291 STOWT: HRRZ AC1,EXTPNT ;GET RIGHT POINTER
\r
2292 CAIE AC1,(RC) ;DOES IT MATCH
\r
2293 PUSHJ PP,QEXT ;EXTERNAL OR RELOCATION ERROR
\r
2298 STOWT1: HLRZ AC1,EXTPNT ;GET LEFT HALF
\r
2299 CAIE AC1,(RC) ;SEE ABOVE
\r
2303 \fONC: ILDB C,TABP ;ENTRY TO ADVANCE TAB POINTER
\r
2304 PUSHJ PP,OUTL ;OUTPUT A TAB
\r
2305 ;OUTPUT 6 OCT NUMBERS FROM CS LEFT
\r
2306 ONC1: MOVEI C,6 ;CONVERT TO ASCII
\r
2307 LSHC C,3 ;SHIFT IN OCTAL
\r
2308 PUSHJ PP,OUTL ;OUTPUT ASCII FROM C
\r
2309 TRNE CS,-1 ;ARE WE THROUGH?
\r
2310 JRST ONC1 ;NO, GET ANOTHER
\r
2311 MOVEI C,0 ;CLEAR C
\r
2312 TLNN CS,1 ;RELOCATABLE?
\r
2314 TLNN CS,EXTF ;OR EXTERNAL
\r
2316 ONC2: JUMPN C,OUTC ;OUTPUT IF EXTERN OR RELOCATABLE
\r
2317 IFN FORMSW,< SOS FLDSIZ ;DECREMENT FIELD SIZE>
\r
2323 PUSHJ PP,DNC ;RECURSE IF NON-ZERO
\r
2325 ADDI C,"0" ;FORM ASCII
\r
2326 JRST PRINT ;DUMP AND TEST FOR END
\r
2328 OUTAS0: HRLI CS,(POINT 7,,) ;ENTRY TO SET POINTER
\r
2329 OUTASC: ILDB C,CS ;GET NEXT BYTE
\r
2330 JUMPE C,POPOUT ;EXIT ON ZERO DELIMITER
\r
2334 OUTSIX: HRLI CS,(POINT 6,,) ;OUTPUT SIXBIT
\r
2335 ILDB C,CS ;GET SIXBIT
\r
2336 CAIN C,40 ;"@" DELIMITER?
\r
2337 POPJ PP, ;YES, EXIT
\r
2338 ADDI C,40 ;NO, FORM ASCII
\r
2339 PUSHJ PP,OUTL ;OUTPUT ASCII CHAR FROM C
\r
2342 OUTSYM: MOVE CS,AC0 ;PLACE NAME IN CS
\r
2343 OUTSY1: MOVEI C,0 ;CLEAR C
\r
2344 LSHC C,6 ;MOVE NEXT SIXBIT CHARACTER IN
\r
2345 JUMPE C,OUTTAB ;TEST FOR END
\r
2346 ADDI C,40 ;CONVERT TO ASCII
\r
2347 PUSHJ PP,OUTL ;OUTPUT
\r
2349 \fOUTSET: AOS SX,0(PP) ;GET RETURN LOCATION
\r
2350 MOVE SX,-1(SX) ;GET XWD CODE
\r
2351 HLRM SX,BLKTYP ;SET BLOCK TYPE
\r
2353 PUSHJ PP,0(SX) ;GO TO PRESCRIBED ROUTINE
\r
2354 JRST COUTD ;TERMINATE BLOCK AND EXIT
\r
2356 ;LOOKUP SCANS ALL THE SYMBOLS IN THE SYMBOL TABLE
\r
2358 LOOKUP: POP PP,LOOKX ;INTERCEPT RETURN POP
\r
2360 MOVE SDEL,0(SX) ;SET FOR TABLE SCAN
\r
2361 LOOKL: SOJL SDEL,POPOUT ;TEST FOR END
\r
2364 PUSHJ PP,SRCH7 ;LOAD REGISTERS
\r
2366 PUSHJ PP,@LOOKX ;RETURN TO CALLING ROUTINE
\r
2367 JRST LOOKL ;TRY AGAIN
\r
2368 \fEND0: PUSHJ PP,EVALCM ;GET A WORD
\r
2369 SKIPE EXTPNT ;ANY EXTERNALS?
\r
2370 TRO ER,ERRE ;YES, ERROR
\r
2371 SKIPN V,AC0 ;NON-ZERO?
\r
2372 JUMPE RC,.+2 ;OR RELOC?
\r
2373 PUSHJ PP,ASSIG7 ;YES, LIST THE VALUE
\r
2376 PUSHJ PP,VARA ;FILL OUT SELF-DEFINED VARIABLES
\r
2377 PUSHJ PP,STOUTS ;DUMP THE LINE
\r
2378 ; PUSH PP,IO ;SAVE FLAGS
\r
2379 ; TLO IO,IOPROG ;XLIST LITS
\r
2381 ; POP PP,IO ;GET FLAG BACK
\r
2385 TLNN IO,MFLSW ;SKIP IF ONLY PSEND
\r
2387 MOVE INDIR ;SET UP FIRST AS LAST
\r
2388 MOVEM LSTFIL ;PRINTED
\r
2391 TLNE IO,MFLSW ;IF PSEND
\r
2392 POPJ PP, ;BACK TO PSEND0
\r
2393 SKIPE PRGPTR ;HAVE ANY PRGEND'S BEEN SEEN
\r
2394 JRST PSEND3 ;YES,GO SET UP AGAIN
\r
2396 PASS20: SETZM CTLSAV
\r
2398 PUSHJ PP,EOUT ;OUTPUT THE ENTRIES
\r
2400 XWD 6,NOUT ;OUTPUT THE NAME (BLKTYP-6)
\r
2402 SKIPN HISNSW ;PUT OUT BLOCK TYPE 3?
\r
2405 XWD 3,HSOUT ;OUTPUT THE HISEG BLOCK
\r
2408 HRRM BLKTYP ;SET FOR TYPE 1 BLOCK
\r
2409 TLZ FR,P1 ;SET FOR PASS 2 AND TURN OFF FLAG
\r
2410 TLO IO,IOPALL ;PUT THESE BACK
\r
2411 TLZ IO,IOPROG!IOCREF!DEFCRS ;SO LISTINGS WILL BE THE WAY THEY SHOULD
\r
2415 MOVE CS,[XWD $ST-1-$CKSM,R1BLDR]
\r
2429 DATAI PTR,@$TBL1-$RD+1($A)
\r
2430 XCT $TBL1-$RD+1($A)
\r
2431 XCT $TBL2-$RD+1($A)
\r
2433 $TBL1: CAME $CKSM,$ADR
\r
2442 IF2,< PURGE $ST,$RD,$A,$TBL1,$TBL2,$ADR,$CKSM>
\r
2443 \fENDP2: PUSHJ PP,COUTD ;DUMP THE BUFFER
\r
2444 MOVE AC0,LOCO ;CHECK TO SEE IF LIT DIFFERED
\r
2445 SKIPN MODO ;AND USE SMALLER SINCE AT END
\r
2446 JRST [CAMN AC0,ABSHI
\r
2449 IFN RENTSW,<SKIPE HHIGH ;SKIP IF NOT TWO SEGMENTS
\r
2450 JRST [CAMN AC0,HHIGH
\r
2456 REPEAT 1,<TLNE IO,IOCREF ;CLOSE CREF IF NECESSARY>
\r
2457 REPEAT 0,<TLNE FR,CREFSW ;IF CREFFING
\r
2460 PUSH PP,DBUF+3 ;SO NO PAGE INFO
\r
2461 DPB SDEL,[POINT 7,DBUF+3,13]
\r
2462 IOR ER,OUTSW ;MAKE SURE OF OUTPUT
\r
2464 MOVEI C,20 ;CODE FOR TITLE
\r
2466 PUSH PP,IO ;SAVE THIS
\r
2467 TLZ IO,IOPAGE ;AND PREVENT PAGE DURING TITLE
\r
2472 POP PP,IO ;RESTORE THE IO WORD
\r
2473 POP PP,DBUF+3 > ;NEEDS FIX TO CREF
\r
2474 PUSHJ PP,CLSCR2 ;CLOSE IT UP
\r
2475 ENDP2Q: HRR ER,OUTSW ;SET OUTPUT SWITCH
\r
2478 PUSHJ PP,UOUT ;OUTPUT UNDEFINEDS
\r
2480 SKPINC C ;SEE IF WE CAN INPUT A CHAR.
\r
2481 JFCL ;BUT ONLY TO DEFEAT ^O
\r
2482 SKIPG C,ERRCNT ;GET ERROR COUNT AND CHECK FOR POSITIVE
\r
2483 JRST NOERW ;PRINT NO ERROR MESSAGE
\r
2484 IFN CCLSW,<ADDM C,JOBERR ;REMEMBER ERROR COUNT FOR EXECUTION DELETION>
\r
2487 CAIN C,1 ;1 IS A SPECIAL CASE
\r
2488 JRST ONERW ;PRINT MESSAGE
\r
2489 MOVEI C,"?" ;? FOR BATCH
\r
2490 PUSHJ PP,OUTL ;...
\r
2491 MOVE C,ERRCNT ;PRINT NUMBER OF ERRORS
\r
2493 SKIPA CS,[EXP ERRMS1] ;LOAD TO PRINT
\r
2494 ONERW: MOVEI CS,ERRMS2 ;ONE ERROR DETECTED
\r
2495 ONERW1: PUSHJ PP,OUTSIX ;PRINT
\r
2497 NOERW: MOVEI CS,ERRMS3
\r
2498 IFN CCLSW,<TLNE IO,CRPGSW!MFLSW ;IF RPG, DON'T PRINT MESSAGE>
\r
2499 IFE CCLSW,<TLNE IO,MFLSW ;NOR IF MULTI-FILE MODE>
\r
2500 TRZ ER,TTYSW ;NO TTY OUTPUT
\r
2501 IOR ER,OUTSW ;UNLESS NEEDED FOR LISTING
\r
2505 \fENDP2A: PUSHJ PP,OUTCR
\r
2506 TLNN IO,MFLSW ;IN A MULTI-PROG FILE?
\r
2508 SKIPE ERRCNT ;ANY ERROR?
\r
2509 PUSHJ PP,[MOVEI CS,[ASCIZ /PROGRAM /]
\r
2510 PUSHJ PP,OUTAS0 ;YES,SO PRINT MESSAGE
\r
2511 MOVEI CS,TBUF ;AND TITLE
\r
2512 PUSHJ PP,OUTAS0 ;FOR IDENTIFICATION
\r
2513 JRST OUTCR] ;AND A CR-LF
\r
2514 TRZA ER,TTYSW ;NO MORE OUTPUT NOW
\r
2516 IFN CCLSW,<TLNE IO,CRPGSW ;IF RPG, DON'T PRINT PGM BREAK
\r
2517 TRZ ER,TTYSW ;...>
\r
2518 IFE CCLSW,< SKIPA ;SO PRGEND CODE CAN WORK>
\r
2522 MOVEI CS,[SIXBIT /HI-SEG. BREAK IS @/]
\r
2523 SKIPN HHIGH ;DON'T PRINT IF ZERO
\r
2524 JRST ENDP2C ;IT WAS
\r
2526 HRLO CS,HHIGH ;GET THE BREAK
\r
2530 MOVEI CS,[SIXBIT /PROGRAM BREAK IS @/]
\r
2531 PUSHJ PP,OUTSIX ;OUTPUT PROGRAM BREAK
\r
2532 HRRZ CS,ABSHI ;GET ABS. BREAK
\r
2533 CAIG CS,140 ;ANY ABS. CODE
\r
2534 JRST [HRLO CS,HIGH ;NO
\r
2535 JRST ENDP2B] ;SO DON'T PRINT
\r
2536 HRLO CS,HIGH ;GET PROGRAM BREAK
\r
2539 MOVEI CS,[SIXBIT /ABSLUTE BREAK IS @/]
\r
2542 ENDP2B: PUSHJ PP,ONC1
\r
2544 TLNE FR,RIMSW!R1BSW ;RIM MODE?
\r
2545 PUSHJ PP,RIMFIN ;YES, FINISH IT
\r
2546 IFN CCLSW,<TLNN IO,CRPGSW!MFLSW ;IF NOT IN CCL MODE>
\r
2547 IFE CCLSW,<TLNN IO,MFLSW ;NOR IF IN MULTI-FILE MODE>
\r
2548 TRO ER,TTYSW ;PRINT SIZE
\r
2554 MOVEI CS,[SIXBIT /K CORE USED@/]
\r
2559 XWD 2,SOUT ;OUTPUT THE SYMBOLS (BLKTYP-2)
\r
2561 XWD 7,VOUT ;OUTPUT TRANSFER VECTOR (..-7)
\r
2562 IFN WFWSW,<PUSHJ PP,OUTSET ;OUTPUT THE LVAR FIXUPS
\r
2565 XWD 5,HOUT ;OUTPUT HIGHEST RELOCATABLE (..-5)
\r
2567 TLNN IO,MFLSW ;IS IT PRGEND?
\r
2568 JRST FINIS ;ALAS, FINISHED
\r
2569 MOVEI CS,SBUF ;RESET SBUF POINTER
\r
2570 HRRM CS,SUBTTX ;TO SUBTTL
\r
2571 SETZM PASS2I ;CLEAR PASS2 VARIABLES
\r
2572 MOVE [XWD PASS2I,PASS2I+1]
\r
2573 BLT PASS2Z-1 ;BUT NOT ALL OF VARIABLES
\r
2574 JRST INZ ;RE-INITIALIZE FOR NEXT PROG
\r
2576 OUTB12: SKIPN ARG,FIXLNK ;WERE THERE ANY??
\r
2577 POPJ PP, ;JUST GO AWAY
\r
2578 OUTB19: HRRZ SX,(ARG) ;POINTER TO HEADER BLOCK NOW IN SX
\r
2579 HRRZ AC1,(SX) ;NOW AC1 HAS POINTER TO CODE FIXUPS
\r
2580 JUMPE AC1,OUTB13 ;NONE THERE
\r
2581 OUTB16: HLRZ AC0,(AC1) ;GET LOCATION OFFSET
\r
2582 ADD AC0,2(SX) ;ADD BASE LOCATION
\r
2583 SKIPN 1(AC1) ;AND RIGHT HALF??
\r
2585 PUSH PP,AC0 ;SAVE FIXUP VALUE
\r
2587 PUSHJ PP,OUTBWD ;OUTPUT A Z (SAYS RIGHT HALF CODE)
\r
2588 POP PP,AC0 ;GET VALUE BACK
\r
2589 HLRZ RC,1(AC1) ;GET RELOC OF FIXUP CHAIN
\r
2590 LSH RC,1 ;GOES IN LEFT HALF
\r
2591 HRL AC0,1(AC1) ;LOCATION OF CHAIN
\r
2592 PUSHJ PP,OUTBWD ;LEFT HALF LOCATION, RIGHT HALF VALUE
\r
2593 OUTB14: SKIPN 2(AC1) ;ANY LEFT HALF??
\r
2594 JRST OUTB15 ;NO, GO LOOK FOR NEXT BLOCK
\r
2595 PUSH PP,AC0 ;SAVE VALUE
\r
2597 MOVSI AC0,400000 ;INDICATE LEFT HALF
\r
2600 HLRZ RC,2(AC1) ;GET RELOC FOR LEFT HALF
\r
2604 OUTB15: HRRZ AC1,(AC1) ;NEXT LINK IN CHAIN
\r
2605 JUMPN AC1,OUTB16 ;IF NOT END, PROCESS
\r
2606 OUTB13: HLRZ AC1,(SX) ;POINTER TO SYMBOL TABLE FIXUP CHAIN
\r
2607 JUMPE AC1,OUTB17 ;CHACK FOR SOME THERE
\r
2608 OUTB18: MOVE AC0,2(AC1) ;FLAGS
\r
2609 HRR AC0,2(SX) ;VALUE IN RH
\r
2610 MOVEI RC,0 ;NO RELCO ON IT
\r
2612 MOVE AC0,1(AC1) ;THE SYMBOL NAME
\r
2614 HRRZ AC1,(AC1) ;FOOLOW CHAIN
\r
2616 OUTB17: HRRZ ARG,-1(ARG) ;DONE WITH THIS SYMBOL GET NEXT
\r
2618 POPJ PP, ;ALL DONE
\r
2620 OUTBWD: SKIPL COUTX ;IF WE ARE AT THE START
\r
2621 JRST COUT ;NO PUT OUT
\r
2622 PUSH PP,AC0 ;WE NEED TO PUT NEW RELOC AND VAR LENGTH
\r
2623 PUSH PP,RC ;AS FIRST TWO WORDS
\r
2625 MOVEI RC,1 ;IT IS RELOC
\r
2627 MOVE AC0,LVARLC ;THE LENGTH
\r
2632 JRST COUT ;NOW PUT OUT THE ONE WE WANTED TO
\r
2635 RIMFIN: TLNE FR,R1BSW
\r
2644 \fSUBTTL PASS INITIALIZE
\r
2657 HRRES HWFMT ;SET DEFAULT VALUE BACK>
\r
2660 RCPNTR: POINT 1,ARG,^L<RELF>-18 ;POINT 1,ARG,22
\r
2661 \fSUBTTL PSEUDO-OP HANDLERS
\r
2663 TAPE0: PUSHJ PP,STOUTS ;FINISH THIS LINE
\r
2664 JRST GOTEND ;AND IGNORE THE REST OF THIS FILE
\r
2666 RADIX0: PUSHJ PP,EVAL10 ;EVALUATE RADIX D10
\r
2667 CAIG AC0,^D10 ;IF GREATER THAN 10
\r
2668 CAIG AC0,1 ;OR LESS THAN 2,
\r
2669 ERRAX: TROA ER,ERRA ;FLAG ERROR AND SKIP
\r
2670 HRR RX,AC0 ;SET NEW RADIX
\r
2674 XALL0: TLZ IO,IOSALL ;TURN OFF MACRO SUPPRESS ALL
\r
2675 IOSET: JUMP1 POPOUT ;NOSYM (IONSYM), XALL (IOPALL), XLIST (IOPROG)
\r
2676 HLRZ SX,AC0 ;STORE FLAGS
\r
2677 PUSHJ PP,STOUTS ;POLISH OFF LINE
\r
2678 TLO IO,0(SX) ;NOW SUPRESS PRINTING
\r
2681 IORSET: TDZ IO,AC0 ;RESET FLAG IOPALL/IOPROG
\r
2682 TLNE AC0,IONCRF ;RESTORING CREFFING?
\r
2683 TLZ IO,DEFCRS ;YES, CLEAR ANY WAITING DEFINING OCCURENCES
\r
2686 BLOCK0: PUSHJ PP,HIGHQ
\r
2687 PUSHJ PP,EVALEX ;EVALUATE
\r
2688 TRZE RC,-1 ;EXTERNAL OR RELOCATABLE?
\r
2689 PUSHJ PP,QEXT ;YES, DETERMINE TYPE
\r
2690 ADDM AC0,LOCO ;UPDATE ASSEMBLY LOCATION
\r
2691 BLOCK1: EXCH AC0,LOCA ;SAVE START OF BLOCK
\r
2692 ADDM AC0,LOCA ;UPDATE OUTPUT LOCATION
\r
2693 BLOCK2: HRLOM AC0,LOCBLK
\r
2699 PRNTX0: TRO ER,TTYSW ;SET OUTPUT TO TTY
\r
2700 JUMP2 PRNTX2 ;PASS1?
\r
2701 TDOA ER,OUTSW ;YES,OUTPUT TO LSTDEV ALSO
\r
2702 PRNTX2: ANDCM ER,OUTSW ;NO,DON'T OUTPUT TO TTY IF IT IS LSTDEV
\r
2703 PUSHJ PP,BYPASS ;GET FIRST CHAR.
\r
2704 TLOA IO,IORPTC ;REPEAT IT AND SKIP
\r
2705 PRNTX4: PUSHJ PP,PRINT ;PRINT THE CHAR.
\r
2706 PUSHJ PP,CHARAC ;GET ASCII CHAR.
\r
2707 CAIG C,CR ;IF GREATER THAN CR
\r
2708 CAIG C,HT ;OR LESS THAN LF
\r
2709 JRST PRNTX4 ;THEN CONTINUE
\r
2710 PUSHJ PP,OUTCR ;OUTPUT A CRLF
\r
2711 TRZA ER,TTYSW!LPTSW ;TURN OF OUTPUT
\r
2712 CPOPJ1: AOS (PP) ;USEFUL TAG HAS TO GO SOMEWHERE
\r
2713 CPOPJ: POPJ PP, ;EXIT
\r
2715 REMAR0: PUSHJ PP,GETCHR ;GET A CHARACTER
\r
2719 \fLIT0: PUSHJ PP,BLOCK1
\r
2723 ;ON PASS ONE, WE JUST STEP THE LOCATION COUNTER AND CLEAR
\r
2733 LIT20: PUSH PP,LOCA
\r
2741 LIT20A: MOVE SX,LITAB
\r
2742 LIT21: SOSGE LITNUM
\r
2748 MOVE AC0,-2(SX) ;WFW
\r
2749 MOVE RC,-1(SX) ;WFW
\r
2750 MOVE SX,(SX) ;WFW POINTER TO THE NEXT LIT
\r
2751 PUSHJ PP,STOW20 ;STOW CODE
\r
2752 MOVEI C,12 ;SET LINE FEED
\r
2754 PUSHJ PP,OUTLIN ;OUTPUT THE LINE
\r
2756 \fLIT22: HRRZ AC2,LOCO
\r
2761 SUB AC2,LOCO ;COMPUTE LENGTH USED
\r
2762 CAMGE AC0,AC2 ;USE LARGER
\r
2765 LIT24: ADDM AC0,LOCA
\r
2769 LITI: SETZM LITCNT
\r
2775 GETTOP: HRRZ AC1,SX ;VARHD
\r
2778 IFE FORMSW,< MOVEI SX,3 ;WFW>
\r
2779 IFN FORMSW,< MOVEI SX,4 ;ICC>
\r
2783 SUBI SX,1 ;MAKE SX POINT TO LINK
\r
2784 SETZM 0(SX) ;CLEAR FORWARD LINK
\r
2785 HRRM SX,0(AC1) ;STORE ADDRESS IN LAST LINK
\r
2787 \fVAR0: PUSHJ PP,BLOCK1 ;PRINT LOCATION
\r
2791 VARA: MOVE SX,VARHDX
\r
2792 MOVE AC0,LOCA ;GET LOCATION FOR CHECK
\r
2793 JUMP1 VARB ;DO NOT CHECK START ON PASS 1
\r
2794 CAME AC0,-1(SX) ;CHECK START OF VAR AREA
\r
2795 TRO ER,ERRP ;AND GIVE ERROR
\r
2796 VARB: MOVEM AC0,-1(SX) ;SAVE START FOR PASS 2
\r
2804 PUSHJ PP,LOOKUP ;SET FOR TABLE SCAN
\r
2805 IFN WFWSW,<TRNN ARG,EXTF ;IN CASE LVAR HAS BEEN THROUGH>
\r
2807 POPJ PP, ;NO, EXIT
\r
2808 TRZ ARG,UNDF ;TURN OFF FLAG NOW
\r
2809 IFN WFWSW,<MOVSI AC0,1(V) ;NUMBER TO ADD TO>
\r
2810 IFE WFWSW,<MOVSI AC0,1 ;ADD 1>
\r
2811 ADDM AC0,0(AC1) ;UPDATE COUNT
\r
2813 VARA1: ADDI V,1 ;GET LENGTH OF DESIRED BLOCK
\r
2817 HRL ARG,V ;GET STARTING LOCATION AND UPDAT PCS
\r
2820 IOR ARG,MODA ;SET TO ASSEMBLY MODE
\r
2821 IFE WFWSW,<HRL ARG,LOCA>
\r
2822 MOVSM ARG,0(SX) ;UPDATE 2ND WRD OF SYM TAB ENTRY
\r
2823 IFE WFWSW,<AOS LOCA
\r
2826 \fIF: PUSH PP,AC0 ;SAVE AC0
\r
2828 PUSHJ PP,EVALXQ ;EVALUATE AND TEST EXTERNAL
\r
2832 IFPOP: POP PP,AC1 ;RETRIEVE SKIP INSTRUCTION
\r
2833 IFSET: TLO IO,IORPTC ;REPEAT CHARACTER
\r
2834 IFXCT: XCT AC1 ;EXECUTE INSTRUCTION
\r
2835 TDZA AC0,AC0 ;FALSE
\r
2837 IFEXIT: JUMPOC REPEA1 ;BRANCH IF IN OP-CODE FIELD
\r
2838 IFEX1: PUSHJ PP,GETCHR ;SEARCH FOR "<"
\r
2839 CAIN C,EOL ;ERROR IF END OF LINE
\r
2843 JUMPE AC0,IFEX2 ;TEST FOR 0
\r
2844 TLO IO,IORPTC ;NO, PROCESS AS CELL
\r
2846 IFN FORMSW,< MOVE AC1,HWFORM ;USE STANDARD FORM>
\r
2847 SETZM INCND ;NOT ANY MORE
\r
2848 JRST STOW ;STOW CODE AND EXIT
\r
2850 IFPASS: HRRI AC0,P1 ;MAKE IT TLNX IO,P1
\r
2851 MOVE AC1,AC0 ;PLACE IT IN AC1
\r
2852 JRST IFSET ;EXECUTE INSTRUCTION
\r
2854 IFB0: HLLO AC1,AC0 ;FORM AND STORE TEST INSTRUCTION
\r
2855 IFB1: PUSHJ PP,CHARL ;GET FIRST NON-BLANK
\r
2858 JRST IFB1 ;SKIP BLANKS AND TABS
\r
2859 CAIG C,CR ;CHECK FOR CARRET AS DELIM.
\r
2866 SETOM INCND ;SAVE INFO. FOR PASS 1 ERRORS
\r
2867 CAIN C,"<" ;LEFT BRACKET?
\r
2868 SETZB C,RC ;YES, PREPARE FOR OLD FORMAT
\r
2869 SKIPA SX,C ;SAVE FOR COMPARISON
\r
2870 IFB3: TRO AC0,1 ;SET FLAG
\r
2871 IFB2: PUSHJ PP,CHARL ;GET ASCII CHARACTER AND LIST
\r
2872 CAMN C,SX ;TEST FOR DELIMITER
\r
2874 CAIE C," " ;BLANK?
\r
2875 CAIN C," " ;OR TAB?
\r
2877 JUMPN SX,IFB3 ;JUMP IF NEW FORMAT
\r
2879 AOJA RC,IFB2 ;YES, INCREMENT COUNT
\r
2881 SOJL RC,IFXCT ;YES, DECREMENT AND EXIT IF DONE
\r
2882 JRST IFB3 ;GET NEXT CHARACTER
\r
2884 \fIFDEF0: HRRI AC0,UNDF ;MAKE IT TLNX ARG,UNDF
\r
2885 PUSH PP,AC0 ;STACK IT
\r
2886 PUSHJ PP,GETSYM ;TAKES SKIP RETURN IF SYM NAME IS LEGAL
\r
2887 TROA ER,ERRA ;ILLEGAL!
\r
2889 JRST [PUSHJ PP,OPTSCH
\r
2892 PUSHJ PP,SSRCH3 ;EMIT TO CREF ANYWAY
\r
2893 JRST IFPOP ;POP AND EXECUTE INSTRUCTION
\r
2895 \fIFIDN0: HLRZS AC0
\r
2896 MOVEI V,2*.IFBLK-1
\r
2897 SETZM IFBLK(V) ;CLEAR COMPARISON BLOCK
\r
2899 SETZM .TEMP ;CLEAR STORED DELIMETER
\r
2900 MOVEI RC,IFBLK ;SET FOR FIRST BLOCK
\r
2901 PUSHJ PP,IFCL ;GET FIRST STRING
\r
2903 PUSHJ PP,IFCL ;GET SECOND STRING
\r
2905 MOVE SX,IFBLK(V) ;GET WORD FROM FIRST STRING
\r
2906 CAMN SX,IFBLKA(V) ;COMPARE WITH SECOND STRING
\r
2907 SOJGE V,.-2 ;EQUAL, TRY NEXT WORD
\r
2908 JUMPL V,IFEXIT ;DID WE FINISH STRING
\r
2909 XORI AC0,1 ;NO, TOGGLE REQUEST
\r
2910 JRST IFEXIT ;DO NOT TURN ON IORPTC WFW
\r
2912 IFCL: PUSHJ PP,CHARAC ;GET AND LIST CHARACTER
\r
2913 CAIE C," " ;SKIP SPACES
\r
2914 CAIG C,CR ;ALSO SKIP CR-LF
\r
2915 CAIGE C,HT ;AND TAB
\r
2916 JRST .+2 ;NOT ONE OF THEM
\r
2917 JRST IFCL ;SO LONG COMPARISONS WILL WORK
\r
2918 ;*** A CROCK SO THAT IFIDN <X>,<X>,<INST.> WILL WORK ***
\r
2919 CAIE C,"," ;IS IT A COMMA?
\r
2921 SKIPN .TEMP ;YES, WAS PREVIOUS FIELD OLD METHOD?
\r
2922 JRST IFCL ;YES, IGNORE COMMA AND SPACES
\r
2924 CAIN C,"<" ;WAS IT LEFT BRACKET?
\r
2925 SETO C, ;SIGNAL OLD METHOD, LOOK FOR RIGHT BRACKET
\r
2926 MOVEM C,.TEMP ;STORE TERMINATOR FOR COMPARISON
\r
2927 MOVEI SX,5*.IFBLK-1 ;LIMIT SEARCH
\r
2928 HRLI RC,(POINT 7,,) ;SET UP BYTE IN RC
\r
2929 IFCLR: PUSHJ PP,CHARAC
\r
2930 SKIPLE .TEMP ;NEW METHOD?
\r
2931 JRST IFCLR1 ;YES, IGNORE ANGLE BRACKET COUNTING
\r
2932 CAIN C,"<" ;ANOTHER LEFT ANGLE?
\r
2933 SOS .TEMP ;YES, KEEP COUNT
\r
2934 CAIN C,">" ;CLOSING ANGLE
\r
2935 AOSGE .TEMP ;MATCHING COUNT?
\r
2936 IFCLR1: CAMN C,.TEMP ;TEST FOR DELIMITER
\r
2937 POPJ PP, ;EXIT ON RIGHT DELIMITER
\r
2938 SOJG SX,.+2 ;ANY ROOM IN COMPARISON BLOCK?
\r
2939 TROA ER,ERRA ;NO, FLAG ERROR BUT KEEP ON GOING
\r
2940 IDPB C,RC ;DEPOSIT BYTE
\r
2944 IFEX2: PUSHJ PP,GETCHR
\r
2945 CAIN C,EOL ;EXIT WITH ERROR IF END OF LINE
\r
2948 AOJA AC0,IFEX2 ;YES, INCREMENT COUNT
\r
2950 JRST IFEX2 ;NO, TRY AGAIN
\r
2951 SOJGE AC0,IFEX2 ;YES, TEST FOR MATCH
\r
2952 PUSHJ PP,BYPASS ;YES, MOVE TO NEXT DELIMITER
\r
2953 SETZM INCND ;OUT OF CONDITIONAL NOW
\r
2954 AOJA AC0,STOWZ1 ;STOW ZERO
\r
2957 INTER0: HLLZM AC0,INTENT ;AC0 CONTAINS INTF/ENTF FLAGS
\r
2959 INTER1: PUSHJ PP,GETSYM ;GET A SYMBOL
\r
2960 JRST INTER3 ;INVALID, SKIP
\r
2961 PUSHJ PP,SSRCH ;SEARCH THE TABLE
\r
2962 MOVSI ARG,SYMF!INTF!UNDF
\r
2963 TLNE ARG,UNDF ;UNDEFINED?
\r
2964 TRO ER,ERRA ;YES, FLAG ERROR
\r
2965 IFN WFWSW,<TLNN ARG,VARF ;LET HIM MAKE INTERNAL EVEN IF EXTF ON>
\r
2966 TLNN ARG,SYNF!EXTF
\r
2967 TDOA ARG,INTENT ;SET APPROPRIATE FLAGS
\r
2968 INTER3: TROA ER,ERRA ;FLAG ARG EROR AND SKIP
\r
2969 PUSHJ PP,INSERQ ;INSERT/UPDATE
\r
2971 SETZM EXTPNT ;JUST IN CASE, SO AS NOT TO CONFUSE WORLD
\r
2972 POPJ PP, ;NO, EXIT
\r
2973 \fEXTER0: PUSHJ PP,GETSYM ;GET A SYMBOL
\r
2974 JRST EXTER4 ;INVALID, ERROR
\r
2975 EXTER1: TLO IO,DEFCRS ;FLAG THIS AS A DEFINITION
\r
2976 PUSHJ PP,SSRCH ;OK, SEARCH SYMBOL TABLE
\r
2977 JRST EXTER2 ;NOT THERE, INSERT IT
\r
2978 TLNN ARG,EXTF!VARF!UNDF
\r
2979 TROA ER,ERRE ;FLAG ERROR AND BYPASS
\r
2980 TLNE ARG,EXTF ;VALID, ALREADY DEFINED?
\r
2981 JRST [JUMP1 EXTER3 ;YES, BYPASS
\r
2982 TLZN ARG,UNDF ;SKIP IF UNDEFINED ALSO
\r
2983 JRST EXTER3 ;CONTINUE
\r
2984 ANDM ARG,(SX) ;CLEAR UNDF ON PASS 2
\r
2985 JRST EXTER2] ;SET UP EXTERNAL NOW
\r
2986 EXTER2: MOVEI V,2 ;NO, GET 2 CELLS FROM THE TREE
\r
2988 CAML V,SYMBOL ;HAVE WE RUN OUT OF CORE?
\r
2989 PUSHJ PP,XCEEDS ;YES, TRY TO BORROW SOME MORE
\r
2990 SUBI V,2 ;GET RIGHT CELL FOR POINTER
\r
2991 SETZB RC,0(V) ;ALL SET, ZERO VALUES
\r
2992 MOVSI ARG,SYMF!EXTF
\r
2993 PUSHJ PP,INSERT ;INSERT/UPDATE IT
\r
2996 SKIPA ARG,-1(SX) ;GET THE SIXBIT FOR THE NAME
\r
2997 EXTER4: TROA ER,ERRA ;FLAG AS ERROR
\r
2998 MOVEM ARG,1(V) ;AND STORE THAT IN CASE SYMBOL TABLE MOVES
\r
2999 EXTER3: JUMPCM EXTER0
\r
3000 POPJ PP, ;NO, EXIT
\r
3001 \fEVAL10: PUSH PP,RX
\r
3003 PUSHJ PP,EVALEX ;EVALUATE
\r
3004 POP PP,RX ;RESET RADIX
\r
3005 JUMPE RC,POPOUT ;EXIT IF ABSOLUTE
\r
3007 QEXT: SKIPE EXTPNT ;ANY POSSIBILITIES?
\r
3008 TROA ER,ERRE ;YES, FLAG EXTERNAL ERROR
\r
3009 TRO ER,ERRR ;NO, FLAG RELOCATION ERROR
\r
3010 HLLZS RC ;CLEAR RELOCATION/EXTERNAL
\r
3013 EVALXQ: PUSHJ PP,EVALEX ;EVALUATE EXPRESSION
\r
3014 TLZN RC,-2 ;LEFT HALF EXTERNAL
\r
3015 TRZE RC,-2 ;WAS AN EXTERNAL FOUND?
\r
3016 TRO ER,ERRE ;YES, FLAG ERROR
\r
3018 \fOPDEF0: PUSHJ PP,GETSYM ;GET THE FIRST SYMBOL
\r
3019 POPJ PP, ;ERROR IF INVALID SYMBOL
\r
3021 JRST ERRAX ;NO, ERROR
\r
3022 PUSH PP,AC0 ;STACK MNEMONIC
\r
3023 AOS LITLVL ;SHORT OUT LOCATION INCREMENT
\r
3024 PUSHJ PP,STMNT ;EVALUATE STATEMENT
\r
3025 SKIPGE STPX ;CODE STORED?
\r
3026 TROA ER,ERRA ;NO,"A" ERROR
\r
3027 PUSHJ PP,DSTOW ;GET AND DECODE VALUE
\r
3029 EXCH AC0,0(PP) ;EXCHANGE VALUE FOR MNEMONIC
\r
3030 PUSH PP,RC ;STACK RELOCATION
\r
3031 TLO IO,DEFCRS ;SAY WE ARE DEFINING IT
\r
3032 PUSHJ PP,MSRCH ;SEARCH SYMBOL TABLE
\r
3033 MOVSI ARG,OPDF ;NOT FOUND
\r
3034 POP PP,RC ;RESTORE VALUES
\r
3036 TLNE ARG,SYNF!MACF
\r
3037 TRO ER,ERRA ;YES "A" ERROR
\r
3038 TRNN ER,ERRA ;ERROR?
\r
3039 PUSHJ PP,INSERT ;NO, INSERT/UPDATE
\r
3040 TLZ IO,DEFCRS ;JUST IN CASE
\r
3042 JRST STOWI ;BE SURE STOW IS RESET
\r
3045 DEPHA0: MOVE AC0,LOCO
\r
3046 SKIPA RC,MODO ;SET TO OUTPUT VALUES AND SKIP
\r
3047 PHASE0: PUSHJ PP,EVALXQ ;EVALUATE AND CHECK FOR EXTERNAL
\r
3048 MOVEM AC0,LOCA ;SET ASSEMBLY LOCATION COUNTER
\r
3051 \fASSIGN: JUMPAD ERRAX ;NO, ERROR
\r
3053 TLNE IO,IOSALL ;SUPPRESS ALL?
\r
3054 JUMPN MRP,CPOPJ ;IF IN MACRO
\r
3055 ASSIG7: MOVEM RC,ASGBLK
\r
3056 TRNE RC,-2 ;EXTERNAL
\r
3057 HLLZS ASGBLK ;YES,CLEAR RELOCATION
\r
3058 TLNE RC,1 ;LEFT HALF NOT RELOC?
\r
3060 HRROS ASGBLK ;YES, SET FLAG
\r
3064 ASSIG1: PUSH PP,AC0 ;SAVE SYMBOL
\r
3065 SETZB AC0,EXTPNT ;SPECIAL CHECK FOR == WFW
\r
3066 PUSHJ PP,PEEK ;IS THE NEXT ON =
\r
3069 TLO AC0,NOOUTF ;YES, NOT OUT TO DDT WFW
\r
3070 PUSHJ PP,GETCHR ;PROCESS THE CHAR.
\r
3071 PUSHJ PP,PEEK ;CHECK FOR ==: DMN
\r
3072 ASSIG5: CAIE C,":" ;IS IT
\r
3074 TLO AC0,INTF ;MAKE INTERNAL
\r
3075 PUSHJ PP,GETCHR ;REPEAT IT
\r
3076 ASSIG6: MOVEM AC0,HDAS ;STORE THESE BITS WFW
\r
3077 PUSHJ PP,EVALCM ;EVALUATE EXPRESSION
\r
3078 EXCH AC0,0(PP) ;SWAP VALUE FOR SYMBOL
\r
3080 TRNN RC,-2 ;CHECK EXTERNAL AGREEMENT
\r
3085 PUSHJ PP,QEXT ;EXTERNAL OR RELOCATION ERROR
\r
3086 ASSIG2: HLRZ RC,(PP)
\r
3092 ASSIG3: TLO IO,DEFCRS
\r
3096 TLNE ARG,UNDF ;WAS IT UNDEFINED
\r
3097 TLZ ARG,EXTF!PNTF ;YES,CLEAR EXTF NOW
\r
3098 TLZ ARG,UNDF!VARF ;CANCEL UNDEFINED AND VARIABLE FLAGS
\r
3099 SETZM EXTPNT ;FOR REST OF WORLD
\r
3101 TRNE ER,ERRORS-ERRQ
\r
3102 SETZ RC, ;CLEAR RELOCATION
\r
3104 TRNE ER,ERRU ;WAS VALUE UNDEFINED?
\r
3105 TLO ARG,UNDF ;YES,SO TURN UNDF ON
\r
3106 TLNE ARG,TAGF!EXTF
\r
3110 \fLOC0: PUSHJ PP,HIGHQ ;AC0=0,0
\r
3111 PUSH PP,AC0 ;SAVE MODE REQUESTED
\r
3112 HLRZS AC0 ;PUT MODE IN RIGHT HALF
\r
3113 JUMPN AC0,RELOC0 ;RELOC PSEUDO-OP
\r
3114 CAMN AC0,MODO ;SAME AS PRESENT MODE?
\r
3115 JRST [HRRZ AC0,LOCO ;YES
\r
3116 EXCH AC0,ABSLOC ;EXCH VALUES
\r
3118 HRRZ AC0,LOCO ;NO, GET CURRENT VALUE
\r
3119 MOVEM AC0,RELLOC ;SAVE IT
\r
3120 MOVE AC0,ABSLOC ;GET LAST RELOC VALUE
\r
3121 LOC01: PUSHJ PP,BYPASS ;SKIP BLANKS
\r
3123 CAIE C,EOL ;USE PREVIOUS VALUE IF NULL ARGUMENT
\r
3124 PUSHJ PP,EVALXQ ;GET EXPRESSION AND TEST EXTERNAL
\r
3125 HRRM AC0,(PP) ;STORE NEW VALUE
\r
3126 POP PP,AC0 ;RETRIEVE STORED MODE AND VALUE
\r
3127 LOC10: HRRZM AC0,LOCA ;SET ASSEMBLY LOCATION
\r
3128 HRRZM AC0,LOCO ;AND OUTPUT LOCATION
\r
3129 HLRZM AC0,MODA ;SET MODE
\r
3133 RELOC0: CAMN AC0,MODO
\r
3134 JRST [HRRZ AC0,LOCO
\r
3143 HISEG1: PUSHJ PP,HIGHQ ;SET CURRENT PROGRAM BREAK
\r
3144 PUSHJ PP,COUTD ;DUMP CURRENT TYPE OF BLOCK
\r
3145 SKIPN HISNSW ;IF WE HAVE SEEN IT BEFORE
\r
3146 SKIPE HIGH ;OR ANY RELOC CODE PUT OUT
\r
3147 TRO ER,ERRQ ;FLAG AS AN ERROR
\r
3148 PUSHJ PP,BYPASS ;GO GET EXPRESSION
\r
3150 PUSHJ PP,EVALXQ ;CHECK FOR EXTERNAL
\r
3151 ANDCMI AC0,1777 ;ONLY ALLOWED TO START ON NEW K BOUND
\r
3152 HRRZM AC0,LOCA ;SET LOC COUNTERS
\r
3154 MOVEI RC,1 ;ASSUME RELOCATABLE
\r
3157 TWSEG0: PUSHJ PP,HISEG1 ;COMMON CODE
\r
3158 JUMPN AC0,.+2 ;ARGUMENT SEEN
\r
3159 MOVEI AC0,400000 ;ASSUME 400000
\r
3160 HRRZM AC0,HMIN ;SET OFSET OF HIGH SEG.
\r
3161 HRRZM AC0,HHIGH ;INCASE NO HISEG CODE
\r
3162 TLOA AC0,(1B0) ;SIGNAL TWO SEGMENTS AND SKIP
\r
3164 HISEG0: PUSHJ PP,HISEG1 ;COMMON CODE
\r
3165 HISEG2: MOVEM AC0,SVTYP3 ;SAVE THE HISEG ARG
\r
3166 MOVEM RC,MODA ;SET MODES
\r
3168 SETOM HISNSW ;WE HAVE ALREADY PUT ONE OUT
\r
3169 JRST BLOCK2 ;MAKE LISTING HAPPEN RIGHT>
\r
3176 ONFORM: HRRES HWFMT ;ALLOW MULTI-FORMAT LISTING
\r
3178 OFFORM: HRROS HWFMT ;HALF-WORD FORMAT ONLY
\r
3185 HIGHQ1: MOVE V,LOCO ;GET ASSEMBLY LOCATION
\r
3186 SKIPN MODO ;IF ASSEMBLY MODE IS ABSOLUTE
\r
3187 JRST [CAMLE V,ABSHI ;RECORED ABS HIGHEST ALSO
\r
3190 IFN RENTSW,<SKIPE HMIN ;IS IT A TWO SEGMENT PROGRAM?
\r
3191 JRST [CAMGE V,HMIN ;YES,IS THIS HIGH SEG.?
\r
3192 JRST .+1 ;NO,STORE LOW SEGMENT
\r
3193 CAMLE V,HHIGH ;YES,IS IT GREATER THAN "HHIGH"?
\r
3194 MOVEM V,HHIGH ;YES,REPLACE WITH LARGER VALUE
\r
3196 CAMLE V,HIGH ;IS IT GREATER THAN "HIGH"?
\r
3197 MOVEM V,HIGH ;YES, REPLACE WITH LARGER VALUE
\r
3200 ONML: TLZA FR,MWLFLG ;MULTI-WORD LITERALS OK
\r
3201 OFFML: TLO FR,MWLFLG ;NO
\r
3204 OFFSYM: SETOM IONSYM ;SUPRESS SYMBOL TABLE LISTING
\r
3207 SUPRE0: PUSHJ PP,GETSYM ;GET A SYMBOL TO SUPRES
\r
3208 JRST SUPRE1 ;ERROR
\r
3209 PUSHJ PP,SSRCH ;SYMBOL ONLY
\r
3210 JRST SUPRE1 ;GIVE ERROR MESSAGE
\r
3211 TLOA ARG,SUPRBT ;SET THE SUPRESS BIT
\r
3212 SUPRE1: TROA ER,ERRA
\r
3213 IORM ARG,(SX) ;PUT BACK
\r
3214 JUMPCM SUPRE0 ;ANY MORE?
\r
3217 SUPRSA: PUSHJ PP,LOOKUP ;SUPRESS ALL
\r
3220 SUPRS1: SETZM EXTPNT ;JUST IN CASE WE LOOKED ONE UP
\r
3223 XPUNG0: JUMP1 POPOUT
\r
3225 MOVE ARG,(SX) ;GET SYMBOL FLAGS
\r
3226 TLNN ARG,INTF!ENTF!EXTF!SPTR
\r
3227 TLOA ARG,SUPRBT ;LOCAL SYMBOL,SO SUPPRESS IT
\r
3229 MOVEM ARG,(SX) ;RESTORE FLAGS
\r
3231 \fTITLE0: JUMP2 REMAR0
\r
3234 PUSHJ PP,SUBTT1 ;GO READ IT
\r
3235 MOVEM SX,TCNT ;SAVE COUNT OF CHARS. WRITTEN
\r
3236 SKIPE UNIVSN ;WAS IT A UNIVERSAL?
\r
3237 PUSHJ PP,ADDUNV ;YES ADD TO TABLE
\r
3238 TLOE IO,IOTLSN ;HAVE WE SEEN ONE
\r
3239 IFE CCLSW,<TRO ER,ERRM ;YES, COMPLAIN>
\r
3240 IFN CCLSW,<TROA ER,ERRM ;YES, MESSAGE
\r
3241 JRST PRNAM ;PRINT NAME IF FIRST ONE>
\r
3242 POPJ PP, ;EXIT OTHERWISE
\r
3244 SUBTT0: SKIPE SBUF ;STORE FIRST SUBTTL ON PASS1
\r
3245 JUMP1 REMAR0 ;OTHERWISE EXIT IF PASS ONE
\r
3249 SUBTT1: PUSHJ PP,BYPASS ;BYPASS LEADING BLANKS
\r
3251 SUBTT3: PUSHJ PP,CHARAC ;GET ASCII CHARACTER
\r
3252 IDPB C,AC0 ;STORE IN BLOCK
\r
3253 CAIGE C,40 ;TEST FOR TERMINATOR
\r
3255 SOJG SX,SUBTT3 ;TEST FOR BUFFER FULL
\r
3256 DPB RC,AC0 ;END, STORE TERMINATOR
\r
3257 SOJA SX,CPOPJ ;COUNT NUL AND EXIT
\r
3260 PRNAM: TLNN IO,CRPGSW ;NOT IF NOT RPG
\r
3262 PUSH PP,AC0 ;SAVE AC0 DMN
\r
3263 PUSH PP,RC ;AND RC
\r
3264 MOVE AC0,[POINT 7,TBUF]
\r
3265 MOVE SX,[POINT 7,OTBUF]
\r
3266 MOVEI RC,6 ;MAX OF SIX CHRS
\r
3268 CAILE C," " ;CHECK FOR LEGAL
\r
3269 CAILE C,"Z"+40 ;CHECK AGAINST LOWER CASE Z
\r
3271 IDPB C,SX ;PUT IN OUTPUT BUFFER
\r
3272 SOJG RC,PN1 ;GET MORE
\r
3274 IDPB C,SX ;TERMINATOR
\r
3279 POP PP,AC0 ;RESTORE AC0 DMN
\r
3282 \fSYN0: PUSHJ PP,GETSYM ;GET THE FIRST SYMBOL
\r
3283 JRST ERRAX ;ERROR, EXIT
\r
3284 PUSHJ PP,MSRCH ;TRY FOR MACRO/OPDEF
\r
3285 JRST SYN3 ;NO,0THRY FOR OPERAND
\r
3286 SYN1: MOVEI SX,MSRCH ;YES, SET FLAG
\r
3287 SYN2: PUSHJ PP,SAVEXS ;SAVE REGISTERS
\r
3288 JUMPNC ERRAX ;ERROR IF NO COMMA
\r
3289 PUSHJ PP,GETSYM ;GET THE SECOND SYMBOL
\r
3291 PUSHJ PP,@SAVBLK+SX ;SEARCH FOR SECOND SYMBOL
\r
3293 MOVE ARG,SAVBLK+ARG ;GET VALUES
\r
3296 TLNE ARG,MACF ;MACRO?
\r
3297 PUSHJ PP,REFINC ;YES, INCREMENT REFERENCE
\r
3298 JRST INSERT ;INSERT AND EXIT
\r
3300 SYN3: PUSHJ PP,SSRCH ;SEARCH FOR OPERAND
\r
3301 JRST SYN4 ;NOT FOUND, TRY OP CODE
\r
3302 TLO ARG,SYNF ;FLAG AS SYNONYM
\r
3303 TLNE ARG,EXTF ;EXTERNAL?
\r
3304 HRRZ V,ARG ;YES, RELPACE WITH POINTER
\r
3305 MOVEI SX,SSRCH ;SET FLAG
\r
3306 TLNN ARG,VARF ;DO NOT LET HIM SYN A VARIABLE
\r
3310 SYN4: PUSHJ PP,OPTSCH ;SEARCH FOR OP-CODE
\r
3311 JRST ERRAX ;NOT FOUND, EXIT WITH ERROR
\r
3312 MOVSI ARG,SYNF ;FLAG AS SYNONYM
\r
3314 \fPURGE0: PUSHJ PP,GETSYM ;GET A MNEMONIC
\r
3315 JRST [TRZ ER,ERRA ;CLEAR ERROR
\r
3316 POPJ PP,] ;AND RETURN
\r
3317 PUSHJ PP,MSRCH ;SEARCH MACRO SYMBOL TABLE
\r
3318 JRST PURGE2 ;NOT FOUND, TRY SYMBOLS
\r
3319 PUSH PP,CS ;SAVE CS AS IT MAY GET GARBAGED
\r
3320 TLNE ARG,MACF ;MACRO?
\r
3321 PUSHJ PP,REFDEC ;YES, DECREMENT THE REFERENCE
\r
3323 JRST PURGE4 ;REMOVE SYMBOL FROM TABLE
\r
3325 PURGE2: PUSHJ PP,SSRCH ;TRY OPERAND SYMBOL TABLE
\r
3326 JRST PURGE5 ;NOT FOUND GET NEXT SYMBOL
\r
3327 TRNN RC,-2 ;CHECK COMPLEX EXTERNAL
\r
3332 TLNE ARG,EXTF!UNDF ;ERROR IF EXTERNAL OR UNDEFINED
\r
3333 TLNE ARG,SYNF ;BUT NOT A SYNONYM
\r
3335 PURGE3: TROA ER,ERRA ;NOT FOUND, ERROR
\r
3336 PURGE4: PUSHJ PP,REMOVE ;REMOVE FROM THE SYMBOL TABLE
\r
3337 PURGE5: JUMPCM PURGE0
\r
3339 \fOPD1: TLNE ARG,UNDF ;IF OPDEF IS UNDEFINED
\r
3340 TRO ER,ERRO ;GIVE "O" ERROR
\r
3341 OPD: MOVE AC0,V ;PUT VALUE IN AC0
\r
3343 IOP: MOVSI AC2,(POINT 9,0(PP),11)
\r
3344 IFE FORMSW,< TLOA IO,IOIOPF ;SET "IOP SEEN" AND SKIP>
\r
3345 IFN FORMSW,< PUSH PP,IOFORM ;USE I/O FORM
\r
3346 TLO IO,IOIOPF ;SET "IOP" SEEN
\r
3348 OP: MOVSI AC2,(POINT 4,0(PP),12)
\r
3349 IFN FORMSW,< PUSH PP,INFORM ;USE INST. FORM>
\r
3351 PUSH PP,AC0 ;STACK CODE
\r
3353 PUSHJ PP,EVALEX ;EVALUATE FIRST EXPRESSION
\r
3356 OP1B: PUSHJ PP,GETCHR ;GET A CHARACTER
\r
3357 IFE FORMSW,<JUMPCM XWD5 ;PROCESS COMMA COMMA IN XWD>
\r
3358 IFN FORMSW,<JUMPNC .+4 ;JUMP IF NO COMMA
\r
3359 MOVE AC2,HWFORM ;GET FORM WORD FOR XWD
\r
3360 MOVEM AC2,-2(PP) ;REPLACE INSTRUCTION FORM
\r
3361 JRST XWD5 ;PROCESS COMMA COMMA IN XWD>
\r
3362 TLO IO,IORPTC ;NOT A COMMA,REPEAT IT
\r
3366 JUMPE RC,OP1A ;EXTERNAL OR RELOCATABLE?
\r
3367 PUSHJ PP,QEXT ;YES, DETERMINE WHICH AND FLAG AN ERROR
\r
3369 OP1A: PUSHJ PP,EVALEX ;GET ADDRESS PART
\r
3370 OP2: PUSHJ PP,EVADR ;EVALUATE STANDARD ADDRESS
\r
3371 OP3: POP PP,AC0 ;PUT IN AC0
\r
3373 IFN FORMSW,< POP PP,AC1 ;GET FORM WORD>
\r
3374 SKIPE (PP) ;CAME FROM EVALCM?
\r
3375 JRST STOW ;NO,STOW CODE AND EXIT
\r
3376 POP PP,AC1 ;YES,EXIT IMMEDIATELY
\r
3379 \fEVADR: ;EVALUATE STANDARD ADDRESS
\r
3380 IFE IIISW,<TLNN AC0,-1 ;OK IF ALL 0'S
\r
3382 TLC AC0,-1 ;CHANGE ALL ONES TO ZEROS
\r
3383 TLCE AC0,-1 ;OK IF ALL 1'S
\r
3384 TRO ER,ERRQ ;NO,FLAG Q ERROR>
\r
3385 ADD AC0,-1(PP) ;ADD ADDRESS PORTIONS
\r
3386 HLL AC0,-1(PP) ;GET LEFT HALF
\r
3387 TLZE FR,INDSW ;INDIRECT BIT?
\r
3388 TLO AC0,(Z @) ;YES, PUT IT IN
\r
3389 MOVEM AC0,-1(PP) ;RE-STACK CODE
\r
3390 ADD RC,-2(PP) ;UPDATE RELOCATION
\r
3391 HRRM RC,-2(PP) ;USE HALF WORD ADD
\r
3393 POPJ PP, ;NO, EXIT
\r
3396 PUSHJ PP,EVALCM ;EVALUATE
\r
3398 MOVSS V,AC0 ;SWAP HALVES
\r
3399 IFE IIISW,<MOVSS SX,RC
\r
3400 IOR SX,V ;MERGE RELOCATION
\r
3401 TRNN SX,-1 ;RIGHT HALF ZERO?
\r
3402 JRST OP2A ;YES, DO SIMPLE ADD
\r
3403 MOVE ARG,RC ;NO, SWAP RC INTO ARG>
\r
3404 IFN IIISW,<MOVSS ARG,RC>
\r
3405 ADD V,-1(PP) ;ADD RIGHT HALVES
\r
3407 HRRM V,-1(PP) ;UPDATE WITHOUT CARRY
\r
3409 HLLZS AC0 ;PREPARE LEFT HALVES
\r
3411 IFE IIISW,<TLNE SX,-1 ;IS LEFT HALF ZERO?
\r
3412 TRO ER,ERRQ ;NO FLAG FORMAT ERROR
\r
3413 OP2A: TLNE RC,-1 ;RELOCATION FOR LEFT HALF?
\r
3414 PUSHJ PP,OP2A1 ;YES,IS IT LEGAL?
\r
3415 TLNE AC0,777000 ;OP CODE FIELD USED?
\r
3416 JRST [EXCH AC0,-1(PP);YES, GET STORED CODE
\r
3417 TLNE AC0,777000 ;OP CODE FIELD BEEN SET?
\r
3418 TRO ER,ERRQ ;YES, MOST LIKELY AN ERROR
\r
3420 JRST .+1] ;RETURN TO ADD >
\r
3421 ADDM AC0,-1(PP) ;MERGE WITH PREVIOUS VALUE
\r
3424 JRST ERRAX ;NO, FLAG ERROR
\r
3425 ;YES, BYPASS PARENTHESIS
\r
3427 BYPAS1: PUSHJ PP,GETCHR
\r
3428 BYPAS2: JUMPE C,.-1 ;SKIP TRAILING BLANKS
\r
3432 OP2A1: EXCH RC,-2(PP) ;GET STORED CODE
\r
3433 TLNN RC,-1 ;OK IF ALL ZERO
\r
3434 JRST OP2A2 ;OK SO RETURN
\r
3435 TLC RC,-1 ;CHANGE ALL ONES TO ZEROS
\r
3436 TLCE RC,-1 ;OK IF ALL ONES
\r
3437 TRO ER,ERRQ ;OTHERWISE A "Q" ERROR
\r
3438 OP2A2: EXCH RC,-2(PP) ;GET RC,BACK
\r
3439 POPJ PP, ;AND RETURN>
\r
3442 EXPRES: HRLZ AC0,RX ;FUDGE FOR OCT0
\r
3446 OCT1: PUSHJ PP,EVALEX ;EVALUATE
\r
3447 IFN FORMSW,< MOVE AC1,HWFORM>
\r
3448 PUSHJ PP,STOW ;STOW CODE
\r
3450 POP PP,RX ;YES, RESTORE RADIX
\r
3452 \fSIXB10: MOVSI RC,(POINT 6,AC0) ;SET UP POINTER
\r
3453 MOVEI AC0,0 ;CLEAR WORD
\r
3455 SIXB20: PUSHJ PP,CHARL ;GET NEXT CHARACTER
\r
3456 CAMN C,SX ;IS THIS PRESET DELIMITER?
\r
3457 IFE FORMSW,< JRST ASC60 ;YES>
\r
3459 JRST [PUSHJ PP,BYPAS1
\r
3467 TRZA C,100 ;CONVERT LOWER CASE TO SIXBIT
\r
3468 SUBI C,40 ;CONVERT TO SIXBIT
\r
3469 JUMPL C,ASC55 ;TEST FOR INVALID CHARACTER
\r
3470 IDPB C,RC ;NO, DEPOSIT THE BYTE
\r
3471 TLNE RC,770000 ;IS THE WORD FULL?
\r
3472 JRST SIXB20 ;NO, GET NEXT CHARACTER
\r
3473 IFN FORMSW,< MOVE AC1,SXFORM ;SIXBIT FORM>
\r
3474 PUSHJ PP,STOWZ ;YES, STORE
\r
3475 JRST SIXB10 ;GET NEXT WORD
\r
3476 \fASCII0: HLLZ SDEL,AC0 ;STORE ASCII/ASCIZ FLAG
\r
3477 ASC10: PUSHJ PP,CHARL ;GET FIRST NON-BLANK
\r
3481 CAIG C,CR ;CHECK FOR CRRET AS DELIM
\r
3485 MOVEM SX,TXTSEQ ;SAVE SEQ AND PAGE
\r
3489 MOVE SX,C ;SAVE FOR COMPARISON
\r
3490 JUMPG SDEL,SIXB10 ;BRANCH IF SIXBIT
\r
3492 ASC20: MOVSI RC,(POINT 7,AC0) ;SET UP POINTER
\r
3493 TLNE SDEL,200000 ;THIS BIT (AND BIT0) IN FOR COMMENT
\r
3494 MOVSI RC,440000 ;SO NOTHING WILL BE DEPOSITED
\r
3495 IFE IIISW,<MOVEI AC0,0 ;CLEAR WORD>
\r
3496 IFN IIISW,<TLNE SDEL,100000 ;ASCID?
\r
3497 TLZA SDEL,400000 ;YES, ZERO ASCIZ BIT
\r
3498 TDZA AC0,AC0 ;NO, ZERO WORD
\r
3499 MOVE AC0,[BYTE (7) 10,10,10,10,10 (1) 1] ;YES, A WORD FULL OF BACKSPACES>
\r
3500 ASC30: PUSHJ PP,CHARL ;GET ASCII CHARACTER AND LIST
\r
3501 CAMN C,SX ;TEST FOR DELIMITER
\r
3503 IDPB C,RC ;DEPOSIT BYTE
\r
3504 TLNE RC,760000 ;HAVE WE FINISHED WORD?
\r
3505 JRST ASC30 ;NO,GET NEXT CHARACTER
\r
3506 IFN FORMSW,< MOVE AC1,ASCIIF ;USE ASCII FORM WORD>
\r
3507 PUSHJ PP,STOWZ ;YES, STOW IT
\r
3508 JRST ASC20 ;GET NEXT WORD
\r
3510 ASC55: TDZA CS,CS ;ZERO CS IN CASE NESTED
\r
3511 ASC50: TDZA RC,SDEL ;TEST FOR ASCIIZ
\r
3512 TROA ER,ERRA ;SIXBIT ERROR EXIT
\r
3513 ASC60: PUSHJ PP,BYPAS1 ;POLISH OFF TERMINATOR
\r
3514 SETZM INTXT ;WE ARE OUT OF IT
\r
3515 IFN FORMSW,< MOVE AC1,ASCIIF ;USE ASCII FORM WORD>
\r
3516 IFN IIISW,<TLNN SDEL,100000 ;NO EXTRA WORDS FOR ASCID>
\r
3517 ANDCM RC,STPX ;STORE AT LEAST ONE WORD
\r
3518 TLNN SDEL,200000 ;GET OUT WITHOUT STORING
\r
3519 JUMPGE RC,STOWZ ;STOW
\r
3520 POPJ PP, ;ASCII, NO BYTES STORED, SO EXIT
\r
3522 IFN FORMSW,< PUSH PP,BPFORM ;USE BYTE POINTER FORM WORD>
\r
3523 PUSH PP,RC ;STACK REGISTERS
\r
3525 PUSHJ PP,EVAL10 ;EVALUATE RADIX 10
\r
3526 DPB AC0,[POINT 6,0(PP),11] ;STORE BYTE SIZE
\r
3528 PUSHJ PP,EVALEX ;NO, GET ADDRESS
\r
3529 PUSHJ PP,EVADR ;EVALUATE STANDARD ADDRESS
\r
3531 PUSHJ PP,EVAL10 ;EVALUATE RADIX 10
\r
3532 TLNE IO,NUMSW ;IF NUMERIC
\r
3533 TDCA AC0,[-1] ;POSITION=D35-RHB
\r
3534 POINT2: MOVEI AC0,0 ;OTHERWISE SET TO D36
\r
3537 ADDM AC0,0(PP) ;UPDATE VALUE
\r
3540 IFN FORMSW,< PUSH PP,HWFORM ;USE HALF WORD FORM>
\r
3542 PUSH PP,AC0 ;STORE ZERO ON STACK
\r
3543 PUSHJ PP,EVALEX ;EVALUATE EXPRESSION
\r
3545 XWD5: SKIPN (PP) ;ANY CODE YET?
\r
3546 JRST XWD10 ;NO,USE VALUE IN AC0
\r
3547 JUMPE AC0,.+2 ;ANYTHING IN AC0?
\r
3548 TRO ER,ERRQ ;YES,FLAG "Q"ERROR
\r
3549 MOVE AC0,(PP) ;USE PREVIOUS VALUE
\r
3550 MOVE RC,-1(PP) ;AND RELOCATION
\r
3551 XWD10: HRLZM AC0,0(PP) ;SET LEFT HALF
\r
3554 JRST OP1A ;EXIT THROUGH OP
\r
3556 IOWD0: PUSHJ PP,EVALXQ ;EVALUATE AND TEST FOR EXTERNAL
\r
3558 JRST [SKIPN AC0 ;IF NZERO AND NO "," SEEN
\r
3559 TRO ER,ERRQ ;TREAT AS Q ERROR
\r
3560 IFN FORMSW,< MOVE AC1,HWFORM ;USE HALF WORD FORM>
\r
3561 SOJA AC0,STOW] ;NO, TREAT AS RIGHT HALF
\r
3562 PUSH PP,AC0 ;YES, STACK LEFT HALF
\r
3563 PUSHJ PP,EVALEX ;WFW
\r
3565 POP PP,AC1 ;RETRIEVE LEFT HALF
\r
3568 IFN FORMSW,< MOVE AC1,HWFORM ;USE HALF WORD FORM>
\r
3569 JRST STOW ;STOW CODE AND EXIT
\r
3570 \fBYTE0: PUSHJ PP,BYPASS ;GET FIRST NON-BLANK
\r
3572 JRST ERRAX ;NO, FLAG ERROR AND EXIT
\r
3578 PUSH PP,AC0 ;INITIALIZE STACK TO ZERO
\r
3579 MOVSI ARG,(POINT -1,(PP))
\r
3581 BYTE1: PUSH PP,ARG
\r
3582 PUSHJ PP,EVAL10 ;EVALUATE RADIX 10
\r
3584 CAIG AC0,^D36 ;TEST SIZE
\r
3587 DPB AC0,[POINT 6,ARG,11] ;STORE BYTE SIZE
\r
3589 BYTE2: IBP ARG ;INCREMENT BYTE
\r
3590 TRZN ARG,-1 ;OVERFLOW?
\r
3593 EXCH AC0,0(PP) ;GET CURRENT VALUES
\r
3594 EXCH RC,-1(PP) ;AND STACK ZEROS
\r
3596 MOVE AC1,HWFORM ;USE STANDARD FORM
\r
3597 EXCH AC1,-2(PP) ;GET FORM WORD
\r
3599 PUSHJ PP,STOW ;STOW FULL WORD
\r
3601 BYTE3: PUSH PP,ARG
\r
3602 PUSHJ PP,EVALEX ;COMPUTE NEXT BYTE
\r
3604 DPB AC0,ARG ;STORE BYTE
\r
3606 DPB RC,AC0 ;STORE RELOCATION
\r
3611 DPB AC0,ARG ;STORE FORM BYTE
\r
3616 JRST BYTE1 ;YES, GET NEW BYTE SIZE
\r
3617 JRST OP3 ;NO, EXIT
\r
3618 \fRADX50: PUSHJ PP,EVALEX ;EVALUATE CODE
\r
3619 JUMPN RC,ERRAX ;ERROR IF NOT ABSOLUTE
\r
3622 PUSHJ PP,GETSYM ;YES, GET SYMBOL
\r
3623 TRZ ER,ERRA ;CLEAR ERROR
\r
3624 PUSHJ PP,SQOZE ;SQUOZE SIXBIT AND ADD CODE
\r
3625 IFN FORMSW,< MOVE AC1,HWFORM ;USE STANDARD FORM>
\r
3626 JRST STOW ;STOW CODE AND EXIT
\r
3629 SQOZE: MOVE AC1+1,AC0 ;PUT SIXBIT IN AC1+1
\r
3630 MOVEI AC0,0 ;CLEAR RESULT
\r
3631 SQOZ1: MOVEI AC1,0
\r
3632 LSHC AC1,6 ;PUT 6-BIT CHARACTER IN AC1
\r
3633 LDB AC1,[POINT 6,CSTAT(AC1),23] ;CONVERT TO RADIX50
\r
3634 IMULI AC0,50 ;MULTIPLY PREVIOUS RESULT
\r
3635 ADD AC0,AC1 ;ADD NEW CHARACTER
\r
3636 JUMPN AC1+1,SQOZ1 ;TEST FOR END
\r
3637 LSH ARG,^D30 ;LEFT-JUSTIFY CODE
\r
3638 IOR AC0,ARG ;MERGE WITH RESULT
\r
3640 \fREPEAT 0,< EXPLANATION OF ARRAY AND LVAR FEATURES
\r
3642 WHEN A VARIABLE IS SEEN EITHER BY #, INTEGER OR ARRAY
\r
3643 THE VALUE PORTION OF THE SYMBOL TABLE ENTRY (RH OF 2ND WORD)
\r
3644 IS USE TO HOLD THE DESIRED SIZE-1. THE CORRECT VALUE IS
\r
3645 ASSIGNED BY THE VAR PSEUDO OP.
\r
3647 WHEN LVAR IS SEEN, A SEARCH OF THE SYMBOL TABLE IS MADE
\r
3648 FOR ALL VARIABLES. THE VARF (VARIABLE) FLAG IS
\r
3649 LEFT ON AND EXTF AND PNTF ARE TURNED ON SO THAT THE
\r
3650 VARIABLE LOOKS LIKE AN EXTERNAL. THE POINTER
\r
3651 (RH OF 2ND WORD OF THE SYMBOL TABLE ENTRY) POINTS
\r
3652 TO THE HEADER BLOCK. THE HEADER BLOCK IS FORMATTED AS FOLLOWS:
\r
3653 WORD 1: LEFT HALF IS A POINTER TO SYMBOL TABLE FIXUP BLOCKS
\r
3654 RIGHT HALF IS A POINTER TO CODE FIXUP BLOCKS
\r
3655 WORD 2: 0 THIS IS USED TO DISTINGUISH IT FROM NORMAL EXTERNALS
\r
3656 WHICH HAVE THE SYMBOL NAME HERE
\r
3657 WORD 3: THE LOCATION RELATIVE TO THE START OF THE LOW CORE
\r
3660 CORE FIXUP BLOCKS ARE SET UP BY BOUT
\r
3662 WORD1: RH LINK TO NEXT CORE FIXUP BLOCK 0 IF END OF CHAIN
\r
3663 LH OFFSET. NUMBER TO BE ADDED TO SYMBOL VALUE BEFORE
\r
3665 WORD 2: POINTER TO A FIXUP CHAIN FOR RIGHT HALVES
\r
3666 LEFT HALF IS RELOCATION RH IS ADDRESS
\r
3667 WORD 3: SAME AS WORD 2 BUT FOR LEFT HALF FIXUPS
\r
3669 NOTE ALL THESE FIXUPS ARE CHAINED EVEN IF IN LEFT HALF.
\r
3670 SIMILARY ALL REFERENCES TO SAY A+1 ARE CHAINED
\r
3672 SYMBOL TABLE FIXUP BLOCKS. THESE ARE GENERATED BY SOUT
\r
3673 AS THE SYMBOL TABLE IS PUT OUT. THESE FIXUPS ARE ADDITIVE
\r
3676 WORD 1: RH LINK TO NEXT BLOCK
\r
3678 WORD 2: RADIX50 FOR THE SYMBOL
\r
3679 WORD 3: 200000,,0 IF RH FIXUP
\r
3680 600000,,0 IF LH FIXUP
\r
3682 SOUT ALSO SETS UP FIXLNK. FIXLNK POINTS TO THE CHAIN OF
\r
3683 ALL LVAR FIXUPS TO BE DONE. IT POINTS TO THE SECOND WORD
\r
3684 \fOF A 2 WORD BLOCK
\r
3686 WORD 1: LINK TO 2ND WORD OF NEXT BLOCK 0 IF END
\r
3687 WORD 2: RH POINTER TO A HEADER BLOCK
\r
3690 FIXUPS ARE BLOCK TYPE 13 AS FOLLOWS
\r
3691 WORD 1: THE PROGRAM BREAK (AS BLOCK TYPE 5)
\r
3692 WORD 2: THE NUMBER OF LOCATION USED FOR VARIABLES IN THE
\r
3695 REMAINING WORDS COME IN PAIRS AS FOLLOWS:
\r
3696 1ST WORD BIT 0=0 RH FIXUP
\r
3698 BIT 1=0 CORE FIXUP
\r
3699 WORD 2 LH POINTER TO CHAIN
\r
3701 BIT 1=1 SYMBOL FIXUP
\r
3706 REPEAT 0,< EXPLANATION OF ICC FEATURES
\r
3708 IF FORMSW IS SET NON ZERO THE FORM OF THE OCTAL LISTING OUTPUT
\r
3709 IS CHANGED FROM STANDARD HALF WORD FORM TO THE FOLLOWING:-
\r
3711 IF INSTRUCTION BYTE 9,4,1,4,18
\r
3712 IF I/O INSTRUCTION BYTE 3,7,3,1,4,18
\r
3713 IF BYTE POINTER BYTE 6,6,2,4,18
\r
3714 IF ASCII BYTE 7,7,7,7,7
\r
3715 IF SIXBIT BYTE 6,6,6,6,6,6
\r
3717 ALL OTHERS ARE STANDARD HALF WORD
\r
3719 THIS FEATURE CAN BE OVER RIDDEN BY USE OF /H SWITCH
\r
3720 STANDARD HALF WORD FORM IS THEN USED.
\r
3721 HOWEVER BECAUSE OF EXTRA SPACING THE OUTPUT IS PUSHED MORE
\r
3722 TO THE RIGHT AND LONG COMMENTS OVERFLOW THE LINE
\r
3725 %INTEG: PUSHJ PP,GETSYM ;GET A SYMBOL
\r
3726 JRST INTG2 ;BAD SYMBOL ERROR
\r
3727 TLO IO,DEFCRS ;THIS IS A DEFINTION
\r
3728 PUSHJ PP,SSRCH ;SEE IF THERE
\r
3729 MOVSI ARG,SYMF!UNDF ;SET SYMBOL AND UNDEFINED IF NOT
\r
3730 TLNN ARG,UNDF ;IF ALREADY DEFINED
\r
3731 JRST INTG1 ;JUST IGNORE
\r
3732 TLOA ARG,VARF ;SET VARIABLE FLAG
\r
3733 INTG2: TROA ER,ERRA ;SYMBOL ERROR
\r
3734 PUSHJ PP,INSERZ ;PUT IN WITH ZERO VALUE (LENGTH OF 1)
\r
3735 INTG1: JUMPCM %INTEG
\r
3738 %ARAY: MOVEM PP,ARAYP ;SAVE PUSHDOW POINTER
\r
3739 ARAY2: PUSHJ PP,GETSYM
\r
3740 JRST ARAY1 ;BAD SYMBOL GIVE ERROR AND ABORT
\r
3741 PUSH PP,AC0 ;SAVE NAME
\r
3742 JUMPCM ARAY2 ;AND GO ON IF A COMMA
\r
3743 CAIE C,"["-40 ;MUST BE A [
\r
3745 PUSHJ PP,BYPASS ;OH, WELL
\r
3747 PUSHJ PP,EVALXQ ;GET A SIZE
\r
3748 CAIE C,"]"-40 ;MUST END RIGHT
\r
3750 PUSHJ PP,BYPASS ;??
\r
3751 HRRZ V,AC0 ;GET VALUE
\r
3753 NXTVAL: POP PP,AC0
\r
3754 PUSH PP,V ;SAVE OVER SEARCH
\r
3756 PUSHJ PP,SSRCH ;FIND IT
\r
3757 MOVSI ARG,SYMF!UNDF
\r
3758 POP PP,V ;GET VALUE BACK
\r
3762 MOVEI RC,0 ;NO RELOC
\r
3764 ARAY3: CAME PP,ARAYP
\r
3765 JRST NXTVAL ;STILL NAMES STACKED
\r
3769 ARAY1: TRO ER,ERRA ;ERROR EXIT
\r
3771 POPJ PP, ;RESET PDL AND GO
\r
3774 %LVAR: JUMP2 POPOUT ;IGNORE ON PASS2
\r
3775 PUSHJ PP,LOOKUP ;SCAN SYMBOL TABLE
\r
3776 TRNN ARG,EXTF ;THESE ARE LVARS WE HAVE DONE ONCE
\r
3777 TRNN ARG,VARF ;FOR VARIABLES
\r
3778 POPJ PP, ;IGNORE ALL OTHERS
\r
3779 TRZ ARG,UNDF ;SET AS DEFINED
\r
3782 CAML RC,SYMBOL ;GET BLOCK
\r
3784 SUBI RC,2 ;POINT TO START OF BLOCK
\r
3786 EXCH V,LVARLC ;GET CORRECT VARIABLE LOCATION
\r
3787 MOVEM V,2(RC) ;SAVE IT
\r
3788 ADDM V,LVARLC ;AND UPDATE BASE
\r
3790 SETZM 1(RC) ;NO NAME TO IDENT AN LVAR AND NO FIXUPS
\r
3791 HRL ARG,RC ;POINTER
\r
3792 TRO ARG,EXTF!PNTF ;FLAG AS EXTERNAL AND POINTER
\r
3793 MOVSM ARG,(SX) ;PUT IT AWAY
\r
3796 \f; PSEUDO-END STATEMENT FOR MULTI-FILE CAPABILITY
\r
3798 ; HERE IF PRGEND (PASS 1)
\r
3799 PSEND0: TLO IO,MFLSW ;PSEND SEEN
\r
3800 PUSHJ PP,END0 ;AS IF END STATEMENT
\r
3801 HLLZS IO ;CLEAR ER(RH)
\r
3802 SETZM ERRCNT ;CLEAR ERROR COUNT FOR EACH PROG.
\r
3803 JUMP2 PSEND2 ;DIFFERENT ON PASS2
\r
3804 SKIPE UNIVSN ;SEEN A UNIVERSAL
\r
3805 PUSHJ PP,UNISYM ;YES, STORE SYMBOLS
\r
3806 PUSHJ PP,PSEND4 ;SAVE SYMBOLS, POINTERS AND TITLE
\r
3807 TLZ IO,IOTLSN ;CLEAR TITLE SEEN FLAG
\r
3808 PSEND1: TLZ IO,MFLSW ;FOR NEXT FILE
\r
3809 SETZM UNISCH ;CLEAR UNIVERSAL SEARCH TABLE
\r
3810 MOVE AC0,[UNISCH,,UNISCH+1]
\r
3811 BLT AC0,UNISCH+.UNIV-1
\r
3812 PUSHJ PP,OUTFF ;RESET PAGE COUNT
\r
3813 MOVSI AC0,1 ;SET SO RELOC 0 WORKS
\r
3814 JRST LOC10 ;FOR RELOC 0
\r
3816 ; HERE IF PRGEND (PASS 2)
\r
3817 PSEND2: SETZM SBUF ;SO SUBTTL IS NOT WRONG
\r
3818 PUSHJ PP,PSEND5 ;PUT TITLE BACK
\r
3819 PUSHJ PP,PSEND1 ;COMMON CODE
\r
3820 JRST PASS20 ;OUTPUT THE ENTRIES
\r
3822 ; HERE IF END (PASS 1)
\r
3823 PSEND3: PUSHJ PP,PSEND4 ;SAVE LAST PROGRAM
\r
3824 HLRS PRGPTR ;REINITIALIZE POINTER
\r
3825 PUSHJ PP,PSEND5 ;READ BACK FIRST PROGRAM
\r
3827 \f;HERE TO SAVE AND RESTORE SYMBOL TABLE, TITLE AND OTHER USEFUL LOCATIONS
\r
3828 XTRA==4 ;NUMBER OF OTHER LOCATIONS TO SAVE
\r
3830 PSEND4: MOVE V,FREE ;GET NEXT FREE LOCATION
\r
3831 ADDI V,LENGTH+.TBUF/5+XTRA
\r
3832 CAML V,SYMBOL ;WILL WORST CASE FIT?
\r
3833 PUSHJ PP,XCEED ;NO, EXPAND
\r
3835 HRR V,PRGPTR ;LAST PRGEND BLOCK
\r
3836 HLRM V,(V) ;LINK THIS BLOCK
\r
3837 SKIPN PRGPTR ;IF FIRST TIME
\r
3838 HLLZM V,PRGPTR ;SET LINK TO START OF CHAIN
\r
3839 HLRM V,PRGPTR ;POINTER TO IT
\r
3840 SETZM @FREE ;CLEAR LINK WORD
\r
3841 AOS FREE ;THIS LOCATION USED NOW
\r
3842 MOVS AC0,SYMBOL ;BOTTOM OF SYMBOL TABLE
\r
3843 HRR AC0,FREE ;FREE SPACE
\r
3844 MOVE V,@SYMBOL ;GET NUMBER OF SYMBOLS
\r
3845 ASH V,1 ;TWO WORDS PER SYMBOL
\r
3846 ADDI V,1 ;ONE MORE FOR COUNT
\r
3847 ADDB V,FREE ;END OF TABLE WHEN MOVED
\r
3848 BLT AC0,(V) ;MOVE TABLE
\r
3849 HRRZ AC0,JOBREL ;TOP OF CORE
\r
3851 MOVEM AC0,SYMTOP ;FOR NEXT SYMBOL TABLE
\r
3852 SUBI AC0,LENGTH ;LENGTH OF INITIAL SYMBOLS
\r
3853 MOVEM AC0,SYMBOL ;SET POINTER TO COUNT OF SYMBOLS
\r
3854 HRLI AC0,SYMNUM ;BLT POINTER
\r
3855 BLT AC0,@SYMTOP ;SET UP INITIAL SYMBOL TABLE
\r
3856 PUSHJ PP,SRCHI ;SET UP SEARCH POINTER
\r
3857 MOVEI AC0,.TBUF ;MAX NUMBER OF CHARS. IN TITLE
\r
3858 SUB AC0,TCNT ;ACTUAL NUMBER
\r
3859 IDIVI AC0,5 ;NUMBER OF WORDS
\r
3860 SKIPE AC1 ;REMAINDER?
\r
3862 MOVEM AC0,@FREE ;STORE COUNT
\r
3863 AOS FREE ;THIS LOCATION USED NOW
\r
3864 EXCH AC0,FREE ;SET UP AC0 FOR BLT
\r
3865 ADDM AC0,FREE ;WILL BE AFTER TITLE MOVES
\r
3866 HRLI AC0,TBUF ;BLT POINTER
\r
3867 BLT AC0,@FREE ;MOVE TITLE
\r
3868 MOVE AC2,LITHDX ;POINTER TO LIT INFO.
\r
3869 MOVE AC0,-1(AC2) ;SIZE OF PASS1 LOCO
\r
3870 PUSHJ PP,STORIT ;SAVE IT IN SYMBOL TABLE
\r
3871 MOVE AC2,VARHDX ;SAME FOR VARS
\r
3875 MOVE AC0,HISNSW ;GET TWOSEG/HISEG FLAG
\r
3876 HRR AC0,HIGH1 ;AND PASS1 BREAK
\r
3878 JUMPGE AC0,PSEND6 ;NOT TWOSEG
\r
3879 MOVE AC0,SVTYP3 ;HIGH SEGMENT OFFSET
\r
3880 PUSHJ PP,STORIT ;SAVE IT ALSO>
\r
3881 PSEND6: MOVE AC0,FREE ;GET NEXT FREE LOCATION
\r
3882 SUBI AC0,1 ;LAST ONE USED
\r
3883 HRRZ V,PRGPTR ;POINTER TO START OF DATA BLOCK
\r
3884 HRLM AC0,(V) ;LINK TO END OF BLOCK
\r
3887 \fPSENDX: PUSHJ PP,XCEED ;NEED TO EXPAND CORE FIRST
\r
3888 PSEND5: HRRZ AC0,JOBREL ;GET TOP OF CORE
\r
3890 MOVEM AC0,SYMTOP ;TOP OF NEW SYMBOL TABLE
\r
3891 HRRZ V,PRGPTR ;ADDRESS OF THIS BLOCK
\r
3892 JUMPE V,PSNDER ;ERROR LINK NOT SET UP
\r
3893 MOVE AC1,(V) ;NEXT LINK
\r
3894 MOVE V,1(V) ;GET ITS SYMBOL COUNT
\r
3895 ASH V,1 ;NUMBER OF WORDS
\r
3896 ADDI V,1 ;PLUS ONE FOR COUNT
\r
3897 SUBI AC0,(V) ;START OF NEW SYMBOL TABLE
\r
3898 CAMG AC0,FREE ;WILL IT FIT
\r
3899 JRST PSENDX ;NO, NEED TO EXPAND AND RESET AC0
\r
3900 ADD V,PRGPTR ;POINT TO END OF SYMBOL TABLE
\r
3901 MOVEI V,1(V) ;THEN TO BEG OF TITLE
\r
3902 MOVEM AC0,SYMBOL ;BOTTOM OF NEW TABLE
\r
3903 HRL AC0,PRGPTR ;ADDRESS OF FIRST WORD OF BLOCK
\r
3904 ADD AC0,[1,,0] ;MAKE BLT POINTER
\r
3905 HRRM AC1,PRGPTR ;POINT TO NEXT BLOCK
\r
3906 BLT AC0,@SYMTOP ;MOVE TABLE
\r
3907 PUSHJ PP,SRCHI ;SET UP POINTER
\r
3908 MOVE AC1,(V) ;NUMBER OF WORDS OF TITLE
\r
3909 MOVEI AC0,1(V) ;START OF STORED TITLE
\r
3910 ADD V,AC1 ;INCREMENT PAST TITLE
\r
3911 ADDI AC1,TBUF-1 ;END OF TITLE
\r
3912 HRLI AC0,TBUF ;WHERE TO PUT IT
\r
3913 MOVSS AC0 ;BLT POINTER
\r
3914 BLT AC0,(AC1) ;MOVE TITLE
\r
3915 TLO IO,IOTLSN ;SET AS IF TITLE SEEN
\r
3916 MOVE AC2,LITHDX ;INVERSE OF ABOVE
\r
3919 MOVE AC2,VARHDX ;SAME FOR VARS
\r
3923 PUSHJ PP,GETIT ;GET TWO HALF WORDS
\r
3924 HRRZM AC0,HIGH1 ;PASS1 BREAK
\r
3925 HLLEM AC0,HISNSW ;TWOSEG/HISEG FLAG
\r
3926 JUMPGE AC0,CPOPJ ;NOT TWOSEG
\r
3928 MOVEM AC0,SVTYP3 ;BLOCK 3 WORD>
\r
3931 STORIT: MOVEM AC0,@FREE ;STORE IT IN DATA BLOCK
\r
3932 AOS FREE ;ADVANCE POINTER
\r
3935 GETIT: MOVE AC0,1(V) ;FILL AC0 OUT OF PRGEND BLOCK
\r
3936 AOJA V,CPOPJ ;INCREMENT AND RETURN
\r
3938 PSNDER: HRROI RC,[SIXBIT /PRGEND ERROR @/]
\r
3940 \f;MULTIPLE SYMBOL TABLE FEATURE PSEUDO-OPS
\r
3942 UNIV0: JUMP2 TITLE0 ;DO IT ALL ON PASS 1
\r
3943 HRRZ SX,UNIVNO ;GET NUMBER OF UNIVERSALS SEEN
\r
3944 CAIL SX,.UNIV ;ALLOW ONE MORE?
\r
3945 JRST UNVERR ;NO, GIVE FATAL ERROR
\r
3946 AOS UNIVNO ;ONE MORE NOW
\r
3947 SETOM UNIVSN ;AND SET SEEN A UNIVERSAL
\r
3948 JRST TITLE0 ;CONTINUE AS IF TITLE
\r
3951 ADDUNV: PUSH PP,RC ;AN AC TO USE
\r
3952 PUSHJ PP,NOUT ;CONVERT TO SIXBIT
\r
3953 HRRZ RC,UNIVNO ;GET ENTRY INDEX
\r
3954 MOVEM AC0,UNITBL(RC) ;STORE SIXBIT NAME IN TABLE
\r
3955 HRRZS UNIVSN ;ONLY DO IT ONCE
\r
3956 POP PP,RC ;RESTORE RC
\r
3957 POPJ PP, ;AND RETURN
\r
3959 UNVERR: HRROI RC,[SIXBIT /TOO MANY UNIVERSALS@/]
\r
3962 UNISYM: HRRZ AC0,FREE ;GET HIGHEST FREE LOCATION
\r
3963 MOVEM AC0,JOBFF ;INTO JOBFF
\r
3964 PUSHJ PP,SUPRSA ;TURN ON SUPPRESS BIT
\r
3965 PUSH PP,SYMBOL ;NEED TO SAVE INCASE PRGEND
\r
3966 MOVE AC0,SYMTOP ;TOP OF TABLE
\r
3967 SUB AC0,SYMBOL ;GET LENGTH OF TABLE
\r
3968 HRL ARG,SYMBOL ;BOTTOM OF TABLE
\r
3969 HRR ARG,JOBFF ;WHERE TO GO
\r
3970 HRRZ RC,UNIVNO ;GET TABLE INDEX
\r
3971 HRRM ARG,SYMBOL ;WILL BE THERE SOON
\r
3972 HRRZM ARG,UNIPTR(RC) ;STORE IN CORRESPONDING PLACE
\r
3973 ADDB AC0,JOBFF ;WHERE TO END
\r
3974 HRLM AC0,UNIPTR(RC) ;SAVE NEW SYMTOP
\r
3975 BLT ARG,@JOBFF ;MOVE TABLE
\r
3976 HRRZM AC0,UNITOP ;SAVE TOP OF TABLES+1
\r
3977 CAMLE AC0,MACSIZ ;IN CASE OVER A K BOUND
\r
3978 MOVEM AC0,MACSIZ ;DON'T REDUCE SO FAR NOW
\r
3979 MOVEM AC0,FREE ;JUST IN CASE IN MACRO
\r
3980 MOVE AC0,SRCHX ;SAVE OLD SEARCH POINTER
\r
3981 PUSHJ PP,SRCHI ;GET SEARCH POINTER
\r
3983 MOVEM AC0,UNISHX(RC) ;SAVE IT
\r
3984 SETZM UNIVSN ;CLEAR FLAG INCASE PRGEND
\r
3985 POP PP,SYMBOL ;RESTORE OLD VALUE
\r
3988 \fSERCH0: PUSHJ PP,GETSYM ;GET A SYMBOL
\r
3989 JRST ERRAX ;ERROR IF NOT VALID
\r
3990 MOVEI RC,1 ;START AT ENTRY ONE
\r
3991 CAIL RC,.UNIV ;CHECK FOR CONSISTENCY ERROR
\r
3992 JRST SCHERR ;CANNOT FIND THIS ONE
\r
3993 CAME AC0,UNITBL(RC) ;LOOK FOR MATCH
\r
3994 AOJA RC,.-3 ;NOT FOUND YET
\r
3995 MOVE AC0,RC ;STORE TABLE ENTRY NUMBER
\r
3996 MOVEI RC,1 ;START AT ENTRY ONE
\r
3997 CAIL RC,.UNIV ;CHECK FOR CONSISTENCY ERROR
\r
3998 JRST SCHERR ;SHOULD NEVER HAPPEN!!
\r
3999 SKIPE UNISCH(RC) ;LOOK FOR AN EMPTY SLOT
\r
4000 AOJA RC,.-3 ;NOT FOUND YET
\r
4001 MOVEM AC0,UNISCH(RC) ;STORE INDEX IN TABLE
\r
4002 JUMPCM SERCH0 ;LOOK FOR MORE NAMES
\r
4003 POPJ PP, ;FINISHED
\r
4005 SCHERR: MOVSI RC,[SIXBIT /CANNOT FIND UNIVERSAL@/]
\r
4006 JRST ERRFIN ;NAME IN AC0
\r
4008 ;MESSAGE FOR CASE WHERE FILES AFTER UNIVERSAL USED MORE BUFFER SPACE THAN FIRST UNIVERSAL
\r
4009 UNIERR: HRROI RC,[SIXBIT /UNIVERSAL PROGRAM(S) MUST HAVE SAME OUTPUT SPECIFICATION AS OTHER FILES@/]
\r
4011 \fSUBTTL MACRO/REPEAT HANDLERS
\r
4013 REPEA0: PUSHJ PP,EVALXQ ;EVALUATE REPEAT EXP, EXTERNS ARE ILL.
\r
4016 REPEA1: JUMPLE AC0,REPZ ;PASS THE EXP., DONT PROCESS
\r
4017 SOJE AC0,REPO ;REPEAT ONCE
\r
4018 REPEA2: PUSHJ PP,GCHARQ ;GET STARTING "<"
\r
4021 PUSHJ PP,SKELI1 ;INITIALIZE SKELETON
\r
4024 PUSH MP,REPPNT ;STACK PREVIOUS REPEAT POINTER
\r
4025 MOVEM ARG,REPPNT ;STORE NEW POINTER
\r
4026 TDZA SDEL,SDEL ;YES, INITIALIZE BRACKET COUNT AND SKIP
\r
4028 REPEA4: PUSHJ PP,WCHARQ ;WRITE A CHARACTER
\r
4029 PUSHJ PP,GCHARQ ;GET A CHARACTER
\r
4031 AOJA SDEL,REPEA4 ;YES, INCREMENT AND WRITE
\r
4033 JRST REPEA4 ;NO, WRITE THE CHARACTER
\r
4034 SOJGE SDEL,REPEA4 ;YES, WRITE IF NON-NEGATIVE COUNT
\r
4035 MOVSI CS,(BYTE (7) 177,3) ;SET "REPEAT" END
\r
4036 PUSHJ PP,WWRXE ;WRITE END
\r
4037 SKIPN LITLVL ;LITERAL MIGHT END ON LINE
\r
4038 SKIPE MACLVL ;IF IN MACRO DARE NOT PROCESS
\r
4039 JRST .+3 ;REST OF LINE SINCE MACRO MIGHT END ON IT
\r
4040 PUSHJ PP,BYPASS ;BYPASS
\r
4041 PUSHJ PP,STOUTS ;POLISH OF LINE BEFORE PROCESSING REPEAT
\r
4042 PUSH MP,MRP ;STACK PREVIOUS READ POINTER
\r
4043 PUSH MP,RCOUNT ;SAVE WORD COUNT
\r
4044 HRRZ MRP,REPPNT ;SET UP READ POINTER
\r
4045 SKIPN MACLVL ;IF IN MACRO GIVE CR-LF FIRST
\r
4046 SKIPE LITLVL ;SAME FOR LITERAL
\r
4048 AOJA MRP,POPOUT ;BYPASS ARG COUNT
\r
4050 REPEA7: HRRZ MRP,REPPNT ;SET UP READ POINTER
\r
4051 ADDI MRP,1 ;BYPASS ARG COUNT
\r
4052 REPEA8: MOVEI C,CR
\r
4055 REPEND: SOSL REPEXP
\r
4057 HRRZ V,REPPNT ;GET START OF TREE
\r
4058 PUSHJ PP,REFDEC ;DECREMENT REFERENCE
\r
4063 SKIPN LITLVL ;IF IN LITERAL OR
\r
4064 SKIPE MACLVL ;IF IN MACRO
\r
4065 JRST RSW0 ;FINISH OF LINE NOW
\r
4068 \fREPZ: MOVE SDEL,SEQNO2 ;SAVE IN CASE OF END OF FILE
\r
4073 MOVEI SDEL,0 ;SET COUNT
\r
4074 REPZ1: PUSHJ PP,GCHAR ;GET NEXT CHARACTER
\r
4076 AOJA SDEL,REPZ1 ;YES, INCREMENT COUNT
\r
4078 SOJLE SDEL,REPZ2 ;YES, EXIT IF MATCHING
\r
4079 JRST REPZ1 ;NO, RECYCLE
\r
4080 REPZ2: SETZM INREP ;FLAG OUT OF IT
\r
4081 SETZM INCND ;AND CONDITIONAL ALSO
\r
4082 JRST STMNT ;AND EXIT
\r
4084 REPO: PUSHJ PP,GCHAR ;GET "<"
\r
4087 SKIPE RPOLVL ;ARE WE NESTED?
\r
4088 AOS RPOLVL ;YES, DECREMENT CURRENT
\r
4101 \fDEFIN0: PUSHJ PP,GETSYM ;GET MACRO NAME
\r
4102 JRST ERRAX ;EXIT ON ERROR
\r
4103 MOVEM PP,PPTMP1 ;SAVE POINTER
\r
4104 MOVEM AC0,PPTMP2 ;SAVE NAME
\r
4106 MOVE SX,SEQNO2 ;SAVE IN CASE OF EOF
\r
4110 SETOM INDEF ;AND FLAG IN DEFINE
\r
4111 SYN .TEMP,COMSW ;SAVE SPACE
\r
4112 SETZB SX,COMSW ;SET ARGUMENT AND REFERENCE COUNT AND COMMENT SWITCH
\r
4113 DEF02: PUSHJ PP,GCHAR ;SEARCH FOR "(" OR "<"
\r
4114 CAIG C,FF ;SEARCH FOR END OF LINE
\r
4115 CAIGE C,LF ;LF,VT, OR FF
\r
4116 JRST .+2 ;WASN'T ANY OF THEM
\r
4117 SETZM COMSW ;RESET COMMENT SWITCH
\r
4118 CAIN C,";" ;COMMENT?
\r
4119 SETOM COMSW ;YES, SET COMMENT SWITCH
\r
4120 SKIPE COMSW ;INSIDE A COMMENT?
\r
4121 JRST DEF02 ;YES, IGNORE CHARACTER
\r
4126 DEF10: PUSHJ PP,GETSYM ;YES, GET DUMMY SYMBOL
\r
4127 TRO ER,ERRA ;FLAG ERROR
\r
4128 ADDI SX,1 ;INCREMENT ARG COUNT
\r
4129 PUSH PP,AC0 ;STACK IT
\r
4130 CAIN C,'<' ;A DEFAULT ARGUMENT COMING UP?
\r
4131 JRST DEF80 ;YES, STORE IT AWAY
\r
4133 JRST DEF10 ;NO, GET NEXT DUMMY SYMBOL
\r
4134 DEF12: PUSHJ PP,GCHAR
\r
4137 DEF20: PUSH PP,[0] ;YES, MARK THE LIST
\r
4138 LSH SX,9 ;SHIFT ARG COUNT
\r
4140 PUSHJ PP,SKELI ;INITIALIZE MACRO SKELETON
\r
4141 MOVE AC0,PPTMP2 ;GET NAME
\r
4143 PUSHJ PP,MSRCH ;SEARCH THE TABLE
\r
4144 JRST DEF24 ;NOT FOUND
\r
4145 TLNN ARG,MACF ;FOUND, IS IT A MACRO?
\r
4146 TROA ER,ERRX ;NO, FLAG ERROR AND SKIP
\r
4147 PUSHJ PP,REFDEC ;YES, DECREMENT THE REFERENCE
\r
4148 DEF24: HRRZ V,WWRXX ;GET START OF TREE
\r
4149 SKIPN .TEMP ;ANY DEFAULT ARGUMENTS TO TAKE CARE OF?
\r
4151 HRRZ C,1(V) ;GET SHIFTED ARG COUNT
\r
4152 LSH C,-9 ;GET ARG COUNT BACK
\r
4153 ADDI C,1 ;ONE MORE FOR TERMINAL ZERO
\r
4154 ADD C,.TEMP ;NUMBER OF ITEMS IN STACK
\r
4156 SUB PP,C ;BACK UP STACK
\r
4157 MOVE SDEL,.TEMP ;NUMBER OF WORDS NEEDED
\r
4158 ADDB SDEL,FREE ;FROM FREE CORE
\r
4159 CAML SDEL,SYMBOL ;MORE CORE NEEDED
\r
4160 PUSHJ PP,XCEEDS ;YES, TRY TO GET IT
\r
4161 SUB SDEL,.TEMP ;FORM POINTER
\r
4162 HRLM SDEL,1(V) ;STORE IT WITH ARG COUNT IN MACRO
\r
4163 SUBI SDEL,1 ;TO USE FOR PUSHING POINTER INTO STORAGE
\r
4164 MOVEI C,1(PP) ;POINT TO START OF STACK
\r
4165 DEF26: MOVE ARG,(C) ;GET AN ITEM OFF STACK
\r
4166 TLNN ARG,-40 ;A POINTER?
\r
4167 JUMPN ARG,[PUSH SDEL,ARG ;YES, STORE IT
\r
4168 \f AOJA C,DEF26] ;GET NEXT
\r
4169 PUSH PP,ARG ;RESTACK ARGUMENT
\r
4170 SKIPE ARG ;FINISHED IF ZERO
\r
4171 AOJA C,DEF26 ;GET NEXT
\r
4172 PUSH SDEL,ARG ;STORE ZERO IN DEFAULT LIST ALSO
\r
4173 \fDEF25: MOVSI ARG,MACF
\r
4174 MOVEM PP,PPTMP2 ;STORE TEMP STORAGE POINTER
\r
4175 PUSHJ PP,INSERT ;INSERT/UPDATE
\r
4176 TLZ IO,DEFCRS ;JUST IN CASE
\r
4177 SETZM ARGF ;NO ARGUMENT SEEN
\r
4178 SETZM SQFLG ;AND NO ' SEEN
\r
4179 TDZA SDEL,SDEL ;CLEAR BRACKET COUNT
\r
4180 DEF30: PUSHJ PP,WCHAR ;WRITE CHARACTER
\r
4181 DEF31: PUSHJ PP,GCHAR ;GET A CHARACTER
\r
4182 DEF32: MOVE CS,C ;GET A COPY
\r
4183 CAIN C,";" ;IS IT A COMMENT
\r
4184 JRST CPEEK ;YES CHECK FOR ;;
\r
4185 DEF33: CAIG CS,"Z"+40 ;CONVERT LOWER CASE
\r
4189 \f CAIGE CS,40 ;TEST FOR CONTROL CHAR.
\r
4190 JRST [SKIPN SQFLG ;HAS SINGLE QUOTE BEEN SEEN?
\r
4191 JRST DEF30 ;NO, OUTPUT THIS CHAR.
\r
4192 PUSH PP,C ;YES, SAVE CURRENT CHAR
\r
4193 MOVEI C,47 ;SET UP QUOTE
\r
4194 PUSHJ PP,WCHAR;WRITE IT
\r
4195 POP PP,C ;GET BACK CURRENT CHAR.
\r
4196 SETZM SQFLG ;RESET FLAG
\r
4197 JRST DEF30] ;AND CONTINUE
\r
4199 JRST DEF30 ;TEST FOR SPECIAL
\r
4200 MOVE CS,CSTAT-40(CS) ;GET STATUS BITS
\r
4201 \f TLNE CS,6 ;ALPHA-NUMERIC?
\r
4203 SKIPN SQFLG ;WAS A ' SEEN?
\r
4204 JRST DEF36 ;NO, PROCESH
\r
4205 PUSH PP,C ;YES, SAVE CURRENT CHARACTER
\r
4206 MOVEI C,47 ;AND PUT IN A '
\r
4207 PUSHJ PP,WCHAR ;...
\r
4208 POP PP,C ;RESTORE CURRENT CHARACTER
\r
4209 SETZM SQFLG ;AND RESET FLAG
\r
4210 DEF36: CAIE C,47 ;IS THIS A '?
\r
4212 SKIPN ARGF ;YES, WAS LAST THING SEEN AN ARG?
\r
4213 SETOM SQFLG ;IF NOT, SET SNGL QUOT FLAG
\r
4214 SETZM ARGF ;BUT NOT ARGUMENT IN ANY CASE
\r
4215 JRST DEF31 ;GO GET NEXT CHARACTER
\r
4216 \fDEF35: SETZM ARGF ;THIS IS NOT AN ARGUMENT
\r
4218 AOJA SDEL,DEF30 ;YES, INCREMENT COUNT AND WRITE
\r
4220 SOJL SDEL,DEF70 ;YES, TEST FOR END
\r
4221 JRST DEF30 ;NO, WRITE IT
\r
4223 CPEEK: TLNN IO,IOPALL ;IF LALL IS ON
\r
4224 JRST DEF33 ;JUST RETURN
\r
4225 PUSHJ PP,PEEK ;LOOK AT NEXT CHAR.
\r
4226 CAIN C,";" ;IS IT ;;?
\r
4228 MOVE C,CS ;RESTORE C
\r
4229 JRST DEF33 ;AND RETURN
\r
4231 CPEEK1: PUSHJ PP,GCHAR ;GET THE CHAR.
\r
4232 CAIE C,">" ;RETURN IF END OF MACRO
\r
4233 CAIG C,CR ;IS CHAR ONE OF
\r
4234 CAIGE C,LF ;LF,VT,FF,CR
\r
4235 JRST CPEEK1 ;NO,SO GET NEXT CHAR.
\r
4236 JRST DEF32 ;YES,RETURN AND STORE
\r
4237 \fDEF40: MOVEI AC0,0 ;CLEAR ATOM
\r
4238 MOVSI AC1,(POINT 6,AC0) ;SET POINTER
\r
4239 DEF42: PUSH PP,C ;STACK CHARACTER
\r
4240 TLNE AC1,770000 ;HAVE WE STORED 6?
\r
4241 IDPB CS,AC1 ;NO, STORE IN ATOM
\r
4242 PUSHJ PP,GCHAR ;GET NEXT CHARACTER
\r
4247 SUBI CS,40 ;CONVERT LOWER TO UPPER
\r
4250 JRST DEF44 ;TEST SPECIAL
\r
4251 MOVE CS,CSTAT-40(CS) ;GET STATUS
\r
4252 TLNE CS,6 ;ALPHA-NUMERIC?
\r
4253 JRST DEF42 ;YES, GET ANOTHER
\r
4254 DEF44: PUSH PP,[0] ;NO, MARK THE LIST
\r
4255 MOVE SX,PPTMP1 ;GET POINTER TO TOP
\r
4257 DEF46: SKIPN 1(SX) ;END OF LIST?
\r
4259 CAME AC0,1(SX) ;NO, DO THEY COMPARE?
\r
4260 AOJA SX,DEF46 ;NO, TRY AGAIN
\r
4261 SUB SX,PPTMP1 ;YES, GET DUMMY SYMBOL NUMBER
\r
4263 MOVSI CS,<(BYTE (7) 177,101)>(SX) ;SET ESCAPE CODE MACEND
\r
4266 TLO CS,1000 ;YES, SET CRESYM FLAG
\r
4267 PUSHJ PP,WWORD ;WRITE THE WORD
\r
4268 SETOM ARGF ;SET ARGUMENT SEEN FLAG
\r
4269 SETZM SQFLG ;AND IGNORE ANY ' WAITING TO GET INTO STRING
\r
4270 DEF48: MOVE PP,PPTMP2 ;RESET PUSHDOWN POINTER
\r
4271 TLO IO,IORPTC ;ECHO LAST CHARACTER
\r
4272 JRST DEF31 ;RECYCLE
\r
4275 SKIPN SQFLG ;HAVE WE SEEN A '?
\r
4277 MOVEI C,47 ;YES, PUT IT IN
\r
4278 PUSHJ PP,WCHAR ;...
\r
4279 SETZM SQFLG ;AND CLEAR FLAG
\r
4280 DEF51: MOVE C,2(SX) ;GET CHARACTER
\r
4281 JUMPE C,DEF48 ;CLEAN UP IF END
\r
4282 PUSHJ PP,WCHAR ;WRITE THE CHARACTER
\r
4283 AOJA SX,DEF51 ;GET NEXT
\r
4285 DEF70: MOVE PP,PPTMP1 ;RESTORE PUSHDOWN POINTER
\r
4286 MOVSI CS,(BYTE (7) 177,1)
\r
4287 PUSHJ PP,WWRXE ;WRITE END
\r
4288 SETZM INDEF ;OUT OF IT
\r
4290 \f; HERE TO STORE DEFAULT ARGUMENTS
\r
4292 DEF80: AOS .TEMP ;COUNT ONE MORE
\r
4293 PUSHJ PP,SKELI1 ;INITIALIZE SKELETON
\r
4294 HRL V,SX ;SYMBOL NUMBER
\r
4295 PUSH PP,V ;STORE POINTER
\r
4296 TDZA SDEL,SDEL ;ZERO BRACKET COUNT
\r
4297 DEF81: PUSHJ PP,WCHARQ ;WRITE A CHARACTER
\r
4298 PUSHJ PP,GCHARQ ;GET A CHARACTER
\r
4299 CAIN C,"<" ;ANOTHER "<"?
\r
4300 AOJA SDEL,DEF81 ;YES, INCREMENT AND WRITE
\r
4301 CAIE C,">" ;CLOSING ANGLE?
\r
4302 JRST DEF81 ;NO, JUST WRITE THE CHAR.
\r
4303 SOJGE SDEL,DEF81 ;YES, WRITE IF NOT END
\r
4304 MOVSI CS,(BYTE (7) 177,2)
\r
4305 PUSHJ PP,WWRXE ;WRITE END OF DUMMY ARGUMENT
\r
4306 PUSHJ PP,GCHAR ;READ AT NEXT CHAR.
\r
4307 CAIE C,")" ;END OF ARGUMENT LIST?
\r
4308 JRST DEF10 ;NO, GET NEXT SYMBOL
\r
4309 JRST DEF12 ;YES, LOOK FOR "<"
\r
4310 \fSUBTTL MACRO CALL PROCESSOR
\r
4311 CALLM: SKIPGE MACENL ;ARE WE TRYING TO RE-ENTER?
\r
4312 JRST ERRAX ;YES, BOMB OUT WITH ERROR
\r
4313 HRROS MACENL ;FLAG "CALLM IN PROGRESS"
\r
4315 PUSH MP,V ;STACK FOR REFDEC
\r
4317 MOVEM AC0,CALNAM ;SAVE MACRO NAME INCASE OF ERROR
\r
4318 MOVE SDEL,SEQNO2 ;SAVE IN CASE OF EOF
\r
4322 ADDI V,1 ;POINT TO DUMMY SYMBOL COUNT
\r
4323 AOS SDEL,0(V) ;INCREMENT ARG COUNT
\r
4324 HLLZM SDEL,.TEMP ;DEFAULT ARG POINTER IF NON-ZERO
\r
4325 LSHC SDEL,-^D<9+36> ;ZERO SDEL, GET ARG COUNT IN SX
\r
4327 SKIPE .TEMP ;IF AT LEAST ONE DEFAULT ARG
\r
4328 HRRM SX,.TEMP ;STORE COUNT OF ARGS
\r
4329 PUSH PP,V ;STACK FOR MRP
\r
4330 PUSH PP,RP ;STACK FOR MACPNT
\r
4331 JUMPE SX,MAC20 ;TEST FOR NO ARGS
\r
4334 TROA SDEL,-1 ;NO, FUDGE PAREN COUNT AND SKIP
\r
4336 MAC10: PUSHJ PP,GCHAR ;GET A CHARACTER, LOOK FOR AN ARG
\r
4340 JRST MAC21 ;YES, END OF ARGUMENT STRING
\r
4342 PUSHJ PP,SKELI1 ;NO, INITIALIZE SKELETON
\r
4344 JRST MAC30 ;YES, PROCESS AS SPECIAL
\r
4347 JRST MAC40 ;YES, PROCESS SYMBOL
\r
4349 MAC14: CAIN C,"," ;","?
\r
4350 JRST MAC16 ;YES; NULL SYMBOL
\r
4352 ADDI SDEL,1 ;YES, INCREMENT COUNT
\r
4354 SOJL SDEL,MAC16 ;YES, TEST FOR END
\r
4355 PUSHJ PP,WCHAR ;WRITE INTO SKELETON
\r
4356 MAC14A: PUSHJ PP,CHARAC ;GET NEXT CHARACTER
\r
4360 JRST MAC15 ;TEST FOR END OF LINE
\r
4362 JRST MAC14 ;YES, END OF LINE
\r
4364 MAC15: TLO IO,IORPTC
\r
4365 MAC16: MOVSI CS,(BYTE (7) 177,2)
\r
4366 PUSHJ PP,WWRXE ;WRITE END
\r
4370 SOJLE SX,MAC20 ;BRANCH IF NO MORE ARGS
\r
4371 JUMPGE SDEL,MAC10 ;HAVEN'T SEEN TERMINAL ")" YET
\r
4372 \fMAC20: TLZN IO,IORPTC
\r
4375 JUMPE SX,MAC21B ;NO MISSING ARGS
\r
4376 MAC21A: PUSH MP,[-1] ;FILL IN MISSING ARGS
\r
4377 SKIPN .TEMP ;ANY DEFAULT ARGS?
\r
4379 HRRZ C,.TEMP ;GET ARG COUNT
\r
4380 SUBI C,-1(SX) ;ACCOUNT FOR THOSE GIVEN
\r
4381 HRLZS C ;PUT IN LEFT HALF
\r
4382 HLRZ SDEL,.TEMP ;ADDRESS OF TABLE
\r
4383 MAC21D: SKIPN (SDEL) ;END OF LIST
\r
4385 XOR C,(SDEL) ;TEST FOR CORRECT ARG
\r
4386 TLNN C,-1 ;WAS IT?
\r
4388 XOR C,(SDEL) ;BACK THE WAY IT WAS
\r
4389 AOJA SDEL,MAC21D ;AND TRY AGAIN
\r
4391 MAC21E: MOVEM C,(MP) ;REPLACE -1 WITH TREE POINTER
\r
4392 AOS 1(C) ;INCREMENT REFERENCE
\r
4393 MAC21C: SOJG SX,MAC21A
\r
4394 MAC21B: PUSH MP,[0] ;SET TERMINAL
\r
4396 TLNN IO,IOSALL ;SUPPRESSING ALL?
\r
4398 JUMPN MRP,MAC27 ;IN MACRO?
\r
4399 CAIE C,";" ;NO,IN COMMENT?
\r
4401 MAC22: PUSHJ PP,CHARAC ;YES,GET IT INTO THE LBUF
\r
4402 CAIG C,CR ;LESS THAN CR?
\r
4403 CAIGE C,LF ;AND GREATER THAN LF?
\r
4404 JRST MAC22 ;NO GET ANOTHER
\r
4405 MAC26: HRLZI SX,70000 ;DECREMENT BYTE POINTER
\r
4410 MAC27: HRLI C,-1 ;SET FLAG
\r
4413 MAC23: MOVEI SX,"^"
\r
4414 JUMPAD MAC24 ;BRANCH IF ADDRESS FIELD
\r
4415 CAIN C,";" ;IF SEMI-COLON
\r
4416 SKIPE LITLVL ;AND NOT IN A LITERAL
\r
4417 JRST MAC24 ;NOT BOTH TRUE
\r
4418 JUMPN MRP,MAC24 ;OR IN A MACRO
\r
4419 PUSHJ PP,STOUT ;LIST COMMENT OR CR-LF
\r
4420 TLNE IO,IOPALL ;MACRO EXPANSION SUPPRESSION?
\r
4421 TLO IO,IOMAC ; NO, SET TEMP BIT
\r
4422 TDOA C,[-1] ;FLAG LAST CHARACTER
\r
4423 MAC24: DPB SX,LBUFP ;SET ^ INTO LINE BUFFER
\r
4424 MAC25: PUSH MP,MACPNT
\r
4427 PUSH MP,RCOUNT ;STACK WORD COUNT
\r
4428 PUSH MP,MRP ;STACK MACRO POINTER
\r
4429 POP PP,MRP ;SET NEW READ POINTER
\r
4432 HRRZS MACENL ;RESET "CALLM IN PROGRESS"
\r
4433 JUMPOC STMNT2 ;OP-CODE FIELD
\r
4434 JRST EVATOM ;ADDRESS FIELD
\r
4436 \fMAC30: MOVEI AC0,0 ;INITIALIZE BRACKET COUNTER
\r
4437 MAC31: PUSHJ PP,GCHAR ;GET A CHARACTER
\r
4439 ADDI AC0,1 ;YES, INCREMENT COUNT
\r
4441 SOJL AC0,MAC14A ;YES, EXIT IF MATCHING
\r
4442 PUSHJ PP,WCHAR ;WRITE INTO SKELETON
\r
4443 JRST MAC31 ;GO BACK FOR ANOTHER
\r
4445 MAC40: PUSH PP,SX ;STACK REGISTERS
\r
4447 HLLM IO,TAGINC ;SAVE IO FLAGS
\r
4448 PUSHJ PP,CELL ;GET AN ATOM
\r
4449 MOVE V,AC0 ;ASSUME NUMERIC
\r
4450 TLNE IO,NUMSW ;GOOD GUESS?
\r
4452 PUSHJ PP,SSRCH ;SEARCH THE SYMBOL TABLE
\r
4453 TROA ER,ERRX ;NOT FOUND, ERROR
\r
4454 MAC41: PUSHJ PP,MAC42 ;FORM ASCII STRING
\r
4455 HLL IO,TAGINC ;RESTORE IO FLAGS
\r
4458 TLO IO,IORPTC ;REPEAT LAST CHARACTER
\r
4459 JRST MAC14A ;RETURN TO MAIN SCAN
\r
4462 MAC44: LSHC C,-^D35
\r
4464 DIVI C,0(RX) ;DIVIDE BY CURRENT RADIX
\r
4466 JUMPE C,.+2 ;TEST FOR END
\r
4469 ADDI C,"0" ;FORM TEXT
\r
4470 JRST WCHAR ;WRITE INTO SKELETON
\r
4471 \fMACEN0: SOS MACENL
\r
4472 MACEND: SKIPGE C,MACENL ;TEST "CALLM IN PROGRESS"
\r
4473 AOS MACENL ;INCREMENT END LEVEL AND EXIT
\r
4476 POP MP,MRP ;RETRIEVE READ POINTER
\r
4477 POP MP,RCOUNT ;AND WORD COUNT
\r
4479 SKIPL 0(MP) ;TEST FLAG
\r
4480 PUSHJ PP,RSW2 ;MARK END OF SUBSTITUTION
\r
4483 SKIPA MP,MACPNT ;RESET MP AND SKIP
\r
4484 MACEN1: PUSHJ PP,REFDEC ;DECREMENT REFERENCE
\r
4485 MACEN2: AOS V,MACPNT ;GET POINTER
\r
4487 JUMPG V,MACEN1 ;IF >0, DECREMENT REFERENCE
\r
4488 JUMPL V,MACEN2 ;IF <0, BYPASS
\r
4489 POP MP,V ;IF=0, RETRIEVE POINTER
\r
4490 PUSHJ PP,REFDEC ;DECREMENT REFERENCE
\r
4494 SKIPN MACENL ;CHECK UNPROCESSED END LEVEL
\r
4495 JRST MACEN3 ;NONE TO PROCESS
\r
4496 TRNN MRP,-1 ;MRP AT END OF TEXT
\r
4497 JRST MACEN0 ;THEN POP THE MACRO STACK NOW
\r
4498 MACEN3: TRNN C,77400 ;SALL FLAG?
\r
4499 HRLI C,0 ;YES,TURN IT OFF
\r
4500 JUMPL C,REPEA8 ;IF FLAG SET SUBSTITUTE
\r
4502 \fIRP0: SKIPN MACLVL ;ARE WE IN A MACRO?
\r
4503 JRST ERRAX ;NO, BOMB OUT
\r
4504 IRP10: PUSHJ PP,MREADS ;YES, GET DATA SPEC
\r
4505 CAIE C,40 ;SKIP LEADING BLANKS
\r
4507 JRST IRP10 ;YES, BYPASS
\r
4510 CAIE C,177 ;NO, IS IT SPECIAL?
\r
4511 JRST ERRAX ;NO, ERROR
\r
4512 PUSHJ PP,MREADS ;YES
\r
4513 TRZN C,100 ;CREATED?
\r
4515 CAIL C,40 ;TOO BIG?
\r
4517 ADD C,MACPNT ;NO, FORM POINTER TO STACK
\r
4518 PUSH MP,IRPCF ;STACK PREVIOUS POINTERS
\r
4527 MOVEM AC0,IRPCF ;IRPC FLAG FOUND IN AC0
\r
4528 SETOM IRPSW ;RESET IRP SWITCH
\r
4534 JRST .-2 ;NO, SEARCH UNTIL FOUND
\r
4535 PUSHJ PP,SKELI1 ;INITIALIZE NEW STRING
\r
4536 MOVEM ARG,IRPPOI ;SET NEW POINTER
\r
4538 TDZA SDEL,SDEL ;ZERO BRACKET COUNT AND SKIP
\r
4539 IRP20: PUSHJ PP,WCHAR1
\r
4542 AOJA SDEL,IRP20 ;YES, INCREMENT COUNT AND WRITE
\r
4544 JRST IRP20 ;NO, JUST WRITE IT
\r
4545 SOJGE SDEL,IRP20 ;YES, WRITE IF NOT MATCHING
\r
4546 MOVE CS,[BYTE (7) 15,177,4]
\r
4547 PUSHJ PP,WWRXE ;WRITE END
\r
4548 PUSH MP,MRP ;STACK PREVIOUS READ POINTER
\r
4549 PUSH MP,RCOUNT ;AND WORD COUNT
\r
4551 JRST IRPPOP ;EXIT IF NOT VALID ARGUMENT
\r
4552 MOVEI C,1(CS) ;INITIALIZE POINTER
\r
4554 \fIRPSET: EXCH MRP,IRPARG ;SWAP READ POINTERS
\r
4555 MOVE SX,RCOUNT ;SWAP COUNT OF WORDS TO READ
\r
4558 PUSHJ PP,SKELI1 ;INITIALIZE SKELETON FOR DATA
\r
4559 HRRZM ARG,@IRPARP ;STORE NEW DS POINTER
\r
4560 SETZB SX,SDEL ;ZERO FOUND FLAG AND BRACKET COUNT
\r
4561 LDB C,MRP ;GET LAST CHAR
\r
4563 SKIPE IRPCF ;IN IRPC
\r
4565 MOVEI SX,1 ;FORCE ARGUMENT
\r
4566 IRPSE1: PUSHJ PP,MREADS
\r
4567 CAIE C,177 ;SPECIAL?
\r
4568 AOJA SX,IRPSE2 ;NO, FLAG AS FOUND
\r
4569 PUSHJ PP,PEEKM ;LOOK AT NEXT CHARACTER
\r
4570 SETZM IRPSW ;SET IRP SWITCH
\r
4571 JUMPG SX,IRPSE4 ;IF ARG FOUND, PROCESS IT
\r
4572 JRST IRPPOP ;NO, CLEAN UP AND EXIT
\r
4574 IRPSE2: SKIPE IRPCF ;IRPC?
\r
4575 JRST IRPSE3 ;YES, WRITE IT
\r
4576 CAIN C,"," ;NO, IS IT A COMMA?
\r
4577 JUMPE SDEL,IRPSE4 ;YES, EXIT IF NOT NESTED
\r
4579 ADDI SDEL,1 ;YES, INCREMENT COUNT
\r
4581 SUBI SDEL,1 ;YES, DECREMENT COUNT
\r
4583 IRPSE3: PUSHJ PP,WCHAR
\r
4584 SKIPN IRPCF ;IRPC?
\r
4585 JRST IRPSE1 ;NO, GET NEXT CHARACTER
\r
4587 IRPSE4: MOVSI CS,(BYTE (7) 177,2)
\r
4588 PUSHJ PP,WWRXE ;WRITE END
\r
4589 MOVEM MRP,IRPARG ;SAVE POINTER
\r
4590 MOVE MRP,RCOUNT ;SAVE COUNT
\r
4592 HRRZ MRP,IRPPOI ;SET FOR NEW SCAN
\r
4593 AOJA MRP,REPEA8 ;ON ARG COUNT
\r
4594 \fSTOPI0: SKIPN IRPARP ;IRP IN PROGRESS?
\r
4595 JRST ERRAX ;NO, ERROR
\r
4596 SETZM IRPSW ;YES, SET SWITCH
\r
4599 IRPEND: MOVE V,@IRPARP
\r
4601 SKIPE IRPSW ;MORE TO COME?
\r
4604 IRPPOP: MOVE V,IRPPOI
\r
4605 PUSHJ PP,REFDEC ;DECREMENT REFERENCE
\r
4607 POP MP,MRP ;RESTORE CELLS
\r
4616 \fGETDS: ;GET DUMMY SYMBOL NUMBER
\r
4617 MOVE CS,C ;USE CS FOR WORK REGISTER
\r
4619 ADD CS,MACPNT ;ADD BASE ADDRESS
\r
4620 MOVE V,0(CS) ;GET POINTER FLAG
\r
4621 JUMPG V,GETDS1 ;BRANCH IF POINTER
\r
4622 TRNN C,40 ;NOT POINTER, SHOULD WE CREATE?
\r
4623 JRST RSW0 ;NO, FORGET THIS ARG
\r
4625 PUSH PP,MWP ;STACK MACRO WRITE POINTER
\r
4626 PUSH PP,WCOUNT ;SAVE WORD COUNT
\r
4627 PUSHJ PP,SKELI1 ;INITIALIZE SKELETON
\r
4628 MOVEM ARG,0(CS) ;STORE POINTER
\r
4629 MOVE CS,[BYTE (7) 0,170,170,170,171] ;CREATE A SYMBOL
\r
4630 ADD CS,LSTSYM ;LSTSYM= # OF LAST CREATED
\r
4631 TDZ CS,[BYTE (7) 0,170,170,170,170]
\r
4633 IOR CS,[ASCII /.0000/]
\r
4636 PUSHJ PP,WWORD ;WRITE INTO SKELETON
\r
4637 MOVSI CS,(BYTE (7) 177,2)
\r
4638 PUSHJ PP,WWRXE ;WRITE END CODE
\r
4639 POP PP,WCOUNT ;RESTORE WORD COUNT
\r
4640 POP PP,MWP ;RESTORE MACRO WRITE POINTER
\r
4642 MOVE V,ARG ;SET UP FOR REFINC
\r
4644 GETDS1: PUSHJ PP,REFINC ;INCREMENT REFERENCE
\r
4645 HRL V,RCOUNT ;SAVE WORD COUNT
\r
4646 PUSH MP,V ;STACK V FOR DECREMENT
\r
4647 PUSH MP,MRP ;STACK READ POINTER
\r
4648 MOVEI MRP,1(V) ;FORM READ POINTER
\r
4653 HLREM V,RCOUNT ;RESTORE WORD COUNT
\r
4654 HRRZS V ;CLEAR COUNT
\r
4655 PUSHJ PP,REFDEC ;DECREMENT REFERENCE
\r
4657 \fSKELI1: MOVEI ARG,1 ;ENTRY FOR SINGLE ARG
\r
4658 SKELI: SETZ MWP, ;SIGNAL FIRST TIME THROUGH
\r
4659 PUSHJ PP,SKELWL ;GET POINTER WORD
\r
4660 HRRZM MWP,WWRXX ;SAVE FIRST ADDRESS
\r
4661 HRRZM MWP,LADR ;SAVE START OF LINKED LIST
\r
4662 HRRZM ARG,1(MWP) ;STORE COUNT
\r
4663 SOS WCOUNT ;ACCOUNT FOR WORD
\r
4664 HRRZ ARG,WWRXX ;SET FIRST ADDRESS
\r
4665 ADDI MWP,2 ;BUMP POINTER
\r
4666 HRLI MWP,(POINT 7) ;SET FOR 5 ASCII BYTES
\r
4667 ;SKELW RETURNS WITH ADR OF NEXT FREE LOC IN V (RIGHT)
\r
4669 SKELW: SOSLE WCOUNT ;STILL SOME SPACE IN LEAF?
\r
4670 POPJ PP, ;YES, RETURN
\r
4671 SKELWL: SKIPE V,NEXT ;GET FIRST FREE ADDRESS
\r
4672 JRST SKELW1 ;IF NON-ZERO, UPDATE FREE
\r
4673 MOVE V,FREE ;GET FREE
\r
4674 ADDI V,.LEAF ;INCREMENT BY LEAF SIZE
\r
4675 CAML V,SYMBOL ;OVERFLOW?
\r
4676 PUSHJ PP,XCEED ;YES, BOMB OUT
\r
4677 EXCH V,FREE ;UPDATE FREE
\r
4678 SETZM (V) ;CLEAR LINK
\r
4680 SKELW1: HLL V,0(V) ;GET ADDRESS
\r
4681 HLRM V,NEXT ;UPDATE NEXT
\r
4682 SKIPE MWP ;IF FIRST TIME
\r
4683 HRLM V,1-.LEAF(MWP) ;STORE LINK IN FIRST WORD OF LEAF
\r
4684 MOVEI MWP,.LEAF ;SIZE OF LEAF
\r
4685 MOVEM MWP,WCOUNT ;STORE FOR COUNT DOWN
\r
4686 MOVEI MWP,(V) ;SET UP WRITE POINTER
\r
4687 TLO MWP,(POINT 7,,21) ;2 ASCII CHARS
\r
4690 ;WWRXX POINTS TO END OF TREE
\r
4691 ;MWP IDPB POINTER TO NEXT HOLE
\r
4692 ;NEXT FIRST OF A LINKED PORTION THAT IS NOT BEING USED (LEAVES)
\r
4693 ;FREE POINTS TO FREE CORE BETWEEN TREE AND SYM-TABLE
\r
4694 ;LADR POINTS TO BEG OF LINKED PORTION.
\r
4695 \fGCHARQ: JUMPN MRP,MREADS ;IF GETTING CHAR. FROM TREE
\r
4696 GCHAR: PUSHJ PP,CHARAC ;GET ASCII CHARACTER
\r
4697 CAIG C,FF ;TEST FOR LF, VT OR FF
\r
4700 JRST OUTIM1 ;YES, LIST IT
\r
4704 WCHAR1: TLNN MWP,760000 ;END OF WORD?
\r
4705 PUSHJ PP,SKELW ;YES, GET ANOTHER
\r
4706 IDPB C,MWP ;STORE CHARACTER
\r
4709 WWORD: LSHC C,7 ;MOVE ASCII INTO C
\r
4710 PUSHJ PP,WCHAR1 ;STORE IT
\r
4711 JUMPN CS,WWORD ;TEST FOR END
\r
4712 POPJ PP, ;YES, EXIT
\r
4714 WWRXE: PUSHJ PP,WWORD ;WRITE LAST WORD
\r
4715 ADD MWP,WCOUNT ;GET TO END OF LEAF
\r
4716 SUBI MWP,.LEAF ;NOW POINT TO START OF IT
\r
4717 HRRZS (MWP) ;ZERO LEFT HALF OF LAST LEAF
\r
4718 HRRM MWP,@WWRXX ;SET POINTER TO END
\r
4720 \fMREAD: PUSHJ PP,MREADS ;READ ONE CHARACTER
\r
4721 CAIE C,177 ;SPECIAL?
\r
4722 JRST RSW1 ;NO, EXIT
\r
4723 PUSHJ PP,MREADS ;YES, GET CODE WORD
\r
4724 TRZE C,100 ;SYMBOL?
\r
4726 CAILE C,4 ;POSSIBLY ILLEGAL
\r
4728 HRRI MRP,0 ;NO, SIGNAL END OF TEXT
\r
4731 JRST MACEND ;1; END OF MACRO
\r
4732 JRST DSEND ;2; END OF DUMMY SYMBOL
\r
4733 JRST REPEND ;3; END OF REPEAT
\r
4734 JRST IRPEND ;4; END OF IRP
\r
4736 MREADI: HRLI MRP,700 ;SET UP BYTE POINTER
\r
4737 MOVEI C,.LEAF-1 ;NUMBER OF WORDS
\r
4739 MREADS: TLNN MRP,-1 ;FIRST TIME HERE?
\r
4740 JRST MREADI ;YES, SET UP MRP AND RCOUNT
\r
4741 TLNN MRP,760000 ;HAVE WE FINISHED WORD?
\r
4742 SOSLE RCOUNT ;YES, STILL ROOM IN LEAF?
\r
4743 JRST MREADC ;STILL CHAR. IN LEAF
\r
4744 HLRZ MRP,1-.LEAF(MRP);YES, GET LINK
\r
4745 HRLI MRP,(POINT 7,,21) ;SET POINTER
\r
4746 MOVEI C,.LEAF ;RESET COUNT
\r
4748 MREADC: ILDB C,MRP ;GET CHARACTER
\r
4751 PEEK: JUMPN MRP,PEEKM ;THIS IS A MACRO READ
\r
4752 PUSHJ PP,CHARAC ;READ AN ASCII CHAR.
\r
4753 TLO IO,IORPTC ;REPEAT FOR NEXT
\r
4754 POPJ PP, ;AND RETURN
\r
4756 PEEKM: PUSH PP,MRP ;SAVE MACRO READ POINTER
\r
4757 PUSH PP,RCOUNT ;SAVE WORD COUNT
\r
4758 PUSHJ PP,MREADS ;READ IN A CHAR.
\r
4759 POP PP,RCOUNT ;RESTORE WORD COUNT
\r
4760 POP PP,MRP ;RESET READ POINTER
\r
4761 POPJ PP, ;IORPTC IS NOT SET
\r
4762 \fREFINC: MOVEI CS,1(V) ;GET POINTER TO TREE
\r
4763 AOS 0(CS) ;INCREMENT REFERENCE
\r
4766 REFDEC: JUMPLE V,DECERR ;CATASTROPHIC ERROR SOMEWHERE
\r
4767 MOVEI CS,1(V) ;GET POINTER TO TREE
\r
4768 SOS CS,0(CS) ;DECREMENT REFERENCE
\r
4769 TRNE CS,000777 ;IS IT ZERO?
\r
4770 POPJ PP, ;NO, EXIT
\r
4771 HRRZ CS,0(V) ;YES, GET POINTER TO END
\r
4772 HRL CS,NEXT ;GET POINTER TO NEXT RE-USABLE
\r
4773 HLLM CS,0(CS) ;SET LINK
\r
4774 HRRM V,NEXT ;RESET NEXT
\r
4777 DECERR: MOVE AC0,CALNAM ;GET MACRO NAME
\r
4778 MOVSI RC,[SIXBIT /ERROR WHILE EXPANDING@/]
\r
4780 JRST ERRNE2 ;COMMON MESSAGE
\r
4781 \fA== 0 ;ASCII MODE
\r
4782 AL== 1 ;ASCII LINE MODE
\r
4783 IB== 13 ;IMAGE BINARY MODE
\r
4784 B== 14 ;BINARY MODE
\r
4785 IFE RUNSW,<DMP==16 ;DUMP MODE>
\r
4787 CTL== 0 ;CONTROL DEVICE NUMBER
\r
4788 IFN CCLSW,<CTL2==4 ;INPUT DEV FOR CCL FILE>
\r
4789 BIN== 1 ;BINARY DEVICE NUMBER
\r
4790 CHAR== 2 ;INPUT DEVICE NUMBER
\r
4791 LST== 3 ;LISTING DEVICE NUMBER
\r
4793 ; COMMAND STRING ACCUMULATORS
\r
4797 ACEXT== 3 ;EXTENSION
\r
4799 ACDEL== 4 ;DELIMITER
\r
4800 ACPNTR==5 ;BYTE POINTER
\r
4808 DIRBIT==4 ;DIRECTORY DEVICE
\r
4812 DISBIT==2000 ;DISPLAY
\r
4813 CONBIT==20000 ;CONTROLING TTY
\r
4814 LPTBIT==40000 ;LPT
\r
4815 DSKBIT==200000 ;DSK
\r
4817 ;GETSTS ERROR BITS
\r
4819 IOIMPM==400000 ;IMPROPER MODE (WRITE LOCK)
\r
4820 IODERR==200000 ;DEVICE DATA ERROR
\r
4821 IODTER==100000 ;CHECKSUM OR PARITY ERROR
\r
4822 IOBKTL== 40000 ;BLOCK TOO LARGE
\r
4823 ERRBIT==IOIMPM!IODERR!IODTER!IOBKTL
\r
4826 \fSUBTTL I/O ROUTINES
\r
4828 IFN CCLSW,<TLZA IO,ARPGSW ;DON'T ALLOW RAPID PROGRAM GENERATION
\r
4829 TLO IO,ARPGSW ;ALLOW RAPID PROGRAM GENERATION>
\r
4831 MOVE MRP,[XWD LOWL,LOWL+1] ;START OF DATA
\r
4832 SETZM LOWL ;ZERO FIRST WORD
\r
4833 BLT MRP,LOWEND ;AND THE REST
\r
4834 MOVE MRP,[XWD LOWH,LOWL] ;PHASED CODE
\r
4835 BLT MRP,LOWL+LENLOW ;MOVE IT IN>
\r
4836 HRRZ MRP,JOBREL ;GET LOWSEG SIZE
\r
4837 MOVEM MRP,MACSIZ ;SAVE CORE SIZE
\r
4838 ;DECODE VERSION NUMBER
\r
4839 MOVEI PP,JOBFFI ;TEMP PUSH DOWN STACK
\r
4840 PUSH PP,[0] ;MARK BOTTOM OF STACK
\r
4841 LDB 0,[POINT 3,JOBVER,2] ;GET USER BITS
\r
4842 JUMPE 0,GETE ;NOT SET IF ZERO
\r
4843 ADDI 0,"0" ;FORM NUMBER
\r
4844 PUSH PP,0 ;STACK IT
\r
4845 MOVEI 0,"-" ;SEPARATE BY HYPHEN
\r
4846 PUSH PP,0 ;STACK IT ALSO
\r
4847 GETE: HRRZ 0,JOBVER ;GET EDIT NUMBER
\r
4848 JUMPE 0,GETU ;SKIP ALL THIS IF ZERO
\r
4849 MOVEI 1,")" ;ENCLOSE IN PARENS.
\r
4851 GETED: IDIVI 0,8 ;GET OCTAL DIGITS
\r
4852 ADDI 1,"0" ;MAKE ASCII
\r
4853 PUSH PP,1 ;STACK IT
\r
4854 JUMPN 0,GETED ;LOOP TIL DONE
\r
4855 MOVEI 0,"(" ;OTHER PAREN.
\r
4857 GETU: LDB 0,[POINT 6,JOBVER,17] ;UPDATE NUMBER
\r
4858 JUMPE 0,GETV ;SKIP IF ZERO
\r
4859 IDIVI 0,8 ;MIGHT BE TWO DIGITS
\r
4860 ADDI 1,"@" ;FORM ALPHA
\r
4862 JUMPN 0,GETU+1 ;LOOP IF NOT DONE
\r
4863 GETV: LDB 0,[POINT 9,JOBVER,11] ;GET VERSION NUMBER
\r
4864 IDIVI 0,8 ;GET DIGIT
\r
4865 ADDI 1,"0" ;TO ASCII
\r
4867 JUMPN 0,GETV+1 ;LOOP
\r
4868 MOVE 1,[POINT 7,VBUF+1,13] ;POINTER TO DEPOSIT IN VBUF
\r
4869 POP PP,0 ;GET CHARACTER
\r
4870 IDPB 0,1 ;DEPOSIT IT
\r
4871 JUMPN 0,.-2 ;KEEP GOING IF NOT ZERO
\r
4872 IFN FORMSW,<IFE DFRMSW,<
\r
4873 SETOM PHWFMT ;HALF WORD UNLESS CHANGED BY SWITCH>>
\r
4875 TLZA IO,CRPGSW ;SET TO INIT NEW COMMAND FILE
\r
4876 M: TLNN IO,CRPGSW ;CURRENTLY DOING RPG?>
\r
4878 RESET ;INITIALIZE PROGRAM
\r
4879 SETZM BINDEV ;CLEAR INCASE NOT USED NEXT TIME
\r
4880 SETZM LSTDEV ;SAME REASON
\r
4881 SETZM INDEV ;INCASE OF ERROR
\r
4882 HRRZ MRP,MACSIZ ;GET INITIAL SIZE
\r
4883 CORE MRP, ;BACK TO ORIGINAL SIZ4
\r
4884 JFCL ;SHOULD NEVER FAIL
\r
4886 MOVE [XWD PASS1I,PASS1I+1]
\r
4887 BLT PASS2X-1 ;ZERO THE PASS1 AND PASS2 VARIABLES
\r
4888 MOVEI PP,JOBFFI ;SET TEMP PUSH-DOWN POINTER
\r
4889 MOVE CS,[POINT 7,DBUF,6] ;INITIALIZE FOR DATE
\r
4890 MSTIME 2, ;GET TIME FROM MONITOR
\r
4891 PUSHJ PP,TIMOUT ;TIME FORMAT OUTPUT
\r
4893 IBP CS ;PASS OVER PRESET SPACE
\r
4894 PUSHJ PP,DATOUT ;DATE FORMAT OUTPUT
\r
4895 MOVSI FR,P1!CREFSW
\r
4896 IFN CCLSW,<TLNE IO,CRPGSW ;RPG IN PROGRESS?
\r
4897 JRST GOSET ;YES, GO READ NEXT COMMAND
\r
4898 TLNE IO,ARPGSW ;NO, RPG ALLOWED?
\r
4899 JRST RPGSET ;YES, GO TRY
\r
4900 CTLSET: RELEASE CTL2, ;IN CASE OF LOOKUP FAILURE>
\r
4901 IFE CCLSW,<CTLSET:>
\r
4902 MOVSI IO,IOPALL ;ZERO FLAGS
\r
4903 INIT CTL,AL ;INITIALIZE USER CONSOLE
\r
4906 EXIT ;NO TTY, NO ASSEMBLY
\r
4907 MOVSI C,(SIXBIT /TTY/)
\r
4908 DEVCHR C, ;GET CHARACTERISTICS
\r
4909 TLNN C,10 ;IS IT REALLY A TTY
\r
4911 INBUF CTL,1 ;INITIALIZE SINGLE CONTROL
\r
4912 OUTBUF CTL,1 ;BUFFERS
\r
4913 PUSHJ PP,CRLF ;OUTPUT CARRIAGE RETURN - LINE FEED
\r
4918 \fIFN CCLSW,<JRST BINSET ;BEGIN WITH BINARY FILE
\r
4921 IFN TEMP,<HRRZ 3,JOBFF ;GET START OF BUFFER AREA
\r
4922 HRRZ 0,JOBREL ;GET TOP OF CORE
\r
4923 CAIGE 0,200(3) ;WILL BUFFER FIT?
\r
4924 JRST [ADDI 0,200 ;NO, GET ENUF CORE
\r
4926 JRST XCEED2 ;FAILED, SO GIVE UP
\r
4927 JRST .+1] ;CONTINUE
\r
4928 HRRM 3,TMPFIL+1 ;STORE IN TMPCOR UUO IOWD
\r
4929 SOS TMPFIL+1 ;MAKE IT THE PROPER IOWD FORMAT
\r
4930 HRRM 3,CTLBLK+1 ;DUMMY UP BUFFER HEADER
\r
4931 MOVE 0,[XWD 2,TMPFIL] ;SET UP FOR TEMP CORE READ
\r
4932 TMPCOR ;READ AND DELETE FILE "MAC"
\r
4933 JRST RPGTMP ;NO SUCH FILE IN CORE TRY DISK
\r
4934 ADD 3,0 ;CALCULATE END OF BUFFER
\r
4935 MOVEM 3,JOBFF ;FIX JOBFF SO FILE WONT BE KILLED
\r
4936 IMULI 0,5 ;CALCULATE CHARACTER COUNT
\r
4937 ADDI 0,1 ;SINCE SOSG HAPPENS AFTER NOT BEFORE
\r
4938 MOVEM 0,CTLBLK+2 ;SET UP CHAR CNT IN BUFFER HEADER
\r
4939 MOVEI 0,440700 ;SET UP BYTE POINTER IN HEADER
\r
4940 HRLM 0,CTLBLK+1 ;BUFFER HEADER NOW SET UP
\r
4941 SETOM TMPFLG ;MARK THAT A TMPCOR UUO WAS DONE
\r
4942 JRST RPGS2A ;CONTINUE IN MAIN STREAM
\r
4943 RPGTMP: SETZM TMPFLG ;JUST IN CASE>
\r
4944 INIT CTL2,AL ;LOOK FOR DISK
\r
4947 JRST CTLSET ;DSK NOT THERE
\r
4950 HRLZI 3,(SIXBIT /MAC/) ;###MAC
\r
4952 PJOB AC1, ;RETURNS JOB NO. TO AC1
\r
4953 RPGLUP: IDIVI AC1,12 ;CONVERT
\r
4954 ADDI AC2,"0"-40 ;SIXBITIZE IT
\r
4956 SOJG 0,RPGLUP ;3 TIMES
\r
4957 MOVEM 3,CTLBUF ;###MAC
\r
4958 HRLZI (SIXBIT /TMP/) ;
\r
4965 MOVEM CTLBUF+1 ;TMP
\r
4966 SETZM CTLBUF+3 ;PROG-PRO
\r
4967 LOOKUP CTL2,CTLBUF ;COMMAND FILE
\r
4968 JRST CTLSET ;NOT THERE
\r
4969 HLRM EXTMP ;SAVE THE EXTENSION
\r
4971 RPGS2: INBUF CTL2,1 ;SINGLE BUFFERED
\r
4972 RPGS2A: INIT CTL,AL ;TTY FOR CONSOLE MESSAGES
\r
4975 EXIT ;NO TTY, NO ASSEMBLY
\r
4976 OUTBUF CTL,1 ;SINGLE BUFFERED
\r
4977 MOVE JOBFF ;REMEMBER WHERE BINARY BUFFERS BEGIN
\r
4979 HRRZ JOBREL ;TOP OF CORE
\r
4980 CAMLE MACSIZ ;SEE IF IT HAS GROWN
\r
4981 MOVEM MACSIZ ;PREVENTS ADDRESS CHECK ON EXIT
\r
4982 TLNE IO,CRPGSW ;ARE WE ALREADY IN RPG MODE?
\r
4983 JRST M ;MUST HAVE COME FROM @ COMMAND, RESET
\r
4985 \fGOSET: MOVSI IO,IOPALL!CRPGSW ;SET INITIAL FLAGS
\r
4986 MOVEI CS,CTLSIZ ;MAXIMUM CHARS IN A LINE
\r
4987 MOVE AC1,CTLBLK+2 ;NUMBER OF CHARACTERS
\r
4988 MOVEM AC1,CTIBUF+2 ;SAVE FOR PASS 2
\r
4989 MOVE AC1,[POINT 7,CTLBUF] ;WHERE TO STASH CHARS
\r
4990 MOVEM AC1,CTIBUF+1 ;...
\r
4991 GOSET1: SOSG CTLBLK+2 ;ANY MORE CHARS?
\r
4992 PUSHJ PP,[IFN TEMP,<SKIPE TMPFLG ;TMPCOR UUO IN PROGRESS?
\r
4994 IN CTL2, ;READ ANOTHER BUFFERFUL
\r
4995 POPJ PP, ;EVERYTHING OK, RETURN
\r
4996 STATO CTL2,20000 ;EOF?
\r
4997 JRST [HRROI RC,[SIXBIT /ERROR READING COMMAND FILE@/]
\r
4998 JRST ERRFIN] ;GO COMPLAIN
\r
4999 PUSHJ PP,DELETE ;CMD FILE
\r
5000 EXIT] ;EOF AND FINISHED
\r
5001 ILDB C,CTLBLK+1 ;GET NEXT CHAR
\r
5002 MOVE RC,@CTLBLK+1 ;CHECK FOR SEQUENCE NUMBERS
\r
5004 JRST [AOS CTLBLK+1 ;SKIP OVER ANOTHER 5 CHARS
\r
5006 ADDM RC,CTLBLK+2 ;...
\r
5007 JRST GOSET1 ] ;GO READ ANOTHER CHAR
\r
5008 JUMPE C,GOSET1 ;IGNORE NULLS
\r
5009 IDPB C,CTIBUF+1 ;STASH AWAY
\r
5010 AOS CTIBUF+2 ;INCREMENT CHAR. COUNT
\r
5011 CAIE C,12 ;LINE FEED OR
\r
5012 CAIN C,175 ;ALTMODE?
\r
5013 JRST GOSET2 ;YES, FINISHED WITH COMMAND
\r
5016 JRST GOSET2 ;ALTMODE.
\r
5017 SOJG CS,GOSET1 ;GO READ ANOTHER
\r
5018 HRROI RC,[SIXBIT /COMMAND LINE TOO LONG@/]
\r
5019 JRST ERRFIN ;GO COMPLAIN
\r
5020 GOSET2: MOVEI C,12 ;MAKE SURE THERE'S A LF
\r
5021 IDPB C,CTIBUF+1 ;...
\r
5022 MOVEM AC1,CTIBUF+1 ;SET POINTER TO BEGINNING
\r
5023 AOS CTIBUF+2 ;ADD I TO COUNT
\r
5024 MOVE SAVFF ;RESET JOBFF FOR NEW BINARY
\r
5028 RPGS1: PUSHJ PP,DELETE ;DELETE COMMAND FILE
\r
5029 MOVEM ACDEV,RPGDEV ;GET SET TO INIT
\r
5030 OPEN CTL2,RPGINI ;DO IT
\r
5032 MOVEM ACFILE,INDIR ;USE INPUT BLOCK
\r
5033 MOVEM ACPPN,INDIR+3 ;SET PPN
\r
5034 MOVEM ACEXT,INDIR+1
\r
5036 JRST [JUMPN ACEXT,RPGLOS ;GIVE UP ,EXPLICIT EXTENSION
\r
5037 IFE STANSW,< MOVSI ACEXT,(SIXBIT /CCL/) ;IF BLANK TRY CCL>
\r
5038 IFN STANSW,< MOVSI ACEXT,(SIXBIT /RPG/) ;IF BLANK TRY RPG>
\r
5040 HLRM ACEXT,EXTMP ;SAVE THE EXTENSION
\r
5041 HLRZ JOBSA ;RESET JOBFF TO ORIGINAL
\r
5043 TLO IO,CRPGSW ;TURN ON SWITCH SO WE RESET WORLD
\r
5044 JRST RPGS2 ;AND GO
\r
5045 RPGLOS: RELEAS CTL2,0
\r
5046 TLZ IO,CRPGSW ;STOPS IO TO UNASGD CHAN
\r
5047 JRST ERRCF ;NO FILE FOUND
\r
5049 \fBINSET: PUSHJ PP,NAME1 ;GET FIRST NAME
\r
5050 IFN CCLSW,<CAIN C,"!" ;WAS THIS AN IMPERATIVE?
\r
5051 JRST NUNSET ;GET THEE TO A NUNNERY
\r
5052 CAIN C,"@" ;CHEK FOR A NEW RPG FILE
\r
5054 TLNN FR,CREFSW ;CROSS REF REQUESTED?
\r
5055 JRST LSTSE1 ;YES, SKIP BINARY
\r
5056 CAIN C,"," ;COMMA?
\r
5057 JUMPE ACDEV,LSTSET ;YES, SKIP BINARY IF NO DEVICE SPECIFIED
\r
5058 CAIN C,"_" ;LEFT ARROW?
\r
5059 JUMPE ACDEV,LSTSE1 ;YES, SKIP BINARY IF NO DEVICE SPECIFIED
\r
5060 JUMPE ACDEV,M ;IGNORE IF JUST <CR-LF>
\r
5061 TLO FR,PNCHSW ;OK, SET SWITCH
\r
5062 MOVEM ACDEV,BINDEV ;STORE DEVICE NAME
\r
5063 MOVEM ACFILE,BINDIR ;STORE FILE NAME IN DIRECTORY
\r
5064 JUMPN ACEXT,.+2 ;EXTENSION SPECIFIED?
\r
5065 MOVSI ACEXT,(SIXBIT /REL/) ;NO, ASSUME RELOCATABLE BINARY
\r
5066 MOVEM ACEXT,BINDIR+1 ;STORE IN DIRECTORY
\r
5067 MOVEM ACPPN,BINDIR+3 ;SET PPN
\r
5068 OPEN BIN,BININI ;INITIALIZE BINARY
\r
5070 TLZE TIO,TIOLE ;SKIP TO EOT
\r
5072 TLZE TIO,TIORW ;REWIND REQUESTED?
\r
5074 JUMPGE CS,BINSE2 ;BRANCH IF NO BACK-SPACE
\r
5075 MTAPE BIN,17 ;BACK-SPACE A FILE
\r
5076 AOJL CS,.-1 ;TEST FOR END
\r
5078 STATO BIN,1B24 ;LOAD POINT?
\r
5079 MTAPE BIN,16 ;NO, GO FORWARD ONE
\r
5080 BINSE2: SOJG CS,.-1 ;TEST FORWARD SPACING
\r
5082 TLNE TIO,TIOCLD ;DIRECTORY CLEAR REQUESTED?
\r
5083 UTPCLR BIN, ;YES, CLEAR IT
\r
5084 OUTBUF BIN,2 ;SET UP TWO RING BUFFER
\r
5086 JRST GETSET ;NO LISTING
\r
5087 \fLSTSET: PUSHJ PP,NAME1 ;GET NEXT DEVICE
\r
5088 LSTSE1: CAIE C,"_"
\r
5090 TLNE FR,CREFSW ;CROSS-REF REQUESTED?
\r
5091 JRST LSTSE2 ;NO, BRANCH
\r
5092 JUMPN ACDEV,.+2 ;YES, WAS DEVICE SPECIFIED?
\r
5093 MOVSI ACDEV,(SIXBIT /DSK/) ;NO, ASSUME DSK
\r
5095 MOVE ACFILE,[SIXBIT /CREF/]
\r
5097 IFE STANSW,<MOVSI ACEXT,(SIXBIT /CRF/) >
\r
5098 IFN STANSW,<MOVSI ACEXT,'LST'>
\r
5099 LSTSE2: JUMPE ACDEV,GETSET ;FORGET LISTING IF NO DEVICE SPECIFIED
\r
5101 DEVCHR AC0, ;GET CHARACTERISTICS
\r
5102 TLNE AC0,LPTBIT!DISBIT!TTYBIT
\r
5103 TLNE FR,CREFSW ; WAS CROSS-REF REQUESTED?
\r
5104 AOSA OUTSW+0*TTYSW ;NO, ASSUME TTY
\r
5105 JRST ERRCM ;YES, ERROR - CREF DEV MUST NOT BE LPT, DIS, OR TTY
\r
5106 TLNE AC0,CONBIT ;CONTROLING TELETYPE LISTING?
\r
5107 JRST GETSET ;YES, BUFFER ALREADY SET
\r
5108 MOVEM ACDEV,LSTDEV ;STORE DEVICE NAME
\r
5109 AOS OUTSW+0*LPTSW ;SET FOR LPT
\r
5110 MOVEM ACFILE,LSTDIR ;STORE FILE NAME
\r
5112 MOVSI ACEXT,(SIXBIT /LST/)
\r
5113 MOVEM ACEXT,LSTDIR+1
\r
5114 MOVEM ACPPN,LSTDIR+3 ;SET PPN
\r
5115 OPEN LST,LSTINI ;INITIALIZE LISTING OUTPUT
\r
5119 TLZE TIO,TIORW ;REWIND REQUESTED?
\r
5127 LSTSE3: SOJG CS,.-1
\r
5128 TLNE TIO,TIOCLD ;DIRECTORY CLEAR REQUESTED?
\r
5129 UTPCLR LST, ;YES, CLEAR IT
\r
5130 OUTBUF LST,2 ;SET UP A TWO RING BUFFER
\r
5131 \fGETSET: MOVEI 3,PDPERR
\r
5132 HRRM 3,JOBAPR ;SET TRAP LOCATION
\r
5133 MOVEI 3,1B19 ;SET FOR PUSH-DOWN OVERFLOW
\r
5135 SOS 3,PDP ;GET PDP REQUEST MINUS 1
\r
5136 IMULI 3,.PDP ;COMPUTE SIZE (50*<NUMBER OF /P'S +1>)
\r
5138 HRR MP,JOBFF ;SET BASIC POINTER
\r
5141 MOVEM PP,RP ;SET RP
\r
5143 ASH 3,1 ;DOUBLE SIZE OF BASIC POINTER
\r
5145 SUBM PP,3 ;COMPUTE TOP LOCATION
\r
5146 SKIPN UNITOP ;IF ANY UNIVERSALS HAVE BEEN SEEN
\r
5148 HRRZS 3 ;GET TOP OF BUFFERS AND STACKS
\r
5149 CAMLE 3,UNISIZ ;HOPE ITS NOT BIGGER THAN UNIVERSAL ONE
\r
5150 JRST UNIERR ;IT WAS, YOU LOSE
\r
5151 SKIPA 3,UNITOP ;DON'T LOSE THEM
\r
5152 GETSE0: HRRZM 3,UNISIZ ;STORE UNTIL A UNIVERSAL IS SEEN
\r
5153 HRRZM 3,LADR ;SET START OF MACRO TREE
\r
5156 GETSE1: HRRZ JOBREL
\r
5158 MOVEM SYMTOP ;SET TOP OF SYMBOL TABLE
\r
5159 SUBI LENGTH ;SET POINTER FOR INITIAL SYMBOLS
\r
5160 CAMLE LADR ;HAVE WE ROOM?
\r
5163 HRRZ 2,JOBREL ;NO, TRY FOR MORE CORE
\r
5166 JRST XCEED2 ;NO MORE, INFORM USER
\r
5167 JRST GETSE1 ;TRY AGAIN
\r
5169 GETSE2: MOVEM SYMBOL ;SET START OF SYMBOL TABLE
\r
5171 BLT @SYMTOP ;STORE SYMBOLS
\r
5172 PUSHJ PP,SRCHI ;INITIALIZE TABLE
\r
5173 MOVE [XWD CTIBUF+1,CTLSAV] ;SAVE CONTROL INPUT BUFFER
\r
5174 BLT CTLS1 ;FOR RESCAN ON PASS 2
\r
5175 IFN FTDISK,<MOVSI (SIXBIT /DSK/) ;SET INPUT TO TAKE DSK AS DEV
\r
5177 PUSHJ PP,COUTI ;INIT OUTPUT JUST IN CASE
\r
5178 PUSHJ PP,INSET ;GET FIRST INPUT FILE
\r
5180 IFN CCLSW,<TLNE IO,CRPGSW ;BUT ONLY IF DOING RPG
\r
5181 TTCALL 3,[ASCIZ /MACRO: /] ;PUBLISH COMPILER NAME>
\r
5182 MOVE CS,INDIR ;SET UP NAME OF FIRST FILE
\r
5183 MOVEM CS,LSTFIL ;AS LAST PRINTED
\r
5185 JRST ASSEMB ;START ASSEMBLY
\r
5186 \fFINIS: CLOSE BIN, ;DUMP BUFFER
\r
5187 TLNE FR,PNCHSW ;PUNCH REQUESTED?
\r
5188 PUSHJ PP,TSTBIN ;YES, TEST FOR ERRORS
\r
5191 SOSLE OUTSW+0*LPTSW ;LPT TYPE OUTPUT?
\r
5192 PUSHJ PP,TSTLST ;YES, TEST FOR ERRORS
\r
5195 OUTPUT CTL,0 ;FLUSH TTY OUTPUT
\r
5196 SKIPE UNIVSN ;SKIP IF NOT ASSEMBLING UNIVERSAL
\r
5197 PUSHJ PP,UNISYM ;STORE SYMBOLS ETC. FIRST
\r
5198 JRST M ;RETURN FOR NEXT ASSEMBLY
\r
5199 \fINSET: MOVEI JOBFFI ;POINTER TO INPUT BUFFER
\r
5200 HRRM JOBFF ;INFORM SYSTEM OF BUFFER AREA
\r
5201 PUSHJ PP,NAME2 ;GET NEXT COMMAND NAME
\r
5202 JUMPE ACDEV,ERRNE ;ERROR IF NONE LEFT
\r
5203 MOVEM ACDEV,INDEV ;STORE DEVICE
\r
5204 MOVEM ACFILE,INDIR ;STORE FILE IN DIRECTORY
\r
5205 MOVEM ACPPN,INDIR+3 ;STORE PPN BEFORE WE LOSE IT
\r
5208 DEVCHR ACDEV, ;TEST CHARACTERISTICS
\r
5209 TLNN ACDEV,MTABIT ;MAG TAPE?
\r
5211 TLZN FR,MTAPSW ;FIRST MAG TAPE IN PASS 2?
\r
5213 TLNN TIO,TIORW ;YES, REWIND REQUESTED?
\r
5214 SUB CS,RECCNT ;NO, PREPARE TO BACK-SPACE TAPE
\r
5215 INSET1: AOS RECCNT ;INCREMENT FILE COUNTER
\r
5216 ADDM CS,RECCNT ;UPDATE COUNT
\r
5219 TLZE TIO,TIORW ;REWIND?
\r
5228 INSET2: SOJGE CS,.-1
\r
5230 INSET3: INBUF CHAR,1
\r
5231 MOVEI ACPNTR,JOBFFI
\r
5233 SUBI ACPNTR,JOBFFI
\r
5234 MOVEI ACDEL,NUMBUF*203+1
\r
5236 INBUF CHAR,(ACDEL)
\r
5237 JUMPN ACEXT,INSET4 ;TAKE USER'S EXTENSION IF NON-BLANK
\r
5238 MOVSI ACEXT,(SIXBIT /MAC/) ;BLANK, TRY .MAC FIRST
\r
5240 INSET4: PUSHJ PP,INSETI
\r
5241 JUMPE ACEXT,ERRCF ;ERROR IF ZERO
\r
5242 TLNE ACDEV,TTYBIT ;TELETYPE?
\r
5243 SETSTS CHAR,AL ;YES, CHANGE TO ASCII LINE
\r
5244 \f ;DO ALL ENTERS HERE FOR LEVEL D
\r
5245 SKIPE ENTERS ;HAVE ENTERS BEEN DONE ALREADY?
\r
5246 JRST ENTRDN ;YES, DON'T DO TWICE
\r
5247 SKIPN ACEXT,LSTDEV ;IS THERE A LIST DEVICE?
\r
5248 JRST LSTSE5 ;NO SO DON'T DO ENTER
\r
5249 SKIPN ACFILE,LSTDIR ;GET FILE NAME INCASE OF ERROR
\r
5250 JRST [DEVCHR ACEXT,
\r
5251 TLNE ACEXT,DIRBIT ;DOES IT HAVE A DIRECTORY?
\r
5252 JRST LSTSE4 ;YES, GIVE UP BEFORE HARM IS DONE
\r
5253 SKIPE ACFILE,INDIR ;USE INPUT FILE NAME
\r
5254 MOVEM ACFILE,LSTDIR ;TOO BAD IF ZERO ALSO
\r
5256 HLLZ ACEXT,LSTDIR+1 ;EXT ALSO
\r
5257 MOVE ACPPN,LSTDIR+3 ;SAVE PPN
\r
5258 LOOKUP LST,LSTDIR ;PREVIOUS ONE STILL THERE
\r
5260 SETZM LSTDIR ;YES,CLEAR NAME
\r
5261 MOVEM ACPPN,LSTDIR+3 ;RESET PPN
\r
5263 CLOSE LST, ;IGNORE FAILURE
\r
5264 MOVEM ACFILE,LSTDIR ;RESTORE NAME
\r
5265 HLLZS LSTDIR+1 ;BH 11/19/74 FOR DATE75. CLEAR RH.
\r
5266 SETZM LSTDIR+2 ;CLEAR PROTECTION AND DATE
\r
5267 MOVEM ACPPN,LSTDIR+3 ;SET PPN AGAIN
\r
5270 MOVSI ACEXT,400000
\r
5271 MOVEM ACEXT,LSTDIR+2 ;SET DUMP NEVER BIT.
\r
5273 ENTER LST,LSTDIR ;SET UP DIRECTORY
\r
5275 LSTSE5: SKIPN ACEXT,BINDEV ;A BINARY DEVICE THEN ?
\r
5277 SKIPN ACFILE,BINDIR ;INCASE OF ERROR
\r
5278 JRST [DEVCHR ACEXT,
\r
5279 TLNE ACEXT,DIRBIT ;DOES IT HAVE A DIRECTORY?
\r
5280 JRST .+1 ;YES, GIVE UP BEFORE HARM IS DONE
\r
5281 SKIPE ACFILE,INDIR ;USE INPUT FILE NAME
\r
5282 MOVEM ACFILE,BINDIR ;TOO BAD IF ZERO ALSO
\r
5285 MOVSI ACEXT,400000
\r
5286 MOVEM ACEXT,BINDIR+2
\r
5288 HLLZS ACEXT,BINDIR+1 ;BH 11/19/74 DATE75. WAS HLLZ.
\r
5289 ENTER BIN,BINDIR ;ENTER FILE NAME
\r
5292 ENTRDN: SETOM ENTERS ;MAKE SURE ONLY DONE ONCE
\r
5293 MOVE CS,[POINT 7,DEVBUF]
\r
5294 PUSH PP,1 ;SAVE THE ACCS
\r
5297 SKIPN 2,INDIR ;GET INPUT NAME
\r
5298 JRST FINDEV ;FINISHED WITH DEVICE
\r
5299 SETZ 1, ;CLEAR FOR RECEIVING
\r
5300 LSHC 1,6 ;SHIFT ONE CHAR. IN
\r
5301 ADDI 1,40 ;FORM ASCII
\r
5302 IDPB 1,CS ;STORE CHAR.
\r
5303 JUMPN 2,.-4 ;MORE TO DO?
\r
5304 MOVEI 1," " ;SEPARATE BY TAB
\r
5306 HLLZ 2,INDIR+1 ;GET EXT
\r
5307 JUMPE 2,FINEXT ;NO EXT
\r
5309 LSHC 1,6 ;SAME LOOP AS ABOVE
\r
5313 FINEXT: MOVEI 1," "
\r
5314 IDPB 1,CS ;SEPARATE BY TAB
\r
5315 LDB 1,[POINT 12,INDIR+2,35] ;GET DATE
\r
5316 LDB 2,[POINT 3,INDIR+1,20] ;BH 11/19/74 DATE75.
\r
5317 DPB 2,[POINT 3,1,23] ;BH 11/19/74 DATE75.
\r
5318 JUMPE 1,FINDEV ;NO DATE?
\r
5319 PUSHJ PP,DATOUT ;STORE IT
\r
5320 LDB 2,[POINT 11,INDIR+2,23] ;GET CREATION TIME
\r
5321 JUMPE 2,FINDEV ;NO TIME (DECTAPE)
\r
5322 MOVEI 1," " ;SEPARATE BY SPACE
\r
5324 PUSHJ PP,TIMOU1 ;STORE TIME
\r
5326 MOVEI 2," " ;FINAL TAB
\r
5328 IDPB 1,CS ;TERMINATE FOR NOW
\r
5329 POP PP,3 ;RESTORE ACCS
\r
5332 SKIPN PAGENO ;IF FIRST TIME THRU
\r
5333 JRST OUTFF ;START NEW PAGE
\r
5334 SETZM PAGENO ;ON NEW FILE, RESET PAGES
\r
5335 JRST OUTFF2 ;DON'T START NEW PAGE UNLESS FF
\r
5337 INSETI: HLLZM ACEXT,INDIR+1 ;STORE EXTENSION
\r
5338 MOVE ACPPN,INDIR+3 ;SAVE PPN
\r
5340 SKIPA ACEXT,INDIR+1 ;GET ERROR CODE
\r
5341 JRST CPOPJ1 ;SKIP-RETURN IF FOUND
\r
5342 TRNE ACEXT,-1 ;ERROR CODE OF 0 IS FILE NOT FOUND
\r
5343 JRST ERRCF ;FILE THERE BUT NOT READABLE
\r
5344 SETZ ACEXT, ;CLEAR EXT AND TRY AGAIN
\r
5345 MOVEM ACPPN,INDIR+3 ;RESTORE PPN
\r
5347 \fREC2: MOVS [XWD CTIBUF+1,CTLSAV] ;RESCAN CONTROL (FROM PASS1 END STMNT)
\r
5348 BLT CTIBUF+2 ;INPUT BUFFER
\r
5350 HRLM ACDELX ;FUDGE PREVIOUS DELIMITER
\r
5351 IFN RENTSW,<MOVE HHIGH ;GET HI-SEG BREAK
\r
5352 MOVEM HIGH1 ;SAVE THE ONE WE GOT ON PASS1 (FOR HISEG)>
\r
5354 MOVE [XWD PASS2I,PASS2I+1]
\r
5355 BLT PASS2X-1 ;ZERO PASS2 VARIABLES
\r
5356 TLO FR,MTAPSW!LOADSW ;SET FLAGS
\r
5358 GOTEND: MOVE INDEV ;GET LAST DEVICE
\r
5359 DEVCHR ;GET ITS CHARACTERISTICS
\r
5360 TLNE 4 ;TEST FOR DIRECTORY (DSK OR DTA)
\r
5361 JRST EOT ;YES, SO DON'T WASTE TIME
\r
5362 JRST .+3 ;NO, INPUT BUFFER BY BUFFER
\r
5364 JRST .-1 ;NO ERRORS
\r
5365 STATO CHAR,1B22 ;TEST FOR EOF
\r
5366 JRST .-3 ;IGNORE ERRORS
\r
5368 EOT: PUSHJ PP,SAVEXS ;SAVE REGISTERS
\r
5369 PUSHJ PP,INSET ;GET THE NEXT INPUT DEVICE
\r
5370 HRROI RC,[SIXBIT /END OF PASS 1@/] ;ASSUME END OF PASS
\r
5371 TLZN FR,LOADSW ;ZERO ONLY ON END OF PASS 1
\r
5372 HRROI RC,[SIXBIT /LOAD THE NEXT FILE@/] ;NOT END OF PASS
\r
5373 TLNN ACDEV,(1B13!1B15) ;WAS ALL THAT WORK NECESSARY?
\r
5374 PUSHJ PP,TYPMSG ;YES
\r
5376 RSTRXS: MOVSI RC,SAVBLK ;SET POINTER
\r
5377 BLT RC,RC-1 ;RESTORE REGISTERS
\r
5378 MOVE RC,SAVERC ;RESTORE RC
\r
5381 SAVEXS: MOVEM RC,SAVERC ;SAVE RC
\r
5382 MOVEI RC,SAVBLK ;SET POINTER
\r
5383 BLT RC,SAVBLK+RC-1 ;BLT ALL REGISTERS BELOW RC
\r
5385 \fNAME1: SETZM ACDEVX ;ENTRY FOR DESTINATION
\r
5386 NAME2: SETZB ACDEV,INDIR+2 ;ENTRY FOR SOURCE
\r
5387 MOVEI ACFILE,0 ;CLEAR FILE
\r
5388 HLRZ ACDEL,ACDELX ;GET PREVIOUS DELIMITER
\r
5390 SETZB ACEXT,INDIR+3 ;RESET EXTENSION AND PROGRAM-NUMBER PAIR
\r
5391 SETZM PPN ;CLEAR PPN
\r
5392 NAME3: MOVSI ACPNTR,(POINT 6,AC0) ;SET POINTER
\r
5393 TDZA AC0,AC0 ;CLEAR SYMBOL
\r
5395 SLASH: PUSHJ PP,SW0
\r
5396 GETIOC: PUSHJ PP,TTYIN ;GET INPUT CHARACTER
\r
5405 IFN CCLSW,<CAIE C,"!" ;IS CHAR AN IMPERATIVE?
\r
5407 JRST TERM ;YES, GO DO IT>
\r
5408 CAIE C,33 ;CHECK FOR THREE FLAVORS OF ALT-MODE
\r
5411 CAIG C,CR ;LESS THAN CR?
\r
5412 CAIGE C,LF ;AND GREATER THAN LF?
\r
5413 CAIN C,175 ;OR 3RD ALTMOD
\r
5415 IFN FTDISK,<CAIN C,"["
\r
5416 JRST PROGNP ;GET PROGRAMER NUMBER PAIR>
\r
5417 CAIN C,"=" ;EQUALS IS SAME AS LEFT ARROW
\r
5418 TRCA C,142 ;SO MAKE IT A "_" AND SKIP
\r
5422 CAIGE C,40 ;VALID AS SIXBIT?
\r
5423 JRST [CAIN C,"Z"-100 ;NO,IS IT ^Z
\r
5424 EXIT ;YES,EXIT FOR BATCH
\r
5425 JRST GETIOC] ;JUST IGNORE
\r
5426 SUBI C,40 ;CONVERT TO 6-BIT
\r
5427 TLNE ACPNTR,770000 ;HAVE WE STORED SIX BYTES?
\r
5428 IDPB C,ACPNTR ;NO, STORE IT
\r
5429 JRST GETIOC ;GET NEXT CHARACTER
\r
5431 DEVICE: JUMPN ACDEV,ERRCM ;ERROR IF ALREADY SET
\r
5432 MOVE ACDEV,AC0 ;DEVICE NAME
\r
5433 JRST DEVNAM ;COMMON CODE
\r
5435 NAME: JUMPN ACFILE,ERRCM ;ERROR IF ALREADY SET
\r
5436 MOVE ACFILE,AC0 ;FILE NAME
\r
5437 DEVNAM: MOVE ACDEL,C ;SET DELIMITER
\r
5438 JRST NAME3 ;GET NEXT SYMBOL
\r
5440 TERM: JUMPE ACDEL,TERM1 ;IF NO PREVIOUS TERMINATOR, THEN FILENAME
\r
5441 CAIN ACDEL,"_" ;...
\r
5443 CAIE ACDEL,":" ;IF PREVIOUS DELIMITER
\r
5444 CAIN ACDEL,"," ;WAS COLON OR COMMA
\r
5445 TERM1: MOVE ACFILE,AC0 ;SET FILE
\r
5446 CAIN ACDEL,"." ;IF PERIOD,
\r
5447 HLLZ ACEXT,AC0 ;SET EXTENSION
\r
5448 HRLM C,ACDELX ;SAVE PREVIOUS DELIMITER
\r
5449 JUMPN ACDEV,.+2 ;IF DEVICE SET USE IT
\r
5450 SKIPA ACDEV,ACDEVX ;OTHERWISE USE LAST DEVICE
\r
5451 MOVEM ACDEV,ACDEVX ;AND DEVICE
\r
5452 MOVE ACPPN,PPN ;PUT PPN IN RIGHT PLACE
\r
5453 IFN FTDISK,<CAIN C,"!" ;IMPERATIVE?
\r
5454 POPJ PP, ;YES, DON'T ASSUME DEV
\r
5455 JUMPE ACFILE,CPOPJ ;IF THERE IS A FILE,
\r
5456 JUMPN ACDEV,.+2 ;BUT NO DEVICE
\r
5457 MOVSI ACDEV,(SIXBIT /DSK/) ;THEN ASSUME DISK>
\r
5459 \fERRCM: HRROI RC,[SIXBIT /COMMAND ERROR@/]
\r
5462 IFN FTDISK,<PROGNP:
\r
5463 PROGN1: HRLZM RC,PPN ;COMMA, STORE LEFT HALF
\r
5464 PROGN2: MOVEI RC,0 ;CLEAR AC
\r
5465 PROGN3: PUSHJ PP,TTYIN
\r
5467 JRST PROGN1 ;STORE LEFT HALF
\r
5468 HRRM RC,PPN ;ASSUME TERMINAL
\r
5470 JRST GETIOC ;YES, RETURN TO MAIN SCAN
\r
5472 CAIL C,"0" ;CHECK FOR VALID NUMBERS
\r
5474 JRST ERRCM ;NOT VALID
\r
5475 LSH RC,3 ;SHIFT PREVIOUS RESULT
\r
5476 ADDI RC,-"0"(C) ;ADD IN NEW NUMBER>
\r
5477 IFN STANSW,<LSH RC,6 ;SHIFT PREVIOUS RESULT
\r
5478 ADDI RC,-40(C) ;PUT IN NEW CHARACTER>
\r
5479 JRST PROGN3 ;GET NEXT CHARACTER>
\r
5480 \fSWITC0: PUSHJ PP,SW1 ;PROCESS CHARACTER
\r
5481 SWITCH: PUSHJ PP,TTYIN ;GET NEXT CHARACTER
\r
5482 CAIE C,")" ;END OF STRING?
\r
5486 SW0: PUSHJ PP,TTYIN
\r
5487 SW1: MOVEI C,-"A"(C) ;CONVERT FROM ASCII TO NUMERIC
\r
5488 CAILE C,"Z"-"A" ;WITHIN BOUNDS? (IS IT ALPHA?)
\r
5489 JRST ERRCM ;NO, ERROR
\r
5490 MOVE RC,[POINT 4,BYTAB]
\r
5492 SOJGE C,.-1 ;MOVE TO PROPER BYTE
\r
5493 LDB C,RC ;PICK UP BYTE
\r
5494 JUMPE C,ERRCM ;TEST FOR VALID SWITCH
\r
5495 CAIG C,SWTABT-SWTAB ;LEGAL ON SOURCE?
\r
5496 JUMPL PP,ERRCM ;NO, TEST FOR SOURCE
\r
5497 LDB RC,[POINT 4,SWTAB-1(C),12]
\r
5499 SKIPN CTLSAV ;IF PASS2 OR IO SWITCH,
\r
5500 XCT SWTAB-1(C) ;EXECUTE INSTRUCTION
\r
5502 TLZ IO,IOSALL ;TAKE CARE OF /X
\r
5505 DEFINE HELP (TEXT)<
\r
5512 /A advance one file
\r
5513 /B backspace one file
\r
5514 /C produce a cref listing
\r
5515 /E list macro expansions (LALL)
\r
5516 /F list in new format (.MFRMT)
\r
5517 /G list in old format (.HWFRMT)
\r
5519 /L reinstate listing (LIST)
\r
5520 /M suppress ascii in macro and repeat expansion (SALL)
\r
5521 /N suppress error printout on tty
\r
5522 /O set MLOFF pseudo-op
\r
5523 /P increase size of the pushdown stack
\r
5524 /Q suppress Q errors on the listing
\r
5525 /S suppress listing (XLIST)
\r
5527 /X suppress all macro expansions (XALL)
\r
5528 /Z zero the directory
\r
5529 Switches A,B,C,T,W,X, and Z must immediately follow
\r
5530 the device or file to which they refer.
\r
5532 \f DEFINE SETSW (LETTER,INSTRUCTION) < INSTRUCTION
\r
5533 J= <"LETTER"-"A">-^D9*<I=<"LETTER"-"A">/^D9>
\r
5536 DEFINE SETCOD (I,J)
\r
5537 <BYTAB'I=BYTAB'I!<.-SWTAB>B<4*J+3>>
\r
5539 BYTAB0= 0 ;INITIALIZE TABLE
\r
5544 SETSW Z,<TLO TIO,TIOCLD >
\r
5545 SETSW C,<TLZ FR,CREFSW >
\r
5546 SETSW P,<SOS PDP >
\r
5547 SWTABT: ;THE ABOVE SW'S ARE LEGAL ON OUTPUT ONLY
\r
5548 SETSW A,<ADDI CS,1 >
\r
5549 SETSW B,<SUBI CS,1 >
\r
5550 SETSW E,<TLZ IO,IOPALL!IOSALL >
\r
5551 IFN FORMSW,< SETSW F,<SETZM HWFMT>
\r
5552 SETSW G,<SETOM HWFMT>>
\r
5553 SETSW H,<OUTSTR HLPMES>
\r
5554 SETSW L,<TLZ IO,IOMSTR >
\r
5555 SETSW M,<TLO IO,IOPALL!IOSALL >
\r
5556 SETSW N,<HLLOS TYPERR >
\r
5557 SETSW O,<XCT OFFML >
\r
5558 SETSW Q,<TLO FR,ERRQSW >
\r
5559 SETSW S,<TLO IO,IOMSTR >
\r
5560 SETSW T,<TLO TIO,TIOLE >
\r
5561 SETSW W,<TLO TIO,TIORW >
\r
5562 SETSW X,<TLOA IO,IOPALL >
\r
5564 BYTAB: ;BYTAB CONTAINS AN INDEX TO SWTAB
\r
5565 ;IT CONSIST OF 9 4BIT BYTES/WORD
\r
5566 ;OR ONE BYTE FOR EACH LETTER
\r
5568 +BYTAB0 ;A-I BYTE = 1 THROUGH 17 = INDEX
\r
5569 +BYTAB1 ;J-R BYTE = 0 = COMMAND ERROR
\r
5572 IF2,<PURGE I,J,BYTAB0,BYTAB1,BYTAB2>
\r
5573 \fTTYIN: SOSGE CTIBUF+2 ;ENUF CHAR.?
\r
5575 ILDB C,CTIBUF+1 ;GET CHARACTER
\r
5576 CAIE C," " ;SKIP BLANKS
\r
5577 CAIN C,HT ;AND TABS
\r
5580 SETZM CTIBUF+2 ;YES,IGNORE REST OF LINE
\r
5581 CAIG C,"Z"+40 ;CHECK FOR LOWER CASE
\r
5585 POPJ PP, ;YES, EXIT
\r
5587 TTYERR: SKIPN INDEV ;INPUT DEVICE SEEN?
\r
5588 JRST ERRCM ;NO, SO MISSING "_"
\r
5589 ERRNE: HRROI RC,[SIXBIT /?NO END STATEMENT ENCOUNTERED ON INPUT FILE@/]
\r
5590 ERRNE0: SKPINC V ;SEE IF WE CAN INPUT A CHAR.
\r
5591 JFCL ;BUT ONLY TO DEFEAT ^O
\r
5592 PUSHJ PP,TYPMSG ;OUTPUT IT
\r
5593 SKIPE LITLVL ;SEE IF IN LITERAL
\r
5594 SKIPN LITPG ;PAGE 0 MEANS NOT IN A LITERAL REALY
\r
5595 JRST ERRNE1 ;NO, TRY OTHERS
\r
5596 MOVE V,[XWD [SIXBIT /IN LITERAL@/],LITPG]
\r
5597 PUSHJ PP,PRNUM ;GO PRINT INFORMATION
\r
5598 ERRNE1: MOVEI V,0 ;CHECK FOR OTHER PLACES
\r
5600 MOVE V,[XWD [SIXBIT /IN DEFINE@/],DEFPG]
\r
5602 MOVE V,[XWD [SIXBIT /IN TEXT@/],TXTPG]
\r
5604 MOVE V,[XWD [SIXBIT /IN CONDITIONAL OR REPEAT@/],REPPG]
\r
5606 MOVE V,[XWD [SIXBIT /IN CONDITIONAL@/],CNDPG]
\r
5608 ERRNE2: MOVE V,[XWD [SIXBIT /IN MACRO CALL@/],CALPG]
\r
5610 SKIPN LITLVL ;HAD ONE PAGE NUMBER ALREADY
\r
5611 SKIPA V,[XWD [SIXBIT /@/],PAGENO] ;BETTER THAN NOTHING
\r
5613 ERRNE3: PUSHJ PP,PRNUM
\r
5614 HRROI RC,[SIXBIT /@/] ;WILL GET A RETURN
\r
5617 ERRMS1: SIXBIT / ERRORS DETECTED@/
\r
5618 ERRMS2: SIXBIT /?1 ERROR DETECTED@/
\r
5619 ERRMS3: SIXBIT /NO ERRORS DETECTED@/
\r
5620 EINIT: MOVE RC,[XWD ACDEV,[SIXBIT /NOT AVAILABLE@/]]
\r
5622 \fERRCL: HRRZ RC,LSTDIR+1 ;GET LST DEV ERROR CODE
\r
5623 JRST .+2 ;GET ERROR MESSAGE
\r
5624 ERRCB: HRRZ RC,BINDIR+1 ;GET BIN DEV ERROR CODE
\r
5626 SOJA RC,ERRTYP ;SPECIAL CASE IF ERROR CODE 0
\r
5628 ERRCF: HRRZ RC,INDIR+1 ;GET INPUT DEV ERROR CODE
\r
5629 HLLZ ACEXT,INDIR+1 ;SET UP EXT
\r
5631 ERRTYP: CAIL RC,TABLND-TABLE ;IS ERROR CODE LEGAL?
\r
5632 SKIPA RC,TABLND ;NO, GIVE CATCH ALL MESSAGE
\r
5633 MOVE RC,TABLE(RC) ;YES, PICK UP MESSAGE
\r
5635 ERRFIN: SKPINC C ;SEE IN WE CAN INPUT A CHAR.
\r
5636 JFCL ;BUT ONLY TO DEFEAT ^O
\r
5641 CLOSE LST, ;GIVE USER A PARTIAL LISTING
\r
5642 CLOSE BIN,40 ;BUT NEVER A BUM REL FILE
\r
5643 IFN CCLSW,<AOS JOBERR ;RECORD ERROR SO EXECUTION DELETED>
\r
5646 [SIXBIT /(0) ILLEGAL FILE NAME@/],,ACFILE
\r
5647 TABLE: [SIXBIT /(0) FILE WAS NOT FOUND@/],,ACFILE
\r
5648 [SIXBIT /(1) NO DIRECTORY FOR PROJECT-PROGRAMMER NUMBER@/],,ACFILE
\r
5649 [SIXBIT /(2) PROTECTION FAILURE@/],,ACFILE
\r
5650 [SIXBIT /(3) FILE WAS BEING MODIFIED@/],,ACFILE
\r
5651 [SIXBIT /(4) RENAME FILE NAME ALREADY EXISTS@/],,ACFILE
\r
5652 [SIXBIT /(5) ILLEGAL SEQUENCE OF UUOS@/],,ACFILE
\r
5653 [SIXBIT /(6) BAD UFD OR BAD RIB@/],,ACFILE
\r
5654 [SIXBIT /(7) NOT A SAV FILE@/],,ACFILE
\r
5655 [SIXBIT /(10) NOT ENOUGH CORE@/],,ACFILE
\r
5656 [SIXBIT /(11) DEVICE NOT AVAILABLE@/],,ACFILE
\r
5657 [SIXBIT /(12) NO SUCH DEVICE@/],,ACFILE
\r
5658 [SIXBIT /(13) NOT TWO RELOC REG. CAPABILITY@/],,ACFILE
\r
5659 [SIXBIT /(14) NO ROOM OR QUOTA EXCEEDED@/],,ACFILE
\r
5660 [SIXBIT /(15) WRITE LOCK ERROR@/],,ACFILE
\r
5661 [SIXBIT /(16) NOT ENOUGH MONITOR TABLE SPACE@/],,ACFILE
\r
5662 [SIXBIT /(17) PARTIAL ALLOCATION ONLY@/],,ACFILE
\r
5663 [SIXBIT /(20) BLOCK NOT FREE ON ALLOCATION@/],,ACFILE
\r
5664 [SIXBIT /(21) CAN'T SUPERSEDE (ENTER) AN EXISTING DIRECTORY@/],,ACFILE
\r
5665 [SIXBIT /(22) CAN'T DELETE (RENAME) A NON-EMPTY DIRECTORY@/],,ACFILE
\r
5666 [SIXBIT /(23) SFD NOT FOUND@/],,ACFILE
\r
5667 [SIXBIT /(24) SEARCH LIST EMPTY@/],,ACFILE
\r
5668 [SIXBIT /(25) SFD NESTED TOO DEEPLY@/],,ACFILE
\r
5669 [SIXBIT /(26) NO-CREATE ON FOR SPECIFIED PATH@/],,ACFILE
\r
5671 TABLND: [SIXBIT /(?) LOOKUP, ENTER, OR RENAME ERROR@/],,ACFILE
\r
5672 \fTYPMSG: PUSHJ PP,CRLF ;MOVE TO NEXT LINE
\r
5673 TYPMS1: HLRZ CS,RC ;GET FIRST MESSAGE
\r
5674 CAIE CS,-1 ;SKIP IF MINUS ONE
\r
5675 PUSHJ PP,TYPM2 ;TYPE MESSAGE
\r
5676 HRRZ CS,RC ;GET SECOND HALF
\r
5679 CRLF: MOVEI C,CR ;OUTPUT CARRIAGE RETURN
\r
5681 MOVEI C,LF ;AND LINE FEED
\r
5683 TYO: SOSG CTOBUF+2 ;BUFFER FULL?
\r
5684 OUTPUT CTL,0 ;YES, DUMP IT
\r
5685 IDPB C,CTOBUF+1 ;STORE BYTE
\r
5686 CAIG C,FF ;FORM FEED?
\r
5687 CAIGE C,LF ;V TAB OR LINE FEED?
\r
5690 POPJ PP, ;AND EXIT
\r
5692 TYPM2: MOVSI C,(1B0) ;ANTICIPATE REGISTER WORD
\r
5693 CAIN CS,ACFILE ;FILE NAME ?
\r
5694 JRST [JUMPE ACEXT,.+1 ;YES, TEST FOR EXT
\r
5695 LSH ACEXT,-6 ;MAKE SPACE FOR "."
\r
5696 IOR ACEXT,[SIXBIT /. @/]
\r
5698 CAIG CS,17 ;IS IT?
\r
5700 TYPM2A: HRLI CS,(POINT 6,,) ;FORM BYTE POINTER
\r
5702 TYPM3: ILDB C,CS ;GET A SIXBIT BYTE
\r
5704 JRST TYO ;YES, TYPE SPACE AND EXIT
\r
5705 ADDI C,40 ;NO, FORM 7-BIT ASCII
\r
5706 PUSHJ PP,TYO ;OUTPUT CHARACTER
\r
5709 \fXCEEDS: ADDI SX,2000 ;ADJUST SYMBOL POINTER
\r
5710 XCEED: PUSHJ PP,SAVEXS ;SAVE THE REGISTERS
\r
5711 HRRZ 1,JOBREL ;GET CURRENT TOP
\r
5713 CORE 0, ;REQUEST MORE CORE
\r
5714 JRST XCEED2 ;ERROR, BOMB OUT
\r
5715 HRRZ 2,JOBREL ;GET NEW TOP
\r
5717 XCEED1: MOVE 0,0(1) ;GET ORIGIONAL
\r
5718 MOVEM 0,0(2) ;STORE IN NEW LOCATION
\r
5719 SUBI 2,1 ;DECREMENT UPPER
\r
5720 CAMLE 1,SYMBOL ;HAVE WE ARRIVED?
\r
5721 SOJA 1,XCEED1 ;NO, GET ANOTHER
\r
5725 PUSHJ PP,SRCHI ;RE-INITIALIZE SYMBOL TABLE
\r
5726 JRST RSTRXS ;RESTORE REGISTERS AND EXIT
\r
5728 XCEED2: HRROI RC,[SIXBIT /INSUFFICIENT CORE@/]
\r
5730 PDPERR: HRROI RC,[SIXBIT .PDP OVERFLOW, TRY /P@.]
\r
5733 PRNUM: HLRZ CS,V ;GET MESSAGE
\r
5735 MOVEI CS,[SIXBIT /ON PAGE@/]
\r
5737 MOVE AC0,(V) ;GET PAGE
\r
5738 PUSHJ PP,DP1 ;PRINT NUMBER
\r
5741 SKIPN AC1,1(V) ;GET SEQ NUM IF THERE
\r
5742 POPJ PP, ;NO, RETURN
\r
5744 MOVEI CS,[SIXBIT /LINE@/]
\r
5746 MOVEI AC0,OUTSQ ;PRINT IT
\r
5747 OUTPUT CTL,0 ;TO MAKE THINGS PRINT IN RIGHT ORDER
\r
5750 JRST TYO ;AND RETURN
\r
5752 DP1: IDIVI AC0,^D10
\r
5759 \fRIM0: TDO FR,AC0 ;SET RIM/RIM10 FLAG
\r
5760 TLNE FR,PNCHSW ;FORGET IT IF PUNCH RESET
\r
5761 SETSTS BIN,IB ;SET TO IMAGE BINARY MODE
\r
5764 ROUT: EXCH CS,RIMLOC
\r
5765 SUB PP,[XWD 1,1] ;CLEAR OUT STACK WFW
\r
5770 JUMPE CS,ROUT1 ;RIM10 OUTPUT
\r
5777 ROUT1: MOVSI C,(DATAI PTR,) ;RIM OUTPUT
\r
5778 HRR C,LOCO ;GET ADDRESS
\r
5779 TLNE FR,RIM1SW ;NO DATAI IF RIM10
\r
5781 PUSHJ PP,PTPBIN ;OUTPUT
\r
5783 AOSA LOCO ;INCREMENT CURRENT LOCATION
\r
5785 OUTBIN: TLNN FR,RIMSW!RIM1SW!R1BSW ;EXIT IF RIM MODE
\r
5786 PTPBIN: TLNN FR,PNCHSW ;EXIT IF PUNCH NOT REQUESTED
\r
5788 SOSG BINBUF+2 ;TEST FOR BUFFER FULL
\r
5789 PUSHJ PP,DMPBIN ;YES, DUMP IT
\r
5790 IDPB C,BINBUF+1 ;DEPOSIT BYTE
\r
5793 \fDMPBIN: OUT BIN,0 ;DUMP THE BUFFER
\r
5794 POPJ PP, ;NO ERRORS
\r
5795 TSTBIN: GETSTS BIN,C ;GET STSTUS BITS
\r
5796 TRNN C,ERRBIT ;ERROR?
\r
5797 POPJ PP, ;NO, EXIT
\r
5798 MOVE AC0,BINDEV ;YES, GET TAG
\r
5799 JRST ERRLST ;TYPE MESSAGE AND ABORT
\r
5801 DMPLST: OUT LST,0 ;OUTPUT BUFFER
\r
5802 POPJ PP, ;NO ERRORS
\r
5803 TSTLST: GETSTS LST,C ;ANY ERRORS?
\r
5805 POPJ PP, ;NO, EXIT
\r
5807 ERRLST: MOVSI RC,[SIXBIT /OUTPUT WRITE-LOCK ERROR DEVICE@/]
\r
5808 TRNE C,IOIMPM ;IMPROPER MODE?
\r
5810 MOVSI RC,[SIXBIT /OUTPUT DATA ERROR DEVICE@/]
\r
5811 TRNE C,IODERR ;DEVICE DATA ERROR?
\r
5813 MOVSI RC,[SIXBIT /OUTPUT CHECKSUM OR PARITY ERROR DEVICE@/]
\r
5814 TRNE C,IODTER ;IS IT
\r
5816 MOVE CS,AC0 ;GET DEVICE
\r
5817 DEVCHR CS, ;FIND OUT WHAT IT IS
\r
5818 MOVSI RC,[SIXBIT /OUTPUT QUOTA EXCEEDED ON DEVICE@/]
\r
5819 TLNN CS,DSKBIT ;SKIP IF DSK OUTPUT
\r
5820 MOVSI RC,[SIXBIT /OUTPUT BLOCK TOO LARGE DEVICE@/]
\r
5823 R1BDMP: SETCM CS,R1BCNT
\r
5831 R1BDM1: MOVE C,0(CS)
\r
5837 R1BI: SETOM R1BCNT
\r
5842 ROUT6: CAME CS,RIMLOC
\r
5845 MOVEM AC0,R1BBLK(C)
\r
5853 \fREAD0: PUSHJ PP,EOT ;END OF TAPE
\r
5855 READ: SOSGE IBUF+2 ;BUFFER EMPTY?
\r
5857 READ1: ILDB C,IBUF+1 ;PLACE CHARACTER IN C
\r
5858 MOVE CS,@IBUF+1 ;CHECK FOR SEQUENCE NUMBER
\r
5861 CAIN CS,1 ;CHECK FOR SPECIAL
\r
5862 MOVE CS,[<ASCII/ />+1]
\r
5866 ADDM CS,IBUF+2 ;ADJUST WORD COUNT
\r
5867 REPEAT 4,< IBP IBUF+1> ;SKIP SEQ NO
\r
5868 PUSHJ PP,READ ;AND THE TAB
\r
5869 JRST READ ;GET NEXT CHARACTER
\r
5871 READ1A: JUMPE C,READ ;IGNORE NULL
\r
5872 CAIN C,32 ;IF IT'S A "^Z"
\r
5873 MOVEI C,LF ;TREAT IT AS A "LF"
\r
5874 CAIE C,37 ;CONTROL _
\r
5876 MOVEI C,"^" ;MAKE CONTROL-SHIFT _ VISIBLE
\r
5880 READ2: PUSHJ PP,READ ;YES, TEST FOR LINE FEED
\r
5881 PUSHJ PP,RSW2 ;LIST IN ANY EVENT
\r
5882 CAIG C,FF ;IS IT ONE OF
\r
5883 CAIGE C,LF ;LF, VT, OR FF?
\r
5885 PUSHJ PP,OUTIM1 ;YES, DUMP THE LINE
\r
5886 JRST READ ;RETURN NEXT CHARACTER
\r
5888 READ3: IN CHAR,0 ;GET NEXT BUFFER
\r
5889 JRST READ ;NO ERRORS
\r
5891 TRNN C,ERRBIT!2000 ;ERRORS?
\r
5894 MOVSI RC,[SIXBIT/ INPUT PHYSICAL END OF TAPE DEVICE@/]
\r
5896 JRST ERRFIN ;E-O-T
\r
5897 MOVSI RC,[SIXBIT /MONITOR DETECTED SOFTWARE INPUT ERROR DEVICE@/]
\r
5898 TRNE C,IOIMPM ;IMPROPER MODE?
\r
5900 MOVSI RC,[SIXBIT /INPUT DATA ERROR DEVICE@/]
\r
5901 TRNE C,IODERR ;DEVICE DATA ERROR?
\r
5903 MOVSI RC,[SIXBIT /INPUT CHECKSUM OR PARITY ERROR DEVICE@/]
\r
5905 MOVSI RC,[SIXBIT /INPUT BLOCK TOO LARGE DEVICE@/]
\r
5908 \fOUTAB2: PUSHJ PP,OUTTAB ;PRINT TWO TABS
\r
5909 OUTTAB: MOVEI C,HT
\r
5910 PRINT: CAIE C,CR ;IS THIS A CR?
\r
5912 JRST OUTCR ;YES, GO PROCESS
\r
5913 CAIN C,FF ;FORM FEED?
\r
5914 JRST OUTFF ;YES, FORCE NEW PAGE
\r
5917 OUTCR: TRNN ER,ERRORS!LPTSW!TTYSW
\r
5919 MOVEI C,CR ;CARRIAGE RETURN, LINE FEED
\r
5921 SOSGE LPP ;END OF PAGE?
\r
5922 TLO IO,IOPAGE ;YES, SET FLAG
\r
5923 TRCA C,7 ;FORM LINE FEED AND SKIP
\r
5925 OUTL: TLZN IO,IOPAGE ;NEW PAGE REQUESTED?
\r
5927 JUMP1 OUTC ;YES, BYPASS IF PASS ONE
\r
5928 PUSH PP,C ;SAVE C AND CS
\r
5931 TLNN IO,IOMSTR!IOPROG
\r
5933 TLNE IO,IOCREF ;IF DOING CREF OUTPUT NOW
\r
5934 TLNE FR,CREFSW ;AND CREFFING (JUST IN CASE)
\r
5936 PUSHJ PP,CLSC3 ;CLOSE IT OUT
\r
5937 HLLM IO,(PP) ;SAVE THIS NEW STATE OF IO
\r
5939 MOVEM C,LPP ;SET NEW COUNTER
\r
5943 PUSHJ PP,OUTC ;OUTPUT FORM FEED
\r
5945 PUSHJ PP,OUTAS0 ;OUTPUT TITLE
\r
5947 PUSHJ PP,OUTAS0 ;OUTPUT VERSION
\r
5949 PUSHJ PP,OUTAS0 ; AND DATE
\r
5951 PUSHJ PP,DNC ;OUTPUT PAGE NUMBER
\r
5952 AOSG PAGEN. ;FIRST PAGE OF THIS NUMBER?
\r
5954 MOVEI C,"-" ;NO, PUT OUT MODIFIER
\r
5958 OUTL1: PUSHJ PP,OUTCR
\r
5961 HRRZ CS,SUBTTX ;SWITCH FOR SUB-TITLE
\r
5962 SKIPE 0(CS) ;IS THERE A SUB-TITLE?
\r
5963 PUSHJ PP,OUTTAB ;YES, OUTPUT A TAB
\r
5964 PUSHJ PP,SOUT20 ;OUTPUT ASCII WITH CARRIAGE RETURN
\r
5967 POP PP,CS ;RESTORE REGISTERS
\r
5970 OUTC: TRNE ER,ERRORS!TTYSW
\r
5974 OUTLST: SOSG LSTBUF+2 ;BUFFER FULL?
\r
5975 PUSHJ PP,DMPLST ;YES, DUMP IT
\r
5976 COMMENT $ REG DOESN'T LIKE THIS FEATURE ANY MORE 9-5-72
\r
5977 IFN STANSW,< CAIN C,"@"
\r
5990 IDPB C,LSTBUF+1 ;STORE BYTE
\r
5993 \fPAGE0: PUSHJ PP,STOUTS ;PAGE PSEUDO-OP
\r
5994 OUTFF1: TLNE IO,IOCREF ;CURRENTLY DOING CREF?
\r
5995 TLNE IO,IOPROG ;AND NOT XLISTED?
\r
6001 OUTFF: TLO IO,IOPAGE
\r
6002 OUTFF2: SETOM PAGEN.
\r
6006 TIMOUT: IDIVI 2,^D60*^D1000
\r
6007 TIMOU1: IDIVI 2,^D60
\r
6008 PUSH PP,3 ;SAVE MINUTES
\r
6009 PUSHJ PP,OTOD ;STORE HOURS
\r
6010 MOVEI 3,":" ;SEPARATE BY COLON
\r
6012 POP PP,2 ;STORE MINUTES
\r
6013 OTOD: IDIVI 2,^D10
\r
6014 ADDI 2,60 ;FORM ASCII
\r
6020 DATOUT: IDIVI 1,^D31 ;GET DAY
\r
6022 CAIG 2,^D9 ;TWO DIGITS?
\r
6023 ADDI 2,7760*^D10 ;NO, PUT IN SPACE
\r
6024 PUSHJ PP,OTOD ;STORE DAY
\r
6025 IDIVI 1,^D12 ;GET MONTH
\r
6026 MOVE 2,DTAB(2) ;GET MNEMONIC
\r
6027 IDPB 2,CS ;DEPOSIT RIGHT MOST 7 BITS
\r
6028 LSH 2,-7 ;SHIFT NEXT IN
\r
6029 JUMPN 2,.-2 ;DEPOSIT IFIT EXISTS
\r
6030 MOVEI 2,^D64(1) ;GET YEAR
\r
6031 JRST OTOD ;STORE IT
\r
6045 \fSUBTTL MACHINE INSTRUCTION SEARCH ROUTINES
\r
6047 OPTSCH: MOVEI RC,0
\r
6048 MOVEI ARG,1B^L<OP1END-OP1TOP> ;SET UP INDEX
\r
6049 MOVEI V,1B^L<OP1END-OP1TOP>/2 ;SET UP INCREMENT
\r
6051 OPT1A: CAMN AC0,OP1TOP(ARG) ;ARE WE POINTING AT SYMBOL?
\r
6052 JRST OPT1D ;YES, GET THE CODE
\r
6053 JUMPE V,POPOUT ;TEST FOR END
\r
6054 CAML AC0,OP1TOP(ARG) ;NO, SHOULD WE MOVE DOWN?
\r
6055 TDOA ARG,V ;NO, INCREMENT
\r
6056 OPT1B: SUB ARG,V ;YES, DECREMENT
\r
6057 ASH V,-1 ;HALVE INCREMENT
\r
6058 CAIG ARG,OP1END-OP1TOP ;ARE WE OUT OF BOUNDS?
\r
6059 JRST OPT1A ;NO, TRY AGAIN
\r
6060 JRST OPT1B ;YES, BRING IT DOWN A PEG
\r
6064 OPTSCH: MOVE ARG,AC0 ;GET SIXBIT NAME
\r
6065 TLZ ARG,400000 ;CLEAR SIGN BIT
\r
6066 IDIVI ARG,PRIME ;REM. GOES IN V
\r
6067 CAMN AC0,OP1TOP(V) ;ARE WE POINTING AT SYMBOL?
\r
6069 SKIPN OP1TOP(V) ;TEST FOR END
\r
6070 POPJ PP, ;SYMBOL NOT FOUND
\r
6071 HLRZ RC,ARG ;SAVE LHS OF QUOTIENT
\r
6072 SKIPA ARG,RC ;GET IT BACK
\r
6073 OPT1A: ADDI ARG,(RC) ;INCREMENT ARG
\r
6074 ADDI V,(ARG) ;QUADRATIC INCREASE TO V
\r
6075 CAIL V,PRIME ;V IS MODULO PRIME
\r
6076 JRST [SUBI V,PRIME
\r
6078 CAMN AC0,OP1TOP(V) ;IS THIS IT?
\r
6080 SKIPE OP1TOP(V) ;END?
\r
6081 JRST OPT1A ;TRY AGAIN
\r
6085 IFN OPHSH,< SETZ RC, ;CLEAR RELOCATION
\r
6086 MOVE ARG,V ;GET INDEX IN RIGHT ACC.>
\r
6087 IDIVI ARG,4 ;ARG HAS INDEX USED IN OPTTAB
\r
6088 LDB V,OPTTAB(V) ;V HAS INDEX TO OPTTAB
\r
6089 CAIL V,700 ;PSEUDO-OP OR IO INSTRUCTION?
\r
6091 ROT V,-^D9 ;LEFT JUSTIFY
\r
6092 HRRI V,OP ;POINT TO BASIC FORMAT
\r
6093 OPT1F: AOS 0(PP) ;SET FOR SKIP EXIT
\r
6094 MOVEI SDEL,%OP ;SET OP-CODE CROSS-REF FLAG
\r
6095 JRST CREF ;TEST AND OUTPUT, AC0=SYMBOL, V=VALUE
\r
6097 OPT1G: JUMPG AC0,.+3 ;IF ".","$",OR "%" USE TABLE 1
\r
6098 TLNN AC0,200000 ;PSEUDO-OP OR IO INST., TEST FOR PROPER TABLE
\r
6099 SKIPA V,OP2TAB-700(V) ;2ND TABLE, FIRST LETTER IS "A" TO "O"
\r
6100 MOVE V,OP1TAB-700(V) ;1ST TABLE, ..."P" TO "Z"
\r
6104 IFE OPHSH,< POINT 9,OP1COD-1(ARG),35>
\r
6105 POINT 9,OP1COD (ARG), 8
\r
6106 POINT 9,OP1COD (ARG),17
\r
6107 POINT 9,OP1COD (ARG),26
\r
6108 IFN OPHSH,< POINT 9,OP1COD (ARG),35>
\r
6110 \fIFDEF .XCREF,< .XCREF ;DON'T CREF THIS MESS>
\r
6117 DEFINE X <N1=N1+1 ;>>
\r
6124 DEFINE X (SYMBOL,CODE)
\r
6126 CC=CC+CODE_<N2=N2-9>
\r
6134 SYN X,XX ;JUST THE SAME MACRO>
\r
6137 DEFINE XX (SB,CD)<> ;A NUL MACRO
\r
6138 OP1TOP: IF1,< BLOCK PRIME>
\r
6139 IF1,<DEFINE X (SB,CD)<>>
\r
6141 DEFINE OPSTOR (RM)<.$'RM=.$'RM+<OPCODE_<9*<3-R&3>>>>
\r
6146 R=SXB&-1_-1-Q*PRIME
\r
6151 IFL PRIME-TRY,<PRINTX HASH FAILURE>>
\r
6153 DEFINE ITEM (QT,RM)<
\r
6155 IFL PRIME-R,<R=R-R/PRIME*PRIME>
\r
6157 IFGE PRIME-<TRY=TRY+1>,<ITEM Q,\R>>
\r
6158 IFE .%'RM,<.%'RM=SXB
\r
6161 DEFINE GETSYM (N)<.%'N=0>
\r
6165 REPEAT PRIME,<GETSYM \N
\r
6167 DEFINE GETSYM (N)<.$'N=0>
\r
6169 REPEAT <PRIME/4+1>,<GETSYM \N
\r
6174 ;MACRO TO HANDLE KI10 OP-CODES
\r
6176 DEFINE XK (SB,CD) <> ;NUL MACRO>
\r
6177 IFN KI10,<SYN X,XK ;USUAL X MACRO>
\r
6178 \fIFN OPHSH,< ;PUT THE MOST USED OP CODES FIRST
\r
6251 IFN WFWSW,<X ARRAY , 772>
\r
6252 IFN IIISW,<X ASCID , 771>
\r
6300 IFN STANSW,<X CONS,257>
\r
6368 IFN STANSW,<X FIX , 247>
\r
6369 IFE STANSW,<XK FIX , 122>
\r
6505 IFN WFWSW,<X INTEGE, 773>
\r
6559 IFN WFWSW,<X LVAR , 774>
\r
6719 IFN STANSW,<X SPCWAR,43>
\r
6733 IF2,<IFE OPHSH,<SUBTL:>>
\r
6844 \fIFN OPHSH,< ;NO-OPS, OLD MNEMONICS,F4 UUOS
\r
6871 OP1COD: BLOCK N1/4
\r
6875 DEFINE SETVAL (N)<EXP .%'N
\r
6879 REPEAT PRIME,<SETVAL \N
\r
6883 OP1COD: IF1,< BLOCK <PRIME/4+1>>
\r
6885 DEFINE SETVAL (N)<EXP .$'N
\r
6889 REPEAT <PRIME/4+1>,<SETVAL \N
\r
6894 IFDEF .CREF,< .CREF ;START CREFFING AGAIN>
\r
6895 \fSUBTTL PERMANENT SYMBOLS
\r
6896 SYMNUM: EXP LENGTH/2 ;NUMBER OF PERMANENT SYMBOLS
\r
6899 XWD SYMF!NOOUTF,B>
\r
6902 P ??????, 0(SUPRBT)
\r
6904 LENGTH= .-SYMNUM-1 ;LENGTH OF INITIAL SYMBOLS
\r
6906 PRMTBL: ;PERMANENT SYMBOLS
\r
6940 IFE LNSSW,< XLIST >
\r
6941 IFN LNSSW,< ;SPECIAL DEVICES FOR PEPR
\r
6964 PRMEND: ;END OF PERMANENT SYMBOLS
\r
6966 \f OPDEF ZL [Z LITF] ;INVALID IN LITERALS
\r
6967 OPDEF ZA [Z ADDF] ;INVALID IN ADDRESSES
\r
6968 OPDEF ZAL [Z ADDF!LITF]
\r
6979 Z RADX50 ;RADIX50,SQUOZE
\r
6980 ZAL LOC0 (1) ;RELOC
\r
6981 ZAL REMAR0 ;REMARK
\r
6983 ZA SUPRE0 ;SUPRESS
\r
6984 ZAL PSEND0 ;PRGEND
\r
6985 ZAL RIM0 (RIMSW) ;RIM
\r
6987 Z ASCII0 (1) ;SIXBIT
\r
6988 ZAL IOSET (IOPALL!IOSALL) ;SALL
\r
6989 ZAL SERCH0 ;SEARCH
\r
6991 ZA SUBTT0 (Z (POINT 7,,)) ;SUBTTL
\r
6994 ZA TITLE0 (Z (POINT 7,,)) ;TITLE
\r
6998 ZAL TWSEG0 ;TWOSEGMENTS
\r
6999 ZAL XALL0 (IOPALL) ;XALL
\r
7000 ZAL IOSET (IOPROG) ;XLIST
\r
7002 ZAL RIM0 (RIM1SW) ;RIM10
\r
7003 ZAL RIM0 (R1BSW) ;RIM10B
\r
7004 ZA UNIV0 (Z (POINT 7,,)) ;UNIVERSAL
\r
7005 ZAL IORSET (IONCRF) ;.CREF
\r
7006 ZAL IOSET (IONCRF) ;.XCREF
\r
7007 ZA OFFORM ;.HWFRMT
\r
7011 Z ASCII0 (0) ;ASCII
\r
7012 Z ASCII0 (1B18) ;ASCIZ
\r
7016 ZA SUPRSA ;ASUPPRESS
\r
7025 Z OCT0 (^D10) ;DEC
\r
7028 ZAL DEPHA0 ;DEPHASE
\r
7030 ZA INTER0 (INTF!ENTF) ;ENTRY
\r
7034 TLNN FR,IFPASS ;IF1
\r
7035 TLNE FR,IFPASS ;IF2
\r
7037 TRNE AC0,IFB0 ;IFB
\r
7038 TLNE ARG,IFDEF0 ;IFDEF
\r
7039 Z IFIDN0 (0) ;IFDIF
\r
7043 Z IFIDN0 (1) ;IFIDN
\r
7048 TRNN AC0,IFB0 ;IFNB
\r
7049 TLNN ARG,IFDEF0 ;IFNDEF
\r
7050 ZA INTER0 (INTF) ;INTERN
\r
7053 Z IRP0 (400000) ;IRPC
\r
7061 ZAL IORSET (IOPALL!IOSALL) ;LALL
\r
7062 ZAL IORSET (IOPROG) ;LIST
\r
7071 Z ASCII0 (3B19) ;COMMENT
\r
7073 Z ASCII0 (5B20) ;ASCID
\r
7076 ZAL %INTEG ;INTEGER
\r
7080 ;USER DEFINED CALLI'S GO HERE
\r
7081 SIXBIT /LIGHTS/ ;-1
\r
7082 CALLI0: SIXBIT /RESET/ ; 0
\r
7083 SIXBIT /DDTIN/ ; 1
\r
7084 SIXBIT /SETDDT/ ; 2
\r
7085 SIXBIT /DDTOUT/ ; 3
\r
7086 SIXBIT /DEVCHR/ ; 4
\r
7087 SIXBIT /DDTGT/ ; 5
\r
7088 SIXBIT /GETCHR/ ; 6
\r
7089 SIXBIT /DDTRL/ ; 7
\r
7093 SIXBIT /UTPCLR/ ;13
\r
7095 SIXBIT /LOGIN/ ;15
\r
7096 SIXBIT /APRENB/ ;16
\r
7097 SIXBIT /LOGOUT/ ;17
\r
7098 SIXBIT /SWITCH/ ;20
\r
7099 SIXBIT /REASSI/ ;21
\r
7100 SIXBIT /TIMER/ ;22
\r
7101 SIXBIT /MSTIME/ ;23
\r
7102 SIXBIT /GETPPN/ ;24
\r
7103 SIXBIT /TRPSET/ ;25
\r
7104 SIXBIT /TRPJEN/ ;26
\r
7105 SIXBIT /RUNTIM/ ;27
\r
7107 SIXBIT /SLEEP/ ;31
\r
7108 SIXBIT /SETPOV/ ;32
\r
7110 SIXBIT /GETLIN/ ;34
\r
7112 SIXBIT /SETUWP/ ;36
\r
7113 SIXBIT /REMAP/ ;37
\r
7114 SIXBIT /GETSEG/ ;40
\r
7115 SIXBIT /GETTAB/ ;41
\r
7117 SIXBIT /SETNAM/ ;43
\r
7118 SIXBIT /TMPCOR/ ;44
\r
7119 SIXBIT /DSKCHR/ ;45
\r
7120 SIXBIT /SYSSTR/ ;46
\r
7121 SIXBIT /JOBSTR/ ;47
\r
7122 SIXBIT /STRUUO/ ;50
\r
7123 SIXBIT /SYSPHY/ ;51
\r
7124 SIXBIT /FRECHN/ ;52
\r
7125 SIXBIT /DEVTYP/ ;53
\r
7126 SIXBIT /DEVSTS/ ;54
\r
7127 SIXBIT /DEVPPN/ ;55
\r
7129 SIXBIT /RTTRP/ ;57
\r
7131 SIXBIT /JOBSTS/ ;61
\r
7132 SIXBIT /LOCATE/ ;62
\r
7133 SIXBIT /WHERE/ ;63
\r
7134 SIXBIT /DEVNAM/ ;64
\r
7135 SIXBIT /CTLJOB/ ;65
\r
7136 SIXBIT /GOBSTR/ ;66
\r
7140 SIXBIT /HIBER/ ;72
\r
7142 SIXBIT /CHGPPN/ ;74
\r
7143 SIXBIT /SETUUO/ ;75
\r
7144 SIXBIT /DEVGEN/ ;76
\r
7145 SIXBIT /OTHUSR/ ;77
\r
7146 SIXBIT /CHKACC/ ;100
\r
7147 SIXBIT /DEVSIZ/ ;101
\r
7148 SIXBIT /DAEMON/ ;102
\r
7149 SIXBIT /JOBPEK/ ;103
\r
7150 SIXBIT /ATTACH/ ;104
\r
7151 SIXBIT /DAEFIN/ ;105
\r
7152 SIXBIT /FRCUUO/ ;106
\r
7153 SIXBIT /DEVLNM/ ;107
\r
7154 SIXBIT /PATH./ ;110
\r
7157 NEGCAL==CALLI0-CALTBL ;NUMBER OF NEGATIVE CALLI'S
\r
7159 TTCTBL: SIXBIT /INCHRW/ ; 0 INPUT A CHAR. AND WAIT
\r
7160 SIXBIT /OUTCHR/ ; 1 OUTPUT A CHAR.
\r
7161 SIXBIT /INCHRS/ ; 2 INPUT A CHAR. AND SKIP
\r
7162 SIXBIT /OUTSTR/ ; 3 OUTPUT A STRING
\r
7163 SIXBIT /INCHWL/ ; 4 INPUT CHAR., WAIT, LINE MODE
\r
7164 SIXBIT /INCHSL/ ; 5 INPUT CHAR., SKIP, LINE MODE
\r
7165 SIXBIT /GETLCH/ ; 6 GET LINE CHARACTERISTICS
\r
7166 SIXBIT /SETLCH/ ; 7 SET LINE CHARACTERISTICS
\r
7167 SIXBIT /RESCAN/ ;10 RESET INPUT STREAM TO COMMAND
\r
7168 SIXBIT /CLRBFI/ ;11 CLEAR TYPEIN BUFFER
\r
7169 SIXBIT /CLRBFO/ ;12 CLEAR TYPEOUT BUFFER
\r
7170 SIXBIT /SKPINC/ ;13 SKIPS IF A CHAR. CAN BE INPUT
\r
7171 SIXBIT /SKPINL/ ;14 SKIPS IF A LINE CAN BE INPUT
\r
7172 SIXBIT /IONEOU/ ;15 OUTPUT AS AN IMAGE CHAR.
\r
7175 SUBTTL USER-DEFINED SYMBOL SEARCH ROUTINES
\r
7176 MSRCH: PUSHJ PP,SEARCH ;PERFORM GENERAL SEARCH
\r
7177 POPJ PP, ;NOT FOUND, EXIT
\r
7178 JUMPG ARG,MSRCH2 ;SKIP-EXIT AND CROSS-REF IF FOUND
\r
7179 CAME AC0,1(SX) ;WE ARE LOOKING AT SYMBOL, TRY ONE ABOVE
\r
7180 POPJ PP, ;NO, EXIT
\r
7181 ADDI SX,2 ;YES, POINT TO IT
\r
7182 PUSHJ PP,SRCH5 ;LOAD REGISTERS
\r
7183 MSRCH2: AOSA 0(PP) ;SET SKIP-EXIT
\r
7184 QSRCH: JUMPL ARG,SSRCH3 ;BRANCH IF OPERAND
\r
7185 MOVEI SDEL,%MAC ;SET OPERATOR FLAG
\r
7186 TLZE IO,DEFCRS ;IS IT A DEFINITION?
\r
7187 MOVEI SDEL,%DMAC ;YES
\r
7188 JRST CREF ;CROSS-REF AND EXIT
\r
7190 SSRCH: PUSHJ PP,SEARCH ;PERFORM GENERAL SEARCH
\r
7191 POPJ PP, ;NOT FOUND, EXIT
\r
7192 JUMPL ARG,SSRCH2 ;SKIP-EXIT AND CROSS-REF IF FOUND
\r
7193 SSRCH1: CAME AC0,-3(SX) ;WE ARE LOOKING AT MACRO, LOOK ONE SLOT BELOW
\r
7194 POPJ PP, ;NO DICE, EXIT
\r
7195 SUBI SX,2 ;YES, POINT TO IT
\r
7196 PUSHJ PP,SRCH5 ;LOAD REGISTERS
\r
7197 SSRCH2: AOS 0(PP) ;SET FOR SKIP-EXIT
\r
7198 SSRCH3: MOVEI SDEL,%SYM ;SET OPERAND FLAG
\r
7200 CREF: TLNN IO,IONCRF ;NO CREFFING FOR THIS SYMBOL?
\r
7201 TLNE FR,P1!CREFSW ;PASS ONE OR CROSS-REF SUPPRESSION?
\r
7202 POPJ PP, ;YES, EXIT
\r
7203 EXCH SDEL,C ;PUT FLAG IN C, SACE C
\r
7205 TLNE IO,IOCREF ;HAVE WE PUT OUT THE 177,102
\r
7207 PUSH PP,C ;START OF CREF DATA
\r
7209 \fREPEAT 0,< ;NEEDS CHANGE TO CREF
\r
7214 TLO IO,IOCREF ;WE NOW ARE IN THAT STATE
\r
7215 POP PP,C ;WE HAVE NOW
\r
7216 CREF3: JUMPE C,NOFLG ;JUST CLOSE IT
\r
7217 PUSHJ PP,OUTLST ;TYPE OF SYMBOL (%MAC,%DMAC,%SYM)
\r
7218 MOVSI CS,770000 ;COUNT CHRS
\r
7219 TDZA C,C ;STARTING AT 0
\r
7220 LSH CS,-6 ;TRY NEXT
\r
7221 TDNE AC0,CS ;IS THAT ONE THERE?
\r
7223 PUSHJ PP,OUTLST ;PRINT NUMBER OF SYMBOL CONSTITUENTS
\r
7229 PUSHJ PP,OUTLST ;THE ASCII SYMBOL
\r
7233 PUSHJ PP,OUTLST ;MARK IT AS A DEFINING OCCURENCE
\r
7234 NOFLG: MOVE C,SDEL
\r
7238 CLSCRF: TRNN ER,LPTSW
\r
7239 POPJ PP, ;LEAVE IF WE SHOULD NOT BE PRINTING
\r
7240 CLSCR2: MOVEI C,177
\r
7242 TLZE IO,IOCREF ;WAS IT OPEN?
\r
7243 JRST CLSCR1 ;YES, JUST CLOSE IT
\r
7244 MOVEI C,102 ;NO, OPEN IT FIRST
\r
7245 PUSHJ PP,OUTLST ;MARK BEGINNING OF CREF DATA
\r
7248 CLSCR1: MOVEI C,103
\r
7249 JRST OUTLST ;MARK END OF CREF DATA
\r
7251 CLSC3: TLZ IO,IOCREF
\r
7255 JRST OUTLST ;177,104 CLOSES IT FOR NOW
\r
7256 > ;END OF REPEAT 0
\r
7257 \fREPEAT 1,< ;WORKS WITH EXISTING CREF
\r
7259 PUSHJ PP,CRFHDR ;GET CORRECT SUBTTL
\r
7264 TLO IO,IOCREF ;WE NOW ARE IN THAT STATE
\r
7265 POP PP,C ;WE HAVE NOW
\r
7266 CREF3: PUSHJ PP,OUTLST ;TYPE OF SYMBOL (%MAC,%DMAC,%SYM)
\r
7267 MOVSI CS,770000 ;COUNT CHRS
\r
7268 TDZA C,C ;STARTING AT 0
\r
7269 LSH CS,-6 ;TRY NEXT
\r
7270 TDNE AC0,CS ;IS THAT ONE THERE?
\r
7272 PUSHJ PP,OUTLST ;PRINT NUMBER OF SYMBOL CONSTITUENTS
\r
7278 PUSHJ PP,OUTLST ;THE ASCII SYMBOL
\r
7282 PUSHJ PP,OUTLST ;MARK IT AS A DEFINING OCCURENCE
\r
7288 SUBTL: SIXBIT /SUBTTL/>
\r
7289 CRFHDR: CAME AC0,SUBTL ;IS FIRST SYMBOL "SUBTTL"
\r
7292 PUSHJ PP,SUBTT0 ;UPDATE SUBTTL
\r
7293 MOVE AC0,SUBTL ;RESTORE ARG.
\r
7299 CLSCRF: TRNN ER,LPTSW
\r
7300 POPJ PP, ;LEAVE IF WE SHOULD NOT BE PRINTING
\r
7301 CLSCR2: TLZE IO,IOCREF ;FINISH UP LINE
\r
7304 TLNE IO,IOPAGE ;NEW PAGE?
\r
7305 PUSHJ PP,OUTL ;YES,GIVE IT A ROUSING SENDOFF!
\r
7309 PUSHJ PP,OUTLST ;MARK BEGINNING OF CREF DATA
\r
7310 CLSCR1: MOVEI C,177
\r
7313 JRST OUTLST ;MARK END OF CREF DATA
\r
7314 > ;END OF REPEAT 1
\r
7315 \fSEARCH: HLRZ SX,SRCHX
\r
7318 SRCH1: CAML AC0,-1(SX)
\r
7320 SRCH2: SUB SX,SDEL
\r
7325 SOJA SX,SRCHNO ;NOT FOUND
\r
7327 SRCH3: CAMN AC0,-1(SX)
\r
7328 JRST SRCH4 ;NORMAL / FOUND EXIT
\r
7334 SOJA SX,SRCHNO ;NOT FOUND
\r
7336 SRCH4: AOS 0(PP) ;SET FOR SKIP EXIT
\r
7337 SRCH5: MOVSI ARG,SUPRBT ;HE IS USING IT, TURN OFF BIT
\r
7338 ANDCAM ARG,(SX) ; IN THE TABLE
\r
7339 SRCH7: MOVE ARG,0(SX) ;FLAG AND VALUE TO ARG
\r
7340 LDB RC,RCPNTR ;POINT 1,ARG,17
\r
7341 TLNE ARG,LELF ;CHECK LEFT RELOCATE
\r
7344 TLNE ARG,SPTR ;CHECK SPECIAL EXTESN POINTER
\r
7347 MOVE V,0(ARG) ;36BIT VALUE TO V
\r
7350 SRCH6: MOVE V,0(ARG) ;VALUE
\r
7351 MOVE RC,1(ARG) ;AND RELOC
\r
7352 TLNE RC,-2 ;CHECK AND SET EXTPNT
\r
7357 SRCHNO: SKIPN UNISCH+1 ;ALLOWED TO SEARCH OTHER TABLES
\r
7358 POPJ PP, ;NO, JUST RETURN
\r
7359 AOS V,UNISCH ;GET NEXT INDEX TO TABLE
\r
7360 CAIE V,1 ;FIRST TIME IN
\r
7361 JRST SRCHN1 ;YES, SAVE SYMBOL INFO
\r
7362 HRLM SX,UNISCH ;SAVE SX AND SET FLAG
\r
7363 MOVE ARG,SRCHX ;SEARCH POINTER
\r
7364 MOVEM ARG,UNISHX ;TO A SAFE PLACE
\r
7367 MOVEM ARG,UNIPTR ;STORE ALSO
\r
7368 SRCHN1: MOVE V,UNISCH(V) ;GET TRUE INDEX
\r
7369 JUMPE V,SRCHKO ;IF ZERO ALL TABLE SCANNED
\r
7370 MOVE ARG,UNISHX(V) ;NEW SRCHX
\r
7371 MOVEM ARG,SRCHX ;SET IT UP
\r
7372 MOVE ARG,UNIPTR(V) ;SYMTOP,,SYMBOL
\r
7375 JRST SEARCH ;TRY AGAIN
\r
7377 SRCHKO: SETZ ARG, ;CLEAR ARG SO ZERO STORED
\r
7378 SRCHOK: SKIPN UNISCH ;HAVE WE SEARCH OTHER TABLES
\r
7379 POPJ PP, ;NO, JUST RETURN
\r
7380 SYMBCK: HLRZ SX,UNISCH ;RESTORE SX
\r
7381 SETZM UNISCH ;CLEAR SYMBCK FLAG
\r
7382 PUSH PP,V ;SAVE AN AC
\r
7383 MOVE V,UNISHX ;SRCHX
\r
7384 MOVEM V,SRCHX ;RESTORE ORIGINAL
\r
7385 MOVE V,UNIPTR ;SYMTOP,,SYMBOL
\r
7388 JUMPE ARG,SRCHK2 ;TOTALLY UNDEFINED
\r
7389 PUSH PP,RC ;SAVE SOME ACCS
\r
7392 SETZB ARG,EXTPNT ;CLEAR ALL SYMBOL DATA
\r
7394 PUSHJ PP,INSERT ;INSERT SYMBOL IN TABLE
\r
7395 POP PP,EXTPNT ;RESTORE ACCS ETC.
\r
7398 MOVEM ARG,(SX) ;SET FLAGS AND VALUE AS IT SHOULD BE
\r
7402 \fINSERQ: TLNE ARG,UNDF!VARF
\r
7403 INSERZ: SETZB RC,V
\r
7404 INSERT: CAME AC0,-1(SX) ;ARE WE LOOKING AT MATCHING MNEMONIC?
\r
7405 JRST INSRT2 ;NO, JUST INSERT
\r
7406 JUMPL ARG,INSRT1 ;YES, BRANCH IF OPERAND
\r
7407 SKIPL 0(SX) ;OPERATOR, ARE WE LOOKING AT ONE?
\r
7408 JRST UPDATE ;YES, UPDATE
\r
7409 JRST INSRT2 ;NO, INSERT
\r
7411 INSRT1: SKIPG 0(SX) ;OPERAND, ARE WE LOOKING AT ONE?
\r
7412 JRST UPDATE ;YES, UPDATE
\r
7413 SUBI SX,2 ;NO, MOVE UNDER OPERATOR AND INSERT
\r
7414 INSRT2: MOVE SDEL,SYMBOL
\r
7420 INSRT3: MOVEM SDEL,SYMBOL ;MAKE ROOM FOR A TWO WORD ENTRY
\r
7422 BLT SDEL,-2(SX) ;PUSH EVERYONE DOWN TWO LOACTIONS
\r
7423 AOS @SYMBOL ;INCREMENT THE SYMBOL COUNT
\r
7424 TLNN RC,-2 ;NEED SPECIAL?
\r
7425 TRNE RC,-2 ;LEFT OR RIGHT EXTERNAL?
\r
7426 JRST INSRT5 ;YES, JUMP
\r
7427 TLNN V,-1 ;SKIP IF V IS A 36BIT VALUE
\r
7428 JRST INSRT4 ;JUMP, ITS A 18BIT VALUE
\r
7429 AOS SDEL,FREE ;36BIT, SO GET A CELL FROM FREE CORE
\r
7430 CAML SDEL,SYMBOL ;MORE CORE NEEDED?
\r
7431 PUSHJ PP,XCEEDS ;YES
\r
7432 HRRI ARG,-1(SDEL) ;POINTER TO ARG
\r
7433 MOVEM V,0(ARG) ;36BIT VALUE TO FREE CORE
\r
7434 TLOA ARG,PNTF ;NOTE THAT ARG IS APOINTER, NOT A 18BIT VALUE
\r
7436 INSRT4: HRR ARG,V ;18BIT VALUE TO ARG
\r
7437 DPB RC,RCPNTR ;FIX RIGHT RELOCATION
\r
7439 TLO ARG,LELF ;FIX LEFT RELOCATION
\r
7440 INSRT6: MOVEM ARG,0(SX) ;INSERT FLAGS AND VALUE.
\r
7441 MOVEM AC0,-1(SX) ;INSERT SYMBOL NAME.
\r
7442 PUSHJ PP,SRCHI ;INITILIAZE SRCHX
\r
7443 JRST QSRCH ;EXIT THROUGH CREF
\r
7445 INSRT5: MOVEI SDEL,2 ;GET TWO CELLS FROM FREE CORE
\r
7447 CAML SDEL,SYMBOL;MORE CORE NEEDED?
\r
7448 PUSHJ PP,XCEEDS ;YES
\r
7450 HRRI ARG,-2(SDEL) ;POINTER TO ARG
\r
7452 TLO ARG,SPTR ;SET SPECIAL POINTER, POINTS TO TWO CELLS
\r
7454 \fREMOVE: SUBI SX,2 ;MOVE EVERYONE UP TWO LOCATIONS
\r
7455 REMOV1: MOVE 0(SX)
\r
7456 MOVEM 2(SX) ;OVERWRITE THE DELETED SYMBOL
\r
7457 CAME SX,SYMBOL ;SKIP WHEN DONE
\r
7461 SOS 0(SX) ;DECREMENT THE SYMBOL COUNT
\r
7463 SRCHI: MOVEI AC2,0 ;THIS CODE SETS UP SRCHX
\r
7472 POPJ PP, ;SRCHX=XWD <SYMTBL+LENGTH/2>,LENGTH/4
\r
7474 \fUPDATE: DPB RC,RCPNTR ;FIX RIGHT RELOCATION
\r
7475 TLNE ARG,SPTR ;SKIP IF THERE IS NO SPECIAL POINTER
\r
7476 JRST UPDAT4 ;YES, USE THE TWO CELLS
\r
7477 TLNN RC,-2 ;NEED TO CHANGE
\r
7478 TRNE RC,-2 ;ANY CURRENT EXTERNS?
\r
7479 JRST UPDAT5 ;YES ,JUMP
\r
7480 TLZ ARG,LELF ;CLEAR LELF
\r
7481 TLNE RC,1 ;LEFT RELOCATABLE?
\r
7482 TLO ARG,LELF ;YES, SET THE FLAG
\r
7483 TLNE ARG,PNTF ;WAS THERE A 36BIT VALUE?
\r
7484 JRST UPDAT2 ;YES, USE IT.
\r
7485 TLNE V,-1 ;NO,IS THERE A 36BIT VALUE?
\r
7486 JRST UPDAT1 ;YES, GET A CELL
\r
7487 HRR ARG,V ;NO, USE RH OF ARG
\r
7488 UPDAT3: MOVEM ARG,0(SX) ;OVERWRITE THE ONE IN THE TABLE
\r
7489 POPJ PP, ;AND EXIT
\r
7491 UPDAT1: AOS SDEL,FREE ;GET ONE CELL
\r
7492 CAML SDEL,SYMBOL ;NEED MORE CORE?
\r
7493 PUSHJ PP,XCEEDS ;YES
\r
7494 HRRI ARG,-1(SDEL) ;POINTER TO ARG
\r
7495 TLO ARG,PNTF ;AND NOTE IT.
\r
7496 UPDAT2: TLNE ARG,EXTF ;IS THERE A EXTERNAL?
\r
7497 JRST UPDAT3 ;YES, - JUST SAVE A LOCATION
\r
7498 MOVEM ARG,0(SX) ;NO, OVERWRITE THE POINTER IN THE TABLE
\r
7499 MOVEM V,0(ARG) ;STORE VALUE AS A 36BIT VALUE
\r
7500 POPJ PP, ;AND EXIT
\r
7502 UPDAT4: MOVEM ARG,0(SX) ;WE HAVE TWO CELLS, WE USE THEM
\r
7503 MOVEM V,0(ARG) ;SAVE AS 36BIT VALUE
\r
7504 MOVEM RC,1(ARG) ;SAVE RELOCATION BITS
\r
7505 POPJ PP, ;AND EXIT
\r
7507 UPDAT5: MOVEI SDEL,2 ;THERE IS A EXTERNAL
\r
7508 ADDB SDEL,FREE ;SO WE NEED TWO LOACTIONS
\r
7509 CAML SDEL,SYMBOL ;NEED MORE CORE?
\r
7510 PUSHJ PP,XCEEDS ;YES
\r
7511 MOVEM RC,-1(SDEL) ;SAVE RELOCATION BITS
\r
7512 HRRI ARG,-2(SDEL) ;SAVE THE POINTER IN ARG
\r
7513 MOVEM V,0(ARG) ;SAVE A 36BIT VALUE
\r
7514 TLO ARG,SPTR ;SET SPECIAL PNTR FLAG
\r
7515 TLZ ARG,PNTF ;CLEAR POINTER FLAG
\r
7516 JRST UPDAT3 ;SAVE THE POINTER AND EXIT
\r
7518 \f SUBTTL CONSTANTS
\r
7522 HWFORM: BYTE (18) 1,1
\r
7523 INFORM: BYTE (9) 1 (4) 1 (1) 1 (4) 1 (18) 1
\r
7524 IOFORM: BYTE (3) 1 (7) 1 (3) 1 (1) 1 (4) 1 (18) 1
\r
7525 BPFORM: BYTE (6) 1,1 (2) 1 (4) 1 (18) 1
\r
7526 ASCIIF: BYTE (7) 1,1,1,1,1
\r
7527 SXFORM: BYTE (6) 1,1,1,1,1,1
\r
7530 \f SUBTTL PHASED CODE
\r
7533 IFE SEG2SW,< PHASE 140>
\r
7534 IFN SEG2SW,< PHASE LOWL>
\r
7536 IFN TEMP,<TMPFIL: SIXBIT /MAC/
\r
7539 SIXBIT /@/ ;SYMBOL TO STOP PRINTING
\r
7543 IFE FORMSW,< BYTE (7) 0, 11, 11, 11, 11>
\r
7544 IFN FORMSW,< BYTE (7) 11,11, 11, 11, 11>
\r
7565 DBUF: ASCIZ / TI:ME DY-MON-YR PAGE /
\r
7566 VBUF: ASCIZ / MACRO / ;MUST BE LAST LOCATIONS IN BLOCK
\r
7567 IFE PURESW,< BLOCK 3 ;ALLOW FOR LONG TITLE>
\r
7568 IFN PURESW,< DEPHASE
\r
7571 \fSUBTTL STORAGE CELLS
\r
7574 IFE SEG2SW,< LOC 140>
\r
7575 IFN SEG2SW,< RELOC LOWL>
\r
7576 LOWL: BLOCK LENLOW+3 >
\r
7581 IFE CCLSW,<CTIBUF: BLOCK 3
\r
7584 IFN CCLSW,<CTLBUF: BLOCK <CTLSIZ+5>/5
\r
7585 IFN RUNSW,<RUNDEV: BLOCK 1
\r
7591 IFN CCLSW,<IFE RUNSW,<NUNDIR:>>
\r
7596 ACDELX: ;LEFT HALF
\r
7597 BLKTYP: BLOCK 1 ;RIGHT HALF
\r
7603 COUTDB: BLOCK ^D18
\r
7607 IFN RENTSW,<HIGH1: BLOCK 1
\r
7610 HMIN: BLOCK 1 ;START OF HIGH SEG. IN TWO SEG. PROG.>
\r
7611 IFBLK: BLOCK .IFBLK
\r
7612 IFBLKA: BLOCK .IFBLK
\r
7617 LBUF: BLOCK <.CPL+5>/5
\r
7621 IFN WFWSW,<LVARLC: BLOCK 1>
\r
7638 SBUF: BLOCK .SBUF/5
\r
7648 STCODE: BLOCK .STP
\r
7649 STOWRC: BLOCK .STP
\r
7652 STFORM: BLOCK .STP
\r
7659 TCNT: BLOCK 1 ;COUNT OF CHARS. LEFT IN TBUF
\r
7660 TBUF: BLOCK .TBUF/5
\r
7661 DEVBUF: BLOCK 6 ;STORE NAME.EXT CREATION DATE AND TIME
\r
7663 IONSYM: BLOCK 1 ;-1 SUPRESS LISTING OF SYMBOLS
\r
7664 PRGPTR: BLOCK 1 ;POINTER TO CHAIN OF PRGEND BLOCKS
\r
7665 ENTERS: BLOCK 1 ;-1 WHEN ENTERS HAVE BEEN DONE
\r
7666 UNIVSN: BLOCK 1 ;-1 WHEN A UNIVERSAL SEEN
\r
7672 IFN RENTSW,<HHIGH: BLOCK 1 ;SAVE BREAK OF HIGH SEG. IN TWO SEG PROG.>
\r
7702 IFN WFWSW,<FIXLNK: BLOCK 1>
\r
7704 LITLBL: BLOCK 1 ;NAME OF LABEL DEFINED INSIDE A LITERAL
\r
7717 IFN CCLSW,<OTBUF: BLOCK 2>
\r
7730 R1BBLK: BLOCK .R1B
\r
7736 .TEMP: BLOCK 1 ;TEMPORARY STORAGE
\r
7737 UNISCH: BLOCK .UNIV ;SEARCH TABLE FOR UNIVERSALS
\r
7744 RCOUNT: BLOCK 1 ;COUNT OF WORDS STILL TO READ IN LEAF
\r
7745 WCOUNT: BLOCK 1 ;COUNT OF WORDS STILL FREE IN LEAF
\r
7746 PASS2Z: ;ONLY CLEAR TO HERE ON PRGEND
\r
7752 \fSUBTTL MULTI-ASSEMBLY STORAGE CELLS
\r
7755 IFN WFWSW,<ARAYP: BLOCK 1>
\r
7757 IFN CCLSW,<EXTMP: BLOCK 1 ;HOLDS EXT OF COMMAND FILE (RH)
\r
7762 IFN TEMP,<TMPFLG: BLOCK 1>
\r
7763 IFN FORMSW,<PHWFMT: BLOCK 1>
\r
7764 MACSIZ: BLOCK 1 ;INITIAL SIZE OF LOW SEG
\r
7765 UNISIZ: BLOCK 1 ;TOP OF BUFFERS AND STACKS
\r
7766 UNITOP: BLOCK 1 ;TOP OF UNIVERSAL SYMBOL TABLE
\r
7767 UNIVNO: BLOCK 1 ;NUMBER OF UNIVERSALS SEEN
\r
7768 UNITBL: BLOCK .UNIV ;TABLE OF UNIVERSAL NAMES
\r
7769 UNIPTR: BLOCK .UNIV ;TABLE OF SYMBOL POINTERS
\r
7770 UNISHX: BLOCK .UNIV ;TABLE OF SRCHX POINTERS
\r
7771 VAR ;CLEAR VARIABLES
\r
7773 JOBFFI: BLOCK 203*NUMBUF+1 ;INPUT BUFFER PLUS ONE
\r
7774 IFN PURESW,<LOWEND==.-1
\r