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 / MU3.MAC < prev    next >
Text File  |  2000-06-30  |  15KB  |  854 lines

  1. ;
  2. ; Program: MU3
  3. ; Author: Richard Conn
  4. ; Version: 1.0
  5. ; Date: 30 June 84
  6. ; Previous Versions: None
  7. ;
  8. vers    equ    10
  9. z3env    equ    0f400h
  10.  
  11. ;
  12. ;    MU3 is the ZCPR3 Memory Utility.  It allows the user to display
  13. ; blocks of memory, edit them, and perform general memory-oriented
  14. ; manipulation.  See the file MU3.HLP for usage details.
  15. ;
  16.  
  17. ;
  18. ;  General Equates
  19. ;
  20. bs    equ    08h
  21. cr    equ    0dh
  22. lf    equ    0ah
  23. fcb    equ    5ch
  24. dim    equ    1    ;goto standout mode
  25. bright    equ    2    ;exit standout mode
  26. EOLCH    EQU    0    ;END OF LINE CHAR
  27. SEPCH    EQU    ','    ;SEPARATOR CHAR
  28. EROW    EQU    6    ;FIRST ROW OF EDITOR DISPLAY
  29. ECOL    EQU    4    ;FIRST COL OF EDITOR DISPLAY
  30. ECOLC    EQU    ECOL+16*3+8    ;FIRST COL OF EDITOR CHAR DISPLAY
  31. ECURS    EQU    '>'    ;EDITOR CURSOR
  32. PRROW    EQU    22    ;PROMPT ROW
  33. PRCOL    EQU    10    ;PROMPT COLUMN
  34. PRCOLI    EQU    PRCOL+15    ;PROMPT INPUT COL
  35. ERROW    EQU    23    ;ERROR MESSAGE ROW
  36. ERCOL    EQU    15    ;ERROR MESSAGE COLUMN
  37.  
  38. ;
  39. ;  SYSLIB/Z3LIB/VLIB Externals
  40. ;
  41.     ext    z3vinit,envptr,codend,putcl
  42.     ext    cls,gotoxy,ereol,at,vprint,stndout
  43.     ext    cout,crlf,cin,caps
  44.     ext    bline,sksp
  45.     ext    phl4hc,pa2hc,phlfdc
  46.  
  47. ;
  48. ; Environment Definition
  49. ;
  50.     if    z3env ne 0
  51. ;
  52. ; External ZCPR3 Environment Descriptor
  53. ;
  54.     jmp    start
  55.     db    'Z3ENV'    ;This is a ZCPR3 Utility
  56.     db    1    ;External Environment Descriptor
  57. z3eadr:
  58.     dw    z3env
  59. start:
  60.     lhld    z3eadr    ;pt to ZCPR3 environment
  61. ;
  62.     else
  63. ;
  64. ; Internal ZCPR3 Environment Descriptor
  65. ;
  66.     MACLIB    Z3BASE.LIB
  67.     MACLIB    SYSENV.LIB
  68. z3eadr:
  69.     jmp    start
  70.     SYSENV
  71. start:
  72.     lxi    h,z3eadr    ;pt to ZCPR3 environment
  73.     endif
  74.  
  75. ;
  76. ; Start of Program -- Initialize ZCPR3 Environment
  77. ;
  78.     call    z3vinit    ;initialize the ZCPR3 Env and the VLIB Env
  79. ;
  80. ; DEFINE FREE SPACE
  81. ;
  82.     CALL    CODEND    ;DETERMINE ADDRESS
  83.     MVI    M,126    ;126 CHARS INPUT ALLOWED
  84.     SHLD    BUFFER    ;SET PTR
  85. ;
  86. ; SET UP ARROW KEYS
  87. ;
  88.     LHLD    ENVPTR    ;PT TO ENVIRONMENT DESCRIPTOR
  89.     LXI    D,80H+10H    ;PT TO ARROW KEY INFO
  90.     DAD    D
  91.     LXI    D,EDCURT    ;PT TO CURSOR TABLE
  92.     MVI    B,4    ;4 ARROW KEYS
  93. ARROW:
  94.     MOV    A,M    ;GET CHAR
  95.     STAX    D    ;STORE CHAR
  96.     INX    H    ;PT TO NEXT
  97.     INX    D    ;PT TO NEXT ENTRY
  98.     INX    D
  99.     INX    D
  100.     DCR    B    ;COUNT DOWN
  101.     JNZ    ARROW
  102. ;
  103. ; Check for Command Line Parameter
  104. ;
  105.     lxi    h,fcb+1    ;pt to first char
  106.     mov    a,m    ;get char
  107.     cpi    ' '    ;no param?
  108.     jnz    pcheck
  109.     lhld    envptr    ;pt to environment descriptor
  110.     jmp    mu3
  111. ;
  112. ; We have a parameter
  113. ;
  114. pcheck:
  115.     cpi    '/'    ;help?
  116.     jz    help
  117.     call    hexin    ;convert to binary
  118.     xchg        ;HL=value
  119.     jmp    mu3
  120. ;
  121. ; Print help message
  122. ;
  123. help:
  124.     call    vprint
  125.     db    cr,lf,'Syntax:'
  126.     db    cr,lf,'  MU3            <-- Invoke MU3 at Env Desc'
  127.     db    cr,lf,'  MU3 <hex adr>  <-- Invoke MU3 at Address'
  128.     db    0
  129.     ret
  130. ;
  131. ; Erase to EOL
  132. ;  If fct not supported, send out B spaces and B backspaces
  133. ;
  134. vereol:
  135.     call    ereol    ;try erase
  136.     rnz
  137.     push    b    ;save B
  138.     mvi    a,' '    ;send spaces
  139.     call    vereol1
  140.     pop    b    ;get B
  141.     mvi    a,bs    ;send backspaces
  142. vereol1:
  143.     call    cout    ;send char in A
  144.     dcr    b
  145.     jnz    vereol1
  146.     ret
  147. ;
  148. ; Clear Screen
  149. ;  If fct not supported, write 24 CRLFs
  150. ;
  151. vcls:
  152.     call    cls    ;try clear
  153.     rnz
  154.     push    b    ;save B
  155.     mvi    b,24    ;count
  156. vcls1:
  157.     call    crlf
  158.     dcr    b
  159.     jnz    vcls1
  160.     pop    b
  161.     ret
  162. ;
  163. ; Run MU3
  164. ;    HL contains starting address
  165. ;
  166. mu3:
  167.     SHLD    BLOCK    ;SAVE PTR TO BLOCK
  168. ;
  169. ; REFRESH EDIT SCREEN
  170. ;
  171. EDIT0:
  172.     CALL    VCLS    ;NEW SCREEN
  173.     CALL    AT
  174.     DB    2,26    ;ROW 2, COL 26
  175.     CALL    VPRINT    ;BANNER
  176.     DB    'MU3 Memory Editor, Version '
  177.     DB    (VERS/10)+'0','.',(VERS MOD 10)+'0'
  178.     DB    0
  179.     CALL    AT    ;POSITION FOR VALUE TEXT
  180.     DB    3,67
  181.     CALL    VPRINT
  182.     DB    DIM,'Value',BRIGHT,0
  183.     MVI    H,EROW+9    ;POSITION FOR COMMAND DISPLAY
  184.     MVI    L,1
  185.     CALL    GOTOXY    ;POSITION CURSOR
  186.     CALL    VPRINT    ;PRINT COMMAND SUMMARY
  187.     DB    ' -- Movement --'
  188.     DB    '  -------------- Operation ---------------',CR,LF
  189.     DB    '      ^E          '
  190.     DB    'A',DIM,' Enter Address     ',BRIGHT
  191.     DB    '      +',DIM,' Next Block',BRIGHT,CR,LF
  192.     DB    '       ^          '
  193.     DB    'H',DIM,' Hex Calculator    ',BRIGHT
  194.     DB    '      -',DIM,' Last Block',BRIGHT,CR,LF
  195.     DB    '  ^S <-+-> ^D     '
  196.     DB    'N',DIM,' Enter Hex Numbers ',BRIGHT
  197.     DB    '     ^R',DIM,' Replot Screen',BRIGHT,CR,LF
  198.     DB    '       v          '
  199.     DB    'T',DIM,' Enter Text        ',BRIGHT
  200.     DB    '     ^C',DIM,' Exit MU3',BRIGHT,CR,LF
  201.     DB    '      ^X          '
  202.     DB    'C',DIM,' Enter Command Line',BRIGHT
  203.     DB    0
  204. ;
  205. ; REENTER MU3 WITH PTRS RESET
  206. ;
  207. MU3R:
  208.     XRA    A    ;A=0
  209.     STA    EINDEX    ;SET INDEX TO 0 (FIRST ELEMENT)
  210.     STA    EDERR    ;SET NO PREVIOUS ERROR
  211.     CALL    EDPLOT    ;PLOT BUFFER DATA
  212. ;
  213. ; INPUT EDITOR COMMAND
  214. ;
  215. EDITCMD:
  216.     CALL    EDERCL    ;CLEAR EDITOR INVALID COMMAND MESSAGE
  217. EDITCMD1:
  218.     CALL    PRMSG    ;POSITION AT PROMPT MESSAGE
  219.     DB    DIM,'MU3 Command?',BRIGHT,0
  220.     CALL    PRINP    ;POSITION AT PROMPT INPUT
  221.     DB    0
  222.     CALL    CIN    ;GET CHAR
  223.     CALL    CAPS    ;CAPITALIZE
  224.     MOV    B,A    ;COMMAND IN B
  225.     LXI    H,EDCURT    ;PROCESS CURSOR COMMANDS FIRST
  226.     CALL    CMD    ;PROCESS COMMAND
  227.     LXI    H,ECMDTBL    ;EDITOR COMMAND TABLE
  228.     CALL    CMD    ;PROCESS COMMAND
  229.     MVI    A,0FFH    ;SET ERROR FLAG
  230.     STA    EDERR
  231.     CALL    ERMSG    ;ERROR MESSAGE
  232.     DB    'Invalid Command',0
  233.     JMP    EDITCMD1
  234. ;
  235. ; Position at Prompt Message and Print it
  236. ;
  237. PRMSG:
  238.     CALL    AT    ;POSITION
  239.     DB    PRROW,PRCOL
  240.     JMP    VPRINT    ;PRINT IT
  241. ;
  242. ; Position at Prompt Input and Print Prompt
  243. ;
  244. PRINP:
  245.     CALL    AT    ;POSITION
  246.     DB    PRROW,PRCOLI
  247.     JMP    VPRINT    ;PRINT IT
  248. ;
  249. ; Position at Error Message and Print It
  250. ;
  251. ERMSG:
  252.     CALL    AT    ;POSITION
  253.     DB    ERROW,ERCOL
  254.     JMP    VPRINT    ;PRINT IT
  255. ;
  256. ;INPUT ERROR
  257. ;
  258. WHAT:
  259.     MVI    A,0FFH    ;SET ERROR FLAG
  260.     STA    EDERR
  261.     CALL    ERMSG
  262.     DB    'Value Error',0
  263.     JMP    EDITCMD1
  264. ;
  265. ;Command Table Search and Execute
  266. ;
  267. CMD:
  268.     MOV    A,M    ;CHECK FOR END OF TABLE
  269.     ORA    A
  270.     RZ        ;COMMAND NOT FOUND
  271.     CMP    B    ;MATCH?
  272.     JZ    CMDRUN
  273.     INX    H    ;SKIP TO NEXT ENTRY IN TABLE
  274.     INX    H
  275.     INX    H
  276.     JMP    CMD
  277. ;
  278. ;RUN COMMAND
  279. ;
  280. CMDRUN:
  281.     INX    H    ;PT TO LOW ADDRESS
  282.     MOV    E,M
  283.     INX    H    ;PT TO HIGH ADDRESS
  284.     MOV    D,M
  285.     XCHG
  286.     POP    PSW    ;CLEAR STACK
  287.     PCHL        ;RUN ROUTINE
  288. ;
  289. ;PLOT BUFFER DATA
  290. ;
  291. EDPLOT:
  292.     MVI    H,EROW-1    ;SET ROW
  293.     MVI    L,ECOL    ;SET COLUMN
  294.     CALL    GOTOXY    ;POSITION CURSOR
  295.     CALL    VPRINT
  296.     DB    DIM
  297.     DB    '       0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F'
  298.     DB    BRIGHT,0
  299.     INR    H    ;NEXT ROW
  300.     CALL    GOTOXY    ;POSITION CURSOR
  301.     XCHG        ;POSITION IN DE
  302.     LHLD    BLOCK    ;PT TO DATA
  303.     MVI    B,8    ;8 LINES
  304. ;
  305. ;Print Next Line on Screen
  306. ;
  307. EDIT00:
  308.     CALL    STNDOUT    ;GO DIM
  309.     MOV    A,H    ;OUTPUT ADDRESS
  310.     CALL    PA2HC
  311.     MOV    A,L
  312.     CALL    PA2HC
  313.     CALL    VPRINT
  314.     DB    ':',BRIGHT,' ',0
  315.     MVI    C,16    ;16 ELEMENTS
  316. EDIT01:
  317.     MOV    A,M    ;GET BYTE
  318.     CALL    PA2HC    ;PRINT AS HEX
  319.     CALL    SPACE    ;PRINT 1 SPACE
  320.     INX    H    ;PT TO NEXT
  321.     DCR    C    ;COUNT DOWN
  322.     JNZ    EDIT01
  323.     XCHG        ;POSITION AGAIN
  324.     INR    H    ;NEXT ROW
  325.     CALL    GOTOXY
  326.     XCHG
  327.     DCR    B    ;COUNT DOWN
  328.     JNZ    EDIT00
  329.     MVI    H,EROW    ;RESET ROW
  330.     MVI    L,ECOLC    ;RESET COL
  331.     CALL    GOTOXY    ;POSITION CURSOR
  332.     XCHG        ;POSITION IN DE
  333.     LHLD    BLOCK    ;PT TO DATA
  334.     MVI    B,8    ;8 LINES
  335. EDIT02:
  336.     CALL    BAR    ;PRINT BAR
  337.     MVI    C,16    ;16 ELEMENTS
  338. EDIT03:
  339.     MOV    A,M    ;GET BYTE
  340.     ANI    7FH    ;MASK MSB
  341.     CPI    7FH    ;DON'T PRINT 7FH
  342.     JZ    EDIT7F
  343.     CPI    ' '    ;SPACE OR MORE?
  344.     JNC    EDIT04
  345. EDIT7F:
  346.     MVI    A,'.'    ;PRINT DOT
  347. EDIT04:
  348.     CALL    COUT    ;PRINT BYTE
  349.     INX    H    ;PT TO NEXT
  350.     DCR    C    ;COUNT DOWN
  351.     JNZ    EDIT03
  352.     CALL    BAR    ;PRINT ENDING BAR
  353.     XCHG        ;POSITION AGAIN
  354.     INR    H    ;NEXT ROW
  355.     CALL    GOTOXY
  356.     XCHG
  357.     DCR    B    ;COUNT DOWN
  358.     JNZ    EDIT02
  359.     CALL    EDCUR    ;POSITION CURSOR
  360.     RET
  361. ;
  362. ;EDITOR COMMAND TABLE
  363. ;
  364. ECMDTBL:
  365.     DB    CR    ;NOP
  366.     DW    EDITCMD
  367.     DB    'C'-'@'    ;^C = EXIT MU3
  368.     DW    EDCC
  369.     DB    'R'-'@'    ;^R = REFRESH
  370.     DW    EDIT0
  371.     DB    'E'-'@'    ;^E=UP
  372.     DW    EDUP
  373.     DB    'X'-'@'    ;^X=DOWN
  374.     DW    EDDOWN
  375.     DB    'D'-'@'    ;^D=RIGHT
  376.     DW    EDRIGHT
  377.     DB    'S'-'@'    ;^S=LEFT
  378.     DW    EDLEFT
  379.     DB    ' '    ;NOP
  380.     DW    EDITCMD
  381.     DB    '+'    ;ADVANCE
  382.     DW    EDITPLUS
  383.     DB    '-'    ;BACKUP
  384.     DW    EDITMINUS
  385.     DB    'A'    ;ADDRESS
  386.     DW    EDITADR
  387.     DB    'C'    ;COMMAND LINE
  388.     DW    EDITCL
  389.     DB    'H'    ;HEX CALC
  390.     DW    EDITCALC
  391.     DB    'N'    ;CHANGE NUMBERS
  392.     DW    EDITHEX
  393.     DB    'T'    ;CHANGE TEXT
  394.     DW    EDITALP
  395.     DB    0    ;END OF TABLE
  396. ;
  397. ;  ARROW KEY DEFINITONS FROM TCAP
  398. ;
  399. EDCURT:
  400.     DB    0    ;0 INDICATES NO ARROW KEYS
  401.     DW    EDUP
  402.     DB    0
  403.     DW    EDDOWN
  404.     DB    0
  405.     DW    EDRIGHT
  406.     DB    0
  407.     DW    EDLEFT
  408.     DB    0    ;END OF TABLE
  409. ;
  410. ;Enter Command Line
  411. ;
  412. EDITCL:
  413.     CALL    EDERCL    ;CLEAR ERROR LINE
  414.     CALL    CRLF    ;NEW LINE
  415.     CALL    VPRINT    ;PROMPT INPUT
  416.     DB    DIM,'Command Line? ',BRIGHT,0
  417.     CALL    RDBUF    ;INPUT TEXT
  418.     CALL    PUTCL    ;STORE COMMAND LINE
  419.     JMP    CRLF    ;NEW LINE
  420. ;
  421. ;Enter ASCII Chars
  422. ;
  423. EDITALP:
  424.     CALL    EDERCL    ;CLEAR ERROR LINE
  425.     CALL    PRINP    ;PROMPT INPUT
  426.     DB    DIM,'Enter Text (<hh> for Hex)',BRIGHT
  427.     DB    CR,LF,' --> ',0
  428.     CALL    RDBUF    ;INPUT TEXT WITHOUT PROMPT
  429.     CALL    EDPRCL    ;CLEAR PROMPT LINE
  430.     LDA    EINDEX    ;PT TO POSITION
  431.     XCHG
  432.     LHLD    BLOCK    ;COMPUTE OFFSET
  433.     XCHG
  434.     ADD    E
  435.     MOV    E,A
  436.     MOV    A,D
  437.     ACI    0
  438.     MOV    D,A    ;DE PTS TO BYTE, HL PTS TO TEXT
  439. EDITA1:
  440.     MOV    A,M    ;GET CHAR
  441.     CPI    EOLCH    ;EOL?
  442.     JZ    EDITA2    ;REFRESH SCREEN
  443.     CALL    GETVAL    ;GET ASCII OR <HEX> VALUE
  444.     STAX    D    ;UPDATE BYTE
  445.     INX    H    ;PT TO NEXT INPUT CHAR
  446.     INR    E    ;PT TO NEXT BUFFER BYTE
  447.     JNZ    EDITA1
  448. EDITA2:
  449.     CALL    EDPLOT    ;REPLOT
  450.     JMP    EDITCMD1    ;DONE-REFRESH SCREEN
  451. ;
  452. ;Calculate Sum and Differences
  453. ;
  454. EDITCALC:
  455.     CALL    EDERCL    ;CLEAR ERROR LINE
  456.     CALL    PRINP    ;PROMPT INPUT
  457.     DB    DIM,'Enter Two Hex Numbers - ',BRIGHT,0
  458.     CALL    RDBUF    ;INPUT TEXT
  459.     CALL    EDPRCL    ;CLEAR PROMPT LINE
  460.     CALL    SKSP    ;SKIP TO NON-SPACE
  461.     MOV    A,M    ;ANY INPUT?
  462.     ORA    A    ;0=NO
  463.     JZ    EDITCMD1
  464.     CALL    HEXIN    ;EVALUATE FIRST NUMBER
  465.     CALL    SKSP    ;SKIP TO 2ND NUMBER
  466.     PUSH    D    ;SAVE FIRST NUMBER
  467.     CALL    HEXIN    ;EVALUATE 2ND NUMBER
  468.     POP    H    ;GET FIRST NUMBER
  469.     CALL    ERMSG    ;PRINT ERROR MESSAGE
  470.     DB    0
  471.     CALL    PHL4HC    ;PRINT FIRST NUMBER
  472.     CALL    VPRINT
  473.     DB    DIM,' and ',BRIGHT,0
  474.     XCHG
  475.     CALL    PHL4HC    ;PRINT 2ND NUMBER
  476.     XCHG
  477.     CALL    VPRINT
  478.     DB    '    ',DIM,'Sum = ',BRIGHT,0
  479.     PUSH    H
  480.     DAD    D
  481.     CALL    NUMOUT
  482.     POP    H
  483.     CALL    VPRINT
  484.     DB    '  ',DIM,'Diff = ',BRIGHT,0
  485.     MOV    A,L    ;HL=HL-DE
  486.     SUB    E
  487.     MOV    L,A
  488.     MOV    A,H
  489.     SBB    D
  490.     MOV    H,A
  491.     CALL    NUMOUT
  492.     JMP    EDITCMD1
  493. ;
  494. ;Output number in HL in Hex and Decimal
  495. ;
  496. NUMOUT:
  497.     CALL    PHL4HC    ;HEX
  498.     CALL    VPRINT
  499.     DB    ' (',0
  500.     CALL    PHLFDC    ;DECIMAL FLOATING
  501.     MVI    A,')'    ;CLOSE PAREN
  502.     JMP    COUT
  503. ;
  504. ;Enter Numbers
  505. ;
  506. EDITHEX:
  507.     CALL    EDERCL    ;CLEAR ERROR LINE
  508.     CALL    PRINP    ;PROMPT INPUT
  509.     DB    DIM,'Enter Hex Numbers (#nn for Dec)'
  510.     DB    BRIGHT
  511.     DB    CR,LF,' --> ',0
  512.     CALL    RDBUF    ;INPUT TEXT WITHOUT PROMPT
  513.     CALL    EDPRCL    ;CLEAR PROMPT LINE
  514.     LDA    EINDEX    ;PT TO POSITION
  515.     XCHG
  516.     LHLD    BLOCK    ;COMPUTE OFFSET
  517.     XCHG
  518.     ADD    E
  519.     MOV    E,A
  520.     MOV    A,D
  521.     ACI    0
  522.     MOV    D,A    ;DE PTS TO BYTE, HL PTS TO TEXT
  523. EDITH1:
  524.     MOV    A,M    ;GET HEX DIGIT
  525.     CPI    EOLCH    ;EOL?
  526.     JZ    EDITA2    ;REFRESH SCREEN
  527.     CPI    ' '    ;SKIP SPACES
  528.     JNZ    EDITH2
  529.     INX    H    ;SKIP SPACE
  530.     JMP    EDITH1
  531. EDITH2:
  532.     PUSH    D    ;SAVE PTR
  533.     CALL    HEXIN    ;GET VALUE AND POSITION HL
  534.     MOV    A,E    ;... IN A
  535.     POP    D    ;GET PTR
  536.     STAX    D    ;PUT BYTE
  537.     INR    E    ;ADVANCE TO NEXT BYTE
  538.     JNZ    EDITH1
  539.     JMP    EDITA2    ;DONE-REFRESH
  540. ;
  541. ;Clear Editor Invalid Command Message
  542. ;
  543. EDERCL:
  544.     LDA    EDERR    ;PREVIOUS ERROR?
  545.     ORA    A    ;0=NO
  546.     RZ
  547.     XRA    A    ;CLEAR FLAG
  548.     STA    EDERR
  549.     CALL    ERMSG    ;CLEAR ERROR MESSAGE
  550.     DB    0
  551.     MVI    B,40    ;40 CHARS MAX
  552.     JMP    VEREOL
  553. ;
  554. ;CLEAR PROMPT LINE
  555. ;
  556. EDPRCL:
  557.     CALL    PRINP    ;PROMPT LINE
  558.     DB    0
  559.     MVI    B,40    ;40 POSITIONS
  560.     CALL    VEREOL    ;CLEAR TO EOL OR 40 CHARS
  561.     CALL    AT    ;USER INPUT
  562.     DB    ERROW,1
  563.     MVI    B,79    ;79 POSITIONS
  564.     JMP    VEREOL
  565. ;
  566. ;Input Address
  567. ;
  568. EDITADR:
  569.     CALL    VPRINT
  570.     DB    'Address? ',0
  571.     CALL    RDBUF    ;GET USER INPUT
  572.     CALL    SKSP    ;SKIP LEADING SPACES
  573.     MOV    A,M    ;EMPTY LINE?
  574.     ORA    A
  575.     JZ    MU3R
  576.     CALL    HEXIN    ;CONVERT FROM HEX
  577.     XCHG        ;HL = ADDRESS
  578.     SHLD    BLOCK
  579.     JMP    MU3R    ;REENTER
  580. ;
  581. ;Advance to Next Block
  582. ;
  583. EDITPLUS:
  584.     LHLD    BLOCK    ;ADVANCE TO NEXT BLOCK
  585.     LXI    D,128    ;128 BYTES
  586.     DAD    D
  587.     SHLD    BLOCK
  588.     CALL    EDPLOT    ;REPLOT DATA
  589.     JMP    EDITCMD
  590. ;
  591. ;Backup to Last Block
  592. ;
  593. EDITMINUS:
  594.     LHLD    BLOCK    ;BACKUP TO LAST BLOCK
  595.     LXI    D,-128    ;128 BYTES
  596.     DAD    D
  597.     SHLD    BLOCK
  598.     CALL    EDPLOT    ;REPLOT DATA
  599.     JMP    EDITCMD
  600. ;
  601. ;Exit MU3
  602. ;
  603. EDCC:
  604.     CALL    EDERCL    ;CLEAR ERROR LINE
  605.     JMP    CRLF    ;NEW LINE
  606. ;
  607. ;EDIT MOVE: UP
  608. ;
  609. EDUP:
  610.     CALL    EDCCUR    ;CLEAR CURSOR
  611.     LDA    EINDEX    ;BACKUP INDEX BY 16
  612.     SUI    16
  613. ;
  614. ;Common EDIT MOVE Routine - on input, A=new index
  615. ;
  616. EDMOVE:
  617.     ANI    7FH    ;MOD 128
  618.     STA    EINDEX
  619.     CALL    EDCUR    ;SET CURSOR
  620.     JMP    EDITCMD
  621. ;
  622. ;EDIT MOVE: DOWN
  623. ;
  624. EDDOWN:
  625.     CALL    EDCCUR    ;CLEAR CURSOR
  626.     LDA    EINDEX    ;INCREMENT INDEX BY 16
  627.     ADI    16
  628.     JMP    EDMOVE    ;COMMON ROUTINE
  629. ;
  630. ;EDIT MOVE: RIGHT
  631. ;
  632. EDRIGHT:
  633.     CALL    EDCCUR    ;CLEAR CURSOR
  634.     LDA    EINDEX    ;INCREMENT INDEX BY 1
  635.     INR    A
  636.     JMP    EDMOVE    ;COMMON ROUTINE
  637. ;
  638. ;EDIT MOVE: LEFT
  639. ;
  640. EDLEFT:
  641.     CALL    EDCCUR    ;CLEAR CURSOR
  642.     LDA    EINDEX    ;DECREMENT INDEX BY 1
  643.     DCR    A
  644.     JMP    EDMOVE    ;COMMON ROUTINE
  645. ;
  646. ;EDIT SUBROUTINE: EDCUR
  647. ; Position Editor Cursor at EINDEX
  648. ;EDIT SUBROUTINE: EDCCUR
  649. ; Clear Editor Cursor at EINDEX
  650. ;
  651. EDCUR:
  652.     PUSH    H    ;SAVE HL
  653.     MVI    C,ECURS    ;CURSOR CHAR
  654.     CALL    EDSETCUR
  655.     CALL    AT    ;UPDATE DATA
  656.     DB    3,74
  657.     LDA    EINDEX    ;PT TO BYTE AT CURSOR
  658.     LHLD    BLOCK
  659.     ADD    L
  660.     MOV    L,A
  661.     MOV    A,H
  662.     ACI    0
  663.     MOV    H,A    ;HL PTS TO BYTE AT CURSOR
  664.     MOV    A,M    ;GET BYTE
  665.     CALL    PA2HC    ;PRINT AS HEX
  666.     CALL    SPACE
  667.     MOV    A,M    ;GET BYTE
  668.     POP    H    ;RESTORE HL
  669.     ANI    7FH    ;MASK
  670.     CPI    7FH    ;7FH AS DOT
  671.     JZ    EDC7F
  672.     CPI    ' '    ;OUTPUT CHAR OR DOT
  673.     JNC    COUT
  674. EDC7F:
  675.     MVI    A,'.'    ;DOT
  676.     JMP    COUT
  677. EDCCUR:
  678.     MVI    C,' '    ;CLEAR CURSOR
  679. EDSETCUR:
  680.     CALL    EDROW    ;COMPUTE ROW
  681.     ANI    0FH    ;COMPUTE COL MOD 16
  682.     MOV    B,A    ;RESULT IN B
  683.     ADD    A    ;*2
  684.     ADD    B    ;*3
  685.     ADI    ECOL+6    ;ADD IN COL
  686.     DCR    A    ;SUBTRACT 1
  687.     MOV    L,A    ;COL POSITION SET
  688.     CALL    GOTOXY    ;POSITION CURSOR
  689.     MOV    A,C    ;OUTPUT CHAR
  690.     JMP    COUT
  691. ;
  692. ;Compute Row from EINDEX
  693. ;
  694. EDROW:
  695.     LDA    EINDEX    ;GET INDEX
  696.     MOV    B,A    ;SAVE IN B
  697.     RRC        ;DIVIDE BY 16
  698.     RRC
  699.     RRC
  700.     RRC
  701.     ANI    0FH    ;MASK FOR LSB ONLY
  702.     ADI    EROW    ;COMPUTE ROW
  703.     MOV    H,A    ;ROW SET
  704.     MOV    A,B    ;GET INDEX
  705.     RET
  706.  
  707. ;
  708. ;PRINT A SPACE
  709. ;
  710. SPACE:
  711.     MVI    A,' '
  712.     JMP    COUT
  713. ;
  714. ;PRINT AN BARISK IN REV VIDEO
  715. ;
  716. BAR:
  717.     CALL    VPRINT
  718.     DB    DIM,'|',BRIGHT,0
  719.     RET
  720. ;
  721. ;Get value from input buffer
  722. ;
  723. GETVAL:
  724.     MOV    A,M    ;GET NEXT CHAR
  725.     CPI    '<'    ;HEX ESCAPE?
  726.     RNZ        ;NO, RETURN
  727. ;"<<" means one "<"
  728.     INX    H
  729.     MOV    A,M
  730.     CPI    '<'
  731.     RZ
  732. ;Got hex
  733.     PUSH    D
  734.     CALL    HEXIN    ;GET VALUE
  735.     CPI    '>'    ;PROPER DELIM?
  736.     MOV    A,E    ;GET VALUE
  737.     POP    D
  738.     RZ
  739. ;
  740. ;ERROR CONDITION IN SUBROUTINE - CLEAR STACK AND FLAG ERROR
  741. ;
  742. SERR:
  743.     POP    PSW    ;CLEAR STACK
  744.     JMP    WHAT    ;ERROR
  745. ;
  746. ;Input Number from Command Line -- Assume it to be Hex
  747. ;  Number returned in DE
  748. ;
  749. HEXIN:
  750.     LXI    D,0    ;INIT VALUE
  751.     MOV    A,M
  752.     CPI    '#'    ;DECIMAL?
  753.     JZ    HDIN    ;MAKE DECIMAL
  754. ;
  755. HINLP:
  756.     MOV    A,M    ;GET CHAR
  757.     CALL    CAPS    ;CAPITALIZE
  758.     CPI    CR    ;EOL?
  759.     RZ
  760.     CPI    EOLCH    ;EOL?
  761.     RZ
  762.     CPI    SEPCH
  763.     RZ
  764.     CPI    ' '    ;SPACE?
  765.     RZ
  766.     CPI    '-'    ;'THRU'?
  767.     RZ
  768.     CPI    '>'
  769.     RZ
  770.     INX    H    ;PT TO NEXT CHAR
  771.     CPI    '0'    ;RANGE?
  772.     JC    SERR
  773.     CPI    '9'+1    ;RANGE?
  774.     JC    HINNUM
  775.     CPI    'A'    ;RANGE?
  776.     JC    SERR
  777.     CPI    'F'+1    ;RANGE?
  778.     JNC    SERR
  779.     SUI    7    ;ADJUST FROM A-F TO 10-15
  780. ;
  781. HINNUM:
  782.     SUI    '0'    ;CONVERT FROM ASCII TO BINARY
  783.     XCHG
  784.     DAD    H    ;MULT PREVIOUS VALUE BY 16
  785.     DAD    H
  786.     DAD    H
  787.     DAD    H
  788.     ADD    L    ;ADD IN NEW DIGIT
  789.     MOV    L,A
  790.     XCHG
  791.     JMP    HINLP
  792. ;
  793. HDIN:
  794.     INX    H    ;SKIP '#'
  795. ;
  796. ;Input Number in Command Line as Decimal
  797. ;  Number is returned in DE
  798. ;
  799. DECIN:
  800.     LXI    D,0
  801.     MOV    A,M    ; GET 1ST CHAR
  802.     CPI    '#'    ; HEX?
  803.     JNZ    DINLP
  804.     INX    H    ; PT TO DIGIT
  805.     JMP    HINLP    ; DO HEX PROCESSING
  806. ;
  807. DINLP:
  808.     MOV    A,M    ;GET DIGIT
  809.     CALL    CAPS    ;CAPITALIZE
  810.     CPI    '0'    ;RANGE?
  811.     RC
  812.     CPI    '9'+1    ;RANGE?
  813.     RNC
  814.     SUI    '0'    ;CONVERT TO BINARY
  815.     INX    H    ;PT TO NEXT
  816.     PUSH    H
  817.     MOV    H,D
  818.     MOV    L,E
  819.     DAD    H    ;X2
  820.     DAD    H    ;X4
  821.     DAD    D    ;X5
  822.     DAD    H    ;X10
  823.     ADD    L    ;ADD IN DIGIT
  824.     MOV    L,A
  825.     MOV    A,H
  826.     ACI    0
  827.     MOV    H,A
  828.     XCHG        ;RESULT IN DE
  829.     POP    H
  830.     JMP    DINLP
  831. ;
  832. ; READ LINE FROM USER INTO INPUT LINE BUFFER
  833. ;
  834. RDBUF:
  835.     LHLD    BUFFER    ;PT TO BUFFER
  836.     XRA    A    ;DON'T CAPITALIZE
  837.     JMP    BLINE    ;INPUT LINE ROUTINE
  838.  
  839. ;
  840. ;EDITOR BUFFERS
  841. ;
  842. BLOCK:
  843.     DS    2    ;ADDRESS OF CURRENT BLOCK
  844. BUFFER:
  845.     DS    2    ;PTR TO FREE SPACE
  846. EINDEX:
  847.     DS    1    ;INDEX ENTRY
  848. EDERR:
  849.     DS    1    ;ERROR FLAG
  850. EDRUN:
  851.     DS    1    ;FLAG SAYING THAT EDITOR IS RUNNING
  852.  
  853.     end
  854.