Login

Subversion Repositories NedoOS

Rev

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


depack        
;       JR NOSTART_
;START_
;YESAUTOEX=$+1
;       LD A,0
;       CP "U
;       JP Z,QUIT_
;NOSTART_
        LD (exit_sp),SP
START_1
        ;LD SP,#5FE6
        if 1==0
        LD HL,ANYKEY_P
        LD (MOD1+1),HL
        LD A,#C3
        LD HL,START_
        LD (MOD2),A
        LD (MOD2+1),HL
        LD HL,SPISOK+1
        LD (UKAZ1),HL
        ;XOR A
        ;LD (NO_HOB),A
        ;LD (HOB),A
        LD HL,T_KEY
        LD (MODECAT+1),HL
        CALL PRCAT

        LD A,#4F
        LD (TEKATR+1),A
        LD HL,0
        LD DE,#440
        CALL RAMKA
        LD HL,T6935
        CALL PRINTS_
        LD HL,T6935_
        CALL PRINTS_
        endif
       
;MANYF   LD HL,0
;        LD (ML_FLEN),HL
;        LD (ML_FLEN+1),HL
        ;CALL CLS_LINE
       if READZIPDIR
        ;jr $
        CALL PROWERKA ;ищем central directory, достаём таблицу файлов в CAT, заполняем переменные про файл
       
        if 1==0
        LD A,(SKIPING)
        OR A
        JR Z,NOSKIP1
        LD HL,T_KEY1
        LD (MODECAT+1),HL
        CALL VIEWCAT
        LD A,#4F
        LD (TEKATR+1),A
        LD HL,0
        LD DE,#440
        CALL RAMKA
        LD HL,T6935
        CALL PRINTS_
        LD HL,T6935_
        CALL PRINTS_
        LD HL,#400
        LD DE,#C40
        CALL RAMKA
NOSKIP1
        endif
       
        ;LD A,1
        ;LD (D_INST),A ;это было для инициализации TR-DOS после смены диска

        LD DE,0
LEN_KOM=$-2
        LD A,D
        OR E
        JR Z,PR700
        LD HL,#4000
        OR A
        SBC HL,DE
        JR C,PR700 ;комментарий > 0x4000?
        EX DE,HL
        LD DE,0 ;size of central directory
SM1=$-2
       if SEEK32BIT
        LD HL,(SME_ML) ;start of central directory
        ADD HL,DE
       push hl
        LD bc,0
SM2w=$-2
        LD hl,(SME_STw)
        ADC hl,bc
        ld b,h
        ld c,l
       pop hl
        LD DE,#16
        ADD HL,DE
        jr nc,$+3
        inc bc
;bchl=position in file
       else
        LD C,0
SM2=$-1
        LD HL,(SME_ML) ;start of central directory
        LD A,(SME_ST)
        ADD HL,DE
        ADC A,C
        LD DE,#16
       LD C,0
        ADD HL,DE
        ADC A,C
;ahl=position in file
       endif
        LD IX,BUFER
        LD DE,(LEN_KOM) ;комментарий может быть до 0x4000 (реально формат позволяет больше)
        CALL READ

        ;LD HL,TEXT20
        ;CALL PRINTS_
       endif

        if 1==0
        LD A,0
MEN=$-1
        OR A
        JR Z,NM1
        CALL INS_DEST

NM1     LD A,(DESTIN)
        CP "*"
        JR NZ,$+5
        LD A,(SOURCE)
        SUB #41
        LD C,1
        CALL TRDOS
        LD C,#18
        CALL TRDOS
        LD HL,FNAME1
        LD DE,23773
        LD BC,9
        LDIR
        LD HL,BUFER
        LD DE,(LEN_KOM)
        LD C,#B
        CALL TRDOS
        LD A,(MEN)
        OR A
       JR Z,PR700
       CALL INS_SOURC
        endif
PR700  
        ;LD HL,TEXT21
        ;CALL PRINTS_
       
        LD HL,0
KOL_F=$-2
        ;XOR A
        ;LD IX,T_BUF
        ;CALL DS100
        ;LD HL,T_KOL_F
        ;CALL PRINTS_

nextfile
           ;LD A,5
           ;call ON_BANK
       
        LD HL,0 ;start of central directory (сделал, чтобы он обновлялся с каждым новым файлом)
SME_ML=$-2
       if SEEK32BIT
        LD bc,0
SME_STw=$-2
;bchl=position in file
       else
        LD A,0
SME_ST=$-1
;ahl=position in file
       endif
        ;EXA

        if 1==0
        LD BC,(KOL_F)
        LD A,C
        LD (F_KOL),A
Z6013   PUSH BC
        LD A,0
F_KOL=$-1
        SUB C

        INC A
        LD (NUM_F),A ;номер файла
        endif
       
        if 1==0
        PUSH HL
        LD HL,#71A ;координаты
        LD (COR),HL
        LD B,13
CLS1    PUSH BC
        LD A,#20
        CALL PR
        POP BC
        DJNZ CLS1
        POP HL
        endif

       if SEEK32BIT
;bchl=position in file
       else
        ;EXA
        LD B,A ;SME_ST
;ahl=position in file
       endif

