home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / jsage / zsus / progpack / debug11.lbr / DEBUG.LZB / DEBUG.LIB
Encoding:
Text File  |  1992-05-13  |  20.0 KB  |  1,153 lines

  1. ;  PROGRAM:  DEBUGRCP.ASM
  2. ;  AUTHOR:  RICHARD CONN
  3. ;  VERSION:  1.0
  4. ;  DATE:  30 JUNE 84
  5. ;  PREVIOUS VERSIONS:  NONE
  6. ;
  7. ;++++
  8. ;  Version 1.1    - Rob Friefeld 2 Oct 87
  9. ;  -  Added two new commands:
  10. ;    'F' Fill Memory, syntax:  start address, end address, byte value
  11. ;    'M' Move Memory, syntax:  start address, end address, destination addr
  12. ;  -  This RCP (with CLS and H) requires 2367 bytes.  Using HARDVID.LIB,
  13. ;     about 500 bytes are saved.
  14. ;  -  Would someone like to add Go and Breakpoint commands??
  15. ;
  16. ;  Version 1.0A - rdf 9/87
  17. ;  - Intended for large RCP (takes over 2k)
  18. ;  - Included hex calculator routine from MU3
  19. ;  - Made minor changes to achieve compatibility with Z33RCP modules
  20. ;  - Expanded command synomyms:
  21. ;    "+" "=" "." <cr> advance one block
  22. ;    "-" ","  back one block
  23. ;  - Put in some relative jumps and djnz's.
  24. ;    "De-modularized" stndout/stndend and tinit/dinit to save a few bytes.
  25.  
  26. false    equ    0
  27. true    equ    -1
  28.  
  29. hardvid    equ    false        ; Use hard-coded or TCAP/VLIB routines
  30.                 ; Either TCAPVID.LIB or HARDVID.LIB
  31. ;++++
  32. ;    DEBUGRCP is a resident debug command package for ZCPR3.3
  33. ;
  34. eolch    equ    0        ; End of line char
  35. sepch    equ    ','        ; Separator char
  36. erow    equ    6        ; First row of editor display
  37. ecol    equ    4        ; First col of editor display
  38. ecolc    equ    ecol+16*3+8    ; First col of editor char display
  39. ecurs    equ    '>'        ; Editor cursor
  40. prrow    equ    22        ; Prompt row
  41. prcol    equ    10        ; Prompt column
  42. prcoli    equ    prcol+15    ; Prompt input col
  43. errow    equ    23        ; Error message row
  44. ercol    equ    15        ; Error message column
  45.  
  46.  
  47. ;
  48. ; DEFINE FREE SPACE
  49. ;
  50. mu:
  51.     call    retsave        ; Save cpr return address
  52.  
  53.     ld    hl,tbuff    ; Determine address
  54.     ld    (hl),126    ; 126 chars input allowed
  55.     ld    (buffer),hl    ; Set ptr
  56. ;
  57. ; SET UP ARROW KEYS
  58. ;
  59.     ld    hl,z3env    ; Pt to environment descriptor
  60.     ld    de,80h+10h    ; Pt to arrow key info
  61.     add    hl,de
  62.     ld    de,edcurt    ; Pt to cursor table
  63.     ld    bc,404h        ; 4 arrow keys
  64. arrow:
  65.     ldi            ; (Decrements c)
  66.     inc    de        ; Point to next entry
  67.     inc    de
  68.     djnz    arrow
  69. ;
  70. ; Initialize Terminal
  71. ;
  72.     call    tinit
  73. ;
  74. ; Check for Command Line Parameter
  75. ;
  76.     ld    hl,fcb+1    ; Pt to first char
  77.     ld    a,(hl)        ; Get char
  78.     cp    ' '        ; No param?
  79.     jr    nz,pcheck
  80.     ld    hl,tpa        ; Pt to tpa
  81.     jr    mu3
  82. ;
  83. ; We have a parameter
  84. ;
  85. pcheck:
  86.     call    hexin        ; Convert to binary
  87.     ex    de,hl        ; Hl=value
  88.  
  89. ;
  90. ; Run MU3
  91. ;    HL contains starting address
  92. ;
  93. mu3:
  94.     ld    (block),hl    ; Save ptr to block
  95. ;
  96. ; REFRESH EDIT SCREEN
  97. ;
  98. edit0:
  99.     call    vcls        ; New screen
  100.     call    at
  101.     db    2,35        ; Row 2, col 35
  102.     call    vprint        ; Banner
  103.     db    'MU 1.1 RC','P'+80h
  104. ;
  105. ; REENTER MU3 WITH PTRS RESET
  106. ;
  107. mu3r:
  108.     xor    a        ; A=0
  109.     ld    (eindex),a    ; Set index to 0 (first element)
  110. mu3nr:    call    edplot        ; Plot buffer data
  111. ;
  112. ; INPUT EDITOR COMMAND
  113. ;
  114. editcmd:
  115.     call    prmsg        ; Position at prompt message
  116.     db    'MU Command','?'+80h
  117.     call    prinp        ; Position at prompt input
  118.     db    0
  119.     call    cin        ; Get char
  120.     call    caps        ; Capitalize
  121.     ld    b,a        ; Command in b
  122.     ld    hl,edcurt    ; Process cursor commands first
  123.     call    cmd        ; Process command
  124.     ld    hl,ecmdtbl    ; Editor command table
  125.     call    cmd        ; Process command
  126. ;
  127. ;INPUT ERROR
  128. ;
  129. what:
  130.     call    vprint        ; Error message
  131.     db    bel+80h
  132.     jr    editcmd
  133.  
  134. ;
  135. ; Position at Prompt Message and Print it
  136. ;
  137. prmsg:
  138.     call    at        ; Position
  139.     db    prrow,prcol
  140.     jp    vprint        ; Print it
  141. ;
  142. ; Position at Prompt Input and Print Prompt
  143. ;
  144. prinp:
  145.     call    at        ; Position
  146.     db    prrow,prcoli
  147.     jp    vprint        ; Print it
  148. ;
  149. ;Command Table Search and Execute
  150. ;
  151. cmd:
  152.     ld    a,(hl)        ; Check for end of table
  153.     or    a
  154.     ret    z        ; Command not found
  155.     cp    b        ; Match?
  156.     jr    z,cmdrun
  157.     inc    hl        ; Skip to next entry in table
  158.     inc    hl
  159.     inc    hl
  160.     jr    cmd
  161. ;
  162. ;RUN COMMAND
  163. ;
  164. cmdrun:
  165.     inc    hl        ; Pt to low address
  166.     ld    e,(hl)
  167.     inc    hl        ; Pt to high address
  168.     ld    d,(hl)
  169.     ex    de,hl
  170.     pop    af        ; Clear stack
  171.     jp    (hl)        ; Run routine
  172. ;
  173. ;PLOT BUFFER DATA
  174. ;
  175. edplot:
  176.     ld    h,erow-1    ; Set row
  177.     ld    l,ecol        ; Set column
  178.     call    gotoxy        ; Position cursor
  179.     call    vprint
  180.     db    dim
  181.     db    '       0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F'
  182.     db    bright,0
  183.     inc    h        ; Next row
  184.     call    gotoxy        ; Position cursor
  185.     ex    de,hl        ; Position in de
  186.     ld    hl,(block)    ; Pt to data
  187.     ld    b,8        ; 8 lines
  188. ;
  189. ;Print Next Line on Screen
  190. ;
  191. edit00:
  192.     call    stndout        ; Go dim
  193.     ld    a,h        ; Output address
  194.     call    pa2hc
  195.     ld    a,l
  196.     call    pa2hc
  197.     call    vprint
  198.     db    ':',bright,' '+80h
  199.     ld    c,16        ; 16 elements
  200. edit01:
  201.     ld    a,(hl)        ; Get byte
  202.     call    pa2hc        ; Print as hex
  203.     call    dspace        ; Print 1 space
  204.     inc    hl        ; Pt to next
  205.     dec    c        ; Count down
  206.     jr    nz,edit01
  207.     ex    de,hl        ; Position again
  208.     inc    h        ; Next row
  209.     call    gotoxy
  210.     ex    de,hl
  211.     djnz    edit00
  212.     ld    h,erow        ; Reset row
  213.     ld    l,ecolc        ; Reset col
  214.     call    gotoxy        ; Position cursor
  215.     ex    de,hl        ; Position in de
  216.     ld    hl,(block)    ; Pt to data
  217.     ld    b,8        ; 8 lines
  218. edit02:
  219.     call    bar        ; Print bar
  220.     ld    c,16        ; 16 elements
  221. edit03:
  222.     ld    a,(hl)        ; Get byte
  223.     and    7fh        ; Mask msb
  224.     cp    7fh        ; Don't print 7fh
  225.     jr    z,edit7f
  226.     cp    ' '        ; Space or more?
  227.     jr    nc,edit04
  228. edit7f:
  229.     ld    a,'.'        ; Print dot
  230. edit04:
  231.     call    conout        ; Print byte
  232.     inc    hl        ; Pt to next
  233.     dec    c        ; Count down
  234.     jr    nz,edit03
  235.     call    bar        ; Print ending bar
  236.     ex    de,hl        ; Position again
  237.     inc    h        ; Next row
  238.     call    gotoxy
  239.     ex    de,hl
  240.     dec    b        ; Count down
  241.     jr    nz,edit02
  242.     jp    edcur        ; Position cursor
  243.  
  244. ;
  245. ;EDITOR COMMAND TABLE
  246. ;
  247. ecmdtbl:
  248.     db    'C'-'@'        ; ^c = exit mu3
  249.     dw    edcc
  250.     db    'R'-'@'        ; ^r = refresh
  251.     dw    edit0
  252.     db    'E'-'@'        ; ^e=up
  253.     dw    edup
  254.     db    'X'-'@'        ; ^x=down
  255.     dw    eddown
  256.     db    'D'-'@'        ; ^d=right
  257.     dw    edright
  258.     db    'S'-'@'        ; ^s=left
  259.     dw    edleft
  260.     db    ' '        ; Nop
  261.     dw    editcmd
  262.     db    cr        ; Advance a block
  263.     dw    editplus
  264.     db    '+'        ; Advance
  265.     dw    editplus
  266.     db    '='
  267.     dw    editplus
  268.     db    '.'
  269.     dw    editplus
  270.     db    '-'        ; Backup
  271.     dw    editminus
  272.     db    ','
  273.     dw    editminus
  274.     db    'A'        ; Address
  275.     dw    editadr
  276.     db    'C'        ; Command line
  277.     dw    editcl
  278.     db    'H'        ; Hex calc
  279.     dw    editcalc
  280.     db    'N'        ; Change numbers
  281.     dw    edithex
  282.     db    'T'        ; Change text
  283.     dw    editalp
  284.     db    'F'        ; Fill memory
  285.     dw    editfill
  286.     db    'M'        ; Move memory
  287.     dw    editmove
  288.     db    0        ; End of table
  289. ;
  290. ;  ARROW KEY DEFINITONS FROM TCAP
  291. ;
  292. edcurt:
  293.     db    0        ; 0 indicates no arrow keys
  294.     dw    edup
  295.     db    0
  296.     dw    eddown
  297.     db    0
  298.     dw    edright
  299.     db    0
  300.     dw    edleft
  301.     db    0        ; End of table
  302.  
  303. ;
  304. ; Get input line, check for blank and abort
  305. ;
  306. getline:
  307.     call    rdbuf        ; Input text
  308.     call    edprcl        ; Clear prompt line
  309.     call    sksp        ; Skip to non-space
  310.     ld    a,(hl)        ; Any input?
  311.     or    a        ; 0=no
  312.     ret    nz
  313.     pop    af        ; Lift stack
  314.     jp    editcmd
  315. ;
  316. ;Fill memory
  317. ;
  318. editfill:
  319.     call    edercl
  320.     call    prinp
  321.     db    dim,'Fill [Start, End, Value] ',bright,0
  322.     call    getline        ; Input numbers
  323.  
  324.     call    hexin        ; Get the three numbers
  325.     call    sksp
  326.     push    de        ; Save on stack
  327.     call    hexin
  328.     call    sksp
  329.     push    de        ; Save on stack
  330.     call    hexin
  331.     push    de        ; Save on stack
  332.  
  333.     pop    bc        ; BC = byte
  334.     pop    hl        ; HL = end
  335.     pop    de        ; DE = start
  336.     xor    a
  337.     sbc    hl,de        ; HL = end - start
  338.     jp    c,what        ; Error: end before start
  339.     ex    de,hl        ; HL = start, DE = size of block
  340.  
  341. editf1:    ld    (hl),c        ; Do the fill
  342.     inc    hl
  343.     ld    a,d
  344.     or    e
  345.     jp    z,edita2    ; Replot on exit
  346.     dec    de
  347.     jr    editf1
  348.  
  349. ;
  350. ; Move memory
  351. ;
  352. editmove:
  353.     call    edercl
  354.     call    prinp
  355.     db    dim,'Move [Start, End, Dest] ',bright,0
  356.     call    getline
  357.  
  358.     call    hexin        ; Get the three numbers
  359.     call    sksp
  360.     push    de
  361.     call    hexin
  362.     call    sksp
  363.     push    de
  364.     call    hexin        ; DE = dest
  365.     pop    hl        ; HL = end
  366.     pop    bc        ; BC = start
  367.  
  368.     xor    a        ; Compute block length
  369.     sbc    hl,bc
  370.     jp    c,what        ; Error: end before start
  371.     push    hl        ; Swap HL,BC
  372.     push    bc
  373.     pop    hl        ; HL = start
  374.     pop    bc        ; BC = block size
  375.  
  376.     push    hl        ; Head move or tail move?
  377.     xor    a
  378.     sbc    hl,de        ; Start - dest
  379.     pop    hl
  380.     jr    c,editm1    ; Tail move
  381.  
  382.     inc    bc        ; Head move, BC = # bytes to move
  383.     ldir
  384.     jp    edita2
  385.  
  386. editm1:
  387.     add    hl,bc        ; Add length to start
  388.     ex    de,hl
  389.     add    hl,bc        ; Add length to dest
  390.     ex    de,hl
  391.     inc    bc        ; # bytes
  392.     lddr            ; Tail move
  393.     jp    edita2
  394.  
  395.  
  396. ;
  397. ;Enter Command Line
  398. ;
  399. editcl:
  400.     call    edercl
  401.     call    vprint        ; Prompt input
  402.     db    cr,lf,'Command Line?',' '+80h
  403.     call    rdbuf        ; Input text
  404.     call    putcl        ; Store command line
  405.     call    crlf        ; New line
  406.     jp    exit
  407. ;
  408. ; STORE COMMAND LINE
  409. ;
  410. putcl:
  411.     ex    de,hl        ; Ptr to new line in de
  412.     call    getcl1        ; Get command line data
  413.     ld    b,a        ; Char count in b
  414.     ex    de,hl        ; Hl pts to new line
  415.     push    hl        ; Save ptr to next line
  416. pcl1:
  417.     ld    a,(hl)        ; Go to end of line
  418.     or    a        ; At end?
  419.     jr    z,pcl2
  420.     inc    hl        ; Pt to next
  421.     djnz    pcl1
  422.     pop    hl        ; Clear stack
  423.     ret            ; Command line too long - abort
  424. ;
  425. ; AT END OF NEW COMMAND LINE
  426. ;    PTR TO FIRST CHAR OF NEW COMMAND LINE ON STACK
  427. ;    HL PTS TO ENDING 0 OF NEW COMMAND LINE
  428. ;    B = NUMBER OF CHARS REMAINING BEFORE COMMAND LINE OVERFLOW
  429. ;
  430. pcl2:
  431.     ex    de,hl        ; De pts to last byte
  432.     push    de        ; Save ptr in case of error
  433.     call    getcl2        ; Pt to tail of command line buffer
  434.     ld    a,(hl)        ; Get first char of tail
  435.     cp    ';'        ; Continuation?
  436.     jr    z,pcl3
  437.     or    a        ; Done?
  438.     jr    z,pcl3
  439.     ld    a,';'        ; Set continuation char
  440.     ld    (de),a
  441.     inc    de
  442.     dec    b        ; Count down
  443.     jr    z,pcl4        ; Overflow
  444. ;
  445. ; COPY TAIL ONTO END OF NEW COMMAND LINE
  446. ;
  447. pcl3:
  448.     ld    a,(hl)        ; Get next char
  449.     ld    (de),a        ; Store it
  450.     inc    hl        ; Pt to next
  451.     inc    de
  452.     or    a        ; Done?
  453.     jr    z,pcl5
  454.     dec    b        ; Count down
  455.     jr    nz,pcl3
  456. ;
  457. ; COMMAND LINE TOO LONG
  458. ;
  459. pcl4:
  460.     pop    hl        ; Get ptr to end of old line
  461.     ld    (hl),0        ; Store ending 0
  462.     pop    af        ; Clear stack
  463.     ret
  464. ;
  465. ; NEW COMMAND LINE OK
  466. ;
  467. pcl5:
  468.     pop    af        ; Clear stack
  469.     call    getcl1        ; Get ptr to buffer
  470.     ld    de,4        ; Pt to first char in buffer
  471.     ex    de,hl
  472.     add    hl,de
  473.     ex    de,hl
  474.     ld    (hl),e        ; Store address
  475.     inc    hl
  476.     ld    (hl),d
  477.     pop    hl        ; Hl pts to first char of new line
  478. ;
  479. ; COPY COMMAND LINE INTO BUFFER
  480. ;
  481. pcl6:
  482.     ld    a,(hl)        ; Copy
  483.     ld    (de),a
  484.     inc    hl
  485.     inc    de
  486.     or    a        ; Done?
  487.     jr    nz,pcl6
  488.     ret
  489. ;
  490. ; GETCL1
  491. ;
  492. getcl1:
  493.     ld    hl,(z3env+18h)    ; Get address of command line buffer
  494.     push    hl        ; Save it
  495.     inc    hl        ; Get size in a
  496.     inc    hl
  497.     ld    a,(hl)
  498.     pop    hl
  499.     ret
  500. ;
  501. ; GETCL2
  502. ;
  503. getcl2:
  504.     ld    hl,(z3env+18h)    ; Get address of command line buffer
  505.     ld    a,(hl)        ; Get address of next char
  506.     inc    hl
  507.     ld    h,(hl)
  508.     ld    l,a        ; Hl pts to next char
  509.     ld    a,(hl)        ; Get it
  510.     ret
  511.  
  512.  
  513. ;
  514. ; Get ASCII or HEX chars
  515. ;
  516. ahinput:
  517.     call    rdbuf        ; Input text without prompt
  518.     call    edprcl        ; Clear prompt line
  519.     ld    a,(eindex)    ; Pt to position
  520.     ex    de,hl
  521.     ld    hl,(block)    ; Compute offset
  522.     ex    de,hl
  523.     add    a,e
  524.     ld    e,a
  525.     ld    a,d
  526.     adc    0
  527.     ld    d,a        ; De pts to byte, hl pts to text
  528.     ret
  529.  
  530. ;Enter ASCII Chars
  531. ;
  532. editalp:
  533.     call    edercl
  534.     call    prinp        ; Prompt input
  535.     db    dim,'Enter Text',bright
  536.     db    cr,lf,' -->',' '+80h
  537.     call    ahinput
  538. edita1:
  539.     ld    a,(hl)        ; Get char
  540.     cp    eolch        ; Eol?
  541.     jr    z,edita2    ; Refresh screen
  542.     call    getahv        ; Get ascii or <hex> value
  543.     ld    (de),a        ; Update byte
  544.     inc    hl        ; Pt to next input char
  545.     inc    e        ; Pt to next buffer byte
  546.     jr    nz,edita1
  547. edita2:
  548.     jp    mu3nr        ; Done-refresh screen
  549.  
  550. ;
  551. ;Enter Numbers
  552. ;
  553. edithex:
  554.     call    edercl
  555.     call    prinp        ; Prompt input
  556.     db    dim,'Enter Hex Numbers',bright
  557.     db    cr,lf,' -->',' '+80h
  558.     call    ahinput
  559. edith1:
  560.     ld    a,(hl)        ; Get hex digit
  561.     cp    eolch        ; Eol?
  562.     jr    z,edita2    ; Refresh screen
  563.     cp    ' '        ; Skip spaces
  564.     jr    nz,edith2
  565.     inc    hl        ; Skip space
  566.     jr    edith1
  567. edith2:
  568.     push    de        ; Save ptr
  569.     call    hexin        ; Get value and position hl
  570.     ld    a,e        ; In a
  571.     pop    de        ; Get ptr
  572.     ld    (de),a        ; Put byte
  573.     inc    e        ; Advance to next byte
  574.     jr    nz,edith1
  575.     jr    edita2        ; Done-refresh
  576.  
  577. ;
  578. ;Calculate Sum and Differences
  579. ;
  580. editcalc:
  581.     call    edercl        ; Clear error line
  582.     call    prinp        ; Prompt input
  583.     db    dim,'Enter Two Hex Numbers - ',bright,0
  584.     call    getline
  585.     call    hexin        ; Evaluate first number
  586.     call    sksp        ; Skip to 2nd number
  587.     push    de        ; Save first number
  588.     call    hexin        ; Evaluate 2nd number
  589.     pop    hl        ; Get first number
  590.     call    ermsg        ; Print error message
  591.     db    0
  592.     call    phl4hc        ; Print first number
  593.     call    vprint
  594.     db    dim,' and',bright,' '+80h
  595.     ex    de,hl
  596.     call    phl4hc        ; Print 2nd number
  597.     ex    de,hl
  598.     call    vprint
  599.     db    '    ',dim,'Sum =',bright,' '+80h
  600.     push    hl
  601.     add    hl,de
  602.     call    numout
  603.     pop    hl
  604.     call    vprint
  605.     db    '  ',dim,'Diff =',bright,' '+80h
  606.     ld    a,l        ; Hl=hl-de
  607.     sub    e
  608.     ld    l,a
  609.     ld    a,h
  610.     sbc    a,d
  611.     ld    h,a
  612.     call    numout
  613.     jp    editcmd
  614. ;
  615. ;Output number in HL in Hex and Decimal
  616. ;
  617. numout:
  618.     call    phl4hc        ; Hex
  619.     call    vprint
  620.     db    ' ','('+80h
  621.     call    phlfdc        ; Decimal floating
  622.     ld    a,')'        ; Close paren
  623.     jp    conout
  624.  
  625. ;
  626. ; Position at Error Message and Print It
  627. ;
  628. ermsg:
  629.     call    at        ; Position
  630.     db    errow,ercol
  631.     jp    vprint        ; Print it
  632.  
  633. edercl:
  634.     call    at
  635.     db    errow,ercol
  636.     jp    vereol
  637. ;
  638. ;CLEAR PROMPT LINE
  639. ;
  640. edprcl:
  641.     call    prinp        ; Prompt line
  642.     db    0
  643.     ld    b,40        ; 40 positions
  644.     call    vereol        ; Clear to eol or 40 chars
  645.     call    at        ; User input
  646.     db    errow,1
  647.     ld    b,79        ; 79 positions
  648.     jp    vereol
  649. ;
  650. ;Input Address
  651. ;
  652. editadr:
  653.     call    vprint
  654.     db    'Address?',' '+80h
  655.     call    rdbuf        ; Input text
  656.     call    sksp        ; Skip to non-space
  657.     ld    a,(hl)        ; Any input?
  658.     or    a        ; 0=no
  659.     jp    z,editcmd
  660.     call    hexin        ; Convert from hex
  661.     ex    de,hl        ; Hl = address
  662.     ld    (block),hl
  663.     jp    edit0        ; Reenter
  664. ;
  665. ;Advance to Next Block
  666. ;
  667. editplus:
  668.     ld    de,128        ; 128 bytes
  669. editp1:    ld    hl,(block)    ; To next block
  670.     add    hl,de
  671.     ld    (block),hl
  672.     jp    mu3r
  673. ;
  674. ;Backup to Last Block
  675. ;
  676. editminus:
  677.     ld    de,-128        ; 128 bytes
  678.     jr    editp1
  679. ;
  680. ;Exit MU3
  681. ;
  682. edcc:
  683.     call    dinit        ; Deinit term
  684.     call    crlf        ; New line
  685.     jp    exit
  686. ;
  687. ;EDIT MOVE: UP
  688. ;
  689. edup:
  690.     call    edccur        ; Clear cursor
  691.     ld    a,(eindex)    ; Backup index by 16
  692.     sub    16
  693. ;
  694. ;Common EDIT MOVE Routine - on input, A=new index
  695. ;
  696. edmove:
  697.     and    7fh        ; Mod 128
  698.     ld    (eindex),a
  699.     call    edcur        ; Set cursor
  700.     jp    editcmd
  701. ;
  702. ;EDIT MOVE: DOWN
  703. ;
  704. eddown:
  705.     call    edccur        ; Clear cursor
  706.     ld    a,(eindex)    ; Increment index by 16
  707.     add    16
  708.     jr    edmove        ; Common routine
  709. ;
  710. ;EDIT MOVE: RIGHT
  711. ;
  712. edright:
  713.     call    edccur        ; Clear cursor
  714.     ld    a,(eindex)    ; Increment index by 1
  715.     inc    a
  716.     jr    edmove        ; Common routine
  717. ;
  718. ;EDIT MOVE: LEFT
  719. ;
  720. edleft:
  721.     call    edccur        ; Clear cursor
  722.     ld    a,(eindex)    ; Decrement index by 1
  723.     dec    a
  724.     jr    edmove        ; Common routine
  725. ;
  726. ;EDIT SUBROUTINE: EDCUR
  727. ; Position Editor Cursor at EINDEX
  728. ;EDIT SUBROUTINE: EDCCUR
  729. ; Clear Editor Cursor at EINDEX
  730. ;
  731. edcur:
  732.     push    hl        ; Save hl
  733.     ld    c,ecurs        ; Cursor char
  734.     call    edsetcur
  735.     call    at        ; Update data
  736.     db    3,74
  737.     ld    a,(eindex)    ; Pt to byte at cursor
  738.     ld    hl,(block)
  739.     add    a,l
  740.     ld    l,a
  741.     ld    a,h
  742.     adc    0
  743.     ld    h,a        ; Hl pts to byte at cursor
  744.     ld    a,(hl)        ; Get byte
  745.     call    pa2hc        ; Print as hex
  746.     call    dspace
  747.     ld    a,(hl)        ; Get byte
  748.     pop    hl        ; Restore hl
  749.     and    7fh        ; Mask
  750.     cp    7fh        ; 7fh as dot
  751.     jr    z,edc7f
  752.     cp    ' '        ; Output char or dot
  753.     jp    nc,conout
  754. edc7f:
  755.     ld    a,'.'        ; Dot
  756.     jp    conout
  757. edccur:
  758.     ld    c,' '        ; Clear cursor
  759. edsetcur:
  760.     call    edrow        ; Compute row
  761.     and    0fh        ; Compute col mod 16
  762.     ld    b,a        ; Result in b
  763.     add    a,a        ; *2
  764.     add    a,b        ; *3
  765.     add    ecol+6        ; Add in col
  766.     dec    a        ; Subtract 1
  767.     ld    l,a        ; Col position set
  768.     call    gotoxy        ; Position cursor
  769.     ld    a,c        ; Output char
  770.     jp    conout
  771. ;
  772. ;Compute Row from EINDEX
  773. ;
  774. edrow:
  775.     ld    a,(eindex)    ; Get index
  776.     ld    b,a        ; Save in b
  777.     rrca            ; Divide by 16
  778.     rrca
  779.     rrca
  780.     rrca
  781.     and    0fh        ; Mask for lsb only
  782.     add    erow        ; Compute row
  783.     ld    h,a        ; Row set
  784.     ld    a,b        ; Get index
  785.     ret
  786.  
  787. ;
  788. ;PRINT A SPACE
  789. ;
  790. dspace:
  791.     ld    a,' '
  792.     jp    conout
  793. ;
  794. ;PRINT AN BARISK IN REV VIDEO
  795. ;
  796. bar:
  797.     call    vprint
  798.     db    dim,'|',bright,0
  799.     ret
  800. ;
  801. ;Get value from input buffer
  802. ;
  803. getahv:
  804.     ld    a,(hl)        ; Get next char
  805.     cp    '<'        ; Hex escape?
  806.     ret    nz        ; No, return
  807. ;"<<" means one "<"
  808.     inc    hl
  809.     ld    a,(hl)
  810.     cp    '<'
  811.     ret    z
  812. ;Got hex
  813.     push    de
  814.     call    hexin        ; Get value
  815.     cp    '>'        ; Proper delim?
  816.     ld    a,e        ; Get value
  817.     pop    de
  818.     ret    z
  819. ;
  820. ;ERROR CONDITION IN SUBROUTINE - CLEAR STACK AND FLAG ERROR
  821. ;
  822. serr:
  823.     pop    af        ; Clear stack
  824.     jp    what        ; Error
  825. ;
  826. ;Input Number from Command Line -- Assume it to be Hex
  827. ;  Number returned in DE
  828. ;
  829. hexin:
  830.     ld    de,0        ; Init value
  831.     ld    a,(hl)
  832.     cp    '#'        ; Decimal?
  833.     jr    z,hdin        ; Make decimal
  834. ;
  835. hinlp:
  836.     ld    a,(hl)        ; Get char
  837.     call    caps        ; Capitalize
  838.     cp    cr        ; Eol?
  839.     ret    z
  840.     cp    eolch        ; Eol?
  841.     ret    z
  842.     cp    sepch
  843.     ret    z
  844.     cp    ' '        ; Space?
  845.     ret    z
  846.     cp    '-'        ; 'thru'?
  847.     ret    z
  848.     cp    '>'
  849.     ret    z
  850.     inc    hl        ; Pt to next char
  851.     cp    '0'        ; Range?
  852.     jr    c,serr
  853.     cp    '9'+1        ; Range?
  854.     jr    c,hinnum
  855.     cp    'A'        ; Range?
  856.     jr    c,serr
  857.     cp    'F'+1        ; Range?
  858.     jr    nc,serr
  859.     sub    7        ; Adjust from a-f to 10-15
  860. ;
  861. hinnum:
  862.     sub    '0'        ; Convert from ascii to binary
  863.     ex    de,hl
  864.     add    hl,hl        ; Mult previous value by 16
  865.     add    hl,hl
  866.     add    hl,hl
  867.     add    hl,hl
  868.     add    a,l        ; Add in new digit
  869.     ld    l,a
  870.     ex    de,hl
  871.     jr    hinlp
  872. ;
  873. hdin:
  874.     inc    hl        ; Skip '#'
  875. ;
  876. ;Input Number in Command Line as Decimal
  877. ;  Number is returned in DE
  878. ;
  879. decin:
  880.     ld    de,0
  881.     ld    a,(hl)        ; Get 1st char
  882.     cp    '#'        ; Hex?
  883.     jr    nz,dinlp
  884.     inc    hl        ; Pt to digit
  885.     jr    hinlp        ; Do hex processing
  886. ;
  887. dinlp:
  888.     ld    a,(hl)        ; Get digit
  889.     call    caps        ; Capitalize
  890.     cp    '0'        ; Range?
  891.     ret    c
  892.     cp    '9'+1        ; Range?
  893.     ret    nc
  894.     sub    '0'        ; Convert to binary
  895.     inc    hl        ; Pt to next
  896.     push    hl
  897.     ld    h,d
  898.     ld    l,e
  899.     add    hl,hl        ; X2
  900.     add    hl,hl        ; X4
  901.     add    hl,de        ; X5
  902.     add    hl,hl        ; X10
  903.     add    a,l        ; Add in digit
  904.     ld    l,a
  905.     ld    a,h
  906.     adc    0
  907.     ld    h,a
  908.     ex    de,hl        ; Result in de
  909.     pop    hl
  910.     jr    dinlp
  911. ;
  912. ; READ LINE FROM USER INTO INPUT LINE BUFFER
  913. ;
  914. rdbuf:
  915.     ld    hl,(buffer)    ; Pt to buffer
  916.     ex    de,hl        ; Set de as ptr to buffer
  917.     ld    c,10        ; Bdos readln
  918.     push    de        ; Save ptr
  919.     call    bdos
  920.     pop    hl        ; Pt to char count
  921.     inc    hl
  922.     ld    e,(hl)        ; Get char count
  923.     ld    d,0
  924.     inc    hl        ; Pt to first char
  925.     push    hl        ; Save ptr
  926.     add    hl,de        ; Pt to after last char
  927.     ld    (hl),0        ; Store ending 0
  928.     pop    hl        ; Pt to first char
  929.     ret
  930.  
  931. ;
  932. ; Erase to EOL
  933. ;  If fct not supported, send out B spaces and B backspaces
  934. ;
  935. vereol:
  936.     call    ereol        ; Try erase
  937.     ret    nz
  938.  
  939.      if    [not hardvid]
  940.     push    bc        ; Save b
  941.     ld    a,' '        ; Send spaces
  942.     call    vereol1
  943.     pop    bc        ; Get b
  944.     ld    a,bs        ; Send backspaces
  945. vereol1:
  946.     call    conout        ; Send char in a
  947.     djnz    vereol1
  948.     ret
  949.      endif    ; not hardvid
  950.  
  951. ;
  952. ; Clear Screen
  953. ;  If fct not supported, write 24 CRLFs
  954. ;
  955. vcls:
  956.      if    clson
  957.     jp    cls
  958.      else
  959.     call    cls        ; Try clear
  960.     ret    nz
  961.      if    [not hardvid]
  962.     push    bc        ; Save b
  963.     ld    b,24        ; Count
  964. vcls1:
  965.     call    crlf
  966.     djnz    vcls1
  967.     pop    bc
  968.     ret
  969.      endif    ; not hardvid
  970.      endif    ; Clson
  971. ;
  972. ; LIBRARY ROUTINES
  973. ;
  974.  
  975. cin:
  976.     push    hl
  977.     push    de
  978.     push    bc
  979.     ld    c,1
  980.     call    bdos
  981.     and    7fh
  982.     push    af
  983.     ld    a,bs        ; Overwrite
  984.     call    conout
  985.     pop    af
  986.     pop    bc
  987.     pop    de
  988.     pop    hl
  989.     ret
  990.  
  991. ;
  992. ; Capitalize char in A
  993. ;
  994. caps:
  995.     and    7fh
  996.     cp    'a'        ; Range?
  997.     ret    c
  998.     cp    'z'+1
  999.     ret    nc
  1000.     and    5fh        ; Mask to caps
  1001.     ret
  1002.  
  1003.  
  1004.  
  1005.  
  1006. ;
  1007. ; Print A as 2 Hex Chars
  1008. ;
  1009. pa2hc:
  1010.     push    af
  1011.     push    bc
  1012.     ld    b,a        ; Value in b
  1013.     rlca
  1014.     rlca
  1015.     rlca
  1016.     rlca
  1017.     call    pa2hc1
  1018.     ld    a,b        ; Get value
  1019.     call    pa2hc1
  1020.     pop    bc
  1021.     pop    af
  1022.     ret
  1023. pa2hc1:
  1024.     and    0fh
  1025.     add    '0'        ; To ascii
  1026.     cp    '9'+1
  1027.     jr    c,pa2hc2
  1028.     add    7        ; To letter
  1029. pa2hc2:
  1030.     jp    conout
  1031.  
  1032. ;
  1033. ; Skip Spaces
  1034. ;
  1035. sksp:
  1036.     ld    a,(hl)        ; Skip to non-space
  1037.     cp    ' '
  1038.     ret    nz
  1039.     inc    hl
  1040.     jr    sksp
  1041.  
  1042. phl4hc:
  1043.     push    hl
  1044.     push    af
  1045.     ld    a,h
  1046.     call    pa2hc
  1047.     ld    a,l
  1048.     call    pa2hc
  1049.     pop    af
  1050.     pop    hl
  1051.     ret
  1052.  
  1053. phlfdc:
  1054.     push    hl
  1055.     push    de
  1056.     push    bc
  1057.     push    af
  1058.     call    hldc1
  1059.     pop    af
  1060.     pop    bc
  1061.     pop    de
  1062.     pop    hl
  1063.     ret
  1064. ; Routine to convert HL to decimal number and display it
  1065.  
  1066. hldc1:    ld    b,0        ; B holds leading zero suppression flag
  1067.     ld    de,10000
  1068.     call    hldc2
  1069.     ld    de,1000
  1070.     call    hldc2
  1071.     ld    de,100
  1072.     call    hldc2
  1073.     ld    de,10
  1074.     call    hldc2
  1075.     ld    a,l
  1076.     add    a,'0'
  1077.     jp    conout
  1078.  
  1079. hldc2:    ld    c,'0'-1        ; Count number of divisions by de
  1080. hldc3:    inc    c
  1081.     xor    a
  1082.     sbc    hl,de
  1083.     jr    nc,hldc3    ; Keep subtracting until negative
  1084.     add    hl,de        ; Then add one back
  1085.  
  1086.     ld    a,c
  1087.     cp    '1'
  1088.     jr    nc,hldc4    ; > 0, turn off leading 0 flag and print
  1089.     ld    a,b        ; Check flag at b
  1090.     or    a
  1091.     ld    a,c        ; Put character back in c
  1092.     jr    nz,hldc5    ; If b not 0, this '0' is not leading
  1093.     ret            ; Else skip
  1094. hldc4:    ld    b,0ffh        ; Turn the leading 0 flag off
  1095. hldc5:
  1096.     jp    conout        ; Print the number
  1097.  
  1098. vprint:
  1099.     ex    (sp),hl
  1100.     call    vprint1
  1101.     ex    (sp),hl
  1102.     ret
  1103. ;
  1104. ;  Print String (terminated in 0) pted to by HL
  1105. ;
  1106. vprint1:
  1107.     ld    a,(hl)        ; Done?
  1108.     inc    hl        ; Pt to next
  1109.     or    a        ; 0 terminator
  1110.     ret    z
  1111.     cp    dim        ; Standout?
  1112.     jr    z,vprint1d
  1113.     cp    bright        ; Standend?
  1114.     jr    z,vprint1b
  1115.     call    conout        ; Print char
  1116.     or    a
  1117.     ret    m        ; Msb set
  1118.     jr    vprint1
  1119. vprint1d:
  1120.     call    stndout        ; Dim
  1121.     jr    vprint1
  1122. vprint1b:
  1123.     call    stndend        ; Bright
  1124.     jr    vprint1
  1125.  
  1126.  
  1127. ;
  1128. ; CRT ROUTINES
  1129. ;
  1130.      if    hardvid
  1131.     include    hardvid.lib
  1132.      else
  1133.     include    tcapvid.lib
  1134.      endif    ; hardvid
  1135.  
  1136. ;
  1137. ;EDITOR BUFFERS
  1138. ;
  1139. block:
  1140.     ds    2        ; Address of current block
  1141. buffer:
  1142.     ds    2        ; Ptr to free space
  1143. eindex:
  1144.     ds    1        ; Index entry
  1145.  
  1146.  
  1147. ; END DEBUG.LIB
  1148. :
  1149.     ds    2        ; Address of current block
  1150. buffer:
  1151.     ds    2        ; Ptr to free space
  1152. eindex:
  1153.     ds