Login

Subversion Repositories NedoOS

Rev

Rev 1168 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

hexeditor_XYTOP=0x0000 ;ьюцхЄ ёфтшэєЄ№ё  шч-чр ьхэ■
;hexeditor_HGT=txtscrhgt-1 ;ьюцхЄ єьхэ№°шЄ№ё  шч-чр ьхэ■
hexeditor_WID=80 ;ьюцхЄ єьхэ№°шЄ№ё  шч-чр ёъЁюыысрЁр
hexeditor_MAXX=15
;hexeditor_PAGESIZE=16*hexeditor_HGT

       if PRSTDIO
_hexeditor_CURSORCOLOR=0x0700;0x38
_hexeditor_COLOR=0x0007;7
       else
_hexeditor_CURSORCOLOR=0x38
_hexeditor_COLOR=7
       endif

hexeditor_redrawloop
        ;YIELDGETKEYLOOP
        call hexeditor_prpage
hexeditor_mainloop
        call hexeditor_calccursorxy
        ld hl,_hexeditor_CURSORCOLOR
        ld b,2
        call drawfilecursor_sizeb_colorhl
        call hexeditor_calctextcursorxy
       if PRSTDIO
        call nv_setxy ;keeps de,hl,ix
       else
        ld hl,_hexeditor_CURSORCOLOR
        ld b,1
        call drawfilecursor_sizeb_colorhl
       endif
      if 0
;hexeditor_yieldkeep
        ld a,2
hexeditor_yieldkeep
        ld (hexeditor_wasnokey),a
        YIELDKEEP
        ld a,55+128 ;"or a"
        ld (hexeditor_wasyield),a
      endif
hexeditor_mainloop_nokey
      if 0
      else
        YIELD
      endif
       if PRSTDIO
        GETKEY_
        jr nz,hexeditor_keyq
        ;GETKEY_
        ;jr nz,hexeditor_keyq
        ;GETKEY_
        ;jr nz,hexeditor_keyq ;event бывает 3-символьный
       else
        GET_KEY
        ld a,c ;keynolang
        ;cp NOKEY
         or a
        jr nz,hexeditor_keyq
       endif
       if PRSTDIO
       ld a,(stdindatacount)
       or a
       jr nz,hexeditor_mainloop;_nokey
       endif
      if 0
;если два раза подряд нет события, то рисуем панельку и делаем YIELD, иначе YIELDKEEP
hexeditor_wasnokey=$+1
        ld a,1
        dec a
        jr nz,hexeditor_yieldkeep
;рисовать панельку только при отсутствии события после YIELD
hexeditor_wasyield=$
        scf
        jr nc,hexeditor_nopanel
      endif
        call hexeditor_panel
       if PRSTDIO
        call hexeditor_calctextcursorxy
        call nv_setxy ;keeps de,hl,ix
       endif
      if 0
hexeditor_nopanel
        YIELD
        ld a,55 ;"scf"
        ld (hexeditor_wasyield),a
      endif
        jr hexeditor_mainloop_nokey
hexeditor_keyq
        ;push hl
        ;push bc
        ;push de
        push af
        call hexeditor_calccursorxy
        ld hl,_hexeditor_COLOR
        ld b,2
        call drawfilecursor_sizeb_colorhl
       if PRSTDIO == 0
        call hexeditor_calctextcursorxy
        ld hl,_hexeditor_COLOR
        ld b,1
        call drawfilecursor_sizeb_colorhl
       endif
        pop af
        ;pop de
        ;pop bc
        ;pop hl
        cp key_redraw
        jr z,hexeditor_redrawloop
        cp key_esc
        ret z
        cp key_tab
        jp z,nvview_hexeditorq
        ld hl,hexeditor_mainloop
        push hl
         cp key_up
         jp z,hexeditor_up
         cp key_down
         jp z,hexeditor_down
         cp key_pgup
         jp z,hexeditor_pgup
         cp key_pgdown
         jp z,hexeditor_pgdown
        ;cp key_home
        ;jp z,hexeditor_home
        ;cp key_sspgup;ext3
        ;jp z,hexeditor_home
        ;cp key_end
        ;jp z,hexeditor_end
        ;cp key_sspgdown;ext4
        ;jp z,hexeditor_end
        cp key_left
        jp z,hexeditor_left
        cp key_right
        jp z,hexeditor_right
         cp key_csenter
         jp z,hexeditor_save
         cp key_F2
         jp z,hexeditor_save
        cp '0'
        ret c
        cp '9'+1
        jr c,hexeditor_symbol
        cp 'a'
        ret c
        cp 'f'+1
        ret nc ;jp c,hexeditor_symbol
        ;ret
