home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / utils / asmutl / lasm-tdl.lbr / LASM3.AQM / LASM3.ASM
Encoding:
Assembly Source File  |  1986-02-15  |  17.4 KB  |  1,284 lines

  1.  
  2. ***************************************
  3. * OPERATOR TABLES
  4. ***************************************
  5.  
  6. OPR$TAB$B5:
  7.     DW    BLK1$A
  8.     DW    BLK2$A
  9.     DW    BLK3$A
  10.     DW    BLK4$A
  11.     DW    BLK5$A
  12.     DW    BLK1$B
  13.  
  14. OPR$TAB$C1:
  15.     DB    (BLK2$A-BLK1$A)
  16.     DB    (BLK3$A-BLK2$A)/2
  17.     DB    (BLK4$A-BLK3$A)/3
  18.     DB    (BLK5$A-BLK4$A)/4
  19.     DB    (BLK1$B-BLK5$A)/5
  20.  
  21. OPR$TAB$C6:
  22.     DW    BLK1$B
  23.     DW    BLK2$B
  24.     DW    BLK3$B
  25.     DW    BLK4$B
  26.     DW    BLK5$B
  27.  
  28. BLK1$A:
  29.     DB    CR
  30.     DB    '('
  31.     DB    ')'
  32.     DB    '*'
  33.     DB    '+'
  34.     DB    ','
  35.     DB    '-'
  36.     DB    '/'
  37.     DB    'A'
  38.     DB    'B'
  39.     DB    'C'
  40.     DB    'D'
  41.     DB    'E'
  42.     DB    'H'
  43.     DB    'L'
  44.     DB    'M'
  45.     DB    'X'
  46.     DB    'Y'
  47.  
  48. BLK2$A:
  49.     DB    'DB'
  50.     DB    'DI'
  51.     DB    'DS'
  52.     DB    'DW'
  53.     DB    'EI'
  54.     DB    'IF'
  55.     DB    'IN'
  56.     DB    'OR'
  57.     DB    'SP'
  58.  
  59. BLK3$A:
  60.     DB    'ACI'
  61.     DB    'ADC'
  62.     DB    'ADD'
  63.     DB    'ADI'
  64.     DB    'ANA'
  65.     DB    'AND'
  66.     DB    'ANI'
  67.     DB    'BIT'
  68.     DB    'CCD'
  69.     DB    'CCI'
  70.     DB    'CMA'
  71.     DB    'CMC'
  72.     DB    'CMP'
  73.     DB    'CPI'
  74.     DB    'DAA'
  75.     DB    'DAD'
  76.     DB    'DCR'
  77.     DB    'DCX'
  78.     DB    'DEF'
  79.     DB    'END'
  80.     DB    'EQU'
  81.     DB    'EXX'
  82.     DB    'HLT'
  83.     DB    'IM0'
  84.     DB    'IM1'
  85.     DB    'IM2'
  86.     DB    'IND'
  87.     DB    'INI'
  88.     DB    'INP'
  89.     DB    'INR'
  90.     DB    'INX'
  91.     DB    'JMP'
  92.     DB    'JRC'
  93.     DB    'JRZ'
  94.     DB    'LDA'
  95.     DB    'LDD'
  96.     DB    'LDI'
  97.     DB    'LXI'
  98.     DB    'MOD'
  99.     DB    'MOV'
  100.     DB    'MVI'
  101.     DB    'NEG'
  102.     DB    'NOP'
  103.     DB    'NOT'
  104.     DB    'ORA'
  105.     DB    'ORG'
  106.     DB    'ORI'
  107.     DB    'OUT'
  108.     DB    'POP'
  109.     DB    'PSW'
  110.     DB    'RAL'
  111.     DB    'RAR'
  112.     DB    'RES'
  113.     DB    'RET'
  114.     DB    'RLC'
  115.     DB    'RLD'
  116.     DB    'RRC'
  117.     DB    'RRD'
  118.     DB    'RST'
  119.     DB    'SBB'
  120.     DB    'SBI'
  121.     DB    'SET'
  122.     DB    'SHL'
  123.     DB    'SHR'
  124.     DB    'STA'
  125.     DB    'STC'
  126.     DB    'SUB'
  127.     DB    'SUI'
  128.     DB    'SYM'
  129.     DB    'XOR'
  130.     DB    'XRA'
  131.     DB    'XRI'
  132.  
  133. BLK4$A:
  134.     DB    'CALL'
  135.     DB    'CCDR'
  136.     DB    'CCIR'
  137.     DB    'COPY'
  138.     DB    'DADC'
  139.     DB    'DADX'
  140.     DB    'DADY'
  141.     DB    'DJNZ'
  142.     DB    'DSBC'
  143.     DB    'EXAF'
  144.     DB    'INDR'
  145.     DB    'INIR'
  146.     DB    'JMPR'
  147.     DB    'JRNC'
  148.     DB    'JRNZ'
  149.     DB    'LBCD'
  150.     DB    'LDAI'
  151.     DB    'LDAR'
  152.     DB    'LDAX'
  153.     DB    'LDDR'
  154.     DB    'LDED'
  155.     DB    'LDIR'
  156.     DB    'LHLD'
  157.     DB    'LINK'
  158.     DB    'LIXD'
  159.     DB    'LIYD'
  160.     DB    'LSPD'
  161.     DB    'OTDR'
  162.     DB    'OTIR'
  163.     DB    'OUTD'
  164.     DB    'OUTI'
  165.     DB    'OUTP'
  166.     DB    'PCHL'
  167.     DB    'PCIX'
  168.     DB    'PCIY'
  169.     DB    'PUSH'
  170.     DB    'RALR'
  171.     DB    'RARR'
  172.     DB    'RETI'
  173.     DB    'RETN'
  174.     DB    'RLCR'
  175.     DB    'RRCR'
  176.     DB    'SBCD'
  177.     DB    'SDED'
  178.     DB    'SHLD'
  179.     DB    'SIXD'
  180.     DB    'SIYD'
  181.     DB    'SLAR'
  182.     DB    'SPHL'
  183.     DB    'SPIX'
  184.     DB    'SPIY'
  185.     DB    'SRAR'
  186.     DB    'SRLR'
  187.     DB    'SSPD'
  188.     DB    'STAI'
  189.     DB    'STAR'
  190.     DB    'STAX'
  191.     DB    'XCHG'
  192.     DB    'XREF'
  193.     DB    'XTHL'
  194.     DB    'XTIX'
  195.     DB    'XTIY'
  196.  
  197. BLK5$A:
  198.     DB    'EJECT'
  199.     DB    'ENDIF'
  200.     DB    'MACRO'
  201.     DB    'OUTDR'
  202.     DB    'OUTIR'
  203.     DB    'TITLE'
  204.  
  205. ******************************************************
  206. * OPCODE INDEX
  207. *   FORMAT (SOURCE FORM)
  208. *   XX-- OPCODE
  209. *   --XX INDEX
  210. ******************************************************
  211.  
  212. BLK1$B:
  213.     DW    0A0FH        ;CR
  214.     DW    140CH        ;(
  215.     DW    1E0DH        ;)
  216.     DW    5000H        ;*
  217.     DW    4605H        ;+
  218.     DW    0A0EH        ;COMMA
  219.     DW    4606H        ;-
  220.     DW    5001H        ;/
  221.     DW    0710H        ;A
  222.     DW    0010H        ;B
  223.     DW    0110H        ;C
  224.     DW    0210H        ;D
  225.     DW    0310H        ;E
  226.     DW    0410H        ;H
  227.     DW    0510H        ;L
  228.     DW    0610H        ;M
  229.     DW    1410H        ;X
  230.     DW    2410H        ;Y
  231.  
  232. BLK2$B:
  233.     DW    00111H        ;DB
  234.     DW    0F313H        ;DI
  235.     DW    00211H        ;DS
  236.     DW    00311H        ;DW
  237.     DW    0FB13H        ;EI
  238.     DW    00811H        ;IF
  239.     DW    0DB1AH        ;IN
  240.     DW    0280AH        ;OR
  241.     DW    00610H        ;SP
  242.  
  243. BLK3$B:
  244.     DW    0CE1AH        ;ACI
  245.     DW    0881DH        ;ADC
  246.     DW    0801DH        ;ADD
  247.     DW    0C61AH        ;ADI
  248.     DW    0A01DH        ;ANA
  249.     DW    03209H        ;AND
  250.     DW    0E61AH        ;ANI
  251.     DW    04028H        ;BIT
  252.     DW    0A91CH        ;CCD
  253.     DW    0A11CH        ;CCI
  254.     DW    02F13H        ;CMA
  255.     DW    03F13H        ;CMC
  256.     DW    0B81DH        ;CMP
  257.     DW    0FE1AH        ;CPI
  258.     DW    02713H        ;DAA
  259.     DW    00915H        ;DAD
  260.     DW    0051EH        ;DCR
  261.     DW    00B1FH        ;DCX
  262.     DW    00B11H        ;DEF (was NOW/SET)
  263.     DW    00411H        ;END
  264.     DW    00711H        ;EQU
  265.     DW    0D913H        ;EXX
  266.     DW    07613H        ;HLT
  267.     DW    0461CH        ;IM0
  268.     DW    0561CH        ;IM1
  269.     DW    05E1CH        ;IM2
  270.     DW    0AA1CH        ;IND
  271.     DW    0A21CH        ;INI
  272.     DW    04021H        ;INP
  273.     DW    0041EH        ;INR
  274.     DW    0031FH        ;INX
  275.     DW    0C317H        ;JMP
  276.     DW    0382BH        ;JRC
  277.     DW    0282BH        ;JRZ
  278.     DW    03A17H        ;LDA
  279.     DW    0A81CH        ;LDD
  280.     DW    0A01CH        ;LDI
  281.     DW    00114H        ;LXI
  282.     DW    05002H        ;MOD
  283.     DW    04018H        ;MOV
  284.     DW    00619H        ;MVI
  285.     DW    0441CH        ;NEG
  286.     DW    00013H        ;NOP
  287.     DW    03C08H        ;NOT
  288.     DW    0B01DH        ;ORA
  289.     DW    00A11H        ;ORG
  290.     DW    0F61AH        ;ORI
  291.     DW    0D31AH        ;OUT
  292.     DW    0C116H        ;POP
  293.     DW    00610H        ;PSW
  294.     DW    01713H        ;RAL
  295.     DW    01F13H        ;RAR
  296.     DW    08028H        ;RES
  297.     DW    0C913H        ;RET
  298.     DW    00713H        ;RLC
  299.     DW    06F1CH        ;RLD
  300.     DW    00F13H        ;RRC
  301.     DW    0671CH        ;RRD
  302.     DW    0C720H        ;RST
  303.     DW    0981DH        ;SBB
  304.     DW    0DE1AH        ;SBI
  305.     DW    0C028H        ;SET
  306.     DW    05003H        ;SHL
  307.     DW    05004H        ;SHR
  308.     DW    03217H        ;STA
  309.     DW    03713H        ;STC
  310.     DW    0901DH        ;SUB
  311.     DW    0D61AH        ;SUI
  312.     DW    00D11H        ;SYM
  313.     DW    0280BH        ;XOR
  314.     DW    0A81DH        ;XRA
  315.     DW    0EE1AH        ;XRI
  316.  
  317. BLK4$B:
  318.     DW    0CD17H        ;CALL
  319.     DW    0B91CH        ;CCDR
  320.     DW    0B11CH        ;CCIR
  321.     DW    01011H        ;COPY
  322.     DW    04A24H        ;DADC
  323.     DW    00929H        ;DADX
  324.     DW    0092AH        ;DADY
  325.     DW    0102BH        ;DJNZ
  326.     DW    04224H        ;DSBC
  327.     DW    00813H        ;EXAF
  328.     DW    0BA1CH        ;INDR
  329.     DW    0B21CH        ;INIR
  330.     DW    0182BH        ;JMPR
  331.     DW    0302BH        ;JRNC
  332.     DW    0202BH        ;JRNZ
  333.     DW    04B25H        ;LBCD
  334.     DW    0571CH        ;LDAI
  335.     DW    05F1CH        ;LDAR
  336.     DW    00A1BH        ;LDAX
  337.     DW    0B81CH        ;LDDR
  338.     DW    05B25H        ;LDED
  339.     DW    0B01CH        ;LDIR
  340.     DW    02A17H        ;LHLD
  341.     DW    00611H        ;LINK
  342.     DW    02A26H        ;LIXD
  343.     DW    02A27H        ;LIYD
  344.     DW    07B25H        ;LSPD
  345.     DW    0BB1CH        ;OTDR
  346.     DW    0B31CH        ;OTIR
  347.     DW    0AB1CH        ;OUTD
  348.     DW    0A31CH        ;OUTI
  349.     DW    04121H        ;OUTP
  350.     DW    0E913H        ;PCHL
  351.     DW    0E922H        ;PCIX
  352.     DW    0E923H        ;PCIY
  353.     DW    0C516H        ;PUSH
  354.     DW    0102CH        ;RALR
  355.     DW    0182CH        ;RARR
  356.     DW    04D1CH        ;RETI
  357.     DW    0451CH        ;RETN
  358.     DW    0002CH        ;RLCR
  359.     DW    0082CH        ;RRCR
  360.     DW    04325H        ;SBCD
  361.     DW    05325H        ;SDED
  362.     DW    02217H        ;SHLD
  363.     DW    02226H        ;SIXD
  364.     DW    02227H        ;SIYD
  365.     DW    0202CH        ;SLAR
  366.     DW    0F913H        ;SPHL
  367.     DW    0F922H        ;SPIX
  368.     DW    0F923H        ;SPIY
  369.     DW    0282CH        ;SRAR
  370.     DW    0382CH        ;SRLR
  371.     DW    07325H        ;SSPD
  372.     DW    0471CH        ;STAI
  373.     DW    04F1CH        ;STAR
  374.     DW    0021BH        ;STAX
  375.     DW    0EB13H        ;XCHG
  376.     DW    00E11H        ;XREF
  377.     DW    0E313H        ;XTHL
  378.     DW    0E322H        ;XTIX
  379.     DW    0E323H        ;XTIY
  380.  
  381. BLK5$B:
  382.     DW    00F11H        ;EJECT
  383.     DW    00511H        ;ENDIF
  384.     DW    00911H        ;MACRO
  385.     DW    0BB1CH        ;OUTDR
  386.     DW    0B31CH        ;OUTIR
  387.     DW    00C11H        ;TITLE
  388.  
  389. ***************************************
  390. * JMP,CALL,RET LIST
  391. ***************************************
  392.  
  393. JCR$LIST:
  394.     DB    'NZ'
  395.     DB    'Z '
  396.     DB    'NC'
  397.     DB    'C '
  398.     DB    'PO'
  399.     DB    'PE'
  400.     DB    'P '
  401.     DB    'M '
  402.  
  403. ***************************************
  404.  
  405. L0C8F:
  406.     MVI    E,0FFH
  407.     INR    B
  408.     MVI    C,0
  409.  
  410. ***************************************
  411. * SCAN FOR OPERATOR
  412. * SCHEME PROCEEDS AS A SUCCESSIVE APPROXIMATION
  413. ***************************************
  414.  
  415. L0C94:
  416.     XRA    A
  417.     MOV    A,B
  418.     ADD    C
  419.     RAR
  420.     CMP    E
  421.     JZ    L0CD0
  422.     MOV    E,A
  423.     PUSH    H
  424.     PUSH    D
  425.     PUSH    B
  426.     PUSH    H
  427.     MOV    B,D
  428.     MOV    C,B
  429.     MVI    D,0
  430.     LXI    H,0
  431. L0CA8:
  432.     DAD    D
  433.     DCR    B
  434.     JNZ    L0CA8
  435.     POP    D
  436.     DAD    D
  437.     LXI    D,STRING
  438. L0CB2:
  439.     LDAX    D
  440.     CMP    M        ;COMPARE INPUT STRING TO LIST.
  441.     INX    D
  442.     INX    H
  443.     JNZ    L0CC2
  444.     DCR    C
  445.     JNZ    L0CB2
  446.     POP    B
  447.     POP    D
  448.     POP    H
  449.     MOV    A,E
  450.     RET
  451. L0CC2:
  452.     POP    B
  453.     POP    D
  454.     POP    H
  455.     JC    L0CCC
  456.     MOV    C,E
  457.     JMP    L0C94
  458. L0CCC:
  459.     MOV    B,E
  460.     JMP    L0C94
  461. L0CD0:
  462.     XRA    A
  463.     INR    A
  464.     RET
  465. L0CD3:
  466.     LDA    STRING
  467.     LXI    B,LC217
  468.     CPI    'J'
  469.     RZ
  470.     MVI    B,0C4H
  471.     CPI    'C'
  472.     RZ
  473.     LXI    B,LC013
  474.     CPI    'R'
  475.     RET
  476.  
  477. ***************************************
  478. * SCAN JMP,CALL,RET CONDITIONAL LIST
  479. ***************************************
  480.  
  481. SCAN$JCR:
  482.     LDA    STR$SIZE
  483.     CPI    4
  484.     JNC    L0D19
  485.     CPI    3
  486.     JZ    L0CFE
  487.     CPI    2
  488.     JNZ    L0D19
  489.     LXI    H,STRING+2
  490.     MVI    M,' '
  491. L0CFE:
  492.     LXI    B,8
  493.     LXI    D,JCR$LIST
  494. L0D04:
  495.     LXI    H,STRING+1    
  496.     LDAX    D
  497.     CMP    M
  498.     INX    D
  499.     JNZ    L0D11
  500.     LDAX    D
  501.     INX    H
  502.     CMP    M
  503.     RZ
  504. L0D11:
  505.     INX    D
  506.     INR    B
  507.     DCR    C
  508.     JNZ    L0D04
  509.     INR    C
  510.     RET
  511. L0D19:
  512.     XRA    A
  513.     INR    A
  514.     RET
  515.  
  516. ***************************************
  517. * PREPARE TO SCAN FOR OPERATOR
  518. * FIRST INDEX INTO LISTS.
  519. ***************************************
  520.  
  521. SCAN$OP:
  522.     LDA    STR$SIZE    ;STRING CTR 0120H
  523.     MOV    C,A
  524.     DCR    A
  525.     MOV    E,A
  526.     MVI    D,0
  527.     PUSH    D
  528.     CPI    5
  529.     JNC    L0D66        ;BR IF STRING > 5 CHAR. 0D66H
  530.     LXI    H,OPR$TAB$C1    ;BLOCK SIZE. 0AC1H
  531.     DAD    D
  532.     MOV    B,M        ;B=NUMBER OF TABLE ENTRIES
  533.     LXI    H,OPR$TAB$B5
  534.     DAD    D
  535.     DAD    D
  536.     MOV    D,M
  537.     INX    H
  538.     MOV    H,M
  539.     MOV    L,D        ;HL = START TABLE ADDRESS
  540.     MOV    D,C        ;D = NUMBER CHARS IN STRING
  541.     CALL    L0C8F
  542.     JNZ    L0D51        ;OPERATOR NOT LISTED
  543.     POP    D
  544.     LXI    H,OPR$TAB$C6
  545.     DAD    D
  546.     DAD    D
  547.     MOV    E,M
  548.     INX    H
  549.     MOV    D,M        ;POINT TO BLOCK ORG
  550.     MOV    L,A
  551.     MVI    H,0
  552.     DAD    H
  553.     DAD    D
  554.     MOV    A,M        ;GET INDEX VALUES (BLK(X)$B
  555.     INX    H
  556.     MOV    B,M
  557.     RET
  558. L0D51:
  559.     POP    D
  560.     CALL    L0CD3        ;IS FIRST CHARACTER A J,C OR R?
  561.     RNZ            ;NO--RETURN OP NOT FOUND
  562.     PUSH    B
  563.     CALL    SCAN$JCR    ;IS IT FOLLOWED BY A CONDITION CODE?
  564.     MOV    A,B
  565.     POP    B
  566.     RNZ            ;NO--RETURN OP NOT FOUND
  567.     ORA    A        ;A HAS THE CONDITION CODE FROM SCAN$JCR
  568.     RAL
  569.     RAL
  570.     RAL
  571.     ORA    B
  572.     MOV    B,A
  573.     MOV    A,C
  574.     CMP    A
  575.     RET
  576. L0D66:
  577.     POP    D
  578.     XRA    A
  579.     INR    A
  580.     RET
  581.  
  582. ***************************************
  583. * EXPRESSION STACKS
  584. * CONSISTS OF THREE STACKS
  585. * 00 = PRIMARY     LIMIT 16
  586. * 01 = NEXT LEVEL     10
  587. * 02 = NEXT LEVEL     10
  588. ***************************************
  589.  
  590. EXP$STAK$PTR02:
  591.     DB    0
  592. EXP$STACK$01:            ;EXP$STACK$01
  593.     DB    0,0,0,0,0,0,0,0,0,0
  594. EXP$STACK$02:
  595.     DB    0,0,0,0,0,0,0,0,0,0
  596. EXP$STACK$00:
  597.     DB    0,0,0,0,0,0,0,0,0,0,0,0,0
  598.     DB    0,0,0
  599. EXP$STAK$PTR01:
  600.     DB    0
  601. EXP$STAK$PTR$00:
  602.     DB    0
  603.  
  604. ***************************************
  605. * PUT ITEM ON EXPRESSION STACK
  606. ***************************************
  607.  
  608. PUT$EXP00$00:
  609.     XCHG
  610.     LXI    H,EXP$STAK$PTR$00
  611.     MOV    A,M
  612.     CPI    16        ;LIMIT EXCEEDED?
  613.     JC    PUT$EXP00$01
  614.     CALL    EXP$ERROR
  615.     MVI    M,0
  616. PUT$EXP00$01:
  617.     MOV    A,M
  618.     INR    M
  619.     INR    M
  620.     MOV    C,A
  621.     MVI    B,0
  622.     LXI    H,EXP$STACK$00
  623.     DAD    B
  624.     MOV    M,E
  625.     INX    H
  626.     MOV    M,D
  627.     RET
  628. PUT$EXP$02:
  629.     PUSH    PSW
  630.     LXI    H,EXP$STAK$PTR01
  631.     MOV    A,M
  632.     CPI    10        ;LIMIT EXCEEDED?
  633.     JC    PUT$EXP$03
  634.     MVI    M,0
  635.     CALL    EXP$ERROR
  636. PUT$EXP$03:
  637.     MOV    E,M
  638.     MVI    D,0
  639.     INR    M
  640.     POP    PSW
  641.     LXI    H,EXP$STACK$01    ;EXP$STACK$01H
  642.     DAD    D
  643.     MOV    M,A
  644.     LXI    H,EXP$STACK$02
  645.     DAD    D
  646.     MOV    M,B
  647.     RET
  648.  
  649. ***************************************
  650. * GET AN EXPRESSION ITEM
  651. * RETURN WITH IT IN (HL)
  652. ***************************************
  653.  
  654. GET$EXP$ITEM:
  655.     LXI    H,EXP$STAK$PTR$00
  656.     MOV    A,M
  657.     ORA    A
  658.     JNZ    L0DDC
  659.     CALL    EXP$ERROR
  660.     LXI    H,0
  661.     RET
  662. L0DDC:
  663.     DCR    M
  664.     DCR    M
  665.     MOV    C,M
  666.     MVI    B,0
  667.     LXI    H,EXP$STACK$00
  668.     DAD    B
  669.     MOV    C,M
  670.     INX    H
  671.     MOV    H,M
  672.     MOV    L,C
  673.     RET
  674.  
  675. ***************************************
  676. * GET TWO EXPRESSION ITEMS
  677. * RETURN WITH 1ST IN H
  678. *             2ND IN D
  679. ***************************************
  680.  
  681. GET$2EXP$ITEMS:
  682.     CALL    GET$EXP$ITEM
  683.     XCHG
  684.     CALL    GET$EXP$ITEM
  685.     RET
  686.  
  687. ***************************************
  688. * GET EXPRESSION OPERATOR
  689. ***************************************
  690.  
  691. GET$EXP$OP:
  692.     MOV    L,A
  693.     MVI    H,0
  694.     DAD    H
  695.     LXI    D,EXP$OP$INDEX
  696.     DAD    D
  697.     MOV    E,M
  698.     INX    H
  699.     MOV    H,M
  700.     MOV    L,E
  701.     PCHL
  702. EXP$OP$INDEX:
  703.     DW    AB$00        ; *
  704.     DW    AB$01        ; /
  705.     DW    AB$02        ; MOD
  706.     DW    AB$03        ; SHL
  707.     DW    AB$04        ; SHR
  708.     DW    AB$05        ; +
  709.     DW    AB$06        ; -
  710.     DW    AB$07        ; (unary)
  711.     DW    AB$08        ; NOT
  712.     DW    AB$09        ; AND
  713.     DW    AB$10        ; OR
  714.     DW    AB$11        ; XOR
  715.     DW    EXP$ERROR
  716.  
  717. ***************************************
  718. * GET TWO EXPRESSION ITEMS
  719. * RETURN WITH 2ND ITEM IN ACC
  720. ***************************************
  721.  
  722. GET$2EXP$01:
  723.     CALL    GET$2EXP$ITEMS
  724.     MOV    A,D
  725.     ORA    A
  726.     JNZ    L0E25
  727.     MOV    A,E
  728.     CPI    11H
  729.     RC
  730. L0E25:
  731.     CALL    EXP$ERROR
  732.     MVI    A,10H
  733.     RET
  734. L0E2B:
  735.     XRA    A
  736.     SUB    L
  737.     MOV    L,A
  738.     MVI    A,0
  739.     SBB    H
  740.     MOV    H,A
  741.     RET
  742. L0E33:
  743.     CALL    GET$2EXP$ITEMS
  744. L0E36:
  745.     XCHG
  746.     SHLD    L0E69
  747.     LXI    H,L0E6B
  748.     MVI    M,11H
  749.     LXI    B,0
  750.     PUSH    B
  751.     XRA    A
  752. L0E44:
  753.     MOV    A,E
  754.     RAL
  755.     MOV    E,A
  756.     MOV    A,D
  757.     RAL
  758.     MOV    D,A
  759.     DCR    M
  760.     POP    H
  761.     RZ
  762.     MVI    A,0
  763.     ACI    0
  764.     DAD    H
  765.     MOV    B,H
  766.     ADD    L
  767.     LHLD    L0E69
  768.     SUB    L
  769.     MOV    C,A
  770.     MOV    A,B
  771.     SBB    H
  772.     MOV    B,A
  773.     PUSH    B
  774.     JNC    L0E62
  775.     DAD    B
  776.     XTHL
  777. L0E62:
  778.     LXI    H,L0E6B
  779.     CMC
  780.     JMP    L0E44
  781. L0E69:
  782.     DB    0,0
  783. L0E6B:
  784.     DB    0
  785. L0E6C:
  786.     MOV    B,H
  787.     MOV    C,L
  788.     LXI    H,0
  789. L0E71:
  790.     XRA    A
  791.     MOV    A,B
  792.     RAR
  793.     MOV    B,A
  794.     MOV    A,C
  795.     RAR
  796.     MOV    C,A
  797.     JC    L0E80
  798.     ORA    B
  799.     RZ
  800.     JMP    L0E81
  801. L0E80:
  802.     DAD    D
  803. L0E81:
  804.     XCHG
  805.     DAD    H
  806.     XCHG
  807.     JMP    L0E71
  808.  
  809. *****************************
  810. * MULTIPLY *
  811. *****************************
  812.  
  813. AB$00:    CALL    GET$2EXP$ITEMS
  814.     CALL    L0E6C
  815.     JMP    PUT$EXP00$00
  816.  
  817. *****************************
  818. * DIVIDE /
  819. *****************************
  820.  
  821. AB$01:    CALL    L0E33
  822.     XCHG
  823.     JMP    PUT$EXP00$00
  824.  
  825. *****************************
  826. * MODULO ARITHMETIC (MOD)
  827. *****************************
  828.  
  829. AB$02:    CALL    L0E33
  830.     JMP    PUT$EXP00$00
  831.  
  832. *****************************
  833. * SHIFT LEFT SHL
  834. *****************************
  835.  
  836. AB$03:    CALL    GET$2EXP$01
  837. L0EA0: 
  838.     ORA    A
  839.     JZ    PUT$EXP00$00
  840.     DAD    H
  841.     DCR    A
  842.     JMP    L0EA0
  843.  
  844. *****************************
  845. * SHIFT RIGHT SHR
  846. *****************************
  847.  
  848. AB$04:    CALL    GET$2EXP$01
  849. L0EAC: 
  850.     ORA    A
  851.     JZ    PUT$EXP00$00
  852.     PUSH    PSW
  853.     XRA    A
  854.     MOV    A,H
  855.     RAR
  856.     MOV    H,A
  857.     MOV    A,L
  858.     RAR
  859.     MOV    L,A
  860.     POP    PSW
  861.     DCR    A
  862.     JMP    L0EAC
  863.  
  864. *****************************
  865. * PLUS +
  866. *****************************
  867.  
  868. AB$05:    CALL    GET$2EXP$ITEMS
  869. L0EC0: 
  870.     DAD    D
  871.     JMP    PUT$EXP00$00
  872.  
  873. *****************************
  874. * MINUS -
  875. *****************************
  876.  
  877. AB$06:    CALL    GET$2EXP$ITEMS
  878.     XCHG
  879.     CALL    L0E2B
  880.     JMP    L0EC0
  881.  
  882. *****************************
  883.  
  884. AB$07:    CALL    GET$EXP$ITEM
  885. L0ED1: 
  886.     CALL    L0E2B
  887.     JMP    PUT$EXP00$00
  888.  
  889. *****************************
  890. * NOT
  891. *****************************
  892.  
  893. AB$08:    CALL    GET$EXP$ITEM
  894.     INX    H
  895.     JMP    L0ED1
  896.  
  897. *****************************
  898. * AND
  899. *****************************
  900.  
  901. AB$09:    CALL    GET$2EXP$ITEMS
  902.     MOV    A,D
  903.     ANA    H
  904.     MOV    H,A
  905.     MOV    A,E
  906.     ANA    L
  907.     MOV    L,A
  908.     JMP    PUT$EXP00$00
  909.  
  910. *****************************
  911. * OR
  912. *****************************
  913.  
  914. AB$10:    CALL    GET$2EXP$ITEMS
  915.     MOV    A,D
  916.     ORA    H
  917.     MOV    H,A
  918.     MOV    A,E
  919.     ORA    L
  920.     MOV    L,A
  921.     JMP    PUT$EXP00$00
  922.  
  923. *****************************
  924. * XOR
  925. *****************************
  926.  
  927. AB$11:    CALL    GET$2EXP$ITEMS
  928.     MOV    A,D
  929.     XRA    H
  930.     MOV    H,A
  931.     MOV    A,E
  932.     XRA    L
  933.     MOV    L,A
  934.     JMP    PUT$EXP00$00
  935.  
  936. *****************************
  937. * Input Expression Evaluator
  938. *****************************
  939.  
  940. L0F02:
  941.     LDA    STR$TYPE
  942.     CPI    4
  943.     RNZ
  944.     LDA    STRING
  945.     CPI    CR        ;Check Terminators
  946.     RZ
  947.     CPI    ';'
  948.     RZ
  949.     CPI    ','
  950.     RZ
  951.     CPI    '!'
  952.     RZ
  953.     CPI    '['
  954.     RZ
  955.     CPI    ']'
  956.     RZ
  957.     RET
  958.  
  959. L0F17:
  960.     XRA    A
  961.     STA    EXP$STAK$PTR01
  962.     STA    EXP$STAK$PTR$00
  963.     DCR    A
  964.     STA    EXP$STAK$PTR02
  965.     LXI    H,0
  966.     SHLD    L0161
  967. L0F28:
  968.     CALL    L0F02
  969.     JNZ    L0F5B
  970. L0F2E:
  971.     LXI    H,EXP$STAK$PTR01
  972.     MOV    A,M
  973.     ORA    A
  974.     JZ    L0F46
  975.     DCR    M
  976.     MOV    E,A
  977.     DCR    E
  978.     MVI    D,0
  979.     LXI    H,EXP$STACK$01
  980.     DAD    D
  981.     MOV    A,M
  982.     CALL    GET$EXP$OP
  983.     JMP    L0F2E
  984. L0F46:
  985.     LDA    EXP$STAK$PTR$00
  986.     CPI    2
  987.     CNZ    EXP$ERROR
  988.     LDA    PRN$LINE
  989.     CPI    ' '
  990.     RNZ
  991.     LHLD    EXP$STACK$00
  992.     SHLD    L0161
  993.     RET
  994. L0F5B:
  995.     LDA    PRN$LINE
  996.     CPI    ' '
  997.     JNZ    L107D
  998.     LDA    STR$TYPE
  999.     CPI    3
  1000.     JNZ    L0F87
  1001.     LDA    STR$SIZE
  1002.     ORA    A
  1003.     CZ    EXP$ERROR
  1004.     CPI    3
  1005.     CNC    EXP$ERROR
  1006.     MVI    D,0
  1007.     LXI    H,STRING
  1008.     MOV    E,M
  1009.     INX    H
  1010.     DCR    A
  1011.     JZ    L0F83
  1012.     MOV    D,M
  1013. L0F83:
  1014.     XCHG
  1015.     JMP    L106F
  1016. L0F87:
  1017.     CPI    2
  1018.     JNZ    L0F92
  1019.     LHLD    STR$VAL
  1020.     JMP    L106F
  1021. L0F92:
  1022.     CALL    SCAN$OP
  1023.     JNZ    L102F
  1024.     CPI    10H
  1025.     JNC    L1024
  1026.     CPI    0CH
  1027.     MOV    C,A
  1028.     LDA    EXP$STAK$PTR02
  1029.     JNZ    L0FB3
  1030.     ORA    A
  1031.     CZ    EXP$ERROR
  1032.     MVI    A,0FFH
  1033.     STA    EXP$STAK$PTR02
  1034.     MOV    A,C
  1035.     JMP    L1001
  1036. L0FB3:
  1037.     ORA    A
  1038.     JNZ    L100C
  1039. L0FB7:
  1040.     PUSH    B
  1041.     LDA    EXP$STAK$PTR01
  1042.     ORA    A
  1043.     JZ    L0FDC
  1044.     MOV    E,A
  1045.     DCR    E
  1046.     MVI    D,0
  1047.     LXI    H,EXP$STACK$02
  1048.     DAD    D
  1049.     MOV    A,M
  1050.     CMP    B
  1051.     JC    L0FDC
  1052.     LXI    H,EXP$STAK$PTR01
  1053.     MOV    M,E
  1054.     LXI    H,EXP$STACK$01
  1055.     DAD    D
  1056.     MOV    A,M
  1057.     CALL    GET$EXP$OP
  1058.     POP    B
  1059.     JMP    L0FB7
  1060. L0FDC:
  1061.     POP    B
  1062.     MOV    A,C
  1063.     CPI    CR
  1064.     JNZ    L1001
  1065.     LXI    H,EXP$STAK$PTR01
  1066.     MOV    A,M
  1067.     ORA    A
  1068.     JZ    L0FFA
  1069.     DCR    A
  1070.     MOV    M,A
  1071.     MOV    E,A
  1072.     MVI    D,0
  1073.     LXI    H,EXP$STACK$01
  1074.     DAD    D
  1075.     MOV    A,M
  1076.     CPI    0CH
  1077.     JZ    L0FFD
  1078. L0FFA:
  1079.     CALL    EXP$ERROR
  1080. L0FFD:
  1081.     XRA    A
  1082.     JMP    L1006
  1083. L1001:
  1084.     CALL    PUT$EXP$02
  1085.     MVI    A,0FFH
  1086. L1006:
  1087.     STA    EXP$STAK$PTR02
  1088.     JMP    L107D
  1089. L100C:
  1090.     MOV    A,C
  1091.     CPI    5
  1092.     JZ    L107D
  1093.     CPI    6
  1094.     JNZ    L101C
  1095.     INR    A
  1096.     MOV    C,A
  1097.     JMP    L0FB7
  1098. L101C:
  1099.     CPI    8
  1100.     CNZ    EXP$ERROR
  1101.     JMP    L0FB7
  1102. L1024:
  1103.     CPI    11H
  1104.     CZ    EXP$ERROR
  1105.     MOV    L,B
  1106.     MVI    H,0
  1107.     JMP    L106F
  1108. L102F:
  1109.     LDA    STR$TYPE
  1110.     CPI    4
  1111.     JNZ    L104E
  1112.     LDA    STRING
  1113.     CPI    '$'        ;24H
  1114.     JZ    L1048
  1115.     CALL    EXP$ERROR
  1116.     LXI    H,0
  1117.     JMP    L106F
  1118. L1048:
  1119.     LHLD    LOC$CTR2
  1120.     JMP    L106F
  1121. L104E:
  1122.     CALL    SYM$SERCH
  1123.     CALL    SYM$05
  1124.     JNZ    L1062
  1125.     MVI    A,'P'        ;PHASE ERROR. 50H
  1126.     CALL    ERR$COD
  1127.     CALL    POST$SYM
  1128.     JMP    L106C
  1129. L1062:
  1130.     CALL    SYM$18
  1131.     ANI    7
  1132.     MVI    A,'U'        ;UNDEFINED SYMBOL. 55H
  1133.     CZ    ERR$COD
  1134. L106C:
  1135.     CALL    GET$SYM$VAL
  1136. ;
  1137. ; PUT XREF ITEM IN TABLE
  1138. ;
  1139.     LDA    PASS$NM
  1140.     ORA    A
  1141.     JZ    L106F
  1142.     LDA    FLAG$BYT
  1143.     ANI    XREFF        ;XREF FLAG?
  1144.     JZ    L106F
  1145.     PUSH    H
  1146.     PUSH    D
  1147.     INX    D        ;POINT TO SYMBOL LINE #.
  1148.     LHLD    XREF$PTR    ;GET NEXT XREF LOCATION
  1149.     LDAX    D        ;MOV IN SYMBOL LINE #.
  1150.     MOV    M,A
  1151.     INX    D
  1152.     INX    H
  1153.     LDAX    D
  1154.     MOV    M,A
  1155.     INX    H
  1156.     LDA    LINE$NM
  1157.     MOV    M,A
  1158.     INX    H
  1159.     LDA    LINE$NM+1
  1160.     MOV    M,A
  1161.     LXI    D,-7
  1162.     DAD    D
  1163.     SHLD    XREF$PTR
  1164.     XCHG
  1165.     LHLD    SYM$TAB$PTR
  1166.     MOV    A,L
  1167.     SUB    E
  1168.     MOV    A,H
  1169.     SBB    D
  1170.     POP    D
  1171.     POP    H
  1172.     JNC    SYM$15
  1173. L106F:
  1174.     LDA    EXP$STAK$PTR02
  1175.     ORA    A
  1176.     CZ    EXP$ERROR
  1177.     XRA    A
  1178.     STA    EXP$STAK$PTR02
  1179.     CALL    PUT$EXP00$00
  1180. L107D:
  1181.     CALL    GET$STR
  1182.     JMP    L0F28
  1183.  
  1184. *****************************
  1185. * EXPRESSION ERROR
  1186. *****************************
  1187.  
  1188. EXP$ERROR:
  1189.     PUSH    H
  1190.     MVI    A,'E'        ;EXPRESSION ERROR. 45H
  1191.     CALL    ERR$COD
  1192.     POP    H
  1193.     RET
  1194.  
  1195. *****************************
  1196. * START OF PROCESSING
  1197. *****************************
  1198.  
  1199. MAIN:
  1200.     XRA    A
  1201.     STA    PASS$NM        ;RESET PASS #
  1202.  
  1203.     LHLD    CPM+6        ;GET TOP OF MEM
  1204.     LXI    D,-808H        ;BELOW CCP
  1205.     DAD    D
  1206.     SHLD    CCP$BEGIN
  1207.  
  1208.     LXI    D,-8
  1209.     DAD    D
  1210.     SHLD    XREF$PTR    ;INIT XREF POINTER
  1211.     CALL    CL$SYM$HASH$LST    ;CLEAR SYM$HASH$LST
  1212.  
  1213. MAIN$00:
  1214.     CALL    PRN$END$LINE    ;PRINT END LINE
  1215.     LDA    PASS$NM
  1216.     ADI    '1'
  1217.     STA    PAS$MSG+5
  1218.     LXI    H,PAS$MSG    ;ANNUNCIATE PASS 1
  1219.     CALL    MSGOUT
  1220.     LXI    H,SRCFCB    ;MOVE FILE NAME
  1221.     CALL    MOVNAM        ;FROM TFCB TO SRC FCB
  1222.     CALL    RESET$SRC    ;RESET SOURCE FILE
  1223.     XRA    A
  1224.     STA    COPY$LEVEL
  1225.     STA    OBJ$BYTE$CNT
  1226.     LXI    H,0
  1227.     SHLD    L1686
  1228.     SHLD    LOC$CTR1
  1229.     SHLD    LOC$CTR2
  1230.     SHLD    L1688
  1231.  
  1232. MAIN$01:
  1233.     CALL    GET$STR        ;GET STRING
  1234.  
  1235. MAIN$02:
  1236.     LDA    STR$TYPE
  1237.     CPI    2        ;IS IT NUMERIC?
  1238.     JZ    MAIN$01
  1239.     CPI    4        ;OR OTHER DELIMITERS
  1240.     JNZ    MAIN$03
  1241.     LDA    STRING
  1242.     CPI    '*'
  1243.     JNZ    END$LINE
  1244.     CALL    L159B
  1245.     JNZ    SYNTAX$ERR
  1246.     JMP    E$LINE$01
  1247.  
  1248. MAIN$03:
  1249.     CPI    1        ;IF IT ISNT ALPHA, THEN ERROR
  1250.     JNZ    SYNTAX$ERR
  1251.     CALL    SCAN$OP        ;SCAN OPERATION.
  1252.     JZ    L1125        ;BR IF OPERATION FOUND.
  1253.     CALL    SYM$SERCH    ;ELSE SEE IF ITS A SYMBOL
  1254.     CALL    SYM$05
  1255.     JNZ    MAIN$04
  1256.     CALL    POST$SYM
  1257.     LDA    PASS$NM
  1258.     ORA    A
  1259.     CNZ    PHASE$ERR
  1260.     JMP    MAIN$05
  1261.  
  1262. MAIN$04:
  1263.     CALL    SYM$18
  1264.     CPI    6
  1265.     JNZ    MAIN$05
  1266.     CALL    NOT$IMP$ERR
  1267.     JMP    E$LINE$01
  1268.  
  1269. MAIN$05:
  1270.     LHLD    L1686
  1271.     MOV    A,L
  1272.     ORA    H
  1273.     CNZ    LABLE$ERR
  1274.     LHLD    SYM$HASH$PTR
  1275.     SHLD    L1686
  1276.     CALL    GET$STR
  1277.     LDA    STR$TYPE
  1278.     CPI    4
  1279.     JNZ    MAIN$02
  1280.     LDA    STRING
  1281.     CPI    ':'
  1282.     JNZ    MAIN$02
  1283.     JMP    MAIN$01
  1284.