home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / ZCPR33 / A-R / MU313.LBR / MU313.ZZ0 / MU313.Z80
Text File  |  2000-06-30  |  23KB  |  1,219 lines

  1. ; Program: MU3
  2. ; Author: Richard Conn
  3. ; Version: 1.0
  4. ; Date: 30 June 84
  5. ; Previous Versions: None
  6. ;
  7. ; Version 1.3
  8. ; New commands:
  9. ;    Byte Fill  - B <start adr, end adr, byte>
  10. ;    Move Mem   - M <start adr, end adr, dest adr>
  11. ;    Find       - F <string>
  12. ;            String is same syntax as POKE. Search is forward.
  13. ;            Successful find is record aligned with ">" at string.
  14. ;    Rpt Find   - R  Next occurrence of previously defined string.
  15. ;     (Bug - <string> is also found within MU3 itself.)
  16. ;    Place Mark - P  Sets marker to current record.  (Default = entry adr)
  17. ;    Quick Mark - Q  Return to marker set with P
  18. ; Stack internal to allow examination of ZCPR3 external stack.
  19. ; Minor additional screen display clean up.
  20. ;                - Rob Friefeld, 5/13/88 
  21. ;
  22. ; Version 1.2
  23. ; Commands to move forward and backward changed to any characters from the
  24. ; sets <,- and >.+.  Many improvements in screen display (such as clearing
  25. ; garbage before reading input, making compatible with reverse video terminals)
  26. ; Converted to type-3 environment.
  27. ;                - Jay Sage, 8/21/87
  28. ;
  29. ; Commands to move forward and backward changed from '+' and '-' 
  30. ; to ".' and ',' respectively.  Being unshifted keys these seem 
  31. ; easier and conform more to recent ZCPR3 utilities.
  32. ;                - Rick Charnes, 8/9/87
  33. ;
  34. vers    equ    13
  35.  
  36. z3env    equ    0fe00h
  37.  
  38. ;
  39. ;    MU3 is the ZCPR3 Memory Utility.  It allows the user to display
  40. ; blocks of memory, edit them, and perform general memory-oriented
  41. ; manipulation.  See the file MU3.HLP for usage details.
  42. ;
  43.  
  44. ;
  45. ;  General Equates
  46. ;
  47. bs    equ    08h
  48. cr    equ    0dh
  49. lf    equ    0ah
  50. fcb    equ    5ch
  51. dim    equ    1        ;goto standout mode
  52. bright    equ    2        ;exit standout mode
  53. EOLCH    EQU    0        ;END OF LINE CHAR
  54. SEPCH    EQU    ','        ;SEPARATOR CHAR
  55. EROW    EQU    6        ;FIRST ROW OF EDITOR DISPLAY
  56. ECOL    EQU    4        ;FIRST COL OF EDITOR DISPLAY
  57. ECOLC    EQU    ECOL+16*3+8    ;FIRST COL OF EDITOR CHAR DISPLAY
  58. ECURS    EQU    '>'        ;EDITOR CURSOR
  59. PRROW    EQU    22        ;PROMPT ROW
  60. PRCOL    EQU    10        ;PROMPT COLUMN
  61. PRCOLI    EQU    PRCOL+15    ;PROMPT INPUT COL
  62. ERROW    EQU    23        ;ERROR MESSAGE ROW
  63. ERCOL    EQU    15        ;ERROR MESSAGE COLUMN
  64.  
  65. ;
  66. ;  SYSLIB/Z3LIB/VLIB Externals
  67. ;
  68.     .request vlib,z3lib,syslib
  69.     ext    z3vinit,tinit,envptr,codend,putcl
  70.     ext    cls,gotoxy,ereol,at,vprint,stndout
  71.     ext    cout,crlf,cin,caps
  72.     ext    bline,sksp
  73.     ext    phl4hc,pa2hc,phlfdc
  74.  
  75. ;
  76. ; Environment Definition
  77. ;
  78.     if    z3env ne 0
  79. ;
  80. ; External ZCPR3 Environment Descriptor
  81. ;
  82. mu3org:
  83.     jp    start
  84.     db    'Z3ENV'        ;This is a ZCPR3 Utility
  85.     db    3        ;External Environment Descriptor, Type-3
  86. z3eadr:
  87.     dw    z3env
  88.     dw    mu3org
  89. start:
  90.     ld    hl,(z3eadr)    ;pt to ZCPR3 environment
  91. ;
  92.     else
  93. ;
  94. ; Internal ZCPR3 Environment Descriptor
  95. ;
  96.     MACLIB    Z3BASE.LIB
  97.     MACLIB    SYSENV.LIB
  98. z3eadr:
  99.     jp    start
  100.     SYSENV
  101. start:
  102.     ld    hl,z3eadr    ;pt to ZCPR3 environment
  103.     endif
  104.  
  105. ;
  106. ; Start of Program -- Initialize ZCPR3 Environment
  107. ;
  108.     ld    (stksav),sp    ;use internal stack   rdf
  109.     ld    sp,mu3stk
  110.  
  111.     call    z3vinit        ;initialize the ZCPR3 Env and the VLIB Env
  112.     call    tinit        ; initialize the terminal  jww
  113. ;
  114. ; DEFINE FREE SPACE
  115. ;
  116.     CALL    CODEND        ;DEUERMINE ADDRESS
  117.     LD    (HL),126    ;126 CHARS INPUT ALLOWED
  118.     LD    (BUFFER),HL    ;SET PTR
  119. ;
  120. ; SET UP ARROW KEYS
  121. ;
  122.     LD    HL,(ENVPTR)    ;PT TO ENVIRONMENT DESCRIPTOR
  123.     LD    DE,80H+10H    ;PT TO ARROW KEY INFO
  124.     ADD    HL,DE
  125.     LD    DE,EDCURT    ;PT TO CURSOR TABLE
  126.     LD    B,4        ;4 ARROW KEYS
  127. ARROW:
  128.     LD    A,(HL)        ;GET CHAR
  129.     LD    (DE),A        ;STORE CHAR
  130.     INC    HL        ;PT TO NEXT
  131.     INC    DE        ;PT TO NEXT ENTRY
  132.     INC    DE
  133.     INC    DE
  134.     DEC    B        ;COUNT DOWN
  135.     JP    NZ,ARROW
  136. ;
  137. ; Check for Command Line Parameter
  138. ;
  139.     ld    hl,fcb+1    ;pt to first char
  140.     ld    a,(hl)        ;get char
  141.     cp    ' '        ;no param?
  142.     jp    nz,pcheck
  143.     ld    hl,(envptr)    ;pt to environment descriptor
  144.     jp    mu3
  145. ;
  146. ; We have a parameter
  147. ;
  148. pcheck:
  149.     cp    '/'        ;help?
  150.     jp    z,help
  151.     call    hexin        ;convert to binary
  152.     ex    de,hl        ;HL=value
  153.     jp    mu3
  154. ;
  155. ; Print help message
  156. ;
  157. help:
  158.     call    vprint
  159.     db    cr,lf,'Syntax:'
  160.     db    cr,lf,'  MU3            <-- Invoke MU3 at Env Desc#'
  161.     db    cr,lf,'  MU3 <hex adr>  <-- Invoke MU3 at Address'
  162.     db    0
  163.     ret
  164. ;
  165. ; Erase to EOL
  166. ;  If fct not supported, send out B spaces and B backspaces
  167. ;
  168. vereol:
  169.     call    ereol        ;try erase
  170.     ret    nz
  171.     push    bc        ;save B
  172.     ld    a,' '        ;send spaces
  173.     call    vereol1
  174.     pop    bc        ;get B
  175.     ld    a,bs        ;send backspaces
  176. vereol1:
  177.     call    cout        ;send char in A
  178.     dec    b
  179.     jp    nz,vereol1
  180.     ret
  181. ;
  182. ; Clear Screen
  183. ;  If fct not supported, write 24 CRLFs
  184. ;
  185. vcls:
  186.     call    cls        ;try clear
  187.     ret    nz
  188.     push    bc        ;save B
  189.     ld    b,24        ;count
  190. vcls1:
  191.     call    crlf
  192.     dec    b
  193.     jp    nz,vcls1
  194.     pop    bc
  195.     ret
  196. ;
  197. ; Run MU3
  198. ;    HL contains starting address
  199. ;
  200. mu3:
  201.     LD    (BLOCK),HL    ;SAVE PTR TO BLOCK
  202.     ld    (edmark),hl    ;Save ptr to place marker    rdf
  203. ;
  204. ; REFRESH EDIT SCREEN
  205. ;
  206. EDIT0:
  207.     CALL    VCLS        ;NEW SCREEN
  208.     CALL    AT
  209.     DB    2,18        ;ROW 2, COL 18
  210.     CALL    VPRINT        ;BANNER
  211.     DB    'MU3 Memory Editor, Version '
  212.     DB    (VERS/10)+'0','.',(VERS MOD 10)+'0',0
  213.     CALL    AT
  214.     DB    3,24
  215.     CALL    VPRINT
  216.     DB    '(Loaded at ',0
  217.     LD    HL,MU3ORG
  218.     CALL    PHL4HC
  219.     CALL    VPRINT
  220.     DB    'H)',0
  221.     CALL    AT        ;POSITION FOR VALUE TEXT
  222.     DB    2,62
  223.     CALL    VPRINT
  224.     DB    'Byte at Cursor',0
  225.     CALL    AT
  226.     DB    3,61
  227.     CALL    VPRINT
  228.     DB    DIM,' HEX ',BRIGHT,'    ',DIM,' CHAR ',BRIGHT,0
  229.     LD    H,EROW+9    ;POSITION FOR COMMAND DISPLAY
  230.     LD    L,1
  231.     CALL    GOTOXY        ;POSITION CURSOR
  232.     CALL    VPRINT        ;PRINT COMMAND SUMMARY
  233.     DB    ' -- Movement --'
  234.     DB    '  ------------------------ Operation --------------------------',CR,LF
  235.     DB    '      ^E         '
  236.     DB    'A ',DIM,' Enter Address     ',BRIGHT
  237.     DB    '    B ',dim,' Byte Fill  ',BRIGHT
  238.     DB    '   >.+ ',DIM,' Next Block    ',BRIGHT,CR,LF
  239.     DB    '       ^         '
  240.     DB    'H ',DIM,' Hex Calculator    ',BRIGHT
  241.     DB    '    M ',dim,' Move Memory',BRIGHT
  242.     DB    '   <,- ',DIM,' Prev Block    ',BRIGHT,CR,LF
  243.     DB    '  ^S <-+-> ^D    '
  244.     DB    'N ',DIM,' Enter Hex Numbers ',BRIGHT
  245.     DB    '    F ',dim,' Find       ',BRIGHT      
  246.     DB    '   ^R  ',DIM,' Replot Screen ',BRIGHT,CR,LF
  247.     DB    '       v         '
  248.     DB    'T ',DIM,' Enter Text        ',BRIGHT
  249.     DB    '    R ',dim,' Rpt Find   ',BRIGHT
  250.     DB    '   ^C  ',DIM,' Exit MU3      ',BRIGHT,CR,LF
  251.     DB    '      ^X         '
  252.     DB    'C ',DIM,' Enter Command Line',BRIGHT
  253.     DB    '  P-Q ',dim,' Place-Quick',BRIGHT
  254.     DB    '    X  ',DIM,' eXit MU3      ',BRIGHT
  255.     DB    0
  256. ;
  257. ; REENTER MU3 WITH PTRS RESET
  258. ;
  259. MU3R:
  260.     XOR    A        ;A=0
  261.     LD    (EINDEX),A    ;SET INDEX TO 0 (FIRST ELEMENT)
  262.     LD    (EDERR),A    ;SET NO PREVIOUS ERROR
  263.     CALL    EDPLOT        ;PLOT BUFFER DATA
  264. ;
  265. ; INPUT EDITOR COMMAND
  266. ;
  267. EDITCMD:
  268.     CALL    EDERCL        ;CLEAR EDITOR INVALID COMMAND MESSAGE
  269. EDITCMD1:
  270.     CALL    PRMSG        ;POSITION AT PROMPT MESSAGE
  271.     DB    DIM,' MU3 Command? ',BRIGHT,0
  272.     CALL    EREOL        ;CLEAR OUT OLD COMMAND
  273.     CALL    PRINP        ;POSITION AT PROMPT INPUT
  274.     DB    0
  275.     CALL    CIN        ;GET CHAR
  276.     CALL    CAPS        ;CAPITALIZE
  277.     LD    B,A        ;COMMAND IN B
  278.     LD    HL,EDCURT    ;PROCESS CURSOR COMMANDS FIRST
  279.     CALL    CMD        ;PROCESS COMMAND
  280.     LD    HL,ECMDTBL    ;EDITOR COMMAND TABLE
  281.     CALL    CMD        ;PROCESS COMMAND
  282.     LD    A,0FFH        ;SET ERROR FLAG
  283.     LD    (EDERR),A
  284.     CALL    ERMSG        ;ERROR MESSAGE
  285.     DB    'Invalid Command',0
  286.     JP    EDITCMD1
  287. ;
  288. ; Position at Prompt Message and Print it
  289. ;
  290. PRMSG:
  291.     CALL    AT        ;POSITION
  292.     DB    PRROW,PRCOL
  293.     JP    VPRINT        ;PRINT IT
  294. ;
  295. ; Position at Prompt Input and Print Prompt
  296. ;
  297. PRINP:
  298.     CALL    AT        ;POSITION
  299.     DB    PRROW,PRCOLI
  300.     JP    VPRINT        ;PRINT IT
  301. ;
  302. ; Position at Error Message and Print It
  303. ;
  304. ERMSG:
  305.     CALL    AT        ;POSITION
  306.     DB    ERROW,ERCOL
  307.     JP    VPRINT        ;PRINT IT
  308. ;
  309. ;INPUT ERROR
  310. ;
  311. WHAT:
  312.     LD    A,0FFH        ;SET ERROR FLAG
  313.     LD    (EDERR),A
  314.     CALL    ERMSG
  315.     DB    'Value Error',0
  316.     JP    EDITCMD1
  317. ;
  318. ;Command Table Search and Execute
  319. ;
  320. CMD:
  321.     LD    A,(HL)        ;CHECK FOR END OF TABLE
  322.     OR    A
  323.     RET    Z        ;COMMAND NOT FOUND
  324.     CP    B        ;MATCH?
  325.     JP    Z,CMDRUN
  326.     INC    HL        ;SKIP TO NEXT ENTRY IN TABLE
  327.     INC    HL
  328.     INC    HL
  329.     JP    CMD
  330. ;
  331. ;RUN COMMAND
  332. ;
  333. CMDRUN:
  334.     INC    HL        ;PT TO LOW ADDRESS
  335.     LD    E,(HL)
  336.     INC    HL        ;PT TO HIGH ADDRESS
  337.     LD    D,(HL)
  338.     EX    DE,HL
  339.     POP    AF        ;CLEAR STACK
  340.     JP    (HL)        ;RUN ROUTINE
  341. ;
  342. ;PLOT BUFFER DATA
  343. ;
  344. EDPLOT:
  345.     LD    H,EROW-1    ;SET ROW
  346.     LD    L,ECOL-1    ;SET COLUMN
  347.     CALL    GOTOXY        ;POSITION CURSOR
  348.     CALL    VPRINT
  349.     DB    DIM
  350.     DB    '        0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F'
  351.     DB    BRIGHT,0
  352.     INC    H        ;NEXT ROW
  353.     CALL    GOTOXY        ;POSITION CURSOR
  354.     EX    DE,HL        ;POSITION IN DE
  355.     LD    HL,(BLOCK)    ;PT TO DATA
  356.     LD    B,8        ;8 LINES
  357. ;
  358. ;Print Next Line on Screen
  359. ;
  360. EDIT00:
  361.     CALL    VPRINT
  362.     DB    DIM,':',0
  363.     LD    A,H        ;OUTPUT ADDRESS
  364.     CALL    PA2HC
  365.     LD    A,L
  366.     CALL    PA2HC
  367.     CALL    VPRINT
  368.     DB    ':',BRIGHT,' ',0
  369.     LD    C,16        ;16 ELEMENTS
  370. EDIT01:
  371.     LD    A,(HL)        ;GET BYTE
  372.     CALL    PA2HC        ;PRINT AS HEX
  373.     CALL    SPACE        ;PRINT 1 SPACE
  374.     INC    HL        ;PT TO NEXT
  375.     DEC    C        ;COUNT DOWN
  376.     JP    NZ,EDIT01
  377.     EX    DE,HL        ;POSITION AGAIN
  378.     INC    H        ;NEXT ROW
  379.     CALL    GOTOXY
  380.     EX    DE,HL
  381.     DEC    B        ;COUNT DOWN
  382.     JP    NZ,EDIT00
  383.     LD    H,EROW        ;RESET ROW
  384.     LD    L,ECOLC        ;RESET COL
  385.     CALL    GOTOXY        ;POSITION CURSOR
  386.     EX    DE,HL        ;POSITION IN DE
  387.     LD    HL,(BLOCK)    ;PT TO DATA
  388.     LD    B,8        ;8 LINES
  389. EDIT02:
  390.     CALL    BAR        ;PRINT BAR
  391.     LD    C,16        ;16 ELEMENTS
  392. EDIT03:
  393.     LD    A,(HL)        ;GET BYTE
  394.     AND    7FH        ;MASK MSB
  395.     CP    7FH        ;DON'T PRINT 7FH
  396.     JP    Z,EDIT7F
  397.     CP    ' '        ;SPACE OR MORE?
  398.     JP    NC,EDIT04
  399. EDIT7F:
  400.     LD    A,'.'        ;PRINT DOT
  401. EDIT04:
  402.     CALL    COUT        ;PRINT BYTE
  403.     INC    HL        ;PT TO NEXT
  404.     DEC    C        ;COUNT DOWN
  405.     JP    NZ,EDIT03
  406.     CALL    BAR        ;PRINT ENDING BAR
  407.     EX    DE,HL        ;POSITION AGAIN
  408.     INC    H        ;NEXT ROW
  409.     CALL    GOTOXY
  410.     EX    DE,HL
  411.     DEC    B        ;COUNT DOWN
  412.     JP    NZ,EDIT02
  413.     CALL    EDCUR        ;POSITION CURSOR
  414.     RET
  415. ;
  416. ;EDITOR COMMAND TABLE
  417. ;
  418. ECMDTBL:
  419.     DB    CR        ;NOP
  420.     DW    EDITCMD
  421.     DB    'C'-'@'        ;^C = EXIT MU3
  422.     DW    EDCC
  423.     DB    'X'        ; X = EXIT MU3
  424.     DW    EDCC
  425.     DB    'R'-'@'        ;^R = REFRESH
  426.     DW    EDIT0
  427.     DB    'E'-'@'        ;^E=UP
  428.     DW    EDUP
  429.     DB    'X'-'@'        ;^X=DOWN
  430.     DW    EDDOWN
  431.     DB    'D'-'@'        ;^D=RIGHT
  432.     DW    EDRIGHT
  433.     DB    'S'-'@'        ;^S=LEFT
  434.     DW    EDLEFT
  435.     DB    ' '        ;NOP
  436.     DW    EDITCMD
  437.     DB    '+'        ;ADVANCE
  438.     DW    EDITPLUS
  439.     DB    '.'
  440.     DW    EDITPLUS
  441.     DB    '>'
  442.     DW    EDITPLUS
  443.     DB    '-'        ;BACKUP
  444.     DW    EDITMINUS
  445.     DB    ','
  446.     DW    EDITMINUS
  447.     DB    '<'
  448.     DW    EDITMINUS
  449.     DB    'A'        ;ADDRESS
  450.     DW    EDITADR
  451.     DB    'C'        ;COMMAND LINE
  452.     DW    EDITCL
  453.     DB    'H'        ;HEX CALC
  454.     DW    EDITCALC
  455.     DB    'N'        ;CHANGE NUMBERS
  456.     DW    EDITHEX
  457.     DB    'T'        ;CHANGE TEXT
  458.     DW    EDITALP
  459. ;new commands  rdf
  460.     db    'B'        ;BYTE FILL
  461.     dw    editfill
  462.     db    'M'        ;MOVE MEM
  463.     dw    editmove
  464.     db    'P'        ;PLACE MARK
  465.     dw    editplace
  466.     db    'Q'        ;QUICK TO MARK
  467.     dw    editmark
  468.     db    'F'        ;FIND
  469.     dw    edfind
  470.     db    'R'        ;REPEAT FIND
  471.     dw    edrefind
  472.     DB    0        ;END OF TABLE
  473. ;
  474. ;  ARROW KEY DEFINITONS FROM TCAP
  475. ;
  476. EDCURT:
  477.     DB    0        ;0 INDICATES NO ARROW KEYS
  478.     DW    EDUP
  479.     DB    0
  480.     DW    EDDOWN
  481.     DB    0
  482.     DW    EDRIGHT
  483.     DB    0
  484.     DW    EDLEFT
  485.     DB    0        ;END OF TABLE
  486. ;
  487. ;Enter Command Line
  488. ;
  489. EDITCL:
  490.     CALL    EDERCL        ;CLEAR ERROR LINE
  491.     CALL    CRLF        ;NEW LINE
  492.     CALL    VPRINT        ;PROMPT INPUT
  493.     DB    'Command Line? ',0
  494.     CALL    EREOL        ;CLEAR OUT GARBAGE ON LINE
  495.     CALL    RDBUF        ;INPUT TEXT
  496.     CALL    PUTCL        ;STORE COMMAND LINE
  497.     ld    sp,(stksav)    ;restore incoming pointer   rdf
  498.     JP    CRLF        ;NEW LINE
  499. ;
  500. ;Enter ASCII Chars
  501. ;
  502. EDITALP:
  503.     CALL    EDERCL        ;CLEAR ERROR LINE
  504.     CALL    PRINP        ;PROMPT INPUT
  505.     DB    DIM,' Enter Text (<hh> for Hex) ',BRIGHT
  506.     DB    CR,LF,' --> ',0
  507.     CALL    EREOL        ;CLEAR OUT ANY GARBAGE ON LINE
  508.     CALL    RDBUF        ;INPUT TEXT WITHOUT PROMPT
  509.     CALL    EDPRCL        ;CLEAR PROMPT LINE
  510.     LD    A,(EINDEX)    ;PT TO POSITION
  511.     EX    DE,HL
  512.     LD    HL,(BLOCK)    ;COMPUTE OFFSET
  513.     EX    DE,HL
  514.     ADD    a,E
  515.     LD    E,A
  516.     LD    A,D
  517.     ADC    0
  518.     LD    D,A        ;DE PTS TO BYTE, HL PTS TO TEXT
  519. EDITA1:
  520.     LD    A,(HL)        ;GET CHAR
  521.     CP    EOLCH        ;EOL?
  522.     JP    Z,EDITA2    ;REFRESH SCREEN
  523.     CALL    GETVAL        ;GET ASCII OR <HEX> VALUE
  524.     LD    (DE),A        ;UPDATE BYTE
  525.     INC    HL        ;PT TO NEXT INPUT CHAR
  526.     INC    E        ;PT TO NEXT BUFFER BYTE
  527.     JP    NZ,EDITA1
  528. EDITA2:
  529.     CALL    EDPLOT        ;REPLOT
  530.     JP    EDITCMD1    ;DONE-REFRESH SCREEN
  531. ;
  532. ;Calculate Sum and Differences
  533. ;
  534. EDITCALC:
  535.     CALL    EDERCL        ;CLEAR ERROR LINE
  536.     CALL    PRINP        ;PROMPT INPUT
  537.     DB    DIM,' Enter Two Hex Numbers: ',BRIGHT,' ',0
  538.     CALL    RDBUF        ;INPUT TEXT
  539.     CALL    EDPRCL        ;CLEAR PROMPT LINE
  540.     CALL    SKSP        ;SKIP TO NON-SPACE
  541.     LD    A,(HL)        ;ANY INPUT?
  542.     OR    A        ;0=NO
  543.     JP    Z,EDITCMD1
  544.     CALL    HEXIN        ;EVALUATE FIRST NUMBER
  545.     CALL    SKSP        ;SKIP TO 2ND NUMBER
  546.     PUSH    DE        ;SAVE FIRST NUMBER
  547.     CALL    HEXIN        ;EVALUATE 2ND NUMBER
  548.     POP    HL        ;GET FIRST NUMBER
  549.     CALL    ERMSG        ;PRINT ERROR MESSAGE
  550.     DB    0
  551.     CALL    PHL4HC        ;PRINT FIRST NUMBER
  552.     CALL    VPRINT
  553.     DB    ' and ',0
  554.     EX    DE,HL
  555.     CALL    PHL4HC        ;PRINT 2ND NUMBER
  556.     EX    DE,HL
  557.     CALL    VPRINT
  558.     DB    '    ',DIM,' Sum = ',BRIGHT,' ',0
  559.     PUSH    HL
  560.     ADD    HL,DE
  561.     CALL    NUMOUT
  562.     POP    HL
  563.     CALL    VPRINT
  564.     DB    '  ',DIM,' Diff = ',BRIGHT,' ',0
  565.     LD    A,L        ;HL=HL-DE
  566.     SUB    a,E
  567.     LD    L,A
  568.     LD    A,H
  569.     SBC    a,D
  570.     LD    H,A
  571.     CALL    NUMOUT
  572.     JP    EDITCMD1
  573. ;
  574. ;Output number in HL in Hex and Decimal
  575. ;
  576. NUMOUT:
  577.     CALL    PHL4HC        ;HEX
  578.     CALL    VPRINT
  579.     DB    ' (',0
  580.     CALL    PHLFDC        ;DECIMAL FLOATING
  581.     LD    A,')'        ;CLOSE PAREN
  582.     JP    COUT
  583. ;
  584. ;Enter Numbers
  585. ;
  586. EDITHEX:
  587.     CALL    EDERCL        ;CLEAR ERROR LINE
  588.     CALL    PRINP        ;PROMPT INPUT
  589.     DB    DIM,' Enter Hex Numbers (#nn for Dec) '
  590.     DB    BRIGHT
  591.     DB    CR,LF,' --> ',0
  592.     CALL    EREOL        ;CLEAR OUT ANY GARBAGE ON LINE
  593.     CALL    RDBUF        ;INPUT TEXT WITHOUT PROMPT
  594.     CALL    EDPRCL        ;CLEAR PROMPT LINE
  595.     LD    A,(EINDEX)    ;PT TO POSITION
  596.     EX    DE,HL
  597.     LD    HL,(BLOCK)    ;COMPUTE OFFSET
  598.     EX    DE,HL
  599.     ADD    a,E
  600.     LD    E,A
  601.     LD    A,D
  602.     ADC    0
  603.     LD    D,A        ;DE PTS TO BYTE, HL PTS TO TEXT
  604. EDITH1:
  605.     LD    A,(HL)        ;GET HEX DIGIT
  606.     CP    EOLCH        ;EOL?
  607.     JP    Z,EDITA2    ;REFRESH SCREEN
  608.     CP    ' '        ;SKIP SPACES
  609.     JP    NZ,EDITH2
  610.     INC    HL        ;SKIP SPACE
  611.     JP    EDITH1
  612. EDITH2:
  613.     PUSH    DE        ;SAVE PTR
  614.     CALL    HEXIN        ;GET VALUE AND POSITION HL
  615.     LD    A,E        ;... IN A
  616.     POP    DE        ;GET PTR
  617.     LD    (DE),A        ;PUT BYTE
  618.     INC    E        ;ADVANCE TO NEXT BYTE
  619.     JP    NZ,EDITH1
  620.     JP    EDITA2        ;DONE-REFRESH
  621. ;
  622. ;Clear Editor Invalid Command Message
  623. ;
  624. EDERCL:
  625.     LD    A,(EDERR)    ;PREVIOUS ERROR?
  626.     OR    A        ;0=NO
  627.     RET    Z
  628.     XOR    A        ;CLEAR FLAG
  629.     LD    (EDERR),A
  630.     CALL    ERMSG        ;CLEAR ERROR MESSAGE
  631.     DB    0
  632.     LD    B,40        ;40 CHARS MAX
  633.     JP    VEREOL
  634. ;
  635. ;CLEAR PROMPT LINE
  636. ;
  637. EDPRCL:
  638.     CALL    PRINP        ;PROMPT LINE
  639.     DB    0
  640.     LD    B,40        ;40 POSITIONS
  641.     CALL    VEREOL        ;CLEAR TO EOL OR 40 CHARS
  642.     CALL    AT        ;USER INPUT
  643.     DB    ERROW,1
  644.     LD    B,79        ;79 POSITIONS
  645.     JP    VEREOL
  646. ;
  647. ;Input Address
  648. ;
  649. EDITADR:
  650.     call    edercl
  651.     call    edprcl
  652.     CALL    prinp
  653.     DB    dim,' Address? ',bright,' ',0
  654.     CALL    RDBUF        ;GET USER INPUT
  655.     CALL    SKSP        ;SKIP LEADING SPACES
  656.     LD    A,(HL)        ;EMPTY LINE?
  657.     OR    A
  658.     JP    Z,MU3R
  659.     CALL    HEXIN        ;CONVERT FROM HEX
  660.     EX    DE,HL        ;HL = ADDRESS
  661.     LD    (BLOCK),HL
  662.     JP    MU3R        ;REENTER
  663.  
  664. ;
  665. ;Fill memory  (rdf)
  666. ;
  667. editfill:
  668.     call    edercl
  669.     call    prinp
  670.     db    dim,' Fill <S E Val> ',bright,' ',0
  671.     call    rdbuf        ; Input numbers
  672.     call    edprcl        ; Clear prompt
  673.     call    sksp
  674.     ld    a,(hl)        ; Any input?
  675.     or    a
  676.     jp    z,editcmd1    ; No
  677.  
  678.     call    hexin        ; Get the three numbers
  679.     call    sksp
  680.     push    de        ; Save on stack
  681.     call    hexin
  682.     call    sksp
  683.     push    de        ; Save on stack
  684.     call    hexin
  685.     push    de        ; Save on stack
  686.  
  687.     pop    bc        ; BC = byte
  688.     pop    hl        ; HL = end
  689.     pop    de        ; DE = start
  690.     xor    a
  691.     sbc    hl,de        ; HL = end - start
  692.     jp    c,what        ; Error: end before start
  693.     ex    de,hl        ; HL = start, DE = size of block
  694.  
  695. editf1:    ld    (hl),c        ; Do the fill
  696.     inc    hl
  697.     ld    a,d
  698.     or    e
  699.     jp    z,edita2    ; Replot on exit
  700.     dec    de
  701.     jr    editf1
  702.  
  703. ;
  704. ;Move memory   (rdf)
  705. ;
  706. editmove:
  707.     call    edercl
  708.     call    prinp
  709.     db    dim,' Move <S E D> ',bright,' ',0
  710.     call    rdbuf        ; Input numbers
  711.     call    edprcl        ; Clear prompt
  712.     call    sksp
  713.     ld    a,(hl)        ; Any input?
  714.     or    a
  715.     jp    z,editcmd1    ; No
  716.  
  717.     call    hexin        ; Get the three numbers
  718.     call    sksp
  719.     push    de
  720.     call    hexin
  721.     call    sksp
  722.     push    de
  723.     call    hexin        ; DE = dest
  724.     pop    hl        ; HL = end
  725.     pop    bc        ; BC = start
  726.  
  727.     xor    a        ; Compute block length
  728.     sbc    hl,bc
  729.     jp    c,what        ; Error: end before start
  730.     push    hl        ; Swap HL,BC
  731.     push    bc
  732.     pop    hl        ; HL = start
  733.     pop    bc        ; BC = block size
  734.  
  735.     push    hl        ; Head move or tail move?
  736.     xor    a
  737.     sbc    hl,de        ; Start - dest
  738.     pop    hl
  739.     jr    c,editm1    ; Tail move
  740.  
  741.     inc    bc        ; Head move, BC = # bytes to move
  742.     ldir
  743.     jp    edita2
  744.  
  745. editm1:
  746.     add    hl,bc        ; Add length to start
  747.     ex    de,hl
  748.     add    hl,bc        ; Add length to dest
  749.     ex    de,hl
  750.     inc    bc        ; # bytes
  751.     lddr            ; Tail move
  752.     jp    edita2
  753.  
  754. ;
  755. ;Mark place   (rdf)
  756. ;
  757. editplace:
  758.     call    edercl
  759.     ld    hl,(block)
  760.     ld    (edmark),hl
  761.     call    vprint
  762.     db    7,0
  763.     jp    editcmd1
  764.  
  765. ;
  766. ;Return to mark   (rdf)
  767. ;
  768. editmark:
  769.     call    edercl
  770.     ld    hl,(edmark)
  771.     ld    (block),hl
  772.     jp    mu3r
  773.  
  774. ;
  775. ;Record align display   (rdf)
  776. ;
  777. edalign:
  778.     call    edercl
  779.     ld    hl,(block)
  780.     ld    a,l
  781.     sub    80h
  782.     ld    b,a
  783.     jr    c,edal1
  784.     ld    l,80h
  785.     jr    edal2
  786. edal1:
  787.     ld    b,l
  788.     ld    l,0
  789. edal2:
  790.     ld    (block),hl
  791.  
  792.     ld    a,(eindex)
  793.     add    b
  794.     ld    (eindex),a
  795.     call    edplot
  796.     jp    editcmd1
  797.  
  798. ;
  799. ;Find a string   (rdf)
  800. ;
  801. ;  Use POKE-style input for hex and text
  802.  
  803. edfind:
  804.     CALL    EDERCL        ;CLEAR ERROR LINE
  805.     CALL    PRINP        ;PROMPT INPUT
  806.     DB    DIM,' Find? ',BRIGHT,' ',0
  807.     CALL    RDBUF        ;INPUT TEXT
  808.     CALL    EDPRCL        ;CLEAR PROMPT LINE
  809.     CALL    SKSP        ;SKIP TO NON-SPACE
  810.     LD    A,(HL)        ;ANY INPUT?
  811.     OR    A        ;0=NO
  812.     JP    Z,EDITCMD1
  813.  
  814. ;
  815. ; TRANSFER STRING TO FIND BUFFER, WITH HEX CONVERSION
  816. ; (Lifted from rcpiom.lib with mods)
  817. ; HL->first byte
  818. poke:
  819.     ld    b,0        ; Byte counter
  820.     ld    de,findbuf+2
  821. ; Loop for storing hex values sequentially via poke code
  822. ;  de -> destination address
  823. poke1:
  824.     call    sksp        ; Skip to non-blank
  825.     ld    a,(hl)
  826.     or    a
  827.     jr    z,pokex        ; Done
  828.     cp    '"'        ; Quoted text?
  829.     jr    z,poke2
  830.     inc    b        ; Inc arg counter
  831.     push    de        ; Save address
  832.     call    hexin        ; Get number (on err, rets directly to EDITCMD)
  833.     ld    a,e        ; Get low
  834.     pop    de        ; Get address
  835.     ld    (de),a        ; Store number
  836.     inc    de        ; Pt to next
  837.     jr    poke1
  838. ;
  839. ; Store ascii chars
  840. ;
  841. poke2:
  842.     inc    hl        ; Pt to next char
  843. poke3:
  844.     ld    a,(hl)        ; Get next char
  845.     or    a        ; Done?
  846.     jr    z,pokex
  847.     ld    (de),a        ; Put char
  848.     inc    b
  849.     inc    hl        ; Pt to next
  850.     inc    de
  851.     jr    poke3
  852.  
  853. pokex:
  854.     ld    a,b
  855.     ld    (findbuf+1),a    ; Store byte counter
  856.  
  857.  
  858. edrefind:
  859.     call    find00        ; Repeat find entry
  860.     jp    nz,edalign
  861.     call    ermsg        ;No luck on Z
  862.     db    'String Not Found',0
  863.     LD    A,0FFH        ;SET ERROR FLAG
  864.     LD    (EDERR),A
  865.     jp    editcmd1
  866.  
  867. ; Do the string matching.  Return NZ = Match
  868. find00:
  869.     ld    a,(findbuf+1)    ; = char count
  870.     or    a
  871.     ret    z        ; Empty
  872.  
  873.     ld    de,1        ; Last byte to check
  874.     ld    hl,(block)    ; Starting point
  875.     LD    A,(EINDEX)    ;PT TO BYTE AT CURSOR
  876.     ADD    A,L
  877.     LD    L,A
  878.     LD    A,H
  879.     ADC    0
  880.     LD    H,A        ;HL PTS TO BYTE AT CURSOR
  881.  
  882. find01:
  883.     ld    bc,findbuf+1    ; Char count
  884.     ld    a,(bc)
  885.     ex    af,af'        ; Save char count
  886.     inc    bc        ; First byte to match
  887.     ld    a,(bc)        ; Get it
  888. find02:
  889.     add    hl,de        ; Add 1 to HL, next byte to compare
  890.     jr    c,find06    ; Ovfl
  891.     cp    (hl)
  892.     jr    nz,find02    ; Keep looking
  893. ;    jp    nz,find02    ; faster on Z80
  894.  
  895. find03:
  896.     ex    af,af'        ; First byte matched
  897.     dec    a        ; Dec string count
  898.     jr    z,find05    ; Done
  899. find04:
  900.     inc    bc        ; Check rest of string
  901.     inc    hl
  902.     ex    af,af'        ; Save count
  903.     ld    a,(bc)
  904.     cp    (hl)
  905.     jr    z,find03    ; Matching...
  906.     jr    find01        ; Mismatch
  907.  
  908. find05:
  909.     ld    bc,(findbuf)    ; Found it, point to start of string
  910.     dec    hl        ; Char count in B
  911.     djnz    $-1
  912.     inc    hl
  913.     ld    (block),hl    ; Load new location
  914.     xor    a
  915.     ld    (eindex),a
  916.     or    -1        ; Nz return = ok
  917.     ret
  918.  
  919. find06:
  920.     xor    a        ; Z return = no go
  921.     ret
  922.  
  923.  
  924.  
  925.  
  926. ;
  927. ;Advance to Next Block
  928. ;
  929. EDITPLUS:
  930.     LD    HL,(BLOCK)    ;ADVANCE TO NEXT BLOCK
  931.     LD    DE,128        ;128 BYTES
  932.     ADD    HL,DE
  933.     LD    (BLOCK),HL
  934.     CALL    EDPLOT        ;REPLOT DATA
  935.     JP    EDITCMD
  936. ;
  937. ;Backup to Last Block
  938. ;
  939. EDITMINUS:
  940.     LD    HL,(BLOCK)    ;BACKUP TO LAST BLOCK
  941.     LD    DE,-128        ;128 BYTES
  942.     ADD    HL,DE
  943.     LD    (BLOCK),HL
  944.     CALL    EDPLOT        ;REPLOT DATA
  945.     JP    EDITCMD
  946. ;
  947. ;Exit MU3
  948. ;
  949. EDCC:
  950.     CALL    EDERCL        ;CLEAR ERROR LINE
  951.     ld    sp,(stksav)
  952.     JP    CRLF        ;NEW LINE
  953. ;
  954. ;EDIT MOVE: UP
  955. ;
  956. EDUP:
  957.     CALL    EDCCUR        ;CLEAR CURSOR
  958.     LD    A,(EINDEX)    ;BACKUP INDEX BY 16
  959.     SUB    16
  960. ;
  961. ;Common EDIT MOVE Routine - on input, A=new index
  962. ;
  963. EDMOVE:
  964.     AND    7FH        ;MOD 128
  965.     LD    (EINDEX),A
  966.     CALL    EDCUR        ;SET CURSOR
  967.     JP    EDITCMD
  968. ;
  969. ;EDIT MOVE: DOWN
  970. ;
  971. EDDOWN:
  972.     CALL    EDCCUR        ;CLEAR CURSOR
  973.     LD    A,(EINDEX)    ;INCREMENT INDEX BY 16
  974.     ADD    16
  975.     JP    EDMOVE        ;COMMON ROUTINE
  976. ;
  977. ;EDIT MOVE: RIGHT
  978. ;
  979. EDRIGHT:
  980.     CALL    EDCCUR        ;CLEAR CURSOR
  981.     LD    A,(EINDEX)    ;INCREMENT INDEX BY 1
  982.     INC    A
  983.     JP    EDMOVE        ;COMMON ROUTINE
  984. ;
  985. ;EDIT MOVE: LEFT
  986. ;
  987. EDLEFT:
  988.     CALL    EDCCUR        ;CLEAR CURSOR
  989.     LD    A,(EINDEX)    ;DECREMENT INDEX BY 1
  990.     DEC    A
  991.     JP    EDMOVE        ;COMMON ROUTINE
  992. ;
  993. ;EDIT SUBROUTINE: EDCUR
  994. ; Position Editor Cursor at EINDEX
  995. ;EDIT SUBROUTINE: EDCCUR
  996. ; Clear Editor Cursor at EINDEX
  997. ;
  998. EDCUR:
  999.     PUSH    HL        ;SAVE HL
  1000.     LD    C,ECURS        ;CURSOR CHAR
  1001.     CALL    EDSETCUR
  1002.     CALL    AT        ;UPDATE DATA
  1003.     DB    3,67
  1004.     LD    A,(EINDEX)    ;PT TO BYTE AT CURSOR
  1005.     LD    HL,(BLOCK)
  1006.     ADD    A,L
  1007.     LD    L,A
  1008.     LD    A,H
  1009.     ADC    0
  1010.     LD    H,A        ;HL PTS TO BYTE AT CURSOR
  1011.     LD    A,(HL)        ;GET BYTE
  1012.     CALL    PA2HC        ;PRINT AS HEX
  1013.     CALL    AT
  1014.     DB    3,77
  1015.     LD    A,(HL)        ;GET BYTE
  1016.     POP    HL        ;RESTORE HL
  1017.     AND    7FH        ;MASK
  1018.     CP    7FH        ;7FH AS DOT
  1019.     JP    Z,EDC7F
  1020.     CP    ' '        ;OUTPUT CHAR OR DOT
  1021.     JP    NC,COUT
  1022. EDC7F:
  1023.     LD    A,'.'        ;DOT
  1024.     JP    COUT
  1025. EDCCUR:
  1026.     LD    C,' '        ;CLEAR CURSOR
  1027. EDSETCUR:
  1028.     CALL    EDROW        ;COMPUTE ROW
  1029.     AND    0FH        ;COMPUTE COL MOD 16
  1030.     LD    B,A        ;RESULT IN B
  1031.     ADD    a,A        ;*2
  1032.     ADD    a,B        ;*3
  1033.     ADD    ECOL+6        ;ADD IN COL
  1034.     DEC    A        ;SUBTRACT 1
  1035.     LD    L,A        ;COL POSITION SET
  1036.     CALL    GOTOXY        ;POSITION CURSOR
  1037.     LD    A,C        ;OUTPUT CHAR
  1038.     ld    (edsc1),a
  1039.     cp    ' '
  1040.     JP    z,COUT
  1041.     call    vprint        ;show eindex in standout mode
  1042. edsc1    equ    $+1
  1043.     db    1,' ',2,0
  1044.     ret
  1045.  
  1046. ;
  1047. ;Compute Row from EINDEX
  1048. ;
  1049. EDROW:
  1050.     LD    A,(EINDEX)    ;GET INDEX
  1051.     LD    B,A        ;SAVE IN B
  1052.     RRCA            ;DIVIDE BY 16
  1053.     RRCA
  1054.     RRCA
  1055.     RRCA
  1056.     AND    0FH        ;MASK FOR LSB ONLY
  1057.     ADD    EROW        ;COMPUTE ROW
  1058.     LD    H,A        ;ROW SET
  1059.     LD    A,B        ;GET INDEX
  1060.     RET
  1061.  
  1062. ;
  1063. ;PRINT A SPACE
  1064. ;
  1065. SPACE:
  1066.     LD    A,' '
  1067.     JP    COUT
  1068. ;
  1069. ;PRINT AN BARISK IN REV VIDEO
  1070. ;
  1071. BAR:
  1072.     CALL    VPRINT
  1073.     DB    DIM,'|',BRIGHT,0
  1074.     RET
  1075. ;
  1076. ;Get value from input buffer
  1077. ;
  1078. GETVAL:
  1079.     LD    A,(HL)        ;GET NEXT CHAR
  1080.     CP    '<'        ;HEX ESCAPE?
  1081.     RET    NZ        ;NO, RETURN
  1082. ;"<<" means one "<"
  1083.     INC    HL
  1084.     LD    A,(HL)
  1085.     CP    '<'
  1086.     RET    Z
  1087. ;Got hex
  1088.     PUSH    DE
  1089.     CALL    HEXIN        ;GET VALUE
  1090.     CP    '>'        ;PROPER DELIM?
  1091.     LD    A,E        ;GET VALUE
  1092.     POP    DE
  1093.     RET    Z
  1094. ;
  1095. ;ERROR CONDITION IN SUBROUTINE - CLEAR STACK AND FLAG ERROR
  1096. ;
  1097. SERR:
  1098.     POP    AF        ;CLEAR STACK
  1099.     JP    WHAT        ;ERROR
  1100. ;
  1101. ;Input Number from Command Line -- Assume it to be Hex
  1102. ;  Number returned in DE
  1103. ;
  1104. HEXIN:
  1105.     LD    DE,0        ;INIT VALUE
  1106.     LD    A,(HL)
  1107.     CP    '#'        ;DECIMAL?
  1108.     JP    Z,HDIN        ;MAKE DECIMAL
  1109. ;
  1110. HINLP:
  1111.     LD    A,(HL)        ;GET CHAR
  1112.     CALL    CAPS        ;CAPITALIZE
  1113.     CP    CR        ;EOL?
  1114.     RET    Z
  1115.     CP    EOLCH        ;EOL?
  1116.     RET    Z
  1117.     CP    SEPCH
  1118.     RET    Z
  1119.     CP    ' '        ;SPACE?
  1120.     RET    Z
  1121.     CP    '-'        ;'THRU'?
  1122.     RET    Z
  1123.     CP    '>'
  1124.     RET    Z
  1125.     INC    HL        ;PT TO NEXT CHAR
  1126.     CP    '0'        ;RANGE?
  1127.     JP    C,SERR
  1128.     CP    '9'+1        ;RANGE?
  1129.     JP    C,HINNUM
  1130.     CP    'A'        ;RANGE?
  1131.     JP    C,SERR
  1132.     CP    'F'+1        ;RANGE?
  1133.     JP    NC,SERR
  1134.     SUB    7        ;ADJUST FROM A-F TO 10-15
  1135. ;
  1136. HINNUM:
  1137.     SUB    '0'        ;CONVERT FROM ASCII TO BINARY
  1138.     EX    DE,HL
  1139.     ADD    HL,HL        ;MULT PREVIOUS VALUE BY 16
  1140.     ADD    HL,HL
  1141.     ADD    HL,HL
  1142.     ADD    HL,HL
  1143.     ADD    a,L        ;ADD IN NEW DIGIT
  1144.     LD    L,A
  1145.     EX    DE,HL
  1146.     JP    HINLP
  1147. ;
  1148. HDIN:
  1149.     INC    HL        ;SKIP '#'
  1150. ;
  1151. ;Input Number in Command Line as Decimal
  1152. ;  Number is returned in DE
  1153. ;
  1154. DECIN:
  1155.     LD    DE,0
  1156.     LD    A,(HL)        ; GET 1ST CHAR
  1157.     CP    '#'        ; HEX?
  1158.     JP    NZ,DINLP
  1159.     INC    HL        ; PT TO DIGIT
  1160.     JP    HINLP        ; DO HEX PROCESSING
  1161. ;
  1162. DINLP:
  1163.     LD    A,(HL)        ;GET DIGIT
  1164.     CALL    CAPS        ;CAPITALIZE
  1165.     CP    '0'        ;RANGE?
  1166.     RET    C
  1167.     CP    '9'+1        ;RANGE?
  1168.     RET    NC
  1169.     SUB    '0'        ;CONVERT TO BINARY
  1170.     INC    HL        ;PT TO NEXT
  1171.     PUSH    HL
  1172.     LD    H,D
  1173.     LD    L,E
  1174.     ADD    HL,HL        ;X2
  1175.     ADD    HL,HL        ;X4
  1176.     ADD    HL,DE        ;X5
  1177.     ADD    HL,HL        ;X10
  1178.     ADD    a,L        ;ADD IN DIGIT
  1179.     LD    L,A
  1180.     LD    A,H
  1181.     ADC    0
  1182.     LD    H,A
  1183.     EX    DE,HL        ;RESULT IN DE
  1184.     POP    HL
  1185.     JP    DINLP
  1186. ;
  1187. ; READ LINE FROM USER INTO INPUT LINE BUFFER
  1188. ;
  1189. RDBUF:
  1190.     LD    HL,(BUFFER)    ;PT TO BUFFER
  1191.     XOR    A        ;DON'T CAPITALIZE
  1192.     JP    BLINE        ;INPUT LINE ROUTINE
  1193.  
  1194. ;
  1195. ;EDITOR BUFFERS
  1196. ;
  1197. BLOCK:
  1198.     DS    2        ;ADDRESS OF CURRENT BLOCK
  1199. BUFFER:
  1200.     DS    2        ;PTR TO FREE SPACE
  1201. EINDEX:
  1202.     DS    1        ;INDEX ENTRY
  1203. EDERR:
  1204.     DS    1        ;ERROR FLAG
  1205. EDRUN:
  1206.     DS    1        ;FLAG SAYING THAT EDITOR IS RUNNING
  1207.  
  1208. EDMARK:    DS    2        ;PLACE MARKER
  1209.  
  1210. FINDBUF:
  1211.     DB    20        ;SEARCH STRING
  1212.     DS    22
  1213.  
  1214. STKSAV:    DS    2        ;OLD STACK POINTER
  1215.     DS    48
  1216. MU3STK:    DS    2
  1217.  
  1218.     end
  1219.