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

  1.     title    'Symbol Handler for Monitor'
  2. ;
  3. ;    Last Edited    84-07-03    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.     public    rdsymbol,rdsymname,defsymbol,killsymbol,dissymbols,wrsymbol
  15.     public    syminit,wsymbols,rsvsym
  16.     public    symstart
  17.  
  18.     public    readsym
  19.     public    sfile
  20. ;
  21.     extrn    cmderr
  22.     extrn    wrchar,wrhex,space,space2,crlf,wrstr
  23.     extrn    stestch,sgetch,isdigit,isletter
  24.     extrn    regsp,maxval,topval
  25.     extrn    mul16,div16,wrdec
  26. ;
  27. ;
  28. ;
  29.     maclib    z80
  30.     maclib    monopt
  31. ;
  32. ;
  33. symlen    equ    8
  34. ;
  35. ;
  36. ;
  37. ; Symbol Storage:
  38. ;
  39. ;            |    debugger
  40. ;            ---------------------------   high mem
  41. ;    symstart  -->    |  Symbols: Top down
  42. ;            |  N  }
  43. ;            |  A  }
  44. ;            |  M  }} "symlen" bytes per name
  45. ;            |  E  }
  46. ;            |  addr hi
  47. ;            |  addr lo
  48. ;            |  ...
  49. ;            |  ...
  50. ;    topval     -->    |  last symbol
  51. ;            -----------------------------  low mem
  52. ;
  53. ;
  54. ;------------------------------------------------------------------------------
  55. ;
  56. ;    rdsymbol:    read symbol value
  57. ;
  58. ;        exit:    HL = symbol value
  59. ;            Carry set if not a symbol or if symbol is undefined
  60. ;
  61. rdsymbol:
  62.     cpi    '.'
  63.     stc
  64.     rnz            ; ret if no symbol lead-in
  65.     pushix
  66.     call    sgetch
  67.     call    rdsymname
  68.     jrc    rdsym10
  69.     jrnz    rdsym20
  70.     stc
  71. rdsym10:
  72.     popix
  73.     ret
  74. ;
  75. rdsym20:
  76.     pop    d
  77.     mov    d,m
  78.     dcx    h
  79.     mov    e,m
  80.     xchg
  81.     ret
  82. ;
  83. ;
  84. ;    rdsymname:    read symbol name
  85. ;
  86. ;        exit:    HL = symbol table pointer
  87. ;            carry set if no symbol name found
  88. ;            A = 0 if new (undefined) symbol
  89. ;
  90. rdsymname:
  91.     call    stestch
  92.     call    isdigit
  93.     cmc
  94.     rc            ; no symbol if first is digit
  95.     call    issymch
  96.     rc
  97. ;
  98.     lhld    topval
  99.     dcx    h
  100.     dcx    h
  101.     mvi    b,symlen
  102. ;
  103. rdsymn10:
  104.     call    sgetch
  105.     dcr    b
  106.     inr    b
  107.     jrz    rdsymn15
  108.     mov    m,a
  109.     dcx    h
  110.     dcr    b
  111. rdsymn15:
  112.     call    stestch
  113.     call    issymch
  114.     jrnc    rdsymn10
  115. ;
  116.     inr    b
  117. rdsymn20:
  118.     mvi    m,' '
  119.     dcx    h
  120.     djnz    rdsymn20
  121. ;
  122. ;    symbol read, now search in table
  123. ;
  124.     lded    symstart
  125. symsrch:
  126.     lhld    topval
  127.     xra    a
  128.     dsbc    d
  129.     jrz    symsrchfnd
  130.     dcx    d
  131.     dcx    d
  132.     lhld    topval
  133.     mvi    b,symlen
  134.     dcx    h
  135.     dcx    h
  136. symcmp:
  137.     ldax    d
  138.     cmp    m
  139.     jrnz    symnomatch
  140.     dcx    h
  141.     dcx    d
  142.     djnz    symcmp
  143.     mvi    a,0ffh            ; signal exists
  144. ;
  145.     lxi    h,symlen+2
  146.     dad    d
  147.     ora    a
  148.     ret
  149. ;
  150. symsrchfnd:
  151.     xchg
  152.     ret
  153. ;
  154. symnomatch:
  155.     dcx    d
  156.     djnz    symnomatch
  157.     jr    symsrch
  158. ;
  159. ;
  160. issymch:
  161.     ora    a
  162.     stc
  163.     rz
  164.     call    isletter
  165.     rnc
  166.     call    isdigit
  167.     rnc
  168.     push    h
  169.     push    b
  170.     lxi    h,symchtab
  171.     lxi    b,lsymchtab
  172.     ccir
  173.     pop    b
  174.     pop    h
  175.     stc
  176.     rnz
  177.     ora    a
  178.     ret
  179. ;
  180. symchtab    db    '?@$.'
  181. lsymchtab    equ    $-symchtab
  182. ;
  183. ;
  184. ;------------------------------------------------------------------------------
  185. ;
  186. ;    defsymbol:    define symbol
  187. ;
  188. ;        entry:    HL = name pointer
  189. ;            DE = address
  190. ;
  191. defsymbol:
  192.     push    d        ; save address value
  193.     mov    m,d
  194.     dcx    h
  195.     mov    m,e        ; store value
  196.     inx    h        ; pointer again
  197.     push    h
  198.     lbcd    topval
  199.     ora    a
  200.     dsbc    b        ; already in the table ?
  201.     pop    h
  202.     jrz    defsym01    ; ok if not
  203. ;
  204.     push    h
  205.     lded    topval
  206.     lxi    b,symlen+2
  207.     lddr            ; move to topval
  208.     sded    topval        ; temporarily set new topval
  209.     pop    h
  210.     call    killsymbol    ; delete at old place
  211.     lhld    topval
  212.     lxi    d,symlen+2
  213.     dad    d
  214.     shld    topval        ; reset topval to previous value
  215.     mov    b,h
  216.     mov    c,l
  217. ;
  218. defsym01:
  219.     pop    h        ; address value into HL
  220.     call    findaddr    ; find the value
  221.     xchg
  222.     lhld    topval
  223.     ora    a
  224.     dsbc    d
  225.     jrnz    defsym10    ; branch if not at top
  226.     lxi    h,-(symlen+2)
  227.     dad    d
  228.     shld    topval        ; set new top
  229.     ret
  230. ;
  231. defsym10:
  232.     push    d        ; save elem addr
  233.     lhld    topval
  234.     lxi    b,-(symlen+2)
  235.     dad    b        ; new topval
  236.     shld    topval
  237.     xchg
  238.     ora    a
  239.     dsbc    d        ; element addr - new top = length to move
  240.     mov    b,h        ; length into BC
  241.     mov    c,l
  242.     lxi    h,-(symlen+2)
  243.     dad    d        ; move destination = new top - symlen+2
  244.     xchg
  245.     inx    b        ; one byte more
  246.     ldir            ; make space for new elem
  247.     pop    d        ; elem addr
  248.     lhld    topval        ; new topval contains new elem
  249.     lxi    b,symlen+2
  250.     lddr            ; move into place
  251.     ret
  252. ;
  253. ;
  254. ;    findaddr:    find symbol corresponding to "addr"
  255. ;
  256. ;        entry:    HL = address
  257. ;
  258. ;        exit:    HL = symbol pointer
  259. ;            Carry set if not found
  260. ;
  261. findaddr:
  262.     mov    b,h
  263.     mov    c,l
  264.     lhld    symstart
  265. findcmp:
  266.     xchg
  267.     lhld    topval
  268.     ora    a
  269.     dsbc    d
  270.     xchg
  271.     stc
  272.     rz            ; ret if end of table
  273.     mov    d,m
  274.     dcx    h
  275.     mov    e,m
  276.     inx    h
  277.     ora    a
  278.     xchg
  279.     dsbc    b        ; elem-addr - addr
  280.     xchg
  281.     jrc    findcmp10
  282.     rz
  283.     stc
  284.     ret            ; ret on match or elem-addr > addr
  285. findcmp10:
  286.     lxi    d,-(symlen+2)
  287.     dad    d
  288.     jr    findcmp
  289. ;
  290. ;
  291. ;    killsymbol:    delete symbol from the table
  292. ;
  293. ;        entry:    HL = symbol pointer
  294. ;
  295. killsymbol:
  296.     push    h
  297.     lded    topval
  298.     ora    a
  299.     dsbc    d            ; symptr - top = remaining length
  300.     pop    d
  301.     rz                ; ret if at top
  302.     mov    b,h
  303.     mov    c,l
  304.     mov    h,d
  305.     mov    l,e
  306.     push    d
  307.     lxi    d,-(symlen+2)
  308.     dad    d
  309.     pop    d
  310.     lddr
  311.     lhld    topval
  312.     lxi    d,symlen+2
  313.     dad    d
  314.     shld    topval
  315.     ret
  316. ;
  317. ;
  318. ;    wrsymbol:    write symbol corresponding to "addr"
  319. ;
  320. ;        entry:    HL = address
  321. ;            A = display code:
  322. ;                0   -> display spaces only
  323. ;                '.' -> display '.name'
  324. ;                '/' -> display '/name'
  325. ;                ':' -> display 'name:'
  326. ;
  327. wrsymbol:
  328.     ora    a
  329.     jrz    wrspaces
  330.     push    psw
  331.     call    findaddr
  332.     jrc    wrspaces2
  333.     dcx    h
  334.     dcx    h
  335.     pop    psw
  336.     cpi    ':'
  337.     cnz    wrchar        ; display dot or slash
  338.     jmp    writesym
  339. ;
  340. ;
  341. wrspaces2:
  342.     pop    psw
  343. wrspaces:
  344.     mvi    b,symlen+1
  345. wrspa2:
  346.     call    space
  347.     djnz    wrspa2
  348.     ret
  349. ;
  350. ;
  351. writesym:
  352.     mvi    b,symlen
  353.     mov    c,a
  354. writesym2:
  355.     mov    a,m
  356.     cpi    ' '
  357.     jrz    writesym3
  358.     call    wrchar
  359.     dcx    h
  360.     djnz    writesym2
  361.     mov    a,c
  362.     cpi    ':'
  363.     rnz
  364.     jmp    wrchar
  365. ;
  366. writesym3:
  367.     mov    a,c
  368.     cpi    ':'
  369.     cz    wrchar
  370. writesym4:
  371.     call    space
  372.     dcx    h
  373.     djnz    writesym4
  374.     ret
  375. ;
  376. ;
  377. ;    dissymbols:    display symbol table
  378. ;
  379. ;
  380. dissymbols:
  381.     lxi    h,defstr
  382.     call    wrstr
  383.     lhld    symstart
  384.     lded    topval
  385.     ora    a
  386.     dsbc    d            ; used space
  387.     lxi    d,symlen+2
  388.     call    div16
  389.     mvi    a,' '
  390.     call    wrdec
  391.     call    crlf
  392. ;
  393.     lhld    symstart
  394. dissymlin:
  395.     mvi    b,80/(symlen+7)
  396. dissymloop:
  397.     xchg
  398.     lhld    topval
  399.     ora    a
  400.     dsbc    d
  401.     xchg
  402.     jz    crlf
  403.     push    b
  404.     mov    a,m
  405.     call    wrhex
  406.     dcx    h
  407.     mov    a,m
  408.     call    wrhex
  409.     dcx    h
  410.     call    space
  411.     call    writesym
  412.     call    space2
  413.     pop    b
  414.     djnz    dissymloop
  415.     call    crlf
  416.     jr    dissymlin
  417. ;
  418. ;
  419. defstr    db    'Defined: ',0
  420. ;
  421. ;
  422. ;    wsymbols:    write symbol table to file
  423. ;
  424. ;
  425. wsymbols:
  426. rsvsym:
  427. expand:
  428. readsym:
  429. sfile:
  430.     ret
  431. ;
  432. ;    syminit:    initialise symbol space
  433. ;
  434. syminit:
  435.     lhld    topval
  436.     shld    symstart
  437.     ret
  438. ;
  439. ;
  440.     dseg
  441. ;
  442. symstart    ds    2
  443. ;
  444.     end
  445. 
  446.