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 / ZSYS / SIMTEL20 / ZCPR3 / DEBUGRCP.ASM < prev    next >
Assembly Source File  |  2000-06-30  |  28KB  |  1,587 lines

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