home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpm / zcpr33 / z33debug.lbr / DEBUG.LZB / DEBUG.LIB
Text File  |  1987-10-26  |  27KB  |  1,567 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.0A - Rob Friefeld  9/87
  9. ;  - Intended for large RCP (takes over 2k)
  10. ;  - Included hex calculator routine from MU3
  11. ;  - Made minor changes to achieve compatibility with Z33RCP modules
  12. ;  - Expanded command synomyms:
  13. ;    "+" "=" "." advance one block
  14. ;    "-" ","     back one block
  15. ;  - Put in some relative jumps and djnz's.
  16. ;    "De-modularized" stndout/stndend and tinit/dinit to save a few bytes.
  17. ;++++
  18. ;    DEBUGRCP is a resident debug command package for ZCPR3.3
  19. ;
  20. EOLCH    EQU    0    ;END OF LINE CHAR
  21. SEPCH    EQU    ','    ;SEPARATOR CHAR
  22. EROW    EQU    6    ;FIRST ROW OF EDITOR DISPLAY
  23. ECOL    EQU    4    ;FIRST COL OF EDITOR DISPLAY
  24. ECOLC    EQU    ECOL+16*3+8    ;FIRST COL OF EDITOR CHAR DISPLAY
  25. ECURS    EQU    '>'    ;EDITOR CURSOR
  26. PRROW    EQU    22    ;PROMPT ROW
  27. PRCOL    EQU    10    ;PROMPT COLUMN
  28. PRCOLI    EQU    PRCOL+15    ;PROMPT INPUT COL
  29. ERROW    EQU    23    ;ERROR MESSAGE ROW
  30. ERCOL    EQU    15    ;ERROR MESSAGE COLUMN
  31.  
  32.  
  33. ;
  34. ; DEFINE FREE SPACE
  35. ;
  36. MU:
  37.     call    retsave        ; save cpr return address
  38.  
  39.     LD    HL,TBUFF    ;DETERMINE ADDRESS
  40.     LD    (HL),126    ;126 CHARS INPUT ALLOWED
  41.     LD    (BUFFER),HL    ;SET PTR
  42. ;
  43. ; SET UP ARROW KEYS
  44. ;
  45.     LD    HL,Z3ENV    ;PT TO ENVIRONMENT DESCRIPTOR
  46.     LD    DE,80H+10H    ;PT TO ARROW KEY INFO
  47.     ADD    HL,DE
  48.     LD    DE,EDCURT    ;PT TO CURSOR TABLE
  49.     LD    B,4    ;4 ARROW KEYS
  50. ARROW:
  51.     LD    A,(HL)    ;GET CHAR
  52.     LD    (DE),A    ;STORE CHAR
  53.     INC    HL    ;PT TO NEXT
  54.     INC    DE    ;PT TO NEXT ENTRY
  55.     INC    DE
  56.     INC    DE
  57.     djnz    ARROW
  58. ;
  59. ; Initialize Terminal
  60. ;
  61.  
  62.     call    tinit
  63. ;
  64. ; Check for Command Line Parameter
  65. ;
  66.     ld    hl,fcb+1    ;pt to first char
  67.     ld    a,(hl)        ;get char
  68.     cp    ' '        ;no param?
  69.     jr    nz,pcheck
  70.     ld    hl,tpa        ;pt to TPA
  71.     jr    mu3
  72. ;
  73. ; We have a parameter
  74. ;
  75. pcheck:
  76.     call    hexin        ;convert to binary
  77.     ex    de,hl        ;HL=value
  78.     jr    mu3
  79. ;
  80. ; Erase to EOL
  81. ;  If fct not supported, send out B spaces and B backspaces
  82. ;
  83. vereol:
  84.     call    ereol    ;try erase
  85.     ret    nz
  86.     push    bc    ;save B
  87.     ld    a,' '    ;send spaces
  88.     call    vereol1
  89.     pop    bc    ;get B
  90.     ld    a,bs    ;send backspaces
  91. vereol1:
  92.     call    conout    ;send char in A
  93.     djnz    vereol1
  94.     ret
  95. ;
  96. ; Clear Screen
  97. ;  If fct not supported, write 24 CRLFs
  98. ;
  99. vcls:
  100.      IF    CLSON
  101.     JP    CLS
  102.      ELSE
  103.     call    cls    ;try clear
  104.     ret    nz
  105.     push    bc    ;save B
  106.     ld    b,24    ;count
  107. vcls1:
  108.     call    crlf
  109.     djnz    vcls1
  110.     pop    bc
  111.     ret
  112.      ENDIF ; clson
  113. ;
  114. ; Run MU3
  115. ;    HL contains starting address
  116. ;
  117. mu3:
  118.     LD    (BLOCK),HL    ;SAVE PTR TO BLOCK
  119. ;
  120. ; REFRESH EDIT SCREEN
  121. ;
  122. EDIT0:
  123.     CALL    VCLS    ;NEW SCREEN
  124.     CALL    AT
  125.     DB    2,35    ;ROW 2, COL 35
  126.     CALL    VPRINT    ;BANNER
  127.     DB    'MU 1A RCP',' '+80h
  128. ;
  129. ; REENTER MU3 WITH PTRS RESET
  130. ;
  131. MU3R:
  132.     XOR    A    ;A=0
  133.     LD    (EINDEX),A    ;SET INDEX TO 0 (FIRST ELEMENT)
  134.     CALL    EDPLOT    ;PLOT BUFFER DATA
  135. ;
  136. ; INPUT EDITOR COMMAND
  137. ;
  138. EDITCMD:
  139.     CALL    PRMSG        ;POSITION AT PROMPT MESSAGE
  140.     DB    'MU Command?',0
  141.     CALL    PRINP        ;POSITION AT PROMPT INPUT
  142.     DB    0
  143.     CALL    CIN        ;GET CHAR
  144.     CALL    CAPS        ;CAPITALIZE
  145.     LD    B,A        ;COMMAND IN B
  146.     LD    HL,EDCURT    ;PROCESS CURSOR COMMANDS FIRST
  147.     CALL    CMD        ;PROCESS COMMAND
  148.     LD    HL,ECMDTBL    ;EDITOR COMMAND TABLE
  149.     CALL    CMD        ;PROCESS COMMAND
  150.     CALL    VPRINT        ;ERROR MESSAGE
  151.     DB    BEL+80h
  152.     JP    EDITCMD
  153. ;
  154. ; Position at Prompt Message and Print it
  155. ;
  156. PRMSG:
  157.     CALL    AT        ;POSITION
  158.     DB    PRROW,PRCOL
  159.     JP    VPRINT        ;PRINT IT
  160. ;
  161. ; Position at Prompt Input and Print Prompt
  162. ;
  163. PRINP:
  164.     CALL    AT        ;POSITION
  165.     DB    PRROW,PRCOLI
  166.     JP    VPRINT        ;PRINT IT
  167. ;
  168. ;INPUT ERROR
  169. ;
  170. WHAT:
  171.     CALL    VPRINT
  172.     DB    BEL+80h
  173.     JP    EDITCMD
  174. ;
  175. ;Command Table Search and Execute
  176. ;
  177. CMD:
  178.     LD    A,(HL)        ;CHECK FOR END OF TABLE
  179.     OR    A
  180.     RET    Z        ;COMMAND NOT FOUND
  181.     CP    B        ;MATCH?
  182.     jr    Z,CMDRUN
  183.     INC    HL        ;SKIP TO NEXT ENTRY IN TABLE
  184.     INC    HL
  185.     INC    HL
  186.     jr    CMD
  187. ;
  188. ;RUN COMMAND
  189. ;
  190. CMDRUN:
  191.     INC    HL        ;PT TO LOW ADDRESS
  192.     LD    E,(HL)
  193.     INC    HL        ;PT TO HIGH ADDRESS
  194.     LD    D,(HL)
  195.     EX    DE,HL
  196.     POP    AF        ;CLEAR STACK
  197.     JP    (HL)        ;RUN ROUTINE
  198. ;
  199. ;PLOT BUFFER DATA
  200. ;
  201. EDPLOT:
  202.     LD    H,EROW-1    ;SET ROW
  203.     LD    L,ECOL        ;SET COLUMN
  204.     CALL    GOTOXY        ;POSITION CURSOR
  205.     CALL    VPRINT
  206.     DB    DIM
  207.     DB    '       0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F'
  208.     DB    BRIGHT,0
  209.     INC    H        ;NEXT ROW
  210.     CALL    GOTOXY        ;POSITION CURSOR
  211.     EX    DE,HL        ;POSITION IN DE
  212.     LD    HL,(BLOCK)    ;PT TO DATA
  213.     LD    B,8        ;8 LINES
  214. ;
  215. ;Print Next Line on Screen
  216. ;
  217. EDIT00:
  218.     CALL    STNDOUT        ;GO DIM
  219.     LD    A,H        ;OUTPUT ADDRESS
  220.     CALL    PA2HC
  221.     LD    A,L
  222.     CALL    PA2HC
  223.     CALL    VPRINT
  224.     DB    ':',BRIGHT,' '+80h
  225.     LD    C,16        ;16 ELEMENTS
  226. EDIT01:
  227.     LD    A,(HL)        ;GET BYTE
  228.     CALL    PA2HC        ;PRINT AS HEX
  229.     CALL    dSPACE        ;PRINT 1 SPACE
  230.     INC    HL        ;PT TO NEXT
  231.     DEC    C        ;COUNT DOWN
  232.     jr    NZ,EDIT01
  233.     EX    DE,HL        ;POSITION AGAIN
  234.     INC    H        ;NEXT ROW
  235.     CALL    GOTOXY
  236.     EX    DE,HL
  237.     djnz    EDIT00
  238.     LD    H,EROW        ;RESET ROW
  239.     LD    L,ECOLC        ;RESET COL
  240.     CALL    GOTOXY        ;POSITION CURSOR
  241.     EX    DE,HL        ;POSITION IN DE
  242.     LD    HL,(BLOCK)    ;PT TO DATA
  243.     LD    B,8        ;8 LINES
  244. EDIT02:
  245.     CALL    BAR        ;PRINT BAR
  246.     LD    C,16        ;16 ELEMENTS
  247. EDIT03:
  248.     LD    A,(HL)        ;GET BYTE
  249.     AND    7FH        ;MASK MSB
  250.     CP    7FH        ;DON'T PRINT 7FH
  251.     jr    Z,EDIT7F
  252.     CP    ' '        ;SPACE OR MORE?
  253.     jr    NC,EDIT04
  254. EDIT7F:
  255.     LD    A,'.'        ;PRINT DOT
  256. EDIT04:
  257.     CALL    conout        ;PRINT BYTE
  258.     INC    HL        ;PT TO NEXT
  259.     DEC    C        ;COUNT DOWN
  260.     jr    NZ,EDIT03
  261.     CALL    BAR        ;PRINT ENDING BAR
  262.     EX    DE,HL        ;POSITION AGAIN
  263.     INC    H        ;NEXT ROW
  264.     CALL    GOTOXY
  265.     EX    DE,HL
  266.     DEC    B        ;COUNT DOWN
  267.     jr    NZ,EDIT02
  268.     CALL    EDCUR        ;POSITION CURSOR
  269.     RET
  270. ;
  271. ;EDITOR COMMAND TABLE
  272. ;
  273. ECMDTBL:
  274.     DB    CR    ;NOP
  275.     DW    EDITCMD
  276.     DB    'C'-'@'    ;^C = EXIT MU3
  277.     DW    EDCC
  278.     DB    'R'-'@'    ;^R = REFRESH
  279.     DW    EDIT0
  280.     DB    'E'-'@'    ;^E=UP
  281.     DW    EDUP
  282.     DB    'X'-'@'    ;^X=DOWN
  283.     DW    EDDOWN
  284.     DB    'D'-'@'    ;^D=RIGHT
  285.     DW    EDRIGHT
  286.     DB    'S'-'@'    ;^S=LEFT
  287.     DW    EDLEFT
  288.     DB    ' '    ;NOP
  289.     DW    EDITCMD
  290.     DB    '+'    ;ADVANCE
  291.     DW    EDITPLUS
  292.     db    '='
  293.     dw    editplus
  294.     db    '.'
  295.     dw    editplus
  296.     DB    '-'    ;BACKUP
  297.     DW    EDITMINUS
  298.     db    ','
  299.     dw    editminus
  300.     DB    'A'    ;ADDRESS
  301.     DW    EDITADR
  302.     DB    'C'    ;COMMAND LINE
  303.     DW    EDITCL
  304.     db    'H'    ;HEX CALC
  305.     dw    editcalc
  306.     DB    'N'    ;CHANGE NUMBERS
  307.     DW    EDITHEX
  308.     DB    'T'    ;CHANGE TEXT
  309.     DW    EDITALP
  310.     DB    0    ;END OF TABLE
  311. ;
  312. ;  ARROW KEY DEFINITONS FROM TCAP
  313. ;
  314. EDCURT:
  315.     DB    0    ;0 INDICATES NO ARROW KEYS
  316.     DW    EDUP
  317.     DB    0
  318.     DW    EDDOWN
  319.     DB    0
  320.     DW    EDRIGHT
  321.     DB    0
  322.     DW    EDLEFT
  323.     DB    0    ;END OF TABLE
  324. ;
  325. ;Enter Command Line
  326. ;
  327. EDITCL:
  328.     CALL    VPRINT        ;PROMPT INPUT
  329.     DB    CR,LF,'Command Line?',' '+80h
  330.     CALL    RDBUF        ;INPUT TEXT
  331.     CALL    PUTCL        ;STORE COMMAND LINE
  332.     call    CRLF        ;NEW LINE
  333.     jp    exit
  334. ;
  335. ; STORE COMMAND LINE
  336. ;
  337. PUTCL:
  338.     EX    DE,HL        ;PTR TO NEW LINE IN DE
  339.     CALL    GETCL1        ;GET COMMAND LINE DATA
  340.     LD    B,A        ;CHAR COUNT IN B
  341.     EX    DE,HL        ;HL PTS TO NEW LINE
  342.     PUSH    HL        ;SAVE PTR TO NEXT LINE
  343. PCL1:
  344.     LD    A,(HL)        ;GO TO END OF LINE
  345.     OR    A        ;AT END?
  346.     jr    Z,PCL2
  347.     INC    HL        ;PT TO NEXT
  348.     djnz    PCL1
  349.     POP    HL        ;CLEAR STACK
  350.     RET            ;COMMAND LINE TOO LONG - ABORT
  351. ;
  352. ; AT END OF NEW COMMAND LINE
  353. ;    PTR TO FIRST CHAR OF NEW COMMAND LINE ON STACK
  354. ;    HL PTS TO ENDING 0 OF NEW COMMAND LINE
  355. ;    B = NUMBER OF CHARS REMAINING BEFORE COMMAND LINE OVERFLOW
  356. ;
  357. PCL2:
  358.     EX    DE,HL        ;DE PTS TO LAST BYTE
  359.     PUSH    DE        ;SAVE PTR IN CASE OF ERROR
  360.     CALL    GETCL2        ;PT TO TAIL OF COMMAND LINE BUFFER
  361.     LD    A,(HL)        ;GET FIRST CHAR OF TAIL
  362.     CP    ';'        ;CONTINUATION?
  363.     jr    Z,PCL3
  364.     OR    A        ;DONE?
  365.     jr    Z,PCL3
  366.     LD    A,';'        ;SET CONTINUATION CHAR
  367.     LD    (DE),A
  368.     INC    DE
  369.     DEC    B        ;COUNT DOWN
  370.     jr    Z,PCL4        ;OVERFLOW
  371. ;
  372. ; COPY TAIL ONTO END OF NEW COMMAND LINE
  373. ;
  374. PCL3:
  375.     LD    A,(HL)    ;GET NEXT CHAR
  376.     LD    (DE),A    ;STORE IT
  377.     INC    HL    ;PT TO NEXT
  378.     INC    DE
  379.     OR    A    ;DONE?
  380.     jr    Z,PCL5
  381.     DEC    B    ;COUNT DOWN
  382.     jr    NZ,PCL3
  383. ;
  384. ; COMMAND LINE TOO LONG
  385. ;
  386. PCL4:
  387.     POP    HL    ;GET PTR TO END OF OLD LINE
  388.     LD    (HL),0    ;STORE ENDING 0
  389.     POP    AF    ;CLEAR STACK
  390.     RET
  391. ;
  392. ; NEW COMMAND LINE OK
  393. ;
  394. PCL5:
  395.     POP    AF    ;CLEAR STACK
  396.     CALL    GETCL1    ;GET PTR TO BUFFER
  397.     LD    DE,4    ;PT TO FIRST CHAR IN BUFFER
  398.     EX    DE,HL
  399.     ADD    HL,DE
  400.     EX    DE,HL
  401.     LD    (HL),E    ;STORE ADDRESS
  402.     INC    HL
  403.     LD    (HL),D
  404.     POP    HL    ;HL PTS TO FIRST CHAR OF NEW LINE
  405. ;
  406. ; COPY COMMAND LINE INTO BUFFER
  407. ;
  408. PCL6:
  409.     LD    A,(HL)    ;COPY
  410.     LD    (DE),A
  411.     INC    HL
  412.     INC    DE
  413.     OR    A    ;DONE?
  414.     jr    NZ,PCL6
  415.     RET
  416. ;
  417. ; GETCL1
  418. ;
  419. GETCL1:
  420.     LD    HL,(Z3ENV+18H)    ;GET ADDRESS OF COMMAND LINE BUFFER
  421.     PUSH    HL        ;SAVE IT
  422.     INC    HL        ;GET SIZE IN A
  423.     INC    HL
  424.     LD    A,(HL)
  425.     POP    HL
  426.     RET
  427. ;
  428. ; GETCL2
  429. ;
  430. GETCL2:
  431.     LD    HL,(Z3ENV+18H)    ;GET ADDRESS OF COMMAND LINE BUFFER
  432.     LD    A,(HL)        ;GET ADDRESS OF NEXT CHAR
  433.     INC    HL
  434.     LD    H,(HL)
  435.     LD    L,A        ;HL PTS TO NEXT CHAR
  436.     LD    A,(HL)        ;GET IT
  437.     RET
  438.  
  439. ;
  440. ;Enter ASCII Chars
  441. ;
  442. EDITALP:
  443.     call    edercl
  444.     CALL    PRINP        ;PROMPT INPUT
  445.     DB    DIM,'Enter Text',BRIGHT
  446.     DB    CR,LF,' -->',' '+80h
  447.     CALL    RDBUF        ;INPUT TEXT WITHOUT PROMPT
  448.     CALL    EDPRCL        ;CLEAR PROMPT LINE
  449.     LD    A,(EINDEX)    ;PT TO POSITION
  450.     EX    DE,HL
  451.     LD    HL,(BLOCK)    ;COMPUTE OFFSET
  452.     EX    DE,HL
  453.     ADD    A,E
  454.     LD    E,A
  455.     LD    A,D
  456.     ADC    0
  457.     LD    D,A        ;DE PTS TO BYTE, HL PTS TO TEXT
  458. EDITA1:
  459.     LD    A,(HL)        ;GET CHAR
  460.     CP    EOLCH        ;EOL?
  461.     jr    Z,EDITA2    ;REFRESH SCREEN
  462.     CALL    GETAHV        ;GET ASCII OR <HEX> VALUE
  463.     LD    (DE),A        ;UPDATE BYTE
  464.     INC    HL        ;PT TO NEXT INPUT CHAR
  465.     INC    E        ;PT TO NEXT BUFFER BYTE
  466.     jr    NZ,EDITA1
  467. EDITA2:
  468.     CALL    EDPLOT        ;REPLOT
  469.     JP    EDITCMD        ;DONE-REFRESH SCREEN
  470.  
  471. ;
  472. ;Calculate Sum and Differences
  473. ;
  474. EDITCALC:
  475.     CALL    EDERCL    ;CLEAR ERROR LINE
  476.     CALL    PRINP    ;PROMPT INPUT
  477.     DB    DIM,'Enter Two Hex Numbers - ',BRIGHT,0
  478.     CALL    RDBUF    ;INPUT TEXT
  479.     CALL    EDPRCL    ;CLEAR PROMPT LINE
  480.     CALL    SKSP    ;SKIP TO NON-SPACE
  481.     LD    A,(HL)    ;ANY INPUT?
  482.     OR    A    ;0=NO
  483.     JP    Z,EDITCMD
  484.     CALL    HEXIN    ;EVALUATE FIRST NUMBER
  485.     CALL    SKSP    ;SKIP TO 2ND NUMBER
  486.     PUSH    DE    ;SAVE FIRST NUMBER
  487.     CALL    HEXIN    ;EVALUATE 2ND NUMBER
  488.     POP    HL    ;GET FIRST NUMBER
  489.     CALL    ERMSG    ;PRINT ERROR MESSAGE
  490.     DB    0
  491.     CALL    PHL4HC    ;PRINT FIRST NUMBER
  492.     CALL    VPRINT
  493.     DB    DIM,' and',BRIGHT,' '+80h
  494.     EX    DE,HL
  495.     CALL    PHL4HC    ;PRINT 2ND NUMBER
  496.     EX    DE,HL
  497.     CALL    VPRINT
  498.     DB    '    ',DIM,'Sum =',BRIGHT,' '+80h
  499.     PUSH    HL
  500.     ADD    HL,DE
  501.     CALL    NUMOUT
  502.     POP    HL
  503.     CALL    VPRINT
  504.     DB    '  ',DIM,'Diff =',BRIGHT,' '+80h
  505.     LD    A,L    ;HL=HL-DE
  506.     SUB    E
  507.     LD    L,A
  508.     LD    A,H
  509.     SBC    A,D
  510.     LD    H,A
  511.     CALL    NUMOUT
  512.     JP    EDITCMD
  513. ;
  514. ;Output number in HL in Hex and Decimal
  515. ;
  516. NUMOUT:
  517.     CALL    PHL4HC    ;HEX
  518.     CALL    VPRINT
  519.     DB    ' ','('+80h
  520.     CALL    PHLFDC    ;DECIMAL FLOATING
  521.     LD    A,')'    ;CLOSE PAREN
  522.     JP    conout
  523.  
  524. ;
  525. ; Position at Error Message and Print It
  526. ;
  527. ERMSG:
  528.     CALL    AT    ;POSITION
  529.     DB    ERROW,ERCOL
  530.     JP    VPRINT    ;PRINT IT
  531.  
  532. edercl:
  533.     call    at
  534.     db    errow,ercol
  535.     jp    vereol
  536. ;
  537. ;Enter Numbers
  538. ;
  539. EDITHEX:
  540.     call    edercl
  541.     CALL    PRINP    ;PROMPT INPUT
  542.     DB    DIM,'Enter Hex Numbers',BRIGHT
  543.     DB    CR,LF,' -->',' '+80h
  544.     CALL    RDBUF    ;INPUT TEXT WITHOUT PROMPT
  545.     CALL    EDPRCL    ;CLEAR PROMPT LINE
  546.     LD    A,(EINDEX)    ;PT TO POSITION
  547.     EX    DE,HL
  548.     LD    HL,(BLOCK)    ;COMPUTE OFFSET
  549.     EX    DE,HL
  550.     ADD    A,E
  551.     LD    E,A
  552.     LD    A,D
  553.     ADC    0
  554.     LD    D,A    ;DE PTS TO BYTE, HL PTS TO TEXT
  555. EDITH1:
  556.     LD    A,(HL)    ;GET HEX DIGIT
  557.     CP    EOLCH    ;EOL?
  558.     JP    Z,EDITA2    ;REFRESH SCREEN
  559.     CP    ' '    ;SKIP SPACES
  560.     jr    NZ,EDITH2
  561.     INC    HL    ;SKIP SPACE
  562.     jr    EDITH1
  563. EDITH2:
  564.     PUSH    DE    ;SAVE PTR
  565.     CALL    HEXIN    ;GET VALUE AND POSITION HL
  566.     LD    A,E    ;... IN A
  567.     POP    DE    ;GET PTR
  568.     LD    (DE),A    ;PUT BYTE
  569.     INC    E    ;ADVANCE TO NEXT BYTE
  570.     jr    NZ,EDITH1
  571.     JP    EDITA2    ;DONE-REFRESH
  572. ;
  573. ;CLEAR PROMPT LINE
  574. ;
  575. EDPRCL:
  576.     CALL    PRINP    ;PROMPT LINE
  577.     DB    0
  578.     LD    B,40    ;40 POSITIONS
  579.     CALL    VEREOL    ;CLEAR TO EOL OR 40 CHARS
  580.     CALL    AT    ;USER INPUT
  581.     DB    ERROW,1
  582.     LD    B,79    ;79 POSITIONS
  583.     JP    VEREOL
  584. ;
  585. ;Input Address
  586. ;
  587. EDITADR:
  588.     CALL    VPRINT
  589.     DB    'Address?',' '+80h
  590.     CALL    RDBUF    ;GET USER INPUT
  591.     CALL    SKSP    ;SKIP LEADING SPACES
  592.     LD    A,(HL)    ;EMPTY LINE?
  593.     OR    A
  594.     JP    Z,EDIT0
  595.     CALL    HEXIN    ;CONVERT FROM HEX
  596.     EX    DE,HL        ;HL = ADDRESS
  597.     LD    (BLOCK),HL
  598.     JP    EDIT0    ;REENTER
  599. ;
  600. ;Advance to Next Block
  601. ;
  602. EDITPLUS:
  603.     LD    HL,(BLOCK)    ;ADVANCE TO NEXT BLOCK
  604.     LD    DE,128    ;128 BYTES
  605.     ADD    HL,DE
  606.     LD    (BLOCK),HL
  607.     JP    MU3R
  608. ;
  609. ;Backup to Last Block
  610. ;
  611. EDITMINUS:
  612.     LD    HL,(BLOCK)    ;BACKUP TO LAST BLOCK
  613.     LD    DE,-128    ;128 BYTES
  614.     ADD    HL,DE
  615.     LD    (BLOCK),HL
  616.     JP    MU3R
  617. ;
  618. ;Exit MU3
  619. ;
  620. EDCC:
  621.     CALL    DINIT    ;DEINIT TERM
  622.     call    CRLF    ;NEW LINE
  623.     jp    exit
  624. ;
  625. ;EDIT MOVE: UP
  626. ;
  627. EDUP:
  628.     CALL    EDCCUR    ;CLEAR CURSOR
  629.     LD    A,(EINDEX)    ;BACKUP INDEX BY 16
  630.     SUB    16
  631. ;
  632. ;Common EDIT MOVE Routine - on input, A=new index
  633. ;
  634. EDMOVE:
  635.     AND    7FH    ;MOD 128
  636.     LD    (EINDEX),A
  637.     CALL    EDCUR    ;SET CURSOR
  638.     JP    EDITCMD
  639. ;
  640. ;EDIT MOVE: DOWN
  641. ;
  642. EDDOWN:
  643.     CALL    EDCCUR    ;CLEAR CURSOR
  644.     LD    A,(EINDEX)    ;INCREMENT INDEX BY 16
  645.     ADD    16
  646.     jr    EDMOVE    ;COMMON ROUTINE
  647. ;
  648. ;EDIT MOVE: RIGHT
  649. ;
  650. EDRIGHT:
  651.     CALL    EDCCUR    ;CLEAR CURSOR
  652.     LD    A,(EINDEX)    ;INCREMENT INDEX BY 1
  653.     INC    A
  654.     jr    EDMOVE    ;COMMON ROUTINE
  655. ;
  656. ;EDIT MOVE: LEFT
  657. ;
  658. EDLEFT:
  659.     CALL    EDCCUR    ;CLEAR CURSOR
  660.     LD    A,(EINDEX)    ;DECREMENT INDEX BY 1
  661.     DEC    A
  662.     jr    EDMOVE    ;COMMON ROUTINE
  663. ;
  664. ;EDIT SUBROUTINE: EDCUR
  665. ; Position Editor Cursor at EINDEX
  666. ;EDIT SUBROUTINE: EDCCUR
  667. ; Clear Editor Cursor at EINDEX
  668. ;
  669. EDCUR:
  670.     PUSH    HL    ;SAVE HL
  671.     LD    C,ECURS    ;CURSOR CHAR
  672.     CALL    EDSETCUR
  673.     CALL    AT    ;UPDATE DATA
  674.     DB    3,74
  675.     LD    A,(EINDEX)    ;PT TO BYTE AT CURSOR
  676.     LD    HL,(BLOCK)
  677.     ADD    A,L
  678.     LD    L,A
  679.     LD    A,H
  680.     ADC    0
  681.     LD    H,A    ;HL PTS TO BYTE AT CURSOR
  682.     LD    A,(HL)    ;GET BYTE
  683.     CALL    PA2HC    ;PRINT AS HEX
  684.     CALL    dSPACE
  685.     LD    A,(HL)    ;GET BYTE
  686.     POP    HL    ;RESTORE HL
  687.     AND    7FH    ;MASK
  688.     CP    7FH    ;7FH AS DOT
  689.     jr    Z,EDC7F
  690.     CP    ' '    ;OUTPUT CHAR OR DOT
  691.     JP    NC,conout
  692. EDC7F:
  693.     LD    A,'.'    ;DOT
  694.     JP    conout
  695. EDCCUR:
  696.     LD    C,' '    ;CLEAR CURSOR
  697. EDSETCUR:
  698.     CALL    EDROW    ;COMPUTE ROW
  699.     AND    0FH    ;COMPUTE COL MOD 16
  700.     LD    B,A    ;RESULT IN B
  701.     ADD    A,A    ;*2
  702.     ADD    A,B    ;*3
  703.     ADD    ECOL+6    ;ADD IN COL
  704.     DEC    A    ;SUBTRACT 1
  705.     LD    L,A    ;COL POSITION SET
  706.     CALL    GOTOXY    ;POSITION CURSOR
  707.     LD    A,C    ;OUTPUT CHAR
  708.     JP    conout
  709. ;
  710. ;Compute Row from EINDEX
  711. ;
  712. EDROW:
  713.     LD    A,(EINDEX)    ;GET INDEX
  714.     LD    B,A    ;SAVE IN B
  715.     RRCA        ;DIVIDE BY 16
  716.     RRCA
  717.     RRCA
  718.     RRCA
  719.     AND    0FH    ;MASK FOR LSB ONLY
  720.     ADD    EROW    ;COMPUTE ROW
  721.     LD    H,A    ;ROW SET
  722.     LD    A,B    ;GET INDEX
  723.     RET
  724.  
  725. ;
  726. ;PRINT A SPACE
  727. ;
  728. dSPACE:
  729.     LD    A,' '
  730.     JP    conout
  731. ;
  732. ;PRINT AN BARISK IN REV VIDEO
  733. ;
  734. BAR:
  735.     CALL    VPRINT
  736.     DB    DIM,'|',BRIGHT,0
  737.     RET
  738. ;
  739. ;Get value from input buffer
  740. ;
  741. GETAHV:
  742.     LD    A,(HL)    ;GET NEXT CHAR
  743.     CP    '<'    ;HEX ESCAPE?
  744.     RET    NZ        ;NO, RETURN
  745. ;"<<" means one "<"
  746.     INC    HL
  747.     LD    A,(HL)
  748.     CP    '<'
  749.     RET    Z
  750. ;Got hex
  751.     PUSH    DE
  752.     CALL    HEXIN    ;GET VALUE
  753.     CP    '>'    ;PROPER DELIM?
  754.     LD    A,E    ;GET VALUE
  755.     POP    DE
  756.     RET    Z
  757. ;
  758. ;ERROR CONDITION IN SUBROUTINE - CLEAR STACK AND FLAG ERROR
  759. ;
  760. SERR:
  761.     POP    AF    ;CLEAR STACK
  762.     JP    WHAT    ;ERROR
  763. ;
  764. ;Input Number from Command Line -- Assume it to be Hex
  765. ;  Number returned in DE
  766. ;
  767. HEXIN:
  768.     LD    DE,0    ;INIT VALUE
  769.     LD    A,(HL)
  770.     CP    '#'    ;DECIMAL?
  771.     jr    Z,HDIN    ;MAKE DECIMAL
  772. ;
  773. HINLP:
  774.     LD    A,(HL)    ;GET CHAR
  775.     CALL    CAPS    ;CAPITALIZE
  776.     CP    CR    ;EOL?
  777.     RET    Z
  778.     CP    EOLCH    ;EOL?
  779.     RET    Z
  780.     CP    SEPCH
  781.     RET    Z
  782.     CP    ' '    ;SPACE?
  783.     RET    Z
  784.     CP    '-'    ;'THRU'?
  785.     RET    Z
  786.     CP    '>'
  787.     RET    Z
  788.     INC    HL    ;PT TO NEXT CHAR
  789.     CP    '0'    ;RANGE?
  790.     jr    C,SERR
  791.     CP    '9'+1    ;RANGE?
  792.     jr    C,HINNUM
  793.     CP    'A'    ;RANGE?
  794.     jr    C,SERR    
  795.     CP    'F'+1    ;RANGE?
  796.     jr    NC,SERR
  797.     SUB    7    ;ADJUST FROM A-F TO 10-15
  798. ;
  799. HINNUM:
  800.     SUB    '0'    ;CONVERT FROM ASCII TO BINARY
  801.     EX    DE,HL
  802.     ADD    HL,HL    ;MULT PREVIOUS VALUE BY 16
  803.     ADD    HL,HL
  804.     ADD    HL,HL
  805.     ADD    HL,HL
  806.     ADD    A,L    ;ADD IN NEW DIGIT
  807.     LD    L,A
  808.     EX    DE,HL
  809.     jr    HINLP
  810. ;
  811. HDIN:
  812.     INC    HL    ;SKIP '#'
  813. ;
  814. ;Input Number in Command Line as Decimal
  815. ;  Number is returned in DE
  816. ;
  817. DECIN:
  818.     LD    DE,0
  819.     LD    A,(HL)    ; GET 1ST CHAR
  820.     CP    '#'    ; HEX?
  821.     jr    NZ,DINLP
  822.     INC    HL    ; PT TO DIGIT
  823.     jr    HINLP    ; DO HEX PROCESSING
  824. ;
  825. DINLP:
  826.     LD    A,(HL)    ;GET DIGIT
  827.     CALL    CAPS    ;CAPITALIZE
  828.     CP    '0'    ;RANGE?
  829.     RET    C
  830.     CP    '9'+1    ;RANGE?
  831.     RET    NC
  832.     SUB    '0'    ;CONVERT TO BINARY
  833.     INC    HL    ;PT TO NEXT
  834.     PUSH    HL
  835.     LD    H,D
  836.     LD    L,E
  837.     ADD    HL,HL    ;X2
  838.     ADD    HL,HL    ;X4
  839.     ADD    HL,DE    ;X5
  840.     ADD    HL,HL    ;X10
  841.     ADD    A,L    ;ADD IN DIGIT
  842.     LD    L,A
  843.     LD    A,H
  844.     ADC    0
  845.     LD    H,A
  846.     EX    DE,HL        ;RESULT IN DE
  847.     POP    HL
  848.     jr    DINLP
  849. ;
  850. ; READ LINE FROM USER INTO INPUT LINE BUFFER
  851. ;
  852. RDBUF:
  853.     LD    HL,(BUFFER)    ;PT TO BUFFER
  854.     EX    DE,HL        ;SET DE AS PTR TO BUFFER
  855.     LD    C,10    ;BDOS READLN
  856.     PUSH    DE    ;SAVE PTR
  857.     CALL    BDOS
  858.     POP    HL    ;PT TO CHAR COUNT
  859.     INC    HL
  860.     LD    E,(HL)    ;GET CHAR COUNT
  861.     LD    D,0
  862.     INC    HL    ;PT TO FIRST CHAR
  863.     PUSH    HL    ;SAVE PTR
  864.     ADD    HL,DE    ;PT TO AFTER LAST CHAR
  865.     LD    (HL),0    ;STORE ENDING 0
  866.     POP    HL    ;PT TO FIRST CHAR
  867.     RET
  868.  
  869. ;
  870. ; Routines from libs
  871. ;
  872.  
  873. cin:
  874.     push    hl
  875.     push    de
  876.     push    bc
  877.     ld    c,1
  878.     call    bdos
  879.     and    7fh
  880.     push    af
  881.     ld    a,bs    ;overwrite
  882.     call    conout
  883.     pop    af
  884.     pop    bc
  885.     pop    de
  886.     pop    hl
  887.     ret
  888.  
  889. ;
  890. ; Capitalize char in A
  891. ;
  892. caps:
  893.     and    7fh
  894.     cp    'a'    ;range?
  895.     ret    c
  896.     cp    'z'+1
  897.     ret    nc
  898.     and    5fh    ;mask to caps
  899.     ret
  900.  
  901. ;
  902. ; VLIB ROUTINES
  903. ;
  904.  
  905.  
  906. ;
  907. ; Common vlib routine to find terminal info in ENV
  908. ;
  909. vterm:
  910.     ld    hl,z3env+80h    ;pt to environment
  911.     ld    a,(hl)        ;no terminal?
  912.     cp    ' '+1
  913.     ret
  914.  
  915.  
  916. ;
  917. ; CLEAR SCREEN ON TERMINAL
  918. ;
  919.      IF    [NOT CLSON]
  920. cls:
  921.     push    hl    ;save regs
  922.     push    de
  923.     call    vterm
  924.     jr    c,clserr
  925.     ld    de,14h    ;pt to cls delay
  926.     add    hl,de
  927.     ld    d,(hl)    ;get it
  928.     inc    hl    ;pt to cls string
  929.     inc    hl
  930.     inc    hl
  931.     ld    a,(hl)    ;get first char of string
  932.     or    a    ;if no string, error
  933.     jr    z,clserr
  934.     call    vidout    ;output string with delay
  935.     pop    de    ;done
  936.     pop    hl
  937.     xor    a    ;return NZ
  938.     dec    a
  939.     ret
  940. clserr:
  941.     pop    de    ;done
  942.     pop    hl
  943.     xor    a    ;return Z
  944.     ret
  945.  
  946.      ENDIF    ; not clson
  947.  
  948. ;
  949. ; Erase to End of Line
  950. ;    Return with A=0 and Zero Flag Set if not done
  951. ;
  952. ereol:
  953.     push    bc    ;save regs
  954.     push    de
  955.     push    hl
  956.     call    vterm
  957.     jr    c,err
  958.     ld    de,16h    ;pt to ereol delay
  959.     add    hl,de
  960.     ld    d,(hl)    ;get it
  961.     inc    hl    ;pt to cls string
  962.     call    vidskp    ;skip over it
  963.     call    vidskp    ;skip over CM string
  964.     ld    a,(hl)    ;get first char of ereol string
  965.     or    a    ;if no string, error
  966.     jr    z,err
  967.     call    vidout    ;output string with delay
  968.     jr    noerr
  969.  
  970. ;
  971. ; GOTO XY
  972. ;    HL = Row/Col, with Home=1/1
  973. ;    Return with A=0 and Zero Flag Set if not done
  974. ;
  975. gotoxy:
  976.     push    bc    ;save regs
  977.     push    de
  978.     push    hl
  979.     call    vterm
  980.     jr    c,err
  981.     ld    de,15h    ;pt to CM delay
  982.     add    hl,de
  983.     ld    a,(hl)    ;get it
  984.     ld    (cmdelay),a    ;save it
  985.     inc    hl    ;pt to CL string
  986.     inc    hl
  987.     call    vidskp    ;skip CL string
  988.     ld    a,(hl)    ;get first char of CM string
  989.     or    a    ;if no string, error
  990.     jr    z,err
  991.     ex    de,hl        ;DE=address of CM string
  992.     pop    hl    ;get coordinates in HL
  993.     push    hl
  994.     call    gxy    ;output xy string with delay
  995.     ld    a,(cmdelay)    ;pause
  996.     call    videlay
  997. noerr:
  998.     pop    hl    ;done
  999.     pop    de
  1000.     pop    bc
  1001.     xor    a    ;return NZ
  1002.     dec    a
  1003.     ret
  1004. err:
  1005.     pop    hl    ;done
  1006.     pop    de
  1007.     pop    bc
  1008.     xor    a    ;return Z
  1009.     ret
  1010.  
  1011. ;
  1012. ; Position Cursor at Location Specified by Return Address
  1013. ; Usage:
  1014. ;    call    at
  1015. ;    db    row,col    ;location
  1016. ;
  1017. at:
  1018.     ex    (sp),hl        ;pt to address
  1019.     push    de    ;save DE
  1020.     ld    d,(hl)    ;get row
  1021.     inc    hl
  1022.     ld    e,(hl)
  1023.     inc    hl    ;HL pts to return byte
  1024.     ex    de,hl        ;DE pts to return byte, HL contains screen loc
  1025.     call    gotoxy    ;position cursor
  1026.     ex    de,hl        ;HL pts to return byte
  1027.     pop    de    ;restore registers
  1028.     ex    (sp),hl        ;restore stack ptr
  1029.     ret
  1030.  
  1031. ;
  1032. ; GOTOXY
  1033. ;   On input, H=Row and L=Column to Position To (1,1 is Home)
  1034. ;   On input, DE=address of CM string
  1035. ;
  1036. gxy:
  1037.     dec    h    ;adjust to 0,0 for home
  1038.     dec    l
  1039.     xor    a    ;set row/column
  1040.     ld    (rcorder),a    ;row before column
  1041.     ld    (rcbase),a    ;add 0 to base
  1042. ;
  1043. ; Cycle thru string
  1044. ;
  1045. gxyloop:
  1046.     ld    a,(de)    ;get next char
  1047.     inc    de    ;pt to next
  1048.     or    a    ;done?
  1049.     ret    z
  1050.     cp    '%'    ;command?
  1051.     jr    z,gxycmd
  1052.     cp    '\'    ;escape?
  1053.     jr    z,gxyesc
  1054.     call    conout    ;send char
  1055.     jr    gxyloop
  1056.  
  1057. ;
  1058. ; Escape - output following byte literally
  1059. ;
  1060. gxyesc:
  1061.     ld    a,(de)    ;get next char
  1062.     call    conout    ;output literally
  1063.     inc    de    ;pt to next
  1064.     jr    gxyloop
  1065. ;
  1066. ; Interpret next character as a command character
  1067. ;
  1068. gxycmd:
  1069.     ld    a,(de)    ;get command char
  1070.     inc    de    ;pt to next
  1071.     cp    'd'    ;%d
  1072.     jr    z,gxyout1
  1073.     cp    '2'    ;%2
  1074.     jr    z,gxyout2
  1075.     cp    '3'    ;%3
  1076.     jr    z,gxyout3
  1077.     cp    '.'    ;%.
  1078.     jr    z,gxyout4
  1079.     cp    '+'    ;%+v
  1080.     jr    z,gxyout5
  1081.     cp    '>'    ;%>xy
  1082.     jr    z,gxygt
  1083.     cp    'r'    ;%r
  1084.     jr    z,gxyrev
  1085.     cp    'i'    ;%i
  1086.     jr    z,gxyinc
  1087.     call    conout    ;output char if nothing else
  1088.     jr    gxyloop
  1089. ;
  1090. ; Set row/col home to 1,1 rather than 0,0
  1091. ;
  1092. gxyinc:
  1093.     ld    a,1    ;set rcbase to 1
  1094.     ld    (rcbase),a
  1095.     jr    gxyloop
  1096. ;
  1097. ; Reverse order of output to column then row (default is row then column)
  1098. ;
  1099. gxyrev:
  1100.     ld    a,1    ;set column and row order
  1101.     ld    (rcorder),a
  1102.     jr    gxyloop
  1103. ;
  1104. ; Command: >xy
  1105. ;   If value of row/col is greater than x, add y to it
  1106. ;
  1107. gxygt:
  1108.     call    getval    ;get value
  1109.     ld    c,a    ;save value
  1110.     ld    a,(de)    ;get value to test
  1111.     inc    de    ;pt to next
  1112.     cp    c    ;if carry, value>x
  1113.     jr    nc,gxygt1
  1114.     ld    a,(de)    ;get value to add
  1115.     add    a,c
  1116.     call    putval    ;put value back
  1117. gxygt1:
  1118.     inc    de    ;pt to next
  1119.     jp    gxyloop    ;resume
  1120. ;
  1121. ; Command: +n
  1122. ;   Add n to next value and output
  1123. ;
  1124. gxyout5:
  1125.     ld    a,(de)    ;get value to add
  1126.     inc    de    ;pt to next
  1127.     ld    b,a    ;save in B
  1128.     call    getval    ;get value
  1129.     add    a,b    ;add in B
  1130.     call    conout    ;output value
  1131. rcmark:
  1132.     ld    a,(rcorder)    ;mark output
  1133.     or    80h
  1134.     ld    (rcorder),a
  1135.     jp    gxyloop
  1136. ;
  1137. ; Command: .
  1138. ;   Output next value
  1139. ;
  1140. gxyout4:
  1141.     call    getval    ;get value
  1142.     call    conout    ;output value
  1143.     jp    rcmark
  1144. ;
  1145. ; Command: 3
  1146. ;   Output next value as 3 decimal digits
  1147. ;
  1148. gxyout3:
  1149.     call    getval    ;get value
  1150.     ld    b,100    ;output 100's
  1151.     ld    c,1    ;leading zeroes
  1152.     call    digout
  1153. gxyot3:
  1154.     ld    b,10    ;output 10's
  1155.     ld    c,1    ;leading zeroes
  1156. gxyot2:
  1157.     call    digout
  1158.     add    '0'    ;output 1's
  1159.     call    conout
  1160.     jp    rcmark
  1161. ;
  1162. ; Command: 2
  1163. ;   Output next value as 2 decimal digits
  1164. ;
  1165. gxyout2:
  1166.     call    getval    ;get value
  1167.     jr    gxyot3
  1168. ;
  1169. ; Command: d
  1170. ;   Output next value as n decimal digits with no leading zeroes
  1171. ;
  1172. gxyout1:
  1173.     call    getval    ;get value
  1174.     ld    b,100    ;output 100's
  1175.     ld    c,0    ;no leading zeroes
  1176.     call    digout
  1177.     ld    b,10    ;output 10's
  1178.     ld    c,0    ;no leading zeroes
  1179.     jr    gxyot2
  1180. ;
  1181. ; Return next value in A
  1182. ;
  1183. getval:
  1184.     ld    a,(rcorder)    ;get order flag
  1185.     or    a    ;already output the first value?
  1186.     jp    m,getval2
  1187.     and    1    ;look at lsb
  1188.     jr    z,getvalr    ;if 0, row first
  1189. getvalc:
  1190.     ld    a,(rcbase)    ;get base offset
  1191.     add    a,l    ;get column
  1192.     ret
  1193. getvalr:
  1194.     ld    a,(rcbase)    ;get base offset
  1195.     add    a,h    ;get row
  1196.     ret
  1197. getval2:
  1198.     and    1    ;look at lsb
  1199.     jr    z,getvalc
  1200.     jr    getvalr
  1201. ;
  1202. ; Store A as next value
  1203. ;
  1204. putval:
  1205.     ld    c,a    ;save value
  1206.     ld    a,(rcorder)    ;get order flag
  1207.     or    a    ;already output the first value?
  1208.     jp    m,putval2
  1209.     and    1    ;look at lsb
  1210.     jr    z,putvalr    ;if 0, row first
  1211. putvalc:
  1212.     ld    l,c    ;set column
  1213.     ret
  1214. putvalr:
  1215.     ld    h,c    ;set row
  1216.     ret
  1217. putval2:
  1218.     and    1    ;look at lsb
  1219.     jr    z,putvalc
  1220.     jr    putvalr
  1221. ;
  1222. ; Output A as decimal digit char
  1223. ;   B=Quantity to Subtract from A, C=0 if no leading zero
  1224. ;
  1225. digout:
  1226.     push    de    ;save DE
  1227.     ld    d,'0'    ;char
  1228. decot1:
  1229.     sub    b    ;subtract
  1230.     jr    c,decot2
  1231.     inc    d    ;increment char
  1232.     jr    decot1
  1233. decot2:
  1234.     add    a,b    ;add back in
  1235.     push    af    ;save result
  1236.     ld    a,d    ;get digit
  1237.     cp    '0'    ;zero?
  1238.     jr    nz,decot3
  1239.     ld    a,c    ;get zero flag
  1240.     or    a    ;0=no zero
  1241.     jr    z,decot4
  1242. decot3:
  1243.     ld    a,d    ;get digit
  1244.     call    conout    ;print it
  1245. decot4:
  1246.     pop    af    ;get A
  1247.     pop    de    ;restore DE
  1248.     ret
  1249. ;
  1250. ; GXY Buffers
  1251. ;
  1252. rcorder:
  1253.     ds    1    ;0=row/col, else col/row
  1254. rcbase:
  1255.     ds    1    ;0=org is 0,0, else org is 1,1
  1256. cmdelay:
  1257.     ds    1    ;number of milliseconds to delay for CM
  1258.  
  1259. ;
  1260. ; Begin Standout Mode
  1261. ;    Return with A=0 and Zero Flag Set if not done
  1262. ;
  1263. stndout:
  1264.     push    bc
  1265.     push    de
  1266.     push    hl    ;save regs
  1267.     call    vterm
  1268.     jp    c,err
  1269.     ld    de,17h    ;pt to cls string
  1270.     add    hl,de
  1271.     ld    d,0    ;no delay
  1272. stnd1:    call    vidskp    ;skip over CL string
  1273.     call    vidskp    ;skip over CM string
  1274.     call    vidskp    ;skip over CE string
  1275.     ld    a,(hl)    ;get first char of SO string
  1276.     or    a    ;if no string, error
  1277.     jp    z,err
  1278.     call    vidout    ;output string with delay
  1279.     jp    noerr
  1280.  
  1281. ;
  1282. ; Terminate Standout Mode
  1283. ;    Return with A=0 and Zero Flag Set if not done
  1284. ;
  1285. stndend:
  1286.     push    bc
  1287.     push    de
  1288.     push    hl    ;save regs
  1289.     call    vterm
  1290.     jp    c,err
  1291.     ld    de,17h    ;pt to cls string
  1292.     add    hl,de
  1293.     ld    d,0    ;no delay
  1294.     call    vidskp    ;skip over CL string
  1295.     jr    stnd1
  1296.  
  1297. ;
  1298. ; Initialize Terminal
  1299. ;    Affect No Registers
  1300. ;
  1301. tinit:
  1302.     push    hl    ;save regs
  1303.     push    de
  1304.     push    af
  1305.     call    vterm
  1306.     jp    c,tid
  1307.     ld    de,17h    ;pt to cls string
  1308.     add    hl,de
  1309.     ld    d,0    ;no delay
  1310. tinit1:    call    vidskp    ;skip over CL string
  1311.     call    vidskp    ;skip over CM string
  1312.     call    vidskp    ;skip over CE string
  1313.     call    vidskp    ;skip over SO string
  1314.     call    vidskp    ;skip over SE string
  1315.     ld    a,(hl)    ;get first char of TI string
  1316.     or    a    ;if no string, error
  1317.     jp    z,tid
  1318.     call    vidout    ;output string with delay
  1319. tid:
  1320.     pop    af    ;done
  1321.     pop    de
  1322.     pop    hl
  1323.     ret
  1324.  
  1325. ;
  1326. ; De-Initialize Terminal
  1327. ;    Affect No Registers
  1328. ;
  1329. dinit:
  1330.     push    hl    ;save regs
  1331.     push    de
  1332.     push    af
  1333.     call    vterm
  1334.     jp    c,tid
  1335.     ld    de,17h    ;pt to cls string
  1336.     add    hl,de
  1337.     ld    d,0    ;no delay
  1338.     call    vidskp    ;skip over CL string
  1339.     jr    tinit1
  1340.  
  1341.  
  1342. ;
  1343. ;  VIDOUT - Output video string pted to by HL
  1344. ;    Output also a delay contained in the D register
  1345. ;
  1346. vidout:
  1347.     ld    a,(hl)    ;get next char
  1348.     or    a    ;done if zero
  1349.     jr    z,vid2
  1350.     inc    hl    ;pt to next
  1351.     cp    '\'    ;literal value?
  1352.     jr    nz,vid1
  1353.     ld    a,(hl)    ;get literal char
  1354.     inc    hl    ;pt to after it
  1355. vid1:
  1356.     call    conout    ;output char
  1357.     jr    vidout
  1358. vid2:
  1359.     ld    a,d    ;output delay and fall thru to VIDELAY
  1360.  
  1361. ;
  1362. ;    VIDELAY pauses for the number of milliseconds indicated by the A
  1363. ; register.  VIDELAY assumes a ZCPR3 environment and uses it to determine
  1364. ; processor speed.
  1365. ;
  1366. videlay:
  1367.     push    af    ;save regs
  1368.     push    bc
  1369.     push    de
  1370.     push    hl
  1371.     ld    c,a    ;save count in C
  1372.     or    a    ;no delay?
  1373.     jr    z,done
  1374.     ld    hl,z3env    ;pt to environment
  1375.     ld    de,2bh    ;offset to processor speed
  1376.     add    hl,de
  1377.     ld    a,(hl)    ;get processor speed
  1378.     or    a    ;zero?
  1379.     jr    nz,vidl1
  1380.     ld    a,4    ;assume 4 MHz
  1381. vidl1:
  1382.     ld    b,a    ;processor speed in B
  1383. vidl2:
  1384.     push    bc    ;delay 1 ms
  1385.     call    delay
  1386.     pop    bc
  1387.     dec    c    ;count down
  1388.     jr    nz,vidl2
  1389. done:
  1390.     pop    hl    ;restore regs
  1391.     pop    de
  1392.     pop    bc
  1393.     pop    af
  1394.  
  1395.     ret
  1396. ;
  1397. ;  Delay 1 ms at Clock speed
  1398. ;
  1399. delay:
  1400.     call    del1    ;delay 1 ms at 1MHz
  1401.     dec    b    ;count down clock speed
  1402.     jp    nz,delay
  1403.     ret
  1404. ;
  1405. ;  Delay 1 ms at 1MHz
  1406. ;
  1407. del1:
  1408.     ld    c,20    ;20 loops of 51 cycles each ~ 1000 cycles
  1409. del1a:
  1410.     ex    (sp),hl        ;18 cycles
  1411.     ex    (sp),hl        ;+18 = 36 cycles
  1412.     dec    c    ;+ 5 = 41 cycles
  1413.     jr    nz,del1a    ;+10 = 51 cycles
  1414.     ret
  1415.  
  1416. ;
  1417. ;  VIDSKP - Skip over video string pted to by HL; pt to byte after string
  1418. ;
  1419. vidskp:
  1420.     ld    a,(hl)    ;get next char
  1421.     inc    hl    ;pt to next
  1422.     or    a    ;done if zero
  1423.     ret    z
  1424.     cp    '\'    ;literal value?
  1425.     jr    nz,vidskp    ;continue if not
  1426.     inc    hl    ;pt to after literal value
  1427.     jr    vidskp
  1428.  
  1429. ;
  1430. ; Print A as 2 Hex Chars
  1431. ;
  1432. pa2hc:
  1433.     push    af
  1434.     push    bc
  1435.     ld    b,a    ;value in B
  1436.     rlca
  1437.     rlca
  1438.     rlca
  1439.     rlca
  1440.     call    pa2hc1
  1441.     ld    a,b    ;get value
  1442.     call    pa2hc1
  1443.     pop    bc
  1444.     pop    af
  1445.     ret
  1446. pa2hc1:
  1447.     and    0fh
  1448.     add    '0'    ;to ASCII
  1449.     cp    '9'+1
  1450.     jr    c,pa2hc2
  1451.     add    7    ;to letter
  1452. pa2hc2:
  1453.     jp    conout
  1454.  
  1455. ;
  1456. ; Skip Spaces
  1457. ;
  1458. sksp:
  1459.     ld    a,(hl)    ;skip to non-space
  1460.     cp    ' '
  1461.     ret    nz
  1462.     inc    hl
  1463.     jr    sksp
  1464.  
  1465. phl4hc:
  1466.     push    hl
  1467.     push    af
  1468.     ld    a,h
  1469.     call    pa2hc
  1470.     ld    a,l
  1471.     call    pa2hc
  1472.     pop    af
  1473.     pop    hl
  1474.     ret
  1475.  
  1476. phlfdc:
  1477.     push    hl
  1478.     push    de
  1479.     push    bc
  1480.     push    af
  1481.     call    hldc1
  1482.     pop    af
  1483.     pop    bc
  1484.     pop    de
  1485.     pop    hl
  1486.     ret
  1487. ; Routine to convert HL to decimal number and display it
  1488.  
  1489. hldc1:    ld    b,0        ; B holds leading zero suppression flag
  1490.     ld    de,10000
  1491.     call    hldc2
  1492.     ld    de,1000
  1493.     call    hldc2
  1494.     ld    de,100
  1495.     call    hldc2
  1496.     ld    de,10
  1497.     call    hldc2
  1498.     ld    a,l
  1499.     add    a,'0'
  1500.     jp    conout
  1501.  
  1502. hldc2:    ld    c,'0'-1        ; Count number of divisions by DE
  1503. hldc3:    inc    c
  1504.     xor    a
  1505.     sbc    hl,de
  1506.     jr    nc,hldc3    ; Keep subtracting until negative
  1507.     add    hl,de        ; then add one back
  1508.  
  1509.     ld    a,c
  1510.     cp    '1'
  1511.     jr    nc,hldc4    ; > 0, turn off leading 0 flag and print
  1512.     ld    a,b        ; Check flag at B
  1513.     or    a
  1514.     ld    a,c        ; Put character back in C
  1515.     jr    nz,hldc5    ; If B NOT 0, this '0' is not leading
  1516.     ret            ; Else skip
  1517. hldc4:    ld    b,0ffh        ; Turn the leading 0 flag off
  1518. hldc5:
  1519.     jp    conout        ; Print the number
  1520.  
  1521. vprint:
  1522.     ex    (sp),hl
  1523.     call    vprint1
  1524.     ex    (sp),hl
  1525.     ret
  1526. ;
  1527. ;  Print String (terminated in 0) pted to by HL
  1528. ;
  1529. vprint1:
  1530.     ld    a,(hl)        ; Done?
  1531.     inc    hl        ; Pt to next
  1532.     or    a        ; 0 terminator
  1533.     ret    z
  1534.     cp    dim        ; Standout?
  1535.     jr    z,vprint1d
  1536.     cp    bright        ; Standend?
  1537.     jr    z,vprint1b
  1538.     call    conout        ; Print char
  1539.     or    a
  1540.     ret    m        ; MSB set
  1541.     jr    vprint1
  1542. vprint1d:
  1543.     call    stndout        ; Dim
  1544.     jr    vprint1
  1545. vprint1b:
  1546.     call    stndend        ; Bright
  1547.     jr    vprint1
  1548.  
  1549.  
  1550. ;
  1551. ;EDITOR BUFFERS
  1552. ;
  1553. BLOCK:
  1554.     DS    2    ;ADDRESS OF CURRENT BLOCK
  1555. BUFFER:
  1556.     DS    2    ;PTR TO FREE SPACE
  1557. EINDEX:
  1558.     DS    1    ;INDEX ENTRY
  1559. EDRUN:
  1560.     DS    1    ;FLAG SAYING THAT EDITOR IS RUNNING
  1561.  
  1562.  
  1563.  BLOCK
  1564. BUFFER:
  1565.     DS    2    ;PTR TO FREE SPACE
  1566. EINDEX:
  1567.     DS    1    ;INDEX