;куда сейчас указывает указатель в архиве?
;с READZIPDIR на начало директории
;без READZIPDIR на 0
        ;jr $
        LD IX,BUFER
        LD DE,#2E
        ;LD C,41 ;???
        CALL READ ;читаем описатель одного файла

        if 1==0
        EXX
        LD A,(BUFER+#24)
        LD HL,CODE
       BIT 0,A
       JR Z,LL20
        LD HL,TEXT
LL20    LD DE,T_TYPE
        LD BC,4
        LDIR
        EXX
        endif

       if SEEK32BIT
        ADD HL,DE
        jr nc,$+3
        inc bc
;bchl=position in file
       else
        LD A,B ;SME_ST на начало описателя
        ADD HL,DE ;de=0x002e
        ADC A,D;=0 ;перемещаем указатель на имя
;ahl=position in file
        LD B,A
       endif

        LD DE,(Z6638) ;file name length
        LD IX,Z664A
        CALL READ ;читаем имя файла
;Z664A=ИMЯ TEKУЩEГO ФAЙЛА B APXИBE
        ADD IX,DE
        LD (IX),0 ;кладём 0 в конец имени (получится ASCIIZ)

       if SEEK32BIT
        ADD HL,DE
        jr nc,$+3
        inc bc
;bchl=position in file
       else
        LD A,B
        ADD HL,DE
        ADC A,0 ;перемещаем указатель после имени
;ahl=position in file
       endif

       if 0 ;???
        LD B,E
       DEC D
       INC D
        JR Z,Z604D ;длина имени <256
       LD B,0 ;длина имени >=256, считаем, что 256
Z604D
       endif
        LD DE,(Z663A) ;extra field length
        ADD HL,DE ;пропускаем extra field
       if SEEK32BIT
        jr nc,$+3
        inc bc
;bchl=position in file
       else
       ADC A,0
;ahl=position in file
       endif
        LD DE,(Z663C) ;file comment length
        ADD HL,DE ;пропускаем file comment length
       if SEEK32BIT
        jr nc,$+3
        inc bc
;bchl=position in file
       else
       ADC A,0
;ahl=position in file
       endif

       ld (SME_ML),hl
       if SEEK32BIT
       ld (SME_STw),bc
       else
       ld (SME_ST),a
       endif
       
;сформировать filename 8.3 (во всех элементах):
        ld hl,Z664A
        ld de,filename
        ;call strcopy
        call copyname83
; если это директория, то create directory (например, "md scr/1" без слеша в конце):
; это только для пустых директорий! nedoos-1.zip не содержит записи о директориях с файлами (в отличие от .tar)

        ;LD A,(T6624) ;flags
        ;and 8 ;TODO где этот флаг?
        ;jr nz,readzip_nodir
;убираем слеш в конце
        ld hl,filename
        push hl
        pop de ;ld de,filename
        xor a
        ld b,-1
        cpir
        ld a,'/'
        dec hl ;на терминаторе
        dec hl ;перед терминатором
        sub (hl)
        jr nz,readzip_nodir;$+3
        ld (hl),a ;0
        OS_MKDIR
        jp SKIP_noclose
readzip_nodir
       
        ld hl,Z664A;filename
        call prtext
        call prcrlf
       
        if 1==0
       
        LD HL,#5CE5
        LD DE,T_PKT
        LD B,3
        CALL PROVERK
        JR C,NX600
        LD A,"C"
        LD (#5CE5),A
        LD A,(#5CDD)
        CP "0"
        JR C,$+6
        CP ":"
        JR NC,NX600
        AND 7
        OR #30
        LD (#5CDD),A
NX600
        endif
       
        if 1==0
        LD A,(SKIPING)
       OR A
        JR Z,NOSKIP
       LD A,(NUM_F)
       LD L,A
        LD H,MARKBUF/256
       LD A,(HL)
       AND A
        JP Z,SKIP_noclose
NOSKIP  
        endif
        if 1==0
        LD IX,T_TEK
        LD HL,0
NUM_F=$-2
        CALL DS100
        LD HL,T_FILE
        CALL PRINTS_
        endif

        ;LD HL,#71A ;координаты
        ;LD (COR),HL
        ;LD HL,T61F7
        ;CALL PRINTS
        ;LD A,#4F
        ;LD (TEKATR+1),A
       
        ;XOR A

        LD HL,-1
        LD (ML_CRC32),HL
        LD (ST_CRC32),HL

        LD HL,(Z6634) ;внутри BUFER
        ;OR H
        ;OR L
        LD (ML_LEN_ISH),HL

;HL= МЛАДШИE БAЙTЫ ДЛИHЫ ИCXOДHOГO ФAЙЛA
        LD HL,(Z6636) ;внутри BUFER
        ;OR H
        ;OR L
        LD (ST_LEN_ISH),HL

;HL= CTAPШИE БAЙТЫ ДЛИНЫ ИCXOДHOГO ФAЙЛA
        ;JP Z,SKIP_noclose; HУЛЕВАЯ ДЛИHA (теперь проверяется ниже, чтобы создать файл)

        ;LD A,L
        ;LD HL,(ML_LEN_ISH)
        ;LD IX,T_ORIG
        ;CALL DES_

        LD HL,T6628 ;file last modification time ;внутри BUFER
        LD DE,T6221
        LD BC,8
        LDIR ;??? TODO установить дату после распаковки

        LD A,(T6624) ;flags ;внутри BUFER
        RRA
        JR NC,Z60E3

;ФAЙЛ 3AKOДИPOBAH
        LD A,3
        LD (FLAGS),A ;CRYPTED

Z60E3   LD HL,(T6626) ;внутри BUFER

;T6626=METOД CЖATИЯ: 0:STORED, 8:DEFLATE, others unknown
        LD A,H
        OR A
        JR NZ,Z60F1
        OR L
        JR Z,Z60FC
        CP 8
        JR Z,Z60FC

Z60F1   ;LD HL,UNKNOWN
        ;LD DE,T_METOD
        ;LD BC,7
        ;LDIR
        LD A,2
        LD (FLAGS),A ;UNKNOWN (число в A не должно совпадать с 0 или 8!)
        ;JR UNK_

Z60FC  
        if 1==0
        BIT 3,A
        LD HL,STORED
        JR Z,ST_
        LD HL,DEFLATE
ST_     LD DE,T_METOD
        LD BC,7
        LDIR
        endif

UNK_    PUSH AF ;0:STORED, 8:DEFLATE, others unknown ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        ;LD HL,(Z6630)
        ;LD A,(Z6632)

;A,HL= ДЛИHA CЖATOГO ФAЙЛА
        ;LD (ML_PAC_LEN),HL
        ;LD (ST_PAC_LEN),A
       
        if 1==0
        LD IX,T_PACK
        CALL DES_
        LD B,4
        LD HL,CRC_ISH+3
        LD DE,T_CRC
L100    LD A,(HL)
        CALL HEX
        DEC HL
        DJNZ L100

        CALL T_IND ;инициализация процентомера?

        LD HL,0 ;текущий размер файла для процентомера
        LD (B1),HL
        LD (B2),HL
        endif

        ;CALL DATA_COR ;печать даты?

        ;LD HL,T_PACK_L
        ;CALL PRINTS_

FLAGS=$+1
        LD A,0;(FLAGS) ;2:UNKNOWN, 3:CRYPTED, other=OK (формируется выше)
        ;LD HL,T_UNK
        CP 2
        JR Z,SK__

        ;LD HL,T_CRYPT
        CP 3;:JR Z,SK__

;LD A,(SKIPING):OR A;JR Z,PROD10
        JR NZ,PROD10
SK__    ;CALL PRINTS_
        ;CALL KEY10_
        POP AF ;TODO убрать
        JP SKIP_noclose

PROD10  
        if 1==0
        LD HL,#5CE5
        LD DE,T_TRD
        LD B,3
        CALL PROVERK

        JR C,NXSCL
        LD HL,TRDOBR
        CALL PRINTS_

KEY11   XOR A
       LD (#5C08),A
        EI
        HALT
       LD A,(#5C08)
       OR A
        JR Z,KEY11
        CP "Y"
        JR Z,nX601_
        CP 13
       JR NZ,NX601
nX601_
        XOR A
        LD (MEN),A
        LD A,(DESTIN)
        CP "*"
        JR Z,MEN100
       LD A,(DESTIN)
       LD L,A
        LD A,(SOURCE)
       CP L
        JR NZ,MEN100
       LD A,1
        LD (MEN),A
MEN100
        LD A,#C3
        LD (SAVE),A
        LD HL,SAVETRD
        LD (SAVE+1),HL
        LD HL,0
        LD (TRK_SECT),HL

        JR NX602
NXSCL
        LD HL,#5CE5
        LD DE,T_SCL
        LD B,3
        CALL PROVERK

        JR C,NX601
;EXTRACTING FROM SCL

       IF 1==1
        LD HL,SCLOBR
        CALL PRINTS_

KEY11S  XOR A
       LD (#5C08),A
        EI
        HALT
       LD A,(#5C08)
       OR A
        JR Z,KEY11S
        CP "Y"
        JR Z,nX601_S
        CP 13
       JR NZ,NX601
nX601_S
        LD A,"S"
        LD (YESSCL),A
       ELSE
       LD A,#C3
       LD (SAVE),A
       LD HL,SAVESCL
       LD (SAVE+1),HL
       LD HL,0
       LD (TRK_SECT),HL
       JR NX602
       ENDIF
       
;NORMAL FILE (NOT TRD OR SCL)
NX601   LD A,#3E
        LD (SAVE),A
        LD HL,#CD04
        LD (SAVE+1),HL

       endif
       
        if 1==0
        LD A,(ST_LEN_ISH)
        OR A
        JR NZ,NX602
        LD HL,(ML_LEN_ISH)
       LD DE,#FF12
       OR A
       SBC HL,DE
        JR NC,NX602
        LD A,(#5CE5)
        CP "$"
        JR NZ,NX602
        LD (HOB),A
NX602  
        endif

        LD HL,(Z6646) ;Relative offset of local file header. This is the number of bytes between the start of the first disk on which the file occurs, and the start of the local file header. This allows software reading the central directory to locate the position of the file inside the ZIP file.
       if SEEK32BIT
        LD bc,(Z6648)
;bchl=position in file
       else
        LD A,(Z6648)
;ahl=position in file
       endif
        ;jr $

;position in file = CMEЩEHИE ДO ЛOKAЛЬНOГO 3AГОЛОBKA
        LD IX,BUFER
        LD DE,#1E
       if SEEK32BIT
       else
        ;LD C,#29 ;???
        LD B,A
       endif
        CALL READ

       if SEEK32BIT
        ADD HL,DE
        jr nc,$+3
        inc bc
       else
        XOR A
        ADD HL,DE
        ADC A,B
       endif
        LD DE,(Z6636)
;DE= ДЛИНA ИMEHИ ФAЙЛA
        ADD HL,DE
       if SEEK32BIT
        jr nc,$+3
        inc bc
       else
        ADC A,0
       endif
        LD DE,(Z6638)
;DE= ДOПOЛHИTEЛЬНOE ПOЛE ДЛИНЫ
        ADD HL,DE
       if SEEK32BIT
        jr nc,$+3
        inc bc
       else
        ADC A,0
       endif
        ;LD (Z634C),HL ;текущая позиция чтения в файле
        ;LD (Z634F),A;bc

;теперь физически установим указатель файла туда
       if SEEK32BIT
        ld d,b
        ld e,c
       else
        ld d,0
        ld e,a
       endif
        ;dehl=shift
        ld a,(filehandle)
        ld b,a
        OS_SEEKHANDLE
       
        call SAVECREATE

        LD hl,(ML_LEN_ISH)
        ld a,h
        or l
        LD hl,(ST_LEN_ISH)
        or h
        or l
        jr z,SKIP ;файл нулевой длины
       
       LD IY,DISKBUF+DISKBUFsz-1
       
        ;LD HL,0
        ;LD (T622D),HL
        ;LD (T622E),HL
       
;DEPACK
       LD HL,0
       LD (U6546),HL ;сколько байт сохранить = текущий адрес в буфере
       
        POP BC ;0:STORED, 8:DEFLATE, others unknown ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
       
        BIT 3,B
        ;LD (inflateq_sp),SP ;??? TODO
        CALL Z635E ;nz=INFLATING
       ;LD A,(YESSCL)
       ;CP "S
       ;CALL Z,DESCLPP
       ; XOR A
       ;LD (YESSCL),A
        ;LD (NO_HOB),A
        ;LD (HOB),A
        LD A,(CRC32_)
        CP #C9
        JR Z,SKIP
        LD HL,ML_CRC32
        LD DE,CRC_ISH
        LD B,4
Z6159   LD A,(DE)
        XOR (HL)
        INC HL
        inc DE
        inc A
C1      JR NZ,crcerror;Z6164
        DJNZ Z6159
        JR SKIP

crcerror;Z6164
;CRC ERROR
        ;CALL E_CRC ;!!!!!!!!!!
        ld hl,tcrcerror
        call prtext

SKIP
readerror
        call SAVECLOSE
SKIP_noclose
        ld bc,(KOL_F)
        cpi
        ld (KOL_F),bc
        ld sp,(exit_sp)
        jp pe,nextfile

E_ZIP
EXIT
exit_sp=$+1
        LD SP,#3131
         ret

BUFCAT
        dw 0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

       if READZIPDIR
PROWERKA
        if 1==0
        LD A,#4F
        LD (TEKATR+1),A
        LD HL,#400
        LD DE,#C40
        CALL RAMKA

        LD HL,FNAME
        LD DE,T6927
        LD BC,8
        LDIR
        LD A,"."
        LD (DE),A
        INC DE
        LDI
        LD A,(HL)
        CP #20
        JR C,NOEXN
        INC HL
        LD A,(HL)
        DEC HL
        CP #20
        JR C,NOEXN
        LDI
        LDI
        JR NOEXN+5
NOEXN   LD A,#20
        LD (DE),A
        INC DE
        LD (DE),A

        LD HL,FNAME
        LD DE,N_ARC
        LD BC,8
        LDIR
       LD A,"."
       LD (DE),A
       INC DE
       LDI
       LD A,(HL)
       CP #20
       JR C,NOEHN
       INC HL
       LD A,(HL)
       DEC HL
       CP #20
       JR C,NOEHN
       LDI
       LDI
       JR NOEHN+5
NOEHN  LD A,#20
       LD (DE),A
       INC DE
       LD (DE),A

        LD HL,T6918
        CALL PRINTS_
       
        endif
       
        ;CALL F_OPEN
        LD HL,CAT
        LD DE,CAT+1
        LD BC,#63F
        LD (HL),0
        LDIR ;TODO убрать
        LD HL,CAT
        LD (BUFCAT),HL

;ПPOBEPKA APXИBA

;каталог лежит в конце файла, как до него добраться?

;Z66FA
;a=??? после F_OPEN (!=0 разрешает искать назад -0x800 даже в маленьком файле любого размера) TODO
       if SEEK32BIT
        LD bc,(ST_FLENw)
       else
        LD A,(ST_FLEN)
       endif
        LD HL,(ML_FLEN) ;ahl(bchl)=длина файла
        LD DE,#800
       if SEEK32BIT
         ld a,b
         or c
       else
         OR A
       endif
         JR NZ,Z6727 ;длина файла >=0x10000
        LD A,H
        CP 8
       if SEEK32BIT
       else
        LD A,E;0
       endif
        JR NC,Z6727 ;длина файла >=0x800, так что начнём поиск с длина файла-0x800
       if SEEK32BIT
        xor a
       endif
        OR H
        JR NZ,Z6714
;длина файла < 0x100
        LD A,L
        CP #64
        jp C,Z6780 ;длина файла < 0x64 - нет ни одного файла, ошибка
Z6714   PUSH HL
        XOR A
        LD HL,BUFER
        LD DE,BUFER+1
        LD (HL),A
        LD BC,#7FF
        LDIR ;очистили буфер, чтобы случайно не найти end of central directory не там
        POP DE
Z6723 ;ищем в начале файла
        LD L,A
        LD H,A
       if SEEK32BIT
        ld c,a
        ld b,a
       endif
        JR _Z672A

Z6727   SBC HL,DE
       if SEEK32BIT
        jr nc,$+3
        dec bc
       else
        SBC A,E ;=0
       endif

_Z672A
       if SEEK32BIT
       else
        LD B,A
       endif      
        LD IX,BUFER
        ;de=0x800
        CALL LOAD_B ;поиск блока end of central directory
       if SEEK32BIT
        JR Z,Z6747 ;end of central directory
        ld a,b
        or c
        OR L
        OR H
        JR Z,Z6780 ;дошли до начала файла, а end of central directory не нашли
        push bc ;de занято
        LD BC,#7EA ;смещаем указатель файла назад почти на 0x800
        SBC HL,BC
        pop bc
        jr nc,_Z672A ;ищем назад
        ld a,c
        sbc a,0
        ld c,a
        ld a,b
        sbc a,0
        ld b,a
        JR NC,_Z672A ;ищем назад
        XOR A
        JR Z6723 ;ищем в начале файла
       else
        LD A,B
        JR Z,Z6747 ;end of central directory
        OR L
        OR H
        JR Z,Z6780 ;дошли до начала файла, а end of central directory не нашли
        LD A,B
        LD BC,#7EA ;смещаем указатель файла назад почти на 0x800
        SBC HL,BC
        SBC A,0
        JR NC,_Z672A ;ищем назад
        XOR A
        JR Z6723 ;ищем в начале файла
       endif      

Z6747
;нашли end of central directory (ix = адрес этого блока в BUFER+)
       if SEEK32BIT
        push ix
        pop de
        ADD HL,de
        jr nc,$+3
        inc bc
        or a
        LD de,BUFER
        SBC HL,de
        jr nc,$+3
        dec bc
       else
        PUSH IX
        POP BC
        ADD HL,BC
       ADC A,0
        LD BC,BUFER
        SBC HL,BC
       SBC A,0 ;ahl=смещение end of central directory в файле
       endif
        LD (Z6896),HL ;текущее смещение в файле?
       if SEEK32BIT
        LD (Z6894w),bc
       else
        LD (Z6894),A
        EX DE,HL ;de=текущее смещение в файле?
       endif
        LD H,(IX+#11)
        LD L,(IX+#10) ;offset of start of central directory

;МЛАДШИЕ БAЙTЫ CMEЩEHИЯ HAЧAЛА ЦEHTPAЛЬHOГO KATAЛOГA
        LD (SME_ML),HL
       if SEEK32BIT
       else
        LD (IX+2),A ;???
       endif

;CTAPШИЙ БAЙT CMEЩЕНИЯ
       if SEEK32BIT
        LD c,(IX+#12) ;offset of start of central directory HSB
        LD b,(IX+#13)
        LD (SME_STw),bc
       else
        LD A,(IX+#12) ;offset of start of central directory HSB
        LD (SME_ST),A
       endif
       if SEEK32BIT
        LD d,(IX+#D)
        LD e,(IX+#C)
        LD (SM1),de ;size of central directory
;de=ДЛИНA ЦEHTPAЛЬHOЙ ДИPEKTOPИИ, МЛАДШИЕ БAЙТЫ
        add hl,de
        ld a,c
        adc a,(ix+#e)
        ld c,a
        ld a,b
        adc a,(ix+#f)
        ld b,a
        ld de,(Z6896) ;de=текущее смещение в файле?
        sbc hl,de
        JR NZ,Z6780 ;конец central directory не соответствует смещению блока end of central directory - ошибка
        ld hl,(Z6894w) ;текущее смещение в файле HSW?
        sbc hl,bc
        JR Z,Z6783 ;конец central directory соответствует смещению блока end of central directory
Z6780  JP ERR_Z1 ;дошли до начала файла, а end of central directory не нашли
       else
        LD B,(IX+#D)
        LD C,(IX+#C)
        LD (SM1),BC ;size of central directory
;BC=ДЛИНA ЦEHTPAЛЬHOЙ ДИPEKTOPИИ, МЛАДШИЕ БAЙТЫ
        ADD HL,BC
        ADC A,(IX+#E) ;size of central directory HSB
        XOR (IX+2) ;???
        JR NZ,Z6780 ;конец central directory не соответствует смещению блока end of central directory - ошибка
        SBC HL,DE ;de=текущее смещение в файле?
        JR Z,Z6783 ;конец central directory соответствует смещению блока end of central directory
Z6780  JP ERR_Z1 ;дошли до начала файла, а end of central directory не нашли
       endif

Z6783   LD L,(IX+#14)
        LD H,(IX+#15)
        LD (LEN_KOM),HL

       if SEEK32BIT
        LD c,(IX+#E)
        LD b,(IX+#F)
        LD (SM2w),bc ;size of central directory HSW
       else
        LD A,(IX+#E)
        LD (SM2),A ;size of central directory HSB
       endif

        LD e,(IX+#A)
        LD d,(IX+#B)
        LD H,(IX+9)
        LD L,(IX+8)
;cy=0
;de=ОБЩEE ЧИСЛO ФAЙЛОB B APXИBE
;HL=ЧИСЛО 3AПИCEЙ B KATAЛOГE HA ЭTOM ДИCKE
        LD (KOL_F),HL
        SBC HL,de
        JP NZ,ERR_Z2
        LD HL,(SME_ML) ;start of central directory
       if SEEK32BIT
        LD bc,(SME_STw)
       else
        LD A,(SME_ST)
        EXA
       endif
Z679E   PUSH de ;ОБЩEE ЧИСЛO ФAЙЛОB B APXИBE
       if SEEK32BIT
       else
        EXA
        LD B,A
       endif
        LD A,1 ;тип сигнатуры
        LD DE,#2E
        LD IX,BUFER
        CALL Z6886 ;читаем блок и проверяем сигнатуру (выход по ошибке - ERR_Z1)

        LD A,(IX+#1D) ;A= старШИЙ БAЙT ДЛИНЫ ИMEHИ ФAЙЛА
        CP 2
        JP NC,ERR_Z3
        LD D,A
        LD E,(IX+#1C) ;DE=ДЛИНА ИMEHИ ФAЙЛА
        CALL Z68D9 ;сдвинуть указатель в файле bhl(bchl) на de байт и проверить, что не вышли за границу файла?
        LD D,(IX+#1F)
        LD E,(IX+#1E) ;DE=ДOПOЛНИTEЛЬHOE ПОЛE ДЛИHЫ
        CALL Z68D9 ;сдвинуть указатель в файле bhl(bchl) на de байт и проверить, что не вышли за границу файла?
        LD D,(IX+#21)
        LD E,(IX+#20) ;DE=ДЛИHA KOMEHTAPИЯ K ФAЙЛУ
        CALL Z68D9 ;сдвинуть указатель в файле bhl(bchl) на de байт и проверить, что не вышли за границу файла?
       PUSH BC
       push HL
       if SEEK32BIT
        LD c,(IX+#2c)
        LD b,(IX+#2d)
       else
        LD B,(IX+#2C)
       endif
        LD L,(IX+#2A)
        LD H,(IX+#2B)
;bhl(bchl)=CMEЩEHИE OT HAЧAЛA ПEPBOГO ДИCKA C ЭTИM ФAЙЛOM
;     ДO ЛОКАЛЬHOГO 3AГOЛOBKA.
        INC IX
        inc IX
        inc HX
        LD A,3 ;тип сигнатуры
        LD DE,#30
        CALL Z68B1 ;сдвигаем указатель bhl(bchl) на de байт, читаем и проверяем сигнатуру?
        PUSH IX
        POP HL
        LD DE,#1E
        ADD HL,DE
        LD (NAMEF3+1),HL
        LD E,(IX+#1A)
        LD D,(IX+#1B)
        ADD HL,DE
        LD DE,(BUFCAT)
         PUSH DE
         push DE
        LD A," "
        LD B,11
        LD (DE),A
        INC DE
        DJNZ $-2
NAMEF3  LD DE,0
NAMEF4  DEC HL
        PUSH HL
        AND A
        SBC HL,DE
        POP HL
       JR NC,NAMEF5
       EX DE,HL
       DEC HL
       JR NAMEF6

NAMEF5  LD A,(HL)
        CP "/"
        JR NZ,NAMEF4
NAMEF6   POP DE
        INC HL
        LD B,8
NAMEF2  LD A,(HL)
        INC HL
        CP "."
        JR Z,NAMEF1
        LD (DE),A
        INC DE
        DJNZ NAMEF2
        LD A,(HL)
        INC HL
        CP "."
        JR NZ,$-4
NAMEF1   POP DE
        LD B,8
        INC DE
        DJNZ $-1
       LD BC,3
        LDIR
        LD A,(IX+#16) ;uncompressed size
        LD (DE),A
        INC DE
        LD A,(IX+#17)
        LD (DE),A
        INC DE
        LD A,(IX+#18) ;FIXME для 32bit длины файла
        LD (DE),A
        INC DE
        inc DE
        inc DE
        EX DE,HL
        ;LD (BUFCAT),HL
        LD HL,#1E
        LD A,(IX+#1B) ;A=СТАРШИЙ БAЙT ДЛИHЫ имени ФAЙЛА
        CP 2
        JP NC,ERR_Z3
        LD D,A
        LD E,(IX+#1A) ;DE=ДЛИHA имени ФAЙЛА
        CALL Z68ED ;сдвинуть указатель в файле bhl(bchl) на de байт и проверить, что не вышли за границу файла?
        LD D,(IX+#1D)
        LD E,(IX+#1C) ;DE=extra field len
        CALL Z68ED ;сдвинуть указатель в файле bhl(bchl) на de байт и проверить, что не вышли за границу файла?
        LD D,(IX+#13)
        LD E,(IX+#12)
       if SEEK32BIT
        LD A,(IX+#15)
        ld (Z68EEhswb),a
       endif
        LD A,(IX+#14) ;<Z68EEhswb>A,DE=ДЛИHA CЖATOГO ФAЙЛA
        CALL Z68EE ;сдвинуть указатель в файле bhl(bchl) на <Z68EEhswb>ade байт и проверить, что не вышли за границу файла?
        LD A,(IX+#16)
        OR (IX+#17)
        OR (IX+#18)
        OR (IX+#19) ;ИCXOДHAЯ ДЛИHA ФAЙЛA
        EXA  ;файл длиной 0?
        PUSH IX
        POP HL
        LD BC,7
        ADD HL,BC
        RES 7,(IX+7)

;METOД CЖATИЯ, CTAPШИЙ БAЙT
        LD B,#18-3
Z6825   LD A,(HL)
        DEC H
        SUB (HL) ;TODO что с чем сравниваем?
        JR NZ,ERR_Z1 ;глобальная ошибка zip-файла
        INC H
        inc HL
        DJNZ Z6825
       POP HL
       pop BC
       if SEEK32BIT
       else
        LD A,B
       endif
        POP de ;общее число файлов в архиве
        EXA  ;файл длиной 0?
        JR Z,Z6838 ;файл длиной 0?
        LD (Z683F),A ;файл длиной не 0?
Z6838   DEC de
        LD A,d
        OR e
        JP NZ,Z679E

        LD A,0
Z683F=$-1
        OR A
        RET NZ ;хоть один файл длиной не 0?
;TODO файл длиной 0
ERR_Z1
ERR_Z2
ERR_Z3
        JP E_ZIP

;поиск блока end of central directory
LOAD_B
;bhl(bchl)=смещение в файле
;ix=буфер
;de=len
;out: z=end of central directory, bhl=kept
        CALL READ
        PUSH BC
        LD BC,#7EA ;???
        ADD IX,BC
;поиск заголовка блока
Z6861   LD A,#50 ;'P'
        CP (IX)
        JR NZ,Z687C
        LD A,#4B ;'K'
        CP (IX+1)
        JR NZ,Z687C
        LD A,5
        CP (IX+2)
        JR NZ,Z687C
        INC A
        CP (IX+3)
        JR Z,Z6884 ;05, 06 = end of central directory
Z687C   DEC BC
        DEC IX
        LD A,B
        OR C
        JR NZ,Z6861 ;поиск заголовка блока дальше
        DEC A ;-1, NZ
Z6884   POP BC
        RET

Z6886
       PUSH HL ;keep old position in file
       if SEEK32BIT
       push bc ;keep old position in file HSW
       endif
       push DE ;keep size
        LD (signaturetype),A
        ADD HL,DE
       if SEEK32BIT
       jr nc,$+3
       inc bc
       else
       LD A,B
       ADC A,0
        JR C,ERR_Z1 ;глобальная ошибка zip-файла
       endif

        EX DE,HL

       if SEEK32BIT
;bcde=next position in file
Z6896=$+1
        LD HL,0
        or a
        SBC HL,DE ;это просто сравнение, результат не используется
Z6894w=$+1
        LD hl,0
        sbc hl,bc ;bcde=next position in file
        JR C,ERR_Z1 ;глобальная ошибка zip-файла
       else
        LD C,A
;cde=next position in file
Z6894=$+1
        LD A,0
Z6896=$+1
        LD HL,0
        SBC HL,DE ;это просто сравнение, результат не используется
        SBC A,C
        JR C,ERR_Z1 ;глобальная ошибка zip-файла
       endif

        EX DE,HL

       if SEEK32BIT
;bchl=next position in file
        ld (Z6886bc),bc
       POP DE ;size
       pop bc
       EX (SP),HL ;keep next position in file, get old position in file
        CALL READ
       POP HL
Z6886bc=$+1
       ld bc,0 ;bchl=next position in file
       else
;chl=next position in file
       POP DE ;size
       EX (SP),HL ;keep next position in file, get old position in file
        LD A,B
       LD B,C
        CALL READ
       POP HL ;bhl=next position in file
       endif
        JR Z68AB

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Z68AB   CALL checksignature;Z6901
        RET Z
Z68AF   JR ERR_Z1 ;глобальная ошибка zip-файла

Z68B1
;сдвигаем указатель bhl(bchl) на de байт, читаем и проверяем сигнатуру?
       PUSH HL ;keep old position in file
       if SEEK32BIT
       push bc ;keep old position in file HSW
       endif
       push DE ;keep size
        LD (signaturetype),A
       ADD HL,DE
       if SEEK32BIT
        jr nc,$+3
        inc bc
       else
       LD A,B
       ADC A,0
        JR C,ERR_Z1 ;глобальная ошибка zip-файла
       endif

        EX DE,HL

       if SEEK32BIT
;bcde=next position in file
        LD HL,(SME_ML) ;start of central directory
        or a
        SBC HL,DE ;это просто сравнение, результат не используется
        LD hl,(SME_STw)
        SBC hl,bc
        JR C,Z68AF ;глобальная ошибка zip-файла
       else
        LD C,A
;cde=next position in file
        LD A,(SME_ST)
        LD HL,(SME_ML) ;start of central directory
        SBC HL,DE ;это просто сравнение, результат не используется
        SBC A,C
        JR C,Z68AF ;глобальная ошибка zip-файла
       endif

        EX DE,HL

       if SEEK32BIT
;bchl=next position in file
        ld (Z68B1bc),bc
       POP DE ;size
       pop bc
       EX (SP),HL ;keep next position in file, get old position in file
        CALL READ
       POP HL
Z68B1bc=$+1
       ld bc,0 ;bchl=next position in file
       else
;chl=next position in file
       POP DE ;size
       EX (SP),HL ;keep next position in file, get old position in file
        LD A,B
       LD B,C
        CALL READ
        POP HL ;bhl=next position in file
       endif
        JR Z68AB ;check signature

Z68D9
;сдвинуть указатель в файле (bhl)bchl на de байт и проверить, что не вышли за границу файла?
        XOR A
        ADD HL,DE
       if SEEK32BIT
        ADC A,c
        ld c,a
        ld a,b
        adc a,0
        LD B,A
        JR C,Z68AF ;ERR_Z1 ;глобальная ошибка zip-файла
       else
        ADC A,B
        JR C,Z68AF ;ERR_Z1 ;глобальная ошибка zip-файла
        LD B,A
       endif
        EX DE,HL
       if SEEK32BIT
        LD HL,(Z6896) ;текущее смещение в файле?
        SBC HL,DE ;это просто сравнение, результат не используется
        LD hl,(Z6894w)
        SBC hl,bc
       else
        LD A,(Z6894)
        LD HL,(Z6896) ;текущее смещение в файле?
        SBC HL,DE ;это просто сравнение, результат не используется
        SBC A,B
       endif
        EX DE,HL
        RET NC
       JR Z68AF ;ERR_Z1 ;глобальная ошибка zip-файла

Z68ED
;сдвинуть указатель в файле (bhl)bchl на de байт и проверить, что не вышли за границу файла?
        XOR A
       if SEEK32BIT
        ld (Z68EEhswb),a
       endif
Z68EE
;сдвинуть указатель в файле (bhl)bchl на <Z68EEhswb>ade байт и проверить, что не вышли за границу файла?
        ADD HL,DE
       if SEEK32BIT
        ADC A,c
        ld c,a
        ld a,b
Z68EEhswb=$+1
        adc a,0
        LD B,A
        JR C,Z68AF ;ERR_Z1 ;глобальная ошибка zip-файла
       else
        ADC A,B
        JR C,Z68AF ;ERR_Z1 ;глобальная ошибка zip-файла
        LD B,A
       endif
        EX DE,HL
       if SEEK32BIT
        LD HL,(SME_ML) ;start of central directory
        SBC HL,DE ;это просто сравнение, результат не используется
        LD hl,(SME_STw)
        SBC hl,bc
       else
        LD A,(SME_ST)
        LD HL,(SME_ML) ;start of central directory
        SBC HL,DE ;это просто сравнение, результат не используется
        SBC A,B
       endif
        EX DE,HL
        RET NC
       JR Z68AF ;ERR_Z1 ;глобальная ошибка zip-файла

checksignature;Z6901
        LD A,#50
        CP (IX)
        RET NZ
        LD A,#4B
        CP (IX+1)
        RET NZ
signaturetype=$+1;Z690E
        LD A,0 ;тип сигнатуры: 03: local file header, 01: central directory file header, 07: optional data descriptor, 05: end of central directory
        CP (IX+2)
        RET NZ
        INC A
        CP (IX+3)
        RET  
       
      endif ;READZIPDIR

        if 1==0
Z631F  PUSH BC
       POP DE
        PUSH HL
        POP IX
        LD A,0
ST_PAC_LEN=$-1
        LD HL,0
ML_PAC_LEN=$-2
        OR A
        JR NZ,Z633D
        PUSH HL
        SBC HL,DE
        POP HL
        JR NC,Z633D
        LD E,L
        LD D,H
Z633D   OR A
        SBC HL,DE
        SBC A,0
        LD (ST_PAC_LEN),A ;FIXME for SEEK32BIT
        LD (ML_PAC_LEN),HL
        LD A,D
        OR E
        RET Z
        LD HL,0
Z634C=$-2
        LD A,0 ;FIXME for SEEK32BIT
Z634F=$-1
        LD B,A
        CALL READ
        XOR A
        ADD HL,DE
        ADC A,B
        LD (Z634C),HL
        LD (Z634F),A ;FIXME for SEEK32BIT
       ;CALL STOP_DRV
       RET
        else
;Z634C
;        dw 0
;Z634F
;        db 0
        endif
       
Z635E
        jp NZ,INFLATING
;stored
         ld hl,tstored
         call prtext
        ;LD HL,PROCES
        ;CALL PRINTS_
           ;LD A,5
           ;call ON_BANK
        ld hl,(ML_LEN_ISH)
        ld a,(ST_LEN_ISH) ;FIXME
        ;ld c,a
        ;or h
        ;or l
        ;ld a,c
        ;jr z,storedq
        jr stored0go
stored0
        push af
        ;push hl
        ziprdbyte
        CALL SBYTE
        ;pop hl
        pop af
stored0go
        ld bc,1
        or a
        sbc hl,bc
        sbc a,b;0
        jr nc,stored0
           ;LD A,5
           ;call ON_BANK
;storedq
        ;jp savelastblock;_ZD1C4 ;save whole buffer (end of file)
       
savelastblock;_ZD1C4
        ;jr $
;save whole buffer
;сюда попадаем в конце файла
         ld hl,tsavelast
         call prtext
        LD HL,(U6546)
        ;ld a,h
        ;cp 0x50
        ;jr z,$
savehlbytes;ZD1C7
        LD DE,0
        JP SAVE

saveblock;Z65B8
;save whole buffer
;сюда не попадаем на коротких файлах
        PUSH HL,DE,BC,AF
         ;push ix
         ;exx
         ;exa
         ;push af
         ;push bc
         ;push de
         ;push hl
         call progressbar
        ;LD A,5
        ;CALL ON_BANK
        LD HL,(Z6546) ;сколько байт сохранить
        LD (TD198),HL ;сколько байт сохраняли
        CALL savehlbytes;ZD1C7 ;SAVE hl bytes
;hl=0
        LD (Z6546),HL ;сколько байт сохранить (=0)
        if 1==0 ;обновление размера для процентомера
        EX DE,HL
        LD HL,(TD198) ;сколько байт сохраняли
       AND A
        SBC HL,DE
        JR C,CON1 ;???
        LD DE,(B2)
        ADD HL,DE
        LD (B2),HL
       LD A,(B1)
       ADC A,0
       LD (B1),A
CON1
        endif
         ;pop hl
         ;pop de
         ;pop bc
         ;pop af
         ;exa
         ;exx
         ;pop ix
        POP AF,BC,DE,HL
        RET

tsaveblock
        db 13,"save block #",0
tsavelast
        db 13,10,"save last block",13,10,0


tstored
        db "stored",13,10,0

ST_LEN  DW 0

progressbar
        ld hl,tsaveblock
        call prtext
        ld hl,(blockCounter)
        inc hl
        ld (blockCounter),hl
        call toDecimal
        ld hl,decimalS
        call prtext
        ret
toDecimal               ;конвертирует 2 байта в 5 десятичных цифр
                                ;на входе в HL число
        ld de,10000 ;десятки тысяч
        ld a,255
toDecimal10k                   
        and a
        sbc hl,de
        inc a
        jr nc,toDecimal10k
        add hl,de
        add a,48
        ld (decimalS),a
        ld de,1000 ;тысячи
        ld a,255
toDecimal1k                    
        and a
        sbc hl,de
        inc a
        jr nc,toDecimal1k
        add hl,de
        add a,48
        ld (decimalS+1),a
        ld de,100 ;сотни
        ld a,255
toDecimal01k                   
        and a
        sbc hl,de
        inc a
        jr nc,toDecimal01k
        add hl,de
        add a,48
        ld (decimalS+2),a
        ld de,10 ;десятки
        ld a,255
toDecimal001k                  
        and a
        sbc hl,de
        inc a
        jr nc,toDecimal001k
        add hl,de
        add a,48
        ld (decimalS+3),a
        ld de,1 ;единицы
        ld a,255
toDecimal0001k                 
        and a
        sbc hl,de
        inc a
        jr nc,toDecimal0001k
        add hl,de
        add a,48
        ld (decimalS+4),a              
        ret
decimalS
        ds 5 ;десятичные цифры
        db 0
blockCounter
        dw 0000


        if 1==0
INFLATING
        ;ld (inflateq_sp),sp
        ;LD HL,PROCES
        ;CALL PRINTS_
        ;LD A,5
        ;CALL ON_BANK
        CALL ZD140 ;init read buffer, inflate file
        ;LD A,4
        ;JP ON_BANK
        ret
        endif

depkqerror;B_TABL
;ошибка в файле
        ;jr $
         ld hl,terror
         call prtext
;save whole buffer (Z6546) байт и выйти
;Z63B4
;inflateq_sp=$+1;Z63B5=$+1
;        LD SP,0
        ;LD HL,(Z6546) ;сколько байт сохранить = текущий адрес в буфере
        ;LD DE,0
        ;CALL SAVE
        call savelastblock
        ;LD A,4
        ;CALL ON_BANK
        ;CALL E_TABL
        JP SKIP ;восстанавливает sp
terror
        db "error",13,10,0

;PAСЧET CRC-32
;тут может быть патч RET (TODO)
;a=byte
CRC32_  EXX
        LD DE,(ST_CRC32)
        LD HL,(ML_CRC32)
CRCPR_  XOR L
        LD B,H
        LD L,A
         LD H,TCRC/1024 ;#18
        ADD HL,HL
        ADD HL,HL
        LD A,B
        XOR (HL)
        LD C,A
        INC L
        LD A,E
        XOR (HL)
        LD B,A
        INC L
        LD A,D
        XOR (HL)
        LD E,A
        INC L
        LD D,(HL)
        LD (ST_CRC32),DE
        LD (ML_CRC32),BC
        EXX
        RET
;ГEHEPAЦИЯ TAБЛИЦЫ ДЛЯ PAСЧETA CRC-32
initCRC
        LD IX,TCRC+#3FC
        LD C,0
Z669B   LD B,8
        LD DE,0
        LD H,D
        LD L,C
        DEC L
Z66A3   SRL D
        RR E
        RR H
        RR L
        JR NC,Z66BD
        LD A,#ED
        XOR D
        LD D,A
        LD A,#B8
        XOR E
        LD E,A
        LD A,#83
        XOR H
        LD H,A
        LD A,#20
        XOR L
        LD L,A
Z66BD   DJNZ Z66A3
        LD (IX),L
        LD (IX+1),H
        LD (IX+2),E
        LD (IX+3),D
        LD DE,-4
        ADD IX,DE
        DEC C
        JR NZ,Z669B
        ;LD A,4
        ;JP ON_BANK
        ret