home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / cpm80 / mac80a.mac < prev    next >
Text File  |  2020-01-01  |  60KB  |  2,731 lines

  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. MAIN.:    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. BYTE3:    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. ;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. DODT22:    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. DODAT4:    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.     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.     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. EXDIV:    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. TOKEN:    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. ;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. PSEUDO:    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. ORG:    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. DC:    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. DC2:    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. DC4:    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. DOMAC:    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. DOM12:    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. EQUAL:    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. DOIFE:    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. EVAL:    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. DOSYM2:    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. ;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. SRCF:    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. SRCI:    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. GETNUM:    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. SETM1:    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. INCH:    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. INCHL:    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. NOALT1:    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. HEXHED:    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. IFN 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. EOFBYT:
  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. TYPE01:    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. CHKERR:    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. OUTOP:    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. HEXOUT:    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. IFN 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. IFN 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. PRT4:    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. PRTX:
  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. LSTNUM:    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. ;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. ;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.  
  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.     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. GTDATE:    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. PUTSIX:    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. PASS1:    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. DEFINE 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.     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. LINBLK:    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