home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / ZCPR33 / S-Z / ZPATCH13.LBR / EEDITOR.ZZ0 / EEDITOR.Z80
Text File  |  2000-06-30  |  10KB  |  378 lines

  1. ; EEDITOR.Z80
  2. ;
  3.      EXT    STNDEND,Z3EADR,DISPLAY,ednib,HEXDMP
  4.     EXT    AT,EREOL,VPRINT,GOTOXY,GXYMSG,CLS
  5.     EXT    COUT,CIN,PA2HC,MA2HC,IALLOC,ALLOC
  6.  
  7.     PUBLIC    EDITOR,SHOWBYTE,UNSHOWB
  8.     MACLIB    ZPATCH.LIB
  9. ;
  10. ; EDITOR:
  11. ; a screen-oriented hex-ascii dump editor.
  12. ; INPUT:
  13. ; this subprogram expects to find the following global variables:
  14. ;   LINE## = the row number on which the display is to start 
  15. ; SECADR## = beginning actual address of sector to be edited 
  16. ;   OFFS## = offset used to generate apparent from actual address 
  17. ; OUTBUF## = address of the buffer in which the dump output is to be stored 
  18. ; ABSADR## = a value corresponding to the absolute byte number within the file
  19. ;            on which to begin editing.
  20. ;
  21. ; OUTPUT:
  22. ; on exit the carry flag is a flag which can be used to decide whtether to 
  23. ; do an immediate write-to-disk or not
  24. ;
  25. ;
  26. ; SHOWBYTE:
  27. ; not logically a part of this module, but it uses all the cursor positioning
  28. ; code here and is therefore here.  SHOWBYTE highlights the current byte
  29. ; given in ABSADR## on the screen in both the HEX and ASCII displays.
  30. ; For non-highlighting terminals the HEX display byte is surrounded by
  31. ; curly brackets as well e.g. {9F} 
  32. ; INPUTS: same as above.
  33. ; OUTPUTS: none.
  34. ;
  35. EDITOR:    
  36.     LD    HL,(OUTBUF##)
  37.     LD    (OUTBUF),HL
  38.     LD    HL,(SECADR##)    ; actual address of the dump
  39.     call    hexdmp        ; dump sector given by secadr## into memory
  40.     CALL    CLS        ; clear previous display
  41.     call     DISPLAY        ; display the hex dump
  42.     CALL    MENU        ; display the editor menu
  43.     CALL    GETPOSN
  44. HEXLOOP:
  45.     CALL    GXYMSG        ; update the menu toggle
  46.     DB    16,35
  47.     DB    HV,'<ESC> ',LV,'switch to ASCII mode',2,0
  48.     CALL    HPOSIT        ; we know where to position the cursor
  49.     LD    A,(POSN)    
  50.     AND    1        ;set up EDNIB for high or low nibble
  51.     CALL    EDNIB
  52.     JR    C,EDITED    ; carry flag means a hex char successfully read
  53.     LD    C,1        ; hex/ascii indicator for cursors routine
  54.     CALL    CURSORS        ; was it a cursor key or a function key?
  55.     JR    C,HEXLOOP    ; no get more input
  56.     CALL    TESTQUIT    ; was a ^Q or ^W hit?
  57.     RET    Z        ; return if quit holding write/nowrite in carry
  58.                 ; flag
  59.     CP    ESC        ; was ESC hit
  60.     JP    Z,ASCLOOP    ; yes, switch over to ASCII mode
  61.     JR    HEXLOOP        ; no, get more input
  62.  
  63. EDITED:             ; update screen 
  64.     CALL    APOSIT        ; position cursor for ASCII update
  65.     LD    A,(HL)        ; is "new" byte
  66.     CP    ' '        ; < 20H?
  67.     JR    C,DOT        ; yes, show a dot
  68.     CP    80H        ; it it >= 80H? 
  69.     JR    C,CHAR        ; no, show the char, else ...
  70. DOT:    LD    A,'.'        ; show the dot
  71. CHAR:    CALL    COUT        ; 
  72.     LD    A,(POSN)    ; update the postion counter
  73.     INC    A
  74.     LD    (POSN),A
  75.     JR    NZ,EDTD1    ; have we gone beyond sector boundary?
  76.     LD    HL,(SECADR##)    ; yes, retrieve beginning address
  77.     JR    EDTD3        ; of sector
  78. EDTD1:    LD    B,A        ; no, save byte and check if
  79.     AND    1        ; we have crossed a byte boundary
  80.     JR    NZ,EDTD2    ; no, edit next nibble
  81.     INC    HL        ; yes, get next byte
  82. EDTD2:    LD    A,B        ; restore byte
  83. EDTD3:    PUSH    HL        ; save current address
  84.     LD    DE,(OUTBUF##)    ; update the output buffer
  85.     LD    HL,(SECADR##)
  86.     CALL    HEXDMP
  87.     POP    HL
  88.     JP    HEXLOOP        ; and get next edit
  89.     
  90. ASCLOOP:            ; loop for editing under ASCII mode
  91.     CALL    AT        ; menu toggle 
  92.     DB    16,35
  93.     CALL    EREOL
  94.     CALL    VPRINT
  95.     DB    HV,'<ESC> ',LV,'switch to HEX mode',2,0     
  96.     LD    A,(POSN)
  97.     AND    11111110B    ; mask off last bit
  98.     LD    (POSN),A
  99.     CALL    APOSIT        ; posiTion cursor for an ASCII input
  100.     CALL    CIN        ; get a character
  101.     LD    B,A        ; preserve the character in B
  102.     LD    c,2        ; hex/ascii indicator for cursors routine
  103.     CALL    CURSORS
  104.     JR    C,ASCLOOP    ; if cursor, go back and get next
  105.     CALL    TESTQUIT    ; was it ^Q, or ^W
  106.     RET    Z        ; return if quit holding write/nowrite in carry
  107.                 ; flag
  108.     CP    ESC        ; was it ESC?
  109.     JP    Z,HEXLOOP    ; yes switch back to hex mode
  110.     CP    ' '        
  111.     JR    C,ASCLOOP    ; other control chars ignored
  112.     CP    80H        ; anything over 80H is a dot
  113.     JR    C,POUT
  114. NONP:    LD    A,'.'
  115. POUT:    CALL    COUT
  116.     LD    (HL),B        ; update memory in sector being dumped
  117.     CALL    HPOSIT        ; update the hex side
  118.     LD    A,B
  119.     CALL    PA2HC        
  120.     LD    A,(POSN)    ; update the position counter
  121.     INC    A        ; by two nibbles
  122.     INC    A
  123.     LD    (POSN),A
  124.     OR    A        ; crossed sector boundary?        
  125.     JR    NZ,AL1        ; no, get next
  126.     LD    HL,(SECADR##)    ; yes, go back to beginning of sector
  127.     JR    AL2
  128. AL1:    INC    HL        ; get next byte
  129. AL2:    LD    A,B
  130.     JR    ASCLOOP        ; and back for more
  131. ;
  132. ; Test to see if either of the two commands for quitting
  133. ; i.e. ^Q without writing sector
  134. ; or   ^W writing sector
  135. ; have been given.
  136. ; On output z-flag indicates one of the two quit commands has been given
  137. ;           carry=write, no carry = no write
  138. ;
  139. TESTQUIT:
  140.     CP    CTRLW
  141.     JR    Z,WRITE
  142.     CP    CTRLQ        ;control-Q?
  143.     RET            ;NZ=no quit.  Z and NC = quit no write
  144. WRITE:    SCF            ;Z and C = quit and write    
  145.     RET
  146.  
  147. ; THIS MODULE CONTAINS THE ROUTINES FOR POSITIONING THE CURSOR
  148. ; DURING HEXADECIMAL EDITING AND FOR ASCII EDITING
  149.  
  150. HPOSIT:    PUSH    AF
  151.     PUSH    BC
  152.     PUSH    HL
  153.     PUSH    DE
  154.     LD    DE,(POSN)
  155.     LD    A,E        ;position counter
  156.     AND    31        ;lowest five bits determine column-pair
  157.     LD    B,A        ;save it
  158.     AND    1        ;last bit determines high-low nibble
  159.     LD    C,A        ; save it
  160.     LD    A,B        ;reload column-pair number 
  161.     SRA    A        ;divide by two
  162.     LD    B,A        ;store in B
  163.     ADD    A,A        ;A+A=2A
  164.     ADD    A,B        ;2A+A=3A
  165.     ADD    A,C        ;now add back for low nibble
  166.     ADD    A,11        ;to this number add eleven for actual column
  167.     LD    L,A        ;and put column number in L
  168.     LD    A,E        ;now do row
  169.     CALL    ROW
  170.     LD    H,A        ;and store it in H for ...
  171.     CALL    GOTOXY        ;this call 
  172.     POP    DE
  173.     POP    HL
  174.     POP    BC
  175.     POP    AF
  176.     RET
  177.  
  178. APOSIT: PUSH    AF
  179.     PUSH    BC
  180.     PUSH    HL
  181.     PUSH    DE
  182.     LD    DE,(POSN)
  183.     LD    A,E        ; E HAS POSITION VARIABLE
  184.     AND    00011111B    ; mask off high bits
  185.     SRL    A        ; shift right (divide by two) as nibbles    
  186.                 ; do not concern us, only bytes
  187.     ADD    62        ; offset for actual column
  188.     LD    L,A        ; put in L for gotoxy call
  189.     LD    A,E        ; posn again
  190.     CALL    ROW
  191.     LD    H,A        ; 
  192.     CALL    GOTOXY
  193.     POP    DE
  194.     POP    HL
  195.     POP    BC
  196.     POP    AF
  197.     RET
  198. ROW:                ; row calculation routine used by ASCLOOP
  199.                 ; and hexloop
  200.     SRL    A        ;shift right five times as high three bits
  201.     SRL    A        ;determine the row
  202.     SRL    A    
  203.     SRL    A    
  204.     SRL    A
  205.     ADD    D        ; D HAS OFFSET FOR BEGINNING LINE OF DISPLAY
  206.     RET    
  207. ;
  208.                         
  209. CURSORS:            ; test char in A to see whether cursor 
  210.                 ; key pressed and adjust posn if so.  
  211.                 ; on input hl points to byte being
  212.                 ; edited, on output to new byte pointed to
  213.                 ; on input c=1 for hex editing
  214.                 ; and 2 for ascii editing
  215.                 ; carry flag set if A had cursor key
  216.                 ; reset if not
  217.     PUSH    DE
  218.     PUSH    BC
  219.     PUSH    HL        
  220.     LD    HL,(z3eadr)
  221.     LD    de,90h        ; cursors begin at z3ENV+90h
  222.     add    HL,DE
  223.     LD    E,A        ; input char into E
  224.     CP    (HL)        ; HL Points to TCAP Uparrow
  225.     JR    Z,UP 
  226.     CP    CTRLE        ; Wordstar UP
  227.     JR    Z,UP
  228.     INC    HL        ; HL Points to TCAP Downarrow
  229.     CP    (HL)
  230.     JR    Z,DOWN
  231.     CP    CTRLX        ; Wordstar Down
  232.     JR    Z,DOWN
  233.     INC    HL        ; HL Points to TCAP Rt. Arrow
  234.     CP    (HL)
  235.     JR    Z,RIGHT
  236.     CP    CTRLD        ; Wordstar right
  237.     JR    Z,RIGHT
  238.     INC    HL        ; HL points to TCAP Left Arrow
  239.     CP    (HL)
  240.     JR    Z,LEFT
  241.     CP    CTRLS        ; Wordstar left
  242.     JR    Z,LEFT
  243.     XOR    A        ; no cursor so reset carry
  244.     JR    CUREND
  245. UP:    LD    B,32        ; subtract 32 from posn for up
  246.     JR    POS1        ; jump to subtract
  247. DOWN:    LD    B,32        ; add 32 to posn for down
  248.     JR    POS2        ; jump to add
  249. RIGHT:    LD    b,c        ; c has hex/ascii flag (1 or 2)
  250.     JR    POS2        ; jump to add
  251. LEFT:    LD    b,c        ; c has hex/ascii flag (1 or 2)
  252. POS1:    LD    A,(POSN)    ; subtract routine
  253.     SUB    B
  254.     JR    POS3
  255. POS2:    LD    A,(POSN)    ; add routine
  256.     ADD    B
  257. POS3:    LD    (POSN),A    ; save new posn
  258.     SRL    A        ; right shift to adjust nibble addr to byte 
  259.                 ; addr
  260.     LD    C,A        ; save in C
  261.     LD    B,0        ; no b
  262.     POP    HL            ;HL contains address of byte being
  263.                     ;edited
  264.     LD    A,L
  265.     AND    10000000B        ;mask off all but high bit in L
  266.     LD    L,A
  267.  
  268.     ADD    HL,BC            ;add displacement (from posn)
  269.     PUSH    HL            ;to get new address for edits
  270.     SCF    
  271. CUREND:
  272.     LD    A,E
  273.     POP    HL
  274.     POP    BC
  275.     POP    DE
  276.     RET
  277.  
  278. MENU:
  279.     CALL     GXYMSG
  280.     DB    14,9
  281.     DB    "-- Movement --",0
  282.     CALL    GXYMSG
  283.     DB    14,40
  284.     DB    "-- Functions --",0
  285.     CALL    GXYMSG
  286.     DB    16,15
  287.     DB    '^E',0
  288.     CALL    GXYMSG
  289.     DB    17,16
  290.     DB    '^',0
  291.     CALL    GXYMSG
  292.     DB    18,11
  293.     DB    '^S <-+-> ^D',0
  294.     CALL    GXYMSG
  295.     DB    19,16
  296.     DB    'v',0
  297.     CALL    GXYMSG
  298.     DB    20,15
  299.     DB    '^X',0
  300.     CALL    GXYMSG
  301.     DB    18,35
  302.     DB    HV,' ^Q',LV,'uit to command mode without saving to disk',2,0
  303.     CALL    GXYMSG
  304.     DB    19,35
  305.     DB    HV,' ^W',LV,'rite sector to disk and ret to command mode',2,0
  306.     RET
  307.     
  308. ;
  309. ; derive a value to be stored in POSN that is obtained by
  310. ; ORing the low order byte of the in-file address at which editing is 
  311. ; to begin with the low order byte of the actual address of the dump
  312. ; and doubling it.  This is the "nibble address" within the sector.
  313. ;
  314. GETPOSN:
  315.     LD    A,(LINE##)
  316.     LD    (LIN),A
  317.     LD    BC,(ABSADR##)    ; get the in-file editing address in BC
  318.     LD    HL,(SECADR##)
  319.     LD    A,C
  320.     OR    L
  321.     LD    L,A
  322.     SLA    A        ; double it
  323.     LD    (POSN),A
  324.     RET
  325. ;
  326. ; routine to highlight the current byte in ABSADR.
  327. ;
  328. SHOWBYTE:
  329. ;    PUSH    DE    
  330.     CALL    GETPOSN        ; initialize the POSN and LIN variables
  331.     CALL    HPOSIT        ; go to proper place in HEX display
  332.     LD    DE,DSPBYT    ; fill memory below
  333.     LD    A,(HL)        ; with the value of the current byte
  334.     PUSH    AF
  335.     CALL    MA2HC        ; as 2 hex digits
  336.     CALL    VPRINT        ; print it on the screen
  337.     DB    1,8,'{'        ; highlight,backspace,fence
  338. DSPBYT:    DS    2        ; our 2 hex digits
  339.     DB    '}',0        ; close fence
  340.     CALL    APOSIT        ; get ascii position
  341.     POP    AF
  342.     CP    80H        ; if not printable
  343.     JR    NC,PPER        ; print a period
  344.     CP    20H        ; ditto
  345.     JR    NC,POUT2
  346. PPER:    LD    A,'.'    
  347. POUT2:  CALL    COUT        ; print char or period
  348.     CALL    STNDEND        ; turn off highlight
  349.     RET        
  350.  
  351. UNSHOWB:
  352. ;    PUSH    DE    
  353.     CALL    GETPOSN        ; initialize the POSN and LIN variables
  354.     CALL    HPOSIT        ; go to proper place in HEX display
  355.     LD    DE,UDSPBYT    ; fill memory below
  356.     LD    A,(HL)        ; with the value of the current byte
  357.     PUSH    AF
  358.     CALL    MA2HC        ; as 2 hex digits
  359.     CALL    STNDEND
  360.     CALL    VPRINT        ; print it on the screen
  361.     DB    8,' '        ; highlight,backspace,fence
  362. UDSPBYT:
  363.     DS    2        ; our 2 hex digits
  364.     DB    ' ',0        ; close fence
  365.     CALL    APOSIT        ; get ascii position
  366.     POP    AF
  367.     CP    80H        ; if not printable
  368.     JR    NC,PPERU    ; print a period
  369.     CP    20H        ; ditto
  370.     JR    NC,POUT2U
  371. PPERU:    LD    A,'.'    
  372. POUT2U: CALL    COUT        ; print char or period
  373.     RET        
  374.  
  375. POSN:   DB    0        ;POSITION COUNTER WITHIN EDIT BLOCK
  376. LIN:    DB    0
  377.     END
  378.