hexeditor_symbol
        push af
        call nvhex_calccuraddrline ;addr cur line
        ld de,(hexcuraddrxy)
        ld d,0
        add hl,de ;addrcurline + x(e)
        call ahl_to_pgaddr
        pop af
        ;0   a-10
        cp 'a'
        jr nc,hexeditor_symbol_af
        ld b,-0x30
        jr hexeditor_symbol_pr
hexeditor_symbol_af        
        ld b,-0x61+0x0a;0x56
hexeditor_symbol_pr        
        add a,b
       
hexeditor_half=$
        or a ;/scf
        jr c,hexeditor_symbol_right
        add a,a
        add a,a
        add a,a
        add a,a;a=XXXX0000
        xor (hl)
        and 0xf0
        xor (hl)
        jr hexeditor_symbol_rightq
hexeditor_symbol_right
        xor (hl)
        and 0x0f
        xor (hl)
hexeditor_symbol_rightq
        ld (hl),a
        ld hl,hexeditor_half
        ld a,(hl)
        xor 0x80
        ld (hl),a
        call setchanged
        call nvhex_calccuraddrline ;ahl=addr cur line
        ld de,(hexcuraddrxy)
        ld e,0
        push af
        call nv_setxy ;keeps de,hl,ix
        pop af ;keep ahl!!!
        jp hexeditor_prline

hexeditor_save
        ;ld hl,fcb_filename
        ;ld de,fcb2_filename
        ;call copy_to_defcb_filename
        ;call nv_createfcb2 ;autopush nv_closefcb2
        ;ret nz ;error
        ld de,filenametext
        OS_CREATEHANDLE
        or a
        ret nz ;error
        ld a,b
        ld (curhandle),a
        ld de,(filesize)
        ld hl,(filesizeHSW)
        ld a,0 ;page number
hexeditor_save0
;a=page number in table (0..)
;hlde=remaining size
        push af
        push de
        push hl
        call setpg32k
        ld a,d
        and 0xc0
        or h
        or l
        jr z,$+5 ;de=size
         ld de,0x4000
        ex de,hl ;hl=pg size
        push hl ;hl=pg size
        call cmd_savepage
        pop bc ;bc=pg size
        pop hl
        pop de
        ex de,hl
        or a
        sbc hl,bc
        ex de,hl
        jr nc,$+3
         dec hl ;size = size-pgsize
        ld a,h
        or l
        or d
        or e
        jr z,hexeditor_save_popq
        pop af
        inc a
        jr hexeditor_save0
hexeditor_save_popq
        call nv_closehandle
        call setunchanged
        pop af
        ret

hexeditor_left
        ld de,(hexcuraddrxy)
        ld a,e
        cp 0
        ret z
        dec e
        ld (hexcuraddrxy),de
        ret

hexeditor_right
        ld de,(hexcuraddrxy)
        ld a,e
        cp hexeditor_MAXX
        ret z
        inc e
        push de
        call nvhex_calccuraddrline ;ahl=lineaddr
        pop de
        push af
        ld a,e
        add a,l
        ld l,a
        pop af
        call iseof
        ret nc
        ld (hexcuraddrxy),de
        ret

hexeditor_calccursorxy
        ld de,(hexcuraddrxy)
        ld a,e
        add a,a
        add a,e
        add a,8
        ld e,a
        ret

hexeditor_calctextcursorxy
        ld de,(hexcuraddrxy)
        ld a,e
        add a,57
        ld e,a
        ret ;no ret because panel is empty

hexeditor_panel=nvview_panel
        ;ret

hexeditor_prpage
        ld hl,(hexaddrline)
        ld a,(hexaddrlineHSB)
        ld de,hexeditor_XYTOP
        ;ld b,hexeditor_HGT
        ld bc,(hexedhgt-1) ;b
hexeditor_prpage0
        push bc
        push de
        push af
        call nv_setxy ;keeps de,hl,ix
        pop af
        call hexeditor_prline
        pop de
        pop bc
        inc d
        djnz hexeditor_prpage0
;hexeditor_setbottom
        ;ld (hexaddrline),hl
        ;ld (hexaddrlineHSB),a
        ret

