home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / debug / wadesrc.lbr / MONDIS.AZM / MONDIS.ASM
Assembly Source File  |  1988-06-19  |  4KB  |  330 lines

  1.     title    'Z80 Disassembler Module'
  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    disasm
  18. ;
  19.     extrn    wrchar,wrhex,wrword,space,space2,wraddr
  20.     IF    extended
  21.     extrn    peek,peekbuf
  22.     ENDIF
  23. ;
  24.     extrn    analop
  25.     extrn    mnemtab,r16nam,reg8nam,ccnam
  26.     extrn    opdesc,jumpaddr
  27. ;
  28.     IF    symbolic
  29.     extrn    wrsymbol
  30.     ENDIF
  31. ;
  32. ;
  33.     cseg
  34. ;
  35. ;    disasm:        disassemble one opcode
  36. ;
  37. ;        entry:    A/HL = address
  38. ;            B  = opcode display on if <> 0
  39. ;
  40. ;        exit:    HL = next opcode address
  41. ;
  42. ;        uses:    all registers
  43. ;
  44. ;
  45. ;    On return, Jumpmark contains
  46. ;
  47. ;        00    No jump
  48. ;        10    Immediate 16-bit jump
  49. ;        20    To stack (return)
  50. ;        3x    To register x, x=2: HL, x=5: IX, x=6: IY
  51. ;    code OR 80    conditional jump
  52. ;
  53. ;
  54. disasm:
  55.     push    h
  56.     push    psw
  57.     mov    a,b
  58.     sta    opdis
  59.     pop    psw
  60.     push    psw
  61.     call    analop
  62.     pop    psw
  63.     xthl            ; save new pc, get old address
  64.     call    wraddr
  65.     call    space2
  66.     push    b        ; save mnemo
  67.     push    h
  68.     lda    opdis
  69.     ora    a
  70.     jrz    disasnoop
  71.     mvi    c,5        ; total length
  72.     IF    extended
  73.     lxi    h,peekbuf    ; analop already did the peeking
  74.     ENDIF
  75. disas10:
  76.     mov    a,m
  77.     inx    h
  78.     call    wrhex        ; display opcode in hex
  79.     call    space
  80.     dcr    c
  81.     djnz    disas10
  82. ;
  83. disas20:
  84.     call    space
  85.     call    space2        ; fill with spaces
  86.     dcr    c
  87.     jrnz    disas20
  88.     jr    disas21
  89. ;
  90. disasnoop:
  91.     IF    NOT symbolic
  92.     call    space2
  93.     ENDIF
  94. disas21:
  95.     pop    h
  96. ;
  97.     IF    symbolic
  98.     mvi    a,':'
  99.     call    wrsymbol
  100.     call    space2
  101.     ENDIF
  102. ;
  103.     pop    b        ; restore mnemo
  104.     lxi    h,mnemtab
  105.     mvi    b,0
  106.     dad    b
  107.     dad    b
  108.     dad    b
  109.     dad    b        ; pointer * 4
  110.     mvi    b,4
  111. disas26:
  112.     mov    a,m
  113.     call    wrchar        ; write mnemonic
  114.     inx    h
  115.     djnz    disas26
  116.     call    space2
  117. ;
  118.     IF    symbolic
  119.     xra    a
  120.     sta    dissym
  121.     ENDIF
  122.     lxix    opdesc
  123.     mvi    b,11            ; character down counter
  124. disas30:
  125.     ldx    a,0
  126.     ora    a
  127.     jrz    disasend
  128.     rrc
  129.     rrc
  130.     rrc
  131.     rrc
  132.     ani    0fh
  133.     dcr    a
  134.     add    a
  135.     mov    e,a
  136.     mvi    d,0
  137.     lxi    h,disastab
  138.     dad    d
  139.     mov    e,m
  140.     inx    h
  141.     mov    d,m
  142.     xchg
  143.     ldx    a,0
  144.     call    ipchl
  145.     inxix
  146.     ldx    a,0
  147.     ora    a
  148.     jrz    disasend
  149.     mvi    a,','
  150.     call    wrc
  151.     jr    disas30
  152. ;
  153. disasend:
  154.     pop    h
  155.     IF    NOT symbolic
  156.     lda    opdis
  157.     ora    a
  158.     jrz    disasready
  159.     ENDIF
  160. disasfill:
  161.     call    space
  162.     djnz    disasfill
  163. disasready:
  164.     IF    symbolic
  165.     lda    dissym
  166.     push    h
  167.     lhld    symadr
  168.     call    wrsymbol
  169.     pop    h
  170.     ENDIF
  171.     ret
  172. ;
  173. ipchl:    pchl
  174. ;
  175. ;
  176. disastab:
  177.     dw    dis8reg        ; 1x
  178.     dw    dis16reg    ; 2x
  179.     dw    dismemreg    ; 3x
  180.     dw    dis8imm        ; 40
  181.     dw    dis16imm    ; 50
  182.     dw    disbitnum    ; 6x
  183.     dw    dis16jp        ; 70
  184.     dw    disccode    ; 8x
  185.     dw    discreg        ; 90
  186.     dw    disaddr        ; a0
  187.     dw    disaf        ; b0
  188.     dw    dis8addr    ; c0
  189.     dw    dis8imm        ; d0
  190. ;
  191. ;
  192. dis8reg:
  193.     lxi    h,reg8nam
  194.     ani    0fh
  195.     mov    e,a
  196.     mvi    d,0
  197.     dad    d
  198.     mov    a,m
  199. ;
  200. wrc:
  201.     dcr    b
  202.     jmp    wrchar
  203. ;
  204. ;
  205. dis16reg:
  206.     lxi    h,r16nam
  207. dis2idx:
  208.     ani    07h
  209.     add    a
  210.     mov    e,a
  211.     mvi    d,0
  212.     dad    d
  213. dis2chr:
  214.     mov    a,m
  215.     call    wrc
  216.     inx    h
  217.     mov    a,m
  218.     cpi    ' '
  219.     rz
  220.     jr    wrc
  221. ;
  222. disccode:
  223.     lxi    h,ccnam
  224.     jr    dis2idx
  225. ;
  226. disaf:
  227.     lxi    h,r16nam+8
  228.     call    dis2chr
  229.     mvi    a,27h        ; '
  230.     jr    wrc
  231. ;
  232. discreg:
  233.     call    open
  234.     mvi    a,'C'
  235.     call    wrc
  236. close:
  237.     mvi    a,')'
  238.     jr    wrc
  239. ;
  240. open:
  241.     mvi    a,'('
  242.     jr    wrc
  243. ;
  244. ;
  245. dismemreg:
  246.     call    open
  247.     ldx    a,0
  248.     call    dis16reg
  249.     ldx    a,0
  250.     ani    8
  251.     jrz    close
  252. ;
  253. ;    display signed offset
  254. ;
  255.     inxix
  256.     ldx    a,0
  257.     ora    a
  258.     mvi    c,'+'
  259.     jp    dismem10
  260.     mvi    c,'-'
  261.     neg
  262. dismem10:
  263.     push    psw
  264.     mov    a,c
  265.     call    wrc
  266.     pop    psw
  267.     call    wrh
  268.     jr    close
  269. ;
  270. dis8addr:
  271.     call    open
  272.     ldx    a,0
  273.     call    dis8imm
  274.     jr    close
  275. ;
  276. dis8imm:
  277.     inxix
  278.     ldx    a,0
  279. ;
  280. wrh:
  281.     dcr    b
  282.     dcr    b
  283.     jmp    wrhex
  284. ;
  285. disaddr:
  286.     call    open
  287.     call    dis16imm
  288.     jr    close
  289. ;
  290. dis16imm:
  291.     inxix
  292.     ldx    h,1
  293.     ldx    l,0
  294.     inxix
  295. dis16:
  296.     IF    symbolic
  297.     mvi    a,'.'
  298.     sta    dissym
  299.     shld    symadr
  300.     ENDIF
  301.     mov    a,h
  302.     call    wrh
  303.     mov    a,l
  304.     call    wrh
  305.     ret
  306. ;
  307. dis16jp:
  308.     inxix
  309.     lhld    jumpaddr
  310.     jr    dis16
  311. ;
  312. ;
  313. disbitnum:
  314.     ani    7
  315.     adi    '0'
  316.     jmp    wrc
  317. ;
  318. ;
  319.     dseg
  320. ;
  321. opdis    ds    1
  322. ;
  323.     IF    symbolic
  324. dissym    ds    1
  325. symadr    ds    2
  326.     ENDIF
  327. ;
  328.     end
  329. 
  330.