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