hexeditor_prline
;ahl =  addr line      
        push af
        push hl
        push hl
        call getmaxlinesize ;bc=max line size before eof, z=(bc==0)
        ld hl,16
        call minhl_bc_tobc ;bc = min(16, max line size before eof)
        pop hl
        ;push bc
         ld de,thexedline
        call hexeditor_praddrline
        call ahl_to_pgaddr
         inc de      
        ;pop bc ;bc = min(16, max line size before eof)

         push bc
        push hl
        ld a,c
        or a
        jr z,hexeditor_prlhex0q
        ld b,a
hexeditor_prlhex0
         inc de
        ld a,(hl)
        rrca
        rrca
        rrca
        rrca
        or 0xf0
        daa
        add a,0xa0
        adc a,0x40
         ld (de),a
         inc de
        ld a,(hl)
        or 0xf0
        daa
        add a,0xa0
        adc a,0x40
         ld (de),a
         inc de
        inc  l
        djnz hexeditor_prlhex0
hexeditor_prlhex0q
        ld a,16
        sub c
        jp z,hexeditor_prlhex1q
        ld b,a
         ld a,' '
hexeditor_prlhex1
         inc de
         ld (de),a
         inc de
         ld (de),a
         inc de
        djnz hexeditor_prlhex1
hexeditor_prlhex1q

        pop hl
         inc de
         inc de
        ld a,c
        or a
        jr z,hexeditor_prlsym0q
        ld b,a
hexeditor_prlsym0
        ld a,(hl)
        cp 32
        jr nc,$+4
          ld a,'.'
         ld (de),a
         inc de
        inc  l
        djnz hexeditor_prlsym0
hexeditor_prlsym0q
        ld a,16
        sub c
        jp z,hexeditor_prlsym1q
        ld b,a
         ld a,' '
hexeditor_prlsym1
         ld (de),a
         inc de
        djnz hexeditor_prlsym1
hexeditor_prlsym1q
         ld de,thexedline
         ld hl,80
         call sendchars
         pop bc ;bc=bytes shown in line
        pop hl
        pop af
        ;ld b,0
        add hl,bc
        adc a,b
        ret

hexeditor_praddrline
;ahl = addr line
        push af
        call hexeditor_prNN
        ld a,h
        call hexeditor_prNN      
        ld a,l        
        call hexeditor_prNN
        pop af
        ret

hexeditor_prNN
;#30 - 0,1,2..9 #41 - A,B,C,D,E,F #61 - a,b,c..
;a=XX
        push af
        rrca
        rrca
        rrca
        rrca
        or 0xf0
        daa
        add a,0xa0
        adc a,0x40
         ld (de),a
         inc de
        pop af
        or 0xf0
        daa
        add a,0xa0
        adc a,0x40
         ld (de),a
         inc de
        ret

thexedline
        db "000000: 00 00 00 00 00 00 00 00|00 00 00 00 00 00 00 00  ................       "

hexeditor_prevline
;ahl =addr line  
;out: ahl =addr line, NC=error      
        call isbof ;CY=0
        ret z ;NC
        push bc
        ld bc,0x0010
        or a
        sbc hl,bc
        sbc a,b
        scf
        pop bc
        ret ;CY

        if 1==0
hexeditor_nextline
        call iseof
        ret nc
        push bc
        ld bc,0x0010
        add hl,bc
        adc a,b
        pop bc
        ret
        endif

hexeditor_pgup
        call nvhex_calccuraddrline
        ld de,(hexcuraddrxy)
        ld c,a
        ld a,d
        or a
        ld a,c
        jr nz,hexeditor_pgupq
        ;ld b,hexeditor_HGT-1
        ld bc,(hexedhgt-1) ;b
        dec b
hexeditor_pgup0
        push bc
        call hexeditor_prevline
        pop bc
        djnz hexeditor_pgup0
        ld (hexaddrline),hl
        ld (hexaddrlineHSB),a
        call hexeditor_prpage
        jp clear_keyboardbuffer
hexeditor_pgupq
        ld d,0
        ld (hexcuraddrxy),de
        ret

hexeditor_pgdown
        call nvhex_calccuraddrline
        ld de,(hexcuraddrxy)
        ld c,a
        ;ld a,hexeditor_HGT-1
        ld a,(hexedhgt)
        dec a
        cp d
        ld a,c
        jr z,hexeditor_pgdown_do
hexeditor_pgdown0
        ld c,a
        ;ld a,hexeditor_HGT-1
        ld a,(hexedhgt)
        dec a
        cp d
        ld a,c
        jr z,hexeditor_pgdownq
        call nvhex_calcnextcorrectxy
        jr c,hexeditor_pgdown0
