]> cloudbase.mooo.com Git - kermit-80.git/blob - mac80a.mac
Bugfix in outmdm (output buffer flush)
[kermit-80.git] / mac80a.mac
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