1 ;MAC80 - An 8085 cross assembler for the DECsystem-10
3 ; Copyright 1976,1977,1978,1983
4 ; Bruce Tanner / Cerritos College
10 TITLE. (M80,MAC80A,8085 Cross Assembler)
17 EXTERN IBUF,OBUF,LBUF,SBUF,MBUF,NOFILE,FILNAM,FILEXT,PPN,OPNOBJ
20 MAC80A::MOVE T1,[PUSHJ P,UUO]
22 MOVE T1,[IOWD 20,MACSTK]
24 MOVE T1,[IOWD 20,ARGSTK]
28 MOVE T1,[POINT 7,MACARG]
39 TDO F,[FL.LNR,,FR.PS1!FR.HEX]
40 RESTAR: TRNE F,FR.PS1 ;PASS1?
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
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
61 DUNTAG: TRZE F,FR.END ;DONE?
63 PUSHJ P,TOKEN ;GET A TOKEN
64 MAIN1: PUSHJ P,IFPOP ;AN "IF" TYPE PSEUDO OP?
66 TRNE F,FR.OFF ;ASSEMBLING?
68 NOTEST: JUMPN TOK,.+4 ;SKIP IF SOMETHING
70 CAIN I,SEMICO ;COMMENT?
74 PUSHJ P,SRCHOP ;SEARCH OPCODE
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
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?
91 TRNE P1,4 ;REGISTER PAIR?
92 LSH T1,-1 ;YES, MAKE 2 BITS WIDE
93 LSH T1,(P1) ;SHIFT ACCORDING TO LSH(X)
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
103 FLUSHX: PUSHJ P,FLUSH ;FLUSH THE REST OF THE LINE
105 \fBYTE3: PUSHJ P,LSTPC ;OUTPUT THE OPCODE
108 PUSHJ P,TOKEN ;GET THE DATA BYTE(S)
109 JUMPN TOK,NOTMT ;NOT EMPTY
110 CAIE I,15 ;BREAK ON EOL?
112 WARN W.MT ;DEFENSIVE CODE
113 NOTMT: PUSHJ P,DODATA ;COMP. EFFECTIVE ADDR
115 PUSHJ P,LSTOP ;OUTPUT THE LOWER 8 BITS
116 LSH OP,-10 ;SHIFT DOWN
117 TLNE P1,T.2BYT ;JUST 1 DATA BYTE?
120 PUSHJ P,LSTOP ;OUTPUT UPPER 8 BITS
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
131 TLNE P1,T.2BYT ;NEED SPACES?
135 SPACE4: TRNE F,FR.HEX
141 \f;EVAL TOKEN IN TOK (AND REST OF EXPR IF ANY) RETURN VALUE IN OP
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
152 CAIN I,SEMICO ;KNOWN TERMINATORS?
154 CAIE I,")" ;END OF EXPR
157 CAIE I,"<" ;SPECIAL CASE TEST FOR <=,>=,<>
159 PUSHJ P,OP2CH ;CHECK FOR 2 CHAR OPCODE
160 PUSH T4,I ;SAVE ON OP STACK
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.
171 CAIN I,TAB ;BETTER CONTAIN SPACE
173 CAIN I,MINUS ;UNARY MINUS?
176 CAIE I,"(" ;THIS IS THE ONLY NON BLANK THING ALLOWED
179 CAIE I,"(" ;DON'T LET TOKEN BUST INTO EXPR
180 PUSHJ P,TOKEN ;GET NEXT TOKEN
181 DODT12: SKIPE TOK ;IF NO TOKEN
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/]
188 CAME TOK,[SIXBIT/LOW/]
189 CAMN TOK,[SIXBIT/LO/]
191 CAME TOK,[SIXBIT/NUL/]
192 CAMN TOK,[SIXBIT/NULL/]
194 JRST DODT22 ;NO, SKIP
196 DODT23: POP P,T2 ;RESTORE T2
198 SETZB T1,TOK ;CLEAR TOK IN CASE NOT(EXPR)
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)
204 DODT13: PUSH P,I ;SAVE I
205 MOVE I,(T4) ;GET LAST OP
206 CAIN I,DOLLAR ;NO LAST OP?
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?
213 PUSHJ P,DINDEX ;GET INDEX OF THIS ONE
214 CAML OP,PRIOR(T3) ;CAN WE EVAL YET?
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?
221 TRNE F,FR.REL ;RELOC?
222 TRC T2,2 ;ABS & REL = REL; REL & REL = ABS
223 TRNE F,FR.EXT ;EXTERNAL?
225 JRST DODAT1 ;KEEP GOING
227 DODT15: POP P,I ;DONE WITH I (DODT13)
228 MOVEM T1,SAVREG ;SAVE T1
229 POP T4,SAVREG+1 ;& LAST OPERATOR
233 POP T4,I ;GET CURRENT OP
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
243 SOSGE EXPLVL ;IF WE WERE AT TOP LEVEL..
246 SKIPE EXPLVL ;THE REST BETTER BE AT TOP LEVEL
249 MOVEM I,SAVREG+3 ;SAVE I
250 DODAT5: POP T4,I ;GET OP
251 CAIN I,DOLLAR ;ALL DONE?
254 POP P,OP ;GET 2ND ARG
255 PUSHJ P,DINDEX ;GET INDEX IN T3
256 XCT EXPXCT(T3) ;DO IT
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?
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
270 CAIN T2,10 ;IF EXTERN
272 TRNN F,FR.PS1 ;IF PASS1
273 SKIPN T2 ;OR NON-RELOCATABLE
275 TRNE F,FR.HEX ;IF OCTAL FORMAT
276 TRNE F,FR.EXT ;OR EXTERN
278 CAIE T2,1 ;IF FLAGED AS ABS,
279 TRNE F,FR.ORG ;OR NOT RELOCATING
283 MOVEM T2,RELTAB(T1) ;SAVE PC FOR NEXT LINK
284 AOJ T1, ;BUMP POINTER
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
300 DPB I,[POINT 6,T2,11]
302 CAIN I,'=' ;GOOD 2ND CHAR?
303 PUSHJ P,INCH ;YES, USE IT
305 OLDI: MOVE I,T1 ;RESTORE I
315 E "/",<PUSHJ P,EXDIV>,3
316 E "\",<PUSHJ P,EXMOD>,3
319 E "_",<LSH OP,(T1)>,6
320 E "#",<SETCM OP,T1>,2
321 E 'AND ',<AND OP,T1>,6
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
347 DEFINE E(CHAR,INSTR,PRI),<
354 \f DEFINE E(CHAR,INSTR,PRI),<
360 ERROR F.ILEX ;EXECUTED IF OP IS NOT IN OPRMAC
362 DEFINE E(CHAR,INSTR,PRI),<
384 FALSE: TDZA OP,OP ;0 = FALSE
385 TRUE: SETO OP, ;-1 = TRUE
408 ;NULL = LOCAL SYMBOL GENERATED FOR MISSING ARG, WHICH IS UNDEFINED
410 DONULL: TLNN T1,S.UNDF ;IS THIS SYMBOL UNDEFINED?
412 SETZ E, ;YES, IT'S NULL; IGNORE THE 'UNDEFINED' ERROR
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)
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 )
426 JRST INCH ;GET THE BREAK CHAR
428 DINDEX: MOVSI T3,-OPRTBL
432 ERROR F.ILEX ;NOT IN TABLE
436 TOKEN1: CAIE I,SPACE ;FLUSH LEADING SPACES & TABS
440 MOVE T1,[POINT 6,TOK]
441 CAIN I,DOLLAR ;SPECIAL TEST FOR $
442 POPJ P, ;LEADING DOLLAR SIGN IS ASSEMBLER PC
445 PUSHJ P,BREAK ;BREAK CHARACTER?
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
458 TOKENW: PUSHJ P,INCH ;WASTE REST OF TOKEN
462 TRNN F,FR.SNK ;DON'T GET UPSET ABOUT OVERFLOW OF '...'
479 CAIN I,"?" ;AND ? ARE LEGAL
481 CAIN I,DOLLAR ;$ IS NOW A LEGAL SYMBOL CHARACTER
485 FLUSHL: CAIN I,LF ;IF ALREADY FLUSHED..
489 PUSHJ P,INCH ;GET NEXT CHARACTER
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
500 CAMN TOK,OPNTAB(X) ;MATCH? (ALL TOKENS IN OPNTAB ARE LE 6 CHAR)
501 JRST SCPOPJ ;YES, SKIP RET
503 MOVE T1,T3 ;SET NEW RANGE
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?
515 CAME TOK,[SIXBIT/EQU/]
516 CAMN TOK,[SIXBIT/SET/]
518 JRST TSTMAC ;NO, SEE IF IT IS A MACRO ITSELF
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?
524 CAMN TOK,[SIXBIT/MACRO/]
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
534 \fPSEUDO: MOVSI X,-PTABL ;TABLE LENGTH
535 CAME TOK,PTAB(X) ;MATCH?
537 JRST @PDISP(X) ;DISPATCH
566 DEFINE PX(NAME,ADDR),<
574 DEFINE PX(NAME,ADDR),<
575 IFB <ADDR>,<JRST NAME>
576 IFNB <ADDR>,<JRST ADDR>>
580 JRST CPOPJ ;IN CASE UNDEF OPCODE
583 IFPOP: CAME TOK,[SIXBIT/IFE/]
584 CAMN TOK,[SIXBIT/IFN/]
586 CAME TOK,[SIXBIT/ENDIF/]
587 CAMN TOK,[SIXBIT/END/]
589 CAME TOK,[SIXBIT/IF/]
590 CAMN TOK,[SIXBIT/ELSE/]
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
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
615 PUSHJ P,NOPC ;LIST START ADDRESS
618 TRZE F,FR.REL ;RELOC?
620 TRZN F,FR.EXT ;EXTERNAL?
622 SETOM STARTA ;YES. THIS IS ILLEGAL
627 DS: PUSHJ P,TOKEN ;GET BLOCK ARG
634 MOVE T1,PC ;SAVE OLD PC
636 JRST ORG+3 ;DS MEANS NEW BLOCK
641 TRO F,FR.ORG ;NO RELOCATION
644 PRINTX: TRNE F,FR.PS1 ;IF ON PASS1
651 \fDC: MOVE T4,[POINT 10,STRING] ;SET UP OPCODE OUTPUT
652 MOVE T2,T4 ;AND INPUT
654 DC0: PUSHJ P,TOKEN ;GET ARG(S)
657 JRST [MOVEM I,DELIM ;SAVE QUOTE
658 PUSHJ P,SNEAK ;SEE IF SINGLE CHAR
660 JRST DC4 ;NO, DO QUOTED STRING
662 CAME I,DELIM ;AND MUST END ON SAME QUOTE
666 PUSH P,T4 ;DODATA DESTROYS T4
670 ANDI OP,377 ;LOWER 8 BITS
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?
679 ANDI OP,377 ;JUST DATA BITS
680 TRZE F,FR.REL ;IF RELOC
682 TRZE F,FR.EXT ;IF EXT
688 DC1: CAIN I,COMMA ;CONTINUE?
690 CAIE I,TAB ;LEADING SPACE?
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?
703 PUSHJ P,LSTPC ;LIST PC
704 MOVEI TOK,3 ;TOKEN NOT INUSE NOW
709 PUSHJ P,LSTOP ;OUTPUT OP WITHOUT UPDATING PC
711 SOSG BYTCNT ;ONE LESS BYTE IN STRING
713 SOJG TOK,DC3 ;LOOP FOR 2 OR 3 BYTES
715 TRNE T1,400 ;IF RELOCATABLE
716 JRST [MOVEI T1,"'" ;FLAG
719 TRNE T1,1000 ;IF EXTERNAL
724 PUSHJ P,FLUSHL ;PRINT <TAB> LINE OF SOURCE (OR NEW LINE)
725 JRST DC2 ;DO ANOTHER LINE
727 DCX: SOJ TOK, ;COUNT BYTE PRINTED
729 MOVE T3,T1 ;GET FLAGS
731 TRNE T3,400 ;RELOC WORD?
733 TRNE T3,1000 ;EXTERN?
737 PUSHJ P,LOUCH ;OUTPUT IF ' OR *
739 DCX0: TLNN P1,T.DZ ;NEED A LAST ZERO?
741 JUMPN TOK,DCX1 ;JUMP IF PC ALREADY PRINTED
745 PUSHJ P,INCH ;FLUSH LINE
746 PUSHJ P,LSTPC ;LIST PC
751 PUSHJ P,LSTOP ;LIST ZERO
753 DCX2: JUMPE TOK,FLUSHL ;DONE
754 PUSHJ P,SPACE4 ;SPACE OUT
757 \fDC4: PUSHJ P,INCH ;GET LIT
758 CAMN I,DELIM ;END QUOTE?
767 DC6: MOVE TOK,BYTCNT ;GET COUNT OF BYTES READY TO GO
768 CAIGE TOK,3 ;ENOUGH FOR A LINE?
770 MOVEI TOK,3 ;SET UP BYTES/LINE
772 POP P,OP ;GET BYTE POINTER
773 DC7: ILDB T1,OP ;GET BYTE
774 SOS BYTCNT ;COUNT DOWN
776 PUSHJ P,LSTOP ;LIST 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
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?
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]
807 BLT T2,MACDND ;CLEAR MACRO ARG TABLE
808 MOVEI T1,2 ;INDICATE NOT A REPT
810 SETZ T2, ;MACDUM INDEX
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
816 JRST DOMC4A ;NO, SKIP
818 AOJA T2,DOMAC4 ;LOOP UNTIL NO MORE ARGS
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
824 HRLI T2,(POINT 7,0) ;POINTER TO MACRO BODY
826 DOMAC3: HRRZI T1,1(T2) ;GET ADDRESS PART OF POINTER (+1)
827 PUSHJ P,MEMXPN ;SEE IF MEMORY NEEDS TO BE EXPANDED
830 LDB I,T2 ;GET LAST CHAR
831 CAIE I,SEMICO ;DOUBLE ;;?
837 CAIE I,TAB ;TRY TO ELIMINATE TRAILING TABS
838 CAIN SPACE ;OR SPACES
840 MOVEM T2,SAVREG ;SAVE FOR A WHILE
843 MEMXPN: CAMG T1,.JBREL## ;WILL T1 FIT IN CORE?
850 \fDOM12: PUSHJ P,FLUSH ;WASTE COMMENT
851 MOVE T2,SAVREG ;GET POINTER
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?
859 CAIE I,LF ;END OF LINE
861 TRZ F,FR.MCM ;FLAG END OF ANY POSSIBLE COMMENT
862 JRST DOMC2A ;CHECK FOR ENDM, ETC.
864 DOMAC6: PUSHJ P,BREAK ;IS IT WORTHWHILE TO LOOK FOR NEXT TOKEN?
868 DOMAC5: SOSL MACLEV ;IN A NESTED MACRO?
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
876 MOVEI I,12 ;END MACRO TEXT WITH CRLF
880 MOVE I,EOMFLG ;177,2 IS END OF MACRO
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?
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
893 DOMAC2: CAIN I,SEMICO
894 TRO F,FR.MCM ;FLAG IGNORE REST OF LINE
896 TRC F,FR.MQT ;TOGGLE QUOTE IN MACRO
897 TRNE F,FR.MCM ;IN COMMENT?
899 DOMC2A: PUSHJ P,DOMC13 ;GET NEXT TOKEN
900 DOMAC7: JUMPE TOK,DOMAC1 ;NOTHING THERE
901 CAMN TOK,[SIXBIT/ENDM/];END OF MACRO?
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
908 CAMN TOK,[SIXBIT/LOCAL/] ;LOCAL SYMBOL?
911 DOMC7A: SKIPN MACDUM(T3)
914 CAME TOK+1,MACDUM+1(T3) ;WHAT? NO DOUBLE WORD COMPARE?
920 DOMAC8: PUSHJ P,TOKEN
925 LSH T3,-1 ;ACCOUNT FOR DOUBLE SIZE TOKENS
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"
936 DOMC9A: SKIPN MACDUM(T3) ;FIND FIRST FREE MACDUM ENTRY
940 ERROR F.TMMA ;TOO MANY MACRO ARGS (MAKE MACDUM BIGGER)
942 DOMC9B: PUSHJ P,TOKEN
943 DMOVEM TOK,MACDUM(T3) ;SAVE LOCAL SYMBOL
944 CAIN I,"," ;MORE LOCALS?
946 CAIN I,CR ;THROW OUT REST OF LINE
951 DOMC13: HRRZ T1,INVECT ;GET INVECT POINTER
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
958 CAIE I,177 ;END OF BAKBUF?
959 JRST [POP P,(P) ;WASTE RETURN ADDR
960 JRST DOMAC1] ;JUST PROCESS CHARACTER
962 POP T1,INVECT ;RESTORE OLD POINTER
964 JRST SNEAK ;AND GET A NEW TOKEN
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
970 DMOVEM TOK,(S) ;LOAD SYMBOL IF NOT THERE
972 PUSHJ P,TOKEN ;GET ARG
973 PUSHJ P,DODATA ;GET VALUE
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?
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
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
991 TRNE F,FR.PS1 ;PASS1?
995 OPTION: PUSHJ P,TOKEN
996 CAMN TOK,[SIXBIT/HEX/]
998 CAMN TOK,[SIXBIT/OCT/]
1000 CAMN TOK,[SIXBIT/SMAC/]
1002 CAMN TOK,[SIXBIT/LMAC/]
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
1017 PUSHJ P,FLUSH ;THROW OUT REST OF MACLIB LINE
1019 PUSH T1,INVECT ;SAVE INPUT VECTOR
1021 MOVEI T1,-2 ;SIGNAL MACLIB INPUT
1023 TRO F,FR.LIB ;FLAG IN MACLIB
1026 DOPAGE: PUSHJ P,TOKEN
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
1033 EXITM: HRRZ T1,INVECT ;FIRST CHECK TO SEE IF WE'RE IN A MACRO
1036 JRST EXITX ;YES, ERROR
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
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
1049 EXITX: WARN W.EXM ;WARN THAT WE'RE NOT IN A MACRO
1053 PUSHJ P,DODATA ;GET THE REPT VALUE
1054 MOVEM OP,REPCNT ;SAVE IT
1055 MOVE T2,[MACDUM,,MACDUM+1]
1057 BLT T2,MACDND ;CLEAR MACRO ARG TABLE
1058 MOVEI T1,3 ;INDICATE REPT AND NOT MACRO
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
1064 PUSHJ P,SETARG ;SET UP MACARG IN CASE LOCALS USED
1070 IDPB I,T1 ;END WITH NULL
1073 PUSH T1,INVECT ;SAVE INPUT VECTOR ON SPECIAL STACK
1074 MOVE T2,REPADR ;POINT TO REPT
1082 DOIFN: PUSHJ P,TOKEN
1084 AOS IFLEVL ;ONE MORE IF
1085 TRNE F,FR.OFF ;ALREADY OFF?
1087 SKIPE OP ;GOING OFF?
1089 TRNOFF: MOVE T1,IFLEVL
1090 MOVEM T1,OFFLVL ;YES, SAVE LEVEL OF OFF
1091 TRO F,FR.OFF ;SHUT OFF
1093 \fDOIFE: PUSHJ P,TOKEN
1100 JRST TRNOFF ;TURN OFF
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
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,
1120 DOTITL: MOVE T1,[POINT 7,TITL]
1129 DOSUBT: CAIA ;TRY BREAK CHARACTER FIRST
1130 PUSHJ P,INCH ;GET DELIMITER
1133 JRST .-3 ;FORGET SPACES
1135 MOVE T3,[POINT 7,SUBTTL]
1138 CAMN I,T2 ;END OF STRING?
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
1148 JRST DOQUOT ;LITERAL CHARACTER
1152 POPJ P, ;MUST BE ZERO
1153 MOVE T1,PC ;DOLLAR IS PC
1154 TRO F,FR.REL ;DOLLAR IS ALSO RELOCATABLE
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
1160 JRST INCH ;EAT DOLLAR
1162 DOSYM: PUSHJ P,GETNUM ;EVALUATE NUMERICALLY
1163 POPJ P, ;RETURN WITH NUMBER IN T1
1164 PUSHJ P,SRCSYM ;NOT NUMBER,SEARCH SYMBOL TABLE
1167 POPJ P, ;RETURN WITH VALUE IN T1
1172 TRO F,FR.EVL ;TELL SRCHOP NOT TO FLAG ERROR
1173 PUSHJ P,SRCHOP ;CHECK FOR OPCODE
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?
1183 \fDOSYM2: CAIN I,")" ;END OF EXPR?
1198 TLZE T3,T.MOV ;A MOVE?
1202 REPEAT 0,< ;DON'T GET FUSSY ABOUT OPCODES AS DATA
1205 WARN W.ILO1 ;ONLY GENERATE 1 BYTE OF DATA
1216 SKIPE (S) ;NO SYMBOL?
1217 JRST FLUNDF ;SYMBOL ALREADY UNDEFINED
1218 DMOVEM TOK,(S) ;SAVE SYMBOL
1219 MOVSI T1,S.UNDF ;FLAG UNDEFINED
1221 FLUNDF: PUSHJ P,SRCSYM ;REFERENCE SYMBOL
1223 TRO F,FR.UND ;FLAG UNDEFINED SYMBOL
1224 TRNN F,FR.PS1 ;SKIP IF PASS1
1225 ERROR F.UNDF ;REALLY IS UNDEFINED
1228 DOQUOT: PUSHJ P,INCH ;GET THE NEXT CHARACTER
1229 MOVE T1,I ;JUST SAVE IT
1230 PUSHJ P,INCH ;EAT TRAILING QUOTE
1234 LSH T1,10 ;SHIFT OVER
1238 PUSHJ P,TOKEN ;LOAD UP LIKE TOKEN
1239 POP P,T1 ;RESTORE T1
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/
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
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?
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
1261 TLNN T2,770000 ;ONLY HASH ON 1ST WORD OF SYMBOL
1266 IDIVI T1,SYMSIZ ;GET TOKEN MODULO TABLE LENGTH
1269 IMULI T1,5 ;5 WORDS/ENTRY
1270 MOVEI S,SYMTAB(T1) ;GET HASHED TABLE LOCATION
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
1282 PREMAT: MOVE T1,1(S) ;GET FLAGS,VALUE
1283 JRST SCPOPJ ;SKIP RETURN
1285 MAKLNK: MOVE T1,.JBFF## ;GET JOBFF
1286 HRRM T1,4(S) ;MAKE NEW LINK
1288 ADDI T1,5 ;MAKE NEW JOBFF
1289 PUSHJ P,MEMXPN ;EXPAND CORE IF NECESSARY
1290 MOVEM T1,.JBFF## ;STUFF IT
1292 \fSRCF: MOVE T1,2(S) ;GET FLAGS,VALUE
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?
1306 HRLZ T2,LINENO ;GET CURRENT LINENO
1307 MOVEM T2,3(S) ;SAVE IN LH
1310 NXTREF: PUSH P,T1 ;SAVE T1
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
1329 PUSHJ P,MEMXPN ;EXPAND CORE
1331 SRCX0: POP P,T3 ;RESTORE T3
1332 POP P,T1 ;RESTORE T1
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?
1340 SCPOPJ: AOS (P) ;CAUSE SKIP RETURN
1341 CPOPJ: POPJ P, ;RETURN
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)
1347 SNEAK: TRO F,FR.SNK ;SAY WE'RE SNEAKING AROUND
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
1356 IDPB T1,BAKPTR ;STORE "END OF BAKBUF"
1359 MOVE T1,MACPDL ;GET MACPDL
1360 HRRZ T2,INVECT ;GET INVECT POINTER
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
1373 \fGETNUM: MOVE T3,[POINT 6,TOK]
1374 SETZ T1, ;CLEAR TOTAL
1375 ILDB T2,T3 ;GET THE 1ST CHARACTER
1377 CAIGE T2,'0' ;NUMERIC?
1378 JRST SCPOPJ ;NO - SHOULDN'T BE HERE
1381 GETN1: JUMPE T2,GETN2 ;END OF TOKEN
1382 MOVE T4,T3 ;SAVE POINTER TO LAST CHAR
1383 ILDB T2,T3 ;GET NEXT CHAR
1386 GETN2: MOVE T3,T4 ;GET BACK POINTER
1387 LDB T4,T3 ;GET LAST CHARACTER
1388 MOVEI I,^D10 ;ASSUME DECIMAL
1396 CAIE T4,'D' ;GET RID OF THE LAST CHARACTER
1397 CAIN T4,'H' ;IF IT IS A RADIX CHARACTER
1404 MOVE T3,[POINT 6,TOK]
1405 GETNL: CAMN T3,[600,,TOK+1]
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
1422 SETARG: MOVE T2,ARGPDL
1423 PUSH T2,ARGPTR ;SAVE CURRENT MACRO'S ARGS
1426 ILDB T2,T1 ;SEARCH FOR END OF CURRENT MACRO'S ARGS
1429 MOVEM T1,ARGPTR ;SAVE START OF THIS MACRO'S ARGS
1432 SETMAC: PUSHJ P,SETARG
1443 \fSETM1: CAIE I,QUOTE
1445 JRST SETM3 ;DO QUOTED STRING
1446 CAIN I,"<" ;START EXPR?
1454 CAIN I,"," ;ANOTHER ARG?
1457 IDPB I,T1 ;END WITH NULL
1460 PUSH T1,INVECT ;SAVE INPUT VECTOR ON SPECIAL STACK
1461 MOVE T2,2(S) ;GET POINTER TO MACRO
1467 SETM3: MOVEM I,DELIM
1479 TRNE F,FR.END ;END IS ONLY ABNORMAL EXIT
1486 \fINCH: PUSH P,T1 ;SAVE T1
1487 INCH1: MOVE T1,INVECT ;GET VECTOR
1488 CAIN T1,-1 ;DEFAULT TO SOURCE?
1490 CAIN T1,-2 ;DEFAULT TO LIBRARY?
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
1497 TRNE F,FR.LIB ;IN MACLIB?
1498 JRST TPOPJ ;YES, FINISHED
1499 HRRZ T1,INVECT ;GET INVECT POINTER
1501 CAIGE T1,BAKBUF ;IN MACRO?
1502 TLNN F,FL.SUP ;YES, IS FL.SUP ON?
1504 IDPB I,BAKPTR ;YES, SAVE CHAR HERE
1506 POPJ P, ;SUPPRESS ALL THIS FOOLISHNESS
1508 INCHM3: ILDB I,INVECT ;GET CODE
1510 CAIN I,2 ;END OF MACRO?
1512 CAIN I,3 ;END OF REPT?
1515 PUSH T1,INVECT ;SAVE OLD INVECT
1517 MOVE T1,ARGPTR ;INPUT IS FROM MACRO ARGS
1519 MOVE T1,I ;PUT ARG POSITION IN T1
1521 JUMPN T1,INCHM4 ;SKIP SPECIAL TEST IF NOT 1ST ARG
1522 PUSH P,INVECT ;SAVE INPUT VECTOR
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
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
1538 INCHM1: MOVE T1,MACPDL
1539 POP T1,INVECT ;RESTORE OLD POINTER
1541 CAIE I,2 ;END OF MACRO?
1543 JRST [MOVE T1,ARGPDL ;RESTORE MACRO ARG CONTEXT
1549 DOLSYM: PUSH P,INVECT ;SAVE THE INPUT VECTOR
1550 MOVEI I,"?" ;START THE SYMBOL WITH "??"
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
1560 MOVEI I,1 ;CAP OFF SYMBOL
1567 LDB I,INVECT ;GET FIRST BYTE IN I
1570 DOSNUM: IDIVI T1,^D10 ;OUTPUT T1 AS DECIMAL NUMBER
1579 INCHM5: SOSG REPCNT ;KNOCK DOWN REPT COUNT
1581 MOVE T2,ARGPTR ;POINT TO ARGS
1582 MOVEI T1,177 ;START NEW REPT WITH A CLEAN START
1588 MOVE T2,REPADR ;POINT TO REPT
1591 JRST INCHM0 ;DOIT OVER AGAIN
1594 INCHL1: SOSGE MBUF+2
1598 TRNE F,FR.SNK ;IF SNEAKING,
1599 IDPB I,BAKPTR ;SAVE CHARACTER
1600 POPJ P, ;JUST RETURN WITHOUT LISTING
1605 TRZ F,FR.LIB ;FLAG END OF MACLIB
1608 POP T1,INVECT ;RESTORE ORIGINAL INVECT BEFORE MACLIB
1610 JRST INCH ;AND GET ANOTHER CHARACTER
1618 ENDIT: TRZN F,FR.PS1 ;PASS1?
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?
1626 MOVE T1,ORGXR ;GET INDEX
1627 MOVEM BC,ORGBLK(T1) ;STORE COUNT
1629 PUSHJ P,OPNOBJ ;OPEN OBJECT DEVICE
1630 SETZM ORGXR ;RESET FOR OUTPUT
1631 MOVE T2,[POINT 7,TITL]
1633 MOVE T2,[POINT 7,SUBTTL]
1636 \fNOALT1: PUSHJ P,HEXHED ;DO HEDDER
1646 JUMPN T1,[PUSHJ P,HEXOX
1652 \fHEXHED: PUSHJ P,BCRLF
1654 MOVE T1,RELPTR ;GET SIZE OF RELTAB
1655 CAIGE T1,^D15 ;ENOUGH TO DO A LINE?
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
1667 MOVE T1,ORGBLK(T4) ;GET WHAT'S LEFT
1668 SETZM ORGBLK(T4) ;FLAG BLOCK EMPTY
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
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
1679 PUSHJ P,HEXBYT ;OUTPUT HIGH ADDRESS
1680 MOVE T1,ORGBLK+1(T4)
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
1691 TYPE04: TRNE F,FR.ORG ;RELOCATING?
1693 MOVEI T1,DOLLAR ;FLAG NON-INTEL RECORD
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
1702 MOVEI T1,4 ;TYPE 04 (RELOCATABLE)
1706 T04.1: MOVE T1,RELTAB(T3) ;GET ADDRESS
1710 MOVE T1,RELTAB(T3) ;GET LO ADDRESS
1719 PUSHJ P,HEXBYT ;OUTPUT CHECKSUM
1722 ;SHUFFLE CONTENTS OF RELTAB BACK TO BOTTOM
1730 T04.2: MOVEM T2,RELPTR ;RESET POINTER
1732 HRRI T3,RELTAB+1(T2)
1739 TRNN F,FR.ORG ;RELOCATING?
1740 SKIPN RELPTR ;RELTAB EMPTY?
1741 JRST DOSYMT ;DO SYMBOL TYPE
1742 MOVE T2,RELPTR ;GET COUNT
1744 MOVEI T2,^D15 ;MAX 15 AT A TIME
1745 PUSHJ P,TYPE04 ;DO A LINE OF TYPE 04
1748 DOSYMT: MOVEI S,SYMTAB ;XR
1749 EOFL: CAIL S,SYMEND ;END ON SYMTAB?
1752 JRST EOFX ;YES, SKIP
1753 PUSH P,S ;SAVE POINTER
1755 TLNE T3,S.INT!S.EXT ;GOOD STUFF?
1763 TYPE02: MOVEI T1,DOLLAR ;TYPE 2 OR 3 LEADER
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
1773 CAME T4,[600,,T3] ;ALL 12?
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
1782 HRRZ T1,T3 ;GET VALUE
1783 LSH T1,-10 ;GET HIGH PART
1797 \fTYPE01: MOVEI T1,":" ;OUTPUT HEADER
1801 MOVE T1,STARTA ;GET START ADDRESS
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
1817 JRST PAS1IX ;SKIP ALL PROCESSING OF CHARACTER IF PASS1
1819 MOVE LBTP,[POINT 7,LINBLK]
1820 CAIE I,FF ;DON'T GO PUTTING FF IN LINBLK!
1824 CAIA ;SKIP INTO EOL ROUTINE
1825 POPJ P, ;ELSE WE'RE DONE
1829 JRST DOFFX ;IF FF, SKIP SOME STUFF
1831 TRNE F,FR.LOP ;IF CODE GENERATED
1832 JRST INCHX1 ;JUST ONE TAB
1833 PUSHJ P,DOLINO ;PRINT LINE # AS A LAST RESORT
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]
1848 \fCHKERR: JUMPE E,NOERR
1853 MOVE LBTP,[POINT 7,(T2)]
1863 MOVE T1,[LINBLK,,LINBLK+1]
1867 CAMG T1,PAGESZ ;ON NEW PAGE?
1869 JRST DOFF ;YES, WRITE HEADER
1872 SETZM SUBPAG ;REAL PAGES HAVE NO SUB PAGE MARK
1873 DOFF: PUSHJ P,DOHDFF ;GO DO THE HEADING
1876 PAS1IX: CAIN I,FF ;IF FF,
1880 LOUCH: TRNE F,FR.LST ;IF NOT LISTING
1881 TRNE F,FR.PS1 ;OR ON PASS 1
1889 CAIN T1,LF ;LF DOESN'T CHANGE BOL
1891 TRZ F,FR.BOL ;ASSUME REGULAR CHAR
1893 TRO F,FR.BOL ;FLAG BOL
1899 \fOUTOP: PUSHJ P,LSTPC
1909 SKIPGE T1 ;IF NEGATIVE
1920 JRST [IDPB T1,OBUF+1
1925 \fHEXOUT: ADDM T1,CHECK
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
1949 PUSHJ P,NYBBLE ;OUTPUT HIGH NYBBLE
1966 PUSHJ P,PRTSYM ;PRINT SYMBOL TABLE
1972 TLNE F,FL.LNR ;LIST NON-REF SYMBOLS?
1975 AND F,[XWD FL.CCL,0];CLEAR ALL FLAGS BUT FL.CCL
1979 ;PRINT ALL DEFINED BUT NOT REFERENCED SYMBOLS
1981 REFLOP: MOVEI S,SYMTAB
1982 RLOOP4: CAIN S,SYMEND ;END OF TABLE?
1985 JRST RLOOP5 ;GET NEXT
1987 PUSHJ P,RLINK ;RUN OUT THIS BRANCH
1989 RLOOP5: ADDI S,5 ;GET NEXT
1993 TLNN T2,S.REF!S.MAC ;IS SYMBOL REFERENCED OR A MACRO?
1995 RLOOP: SKIPN S,4(S) ;IS THERE A LINK?
2002 OUTSTR [ASCIZ/Unreferenced labels:
2004 MOVE T4,[POINT 6,(S)]
2011 RLOOP2: OUTSTR [ASCIZ/
2016 PRTSYM: SKIPN CREFSW ;CREF?
2017 SKIPE SYMBSW ;OR SYMBOL FILE?
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
2025 PUSHJ P,DOHDFX ;PRINT NEW HEADER
2026 PRTS: HRLOI T1,377777 ;+INFINITY
2029 PRT0: SKIPN (S) ;EMPTY?
2032 PUSHJ P,PRT10 ;CHECK OUT THIS BRANCH
2034 PRT1: ADDI S,5 ;NEXT LINK
2035 CAIE S,SYMEND ;ALL DONE?
2037 SKIPE T1 ;QUIT IF WE GOT TO BLANK SYMBOLS
2038 CAMN T1,[377777,,-1] ;NO SYMBOLS SMALLER THAN +INFINITY?
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
2048 MOVE T1,2(S) ;GET FLAGS,VALUE
2049 TLNE T1,S.UNDF ;UNDEFINED?
2050 JRST [MOVEI T2,[ASCIZ/Undf/]
2054 JRST [MOVEI T2,[ASCIZ/Macro/]
2057 HRRZ T1,2(S) ;JUST VALUE
2059 PUSHJ P,LSTNUM ;PRINT IT
2060 PRT1B: SKIPN SYMBSW ;DOING SYMBOL FILE?
2062 MOVE T1,SYMTYP ;GET 10 OR 20
2063 JUMPE T1,PRT1A ;NEITHER, START OF FILE
2065 ANDI T1,7770 ;CUT TO TAB STOP
2067 CAIL T1,MAXSYM ;GOT TO END OF LINE?
2071 MOVEI T1,TAB ;END WITH A TAB
2074 MOVE T2,SYMTYP ;GET TYPE
2075 CAIN T2,20 ;NEED 2 TABS?
2077 PRT1A: HRRZ T1,2(S) ;GET FLAGS,VALUE
2081 MOVEI T1,5 ;COUNT 4 DIGITS AND A SPACE
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?
2089 MOVE T2,1(S) ;CHECK FOR LONG SYMBOLS
2090 TRNE T2,77 ;12 CHAR SYMBOL?
2092 MOVEM T1,SYMTYP ;SAVE 'TYPE' 10 (NORMAL) OR 20 (SHORT OR LONG)
2095 MOVE T2,2(S) ;GET FLAGS
2097 MOVEI T1,"'" ;FLAG RELOC
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
2111 TRZ T2,(1B0) ;CLEAR FLAG
2122 TLNN T2,(1B0) ;FLAG?
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
2132 CAMLE T1,PAGESZ ;IF ON NEW PAGE,
2133 PUSHJ P,DOHDFF ;DO HEADER
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
2148 SKIPE SYMBSW ;IF SYMBOLS
2149 PUSHJ P,SCRLF ;DO CRLF
2150 SKIPN CREFSW ;IF NOT CREF
2153 PUSHJ P,LCRLF ;NEW LINE
2154 MOVE T1,BC ;GET COUNT OF SYMBOLS USED
2156 MOVEI T2,[ASCIZ/ symbols used
2161 MOVEI T2,[ASCIZ/ empty slots in SYMTAB
2168 MOVEI T2,[ASCIZ/ links in longest symbol search/]
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?
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
2182 SKIPE S,4(S) ;GET NEXT LINK
2188 \fLSTNUM: TRNE F,FR.HEX ;HEX OUTPUT?
2196 LSTN1: PUSHJ P,LOUCH
2200 LSTHEX: IMULI T3,2 ;MULT BY 2/3
2214 LSTH3: MOVEI T1,"A"-^D10(T2)
2227 SYMH3: MOVEI T1,"A"-^D10(T2)
2239 \f;LSTPC LIST THE PC AND A TAB
2241 LSTPC: TRNE F,FR.PS1 ;PASS1?
2243 PUSHJ P,DOLINO ;IN CASE AT DC?
2244 TRZ F,FR.LIN ;LISTING PC CLEARS FR.LIN
2252 MOVEI T3,3 ;3 FIGURES
2255 PUSHJ P,LSTNUM ;OUTPUT THE PC
2264 TRNE F,FR.ORG ;RELOCATING?
2269 LSTPC2: MOVEI T1,TAB
2270 PUSHJ P,LOUCH ;OUTPUT ANOTHER TAB
2273 LCRLF: TRNE F,FR.PS1
2279 \f;LSTOP ENTER THE BYTE IN T1 IN THE OBJ FILE
2280 ; PRINT THE BYTE [AND A SPACE IF OCT]
2282 LSTOP: TRNE F,FR.PS1
2289 PUSHJ P,LSTNUM ;OUTPUT BYTE
2299 DOTAG: TRO F,FR.NRF ;DEFINITION IS NOT REFERENCE
2301 PUSHJ P,SYMDEF ;FLAG DEFINITION
2302 HRRZS T1 ;CLEAR FLAGS
2307 SYMDEF: TRNE F,FR.PS1 ;PASS1?
2309 TRNN F,FR.LST ;LISTING?
2311 CAIGE S,SYMTAB ;POINTS TO SYMTAB?
2312 POPJ P, ;NO. PROB POINTS TO PRETAB
2315 MOVE T1,3(S) ;GET LINE,,LINK
2316 MOVEI T2,3(S) ;GET 1ST POINTER
2317 DEFS0: TRNN T1,-1 ;END OF CHAIN?
2323 DEFS1: TLO T1,(1B0) ;FLAG DEFINITION
2324 MOVEM T1,(T2) ;PUT BACK
2329 DOHDFF: SKIPN PAGESZ ;IF PAGE = 0
2330 POPJ P, ;DON'T DO ANY HEADERS
2332 PUSHJ P,LOUCH ;FORCE NEW PAGE
2333 DOHEAD: PUSH P,T1 ;SAVE ACS
2337 MOVEM T1,LINCTR ;SET LINE COUNT TO 1
2338 MOVE T2,[POINT 7,TITL]
2344 MOVEI T1,11 ;LOAD A <TAB>
2345 SKIPE TITL ;NOT IF NO TITLE
2346 PUSHJ P,LOUCH ;OUTPUT IT
2359 MOVEI T2,[ASCIZ/) /]
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
2374 MOVEI T1,"S" ;INDICATE SYMBOL TABLE PAGE
2382 NOSUB: AOS SUBPAG ;BUMP SUBPAGE COUNTER HERE
2384 \f MOVE T2,[POINT 6,FILNAM] ;LOAD THE SOURCE FILE NAME
2391 MOVEI T1,"." ;LOAD A "."
2392 PUSHJ P,LOUCH ;AND OUTPUT IT
2393 HLLZ T2,FILEXT ;LOAD THE SOURCE FILE EXT.
2395 PUSHJ P,PUTSIX ;PRINT IT
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
2409 PUTOCT: MOVE T3,[POINT 3,T2] ;LOAD THE BTP
2410 ILDB T1,T3 ;LOAD THE BYTE
2411 JUMPE T1,.-1 ;IGNORE LEADING ZEROS
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
2420 PUTDEC: IDIVI T1,^D10 ;DIVIDE BY RADIX
2421 JUMPE T1,.+4 ;IF NULL, DO RETURN LOOP
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
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]
2436 MOVE T1,[60,,11] ;LOAD THE DAY
2438 JRST IPOPJ ;PA1050 DIES ON THIS GETTAB
2439 PUSHJ P,GETDEC ;MAKE DECIMAL ASCII
2441 IDPB T1,T3 ;DEPOSIT A HYPHEN
2442 MOVE I,[57,,11] ;LOAD THE MONTH
2445 MOVE T2,[POINT 7,MONTAB-1(I)] ;SET BTP
2446 ILDB T1,T2 ;LOAD THE BYTE
2448 IDPB T1,T3 ;DEPOSIT THE BYTE
2451 IDPB T1,T3 ;DEPOSIT ANOTHER BYTE
2452 MOVE T1,[56,,11] ;LOAD THE YEAR
2455 SUBI T1,^D1900 ;LAST TWO ONLY
2456 PUSHJ P,GETDEC ;DEPOSIT IT
2457 MOVEI T1,SPACE ;LOAD AND OUTPUT A SPACE
2459 IDPB T1,T3 ;2 SPACES
2460 MOVE T1,[61,,11] ;LOAD THE HOUR
2463 PUSHJ P,GETDEC ;AND DEPOSIT IT
2464 MOVEI T1,":" ;LOAD AND OUTPUT A COLON
2466 MOVE T1,[62,,11] ;LOAD MINUTES
2469 CAIL T1,^D10 ;TWO DIGITS?
2470 JRST .+5 ;YES, THEN DO IT
2472 MOVEI T1,"0" ;LOAD AND OUTPUT A ZERO
2474 POP P,T1 ;RESTORE T1
2475 PUSHJ P,GETDEC ;AND OUTPUT IT
2476 IPOPJ: POP P,I ;RESTORE I
2479 GETDEC: IDIVI T1,^D10 ;DIVIDE BY RADIX
2480 JUMPE T1,.+4 ;IF DONE, JUMP OUT OF LOOP
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]
2495 PUTSSX: MOVE T4,[POINT 6,T2]
2505 DOLINO: TROE F,FR.LIN ;ALREADY PRINTED?
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 #
2524 PUSHJ P,PUTDEC ;PRINT IT
2527 DOLIN2: HRRZ T1,(T2) ;IS THIS A SOURCE LINE?
2529 JRST DOLIN1 ;YES, SKIP
2531 CAIGE T1,BAKBUF ;CAME FROM BAKBUF?
2532 JRST [MOVEI T1,"M" ;NO, FLAG AS A MACRO EXPANSION LINE
2537 DOLIN1: MOVEI T1,TAB
2538 PUSHJ P,LOUCH ;& A TAB
2555 ;ADD NEW MONTHS HERE
2556 \fPASS1: TRZE F,FR.END ;DONE?
2559 PUSHJ P,IFPOP ;IF OR FRIENDS?
2563 NOP1T: JUMPN TOK,.+4
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
2573 TLNE P1,T.POP ;PSEUDO OP?
2574 JRST [PUSHJ P,PSEUDO ;DOIT
2575 JRST PASS1] ;LOOP BACK
2578 TLNN P1,T.2BYT!T.3BYT
2586 FPASS1: PUSHJ P,FLUSH
2589 LOASYM: PUSHJ P,SRCSYM
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
2599 UUO: LDB E,[POINT 9,.JBUUO##,8]
2612 \fDEFINE X(A,B,C,D),<
2637 T.POP,,0 ;SO THAT UNDEF OPCODES DON'T BUMP PC
2672 SYMTAB::BLOCK 5*SYMSIZ
2674 \fLINBLK: BLOCK ^D40 ;HOLDS MAX OF 200 CHARACTER LINE
2676 STRING: BLOCK 200 ;ROOM FOR 384 BYTES - 2 FULL PAGES OF GENERATED OUTPUT
2677 MACDUM: BLOCK ^D40 ;HOLDS 20 DUMMY MACRO ARGS
2680 MACARG: BLOCK ^D100 ;500 CHARACTERS OF MACRO ARGS
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
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
2708 STARTA: 0 ;START ADDRESS
2709 TITL: BLOCK 20 ;TITLE BUFFER
2711 SUBTLN==<.-SUBTTL>*5
2714 RELTAB: BLOCK ^D50 ;50 RELOC ADDRESSES (DUMPED WHEN GT 15)
2719 DELIM: 0 ;USED TO TELL " FROM ' IN DC & SETMAC CODE
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'