hexeditor_pgdownq
        ld (hexcuraddrxy),de
        ret
hexeditor_pgdown_do
        ld (hexaddrline),hl
        ld (hexaddrlineHSB),a
        push de
        call hexeditor_prpage
        pop de
        ld hl,(hexaddrline)
        ld a,(hexaddrlineHSB)
        ld d,0
hexeditor_pgdown_do0
        ld c,a
        ;ld a,hexeditor_HGT-1
        ld a,(hexedhgt)
        dec a
        cp d
        ld a,c
        jr z,hexeditor_pgdown_doq
        call nvhex_calcnextcorrectxy
        jr c,hexeditor_pgdown_do0
hexeditor_pgdown_doq
        ld (hexcuraddrxy),de
        jp clear_keyboardbuffer

hexeditor_up
        call nvhex_calccuraddrline
        call hexeditor_prevline
        ret nc ;bof
        ld de,(hexcuraddrxy)
        ld a,d
        or a
        jr z,hexeditor_up_scroll
        dec d
        ld (hexcuraddrxy),de
        ret
hexeditor_up_scroll        
        ld de,hexeditor_XYTOP
        ;ld hl,256*hexeditor_HGT + hexeditor_WID
        ld hl,(hexedhgt-1) ;h
        ld l,hexeditor_WID
       if PRSTDIO
        call scrolldown
       else
        OS_SCROLLDOWN
       endif
        ld de,hexeditor_XYTOP
        call nv_setxy ;keeps de,hl,ix
        ld hl,(hexaddrline)
        ld a,(hexaddrlineHSB)
        call hexeditor_prevline
        ld (hexaddrline),hl
        ld (hexaddrlineHSB),a
        jp hexeditor_prline

hexeditor_down
        call nvhex_calccuraddrline
        ld de,(hexcuraddrxy)
        call nvhex_calcnextcorrectxy
        ret nc
        ld c,a
        ;ld a,hexeditor_HGT;-1
        ld a,(hexedhgt)
        ;dec a
        cp d
        ld a,c
        jr z,hexeditor_down_scroll
        ld (hexcuraddrxy),de
        ret
hexeditor_down_scroll
        ;ld hl,(hexaddrline)
        ;ld a,(hexaddrlineHSB)
        ;ld bc,hexeditor_PAGESIZE
        ;add hl,bc
        ;adc a,0
        push af
        push hl
        ld a,e
        ld (hexcuraddrx),a
        ld de,hexeditor_XYTOP
        ;ld hl,256*hexeditor_HGT + hexeditor_WID
        ld hl,(hexedhgt-1) ;h
        ld l,hexeditor_WID
       push de
       push hl
       if PRSTDIO
        call scrollup
       else
        OS_SCROLLUP
       endif
        ;ld de,hexeditor_XYTOP+((hexeditor_HGT-1)*256)
       pop hl
       pop de
        dec h
        ld l,0
        add hl,de
        ex de,hl ;de=hexeditor_XYTOP+((hexeditor_HGT-1)*256)
        call nv_setxy ;keeps de,hl,ix
        ld hl,(hexaddrline)
        ld a,(hexaddrlineHSB)
        ld bc,16
        add hl,bc
        adc a,b;0
        ld (hexaddrline),hl
        ld (hexaddrlineHSB),a
        pop hl
        pop af
        jp hexeditor_prline

nvhex_calccuraddrline
;out: ahl = addr cur line
        ld hl,(hexaddrline)
        ld a,(hexaddrlineHSB)
        ld de,(hexcuraddrxy)
        ld e,0
        srl d
        rr e
        srl d
        rr e
        srl d
        rr e
        srl d
        rr e
        add hl,de       ;hl+d*16
        adc a,0
        ret

nvhex_calcnextcorrectxy
;ahl=line addr, de=yx
;out:ahl=line addr, de=yx, NC=error
        ld bc,16
        add hl,bc
        adc a,b
        call iseof
        jr nc,nvhex_calcnextcorrectxy_error
        inc d
        ld c,e
        ld b,0
        push hl
        add hl,bc
        call iseof
        pop hl
        ret c
        push af
        ld a,(filesize)
        dec a
        and 0x0f
        ld e,a
        pop af
        scf
        ret ;CY
nvhex_calcnextcorrectxy_error
        call hexeditor_prevline
        or a
        ret ;NC
       
hexcuraddrxy
hexcuraddrx
        db 0
hexcuraddry
        db 0

hexaddrline
        dw 0
hexaddrlineHSB
        db 0