home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpm / debug / wadesrc.lbr / MONASM.AZM / MONASM.ASM
Assembly Source File  |  1988-06-19  |  7KB  |  429 lines

  1.     title    'Assembler Module for Monitor'
  2. ;
  3. ;    Last Edited    84-06-24    Wagner
  4. ;
  5. ;    Copyright (c) 1984 by
  6. ;
  7. ;        Thomas Wagner
  8. ;        Patschkauer Weg 31
  9. ;        1000 Berlin 33
  10. ;        West Germany
  11. ;
  12. ;       Released to the public domain 1987
  13. ;
  14.     maclib    z80
  15.     maclib    monopt
  16. ;
  17.     public    assemble
  18.     public    opnd1,opnd2
  19. ;
  20.     extrn    srchmnemo,translate
  21. ;
  22.     IF    symbolic
  23.     extrn    rdsymname,defsymbol
  24.     ENDIF
  25. ;
  26.     IF    extended
  27.     extrn    peek,poke,peekbuf
  28.     ENDIF
  29. ;
  30.     extrn    skipsp,skipsep,getch,testch,isletter
  31.     extrn    rdregister,expression
  32.     extrn    cmderr
  33.     extrn    ccnam,caddress,string
  34. ;
  35.     cseg
  36. ;
  37. ;    assemble:    assemble one line
  38. ;
  39. ;        entry:    A/HL = address
  40. ;
  41. assemble:
  42.     shld    caddress
  43.     IF    extended
  44.     push    psw
  45.     ENDIF
  46. ;
  47.     IF    symbolic
  48. ;
  49.     pushix
  50.     call    rdsymname
  51.     jrc    assemnosym
  52.     call    getch
  53.     cpi    ':'
  54.     jrnz    assemnosym
  55.     pop    d            ; discard old IX
  56.     lded    caddress
  57.     call    defsymbol
  58.     call    skipsep
  59.     jr    assemsymbol
  60. ;
  61. assemnosym:
  62.     popix
  63. assemsymbol:
  64. ;
  65.     ENDIF
  66. ;
  67.     lxi    h,'  '
  68.     shld    opnd1
  69.     shld    opnd1+2
  70.     lxi    h,opnd1
  71.     mvi    b,4
  72. mnloop:
  73.     call    getch
  74.     call    isletter
  75.     jrc    mnloop10
  76.     mov    m,a
  77.     inx    h
  78.     djnz    mnloop
  79.     call    getch
  80. ;
  81. mnloop10:
  82.     ora    a
  83.     jrz    mnloop11
  84.     cpi    ' '
  85.     jnz    cmderr
  86. mnloop11:
  87.     lxi    h,opnd1
  88.     call    srchmnemo
  89.     jc    cmderr
  90.     sta    mnemo
  91. ;
  92. ;    get operands
  93. ;
  94.     lxi    h,opnd1
  95.     lxi    d,opnd1+1
  96.     lxi    b,15            ; clear operand 1 & 2
  97.     mvi    m,0
  98.     ldir
  99.     call    skipsp
  100.     call    testch
  101.     jrz    getopndend        ; ready if no first operand
  102.     lxiy    opnd1
  103.     mvi    b,0
  104.     call    analopnd        ; analyse first operand
  105.     call    skipsep
  106.     call    testch
  107.     jrz    getopndend        ; ready if no second operand
  108.     lxiy    opnd2
  109.     mvi    b,1
  110.     call    analopnd        ; analyse second operand
  111.     call    testch
  112.     jnz    cmderr            ; error if something else
  113. ;
  114. getopndend:
  115.     lxix    opnd1
  116.     lxiy    opnd2
  117.     ldx    a,0
  118.     ora    a            ; prefix for operand 1 ?
  119.     jrz    getopnden10
  120.     ldy    a,0
  121.     ora    a
  122.     jrz    getopnden10
  123.     cmpx    0
  124.     jnz    cmderr            ; error if prefix <> in both operands
  125. getopnden10:
  126. ;
  127. ;    translate the opcode
  128. ;
  129.     lda    mnemo
  130.     call    translate
  131.     jc    cmderr
  132. ;
  133. ;    store
  134. ;
  135.     IF    extended
  136.     lhld    caddress
  137.     pop    psw
  138.     call    peek
  139.     lxi    h,string
  140.     lxi    d,peekbuf
  141.     ELSE
  142.     lxi    h,string
  143.     lded    caddress
  144.     ENDIF
  145.     mov    c,b
  146.     mvi    b,0
  147.     IF    extended
  148.     push    b
  149.     ENDIF
  150.     ldir
  151.     IF    extended
  152.     call    poke
  153.     lhld    caddress
  154.     pop    b
  155.     dad    b
  156.     ELSE
  157.     xchg
  158.     ENDIF
  159.     ret
  160. ;
  161. ;
  162. ;    analopnd:    analyse operand
  163. ;
  164. ;    For some inputs, three alternative interpretations are possible.
  165. ;    For example, C could be either an 8-bit constant or the register C
  166. ;    or the condition code.
  167. ;    Each operand description thus provides three fields, where
  168. ;    the first is used for a register description if possible, the
  169. ;    second for a constant description, and the third for a condition code.
  170. ;
  171. ;    operand description:
  172. ;
  173. ;        0:    IX/IY-prefix (DD/FD) or 0
  174. ;        1:    register number
  175. ;            1x: 8-bit
  176. ;            2x: 16-bit
  177. ;            3x: (16-bit)
  178. ;            90: (C)
  179. ;            B0: AF'
  180. ;        2:    Offset marker: offset present if <> 0
  181. ;        3:    8-bit offset
  182. ;        4:    value marker
  183. ;            50: immediate 16-bit
  184. ;            A0: (immediate 16-bit)
  185. ;        5,6:    value
  186. ;        7:    condition code (8x)
  187. ;
  188. analopnd:
  189.     mvi    c,0
  190.     call    testch
  191.     cpi    '('
  192.     jrnz    anal10        ; ok if no (
  193.     mov    c,a        ; else mark it
  194.     inxix            ; and skip
  195.     jr    anal20        ; cant be condition code
  196. ;    
  197. ;    check for condition code
  198. ;
  199. anal10:
  200.     mov    a,b
  201.     ora    a
  202.     jrnz    anal20        ; cant be condition code if second operand
  203.     pushix
  204.     call    getch
  205.     call    isletter
  206.     jrc    anal19        ; no cc if not a letter
  207.     mov    e,a
  208.     mvi    d,' '
  209.     call    getch        ; next
  210.     jrz    anal15
  211.     cpi    ','        ; ready if terminator
  212.     jrz    anal15
  213.     call    isletter    ; else must be a letter
  214.     jrc    anal19
  215.     mov    d,a
  216.     call    terminal    ; and a terminator
  217.     jrnz    anal19        ; no cc if not
  218. anal15:
  219.     lxix    ccnam        ; condition code names
  220.     push    b
  221.     mvi    b,8        ; 8 condition names
  222.     mvi    c,0
  223. anal16:
  224.     ldx    l,0
  225.     ldx    h,1
  226.     ora    a
  227.     dsbc    d        ; compare
  228.     jrz    anal17        ; branch on match
  229.     inxix
  230.     inxix
  231.     inr    c
  232.     djnz    anal16
  233.     pop    b        ; no match, not a cc
  234.     jr    anal19
  235. ;
  236. anal17:
  237.     mvi    a,80h        ; condition code marker
  238.     ora    c        ; plus code
  239.     sty    a,7        ; store
  240.     pop    b
  241. ;
  242. anal19:
  243.     popix            ; back to the start
  244. ;
  245. anal20:
  246.     pushix
  247.     push    b
  248.     call    rdregister    ; try to read register
  249.     pop    b
  250.     jc    noregister    ; branch if no register
  251.     cpi    80h
  252.     jrc    analreg10    ; branch if not alternate reg
  253.     cpi    0a4h        ; must be alternate AF
  254.     jnz    noregister
  255.     mov    a,b
  256.     ora    a        ; second operand ?
  257.     jz    noregister    ; not allowed as first
  258.     mov    a,c
  259.     ora    a
  260.     jnz    noregister    ; not allowed as ()
  261.     mviy    0b0h,1        ; mark AF
  262.     call    terminal
  263.     jnz    noregister
  264.     pop    h        ; discard old IX
  265.     ret
  266. ;
  267. ;
  268. analreg10:
  269.     cpi    30h
  270.     jnc    noregister    ; variables are no registers here
  271.     cpi    20h
  272.     jc    reg8bit        ; branch for 8-bit register
  273.     cpi    27h
  274.     jnc    noregister    ; PC not allowed
  275.     cpi    24h        ; AF ?
  276.     jrnz    analreg15
  277.     mov    a,b
  278.     ora    a
  279.     jnz    noregister    ; AF cant be second operand
  280.     mvi    a,24h        ; restore reg-code
  281. analreg15:
  282.     sty    a,1        ; store register code
  283.     cpi    25h        ; IX/IY ?
  284.     jrc    analreg20
  285.     mviy    22h,1        ; change reg to HL
  286.     mvi    a,0ddh        ; IX-prefix
  287.     jrz    analreg19    ; ok if IX
  288.     mvi    a,0fdh
  289. analreg19:
  290.     sty    a,0
  291. analreg20:
  292.     mov    a,c
  293.     ora    a
  294.     jrz    isregister    ; ready if no (
  295.     sety    4,1        ; change 2xh to 3xh
  296.     call    testch
  297.     cpi    ')'
  298.     jrnz    regoffset
  299.     inxix            ; skip ')'
  300.     jr    isregister
  301. ;
  302. regoffset:
  303.     ldx    a,0        ; prefix
  304.     ora    a        ; IX/IY ?
  305.     jrz    noregister    ; cant be a register if not
  306.     call    expression    ; get offset
  307.     jc    cmderr
  308.     mviy    40h,2        ; mark offset follows
  309.     sty    l,3        ; store offset
  310.     pop    h        ; discard old IX
  311.     call    getch
  312.     cpi    ')'
  313.     jnz    cmderr
  314.     call    terminal
  315.     jnz    cmderr
  316.     ret            ; can be nothing else but IX/IY +/- offset
  317. ;
  318. ;
  319. isregister:
  320.     call    terminal
  321.     jrnz    noregister    ; cant be register if something follows
  322.     xtix            ; restore old IX, save new one
  323.     call    expression
  324.     jrnc    exprtoo        ; branch if it could also be an expression
  325. isreg20:
  326.     popix            ; restore our IX
  327.     ora    a
  328.     ret
  329. ;
  330. exprtoo:
  331.     mov    a,c
  332.     ora    a
  333.     jrz    exprtoo10    ; branch if no (
  334.     call    getch
  335.     cpi    ')'
  336.     jrnz    isreg20        ; not an expression if terminating ) missing
  337.     jr    exprtoo20
  338. exprtoo10:
  339.     mov    a,b
  340.     ora    a        ; first operand ?
  341.     jrz    isreg20        ; no non-bracketed constant as first operand
  342. exprtoo20:
  343.     call    terminal
  344.     jrnz    isreg20        ; no expression if something follows
  345.     pop    d        ; discard IX
  346.     jr    isexpression
  347. ;
  348. noregister:
  349.     xra    a
  350.     sty    a,0        ; clear prefix
  351.     sty    a,1        ; and reg-opnd
  352.     sty    a,2
  353.     popix            ; back to old pointer
  354.     call    expression
  355.     jrnc    noreg10
  356.     ldy    a,7        ; condition code ?
  357.     ora    a
  358.     jz    cmderr        ; error if neither reg nor expression nor cc
  359. noreg05:
  360.     call    getch
  361.     rz
  362.     cpi    ','
  363.     rz
  364.     jr    noreg05        ; skip to terminator for condition code
  365. ;
  366. noreg10:
  367.     mov    a,c
  368.     ora    a
  369.     jrz    noreg20
  370.     call    getch
  371.     cpi    ')'
  372.     jnz    cmderr
  373. noreg20:
  374.     call    terminal
  375.     jnz    cmderr        ; error if not last
  376. isexpression:
  377.     sty    l,5
  378.     sty    h,6
  379.     mviy    50h,4
  380.     mov    a,c
  381.     ora    a
  382.     rz
  383.     mviy    0a0h,4
  384.     ret
  385. ;
  386. reg8bit:
  387.     cpi    19h
  388.     jrnc    noregister    ; F/IFF not allowed here
  389.     sty    a,1        ; store register number
  390.     mov    a,c
  391.     ora    a
  392.     ldy    a,1        ; register number again
  393.     jrz    is8reg        ; ok if no (
  394.     cpi    11h        ; C ?
  395.     jrnz    noregister
  396.     call    getch
  397.     cpi    ')'
  398.     jrnz    noregister
  399.     mviy    90h,1        ; replace (C)
  400.     jmp    isregister
  401. ;
  402. is8reg:
  403.     cpi    17h        ; R ?
  404.     jnz    isregister
  405.     pop    h        ; cant be expression if R
  406.     call    terminal
  407.     jnz    cmderr
  408.     ora    a
  409.     ret
  410. ;
  411. ;
  412. terminal:
  413.     call    skipsp
  414.     call    testch
  415.     rz
  416.     cpi    ','
  417.     ret
  418. ;
  419. ;------------------------------------------------------------------------------
  420. ;
  421.     dseg
  422. ;
  423. mnemo    ds    1
  424. opnd1    ds    8
  425. opnd2    ds    8
  426. ;
  427.     end
  428. 
  429.