]>
Commit | Line | Data |
---|---|---|
c25f6a44 L |
1 | ;MAC80 - An 8085 cross assembler for the DECsystem-10 |
2 | ||
3 | ; Copyright 1976,1977,1978,1983 | |
4 | ; Bruce Tanner / Cerritos College | |
5 | ; 11110 Alondra Blvd. | |
6 | ; Norwalk, CA 90650 | |
7 | ||
8 | SEARCH M80UNV,MACTEN | |
9 | ||
10 | TITLE. (M80,MAC80A,8085 Cross Assembler) | |
11 | M80TTL | |
12 | M80PTX | |
13 | ||
14 | TWOSEG | |
15 | RELOC 400000 | |
16 | ||
17 | EXTERN IBUF,OBUF,LBUF,SBUF,MBUF,NOFILE,FILNAM,FILEXT,PPN,OPNOBJ | |
18 | EXTERN CREFSW,SYMBSW | |
19 | ||
20 | MAC80A::MOVE T1,[PUSHJ P,UUO] | |
21 | MOVEM T1,.JB41## | |
22 | MOVE T1,[IOWD 20,MACSTK] | |
23 | MOVEM T1,MACPDL | |
24 | MOVE T1,[IOWD 20,ARGSTK] | |
25 | MOVEM T1,ARGPDL | |
26 | MOVEI T1,-1 | |
27 | MOVEM T1,INVECT | |
28 | MOVE T1,[POINT 7,MACARG] | |
29 | MOVEM T1,ARGPTR | |
30 | MOVEI T1,1 | |
31 | MOVEM T1,PAGENO | |
32 | SETZM LOCSYM | |
33 | MOVEI T1,PAGEMX | |
34 | MOVEM T1,PAGESZ | |
35 | SETOM STARTA | |
36 | SETZB E,LBTP | |
37 | SETZ BC, | |
38 | SETZM ORGXR | |
39 | TDO F,[FL.LNR,,FR.PS1!FR.HEX] | |
40 | RESTAR: TRNE F,FR.PS1 ;PASS1? | |
41 | JRST PASS1 ;YES | |
42 | OUTSTR [ASCIZ/Pass 2 | |
43 | /] | |
44 | SETZM PC | |
45 | SETZM LINENO | |
46 | SETZM LOCSYM | |
47 | MOVEI T1,PAGEMX | |
48 | MOVEM T1,PAGESZ | |
49 | PUSHJ P,GTDATE | |
50 | PUSHJ P,DOHEAD ;OUTPUT THE HEADINGS | |
51 | ; JRST MAIN. ;JUMP TO THE MAIN LINE | |
52 | \fMAIN.: TRZ F,FR.LOP ;CLEAR LIST OP FLAG | |
53 | TRZE F,FR.END ;IF END | |
54 | JRST ENDIT ;FINI | |
55 | PUSHJ P,INCH ;SNEAK A LOOK FOR FF | |
56 | TRNN F,FR.LIB ;IF NOT IN MACLIB | |
57 | PUSHJ P,DOLINO ;PRINT LINE # | |
58 | PUSHJ P,TOKEN1 ;GET TOKEN WITH 1ST CHAR IN I | |
59 | JRST MAIN1 | |
60 | ||
61 | DUNTAG: TRZE F,FR.END ;DONE? | |
62 | JRST ENDIT ;YES | |
63 | PUSHJ P,TOKEN ;GET A TOKEN | |
64 | MAIN1: PUSHJ P,IFPOP ;AN "IF" TYPE PSEUDO OP? | |
65 | JRST NOTEST ;YES | |
66 | TRNE F,FR.OFF ;ASSEMBLING? | |
67 | JRST FLUSHX ;NO | |
68 | NOTEST: JUMPN TOK,.+4 ;SKIP IF SOMETHING | |
69 | CAIE I,CR ;EOL? | |
70 | CAIN I,SEMICO ;COMMENT? | |
71 | JRST FLUSHX ;YES | |
72 | CAIN I,COLON ;TAG? | |
73 | JRST DOTAG ;YES | |
74 | PUSHJ P,SRCHOP ;SEARCH OPCODE | |
75 | JRST [PUSHJ P,SETMAC | |
76 | JRST MAIN.] | |
77 | MOVE OP,OPCTAB(X) ;STORE THE OPCODE | |
78 | MOVE P1,TYPLSH(X) ;GET TYPE,,SHIFT | |
79 | TLNE P1,T.POP ;PSEUDO OP? | |
80 | JRST [PUSHJ P,PSEUDO ;YUP | |
81 | JRST MAIN.] | |
82 | TLNE P1,T.1BYT ;JUST OPCODE? | |
83 | JRST ONEOP ;1 BYTE INSTRUCTION | |
84 | TLNE P1,T.NREG ;USES REGISTER? | |
85 | JRST BYTE3 ;NO REGISTER | |
86 | DOREG: PUSHJ P,TOKEN ;GET THE NEXT TOKEN | |
87 | PUSHJ P,EVAL ;EVALUATE THE TOKEN | |
88 | CAIL T1,10 ;LEGAL REGISTER? | |
89 | WARN W.REG ;NO. | |
90 | ANDI T1,7 ;MAKE LEGAL | |
91 | TRNE P1,4 ;REGISTER PAIR? | |
92 | LSH T1,-1 ;YES, MAKE 2 BITS WIDE | |
93 | LSH T1,(P1) ;SHIFT ACCORDING TO LSH(X) | |
94 | OR OP,T1 ;MERGE | |
95 | TLZE P1,T.MOV ;A MOVE? | |
96 | JRST [TRZ P1,-1 ;YES - CLEAR LSH | |
97 | JRST DOREG] ;AND MERGE OTHER REG | |
98 | TLNE P1,T.2BYT!T.3BYT ;2 OR 3 BYTE INSTR? | |
99 | JRST BYTE3 ;GO ON AND DO DATA BYTES | |
100 | ONEOP: PUSHJ P,OUTOP ;OUTPUT THE ONE BYTE | |
101 | PUSHJ P,SPACE4 | |
102 | PUSHJ P,SPACE4 | |
103 | FLUSHX: PUSHJ P,FLUSH ;FLUSH THE REST OF THE LINE | |
104 | JRST MAIN. | |
105 | \fBYTE3: PUSHJ P,LSTPC ;OUTPUT THE OPCODE | |
106 | MOVE T1,OP | |
107 | PUSHJ P,LSTOP | |
108 | PUSHJ P,TOKEN ;GET THE DATA BYTE(S) | |
109 | JUMPN TOK,NOTMT ;NOT EMPTY | |
110 | CAIE I,15 ;BREAK ON EOL? | |
111 | CAIN I,SEMICO | |
112 | WARN W.MT ;DEFENSIVE CODE | |
113 | NOTMT: PUSHJ P,DODATA ;COMP. EFFECTIVE ADDR | |
114 | MOVE T1,OP | |
115 | PUSHJ P,LSTOP ;OUTPUT THE LOWER 8 BITS | |
116 | LSH OP,-10 ;SHIFT DOWN | |
117 | TLNE P1,T.2BYT ;JUST 1 DATA BYTE? | |
118 | JRST NOP1 | |
119 | MOVE T1,OP | |
120 | PUSHJ P,LSTOP ;OUTPUT UPPER 8 BITS | |
121 | NOP1: | |
122 | IFN FTREL,< | |
123 | SETZ T1, ;CLEAR FOR TEST | |
124 | TRZE F,FR.REL ;RELOCATABLE? | |
125 | MOVEI T1,"'" ;FLAG AS | |
126 | TRZE F,FR.EXT ;EXTERNAL? | |
127 | MOVEI T1,"*" ;INDICATOR | |
128 | SKIPE T1 ;ANYTHING THERE? | |
129 | PUSHJ P,LOUCH ;YES, PRINT IT | |
130 | > ;END IFN FTREL | |
131 | TLNE P1,T.2BYT ;NEED SPACES? | |
132 | PUSHJ P,SPACE4 ;YES | |
133 | JRST FLUSHX ;LOOP | |
134 | ||
135 | SPACE4: TRNE F,FR.HEX | |
136 | POPJ P, | |
137 | MOVEI T1,SPACE | |
138 | REPEAT 4,< | |
139 | PUSHJ P,LOUCH> | |
140 | POPJ P, | |
141 | \f;EVAL TOKEN IN TOK (AND REST OF EXPR IF ANY) RETURN VALUE IN OP | |
142 | ||
143 | DODATA: TRZ F,FR.UND ;CLEAR STATUS | |
144 | SETZM EXPLVL ;INIT EXPR LEVEL | |
145 | MOVE T4,[IOWD 20,OPSTK] | |
146 | PUSH T4,[DOLLAR] ;FLAG TOP OF STACK | |
147 | SETZ T2, ;CLEAR FLAG | |
148 | PUSH P,T2 | |
149 | JRST DODT12 ;JUMP IN | |
150 | ||
151 | DODAT1: CAIE I,COMMA | |
152 | CAIN I,SEMICO ;KNOWN TERMINATORS? | |
153 | JRST DODAT4 ;YES | |
154 | CAIE I,")" ;END OF EXPR | |
155 | CAIN I,CR ;OR EOL? | |
156 | JRST DODAT4 ;YES | |
157 | CAIE I,"<" ;SPECIAL CASE TEST FOR <=,>=,<> | |
158 | CAIN I,">" | |
159 | PUSHJ P,OP2CH ;CHECK FOR 2 CHAR OPCODE | |
160 | PUSH T4,I ;SAVE ON OP STACK | |
161 | CAIE I,SPACE | |
162 | CAIN I,TAB ;IF SPACE OR TAB | |
163 | CAIA ;KEEP LOOKING FOR OP | |
164 | JRST DODT10 ;HAVE OP ON STACK, GET 2ND ARG | |
165 | POP T4,(T4) ;OP IS JUST SPACE OR TAB | |
166 | PUSHJ P,TOKEN ;GET OP TOKEN | |
167 | JUMPE TOK,DODAT1 ;OP IS BREAK, DODAT1 WILL DO IT | |
168 | PUSH T4,TOK ;SAVE OP AS 6BIT TOKEN | |
169 | ;AT THIS POINT I MAY CONTAIN UNARY OP. | |
170 | CAIE I,SPACE | |
171 | CAIN I,TAB ;BETTER CONTAIN SPACE | |
172 | JRST DODT10 | |
173 | CAIN I,MINUS ;UNARY MINUS? | |
174 | JRST [PUSH P,T2 | |
175 | JRST DODT21] ;YES | |
176 | CAIE I,"(" ;THIS IS THE ONLY NON BLANK THING ALLOWED | |
177 | ERROR F.ILEX | |
178 | DODT10: PUSH P,T2 | |
179 | CAIE I,"(" ;DON'T LET TOKEN BUST INTO EXPR | |
180 | PUSHJ P,TOKEN ;GET NEXT TOKEN | |
181 | DODT12: SKIPE TOK ;IF NO TOKEN | |
182 | JRST DODT20 | |
183 | CAIN I,MINUS ;THEN THIS IS A UNARY MINUS | |
184 | DODT21: MOVEI I,"@" ;SPECIAL SYMBOL FOR UNARY MINUS | |
185 | DODT20: CAME TOK,[SIXBIT/NOT/] ;THE OTHER UNARY OPERATOR? | |
186 | CAMN TOK,[SIXBIT/HIGH/] | |
187 | JRST DODT23 ;YES | |
188 | CAME TOK,[SIXBIT/LOW/] | |
189 | CAMN TOK,[SIXBIT/LO/] | |
190 | JRST DODT23 | |
191 | CAME TOK,[SIXBIT/NUL/] | |
192 | CAMN TOK,[SIXBIT/NULL/] | |
193 | JRST DODT23 | |
194 | JRST DODT22 ;NO, SKIP | |
195 | ||
196 | DODT23: POP P,T2 ;RESTORE T2 | |
197 | PUSH T4,TOK ;SAVE OP | |
198 | SETZB T1,TOK ;CLEAR TOK IN CASE NOT(EXPR) | |
199 | SETZ TOK+1, | |
200 | PUSH P,T1 ;SAVE DUMMY ARG (DUMMY NOT FOO) | |
201 | JRST DODT10 ;NOW GET A TOKEN | |
202 | \fDODT22: PUSHJ P,EVALD ;EVAL TOKEN (OR EXPR) | |
203 | POP P,T2 | |
204 | DODT13: PUSH P,I ;SAVE I | |
205 | MOVE I,(T4) ;GET LAST OP | |
206 | CAIN I,DOLLAR ;NO LAST OP? | |
207 | JRST DODT14 ;SKIP | |
208 | PUSHJ P,DINDEX ;GET INDEX IN T3 | |
209 | MOVE OP,PRIOR(T3) ;GET PRIORITY OF LAST OP IN T3 (1 IS HIGEST) | |
210 | MOVE I,-1(T4) ;GET OP PREVIOUS TO LAST OP | |
211 | CAIN I,DOLLAR ;NOT THERE? | |
212 | JRST DODT14 ;SKIP | |
213 | PUSHJ P,DINDEX ;GET INDEX OF THIS ONE | |
214 | CAML OP,PRIOR(T3) ;CAN WE EVAL YET? | |
215 | JRST DODT15 ;YES | |
216 | ;NOTE: THIS IMPLIES LEFT-TO-RIGHT SCAN OF EQUAL PRI. UNARY OPS MAY NOT BE PUT TOGETHER. | |
217 | DODT14: POP P,I ;DONE WITH I | |
218 | PUSH P,T1 ;SAVE VALUE ON STACK | |
219 | TRNN F,FR.REL!FR.EXT ;ABS? | |
220 | TRO T2,1 ;FLAG ABS | |
221 | TRNE F,FR.REL ;RELOC? | |
222 | TRC T2,2 ;ABS & REL = REL; REL & REL = ABS | |
223 | TRNE F,FR.EXT ;EXTERNAL? | |
224 | ADDI T2,10 | |
225 | JRST DODAT1 ;KEEP GOING | |
226 | ||
227 | DODT15: POP P,I ;DONE WITH I (DODT13) | |
228 | MOVEM T1,SAVREG ;SAVE T1 | |
229 | POP T4,SAVREG+1 ;& LAST OPERATOR | |
230 | POP P,T1 | |
231 | POP P,OP | |
232 | MOVEM I,SAVREG+2 | |
233 | POP T4,I ;GET CURRENT OP | |
234 | PUSHJ P,DINDEX | |
235 | XCT EXPXCT(T3) ;DOIT TOIT | |
236 | PUSH P,OP ;SAVE NEW VALUE BACK ON STACK | |
237 | MOVE I,SAVREG+2 ;RESTORE I | |
238 | PUSH T4,SAVREG+1 ;PUT BACK LAST OP | |
239 | MOVE T1,SAVREG ;RESTORE LAST ARG | |
240 | JRST DODT13 ;SEE IF WE CAN COMPRESS MORE | |
241 | \fDODAT4: CAIE I,")" ;IF EOE | |
242 | JRST .+4 | |
243 | SOSGE EXPLVL ;IF WE WERE AT TOP LEVEL.. | |
244 | ERROR F.PARN | |
245 | JRST .+3 | |
246 | SKIPE EXPLVL ;THE REST BETTER BE AT TOP LEVEL | |
247 | ERROR F.PARN | |
248 | POP P,OP ;GET VALUE | |
249 | MOVEM I,SAVREG+3 ;SAVE I | |
250 | DODAT5: POP T4,I ;GET OP | |
251 | CAIN I,DOLLAR ;ALL DONE? | |
252 | JRST DODATX ;YES | |
253 | MOVE T1,OP | |
254 | POP P,OP ;GET 2ND ARG | |
255 | PUSHJ P,DINDEX ;GET INDEX IN T3 | |
256 | XCT EXPXCT(T3) ;DO IT | |
257 | JRST DODAT5 ;LOOP | |
258 | ||
259 | DODATX: MOVE I,SAVREG+3 ;RESTORE I | |
260 | ANDI OP,177777 ;JUST 16 BITS | |
261 | MOVE T1,OP ;GET NUMBER | |
262 | CAIN T2,10 ;ONE EXTERN? | |
263 | JRST DODAT3 ;YES | |
264 | CAILE T2,3 ;1 (ABS) OR 2 OR 3 (REL) ? | |
265 | ERROR F.EXT ;NO POLISH FIXUPS IN THIS ASSEMBLER | |
266 | DODAT3: TRZ F,FR.REL!FR.EXT ;CLEAR STATUS OF LAST TOKEN | |
267 | IFN FTREL,< | |
268 | TRNE T2,2 ;IF REL | |
269 | TRO F,FR.REL ;FLAG | |
270 | CAIN T2,10 ;IF EXTERN | |
271 | TRO F,FR.EXT ;FLAG | |
272 | TRNN F,FR.PS1 ;IF PASS1 | |
273 | SKIPN T2 ;OR NON-RELOCATABLE | |
274 | POPJ P, ;RETURN | |
275 | TRNE F,FR.HEX ;IF OCTAL FORMAT | |
276 | TRNE F,FR.EXT ;OR EXTERN | |
277 | POPJ P, ;EXIT | |
278 | CAIE T2,1 ;IF FLAGED AS ABS, | |
279 | TRNE F,FR.ORG ;OR NOT RELOCATING | |
280 | POPJ P, | |
281 | EXCH T1,RELPTR | |
282 | MOVE T2,PC | |
283 | MOVEM T2,RELTAB(T1) ;SAVE PC FOR NEXT LINK | |
284 | AOJ T1, ;BUMP POINTER | |
285 | EXCH T1,RELPTR | |
286 | > ;END IFN FTREL | |
287 | POPJ P, ;RETURN | |
288 | ||
289 | OP2CH: PUSH P,T1 | |
290 | PUSH P,T2 | |
291 | MOVE T1,I ;SAVE I | |
292 | MOVE T2,I | |
293 | SUBI T2,40 ;SIXBIT | |
294 | LSH T2,^D30 ;SHIFT TO 1ST BYTE | |
295 | PUSHJ P,SNEAK ;LOOK AT THE NEXT CHARACTER | |
296 | SKIPE TOK ;NON-BREAK? | |
297 | JRST OLDI ;YES, NOT A 2 CHAR OPCODE | |
298 | MOVE I,SNEAKI ;GET THE BREAK CHAR | |
299 | SUBI I,40 ;SIXBIT | |
300 | DPB I,[POINT 6,T2,11] | |
301 | CAIE I,'>' | |
302 | CAIN I,'=' ;GOOD 2ND CHAR? | |
303 | PUSHJ P,INCH ;YES, USE IT | |
304 | NEWI: SKIPA I,T2 | |
305 | OLDI: MOVE I,T1 ;RESTORE I | |
306 | POP P,T2 | |
307 | POP P,T1 | |
308 | POPJ P, | |
309 | ||
310 | \f DEFINE OPRMAC,< | |
311 | E "+",<ADD OP,T1>,4 | |
312 | E "-",<SUB OP,T1>,4 | |
313 | E "@",<MOVN OP,T1>,2 | |
314 | E "*",<IMUL OP,T1>,3 | |
315 | E "/",<PUSHJ P,EXDIV>,3 | |
316 | E "\",<PUSHJ P,EXMOD>,3 | |
317 | E "&",<AND OP,T1>,6 | |
318 | E "!",<OR OP,T1>,5 | |
319 | E "_",<LSH OP,(T1)>,6 | |
320 | E "#",<SETCM OP,T1>,2 | |
321 | E 'AND ',<AND OP,T1>,6 | |
322 | E 'OR ',<OR OP,T1>,7 | |
323 | E 'MOD ',<PUSHJ P,EXMOD>,1 | |
324 | E 'XOR ',<XOR OP,T1>,7 | |
325 | E 'SHR ',<PUSHJ P,EXSHR>,3 | |
326 | E 'SHL ',<LSH OP,(T1)>,3 | |
327 | E 'NOT ',<SETCM OP,T1>,2 | |
328 | E 'HIGH ',<LDB OP,[POINT 8,T1,27]>,10 | |
329 | E 'LOW ',<LDB OP,[POINT 8,T1,35]>,10 | |
330 | E 'LO ',<LDB OP,[POINT 8,T1,35]>,10 | |
331 | E 'EQ ',<PUSHJ P,RELEQ>,5 | |
332 | E "=",<PUSHJ P,RELEQ>,5 | |
333 | E 'NE ',<PUSHJ P,RELNE>,5 | |
334 | E '<> ',<PUSHJ P,RELNE>,5 | |
335 | E 'LT ',<PUSHJ P,RELLT>,5 | |
336 | E "<",<PUSHJ P,RELLT>,5 | |
337 | E 'GT ',<PUSHJ P,RELGT>,5 | |
338 | E ">",<PUSHJ P,RELGT>,5 | |
339 | E 'GE ',<PUSHJ P,RELGE>,5 | |
340 | E <BYTE (6) 36,35>,<PUSHJ P,RELGE>,5 | |
341 | E 'LE ',<PUSHJ P,RELLE>,5 | |
342 | E <BYTE (6) 34,35>,<PUSHJ P,RELLE>,5 | |
343 | E 'NUL ',<PUSHJ P,DONULL>,1 | |
344 | E 'NULL ',<PUSHJ P,DONULL>,1 | |
345 | > | |
346 | ||
347 | DEFINE E(CHAR,INSTR,PRI),< | |
348 | CHAR> | |
349 | ||
350 | OPRTAB: XLIST | |
351 | OPRMAC | |
352 | LIST | |
353 | OPRTBL==.-OPRTAB | |
354 | \f DEFINE E(CHAR,INSTR,PRI),< | |
355 | INSTR> | |
356 | ||
357 | EXPXCT: XLIST | |
358 | OPRMAC | |
359 | LIST | |
360 | ERROR F.ILEX ;EXECUTED IF OP IS NOT IN OPRMAC | |
361 | ||
362 | DEFINE E(CHAR,INSTR,PRI),< | |
363 | EXP PRI> | |
364 | ||
365 | PRIOR: XLIST | |
366 | OPRMAC | |
367 | LIST | |
368 | \fEXDIV: PUSH P,OP+1 | |
369 | IDIV OP,T1 | |
370 | POP P,OP+1 | |
371 | POPJ P, | |
372 | ||
373 | EXMOD: PUSH P,OP+1 | |
374 | IDIV OP,T1 | |
375 | MOVE OP,OP+1 | |
376 | POP P,OP+1 | |
377 | POPJ P, | |
378 | ||
379 | EXSHR: MOVNS T1 | |
380 | LSH OP,(T1) | |
381 | POPJ P, | |
382 | ||
383 | RELEQ: CAME OP,T1 | |
384 | FALSE: TDZA OP,OP ;0 = FALSE | |
385 | TRUE: SETO OP, ;-1 = TRUE | |
386 | POPJ P, | |
387 | ||
388 | RELNE: CAMN OP,T1 | |
389 | JRST FALSE | |
390 | JRST TRUE | |
391 | ||
392 | RELLT: CAML OP,T1 | |
393 | JRST FALSE | |
394 | JRST TRUE | |
395 | ||
396 | RELLE: CAMLE OP,T1 | |
397 | JRST FALSE | |
398 | JRST TRUE | |
399 | ||
400 | RELGT: CAMG OP,T1 | |
401 | JRST FALSE | |
402 | JRST TRUE | |
403 | ||
404 | RELGE: CAMGE OP,T1 | |
405 | JRST FALSE | |
406 | JRST TRUE | |
407 | ||
408 | ;NULL = LOCAL SYMBOL GENERATED FOR MISSING ARG, WHICH IS UNDEFINED | |
409 | ||
410 | DONULL: TLNN T1,S.UNDF ;IS THIS SYMBOL UNDEFINED? | |
411 | JRST FALSE ;NO | |
412 | SETZ E, ;YES, IT'S NULL; IGNORE THE 'UNDEFINED' ERROR | |
413 | JRST TRUE | |
414 | ||
415 | EVALD: CAIE I,"(" ;A WHOLE EXPR? | |
416 | JRST EVAL ;NO, JUST EVAL | |
417 | AOS EXPLVL ;FLAG WHICH LEVEL WE'RE IN | |
418 | SETZ I, ;GET RID IF PAREN FOR TEST @ DODT10+1 | |
419 | PUSH T4,[DOLLAR] ;DON'T PLOW THROUGH UPPER LEVEL STUFF | |
420 | PUSHJ P,DODT10 ;MUNCH ON (EXPR) | |
421 | CAIE I,CR | |
422 | CAIN I,SEMICO ;IF ERROR ON EOL, DODAT4 ALREADY HOLLERED | |
423 | POPJ P, ;RETAIN THIS BREAK FOR ANY OTHER LEVELS | |
424 | CAIE I,")" ;SHOULD END ON ) | |
425 | ERROR F.ILEX | |
426 | JRST INCH ;GET THE BREAK CHAR | |
427 | ||
428 | DINDEX: MOVSI T3,-OPRTBL | |
429 | CAME I,OPRTAB(T3) | |
430 | AOBJN T3,.-1 | |
431 | SKIPL T3 | |
432 | ERROR F.ILEX ;NOT IN TABLE | |
433 | POPJ P, | |
434 | \fTOKEN: CAIE I,CR | |
435 | PUSHJ P,INCH | |
436 | TOKEN1: CAIE I,SPACE ;FLUSH LEADING SPACES & TABS | |
437 | CAIN I,TAB | |
438 | JRST TOKEN | |
439 | SETZB TOK,TOK+1 | |
440 | MOVE T1,[POINT 6,TOK] | |
441 | CAIN I,DOLLAR ;SPECIAL TEST FOR $ | |
442 | POPJ P, ;LEADING DOLLAR SIGN IS ASSEMBLER PC | |
443 | CAIA | |
444 | TOKENL: PUSHJ P,INCH | |
445 | PUSHJ P,BREAK ;BREAK CHARACTER? | |
446 | POPJ P, | |
447 | ;REMOVE THE NEXT 2 LINES FOR $ TO BE A SIGNIFICANT LABEL CHARACTER | |
448 | CAIN I,DOLLAR ;IS IT A DOLLAR? | |
449 | JRST TOKENL ;YES, THEY ARE NOISE CHARACTERS | |
450 | CAIL I,"A"+40 ;IF LOWER CASE | |
451 | SUBI I,40 ;MAKE UPPER CASE | |
452 | SUBI I,40 ;CONVERT TO SIXBIT | |
453 | CAMN T1,[600,,TOK+1] ;TOK,TOK+1 FULL? | |
454 | JRST TOKENW ;YES, THROW OUT READ OF TOKEN | |
455 | IDPB I,T1 ;PUT IN TOK | |
456 | JRST TOKENL | |
457 | ||
458 | TOKENW: PUSHJ P,INCH ;WASTE REST OF TOKEN | |
459 | PUSHJ P,BREAK | |
460 | CAIA | |
461 | JRST TOKENW | |
462 | TRNN F,FR.SNK ;DON'T GET UPSET ABOUT OVERFLOW OF '...' | |
463 | WARN W.TOK | |
464 | POPJ P, | |
465 | ||
466 | BREAK: CAIG I,"Z" | |
467 | CAIGE I,"A" ;A-Z? | |
468 | CAIA | |
469 | JRST SCPOPJ | |
470 | CAIG I,"9" | |
471 | CAIGE I,"0" ;0-9? | |
472 | CAIA | |
473 | JRST SCPOPJ ;YES | |
474 | CAIG I,"Z"+40 ;LC? | |
475 | CAIGE I,"A"+40 | |
476 | CAIA | |
477 | JRST SCPOPJ | |
478 | CAIE I,"@" ;@ | |
479 | CAIN I,"?" ;AND ? ARE LEGAL | |
480 | JRST SCPOPJ | |
481 | CAIN I,DOLLAR ;$ IS NOW A LEGAL SYMBOL CHARACTER | |
482 | JRST SCPOPJ | |
483 | POPJ P, | |
484 | ||
485 | FLUSHL: CAIN I,LF ;IF ALREADY FLUSHED.. | |
486 | JRST LCRLF ;NEW LINE | |
487 | FLUSH: CAIN I,LF | |
488 | POPJ P, | |
489 | PUSHJ P,INCH ;GET NEXT CHARACTER | |
490 | JRST FLUSH ;LOOP | |
491 | \f;BINARY SEARCH OPNTAB | |
492 | SRCHOP: SETO T1, ;RANGE START | |
493 | MOVEI T2,OPTABL ;RANGE END | |
494 | SRCH1: MOVE T3,T2 ;GET END | |
495 | SUB T3,T1 ;GET LENGTH OF RANGE | |
496 | IDIVI T3,2 ;GET 1/2 RANGE | |
497 | JUMPE T3,SRCH10 ;NOT THERE | |
498 | ADD T3,T1 ;GET OFFSET INTO RANGE | |
499 | MOVE X,T3 ;GET IN X | |
500 | CAMN TOK,OPNTAB(X) ;MATCH? (ALL TOKENS IN OPNTAB ARE LE 6 CHAR) | |
501 | JRST SCPOPJ ;YES, SKIP RET | |
502 | CAML TOK,OPNTAB(X) | |
503 | MOVE T1,T3 ;SET NEW RANGE | |
504 | CAMG TOK,OPNTAB(X) | |
505 | MOVE T2,T3 | |
506 | JRST SRCH1 ;NO, LOOP | |
507 | ||
508 | SRCH10: MOVEI X,OPTABL ;POINT TO NULL ENTRY | |
509 | TRZE F,FR.EVL ;FROM EVAL? | |
510 | POPJ P, ;YES, QUIT NOW. | |
511 | DMOVE T2,TOK ;SAVE TOKEN | |
512 | PUSHJ P,SNEAK ;SEE IF MACRO DEFINITION | |
513 | CAMN TOK,[SIXBIT/MACRO/] ;IS IT? | |
514 | JRST SRCHOK | |
515 | CAME TOK,[SIXBIT/EQU/] | |
516 | CAMN TOK,[SIXBIT/SET/] | |
517 | JRST SRCHOK | |
518 | JRST TSTMAC ;NO, SEE IF IT IS A MACRO ITSELF | |
519 | ||
520 | SRCHOK: PUSHJ P,TOKEN ;GET NEXT TOKEN | |
521 | CAME TOK,[SIXBIT/EQU/] ;NOTE: EQU & SET ARE IDENTICAL | |
522 | CAMN TOK,[SIXBIT/SET/] ;GOOD GUYS? | |
523 | JRST EQUAL ;YES | |
524 | CAMN TOK,[SIXBIT/MACRO/] | |
525 | JRST DOMAC | |
526 | TSTMAC: DMOVE TOK,T2 ;PUT BACK TOKEN | |
527 | PUSHJ P,SRCSYM ;CHECK FOR MACRO | |
528 | JRST SRCERR ;NO MACRO | |
529 | TLNE T1,S.MAC ;MACRO? | |
530 | POPJ P, ;YES, SET UP MACRO | |
531 | SRCERR: ERROR F.ILOP ;NO. UNKNOWN OPCODE | |
532 | PUSHJ P,FLUSH ;WASTE REST | |
533 | JRST SCPOPJ | |
534 | \fPSEUDO: MOVSI X,-PTABL ;TABLE LENGTH | |
535 | CAME TOK,PTAB(X) ;MATCH? | |
536 | AOBJN X,.-1 ;LOOP | |
537 | JRST @PDISP(X) ;DISPATCH | |
538 | ||
539 | DEFINE PMAC,< | |
540 | PX ORG | |
541 | PX DS | |
542 | PX DB,DC | |
543 | PX DZ,DC | |
544 | PX DW,DC | |
545 | PX OPT,OPTION | |
546 | PX PHASE | |
547 | PX IFE,DOIFE | |
548 | PX IFN,DOIFN | |
549 | PX IF,DOIFN | |
550 | PX ELSE | |
551 | PX ENDIF | |
552 | PX PRINTX | |
553 | PX TITLE,DOTITL | |
554 | PX SUBTTL,DOSUBT | |
555 | PX PAGE,DOPAGE | |
556 | PX MACLIB | |
557 | PX REPT | |
558 | PX EXITM | |
559 | IFN FTREL,< | |
560 | PX INT,DOINT | |
561 | PX EXT,DOEXT | |
562 | > | |
563 | PX END,DOEND | |
564 | > | |
565 | ||
566 | DEFINE PX(NAME,ADDR),< | |
567 | SIXBIT/NAME/> | |
568 | ||
569 | PTAB: XLIST | |
570 | PMAC | |
571 | LIST | |
572 | PTABL==.-PTAB | |
573 | ||
574 | DEFINE PX(NAME,ADDR),< | |
575 | IFB <ADDR>,<JRST NAME> | |
576 | IFNB <ADDR>,<JRST ADDR>> | |
577 | ||
578 | PDISP: XLIST | |
579 | PMAC | |
580 | JRST CPOPJ ;IN CASE UNDEF OPCODE | |
581 | LIST | |
582 | ||
583 | IFPOP: CAME TOK,[SIXBIT/IFE/] | |
584 | CAMN TOK,[SIXBIT/IFN/] | |
585 | POPJ P, | |
586 | CAME TOK,[SIXBIT/ENDIF/] | |
587 | CAMN TOK,[SIXBIT/END/] | |
588 | POPJ P, | |
589 | CAME TOK,[SIXBIT/IF/] | |
590 | CAMN TOK,[SIXBIT/ELSE/] | |
591 | POPJ P, | |
592 | AOS (P) | |
593 | POPJ P, | |
594 | \fORG: TRO F,FR.ORG ;FLAG NO RELOCATION | |
595 | PUSHJ P,TOKEN ;GET ORG ARG | |
596 | PUSHJ P,DODATA ;GET THE NUMBER | |
597 | MOVEM OP,PC ;RESET PC | |
598 | TRNN F,FR.PS1 ;SKIP IF PASS1 | |
599 | JRST FLUSH ;NOPE, DONE | |
600 | MOVE T1,ORGXR ;GET INDEX | |
601 | MOVEM BC,ORGBLK(T1) ;STORE BYTE COUNT | |
602 | SKIPE BC ;IF BLOCK WAS VALID, | |
603 | ADDI T1,2 ;BUMP ORIGIN INDEX | |
604 | MOVEM OP,ORGBLK+1(T1) ;SAVE NEW START ADDRESS | |
605 | MOVEM T1,ORGXR ;SAVE INDEX | |
606 | SETZ BC, ;NO BYTES IN NEW BLOCK | |
607 | JRST FLUSH ;FLUSH | |
608 | ||
609 | DOEND: TRO F,FR.END ;SAY WE'RE DONE | |
610 | CAIN I,CR ;JUST "END" & NO START ADDRESS? | |
611 | JRST FLUSH ;YES, FLUSH LINE. | |
612 | PUSHJ P,TOKEN ;GET END ADDRESS | |
613 | PUSHJ P,DODATA ;GET VALUE IF ANY | |
614 | MOVEM OP,STARTA | |
615 | PUSHJ P,NOPC ;LIST START ADDRESS | |
616 | IFN FTREL,< | |
617 | MOVEI T1,"'" | |
618 | TRZE F,FR.REL ;RELOC? | |
619 | PUSHJ P,LOUCH ;YES | |
620 | TRZN F,FR.EXT ;EXTERNAL? | |
621 | JRST FLUSH ;NO, DONE | |
622 | SETOM STARTA ;YES. THIS IS ILLEGAL | |
623 | WARN W.EXSA | |
624 | > ;END IFN FTREL | |
625 | JRST FLUSH | |
626 | ||
627 | DS: PUSHJ P,TOKEN ;GET BLOCK ARG | |
628 | PUSHJ P,DODATA | |
629 | PUSHJ P,LSTPC | |
630 | TRO F,FR.LOP | |
631 | MOVEI T1,TAB | |
632 | TRNN F,FR.HEX | |
633 | PUSHJ P,LOUCH | |
634 | MOVE T1,PC ;SAVE OLD PC | |
635 | ADDM T1,OP ;NEW PC | |
636 | JRST ORG+3 ;DS MEANS NEW BLOCK | |
637 | ||
638 | PHASE: PUSHJ P,TOKEN | |
639 | PUSHJ P,DODATA | |
640 | MOVEM OP,PC | |
641 | TRO F,FR.ORG ;NO RELOCATION | |
642 | JRST FLUSH | |
643 | ||
644 | PRINTX: TRNE F,FR.PS1 ;IF ON PASS1 | |
645 | JRST FLUSH ;SKIP IT | |
646 | PX1: PUSHJ P,INCH | |
647 | OUTCHR I | |
648 | CAIE I,LF | |
649 | JRST PX1 | |
650 | POPJ P, | |
651 | \fDC: MOVE T4,[POINT 10,STRING] ;SET UP OPCODE OUTPUT | |
652 | MOVE T2,T4 ;AND INPUT | |
653 | PUSH P,T2 ;SAVE IT | |
654 | DC0: PUSHJ P,TOKEN ;GET ARG(S) | |
655 | CAIE I,"'" | |
656 | CAIN I,QUOTE | |
657 | JRST [MOVEM I,DELIM ;SAVE QUOTE | |
658 | PUSHJ P,SNEAK ;SEE IF SINGLE CHAR | |
659 | TLNE TOK,7777 | |
660 | JRST DC4 ;NO, DO QUOTED STRING | |
661 | MOVE I,SNEAKI | |
662 | CAME I,DELIM ;AND MUST END ON SAME QUOTE | |
663 | JRST DC4 | |
664 | SETZB TOK,TOK+1 | |
665 | JRST .+1] ;DO EXPR | |
666 | PUSH P,T4 ;DODATA DESTROYS T4 | |
667 | PUSHJ P,DODATA | |
668 | POP P,T4 | |
669 | MOVE T2,OP ;SAVE IT | |
670 | ANDI OP,377 ;LOWER 8 BITS | |
671 | IDPB OP,T4 ;SAVE OP | |
672 | MOVE OP,T2 ;GET BACK ALL OF OP | |
673 | AOS BYTCNT ;COUNT TOTAL BYTES IN | |
674 | AOS PC ;FIX PC FOR EVAL | |
675 | AOS XTRAPC ;FOR FIXUP | |
676 | TLNN P1,T.DW ;WHOLE WORD? | |
677 | JRST DC1 ;NO | |
678 | LSH OP,-10 | |
679 | ANDI OP,377 ;JUST DATA BITS | |
680 | TRZE F,FR.REL ;IF RELOC | |
681 | TRO OP,400 ;FLAG | |
682 | TRZE F,FR.EXT ;IF EXT | |
683 | TRO OP,1000 ;FLAG | |
684 | IDPB OP,T4 | |
685 | AOS BYTCNT | |
686 | AOS PC | |
687 | AOS XTRAPC | |
688 | DC1: CAIN I,COMMA ;CONTINUE? | |
689 | JRST DC0 ;YES | |
690 | CAIE I,TAB ;LEADING SPACE? | |
691 | CAIN I,SPACE | |
692 | JRST [PUSHJ P,INCH | |
693 | JRST DC1] ;YES, EAT IT | |
694 | POP P,OP ;GET START BYTE POINTER | |
695 | SETZ TOK, ;RESET COUNTER | |
696 | SKIPN BYTCNT ;ANY BYTES IN THERE? | |
697 | JRST DCX0 ;NO | |
698 | SOSGE XTRAPC | |
699 | JRST DC2 | |
700 | SOS PC | |
701 | JRST .-3 | |
702 | \fDC2: SETZM XTRAPC | |
703 | PUSHJ P,LSTPC ;LIST PC | |
704 | MOVEI TOK,3 ;TOKEN NOT INUSE NOW | |
705 | TLNE P1,T.DW ;WORDS? | |
706 | MOVEI TOK,2 ;YES | |
707 | DC3: ILDB T1,OP | |
708 | PUSH P,T1 ;SAVE IT | |
709 | PUSHJ P,LSTOP ;OUTPUT OP WITHOUT UPDATING PC | |
710 | POP P,T1 | |
711 | SOSG BYTCNT ;ONE LESS BYTE IN STRING | |
712 | JRST DCX ;ALL GONE | |
713 | SOJG TOK,DC3 ;LOOP FOR 2 OR 3 BYTES | |
714 | IFN FTREL,< | |
715 | TRNE T1,400 ;IF RELOCATABLE | |
716 | JRST [MOVEI T1,"'" ;FLAG | |
717 | PUSHJ P,LOUCH | |
718 | JRST .+1] | |
719 | TRNE T1,1000 ;IF EXTERNAL | |
720 | JRST [MOVEI T1,"*" | |
721 | PUSHJ P,LOUCH | |
722 | JRST .+1] | |
723 | > | |
724 | PUSHJ P,FLUSHL ;PRINT <TAB> LINE OF SOURCE (OR NEW LINE) | |
725 | JRST DC2 ;DO ANOTHER LINE | |
726 | ||
727 | DCX: SOJ TOK, ;COUNT BYTE PRINTED | |
728 | IFN FTREL,< | |
729 | MOVE T3,T1 ;GET FLAGS | |
730 | SETZ T1, | |
731 | TRNE T3,400 ;RELOC WORD? | |
732 | MOVEI T1,"'" | |
733 | TRNE T3,1000 ;EXTERN? | |
734 | MOVEI T1,"*" | |
735 | CAIE T1,"'" | |
736 | CAIN T1,"*" | |
737 | PUSHJ P,LOUCH ;OUTPUT IF ' OR * | |
738 | > ;END IFN FTREL | |
739 | DCX0: TLNN P1,T.DZ ;NEED A LAST ZERO? | |
740 | JRST DCX2 ;NO | |
741 | JUMPN TOK,DCX1 ;JUMP IF PC ALREADY PRINTED | |
742 | CAIN I,LF | |
743 | PUSHJ P,LCRLF | |
744 | CAIN I,CR ;ON A CR? | |
745 | PUSHJ P,INCH ;FLUSH LINE | |
746 | PUSHJ P,LSTPC ;LIST PC | |
747 | MOVEI TOK,3 | |
748 | TLNE P1,T.DW ;WORDS? | |
749 | MOVEI TOK,2 | |
750 | DCX1: SETZ T1, | |
751 | PUSHJ P,LSTOP ;LIST ZERO | |
752 | SOJ TOK, ;COUNT DOWN | |
753 | DCX2: JUMPE TOK,FLUSHL ;DONE | |
754 | PUSHJ P,SPACE4 ;SPACE OUT | |
755 | SOJG TOK,.-1 ;LOOP | |
756 | JRST FLUSHL ;DONE | |
757 | \fDC4: PUSHJ P,INCH ;GET LIT | |
758 | CAMN I,DELIM ;END QUOTE? | |
759 | JRST [PUSHJ P,INCH | |
760 | JRST DC1] | |
761 | IDPB I,T4 ;SAVE CHAR | |
762 | AOS BYTCNT | |
763 | CAIE I,CR ;EOL? | |
764 | CAIN I,LF | |
765 | CAIA ;YES | |
766 | JRST DC4 ;NO | |
767 | DC6: MOVE TOK,BYTCNT ;GET COUNT OF BYTES READY TO GO | |
768 | CAIGE TOK,3 ;ENOUGH FOR A LINE? | |
769 | JRST DC4 ;NO | |
770 | MOVEI TOK,3 ;SET UP BYTES/LINE | |
771 | PUSHJ P,LSTPC ;DO PC | |
772 | POP P,OP ;GET BYTE POINTER | |
773 | DC7: ILDB T1,OP ;GET BYTE | |
774 | SOS BYTCNT ;COUNT DOWN | |
775 | PUSH P,T1 | |
776 | PUSHJ P,LSTOP ;LIST IT | |
777 | POP P,T1 | |
778 | SOJG TOK,DC7 | |
779 | PUSH P,OP ;SAVE IT | |
780 | CAIN I,CR ;GOT HERE VIA CR? | |
781 | JRST DC4 ;YES, CAUSE LINE TO BE PRINTED | |
782 | JRST DC6 ;JUST BYTES FOR A WHILE | |
783 | ||
784 | IFN FTREL,< | |
785 | DOINT: SKIPA T2,[XWD S.INT,0] | |
786 | DOEXT: MOVSI T2,S.EXT | |
787 | PUSHJ P,TOKEN ;GET TOKEN | |
788 | PUSHJ P,SRCSYM ;FIND IT (OR EMPTY LOC) | |
789 | DMOVEM TOK,(S) ;NOT THERE, STUFF IT | |
790 | IORM T2,2(S) ;FLAG SYMBOL | |
791 | TLNE T2,S.EXT ;EXTERNAL? | |
792 | HLLOS 2(S) ;YES, MAKE RH -1 (FOR END OF CHAIN) | |
793 | CAIN I,COMMA ;MORE TO COME? | |
794 | JRST DOEXT+1 ;YES | |
795 | JRST FLUSH ;NO | |
796 | > | |
797 | \fDOMAC: DMOVE TOK,T2 ;GET MACRO NAME | |
798 | DOMAC0: POP P,(P) ;CAME VIA JRST FROM SUBROUTINE | |
799 | TRO F,FR.NRF ;WE WANT TO KNOW IF MACRO WAS NEVER REFERENCED | |
800 | PUSHJ P,SRCSYM ;FIND IN SYMBOL TABLE | |
801 | DMOVEM TOK,(S) ;SAVE IT | |
802 | PUSHJ P,SYMDEF ;LINE DEFINED ON | |
803 | MOVSI T1,S.MAC ;FLAG AS A MACRO REFERENCE | |
804 | IORM T1,2(S) ;PUT IN SYMBOL TABLE | |
805 | MOVE T2,[MACDUM,,MACDUM+1] | |
806 | SETZM MACDUM | |
807 | BLT T2,MACDND ;CLEAR MACRO ARG TABLE | |
808 | MOVEI T1,2 ;INDICATE NOT A REPT | |
809 | MOVEM T1,EOMFLG | |
810 | SETZ T2, ;MACDUM INDEX | |
811 | PUSH P,S | |
812 | DOMAC4: PUSHJ P,TOKEN | |
813 | DMOVEM TOK,MACDUM(T2) ;SAVE DUMMY ARG NAME | |
814 | JUMPE TOK,DOMC4A ;SINCE NULL ENTRY MEANS END, IGNORE REST | |
815 | CAIE I,COMMA ;MORE? | |
816 | JRST DOMC4A ;NO, SKIP | |
817 | AOJ T2, | |
818 | AOJA T2,DOMAC4 ;LOOP UNTIL NO MORE ARGS | |
819 | DOMC4A: POP P,S | |
820 | DOMC4B: PUSHJ P,FLUSH ;WASTE REST OF THE LINE | |
821 | MOVE T1,.JBFF## ;GET JOBFF | |
822 | HRRM T1,2(S) ;SAVE HOME OF MACRO | |
823 | MOVE T2,T1 | |
824 | HRLI T2,(POINT 7,0) ;POINTER TO MACRO BODY | |
825 | DOMAC1: PUSHJ P,INCH | |
826 | DOMAC3: HRRZI T1,1(T2) ;GET ADDRESS PART OF POINTER (+1) | |
827 | PUSHJ P,MEMXPN ;SEE IF MEMORY NEEDS TO BE EXPANDED | |
828 | CAIE I,SEMICO ;";"? | |
829 | JRST DOM10 ;NO | |
830 | LDB I,T2 ;GET LAST CHAR | |
831 | CAIE I,SEMICO ;DOUBLE ;;? | |
832 | JRST DOM11 ;NO | |
833 | SOJ T2, ;BACKUP BTP | |
834 | DOM9: ILDB I,T2 | |
835 | CAIN I,SEMICO | |
836 | JRST DOM12 ;FOUND IT | |
837 | CAIE I,TAB ;TRY TO ELIMINATE TRAILING TABS | |
838 | CAIN SPACE ;OR SPACES | |
839 | JRST DOM9 | |
840 | MOVEM T2,SAVREG ;SAVE FOR A WHILE | |
841 | JRST DOM9 | |
842 | ||
843 | MEMXPN: CAMG T1,.JBREL## ;WILL T1 FIT IN CORE? | |
844 | POPJ P, ;YES, EXIT | |
845 | PUSH P,T1 ;SAVE T1 | |
846 | CORE T1, | |
847 | ERROR F.NCOR | |
848 | POP P,T1 ;RESTORE T1 | |
849 | POPJ P, | |
850 | \fDOM12: PUSHJ P,FLUSH ;WASTE COMMENT | |
851 | MOVE T2,SAVREG ;GET POINTER | |
852 | MOVEI I,CR | |
853 | IDPB I,T2 ;STUFF CR | |
854 | SKIPA I,[LF] ;SET UP LF | |
855 | DOM11: MOVEI I,SEMICO ;PUT BACK ; | |
856 | DOM10: SKIPG MACLEV ;PASS THRU CONCAT INSIDE MACRO DEF | |
857 | CAIE I,"'" ;CONCATENATE? | |
858 | IDPB I,T2 ;STUFF IT | |
859 | CAIE I,LF ;END OF LINE | |
860 | JRST DOMAC6 | |
861 | TRZ F,FR.MCM ;FLAG END OF ANY POSSIBLE COMMENT | |
862 | JRST DOMC2A ;CHECK FOR ENDM, ETC. | |
863 | ||
864 | DOMAC6: PUSHJ P,BREAK ;IS IT WORTHWHILE TO LOOK FOR NEXT TOKEN? | |
865 | JRST DOMAC2 ;YES | |
866 | JRST DOMAC1 ;NO | |
867 | ||
868 | DOMAC5: SOSL MACLEV ;IN A NESTED MACRO? | |
869 | JRST DOMAC1 ;YES | |
870 | SETZM MACLEV ;DON'T LEAVE IT NEG. | |
871 | LDB I,T2 ;GET LAST CHAR OF MACRO | |
872 | CAIN I,12 ;END WITH LF? | |
873 | JRST DOMC5A ;YES, SKIP | |
874 | MOVEI I,15 | |
875 | IDPB I,T2 | |
876 | MOVEI I,12 ;END MACRO TEXT WITH CRLF | |
877 | IDPB I,T2 | |
878 | DOMC5A: MOVEI I,177 | |
879 | IDPB I,T2 | |
880 | MOVE I,EOMFLG ;177,2 IS END OF MACRO | |
881 | IDPB I,T2 | |
882 | SETZ I, | |
883 | IDPB I,T2 ;END WITH NULL | |
884 | AOJ T2, ;POINT TO 1ST FREE WORD | |
885 | HRRM T2,.JBFF## ;UPDATE JOBFF | |
886 | MOVE T1,EOMFLG ;ARE WE FROM REPT? | |
887 | CAIN T1,3 | |
888 | POPJ P, ;YES, GO BACK TO REPT CODE | |
889 | TRNE F,FR.PS1 ;PASS1? | |
890 | JRST FPASS1 ;FLUSH REST OF LINE, RETURN TO NORMAL INPUT | |
891 | JRST FLUSHX ;FOR PASS2 | |
892 | ||
893 | DOMAC2: CAIN I,SEMICO | |
894 | TRO F,FR.MCM ;FLAG IGNORE REST OF LINE | |
895 | CAIN I,QUOTE | |
896 | TRC F,FR.MQT ;TOGGLE QUOTE IN MACRO | |
897 | TRNE F,FR.MCM ;IN COMMENT? | |
898 | JRST DOMAC1 ;YES | |
899 | DOMC2A: PUSHJ P,DOMC13 ;GET NEXT TOKEN | |
900 | DOMAC7: JUMPE TOK,DOMAC1 ;NOTHING THERE | |
901 | CAMN TOK,[SIXBIT/ENDM/];END OF MACRO? | |
902 | JRST DOMAC5 ;YES | |
903 | CAME TOK,[SIXBIT/REPT/] | |
904 | CAMN TOK,[SIXBIT/MACRO/] ;NESTING A MACRO? | |
905 | JRST [TRNN F,FR.MCM!FR.MQT ;IN COMMENT OR QUOTE? | |
906 | AOS MACLEV ;NO, COUNT LEVEL OF NEST | |
907 | JRST DOMAC1] | |
908 | CAMN TOK,[SIXBIT/LOCAL/] ;LOCAL SYMBOL? | |
909 | JRST DOMAC9 ;YES | |
910 | MOVSI T3,-MACDML | |
911 | DOMC7A: SKIPN MACDUM(T3) | |
912 | JRST DOMAC1 | |
913 | CAMN TOK,MACDUM(T3) | |
914 | CAME TOK+1,MACDUM+1(T3) ;WHAT? NO DOUBLE WORD COMPARE? | |
915 | CAIA | |
916 | JRST DOMAC8 | |
917 | AOBJN T3,.+1 | |
918 | AOBJN T3,DOMC7A | |
919 | JUMPGE T3,DOMAC1 | |
920 | DOMAC8: PUSHJ P,TOKEN | |
921 | PUSH P,I | |
922 | MOVEI I,177 | |
923 | IDPB I,T2 | |
924 | HRRZS T3 | |
925 | LSH T3,-1 ;ACCOUNT FOR DOUBLE SIZE TOKENS | |
926 | MOVEI I,100(T3) | |
927 | IDPB I,T2 | |
928 | POP P,I | |
929 | JRST DOMAC3 | |
930 | ||
931 | DOMAC9: SKIPG MACLEV ;IN A MACRO? | |
932 | TRNE F,FR.MCM!FR.MQT ;IN COMMENT OR QUOTE? | |
933 | JRST DOMAC1 ;YES, IGNORE IT | |
934 | PUSHJ P,TOKEN ;EAT "LOCAL" | |
935 | MOVSI T3,-MACDML | |
936 | DOMC9A: SKIPN MACDUM(T3) ;FIND FIRST FREE MACDUM ENTRY | |
937 | JRST DOMC9B | |
938 | AOBJN T3,.+1 | |
939 | AOBJN T3,DOMC9A | |
940 | ERROR F.TMMA ;TOO MANY MACRO ARGS (MAKE MACDUM BIGGER) | |
941 | ||
942 | DOMC9B: PUSHJ P,TOKEN | |
943 | DMOVEM TOK,MACDUM(T3) ;SAVE LOCAL SYMBOL | |
944 | CAIN I,"," ;MORE LOCALS? | |
945 | JRST DOMC9A ;YES | |
946 | CAIN I,CR ;THROW OUT REST OF LINE | |
947 | JRST DOMAC3 | |
948 | PUSHJ P,INCH | |
949 | JRST .-3 | |
950 | ||
951 | DOMC13: HRRZ T1,INVECT ;GET INVECT POINTER | |
952 | CAIG T1,BAKPTR | |
953 | CAIGE T1,BAKBUF ;POINTS TO BAKBUF?? (IF SO, DON'T SNEAK) | |
954 | PJRST SNEAK ;LOOK AT NEXT TOKEN | |
955 | PUSH P,INVECT ;SAVE POINTER | |
956 | ILDB I,INVECT | |
957 | POP P,INVECT | |
958 | CAIE I,177 ;END OF BAKBUF? | |
959 | JRST [POP P,(P) ;WASTE RETURN ADDR | |
960 | JRST DOMAC1] ;JUST PROCESS CHARACTER | |
961 | MOVE T1,MACPDL | |
962 | POP T1,INVECT ;RESTORE OLD POINTER | |
963 | MOVEM T1,MACPDL | |
964 | JRST SNEAK ;AND GET A NEW TOKEN | |
965 | ||
966 | \fEQUAL: DMOVE TOK,T2 ;RESET TOKEN | |
967 | TLO P1,T.EQU ;SINCE EQU IS NOT IN OPNTAB | |
968 | TRO F,FR.NRF ;DEFINITION IS NOT REFERENCE | |
969 | PUSHJ P,SRCSYM | |
970 | DMOVEM TOK,(S) ;LOAD SYMBOL IF NOT THERE | |
971 | PUSH P,S ;SAVE S | |
972 | PUSHJ P,TOKEN ;GET ARG | |
973 | PUSHJ P,DODATA ;GET VALUE | |
974 | POP P,S ;RESTORE S | |
975 | HRRM OP,2(S) ;SET SYMBOL TABLE VALUE | |
976 | PUSHJ P,SYMDEF ;FLAG LINE DEFINED ON | |
977 | TRNN F,FR.UND ;IS EXPR UNDEFINED? | |
978 | JRST EQU1 ;NO, SKIP | |
979 | MOVE T1,2(S) ;GET FLAGS | |
980 | TLO T1,S.UNDF ;FLAG UNDEFINED | |
981 | HLLZM T1,2(S) ;PUT BACK, CLEAR VALUE OF EQU | |
982 | SETZ OP, ;A LITTLE HINT THAT ALL IS NOT OK | |
983 | JRST EQU2 ;SKIP | |
984 | ||
985 | EQU1: MOVE T1,2(S) ;GET FLAGS &C | |
986 | TLZ T1,S.UNDF!S.MAC ;MAKE SURE THAT THIS SYMBOL IS NOT UNDEFINED | |
987 | MOVEM T1,2(S) ;FOR CIRCULAR EQU MESS | |
988 | EQU2: POP P,(P) ;CAME VIA PUSHJ,.. | |
989 | TRNN F,FR.LIB ;SKIP OUTPUT IF IN MACLIB | |
990 | PUSHJ P,NOPC | |
991 | TRNE F,FR.PS1 ;PASS1? | |
992 | JRST FPASS1 ;YES | |
993 | JRST FLUSHX ;NO | |
994 | ||
995 | OPTION: PUSHJ P,TOKEN | |
996 | CAMN TOK,[SIXBIT/HEX/] | |
997 | TRO F,FR.HEX | |
998 | CAMN TOK,[SIXBIT/OCT/] | |
999 | TRZ F,FR.HEX | |
1000 | CAMN TOK,[SIXBIT/SMAC/] | |
1001 | TLO F,FL.SUP | |
1002 | CAMN TOK,[SIXBIT/LMAC/] | |
1003 | TLZ F,FL.SUP | |
1004 | CAIN I,COMMA | |
1005 | JRST OPTION | |
1006 | JRST FLUSH | |
1007 | ||
1008 | MACLIB: PUSHJ P,TOKEN ;GET LIBRARY NAME | |
1009 | SKIPN T1,TOK ;FILE NAME | |
1010 | JRST FLUSH ;IF NO NAME, FLUSH | |
1011 | MOVSI T2,'LIB' ;EXT IS .LIB | |
1012 | SETZB T3,T4 ;IN DEFAULT PATH | |
1013 | LOOKUP LIB,T1 ;LOOKUP FILE | |
1014 | JRST [OUTSTR [ASCIZ/MACLIB file not found | |
1015 | /] | |
1016 | JRST FLUSH] | |
1017 | PUSHJ P,FLUSH ;THROW OUT REST OF MACLIB LINE | |
1018 | MOVE T1,MACPDL | |
1019 | PUSH T1,INVECT ;SAVE INPUT VECTOR | |
1020 | MOVEM T1,MACPDL | |
1021 | MOVEI T1,-2 ;SIGNAL MACLIB INPUT | |
1022 | MOVEM T1,INVECT | |
1023 | TRO F,FR.LIB ;FLAG IN MACLIB | |
1024 | POPJ P, ;RETURN | |
1025 | ||
1026 | DOPAGE: PUSHJ P,TOKEN | |
1027 | PUSHJ P,DODATA | |
1028 | SKIPE OP ;IF ARG GIVEN FOR PAGE | |
1029 | MOVEM OP,PAGESZ ;SAVE IT AS THE NEW PAGE SIZE | |
1030 | HLLOS LINCTR ;FORCE A PAGE BREAK | |
1031 | JRST FLUSH | |
1032 | ||
1033 | EXITM: HRRZ T1,INVECT ;FIRST CHECK TO SEE IF WE'RE IN A MACRO | |
1034 | CAIE T1,-1 ;SOURCE? | |
1035 | CAIN T1,-2 ;MACLIB? | |
1036 | JRST EXITX ;YES, ERROR | |
1037 | CAIG T1,BAKPTR | |
1038 | CAIGE T1,BAKBUF ;POINTS TO BAKBUF? | |
1039 | JRST EXITM1 ;NO, MUST POINT TO MACRO | |
1040 | PUSHJ P,EXITM1 ;YES, GET RID OF IT | |
1041 | JRST EXITM ;AND CHECK AGAIN TO SEE IT THIS IS A MACRO | |
1042 | ||
1043 | EXITM1: PUSHJ P,FLUSH ;MAKE EVERYTHING LOOK NICE | |
1044 | MOVE T1,MACPDL ;GET THE INVECT STACK | |
1045 | POP T1,INVECT ;BAIL OUT OF THE MACRO | |
1046 | MOVEM T1,MACPDL | |
1047 | POPJ P, ;ALL DONE | |
1048 | ||
1049 | EXITX: WARN W.EXM ;WARN THAT WE'RE NOT IN A MACRO | |
1050 | JRST FLUSH | |
1051 | ||
1052 | REPT: PUSHJ P,TOKEN | |
1053 | PUSHJ P,DODATA ;GET THE REPT VALUE | |
1054 | MOVEM OP,REPCNT ;SAVE IT | |
1055 | MOVE T2,[MACDUM,,MACDUM+1] | |
1056 | SETZM MACDUM | |
1057 | BLT T2,MACDND ;CLEAR MACRO ARG TABLE | |
1058 | MOVEI T1,3 ;INDICATE REPT AND NOT MACRO | |
1059 | MOVEM T1,EOMFLG | |
1060 | MOVEI S,REPADR-2 ;FAKE UP SYMTAB POINTER | |
1061 | PUSHJ P,DOMC4B ;MAKE IT A MACRO IN REPBUF | |
1062 | SKIPN REPCNT ;IF REPT 0 | |
1063 | POPJ P, ;FORGET IT | |
1064 | PUSHJ P,SETARG ;SET UP MACARG IN CASE LOCALS USED | |
1065 | MOVEI I,177 | |
1066 | IDPB I,T1 | |
1067 | MOVEI I,1 | |
1068 | IDPB I,T1 | |
1069 | SETZ I, | |
1070 | IDPB I,T1 ;END WITH NULL | |
1071 | PUSHJ P,FLUSH | |
1072 | MOVE T1,MACPDL | |
1073 | PUSH T1,INVECT ;SAVE INPUT VECTOR ON SPECIAL STACK | |
1074 | MOVE T2,REPADR ;POINT TO REPT | |
1075 | HRLI T2,(POINT 7,0) | |
1076 | MOVEM T2,INVECT | |
1077 | MOVEM T1,MACPDL | |
1078 | POPJ P, | |
1079 | ||
1080 | ||
1081 | ||
1082 | DOIFN: PUSHJ P,TOKEN | |
1083 | PUSHJ P,DODATA | |
1084 | AOS IFLEVL ;ONE MORE IF | |
1085 | TRNE F,FR.OFF ;ALREADY OFF? | |
1086 | JRST FLUSH | |
1087 | SKIPE OP ;GOING OFF? | |
1088 | JRST FLUSH ;NO | |
1089 | TRNOFF: MOVE T1,IFLEVL | |
1090 | MOVEM T1,OFFLVL ;YES, SAVE LEVEL OF OFF | |
1091 | TRO F,FR.OFF ;SHUT OFF | |
1092 | JRST FLUSH ;RETURN | |
1093 | \fDOIFE: PUSHJ P,TOKEN | |
1094 | PUSHJ P,DODATA | |
1095 | AOS IFLEVL | |
1096 | TRNE F,FR.OFF | |
1097 | JRST FLUSH | |
1098 | SKIPN OP | |
1099 | JRST FLUSH | |
1100 | JRST TRNOFF ;TURN OFF | |
1101 | ||
1102 | ELSE: TRNN F,FR.OFF ;ARE WE OFF? | |
1103 | JRST TRNOFF ;NO, TURN OFF | |
1104 | MOVE T1,OFFLVL ;GET OFF LEVEL | |
1105 | CAMN T1,IFLEVL ;TURNED OFF AT THIS LEVEL? | |
1106 | TRZ F,FR.OFF ;YES, TURN BACK ON | |
1107 | JRST FLUSH ;FLUSH & RETURN | |
1108 | ||
1109 | ENDIF: TRNN F,FR.OFF ;OFF ALREADY? | |
1110 | JRST ENDI2 ;NO, JUST DECR. & LEAVE | |
1111 | MOVE T1,OFFLVL ;GET OFF LEVEL | |
1112 | CAMN T1,IFLEVL ;WAS TURNED OFF AT THIS LEVEL? | |
1113 | TRZ F,FR.OFF ;YES, TURN BACK ON | |
1114 | ENDI2: SOSGE IFLEVL ;COUNT DOWN IF LEVELS | |
1115 | WARN W.IF1 ;THERE WERE NO LEVELS! | |
1116 | SKIPGE IFLEVL ;IF MESSED UP, | |
1117 | SETZM IFLEVL ;FIX | |
1118 | JRST FLUSH | |
1119 | ||
1120 | DOTITL: MOVE T1,[POINT 7,TITL] | |
1121 | MOVEI T2,^D66 | |
1122 | PUSHJ P,INCH | |
1123 | CAIN I,15 | |
1124 | JRST FLUSH | |
1125 | IDPB I,T1 | |
1126 | SOJG T2,.-4 | |
1127 | JRST FLUSH | |
1128 | ||
1129 | DOSUBT: CAIA ;TRY BREAK CHARACTER FIRST | |
1130 | PUSHJ P,INCH ;GET DELIMITER | |
1131 | CAIE I,TAB | |
1132 | CAIN I,SPACE | |
1133 | JRST .-3 ;FORGET SPACES | |
1134 | MOVE T2,I | |
1135 | MOVE T3,[POINT 7,SUBTTL] | |
1136 | MOVEI T4,SUBTLN | |
1137 | SUB2: PUSHJ P,INCH | |
1138 | CAMN I,T2 ;END OF STRING? | |
1139 | JRST FLUSH ;YES | |
1140 | SOSLE T4 | |
1141 | IDPB I,T3 ;STUFF | |
1142 | JRST SUB2 | |
1143 | \fEVAL: TRZ F,FR.REL!FR.EXT ;INIT | |
1144 | SETZ T1, ;CLEAR OUTPUT | |
1145 | JUMPN TOK,DOSYM ;JUMP IF TOK NOT ZERO | |
1146 | CAIE I,"'" ;INTEL QUOTE | |
1147 | CAIN I,QUOTE | |
1148 | JRST DOQUOT ;LITERAL CHARACTER | |
1149 | CAIE I,DOLLAR | |
1150 | CAIN I,PERIOD | |
1151 | CAIA | |
1152 | POPJ P, ;MUST BE ZERO | |
1153 | MOVE T1,PC ;DOLLAR IS PC | |
1154 | TRO F,FR.REL ;DOLLAR IS ALSO RELOCATABLE | |
1155 | PUSH P,T2 | |
1156 | TLNE P1,T.DB!T.DW!T.EQU ;FROM DB,DW OR EQU? | |
1157 | CAIA ;NO, SKIP OVER SOJ | |
1158 | SOJ T1, ;INDICATE THE PC OF THE INSTRUCTION | |
1159 | POP P,T2 | |
1160 | JRST INCH ;EAT DOLLAR | |
1161 | ||
1162 | DOSYM: PUSHJ P,GETNUM ;EVALUATE NUMERICALLY | |
1163 | POPJ P, ;RETURN WITH NUMBER IN T1 | |
1164 | PUSHJ P,SRCSYM ;NOT NUMBER,SEARCH SYMBOL TABLE | |
1165 | JRST .+3 ;NOT THERE | |
1166 | HRRZS T1 | |
1167 | POPJ P, ;RETURN WITH VALUE IN T1 | |
1168 | ||
1169 | PUSH P,T2 | |
1170 | PUSH P,T3 | |
1171 | PUSH P,T4 | |
1172 | TRO F,FR.EVL ;TELL SRCHOP NOT TO FLAG ERROR | |
1173 | PUSHJ P,SRCHOP ;CHECK FOR OPCODE | |
1174 | JRST DOSYM3 ;NO OP | |
1175 | TRZ F,FR.EVL ;CLEAR FLAG | |
1176 | MOVE T2,OPCTAB(X) ;GET OPCODE | |
1177 | MOVE T3,TYPLSH(X) ;GET TYPE | |
1178 | TLNE T3,T.POP ;PSEUDO OP? | |
1179 | JRST DOSYM3 ;YES, DONE | |
1180 | TLNE T3,T.NREG ;USES REGISTER? | |
1181 | JRST DOSYM1 ;NO | |
1182 | ;CONT. | |
1183 | \fDOSYM2: CAIN I,")" ;END OF EXPR? | |
1184 | JRST DOSYM1 ;YES | |
1185 | PUSH P,T2 | |
1186 | PUSH P,T3 | |
1187 | PUSHJ P,TOKEN | |
1188 | PUSHJ P,EVAL | |
1189 | CAILE T1,7 | |
1190 | WARN W.REG | |
1191 | ANDI T1,7 | |
1192 | POP P,T3 | |
1193 | POP P,T2 | |
1194 | TRNE T3,4 | |
1195 | LSH T1,-1 | |
1196 | LSH T1,(T3) | |
1197 | OR T2,T1 | |
1198 | TLZE T3,T.MOV ;A MOVE? | |
1199 | JRST [TRZ T3,-1 | |
1200 | JRST DOSYM2] | |
1201 | DOSYM1: | |
1202 | REPEAT 0,< ;DON'T GET FUSSY ABOUT OPCODES AS DATA | |
1203 | CAIN I,")" ;EOE? | |
1204 | JRST DOSYM4 ;YES | |
1205 | WARN W.ILO1 ;ONLY GENERATE 1 BYTE OF DATA | |
1206 | >; END REPEAT 0 | |
1207 | DOSYM4: MOVE T1,T2 | |
1208 | POP P,T4 | |
1209 | POP P,T3 | |
1210 | POP P,T2 | |
1211 | POPJ P, | |
1212 | ||
1213 | DOSYM3: POP P,T4 | |
1214 | POP P,T3 | |
1215 | POP P,T2 | |
1216 | SKIPE (S) ;NO SYMBOL? | |
1217 | JRST FLUNDF ;SYMBOL ALREADY UNDEFINED | |
1218 | DMOVEM TOK,(S) ;SAVE SYMBOL | |
1219 | MOVSI T1,S.UNDF ;FLAG UNDEFINED | |
1220 | MOVEM T1,2(S) | |
1221 | FLUNDF: PUSHJ P,SRCSYM ;REFERENCE SYMBOL | |
1222 | JFCL ;NOT FOUND? | |
1223 | TRO F,FR.UND ;FLAG UNDEFINED SYMBOL | |
1224 | TRNN F,FR.PS1 ;SKIP IF PASS1 | |
1225 | ERROR F.UNDF ;REALLY IS UNDEFINED | |
1226 | POPJ P, ;BURP UP | |
1227 | ||
1228 | DOQUOT: PUSHJ P,INCH ;GET THE NEXT CHARACTER | |
1229 | MOVE T1,I ;JUST SAVE IT | |
1230 | PUSHJ P,INCH ;EAT TRAILING QUOTE | |
1231 | CAIE I,"'" | |
1232 | CAIN I,QUOTE | |
1233 | JRST .+4 ;OK THEN | |
1234 | LSH T1,10 ;SHIFT OVER | |
1235 | ADD T1,I ;MERGE | |
1236 | JRST .-6 | |
1237 | PUSH P,T1 ;SAVE T1 | |
1238 | PUSHJ P,TOKEN ;LOAD UP LIKE TOKEN | |
1239 | POP P,T1 ;RESTORE T1 | |
1240 | POPJ P, ;RETURN | |
1241 | \f;SEARCH SYMBOL TABLE FOR ENTRY IN TOK. | |
1242 | ;NON-SKIP RETURN: SYMBOL UNDEFINED. S CONTAINS 1ST FREE ENTRY | |
1243 | ;SKIP RETURN: T1 CONTAINS VALUE OF SYMBOL. S POINTS TO ENTRY IN SYMTAB | |
1244 | ;SYMTAB ENTRY: SIXBIT/NAME/ | |
1245 | ; SIXBIT/MORE NAME/ | |
1246 | ; FLAGS,,VALUE ;SEE M80UNV FOR FLAGS (S.????) | |
1247 | ; LINE#,,LINK TO NEXT LINE# ;1B0 SET IF DEFINED ON LINE# | |
1248 | ; 0,,LINK TO OVERFLOW ; 0 IF NO MORE ENTRIES | |
1249 | ||
1250 | SRCSYM: TRZ F,FR.REL!FR.EXT | |
1251 | MOVSI S,-PRELEN ;GET LENGTH OF PRE DEFINED TABLE | |
1252 | HRRI S,PRETAB ;ADDRESS OF PERMANENT SYMBOLS | |
1253 | SRCS1: CAMN TOK,(S) ;MATCH? | |
1254 | JRST PREMAT | |
1255 | AOBJN S,.+1 | |
1256 | AOBJN S,SRCS1 ;NO, LOOP | |
1257 | ;LOOK IN REGULAR SYMBOL TABLE | |
1258 | PUSH P,T2 ;DON'T DESTROY T2 | |
1259 | MOVE T2,[POINT 6,TOK];THIS ASSUMES SYMSIZ IS FAIRLY CLOSE TO 64 | |
1260 | SETZ T1, | |
1261 | TLNN T2,770000 ;ONLY HASH ON 1ST WORD OF SYMBOL | |
1262 | JRST .+4 | |
1263 | ILDB S,T2 | |
1264 | ADD T1,S | |
1265 | JRST .-4 | |
1266 | IDIVI T1,SYMSIZ ;GET TOKEN MODULO TABLE LENGTH | |
1267 | MOVE T1,T2 | |
1268 | POP P,T2 | |
1269 | IMULI T1,5 ;5 WORDS/ENTRY | |
1270 | MOVEI S,SYMTAB(T1) ;GET HASHED TABLE LOCATION | |
1271 | SRCL: CAMN TOK,(S) | |
1272 | CAME TOK+1,1(S) | |
1273 | CAIA | |
1274 | JRST SRCF | |
1275 | SKIPN (S) ;EMPTY? | |
1276 | POPJ P, ;YES, RETURN WITH S SET UP | |
1277 | SKIPN 4(S) ;LINK THERE? | |
1278 | JRST MAKLNK ;NO. MAKE NEW ENTRY & RETURN | |
1279 | HRRZ S,4(S) ;NEW LINK | |
1280 | JRST SRCL ;LOOP | |
1281 | ||
1282 | PREMAT: MOVE T1,1(S) ;GET FLAGS,VALUE | |
1283 | JRST SCPOPJ ;SKIP RETURN | |
1284 | ||
1285 | MAKLNK: MOVE T1,.JBFF## ;GET JOBFF | |
1286 | HRRM T1,4(S) ;MAKE NEW LINK | |
1287 | HRRM T1,S | |
1288 | ADDI T1,5 ;MAKE NEW JOBFF | |
1289 | PUSHJ P,MEMXPN ;EXPAND CORE IF NECESSARY | |
1290 | MOVEM T1,.JBFF## ;STUFF IT | |
1291 | POPJ P, ;DONE | |
1292 | \fSRCF: MOVE T1,2(S) ;GET FLAGS,VALUE | |
1293 | PUSH P,T2 ;SAVE T2 | |
1294 | MOVE T2,T1 ;IN T2 | |
1295 | TLNE T2,S.EXT ;EXTERNAL? | |
1296 | HRR T2,PC ;YES, SAVE CURRENT PC FOR NEXT SYMBOL | |
1297 | TRZN F,FR.NRF ;A REFERENCEABLE SYMBOL? | |
1298 | TLO T2,S.REF ;YES, REFERENCE SYMBOL | |
1299 | MOVEM T2,2(S) ;SAVE FLAGS,VALUE | |
1300 | TRNE F,FR.PS1 ;PASS1? | |
1301 | JRST SRCX ;YES, NO REF ON PASS1 | |
1302 | TRNN F,FR.LST ;LISTING REFERENCES? | |
1303 | JRST SRCX ;NO USE GATHERING THEM THEN | |
1304 | SKIPE 3(S) ;NO REFERENCE? | |
1305 | JRST NXTREF ;NO | |
1306 | HRLZ T2,LINENO ;GET CURRENT LINENO | |
1307 | MOVEM T2,3(S) ;SAVE IN LH | |
1308 | JRST SRCX ;DONE | |
1309 | ||
1310 | NXTREF: PUSH P,T1 ;SAVE T1 | |
1311 | PUSH P,T3 ;AND T3 | |
1312 | MOVEI T1,3(S) ;GET ADDRESS | |
1313 | MOVE T2,3(S) ;GET LINE,,LINK | |
1314 | SRCLNK: HLRZ T3,T2 ;GET LINE NUMBER IN CHAIN | |
1315 | ANDI T3,377777 ;JUST LINE NUMBER | |
1316 | CAMN T3,LINENO ;IS LINENO ALREADY IN CHAIN? | |
1317 | JRST SRCX0 ;YES, QUIT NOW | |
1318 | TRNN T2,-1 ;ANY LINK? | |
1319 | JRST SRCI ;NO, END OF CHAIN | |
1320 | HRRZ T1,T2 ;SAVE LINK | |
1321 | MOVE T2,(T1) ;FOLLOW LINK | |
1322 | JRST SRCLNK ;LOOP TO END OF CHAIN | |
1323 | \fSRCI: HRR T2,.JBFF## ;GET FIRST FREE AS LINK | |
1324 | MOVEM T2,(T1) ;SAVE WITH NEW LINK | |
1325 | HRRZ T1,T2 ;LINK ADDRESS IN T1 | |
1326 | MOVE T2,LINENO ;GET LINE NUMBER | |
1327 | HRLZM T2,(T1) ;STORE IT | |
1328 | AOJ T1, ;NEW JOBFF | |
1329 | PUSHJ P,MEMXPN ;EXPAND CORE | |
1330 | MOVEM T1,.JBFF## | |
1331 | SRCX0: POP P,T3 ;RESTORE T3 | |
1332 | POP P,T1 ;RESTORE T1 | |
1333 | SRCX: POP P,T2 | |
1334 | TLNE T1,S.UNDF ;UNDEFINED SYMBOL? | |
1335 | POPJ P, ;YES, TIME TO LEAVE | |
1336 | TLZE T1,S.REL ;RELOCATABLE? | |
1337 | TRO F,FR.REL ;YES, FLAG IT | |
1338 | TLZE T1,S.EXT ;EXTERNAL? | |
1339 | TRO F,FR.EXT ;YES | |
1340 | SCPOPJ: AOS (P) ;CAUSE SKIP RETURN | |
1341 | CPOPJ: POPJ P, ;RETURN | |
1342 | ||
1343 | ;SNEAK ROUTINE. WHILE FR.SNK IS ON INCH WILL COPY ALL INPUT VIA BAKPTR | |
1344 | ;WHEN DONE, SNEAK WILL TELL INCH THAT THE PREVIOUS INPUT IS NOW A MACRO | |
1345 | ;IN EFFECT, NO INPUT WAS DONE (EXCEPT THAT TOK CONTAINS THE NEXT TOKEN) | |
1346 | ||
1347 | SNEAK: TRO F,FR.SNK ;SAY WE'RE SNEAKING AROUND | |
1348 | PUSH P,I | |
1349 | PUSH P,T1 | |
1350 | PUSH P,T2 | |
1351 | MOVE T2,[POINT 7,BAKBUF] ;SET UP POINTER FOR INCH | |
1352 | MOVEM T2,BAKPTR ;SAVE IT | |
1353 | PUSHJ P,TOKEN ;GET TOKEN | |
1354 | MOVEM I,SNEAKI ;SAVE THE BREAK CHARACTER | |
1355 | MOVEI T1,177 | |
1356 | IDPB T1,BAKPTR ;STORE "END OF BAKBUF" | |
1357 | MOVEI T1,1 | |
1358 | IDPB T1,BAKPTR | |
1359 | MOVE T1,MACPDL ;GET MACPDL | |
1360 | HRRZ T2,INVECT ;GET INVECT POINTER | |
1361 | CAIG T2,BAKPTR | |
1362 | CAIGE T2,BAKBUF ;POINTS TO BAKBUF?? (IF SO, DON'T SAVE) | |
1363 | PUSH T1,INVECT ;SAVE OLD POINTER | |
1364 | MOVE T2,[POINT 7,BAKBUF] ;POINT TO BACKUP BUFFER | |
1365 | MOVEM T2,BAKPTR ;HELP OUT THE OTHER FOLKS WHO USE BAKPTR | |
1366 | MOVEM T2,INVECT ;SOURCE IS NOW IN BAKBUF | |
1367 | MOVEM T1,MACPDL ;PUT PDL BACK IN STORAGE | |
1368 | TRZ F,FR.SNK ;DONE SNEAKING | |
1369 | POP P,T2 | |
1370 | POP P,T1 | |
1371 | POP P,I | |
1372 | POPJ P, ;DONE | |
1373 | \fGETNUM: MOVE T3,[POINT 6,TOK] | |
1374 | SETZ T1, ;CLEAR TOTAL | |
1375 | ILDB T2,T3 ;GET THE 1ST CHARACTER | |
1376 | CAIG T2,'9' | |
1377 | CAIGE T2,'0' ;NUMERIC? | |
1378 | JRST SCPOPJ ;NO - SHOULDN'T BE HERE | |
1379 | PUSH P,T4 ;SAVE T4 | |
1380 | PUSH P,I ;AND I | |
1381 | GETN1: JUMPE T2,GETN2 ;END OF TOKEN | |
1382 | MOVE T4,T3 ;SAVE POINTER TO LAST CHAR | |
1383 | ILDB T2,T3 ;GET NEXT CHAR | |
1384 | JRST GETN1 ;LOOP | |
1385 | ||
1386 | GETN2: MOVE T3,T4 ;GET BACK POINTER | |
1387 | LDB T4,T3 ;GET LAST CHARACTER | |
1388 | MOVEI I,^D10 ;ASSUME DECIMAL | |
1389 | CAIE T4,'O' | |
1390 | CAIN T4,'Q' ;OCTAL | |
1391 | MOVEI I,10 | |
1392 | CAIN T4,'H' ;HEX | |
1393 | MOVEI I,20 | |
1394 | CAIN T4,'B' ;BINARY | |
1395 | MOVEI I,2 | |
1396 | CAIE T4,'D' ;GET RID OF THE LAST CHARACTER | |
1397 | CAIN T4,'H' ;IF IT IS A RADIX CHARACTER | |
1398 | DPB T1,T3 | |
1399 | CAIE T4,'Q' | |
1400 | CAIN T4,'O' | |
1401 | DPB T1,T3 | |
1402 | CAIN T4,'B' | |
1403 | DPB T1,T3 | |
1404 | MOVE T3,[POINT 6,TOK] | |
1405 | GETNL: CAMN T3,[600,,TOK+1] | |
1406 | JRST GETNX | |
1407 | ILDB T2,T3 ;GET A CHARACTER | |
1408 | JUMPE T2,GETNX ;DONE. NORMAL RETURN | |
1409 | CAIN T2,'$' ;DUMMY DOLLAR? | |
1410 | JRST GETNL ;YES, IGNORE IT | |
1411 | IMUL T1,I ;SHIFT TOTAL BY RADIX | |
1412 | CAILE T2,'9' ;IF GREATER THAN DECIMAL | |
1413 | SUBI T2,'A'-'9'-1 ;THROW OUT OFFSET | |
1414 | ADDI T1,-20(T2) | |
1415 | JRST GETNL | |
1416 | ||
1417 | GETNX: POP P,I | |
1418 | POP P,T4 | |
1419 | POPJ P, | |
1420 | ||
1421 | ||
1422 | SETARG: MOVE T2,ARGPDL | |
1423 | PUSH T2,ARGPTR ;SAVE CURRENT MACRO'S ARGS | |
1424 | MOVEM T2,ARGPDL | |
1425 | MOVE T1,ARGPTR | |
1426 | ILDB T2,T1 ;SEARCH FOR END OF CURRENT MACRO'S ARGS | |
1427 | SKIPE T2 | |
1428 | JRST .-2 | |
1429 | MOVEM T1,ARGPTR ;SAVE START OF THIS MACRO'S ARGS | |
1430 | POPJ P, | |
1431 | ||
1432 | SETMAC: PUSHJ P,SETARG | |
1433 | SETM00: CAIE I,TAB | |
1434 | CAIN I,SPACE | |
1435 | JRST [PUSHJ P,INCH | |
1436 | JRST SETM00] | |
1437 | CAIA | |
1438 | SETM0: PUSHJ P,INCH | |
1439 | PUSHJ P,BREAK | |
1440 | JRST SETM1 | |
1441 | IDPB I,T1 | |
1442 | JRST SETM0 | |
1443 | \fSETM1: CAIE I,QUOTE | |
1444 | CAIN I,"'" | |
1445 | JRST SETM3 ;DO QUOTED STRING | |
1446 | CAIN I,"<" ;START EXPR? | |
1447 | JRST SETM4 ;YES | |
1448 | STM1.5: PUSH P,I | |
1449 | MOVEI I,177 | |
1450 | IDPB I,T1 | |
1451 | MOVEI I,1 | |
1452 | IDPB I,T1 | |
1453 | POP P,I | |
1454 | CAIN I,"," ;ANOTHER ARG? | |
1455 | JRST SETM0 ;YES | |
1456 | SETM2: SETZ I, | |
1457 | IDPB I,T1 ;END WITH NULL | |
1458 | PUSHJ P,FLUSH | |
1459 | MOVE T1,MACPDL | |
1460 | PUSH T1,INVECT ;SAVE INPUT VECTOR ON SPECIAL STACK | |
1461 | MOVE T2,2(S) ;GET POINTER TO MACRO | |
1462 | HRLI T2,(POINT 7,0) | |
1463 | MOVEM T2,INVECT | |
1464 | MOVEM T1,MACPDL | |
1465 | POPJ P, | |
1466 | ||
1467 | SETM3: MOVEM I,DELIM | |
1468 | IDPB I,T1 | |
1469 | PUSHJ P,INCH | |
1470 | CAIE I,CR | |
1471 | CAIN I,LF | |
1472 | JRST SETM1 | |
1473 | CAME I,DELIM | |
1474 | JRST SETM3 | |
1475 | IDPB I,T1 | |
1476 | JRST STM1.5 | |
1477 | ||
1478 | SETM4: PUSHJ P,INCH | |
1479 | TRNE F,FR.END ;END IS ONLY ABNORMAL EXIT | |
1480 | JRST STM1.5 | |
1481 | CAIN I,">" | |
1482 | JRST [PUSHJ P,INCH | |
1483 | JRST STM1.5] | |
1484 | IDPB I,T1 | |
1485 | JRST SETM4 | |
1486 | \fINCH: PUSH P,T1 ;SAVE T1 | |
1487 | INCH1: MOVE T1,INVECT ;GET VECTOR | |
1488 | CAIN T1,-1 ;DEFAULT TO SOURCE? | |
1489 | JRST INCHS ;YES | |
1490 | CAIN T1,-2 ;DEFAULT TO LIBRARY? | |
1491 | JRST INCHL ;YES | |
1492 | INCHM0: ILDB I,INVECT ;GET CHARACTER FROM MACRO BODY | |
1493 | SKIPN I ;IS THERE A MACRO ARG? | |
1494 | PUSHJ P,DOLSYM ;NEEDS LOCAL SYMBOL HERE | |
1495 | CAIN I,177 | |
1496 | JRST INCHM3 | |
1497 | TRNE F,FR.LIB ;IN MACLIB? | |
1498 | JRST TPOPJ ;YES, FINISHED | |
1499 | HRRZ T1,INVECT ;GET INVECT POINTER | |
1500 | CAIG T1,BAKPTR | |
1501 | CAIGE T1,BAKBUF ;IN MACRO? | |
1502 | TLNN F,FL.SUP ;YES, IS FL.SUP ON? | |
1503 | JRST INCHX ;NO | |
1504 | IDPB I,BAKPTR ;YES, SAVE CHAR HERE | |
1505 | TPOPJ: POP P,T1 | |
1506 | POPJ P, ;SUPPRESS ALL THIS FOOLISHNESS | |
1507 | ||
1508 | INCHM3: ILDB I,INVECT ;GET CODE | |
1509 | CAIE I,1 | |
1510 | CAIN I,2 ;END OF MACRO? | |
1511 | JRST INCHM1 ;YES | |
1512 | CAIN I,3 ;END OF REPT? | |
1513 | JRST INCHM5 ;YES | |
1514 | MOVE T1,MACPDL | |
1515 | PUSH T1,INVECT ;SAVE OLD INVECT | |
1516 | MOVEM T1,MACPDL | |
1517 | MOVE T1,ARGPTR ;INPUT IS FROM MACRO ARGS | |
1518 | MOVEM T1,INVECT | |
1519 | MOVE T1,I ;PUT ARG POSITION IN T1 | |
1520 | ANDI T1,77 | |
1521 | JUMPN T1,INCHM4 ;SKIP SPECIAL TEST IF NOT 1ST ARG | |
1522 | PUSH P,INVECT ;SAVE INPUT VECTOR | |
1523 | ILDB T1,INVECT | |
1524 | CAIN T1,177 ;LOOKING FOR 1ST ARG AND NONE THERE? | |
1525 | PUSHJ P,DOLSYM ;MAKE A LOCAL SYMBOL FOR THE NULL ARG | |
1526 | POP P,INVECT ;RESTORE VECTOR | |
1527 | JRST INCHM0 ;GO DOIT | |
1528 | ||
1529 | INCHM2: JUMPE T1,INCHM0 ;INVECT NOW POINTS TO RIGHT SPOT | |
1530 | INCHM4: ILDB I,INVECT | |
1531 | SKIPN I ;END OF ARGS? | |
1532 | PUSHJ P,DOLSYM ;NEEDS LOCAL SYMBOL HERE | |
1533 | CAIE I,177 ;END OF ARG? | |
1534 | JRST INCHM4 ;NO, LOOP | |
1535 | ILDB I,INVECT ;GET ^A | |
1536 | SOJA T1,INCHM2 ;SEE IF WE'RE AT THE RIGHT SPOT | |
1537 | ||
1538 | INCHM1: MOVE T1,MACPDL | |
1539 | POP T1,INVECT ;RESTORE OLD POINTER | |
1540 | MOVEM T1,MACPDL | |
1541 | CAIE I,2 ;END OF MACRO? | |
1542 | CAIN I,3 | |
1543 | JRST [MOVE T1,ARGPDL ;RESTORE MACRO ARG CONTEXT | |
1544 | POP T1,ARGPTR | |
1545 | MOVEM T1,ARGPDL | |
1546 | JRST INCH1] | |
1547 | JRST INCH1 | |
1548 | ||
1549 | DOLSYM: PUSH P,INVECT ;SAVE THE INPUT VECTOR | |
1550 | MOVEI I,"?" ;START THE SYMBOL WITH "??" | |
1551 | DPB I,INVECT | |
1552 | IDPB I,INVECT | |
1553 | PUSH P,T1 ;SAVE T1 | |
1554 | PUSH P,T2 | |
1555 | MOVE T1,LOCSYM ;GET THE VALUE OF THE LOCAL SYMBOL | |
1556 | PUSHJ P,DOSNUM ;PUT THE NUMBER IN INVECT | |
1557 | AOS LOCSYM ;MAKE NEW SYMBOL VALUE | |
1558 | MOVEI I,177 | |
1559 | IDPB I,INVECT | |
1560 | MOVEI I,1 ;CAP OFF SYMBOL | |
1561 | IDPB I,INVECT | |
1562 | SETZ I, | |
1563 | IDPB I,INVECT | |
1564 | POP P,T2 | |
1565 | POP P,T1 | |
1566 | POP P,INVECT | |
1567 | LDB I,INVECT ;GET FIRST BYTE IN I | |
1568 | POPJ P, | |
1569 | ||
1570 | DOSNUM: IDIVI T1,^D10 ;OUTPUT T1 AS DECIMAL NUMBER | |
1571 | JUMPE T1,.+4 | |
1572 | PUSH P,T2 | |
1573 | PUSHJ P,DOSNUM | |
1574 | POP P,T2 | |
1575 | ADDI T2,60 | |
1576 | IDPB T2,INVECT | |
1577 | POPJ P, | |
1578 | ||
1579 | INCHM5: SOSG REPCNT ;KNOCK DOWN REPT COUNT | |
1580 | JRST INCHM1 | |
1581 | MOVE T2,ARGPTR ;POINT TO ARGS | |
1582 | MOVEI T1,177 ;START NEW REPT WITH A CLEAN START | |
1583 | IDPB T1,T2 | |
1584 | MOVEI T1,1 | |
1585 | IDPB T1,T2 | |
1586 | SETZ T1, | |
1587 | IDPB T1,T2 | |
1588 | MOVE T2,REPADR ;POINT TO REPT | |
1589 | HRLI T2,(POINT 7,0) | |
1590 | MOVEM T2,INVECT | |
1591 | JRST INCHM0 ;DOIT OVER AGAIN | |
1592 | ||
1593 | \fINCHL: POP P,T1 | |
1594 | INCHL1: SOSGE MBUF+2 | |
1595 | JRST INCHL2 | |
1596 | ILDB I,MBUF+1 | |
1597 | JUMPE I,INCHL1 | |
1598 | TRNE F,FR.SNK ;IF SNEAKING, | |
1599 | IDPB I,BAKPTR ;SAVE CHARACTER | |
1600 | POPJ P, ;JUST RETURN WITHOUT LISTING | |
1601 | ||
1602 | INCHL2: IN LIB, | |
1603 | JRST INCHL1 | |
1604 | CLOSE LIB, | |
1605 | TRZ F,FR.LIB ;FLAG END OF MACLIB | |
1606 | PUSH P,T1 | |
1607 | MOVE T1,MACPDL | |
1608 | POP T1,INVECT ;RESTORE ORIGINAL INVECT BEFORE MACLIB | |
1609 | POP P,T1 | |
1610 | JRST INCH ;AND GET ANOTHER CHARACTER | |
1611 | ||
1612 | INCHS: SOSGE IBUF+2 | |
1613 | JRST .+3 | |
1614 | ILDB I,IBUF+1 | |
1615 | JRST INCHX | |
1616 | IN SRC, | |
1617 | JRST INCHS | |
1618 | ENDIT: TRZN F,FR.PS1 ;PASS1? | |
1619 | JRST WRAPUP ;NO | |
1620 | TRZ F,FR.END ;TURN OFF END FROM PASS1 (SHOULD ALREADY BE OFF BUT ...) | |
1621 | SETZ E, ;FORGET ALL PASS1 ERRORS | |
1622 | TRZE F,FR.OFF ;ARE WE ASSEMBLING? | |
1623 | WARN W.IF2 ;NO | |
1624 | SETZM IFLEVL | |
1625 | SETZM OFFLVL | |
1626 | MOVE T1,ORGXR ;GET INDEX | |
1627 | MOVEM BC,ORGBLK(T1) ;STORE COUNT | |
1628 | SETZ T1, ;YES | |
1629 | PUSHJ P,OPNOBJ ;OPEN OBJECT DEVICE | |
1630 | SETZM ORGXR ;RESET FOR OUTPUT | |
1631 | MOVE T2,[POINT 7,TITL] | |
1632 | PUSHJ P,NOALT3 | |
1633 | MOVE T2,[POINT 7,SUBTTL] | |
1634 | PUSHJ P,NOALT3 | |
1635 | ||
1636 | \fNOALT1: PUSHJ P,HEXHED ;DO HEDDER | |
1637 | MOVE T1,FILNAM## | |
1638 | MOVE T2,FILEXT## | |
1639 | SETZ T3, | |
1640 | MOVE T4,PPN## | |
1641 | LOOKUP SRC,T1 | |
1642 | JRST NOFILE## | |
1643 | JRST RESTAR | |
1644 | ||
1645 | NOALT3: ILDB T1,T2 | |
1646 | JUMPN T1,[PUSHJ P,HEXOX | |
1647 | JRST NOALT3] | |
1648 | BCRLF: MOVEI T1,15 | |
1649 | PUSHJ P,HEXOX | |
1650 | MOVEI T1,12 | |
1651 | JRST HEXOX | |
1652 | \fHEXHED: PUSHJ P,BCRLF | |
1653 | IFN FTREL,< | |
1654 | MOVE T1,RELPTR ;GET SIZE OF RELTAB | |
1655 | CAIGE T1,^D15 ;ENOUGH TO DO A LINE? | |
1656 | JRST HEXH2 ;NO | |
1657 | MOVEI T2,^D15 ;YES, DO 15 | |
1658 | PUSHJ P,TYPE04 ;DO RELOCATABLE TYPE | |
1659 | HEXH2:> ;END IFN FTREL | |
1660 | MOVE T4,ORGXR ;GET INDEX | |
1661 | MOVE T1,ORGBLK(T4) ;GET BYTE COUNT LEFT IN BLOCK | |
1662 | SUBI T1,^D30 ;SUBTRACT WHAT WE'RE GOING TO USE | |
1663 | JUMPLE T1,.+4 ;<= 30 | |
1664 | MOVEM T1,ORGBLK(T4) ;SAVE REST | |
1665 | MOVEI T1,^D30 ;30 BYTES | |
1666 | JRST .+3 | |
1667 | MOVE T1,ORGBLK(T4) ;GET WHAT'S LEFT | |
1668 | SETZM ORGBLK(T4) ;FLAG BLOCK EMPTY | |
1669 | MOVEM T1,CHECK | |
1670 | MOVE BC,T1 ;SAVE BYTES TO OUTPUT | |
1671 | JUMPE BC,EOFBYT ;JUMP IF TIME TO DO EOF STUFF | |
1672 | MOVEI T1,":" ;DO TYPE00 HEADER | |
1673 | PUSHJ P,HEXOX | |
1674 | MOVE T1,BC ;GET BYTE COUNT | |
1675 | PUSHJ P,HEXBYT ;OUTPUT BYTE COUNT | |
1676 | MOVE T1,ORGBLK+1(T4) ;GET START ADDRESS OF BLOCK | |
1677 | LSH T1,-10 ;GET HIGH BYTE | |
1678 | ADDM T1,CHECK | |
1679 | PUSHJ P,HEXBYT ;OUTPUT HIGH ADDRESS | |
1680 | MOVE T1,ORGBLK+1(T4) | |
1681 | ADDM T1,CHECK | |
1682 | PUSHJ P,HEXBYT ;OUTPUT LOW BYTE | |
1683 | MOVE T1,ORGBLK+1(T4) | |
1684 | ADD T1,BC ;LAST S.A. + BYTE COUNT | |
1685 | MOVEM T1,ORGBLK+1(T4) ;= NEW S.A. | |
1686 | SETZ T1, ;DATA (TYPE 00) | |
1687 | SKIPN BC ;IF DATA, SKIP | |
1688 | MOVEI T1,1 ;IF EOF, (TYPE 01) | |
1689 | JRST HEXBYT ;OUTPUT RECORD TYPE | |
1690 | \fIFN FTREL,< | |
1691 | TYPE04: TRNE F,FR.ORG ;RELOCATING? | |
1692 | POPJ P, ;NO | |
1693 | MOVEI T1,DOLLAR ;FLAG NON-INTEL RECORD | |
1694 | PUSHJ P,HEXOX | |
1695 | MOVE T1,T2 ;GET WORD COUNT | |
1696 | IMULI T1,2 ;MAKE BYTE COUNT | |
1697 | MOVEM T1,CHECK ;CHECKSUM | |
1698 | PUSHJ P,HEXBYT ;OUTPUT | |
1699 | SETZ T1, ;NO START ADDRESS | |
1700 | PUSHJ P,HEXBYT | |
1701 | PUSHJ P,HEXBYT | |
1702 | MOVEI T1,4 ;TYPE 04 (RELOCATABLE) | |
1703 | ADDM T1,CHECK | |
1704 | PUSHJ P,HEXBYT | |
1705 | SETZ T3, ;ZERO XR | |
1706 | T04.1: MOVE T1,RELTAB(T3) ;GET ADDRESS | |
1707 | LSH T1,-10 | |
1708 | ADDM T1,CHECK | |
1709 | PUSHJ P,HEXBYT | |
1710 | MOVE T1,RELTAB(T3) ;GET LO ADDRESS | |
1711 | ANDI T1,377 | |
1712 | ADDM T1,CHECK | |
1713 | PUSHJ P,HEXBYT | |
1714 | AOJ T3, | |
1715 | SOJG T2,T04.1 ;LOOP | |
1716 | MOVE T1,CHECK | |
1717 | ANDI T1,377 | |
1718 | MOVNS T1 | |
1719 | PUSHJ P,HEXBYT ;OUTPUT CHECKSUM | |
1720 | PUSHJ P,BCRLF ;CRLF | |
1721 | ||
1722 | ;SHUFFLE CONTENTS OF RELTAB BACK TO BOTTOM | |
1723 | SETZ T2, | |
1724 | SKIPN T1,RELTAB(T3) | |
1725 | JRST T04.2 | |
1726 | MOVEM T1,RELTAB(T2) | |
1727 | AOJ T2, | |
1728 | AOJA T3,.-4 | |
1729 | ||
1730 | T04.2: MOVEM T2,RELPTR ;RESET POINTER | |
1731 | MOVSI T3,RELTAB(T2) | |
1732 | HRRI T3,RELTAB+1(T2) | |
1733 | SETZM RELTAB(T2) | |
1734 | BLT T3,RELEND | |
1735 | POPJ P, | |
1736 | > ;END IFN FTREL | |
1737 | \fEOFBYT: | |
1738 | IFN FTREL,< | |
1739 | TRNN F,FR.ORG ;RELOCATING? | |
1740 | SKIPN RELPTR ;RELTAB EMPTY? | |
1741 | JRST DOSYMT ;DO SYMBOL TYPE | |
1742 | MOVE T2,RELPTR ;GET COUNT | |
1743 | CAIL T2,^D15 | |
1744 | MOVEI T2,^D15 ;MAX 15 AT A TIME | |
1745 | PUSHJ P,TYPE04 ;DO A LINE OF TYPE 04 | |
1746 | JRST EOFBYT ;LOOP | |
1747 | ||
1748 | DOSYMT: MOVEI S,SYMTAB ;XR | |
1749 | EOFL: CAIL S,SYMEND ;END ON SYMTAB? | |
1750 | JRST TYPE01 ;YES | |
1751 | SKIPN (S) ;EMPTY? | |
1752 | JRST EOFX ;YES, SKIP | |
1753 | PUSH P,S ;SAVE POINTER | |
1754 | MOVE T3,2(S) | |
1755 | TLNE T3,S.INT!S.EXT ;GOOD STUFF? | |
1756 | PUSHJ P,TYPE02 ;YES | |
1757 | SKIPE S,4(S) | |
1758 | JRST .-4 | |
1759 | POP P,S | |
1760 | EOFX: ADDI S,5 | |
1761 | JRST EOFL ;LOOP | |
1762 | ||
1763 | TYPE02: MOVEI T1,DOLLAR ;TYPE 2 OR 3 LEADER | |
1764 | PUSHJ P,HEXOX | |
1765 | SETZM CHECK | |
1766 | PUSH P,T3 | |
1767 | DMOVE T2,(S) ;GET NAME | |
1768 | MOVE T4,[POINT 6,T2] | |
1769 | T02.1: ILDB T1,T4 ;GET BYTE | |
1770 | ADDI T1,40 ;TO ASCII | |
1771 | ADDM T1,CHECK | |
1772 | PUSHJ P,HEXOX | |
1773 | CAME T4,[600,,T3] ;ALL 12? | |
1774 | JRST T02.1 ;NO | |
1775 | POP P,T3 | |
1776 | TLNE T3,S.INT ;INTERNAL | |
1777 | MOVEI T1,2 ;IS TYPE 02 | |
1778 | TLNE T3,S.EXT ;EXTERNAL | |
1779 | MOVEI T1,3 ;IS TYPE 03 | |
1780 | PUSHJ P,HEXBYT ;OUTPUT SYMBOL TYPE | |
1781 | ADDM T1,CHECK | |
1782 | HRRZ T1,T3 ;GET VALUE | |
1783 | LSH T1,-10 ;GET HIGH PART | |
1784 | ADDM T1,CHECK | |
1785 | PUSHJ P,HEXBYT | |
1786 | HRRZ T1,T3 | |
1787 | ANDI T1,377 | |
1788 | ADDM T1,CHECK | |
1789 | PUSHJ P,HEXBYT | |
1790 | MOVE T1,CHECK | |
1791 | ANDI T1,377 | |
1792 | MOVNS T1 | |
1793 | PUSHJ P,HEXBYT | |
1794 | PUSHJ P,BCRLF | |
1795 | POPJ P, | |
1796 | > ;END IFN FTREL | |
1797 | \fTYPE01: MOVEI T1,":" ;OUTPUT HEADER | |
1798 | PUSHJ P,HEXOX | |
1799 | SETZ T1, ;LENGTH 0 | |
1800 | PUSHJ P,HEXBYT | |
1801 | MOVE T1,STARTA ;GET START ADDRESS | |
1802 | LSH T1,-10 | |
1803 | PUSHJ P,HEXBYT | |
1804 | MOVE T1,STARTA | |
1805 | ANDI T1,377 | |
1806 | PUSHJ P,HEXBYT | |
1807 | MOVEI T1,1 ;TYPE 01 | |
1808 | PUSHJ P,HEXBYT | |
1809 | JRST BCRLF ;CRLF | |
1810 | ||
1811 | INCHX: POP P,T1 | |
1812 | JUMPE I,INCH ;CAST OFF NULLS | |
1813 | TRNE F,FR.SNK ;IF SNEAKING, | |
1814 | JRST [IDPB I,BAKPTR ;SAVE CHARACTER | |
1815 | POPJ P,] ;DON'T PRINT TWICE | |
1816 | TRNE F,FR.PS1 | |
1817 | JRST PAS1IX ;SKIP ALL PROCESSING OF CHARACTER IF PASS1 | |
1818 | SKIPN LBTP | |
1819 | MOVE LBTP,[POINT 7,LINBLK] | |
1820 | CAIE I,FF ;DON'T GO PUTTING FF IN LINBLK! | |
1821 | IDPB I,LBTP | |
1822 | CAIE I,LF ;IF LF, | |
1823 | CAIN I,FF ;OR FF, | |
1824 | CAIA ;SKIP INTO EOL ROUTINE | |
1825 | POPJ P, ;ELSE WE'RE DONE | |
1826 | PUSH P,T1 | |
1827 | PUSH P,T2 | |
1828 | CAIN I,FF | |
1829 | JRST DOFFX ;IF FF, SKIP SOME STUFF | |
1830 | MOVEI T1,TAB | |
1831 | TRNE F,FR.LOP ;IF CODE GENERATED | |
1832 | JRST INCHX1 ;JUST ONE TAB | |
1833 | PUSHJ P,DOLINO ;PRINT LINE # AS A LAST RESORT | |
1834 | TRNE F,FR.HEX | |
1835 | JRST INCHX0 | |
1836 | PUSHJ P,LOUCH | |
1837 | PUSHJ P,LOUCH | |
1838 | INCHX0: PUSHJ P,LOUCH | |
1839 | INCHX1: PUSHJ P,LOUCH | |
1840 | TRZ F,FR.LIN ;CLEAR LINE # PRINTED FLAG FOR NEXT LINE | |
1841 | MOVE LBTP,[POINT 7,LINBLK] | |
1842 | ILDB T1,LBTP | |
1843 | JUMPE T1,CHKERR | |
1844 | PUSHJ P,LOUCH | |
1845 | SKIPE E | |
1846 | OUTCHR T1 | |
1847 | JRST .-5 | |
1848 | \fCHKERR: JUMPE E,NOERR | |
1849 | HLRZ T1,E | |
1850 | OUTCHR T1 | |
1851 | PUSHJ P,LOUCH | |
1852 | MOVE T2,ERRTAB-1(E) | |
1853 | MOVE LBTP,[POINT 7,(T2)] | |
1854 | ILDB T1,LBTP | |
1855 | JUMPE T1,.+4 | |
1856 | PUSHJ P,LOUCH | |
1857 | OUTCHR T1 | |
1858 | JRST .-4 | |
1859 | PUSHJ P,LCRLF | |
1860 | OUTSTR CRLF | |
1861 | SETZ E, | |
1862 | NOERR: SETZM LINBLK | |
1863 | MOVE T1,[LINBLK,,LINBLK+1] | |
1864 | BLT T1,LINEND | |
1865 | SETZ LBTP, | |
1866 | MOVE T1,LINCTR | |
1867 | CAMG T1,PAGESZ ;ON NEW PAGE? | |
1868 | JRST NOFF ;NO | |
1869 | JRST DOFF ;YES, WRITE HEADER | |
1870 | ||
1871 | DOFFX: AOS PAGENO | |
1872 | SETZM SUBPAG ;REAL PAGES HAVE NO SUB PAGE MARK | |
1873 | DOFF: PUSHJ P,DOHDFF ;GO DO THE HEADING | |
1874 | NOFF: POP P,T2 | |
1875 | POP P,T1 | |
1876 | PAS1IX: CAIN I,FF ;IF FF, | |
1877 | JRST INCH ;EAT IT | |
1878 | POPJ P, | |
1879 | ||
1880 | LOUCH: TRNE F,FR.LST ;IF NOT LISTING | |
1881 | TRNE F,FR.PS1 ;OR ON PASS 1 | |
1882 | POPJ P, ;FORGET IT | |
1883 | SOSGE LBUF+2 | |
1884 | JRST LOUCH1 | |
1885 | IDPB T1,LBUF+1 | |
1886 | CAIN T1,LF | |
1887 | AOS LINCTR | |
1888 | ||
1889 | CAIN T1,LF ;LF DOESN'T CHANGE BOL | |
1890 | POPJ P, | |
1891 | TRZ F,FR.BOL ;ASSUME REGULAR CHAR | |
1892 | CAIN T1,CR ;IF CR | |
1893 | TRO F,FR.BOL ;FLAG BOL | |
1894 | POPJ P, | |
1895 | ||
1896 | LOUCH1: OUTPUT LST, | |
1897 | JRST LOUCH | |
1898 | ||
1899 | \fOUTOP: PUSHJ P,LSTPC | |
1900 | MOVE T1,OP | |
1901 | PUSHJ P,LSTOP | |
1902 | POPJ P, ;RETURN | |
1903 | ||
1904 | NOPC: MOVEI T1,TAB | |
1905 | PUSHJ P,LOUCH | |
1906 | TRNN F,FR.HEX | |
1907 | PUSHJ P,LOUCH | |
1908 | MOVE T1,OP | |
1909 | SKIPGE T1 ;IF NEGATIVE | |
1910 | SETZ T1, ;MAKE ZERO | |
1911 | MOVEI T3,6 | |
1912 | TRO F,FR.LOP | |
1913 | PUSHJ P,LSTNUM | |
1914 | TRNE F,FR.HEX | |
1915 | POPJ P, | |
1916 | MOVEI T1,TAB | |
1917 | JRST LOUCH | |
1918 | ||
1919 | HEXOX: SOSL OBUF+2 | |
1920 | JRST [IDPB T1,OBUF+1 | |
1921 | POPJ P,] | |
1922 | OUTPUT OBJ, | |
1923 | JRST HEXOX | |
1924 | ||
1925 | \fHEXOUT: ADDM T1,CHECK | |
1926 | PUSHJ P,HEXBYT | |
1927 | SOJG BC,CPOPJ | |
1928 | PUSH P,T1 | |
1929 | PUSH P,T2 | |
1930 | PUSH P,T3 | |
1931 | PUSH P,T4 | |
1932 | MOVE T1,CHECK | |
1933 | ANDI T1,377 | |
1934 | MOVNS T1 | |
1935 | PUSHJ P,HEXBYT | |
1936 | MOVE T4,ORGXR ;GET INDEX | |
1937 | SKIPN ORGBLK(T4) ;STILL GOOD BYTE COUNT? | |
1938 | ADDI T4,2 ;NEXT BLOCK | |
1939 | MOVEM T4,ORGXR ;SAVE INDEX | |
1940 | PUSHJ P,HEXHED ;DO HEADER | |
1941 | POP P,T4 | |
1942 | POP P,T3 | |
1943 | POP P,T2 | |
1944 | POP P,T1 | |
1945 | POPJ P, | |
1946 | ||
1947 | HEXBYT: PUSH P,T1 | |
1948 | LSH T1,-4 | |
1949 | PUSHJ P,NYBBLE ;OUTPUT HIGH NYBBLE | |
1950 | POP P,T1 | |
1951 | PUSH P,T1 | |
1952 | PUSHJ P,NYBBLE | |
1953 | POP P,T1 | |
1954 | POPJ P, | |
1955 | ||
1956 | NYBBLE: ANDI T1,17 | |
1957 | CAILE T1,^D9 | |
1958 | JRST .+3 | |
1959 | ADDI T1,60 | |
1960 | JRST HEXOX | |
1961 | ADDI T1,"A"-^D10 | |
1962 | JRST HEXOX | |
1963 | ||
1964 | WRAPUP: | |
1965 | IFN FTCREF,< | |
1966 | PUSHJ P,PRTSYM ;PRINT SYMBOL TABLE | |
1967 | > | |
1968 | RELEAS SYM, | |
1969 | RELEAS LST, | |
1970 | RELEAS OBJ, | |
1971 | IFN FTSTAT,< | |
1972 | TLNE F,FL.LNR ;LIST NON-REF SYMBOLS? | |
1973 | PUSHJ P,REFLOP ;YES | |
1974 | > | |
1975 | AND F,[XWD FL.CCL,0];CLEAR ALL FLAGS BUT FL.CCL | |
1976 | JRST START## | |
1977 | \fIFN FTSTAT,< | |
1978 | ||
1979 | ;PRINT ALL DEFINED BUT NOT REFERENCED SYMBOLS | |
1980 | ||
1981 | REFLOP: MOVEI S,SYMTAB | |
1982 | RLOOP4: CAIN S,SYMEND ;END OF TABLE? | |
1983 | POPJ P, ;DONE | |
1984 | SKIPN (S) ;IF EMPTY | |
1985 | JRST RLOOP5 ;GET NEXT | |
1986 | PUSH P,S ;SAVE IT | |
1987 | PUSHJ P,RLINK ;RUN OUT THIS BRANCH | |
1988 | POP P,S ;DONE | |
1989 | RLOOP5: ADDI S,5 ;GET NEXT | |
1990 | JRST RLOOP4 ;LOOP | |
1991 | ||
1992 | RLINK: MOVE T2,2(S) | |
1993 | TLNN T2,S.REF!S.MAC ;IS SYMBOL REFERENCED OR A MACRO? | |
1994 | JRST RLOOP0 ;NO | |
1995 | RLOOP: SKIPN S,4(S) ;IS THERE A LINK? | |
1996 | POPJ P, ;NO | |
1997 | JRST RLINK | |
1998 | ||
1999 | RLOOP0: SKIPN (S) | |
2000 | JRST RLOOP | |
2001 | TRON F,FL.HED | |
2002 | OUTSTR [ASCIZ/Unreferenced labels: | |
2003 | /] | |
2004 | MOVE T4,[POINT 6,(S)] | |
2005 | RLOOP1: ILDB T2,T4 | |
2006 | JUMPE T2,RLOOP2 | |
2007 | ADDI T2,40 | |
2008 | OUTCHR T2 | |
2009 | CAME T4,[600+S,,1] | |
2010 | JRST RLOOP1 | |
2011 | RLOOP2: OUTSTR [ASCIZ/ | |
2012 | /] | |
2013 | JRST RLOOP | |
2014 | > ;END IFN FTSTAT | |
2015 | \fIFN FTCREF,< | |
2016 | PRTSYM: SKIPN CREFSW ;CREF? | |
2017 | SKIPE SYMBSW ;OR SYMBOL FILE? | |
2018 | CAIA ;YES, SKIP | |
2019 | POPJ P, ;DON'T BE SILLY THEN | |
2020 | SETZB BC,E ;CLEAR COUNTER | |
2021 | SETOM PAGENO ;FLAG SYMBOL TABLE PAGE | |
2022 | MOVEI T1,1 ;SYMBOL TABLE ALWAYS STARTS WITH SUBPAGE | |
2023 | MOVEM T1,SUBPAG ;NUMBER 1 | |
2024 | SKIPE CREFSW ;CREF? | |
2025 | PUSHJ P,DOHDFX ;PRINT NEW HEADER | |
2026 | PRTS: HRLOI T1,377777 ;+INFINITY | |
2027 | SETZ P1, | |
2028 | MOVEI S,SYMTAB | |
2029 | PRT0: SKIPN (S) ;EMPTY? | |
2030 | AOJA P1,PRT1 ;YES | |
2031 | PUSH P,S ;SAVE S | |
2032 | PUSHJ P,PRT10 ;CHECK OUT THIS BRANCH | |
2033 | POP P,S | |
2034 | PRT1: ADDI S,5 ;NEXT LINK | |
2035 | CAIE S,SYMEND ;ALL DONE? | |
2036 | JRST PRT0 ;NO, LOOP | |
2037 | SKIPE T1 ;QUIT IF WE GOT TO BLANK SYMBOLS | |
2038 | CAMN T1,[377777,,-1] ;NO SYMBOLS SMALLER THAN +INFINITY? | |
2039 | JRST PRTX ;DONE | |
2040 | AOJ BC, ;COUNT IT | |
2041 | MOVE S,T2 | |
2042 | SKIPN CREFSW ;IF NOT CREF | |
2043 | JRST PRT1B ;DON'T PRINT STUFF | |
2044 | DMOVE T2,(S) ;GET SMALLEST SYMBOL | |
2045 | PUSHJ P,PUTSIX ;FOR LISTING | |
2046 | MOVEI T1,TAB | |
2047 | PUSHJ P,LOUCH | |
2048 | MOVE T1,2(S) ;GET FLAGS,VALUE | |
2049 | TLNE T1,S.UNDF ;UNDEFINED? | |
2050 | JRST [MOVEI T2,[ASCIZ/Undf/] | |
2051 | PUSHJ P,PUTSTR | |
2052 | JRST PRT4] | |
2053 | TLNE T1,S.MAC | |
2054 | JRST [MOVEI T2,[ASCIZ/Macro/] | |
2055 | PUSHJ P,PUTSTR | |
2056 | JRST PRT4] | |
2057 | HRRZ T1,2(S) ;JUST VALUE | |
2058 | MOVEI T3,6 | |
2059 | PUSHJ P,LSTNUM ;PRINT IT | |
2060 | PRT1B: SKIPN SYMBSW ;DOING SYMBOL FILE? | |
2061 | JRST PRT4 ;NO | |
2062 | MOVE T1,SYMTYP ;GET 10 OR 20 | |
2063 | JUMPE T1,PRT1A ;NEITHER, START OF FILE | |
2064 | ADD T1,SYMCNT | |
2065 | ANDI T1,7770 ;CUT TO TAB STOP | |
2066 | MOVEM T1,SYMCNT | |
2067 | CAIL T1,MAXSYM ;GOT TO END OF LINE? | |
2068 | JRST [PUSHJ P,SCRLF | |
2069 | SETZM SYMCNT | |
2070 | JRST PRT1A] | |
2071 | MOVEI T1,TAB ;END WITH A TAB | |
2072 | PUSHJ P,SOUCH | |
2073 | MOVEI T1,TAB | |
2074 | MOVE T2,SYMTYP ;GET TYPE | |
2075 | CAIN T2,20 ;NEED 2 TABS? | |
2076 | PUSHJ P,SOUCH ;YES | |
2077 | PRT1A: HRRZ T1,2(S) ;GET FLAGS,VALUE | |
2078 | PUSHJ P,SYMNUM | |
2079 | MOVEI T1,SPACE | |
2080 | PUSHJ P,SOUCH | |
2081 | MOVEI T1,5 ;COUNT 4 DIGITS AND A SPACE | |
2082 | ADDM T1,SYMCNT | |
2083 | DMOVE T2,(S) ;GET SMALLEST SYMBOL | |
2084 | PUSHJ P,PUTSSX ;FOR SYMBOL FILE | |
2085 | MOVEI T1,10 ;ACCOUNT FOR TAB | |
2086 | MOVE T2,(S) ;CHECK FOR SHORT SYMBOLS | |
2087 | TLNN T2,77 ;1 OR 2 CHAR SYMBOL? | |
2088 | MOVEI T1,20 ;YES | |
2089 | MOVE T2,1(S) ;CHECK FOR LONG SYMBOLS | |
2090 | TRNE T2,77 ;12 CHAR SYMBOL? | |
2091 | MOVEI T1,20 ;YES | |
2092 | MOVEM T1,SYMTYP ;SAVE 'TYPE' 10 (NORMAL) OR 20 (SHORT OR LONG) | |
2093 | IFN FTREL,< | |
2094 | SETZ T1, | |
2095 | MOVE T2,2(S) ;GET FLAGS | |
2096 | TLNE T2,S.REL | |
2097 | MOVEI T1,"'" ;FLAG RELOC | |
2098 | TLNE T2,S.EXT!S.INT | |
2099 | MOVEI T1,"*" | |
2100 | SKIPE T1 | |
2101 | PUSHJ P,LOUCH | |
2102 | > ;END IFN FTREL | |
2103 | \fPRT4: SKIPN CREFSW ;IF NOT CREF | |
2104 | JRST PRT9A ;JUST FLAG SYMBOL AND LOOP | |
2105 | MOVE T2,3(S) ;GET LINE,,LINK | |
2106 | PRT3: MOVEI T4,^D13 ;MAX ENTRIES/LINE | |
2107 | PRT2: PUSH P,T2 | |
2108 | MOVEI T1,TAB | |
2109 | PUSHJ P,LOUCH | |
2110 | HLRZS T2 | |
2111 | TRZ T2,(1B0) ;CLEAR FLAG | |
2112 | MOVEI T1,SPACE | |
2113 | CAIG T2,^D999 | |
2114 | PUSHJ P,LOUCH | |
2115 | CAIG T2,^D99 | |
2116 | PUSHJ P,LOUCH | |
2117 | CAIG T2,^D9 | |
2118 | PUSHJ P,LOUCH | |
2119 | MOVE T1,T2 | |
2120 | PUSHJ P,PUTDEC | |
2121 | POP P,T2 | |
2122 | TLNN T2,(1B0) ;FLAG? | |
2123 | JRST .+3 ;NO | |
2124 | MOVEI T1,"#" | |
2125 | PUSHJ P,LOUCH | |
2126 | HRRZS T2 ;GET LINK | |
2127 | JUMPE T2,PRT9 ;DONE WITH CHAIN | |
2128 | MOVE T2,(T2) ;GET LINE,,LINK | |
2129 | SOJG T4,PRT2 ;LOOP FOR LINE | |
2130 | PUSHJ P,LCRLF ;END THE LINE | |
2131 | MOVE T1,LINCTR | |
2132 | CAMLE T1,PAGESZ ;IF ON NEW PAGE, | |
2133 | PUSHJ P,DOHDFF ;DO HEADER | |
2134 | MOVEI T1,TAB | |
2135 | PUSHJ P,LOUCH | |
2136 | PUSHJ P,LOUCH | |
2137 | JRST PRT3 | |
2138 | ||
2139 | PRT9: PUSHJ P,LCRLF | |
2140 | MOVE T1,LINCTR | |
2141 | CAMLE T1,PAGESZ ;IF ON NEW PAGE, | |
2142 | PUSHJ P,DOHDFF ;DO HEADER | |
2143 | PRT9A: MOVE T3,2(S) ;GET FLAGS | |
2144 | TLO T3,S.PRT ;FLAG SYMBOL PRINTED | |
2145 | MOVEM T3,2(S) | |
2146 | JRST PRTS | |
2147 | \fPRTX: | |
2148 | SKIPE SYMBSW ;IF SYMBOLS | |
2149 | PUSHJ P,SCRLF ;DO CRLF | |
2150 | SKIPN CREFSW ;IF NOT CREF | |
2151 | POPJ P, ;EXIT | |
2152 | IFN FTSTAT,< | |
2153 | PUSHJ P,LCRLF ;NEW LINE | |
2154 | MOVE T1,BC ;GET COUNT OF SYMBOLS USED | |
2155 | PUSHJ P,PUTDEC | |
2156 | MOVEI T2,[ASCIZ/ symbols used | |
2157 | /] | |
2158 | PUSHJ P,PUTSTR | |
2159 | MOVE T1,P1 | |
2160 | PUSHJ P,PUTDEC | |
2161 | MOVEI T2,[ASCIZ/ empty slots in SYMTAB | |
2162 | /] | |
2163 | PUSHJ P,PUTSTR | |
2164 | CAIG E,1 | |
2165 | POPJ P, | |
2166 | MOVE T1,E | |
2167 | PUSHJ P,PUTDEC | |
2168 | MOVEI T2,[ASCIZ/ links in longest symbol search/] | |
2169 | PUSHJ P,PUTSTR | |
2170 | > ;END IFN FTSTAT | |
2171 | JRST LCRLF ;CRLF | |
2172 | ||
2173 | PRT10: SETZ T4, ;COUNT OF LINKS IN THIS BRANCH | |
2174 | MOVE T3,2(S) ;GET FLAGS | |
2175 | TLNE T3,S.PRT ;WAS ALREADY USED? | |
2176 | JRST PRT11 ;YES | |
2177 | CAMG T1,(S) ;GET SYMBOL THAT IS SMALLER | |
2178 | JRST PRT11 ;(YES, WE ARE ONLY SORTING ON THE FIRST 6 CHARACTERS) | |
2179 | MOVE T2,S ;SAVE INDEX OF LEAST ALPHABETICAL SYMBOL | |
2180 | MOVE T1,(S) ;NEW MATCH SYMBOL | |
2181 | PRT11: AOJ T4, | |
2182 | SKIPE S,4(S) ;GET NEXT LINK | |
2183 | JRST PRT10+1 ;GO ON | |
2184 | CAMLE T4,E ;GT MAX? | |
2185 | MOVE E,T4 ;NEW MAX | |
2186 | POPJ P, ;NO LINK | |
2187 | > ;END IFN FTCREF | |
2188 | \fLSTNUM: TRNE F,FR.HEX ;HEX OUTPUT? | |
2189 | JRST LSTHEX ;YES | |
2190 | IDIVI T1,10 ;NO | |
2191 | SOJLE T3,.+4 | |
2192 | PUSH P,T2 | |
2193 | PUSHJ P,LSTNUM | |
2194 | POP P,T2 | |
2195 | MOVEI T1,60(T2) | |
2196 | LSTN1: PUSHJ P,LOUCH | |
2197 | POPJ P, | |
2198 | ||
2199 | ||
2200 | LSTHEX: IMULI T3,2 ;MULT BY 2/3 | |
2201 | PUSH P,T4 | |
2202 | IDIVI T3,3 | |
2203 | POP P,T4 | |
2204 | LSTH1: IDIVI T1,20 | |
2205 | SOJLE T3,LSTH2 | |
2206 | PUSH P,T2 | |
2207 | PUSHJ P,LSTH1 | |
2208 | POP P,T2 | |
2209 | LSTH2: CAILE T2,11 | |
2210 | JRST LSTH3 | |
2211 | MOVEI T1,60(T2) | |
2212 | JRST LSTN1 | |
2213 | ||
2214 | LSTH3: MOVEI T1,"A"-^D10(T2) | |
2215 | JRST LSTN1 | |
2216 | ||
2217 | SYMNUM: MOVEI T3,4 | |
2218 | SYMH1: IDIVI T1,20 | |
2219 | SOJLE T3,SYMH2 | |
2220 | PUSH P,T2 | |
2221 | PUSHJ P,SYMH1 | |
2222 | POP P,T2 | |
2223 | SYMH2: CAILE T2,11 | |
2224 | JRST SYMH3 | |
2225 | MOVEI T1,60(T2) | |
2226 | CAIA | |
2227 | SYMH3: MOVEI T1,"A"-^D10(T2) | |
2228 | SOUCH: SOSGE SBUF+2 | |
2229 | JRST SOUCH1 | |
2230 | IDPB T1,SBUF+1 | |
2231 | POPJ P, | |
2232 | SOUCH1: OUTPUT SYM, | |
2233 | JRST SOUCH | |
2234 | ||
2235 | SCRLF: MOVEI T1,CR | |
2236 | PUSHJ P,SOUCH | |
2237 | MOVEI T1,LF | |
2238 | JRST SOUCH | |
2239 | \f;LSTPC LIST THE PC AND A TAB | |
2240 | ||
2241 | LSTPC: TRNE F,FR.PS1 ;PASS1? | |
2242 | POPJ P, ;YES | |
2243 | PUSHJ P,DOLINO ;IN CASE AT DC? | |
2244 | TRZ F,FR.LIN ;LISTING PC CLEARS FR.LIN | |
2245 | MOVEI T3,6 | |
2246 | MOVE T1,PC | |
2247 | PUSHJ P,LSTNUM | |
2248 | TRNE F,FR.HEX ;HEX? | |
2249 | JRST LSTPC1 ;YES | |
2250 | MOVEI T1,"=" | |
2251 | PUSHJ P,LOUCH | |
2252 | MOVEI T3,3 ;3 FIGURES | |
2253 | MOVE T1,PC ;GET PC | |
2254 | LSH T1,-10 | |
2255 | PUSHJ P,LSTNUM ;OUTPUT THE PC | |
2256 | MOVEI T1,"/" | |
2257 | PUSHJ P,LOUCH | |
2258 | MOVE T1,PC | |
2259 | ANDI T1,377 | |
2260 | MOVEI T3,3 | |
2261 | PUSHJ P,LSTNUM | |
2262 | LSTPC1: | |
2263 | IFN FTREL,< | |
2264 | TRNE F,FR.ORG ;RELOCATING? | |
2265 | JRST LSTPC2 ;NO | |
2266 | MOVEI T1,"'" | |
2267 | PUSHJ P,LOUCH | |
2268 | > ;END IFN FTREL | |
2269 | LSTPC2: MOVEI T1,TAB | |
2270 | PUSHJ P,LOUCH ;OUTPUT ANOTHER TAB | |
2271 | POPJ P, | |
2272 | ||
2273 | LCRLF: TRNE F,FR.PS1 | |
2274 | POPJ P, | |
2275 | MOVEI T1,CR | |
2276 | PUSHJ P,LOUCH | |
2277 | MOVEI T1,LF | |
2278 | JRST LOUCH | |
2279 | \f;LSTOP ENTER THE BYTE IN T1 IN THE OBJ FILE | |
2280 | ; PRINT THE BYTE [AND A SPACE IF OCT] | |
2281 | ||
2282 | LSTOP: TRNE F,FR.PS1 | |
2283 | JRST LSTOP1 | |
2284 | TRO F,FR.LOP | |
2285 | MOVEI T3,3 | |
2286 | PUSH P,T2 | |
2287 | ANDI T1,377 | |
2288 | PUSHJ P,HEXOUT | |
2289 | PUSHJ P,LSTNUM ;OUTPUT BYTE | |
2290 | MOVEI T1,SPACE | |
2291 | TRNN F,FR.HEX | |
2292 | PUSHJ P,LOUCH | |
2293 | POP P,T2 | |
2294 | LSTOP1: AOS PC | |
2295 | TRNE F,FR.PS1 | |
2296 | AOJ BC, | |
2297 | POPJ P, | |
2298 | ||
2299 | DOTAG: TRO F,FR.NRF ;DEFINITION IS NOT REFERENCE | |
2300 | PUSHJ P,EVAL | |
2301 | PUSHJ P,SYMDEF ;FLAG DEFINITION | |
2302 | HRRZS T1 ;CLEAR FLAGS | |
2303 | CAME T1,PC | |
2304 | ERROR F.MULT | |
2305 | JRST DUNTAG | |
2306 | ||
2307 | SYMDEF: TRNE F,FR.PS1 ;PASS1? | |
2308 | POPJ P, ;YES | |
2309 | TRNN F,FR.LST ;LISTING? | |
2310 | POPJ P, ;NO | |
2311 | CAIGE S,SYMTAB ;POINTS TO SYMTAB? | |
2312 | POPJ P, ;NO. PROB POINTS TO PRETAB | |
2313 | PUSH P,T1 | |
2314 | PUSH P,T2 | |
2315 | MOVE T1,3(S) ;GET LINE,,LINK | |
2316 | MOVEI T2,3(S) ;GET 1ST POINTER | |
2317 | DEFS0: TRNN T1,-1 ;END OF CHAIN? | |
2318 | JRST DEFS1 ;YES | |
2319 | MOVE T2,T1 | |
2320 | MOVE T1,(T2) ;LINK | |
2321 | JRST DEFS0 ;LOOP | |
2322 | ||
2323 | DEFS1: TLO T1,(1B0) ;FLAG DEFINITION | |
2324 | MOVEM T1,(T2) ;PUT BACK | |
2325 | POP P,T2 | |
2326 | POP P,T1 | |
2327 | POPJ P, | |
2328 | \f | |
2329 | DOHDFF: SKIPN PAGESZ ;IF PAGE = 0 | |
2330 | POPJ P, ;DON'T DO ANY HEADERS | |
2331 | DOHDFX: MOVEI T1,FF | |
2332 | PUSHJ P,LOUCH ;FORCE NEW PAGE | |
2333 | DOHEAD: PUSH P,T1 ;SAVE ACS | |
2334 | PUSH P,T2 | |
2335 | PUSH P,T3 | |
2336 | MOVEI T1,1 | |
2337 | MOVEM T1,LINCTR ;SET LINE COUNT TO 1 | |
2338 | MOVE T2,[POINT 7,TITL] | |
2339 | MOVEI T3,^D66 | |
2340 | ILDB T1,T2 | |
2341 | JUMPE T1,.+3 | |
2342 | PUSHJ P,LOUCH | |
2343 | SOJG T3,.-3 | |
2344 | MOVEI T1,11 ;LOAD A <TAB> | |
2345 | SKIPE TITL ;NOT IF NO TITLE | |
2346 | PUSHJ P,LOUCH ;OUTPUT IT | |
2347 | MOVEI T2,HEAD0 | |
2348 | PUSHJ P,PUTSTR | |
2349 | MOVEI T2,M80VER | |
2350 | PUSHJ P,PUTOCT | |
2351 | MOVEI T1,M80MIN | |
2352 | JUMPE T1,.+3 | |
2353 | MOVEI T1,"@"(T1) | |
2354 | PUSHJ P,LOUCH | |
2355 | MOVEI T1,"(" | |
2356 | PUSHJ P,LOUCH | |
2357 | MOVEI T2,M80EDT | |
2358 | PUSHJ P,PUTOCT | |
2359 | MOVEI T2,[ASCIZ/) /] | |
2360 | PUSHJ P,PUTSTR | |
2361 | SKIPL PAGENO | |
2362 | MOVEI T2,HEAD1 | |
2363 | SKIPG PAGENO | |
2364 | MOVEI T2,HEAD3 | |
2365 | PUSHJ P,PUTSTR | |
2366 | MOVEI T2,DATE ;SO WHAT IF WE STARTED AT 11:59 DEC 31 | |
2367 | PUSHJ P,PUTSTR ;WE STILL USE THE DATE OF THE START OF THE RUN | |
2368 | MOVEI T2,HEAD2 | |
2369 | PUSHJ P,PUTSTR | |
2370 | SKIPL T1,PAGENO | |
2371 | PUSHJ P,PUTDEC | |
2372 | SKIPL PAGENO | |
2373 | JRST .+3 | |
2374 | MOVEI T1,"S" ;INDICATE SYMBOL TABLE PAGE | |
2375 | PUSHJ P,LOUCH | |
2376 | SKIPN SUBPAG | |
2377 | JRST NOSUB | |
2378 | MOVEI T1,"-" | |
2379 | PUSHJ P,LOUCH | |
2380 | MOVE T1,SUBPAG | |
2381 | PUSHJ P,PUTDEC | |
2382 | NOSUB: AOS SUBPAG ;BUMP SUBPAGE COUNTER HERE | |
2383 | PUSHJ P,LCRLF | |
2384 | \f MOVE T2,[POINT 6,FILNAM] ;LOAD THE SOURCE FILE NAME | |
2385 | DOH1: ILDB T1,T2 | |
2386 | JUMPE T1,.+5 | |
2387 | ADDI T1,40 | |
2388 | PUSHJ P,LOUCH | |
2389 | TLNE T2,770K | |
2390 | JRST DOH1 | |
2391 | MOVEI T1,"." ;LOAD A "." | |
2392 | PUSHJ P,LOUCH ;AND OUTPUT IT | |
2393 | HLLZ T2,FILEXT ;LOAD THE SOURCE FILE EXT. | |
2394 | SETZ T3, | |
2395 | PUSHJ P,PUTSIX ;PRINT IT | |
2396 | PUSHJ P,LCRLF | |
2397 | PUSHJ P,LCRLF | |
2398 | POP P,T3 | |
2399 | POP P,T2 | |
2400 | POP P,T1 | |
2401 | POPJ P, | |
2402 | ||
2403 | PUTSTR: HRLI T2,(POINT 7,0) ;MAKE A BTP | |
2404 | ILDB T1,T2 ;LOAD THE BYTE | |
2405 | JUMPE T1,CPOPJ ;IF LAST BYTE, RETURN | |
2406 | PUSHJ P,LOUCH ;OUTPUT IT | |
2407 | JRST .-3 ;AND LOOP | |
2408 | ||
2409 | PUTOCT: MOVE T3,[POINT 3,T2] ;LOAD THE BTP | |
2410 | ILDB T1,T3 ;LOAD THE BYTE | |
2411 | JUMPE T1,.-1 ;IGNORE LEADING ZEROS | |
2412 | CAIA | |
2413 | ILDB T1,T3 | |
2414 | ADDI T1,60 ;MAKE IT ASCII | |
2415 | PUSHJ P,LOUCH ;OUTPUT IT | |
2416 | TLNE T3,770K ;LAST BYTE? | |
2417 | JRST .-4 ;NO, THEN LOOP | |
2418 | POPJ P, ;YES, RETURN | |
2419 | ||
2420 | PUTDEC: IDIVI T1,^D10 ;DIVIDE BY RADIX | |
2421 | JUMPE T1,.+4 ;IF NULL, DO RETURN LOOP | |
2422 | PUSH P,T2 ;SAVE T2 | |
2423 | PUSHJ P,PUTDEC ;RECURSIVE CALL | |
2424 | POP P,T2 ;RESTORE T2 | |
2425 | MOVEI T1,60(T2) ;MAKE ASCII | |
2426 | JRST LOUCH ;OUTPUT AND LOOP RETURN | |
2427 | ||
2428 | CRLF: ASCIZ/ | |
2429 | / | |
2430 | HEAD0: ASCIZ \MAC80 \ | |
2431 | HEAD1: ASCIZ \8085 Cross Assembler \ | |
2432 | HEAD2: ASCIZ \ Page \ | |
2433 | HEAD3: ASCIZ \Symbol Table \ | |
2434 | \fGTDATE: MOVE T3,[POINT 7,DATE] | |
2435 | PUSH P,I ;SAVE I | |
2436 | MOVE T1,[60,,11] ;LOAD THE DAY | |
2437 | GETTAB T1, ;NOW | |
2438 | JRST IPOPJ ;PA1050 DIES ON THIS GETTAB | |
2439 | PUSHJ P,GETDEC ;MAKE DECIMAL ASCII | |
2440 | MOVEI T1,"-" | |
2441 | IDPB T1,T3 ;DEPOSIT A HYPHEN | |
2442 | MOVE I,[57,,11] ;LOAD THE MONTH | |
2443 | GETTAB I, | |
2444 | JFCL | |
2445 | MOVE T2,[POINT 7,MONTAB-1(I)] ;SET BTP | |
2446 | ILDB T1,T2 ;LOAD THE BYTE | |
2447 | JUMPE T1,.+3 | |
2448 | IDPB T1,T3 ;DEPOSIT THE BYTE | |
2449 | JRST .-3 ;AND LOOP | |
2450 | MOVEI T1,"-" | |
2451 | IDPB T1,T3 ;DEPOSIT ANOTHER BYTE | |
2452 | MOVE T1,[56,,11] ;LOAD THE YEAR | |
2453 | GETTAB T1, | |
2454 | JFCL | |
2455 | SUBI T1,^D1900 ;LAST TWO ONLY | |
2456 | PUSHJ P,GETDEC ;DEPOSIT IT | |
2457 | MOVEI T1,SPACE ;LOAD AND OUTPUT A SPACE | |
2458 | IDPB T1,T3 | |
2459 | IDPB T1,T3 ;2 SPACES | |
2460 | MOVE T1,[61,,11] ;LOAD THE HOUR | |
2461 | GETTAB T1, | |
2462 | JFCL | |
2463 | PUSHJ P,GETDEC ;AND DEPOSIT IT | |
2464 | MOVEI T1,":" ;LOAD AND OUTPUT A COLON | |
2465 | IDPB T1,T3 | |
2466 | MOVE T1,[62,,11] ;LOAD MINUTES | |
2467 | GETTAB T1, | |
2468 | JFCL | |
2469 | CAIL T1,^D10 ;TWO DIGITS? | |
2470 | JRST .+5 ;YES, THEN DO IT | |
2471 | PUSH P,T1 ;SAVE T1 | |
2472 | MOVEI T1,"0" ;LOAD AND OUTPUT A ZERO | |
2473 | IDPB T1,T3 | |
2474 | POP P,T1 ;RESTORE T1 | |
2475 | PUSHJ P,GETDEC ;AND OUTPUT IT | |
2476 | IPOPJ: POP P,I ;RESTORE I | |
2477 | POPJ P, ;RETURN | |
2478 | ||
2479 | GETDEC: IDIVI T1,^D10 ;DIVIDE BY RADIX | |
2480 | JUMPE T1,.+4 ;IF DONE, JUMP OUT OF LOOP | |
2481 | PUSH P,T2 ;SAVE T2 | |
2482 | PUSHJ P,GETDEC ;AND LOOP | |
2483 | POP P,T2 ;RESTORE T2 | |
2484 | MOVEI T1,60(T2) ;MAKE ASCII | |
2485 | IDPB T1,T3 ;DEPOSIT IT | |
2486 | POPJ P, ;LOOP RETURN | |
2487 | \fPUTSIX: MOVE T4,[POINT 6,T2] | |
2488 | ILDB T1,T4 | |
2489 | ADDI T1,40 | |
2490 | PUSHJ P,LOUCH | |
2491 | CAME T4,[600,,T3] | |
2492 | JRST .-4 | |
2493 | POPJ P, | |
2494 | ||
2495 | PUTSSX: MOVE T4,[POINT 6,T2] | |
2496 | ILDB T1,T4 | |
2497 | JUMPE T1,CPOPJ | |
2498 | ADDI T1,40 | |
2499 | PUSHJ P,SOUCH | |
2500 | AOS SYMCNT | |
2501 | CAME T4,[600,,T3] | |
2502 | JRST PUTSSX+1 | |
2503 | POPJ P, | |
2504 | ||
2505 | DOLINO: TROE F,FR.LIN ;ALREADY PRINTED? | |
2506 | POPJ P, ;YES, DONE | |
2507 | PUSH P,T1 | |
2508 | PUSH P,T2 | |
2509 | TRNN F,FR.BOL ;AT START OF LINE? | |
2510 | PUSHJ P,LCRLF ;FIXUP BUG IN DC LOGIC (HORRORS) | |
2511 | MOVE T1,LINCTR ;GET LINE COUNT | |
2512 | CAMLE T1,PAGESZ ;TEST IN CASE IN DC? CODE | |
2513 | PUSHJ P,DOHDFF ;IF EXPANSION OF DB OVERFLOWS PAGE | |
2514 | AOS T1,LINENO ;GET LINE # | |
2515 | MOVEI T2,SPACE | |
2516 | EXCH T1,T2 | |
2517 | CAIG T2,^D999 | |
2518 | PUSHJ P,LOUCH | |
2519 | CAIG T2,^D99 | |
2520 | PUSHJ P,LOUCH | |
2521 | CAIG T2,^D9 | |
2522 | PUSHJ P,LOUCH | |
2523 | EXCH T1,T2 | |
2524 | PUSHJ P,PUTDEC ;PRINT IT | |
2525 | MOVE T2,MACPDL | |
2526 | PUSH T2,INVECT | |
2527 | DOLIN2: HRRZ T1,(T2) ;IS THIS A SOURCE LINE? | |
2528 | CAIN T1,-1 ;.. | |
2529 | JRST DOLIN1 ;YES, SKIP | |
2530 | CAIG T1,BAKPTR | |
2531 | CAIGE T1,BAKBUF ;CAME FROM BAKBUF? | |
2532 | JRST [MOVEI T1,"M" ;NO, FLAG AS A MACRO EXPANSION LINE | |
2533 | PUSHJ P,LOUCH | |
2534 | JRST DOLIN1] | |
2535 | SOJA T2,DOLIN2 | |
2536 | ||
2537 | DOLIN1: MOVEI T1,TAB | |
2538 | PUSHJ P,LOUCH ;& A TAB | |
2539 | POP P,T2 | |
2540 | POP P,T1 | |
2541 | POPJ P, | |
2542 | ||
2543 | MONTAB: ASCIZ /Jan/ | |
2544 | ASCIZ /Feb/ | |
2545 | ASCIZ /Mar/ | |
2546 | ASCIZ /Apr/ | |
2547 | ASCIZ /May/ | |
2548 | ASCIZ /Jun/ | |
2549 | ASCIZ /Jul/ | |
2550 | ASCIZ /Aug/ | |
2551 | ASCIZ /Sep/ | |
2552 | ASCIZ /Oct/ | |
2553 | ASCIZ /Nov/ | |
2554 | ASCIZ /Dec/ | |
2555 | ;ADD NEW MONTHS HERE | |
2556 | \fPASS1: TRZE F,FR.END ;DONE? | |
2557 | JRST ENDIT ;YES | |
2558 | PUSHJ P,TOKEN | |
2559 | PUSHJ P,IFPOP ;IF OR FRIENDS? | |
2560 | JRST NOP1T ;YES | |
2561 | TRNE F,FR.OFF | |
2562 | JRST FPASS1 | |
2563 | NOP1T: JUMPN TOK,.+4 | |
2564 | CAIE I,CR | |
2565 | CAIN I,SEMICO ;END OF LINE? | |
2566 | JRST FPASS1 ;YES, DONE | |
2567 | CAIN I,COLON ;BEFORE A COLON? | |
2568 | JRST LOASYM ;YES, ITS A LABEL | |
2569 | PUSHJ P,SRCHOP ;GET INDEX TO OPCODE | |
2570 | JRST [PUSHJ P,SETMAC;SETUP MACRO | |
2571 | JRST PASS1] | |
2572 | MOVE P1,TYPLSH(X) | |
2573 | TLNE P1,T.POP ;PSEUDO OP? | |
2574 | JRST [PUSHJ P,PSEUDO ;DOIT | |
2575 | JRST PASS1] ;LOOP BACK | |
2576 | AOS PC ;ONE BYTE | |
2577 | AOJ BC, | |
2578 | TLNN P1,T.2BYT!T.3BYT | |
2579 | JRST .+3 | |
2580 | AOS PC ;TWO BYTES | |
2581 | AOJ BC, | |
2582 | TLNN P1,T.3BYTE | |
2583 | JRST .+3 | |
2584 | AOS PC ;THREE BYTES | |
2585 | AOJ BC, | |
2586 | FPASS1: PUSHJ P,FLUSH | |
2587 | JRST PASS1 | |
2588 | ||
2589 | LOASYM: PUSHJ P,SRCSYM | |
2590 | DMOVEM TOK,(S) | |
2591 | HRR T1,PC ;FLAGS,PC | |
2592 | TRNN F,FR.ORG ;IF RELOCATING, | |
2593 | TLO T1,S.REL ;FLAG AS RELOCATABLE | |
2594 | TLZ T1,S.UNDF ;CLEAR UNDEFINED FLAG | |
2595 | CAIL S,SYMTAB ;SKIP IF ILLEGAL | |
2596 | MOVEM T1,2(S) | |
2597 | JRST PASS1 | |
2598 | ||
2599 | UUO: LDB E,[POINT 9,.JBUUO##,8] | |
2600 | JRST @UUOTAB-1(E) | |
2601 | ||
2602 | UUOTAB: EUUO | |
2603 | WUUO | |
2604 | ||
2605 | WUUO: MOVSI E,"%" | |
2606 | JRST EUUO+1 | |
2607 | ||
2608 | EUUO: MOVSI E,"?" | |
2609 | HRR E,.JBUUO | |
2610 | POPJ P, | |
2611 | ||
2612 | \fDEFINE X(A,B,C,D),< | |
2613 | SIXBIT /A/ | |
2614 | > | |
2615 | ||
2616 | ||
2617 | OPNTAB: XLIST | |
2618 | OPTYPE | |
2619 | LIST | |
2620 | ||
2621 | OPTABL==.-OPNTAB | |
2622 | ||
2623 | DEFINE X(A,B,C,D),< | |
2624 | EXP B | |
2625 | > | |
2626 | ||
2627 | OPCTAB: XLIST | |
2628 | OPTYPE | |
2629 | LIST | |
2630 | ||
2631 | DEFINE X(A,B,C,D),< | |
2632 | XWD C,D | |
2633 | > | |
2634 | ||
2635 | TYPLSH: XLIST | |
2636 | OPTYPE | |
2637 | T.POP,,0 ;SO THAT UNDEF OPCODES DON'T BUMP PC | |
2638 | LIST | |
2639 | ||
2640 | DEFINE W(A,B),< | |
2641 | [ASCIZ \B\]> | |
2642 | ||
2643 | ERRTAB: XLIST | |
2644 | EFLAGS | |
2645 | ||
2646 | LIT | |
2647 | LIST | |
2648 | \f RELOC 0 | |
2649 | ||
2650 | PRETAB: SIXBIT /A/ | |
2651 | EXP 7 | |
2652 | SIXBIT /B/ | |
2653 | EXP 0 | |
2654 | SIXBIT /C/ | |
2655 | EXP 1 | |
2656 | SIXBIT /D/ | |
2657 | EXP 2 | |
2658 | SIXBIT /E/ | |
2659 | EXP 3 | |
2660 | SIXBIT /H/ | |
2661 | EXP 4 | |
2662 | SIXBIT /L/ | |
2663 | EXP 5 | |
2664 | SIXBIT /M/ | |
2665 | EXP 6 | |
2666 | SIXBIT /SP/ | |
2667 | EXP 6 | |
2668 | SIXBIT /PSW/ | |
2669 | EXP 6 | |
2670 | PRELEN==.-PRETAB | |
2671 | ||
2672 | SYMTAB::BLOCK 5*SYMSIZ | |
2673 | SYMEND==. | |
2674 | \fLINBLK: BLOCK ^D40 ;HOLDS MAX OF 200 CHARACTER LINE | |
2675 | LINEND==.-1 | |
2676 | STRING: BLOCK 200 ;ROOM FOR 384 BYTES - 2 FULL PAGES OF GENERATED OUTPUT | |
2677 | MACDUM: BLOCK ^D40 ;HOLDS 20 DUMMY MACRO ARGS | |
2678 | MACDML==.-MACDUM | |
2679 | MACDND==.-1 | |
2680 | MACARG: BLOCK ^D100 ;500 CHARACTERS OF MACRO ARGS | |
2681 | MACAND==.-1 | |
2682 | ARGPTR: 0 ;POINTER TO MACARG | |
2683 | ARGSTK: BLOCK 20 ;POINTER TO ARGS OF NESTED MACROS | |
2684 | ARGPDL: 0 ;POINTER TO ARGSTK | |
2685 | REPCNT: 0 ;COUNT OF CURRENT REPT | |
2686 | REPADR: 0 ;ADDRESS OF REPT STRING | |
2687 | EOMFLG: 0 ;FLAG TO TELL THE DIFF BETWEED MACRO AND REPT | |
2688 | PC: 0 | |
2689 | BYTCNT: 0 | |
2690 | XTRAPC: 0 | |
2691 | ORGXR: 0 ;INDEX INTO ORGBLK | |
2692 | ORGBLK: BLOCK 100 ;BYTE COUNT OF BLOCK | |
2693 | ;START ADDRESS OF BLOCK | |
2694 | MACSTK: BLOCK 20 ;INVECT GETS PUSHED ON THIS WHEN A MACRO IS CALLED | |
2695 | MACPDL: 0 ;POINTER TO MACSTK | |
2696 | MACLEV: 0 ;LEVEL OF NESTING IN MACRO | |
2697 | LOCSYM: 0 ;VALUE OF LOCAL SYMBOL | |
2698 | OPSTK: BLOCK 20 ;PDL FOR POLISH STACK (ENOUGH?) | |
2699 | INVECT: 0 ;POINTS TO THE MACRO FROM WHICH INCH WILL GET ITS SOURCE | |
2700 | BAKBUF: BLOCK ^D100 ;HOLDS NEXT 100 WORDS IN BUFFER WHILE DOING SNEAK | |
2701 | BAKPTR: 0 ;POINTER TO BAKBUF | |
2702 | SNEAKI: 0 ;CONTENTS OF REG I WHEN DONE SNEAKING TOKEN | |
2703 | SAVREG: BLOCK 5 ;MISC. STORAGE WHEN STACK IS BUSY | |
2704 | IFLEVL: 0 ;LEVEL OF CURRENT NESTED IF | |
2705 | EXPLVL: 0 ;LEVEL OF CURRENT PAREN IN EXPRESSION | |
2706 | OFFLVL: 0 ;IFLEVL THAT ASSEMBLY WAS TURNED OFF | |
2707 | CHECK: 0 ;CHECKSUM | |
2708 | STARTA: 0 ;START ADDRESS | |
2709 | TITL: BLOCK 20 ;TITLE BUFFER | |
2710 | SUBTTL: BLOCK 40 | |
2711 | SUBTLN==<.-SUBTTL>*5 | |
2712 | IFN FTREL,< | |
2713 | RELPTR: 0 | |
2714 | RELTAB: BLOCK ^D50 ;50 RELOC ADDRESSES (DUMPED WHEN GT 15) | |
2715 | RELEND==.-1 | |
2716 | > | |
2717 | LINENO: 0 | |
2718 | LINCTR: 0 | |
2719 | DELIM: 0 ;USED TO TELL " FROM ' IN DC & SETMAC CODE | |
2720 | PAGENO: 0 | |
2721 | SUBPAG: 0 | |
2722 | SYMCNT: 0 ;NUMBER OF CHARACTERS PER LINE IN SYMBOL FILE | |
2723 | SYMTYP: 0 ;'TYPE' OF LAST SYMBOL IN SYMBOL FILE | |
2724 | PAGESZ: 0 ;SIZE OF PAGE - SET BY 'PAGE' | |
2725 | DATE: 0 | |
2726 | 0 | |
2727 | 0 | |
2728 | ENDHGH::0 | |
2729 | ||
2730 | END | |
2731 | \0\0\0\0 |