Login

Subversion Repositories NedoOS

Rev

Rev 344 | Rev 1471 | Go to most recent revision | 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
        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
        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
        LD IX,BUFER
        LD DE,(LEN_KOM) ;комментарий может быть до 0x4000 (реально формат позволяет больше)
        CALL READ

        ;LD HL,TEXT20
        ;CALL PRINTS_

        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
        LD A,0
SME_ST=$-1
        ;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

        ;EXA
        LD B,A ;SME_ST

        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

        LD A,B ;SME_ST
        ADD HL,DE
        ADC A,D ;перемещаем указатель на имя

        LD DE,(Z6638) ;file name length
        LD B,A
        LD IX,Z664A
        CALL READ ;читаем имя файла

;Z664A=ИMЯ TEKУЩEГO ФAЙЛА B APXИBE
        ADD IX,DE
        LD (IX),0 ;кладём 0 в конец имени (получится ASCIIZ)
        LD A,B
        ADD HL,DE
        ADC A,0 ;перемещаем указатель после имени

        LD B,E
       DEC D
       INC D
        JR Z,Z604D ;длина имени <256
       LD B,0 ;длина имени >=256, считаем, что 256
Z604D   LD DE,(Z663A) ;extra field length
        ADD HL,DE
       ADC A,0 ;пропускаем extra field
        LD DE,(Z663C) ;file comment length
        ADD HL,DE
        ADC A,0 ;пропускаем file comment length

       ld (SME_ML),hl
       ld (SME_ST),a
       
;сформировать 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
       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)
        ;OR H
        ;OR L
        LD (ML_LEN_ISH),HL

;HL= МЛАДШИE БAЙTЫ ДЛИHЫ ИCXOДHOГO ФAЙЛA
        LD HL,(Z6636)
        ;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
        LD DE,T6221
        LD BC,8
        LDIR ;??? TODO установить дату после распаковки

        LD A,(T6624) ;flags
        RRA
        JR NC,Z60E3

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

Z60E3   LD HL,(T6626)

;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.
        LD A,(Z6648)
        ;jr $

;A,HL= CMEЩEHИE ДO ЛOKAЛЬНOГO 3AГОЛОBKA
        LD IX,BUFER
        LD DE,#1E
        LD C,#29
        LD B,A
        CALL READ

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

;теперь физически установим указатель файла туда
        ld d,0
        ld e,a
        ;ld hl,1
        ;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
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


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
        LD A,(ST_FLEN)
        LD HL,(ML_FLEN) ;ahl=длина файла
        LD DE,#800
         OR A
         JR NZ,Z6727
        LD A,H
        CP 8
        LD A,E;0
        JR NC,Z6727 ;длина файла >=0x800, так что начнём поиск с длина файла-0x800
        OR H
        JR NZ,Z6714
;длина файла < 0x100
        LD A,L
        CP #64
        JR 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
        JR _Z672A

Z6727   SBC HL,DE
        SBC A,E

_Z672A   LD B,A
        LD IX,BUFER
        ;de=0x800
        CALL LOAD_B ;поиск блока end of central directory
        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 ;ищем в начале файла

