home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / debug / wadesrc.lbr / MONSYM.AZM / MONSYM.ASM
Assembly Source File  |  1988-06-19  |  10KB  |  652 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,symtop
  17. ;
  18.     extrn    cmderr,next
  19.     extrn    wrchar,wrhex,space,space2,crlf,wrstr
  20.     extrn    stestch,sgetch,isdigit,isletter
  21.     extrn    regsp,maxval,topval
  22.     extrn    puthexbyte,putfilch
  23.     extrn    mul16,div16,wrdec
  24. ;
  25. ;
  26. ;
  27.     maclib    z80
  28.     maclib    monopt
  29. ;
  30. ;
  31. symlen    equ    8
  32. ;
  33. ;
  34. ;
  35. ; Symbol Storage:
  36. ;
  37. ;            |    debugger
  38. ;            ---------------------------   high mem
  39. ;    symstart  -->    |  Symbols: Top down
  40. ;            |  N  }
  41. ;            |  A  }
  42. ;            |  M  }} "symlen" bytes per name
  43. ;            |  E  }
  44. ;            |  addr hi
  45. ;            |  addr lo
  46. ;            |  ...
  47. ;            |  ...
  48. ;    symtop     -->    |  last symbol
  49. ;            |  ...
  50. ;            |  free space
  51. ;            -----------------------------  low mem
  52. ;    currsx     -->    |  RSX-header (page aligned)
  53. ;            -----------------------------
  54. ;            |  default stack
  55. ;            |  ...
  56. ;            -----------------------------
  57. ;    maxval     -->    |  top of program
  58. ;
  59. ;
  60. ;------------------------------------------------------------------------------
  61. ;
  62. ;    rdsymbol:    read symbol value
  63. ;
  64. ;        exit:    HL = symbol value
  65. ;            Carry set if not a symbol or if symbol is undefined
  66. ;
  67. rdsymbol:
  68.     cpi    '.'
  69.     stc
  70.     rnz            ; ret if no symbol lead-in
  71.     pushix
  72.     call    sgetch
  73.     call    rdsymname
  74.     jrc    rdsym10
  75.     jrnz    rdsym20
  76.     stc
  77. rdsym10:
  78.     popix
  79.     ret
  80. ;
  81. rdsym20:
  82.     pop    d
  83.     mov    d,m
  84.     dcx    h
  85.     mov    e,m
  86.     xchg
  87.     ret
  88. ;
  89. ;
  90. ;    rdsymname:    read symbol name
  91. ;
  92. ;        exit:    HL = symbol table pointer
  93. ;            carry set if no symbol name found
  94. ;            A = 0 if new (undefined) symbol
  95. ;
  96. rdsymname:
  97.     call    stestch
  98.     call    isdigit
  99.     cmc
  100.     rc            ; no symbol if first is digit
  101.     call    issymch
  102.     rc
  103. ;
  104.     lhld    symtop
  105.     dcx    h
  106.     dcx    h
  107.     mvi    b,symlen
  108. ;
  109. rdsymn10:
  110.     call    sgetch
  111.     dcr    b
  112.     inr    b
  113.     jrz    rdsymn15
  114.     mov    m,a
  115.     dcx    h
  116.     dcr    b
  117. rdsymn15:
  118.     call    stestch
  119.     call    issymch
  120.     jrnc    rdsymn10
  121. ;
  122.     inr    b
  123. rdsymn20:
  124.     mvi    m,' '
  125.     dcx    h
  126.     djnz    rdsymn20
  127. ;
  128. ;    symbol read, now search in table
  129. ;
  130.     lded    symstart
  131. symsrch:
  132.     lhld    symtop
  133.     xra    a
  134.     dsbc    d
  135.     jrz    symsrchfnd
  136.     dcx    d
  137.     dcx    d
  138.     lhld    symtop
  139.     mvi    b,symlen
  140.     dcx    h
  141.     dcx    h
  142. symcmp:
  143.     ldax    d
  144.     cmp    m
  145.     jrnz    symnomatch
  146.     dcx    h
  147.     dcx    d
  148.     djnz    symcmp
  149.     mvi    a,0ffh            ; signal exists
  150. ;
  151.     lxi    h,symlen+2
  152.     dad    d
  153.     ora    a
  154.     ret
  155. ;
  156. symsrchfnd:
  157.     xchg
  158.     ret
  159. ;
  160. symnomatch:
  161.     dcx    d
  162.     djnz    symnomatch
  163.     jr    symsrch
  164. ;
  165. ;
  166. issymch:
  167.     ora    a
  168.     stc
  169.     rz
  170.     call    isletter
  171.     rnc
  172.     call    isdigit
  173.     rnc
  174.     push    h
  175.     push    b
  176.     lxi    h,symchtab
  177.     lxi    b,lsymchtab
  178.     ccir
  179.     pop    b
  180.     pop    h
  181.     stc
  182.     rnz
  183.     ora    a
  184.     ret
  185. ;
  186. symchtab    db    '?@$.'
  187. lsymchtab    equ    $-symchtab
  188. ;
  189. ;
  190. ;------------------------------------------------------------------------------
  191. ;
  192. ;    defsymbol:    define symbol
  193. ;
  194. ;        entry:    HL = name pointer
  195. ;            DE = address
  196. ;
  197. defsymbol:
  198.     push    d        ; save address value
  199.     mov    m,d
  200.     dcx    h
  201.     mov    m,e        ; store value
  202.     inx    h        ; pointer again
  203.     push    h
  204.     lbcd    symtop
  205.     ora    a
  206.     dsbc    b        ; already in the table ?
  207.     pop    h
  208.     jrz    defsym01    ; ok if not
  209. ;
  210.     push    h
  211.     lded    symtop
  212.     lxi    b,symlen+2
  213.     lddr            ; move to symtop
  214.     sded    symtop        ; temporarily set new symtop
  215.     pop    h
  216.     call    killsymbol    ; delete at old place
  217.     lhld    symtop
  218.     lxi    d,symlen+2
  219.     dad    d
  220.     shld    symtop        ; reset symtop to previous value
  221.     mov    b,h
  222.     mov    c,l
  223. ;
  224. defsym01:
  225.     lxi    d,3*(symlen+2)+26    ; safety margin
  226.     lhld    currsx        ; bottom of symbol memory
  227.     dad    d        ; + safety
  228.     ora    a
  229.     dsbc    b        ; - symtop
  230.     cnc    expand        ; expand if (currsx + margin) >= symtop
  231. ;
  232.     pop    h        ; address value into HL
  233.     call    findaddr    ; find the value
  234.     xchg
  235.     lhld    symtop
  236.     ora    a
  237.     dsbc    d
  238.     jrnz    defsym10    ; branch if not at top
  239.     lxi    h,-(symlen+2)
  240.     dad    d
  241.     shld    symtop        ; set new top
  242.     ret
  243. ;
  244. defsym10:
  245.     push    d        ; save elem addr
  246.     lhld    symtop
  247.     lxi    b,-(symlen+2)
  248.     dad    b        ; new symtop
  249.     shld    symtop
  250.     xchg
  251.     ora    a
  252.     dsbc    d        ; element addr - new top = length to move
  253.     mov    b,h        ; length into BC
  254.     mov    c,l
  255.     lxi    h,-(symlen+2)
  256.     dad    d        ; move destination = new top - symlen+2
  257.     xchg
  258.     inx    b        ; one byte more
  259.     ldir            ; make space for new elem
  260.     pop    d        ; elem addr
  261.     lhld    symtop        ; new symtop contains new elem
  262.     lxi    b,symlen+2
  263.     lddr            ; move into place
  264.     ret
  265. ;
  266. ;
  267. ;    findaddr:    find symbol corresponding to "addr"
  268. ;
  269. ;        entry:    HL = address
  270. ;
  271. ;        exit:    HL = symbol pointer
  272. ;            Carry set if not found
  273. ;
  274. findaddr:
  275.     mov    b,h
  276.     mov    c,l
  277.     lhld    symstart
  278. findcmp:
  279.     xchg
  280.     lhld    symtop
  281.     ora    a
  282.     dsbc    d
  283.     xchg
  284.     stc
  285.     rz            ; ret if end of table
  286.     mov    d,m
  287.     dcx    h
  288.     mov    e,m
  289.     inx    h
  290.     ora    a
  291.     xchg
  292.     dsbc    b        ; elem-addr - addr
  293.     xchg
  294.     jrc    findcmp10
  295.     rz
  296.     stc
  297.     ret            ; ret on match or elem-addr > addr
  298. findcmp10:
  299.     lxi    d,-(symlen+2)
  300.     dad    d
  301.     jr    findcmp
  302. ;
  303. ;
  304. ;    killsymbol:    delete symbol from the table
  305. ;
  306. ;        entry:    HL = symbol pointer
  307. ;
  308. killsymbol:
  309.     push    h
  310.     lded    symtop
  311.     ora    a
  312.     dsbc    d            ; symptr - top = remaining length
  313.     pop    d
  314.     rz                ; ret if at top
  315.     mov    b,h
  316.     mov    c,l
  317.     mov    h,d
  318.     mov    l,e
  319.     push    d
  320.     lxi    d,-(symlen+2)
  321.     dad    d
  322.     pop    d
  323.     lddr
  324.     lhld    symtop
  325.     lxi    d,symlen+2
  326.     dad    d
  327.     shld    symtop
  328.     ret
  329. ;
  330. ;
  331. ;    wrsymbol:    write symbol corresponding to "addr"
  332. ;
  333. ;        entry:    HL = address
  334. ;            A = display code:
  335. ;                0   -> display spaces only
  336. ;                '.' -> display '.name'
  337. ;                '/' -> display '/name'
  338. ;                ':' -> display 'name:'
  339. ;
  340. wrsymbol:
  341.     ora    a
  342.     jrz    wrspaces
  343.     push    psw
  344.     call    findaddr
  345.     jrc    wrspaces2
  346.     dcx    h
  347.     dcx    h
  348.     pop    psw
  349.     cpi    ':'
  350.     cnz    wrchar        ; display dot or slash
  351.     jmp    writesym
  352. ;
  353. ;
  354. wrspaces2:
  355.     pop    psw
  356. wrspaces:
  357.     mvi    b,symlen+1
  358. wrspa2:
  359.     call    space
  360.     djnz    wrspa2
  361.     ret
  362. ;
  363. ;
  364. writesym:
  365.     mvi    b,symlen
  366.     mov    c,a
  367. writesym2:
  368.     mov    a,m
  369.     cpi    ' '
  370.     jrz    writesym3
  371.     call    wrchar
  372.     dcx    h
  373.     djnz    writesym2
  374.     mov    a,c
  375.     cpi    ':'
  376.     rnz
  377.     jmp    wrchar
  378. ;
  379. writesym3:
  380.     mov    a,c
  381.     cpi    ':'
  382.     cz    wrchar
  383. writesym4:
  384.     call    space
  385.     dcx    h
  386.     djnz    writesym4
  387.     ret
  388. ;
  389. ;
  390. ;    dissymbols:    display symbol table
  391. ;
  392. ;
  393. dissymbols:
  394.     lxi    h,defstr
  395.     call    wrstr
  396.     lhld    symstart
  397.     lded    symtop
  398.     ora    a
  399.     dsbc    d            ; used space
  400.     lxi    d,symlen+2
  401.     call    div16
  402.     mvi    a,' '
  403.     call    wrdec
  404.     call    space2
  405.     lxi    h,freestr
  406.     call    wrstr
  407.     lhld    symtop
  408.     lded    currsx
  409.     ora    a
  410.     dsbc    d
  411.     lxi    d,-(3*(symlen+2)+26)
  412.     dad    d
  413.     lxi    d,symlen+2
  414.     call    div16
  415.     mvi    a,' '
  416.     call    wrdec
  417.     call    crlf
  418.     call    crlf
  419. ;
  420.     lhld    symstart
  421. dissymlin:
  422.     mvi    b,80/(symlen+7)
  423. dissymloop:
  424.     xchg
  425.     lhld    symtop
  426.     ora    a
  427.     dsbc    d
  428.     xchg
  429.     jz    crlf
  430.     push    b
  431.     mov    a,m
  432.     call    wrhex
  433.     dcx    h
  434.     mov    a,m
  435.     call    wrhex
  436.     dcx    h
  437.     call    space
  438.     call    writesym
  439.     call    space2
  440.     pop    b
  441.     djnz    dissymloop
  442.     call    crlf
  443.     jr    dissymlin
  444. ;
  445. ;
  446. defstr    db    'Defined: ',0
  447. freestr    db    'Free: ',0
  448. ;
  449. ;
  450. ;    wsymbols:    write symbol table to file
  451. ;
  452. ;
  453. wsymbols:
  454.     lhld    symstart
  455. fwsymline:
  456.     mvi    b,4
  457. fwsymloop:
  458.     xchg
  459.     lhld    symtop
  460.     ora    a
  461.     dsbc    d
  462.     xchg
  463.     jrz    fwsymend
  464.     push    b
  465.     push    h
  466.     mov    a,m
  467.     call    puthexbyte
  468.     pop    h
  469.     dcx    h
  470.     mov    a,m
  471.     push    h
  472.     call    puthexbyte
  473.     mvi    a,' '
  474.     call    putfilch
  475.     pop    h
  476.     dcx    h
  477.     mvi    b,symlen
  478. fwsym10:
  479.     mov    a,m
  480.     cpi    ' '
  481.     jrz    fwsym20
  482.     push    b
  483.     push    h
  484.     call    putfilch
  485.     pop    h
  486.     pop    b
  487.     dcx    h
  488.     djnz    fwsym10
  489.     jr    fwsym30
  490. ;
  491. fwsym20:
  492.     dcx    h
  493.     djnz    fwsym20
  494. fwsym30:
  495.     pop    b
  496.     dcr    b
  497.     jrz    fwsym40
  498.     push    b
  499.     push    h
  500.     mvi    a,09h
  501.     call    putfilch
  502.     pop    h
  503.     pop    b
  504.     jr    fwsymloop
  505. ;
  506. fwsym40:
  507.     push    h
  508.     mvi    a,0dh
  509.     call    putfilch
  510.     mvi    a,0ah
  511.     call    putfilch
  512.     pop    h
  513.     jr    fwsymline
  514. ;
  515. ;
  516. fwsymend:
  517.     mov    a,b
  518.     cpi    4
  519.     rz
  520.     jr    fwsym40
  521. ;
  522. ;
  523. ;
  524. ;    expand:        expand symbol table by default size
  525. ;
  526. ;        entry:    -
  527. ;
  528. ;
  529. ;    rsvsym:        reserve symbol table space
  530. ;
  531. ;        entry:    HL = number of symbols to reserve
  532. ;
  533. rsvsym:
  534.     lxi    d,symlen+2
  535.     call    mul16        ; required symbol table space
  536.     lxi    d,0ffh
  537.     dad    d
  538.     mvi    l,0        ; round to next page boundary
  539.     jr    expand10
  540. ;
  541. expand:
  542.     lxi    h,512
  543. ;
  544. expand10:
  545.     push    h
  546.     lxi    d,512
  547.     dad    d
  548.     lded    maxval        ; max addr read until now
  549.     dad    d        ; max + sym-space + 512 bytes for safety
  550.     xchg
  551.     lhld    currsx
  552.     ora    a
  553.     dsbc    d        ; currsx - (max + n)
  554.     jc    cmderr        ; error if max > curr
  555. ;
  556.     pop    d
  557.     lxi    h,0
  558.     dsbc    d        ; complement symbol table space
  559.     push    h
  560.     lded    regsp        ; current stack ptr
  561.     lhld    currsx        ; RSX base
  562.     ora    a
  563.     dsbc    d        ; stack length
  564.     jrc    setstack    ; no stack copying if SP > RSX
  565.     jrz    setstack    ; no copying if equal
  566.     mov    a,h
  567.     cpi    2
  568.     jrnc    copyrsx        ; no stack copying if difference >= 512
  569.     mov    b,h
  570.     mov    c,l        ; save length
  571.     pop    h
  572.     push    h
  573.     dad    d        ; SP - space
  574.     xchg            ; copy from SP to (SP-space)
  575.     ldir            ; move down the stack
  576. ;
  577. setstack:
  578.     lhld    regsp
  579.     pop    d
  580.     push    d
  581.     dad    d        ; SP - space
  582.     shld    regsp        ; set new SP
  583. ;
  584. copyrsx:
  585.     lded    currsx        ; current RSX header
  586.     pop    h
  587.     dad    d        ; - space
  588.     shld    currsx        ; new RSX header
  589.     dcx    h
  590.     shld    topval
  591.     inx    h
  592.     xchg            ; move from old RSX to (RSX-space)
  593.     push    d
  594.     lxi    b,26
  595.     ldir            ; move down the RSX header
  596.     pop    h
  597.     lxi    d,6
  598.     dad    d        ; new BDOS entry in RSX header
  599.     shld    6        ; set jump location
  600. ;
  601.     IF    cpm3
  602.     xchg            ; save new RSX entry address
  603.     lxi    h,4
  604.     dad    d        ; next field
  605.     push    d
  606.     mov    e,m
  607.     inx    h
  608.     mov    d,m        ; addr of next RSX
  609.     lxi    h,6
  610.     dad    d        ; point to prev-field in next RSX
  611.     pop    d
  612.     mov    m,e        ; set prev-field
  613.     inx    h
  614.     mov    m,d
  615.     sded    mxtpa
  616.     lxi    d,scbpb
  617.     mvi    c,49        ; set scb
  618.     jmp    next        ; set new MXTPA field
  619. ;
  620. scbpb    db    62h        ; MXTPA offset
  621.     db    0feh        ; set word value
  622. mxtpa    dw    0
  623. ;
  624.     ELSE
  625. ;
  626.     ret
  627. ;
  628.     ENDIF
  629. ;
  630. ;
  631. ;
  632. ;    syminit:    initialise symbol space
  633. ;
  634. ;        entry:    HL = RSX base
  635. ;
  636. syminit:
  637.     shld    currsx
  638.     inx    h
  639.     shld    symtop
  640.     shld    symstart
  641.     jmp    expand
  642. ;
  643. ;
  644.     dseg
  645. ;
  646. currsx        ds    2
  647. symtop        ds    2
  648. symstart    ds    2
  649. ;
  650.     end
  651. 
  652.