Z6747
;нашли end of central directory (ix = адрес этого блока в BUFER+)
        PUSH IX
        POP BC
        ADD HL,BC
       ADC A,0
        LD BC,BUFER
        SBC HL,BC
       SBC A,0 ;ahl=смещение end of central directory в файле
        LD (Z6896),HL ;текущее смещение в файле? TODO убрать
        LD (Z6894),A
        EX DE,HL
        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
        LD (IX+2),A ;???
        LD A,(IX+#12) ;offset of start of central directory HSB

;CTAPШИЙ БAЙT CMEЩЕНИЯ
        LD (SME_ST),A
        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
       JR Z,Z6783 ;конец central directory соответствует смещению блока end of central directory
Z6780  JP ERR_Z1 ;дошли до начала файла, а end of central directory не нашли

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

        LD A,(IX+#E)
        LD (SM2),A ;size of central directory HSB

        LD C,(IX+#A)
        LD B,(IX+#B)
        LD H,(IX+9)
        LD L,(IX+8)
;cy=0
;BC=ОБЩEE ЧИСЛO ФAЙЛОB B APXИBE
;HL=ЧИСЛО 3AПИCEЙ B KATAЛOГE HA ЭTOM ДИCKE
        LD (KOL_F),HL
        SBC HL,BC
        JP NZ,ERR_Z2
        LD HL,(SME_ML) ;start of central directory
        LD A,(SME_ST)
        EXA
Z679E   PUSH BC
        EXA
        LD B,A
        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 ;сдвинуть указатель в файле (ahl) на bde байт и проверить, что не вышли за границу файла?
        LD D,(IX+#1F)
        LD E,(IX+#1E)

;DE=ДOПOЛНИTEЛЬHOE ПОЛE ДЛИHЫ
        CALL Z68D9 ;сдвинуть указатель в файле (ahl) на bde байт и проверить, что не вышли за границу файла?
        LD D,(IX+#21)
        LD E,(IX+#20)

;DE=ДЛИHA KOMEHTAPИЯ K ФAЙЛУ
        CALL Z68D9 ;сдвинуть указатель в файле (ahl) на bde байт и проверить, что не вышли за границу файла?
        PUSH BC,HL
        LD B,(IX+#2C)
        LD L,(IX+#2A)
        LD H,(IX+#2B)

;B,HL=CMEЩEHИE OT HAЧAЛA ПEPBOГO ДИCKA C ЭTИM ФAЙЛOM
;     ДO ЛОКАЛЬHOГO 3AГOЛOBKA.
        INC IX,IX,HX
        LD A,3 ;тип сигнатуры
        LD DE,#30
        CALL Z68B1 ;сдвигаем указатель bhl на 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,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)
        LD (DE),A
        INC DE
        LD A,(IX+#17)
        LD (DE),A
        INC DE
        LD A,(IX+#18)
        LD (DE),A
        INC DE,DE,DE
        EX DE,HL
        LD (BUFCAT),HL
        LD HL,#1E
        LD A,(IX+#1B)

;A=СТАРШИЙ БAЙT ДЛИHЫ СMEHЫ ФAЙЛА
        CP 2
        JP NC,ERR_Z3
        LD D,A
        LD E,(IX+#1A)

;DE=ДЛИHA СMEHЫ ФAЙЛА
        CALL Z68ED ;сдвинуть указатель в файле (bhl) на de байт и проверить, что не вышли за границу файла?
        LD D,(IX+#1D)
        LD E,(IX+#1C)

;DE=ДATA ПOCЛEДHEЙ MOДИФИKAЦИИ
        CALL Z68ED ;сдвинуть указатель в файле (bhl) на de байт и проверить, что не вышли за границу файла?
        LD D,(IX+#13)
        LD E,(IX+#12)
        LD A,(IX+#14)

;A,DE=ДЛИHA CЖATOГO ФAЙЛA
        CALL Z68EE ;сдвинуть указатель в файле (bhl) на ade байт и проверить, что не вышли за границу файла?
        LD A,(IX+#16)
        OR (IX+#17)
        OR (IX+#18)
        OR (IX+#19)

;ИCXOДHAЯ ДЛИHA ФAЙЛA
        EXA
        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
        INC H,HL
        DJNZ Z6825
        POP HL,BC
        LD A,B
        POP BC
        EXA
        JR Z,Z6838 ;файл длиной 0?
        LD (Z683F),A
Z6838   DEC BC
        LD A,B
        OR C
        JP NZ,Z679E

Z683E   LD A,0
Z683F=Z683E+1

        OR A
        RET NZ ;файл длиной не 0?
;TODO файл длиной 0
ERR_Z1
ERR_Z2
ERR_Z3
        JP E_ZIP

;поиск блока end of central directory
LOAD_B
;ahl=смещение в файле
;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,DE
        LD (signaturetype),A
        ADD HL,DE
       LD A,B
       ADC A,0
        JR C,ERR_Z1
        EX DE,HL
        LD C,A

Z6894=$+1
        LD A,0
Z6896=$+1
        LD HL,0

        SBC HL,DE
        SBC A,C
        JR C,ERR_Z1
        EX DE,HL
        POP DE
        EX (SP),HL
        LD A,B
        LD B,C
        CALL READ
        POP HL
        JR Z68AB

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Z68AB   CALL checksignature;Z6901
        RET Z
Z68AF   JR ERR_Z1

Z68B1
;сдвигаем указатель bhl на de байт, читаем и проверяем сигнатуру?
        PUSH HL
        PUSH DE
        LD (signaturetype),A
       ADD HL,DE
       LD A,B
       ADC A,0
        JR C,ERR_Z1
        EX DE,HL
        LD C,A
        LD A,(SME_ST)
        LD HL,(SME_ML) ;start of central directory
        SBC HL,DE
        SBC A,C
        JR C,Z68AF
        EX DE,HL
        POP DE
        EX (SP),HL
        LD A,B
        LD B,C
        CALL READ
        POP HL
        JR Z68AB ;check signature

Z68D9
;сдвинуть указатель в файле (ahl) на bde байт и проверить, что не вышли за границу файла?
        XOR A
        ADD HL,DE
        ADC A,B
        JR C,Z68AF ;ERR_Z1
        LD B,A
        EX DE,HL
        LD A,(Z6894)
        LD HL,(Z6896) ;текущее смещение в файле?
        SBC HL,DE
        SBC A,B
        EX DE,HL
        RET NC
       JR Z68AF ;ERR_Z1

Z68ED
        XOR A
Z68EE
        ADD HL,DE
        ADC A,B
        JR C,Z68AF
        LD B,A
        EX DE,HL
        LD A,(SME_ST)
        LD HL,(SME_ML) ;start of central directory
        SBC HL,DE
        SBC A,B
        EX DE,HL
        RET NC
       JR Z68AF ;ERR_Z1

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  

        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
        LD (ML_PAC_LEN),HL
        LD A,D
        OR E
        RET Z
        LD HL,0
Z634C=$-2
        LD A,0
Z634F=$-1
        LD B,A
        CALL READ
        XOR A
        ADD HL,DE
        ADC A,B
        LD (Z634C),HL
        LD (Z634F),A
       ;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)
        ;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
         ld hl,tsaveblock
         call prtext
        ;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 "save block",13,10,0
tsavelast
        db "save last block",13,10,0


tstored
        db "stored",13,10,0

ST_LEN  DW 0

        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