ldirinpages;Z6542
;hl=юЄъєфр (ыюушўхёъшщ рфЁхё т сєЇхЁх ёюїЁрэхэш )
;bc=ёъюы№ъю
;TODO єёъюЁшЄ№
LD A,C
OR B
RET Z ;TODO эрфю ыш?
;DI
;CALL 8020
;JP C,_Z6545
; LD A,4
; CALL ON_BANK
; JP START_1
Z6546=$+1 ;ёъюы№ъю срщЄ ёюїЁрэшЄ№ (¤Єю цх Єхъє∙шщ рфЁхё т сєЇхЁх, Є.х. ъєфр ъюяшЁютрЄ№)
LD DE,0
if depkbuf
push bc
ld bc,depkbuf
add hl,bc
ex de,hl
add hl,bc
ex de,hl
pop bc
ldirinpages0
ld a,(hl)
CALL CRC32_
ldi
jp pe,ldirinpages0
ld hl,-depkbuf
add hl,de
ld (Z6546),hl
ret
;bit 7,h
;ret z
;jp saveblock ;save whole buffer
else
PUSH HL,DE
LD A,D
LD (SAVED+1),A
LD A,H
LD (SAVEH+1),A
if depkbuf
add a,depkbuf/256
LD H,A
else
RLCA
RLCA
AND 3
LD (BANKH+1),A
CALL ON_BANK
LD A,H
OR #C0
LD H,A
endif
LD (ADRH+1),HL
LD A,(HL)
EXA
LD A,D
if depkbuf
add a,depkbuf/256
LD D,A
else
RLCA
RLCA
AND 3
LD (BANKD+1),A
CALL ON_BANK
LD A,D
OR #C0
LD D,A
endif
LD (ADRD+1),DE
EXA
LD (DE),A
CALL CRC32_
POP DE,HL
INC DE
LD A,D
INC A
JR Z,SV1
WOZW1 CPI
JP PO,AFN5
ADRH LD HL,0
ADRD LD DE,0
AFN2 INC L
JR Z,SAVEH
AFN1 INC E
JR Z,SAVED
AFN3 LD A,B
OR C
JR Z,AFN4
if depkbuf==0
BANKH LD A,0
CALL ON_BANK
endif
LD A,(HL)
if depkbuf==0
EXA
BANKD LD A,0
CALL ON_BANK
EXA
endif
LD (DE),A
CALL CRC32_
DEC BC
JP AFN2
SAVEH LD A,0
INC A,A
JR Z,$+3
DEC A
LD H,A
LD (SAVEH+1),A
if depkbuf==0
RLCA
RLCA
AND 3
LD (BANKH+1),A
LD A,H
OR #C0
LD H,A
endif
JR AFN1
SAVED LD A,0
INC A
LD D,A
if buf64k
INC A
else
cp 0x80
endif
JR Z,SV2 ;save whole buffer
WOZWR2 LD A,D
LD (SAVED+1),A
if depkbuf==0
RLCA
RLCA
AND 3
LD (BANKD+1),A
LD A,D
OR #C0
LD D,A
endif
LD (ADRD+2),A
JR AFN3
AFN4 LD A,(SAVED+1)
LD D,A
AFN5 LD (Z6546),DE ;ёъюы№ъю срщЄ ёюїЁрэшЄ№
ret
;LD A,4
;CALL ON_BANK
;CALL COUNT ;яЁюЎхэЄюьхЁ?
;LD A,5
;JP ON_BANK
SV1 CALL SV0
LD A,D
DEC A
LD (SAVED+1),A
if depkbuf==0
RLCA
RLCA
AND 3
LD (BANKD+1),A
LD A,D
OR #C0
LD D,A
endif
LD (ADRD+2),A
LD E,-1 ;эр ёыєўрщ т√їюфр т AFN5
JP WOZW1
SV2 CALL SV0
JR WOZWR2
SV0 LD (Z6546),DE ;ёъюы№ъю срщЄ ёюїЁрэшЄ№
;LD A,5
;CALL ON_BANK
CALL saveblock ;save whole buffer
LD DE,(Z6546) ;ёъюы№ъю срщЄ ёюїЁрэшЄ№ (=0?)
RET
endif
;чряшё№ юфэюую срщЄр т ярь Є№ + юсэютыхэшх CRC32 + яЁш эхюсїюфшьюёЄш ёюїЁрэхэшх
SBYTE
;a=byte
PUSH HL
LD HL,(Z6546) ;ёъюы№ъю срщЄ ёюїЁрэшЄ№ (юэ цх Єхъє∙шщ рфЁхё, ъєфр яшёрЄ№)
PUSH HL
if depkbuf
exa
ld a,h
add a,depkbuf/256
ld h,a
exa
else
EXA
LD A,H
RLCA
RLCA
AND 3
CALL ON_BANK
LD A,H
OR #C0
LD H,A
EXA
endif
LD (HL),A
CALL CRC32_
POP HL
INC HL
;LD A,H
;AND A
;JR NZ,CON2
;LD A,L
;CP #11
;CALL Z,HOBETA1
;CON2
LD (Z6546),HL ;ёъюы№ъю срщЄ ёюїЁрэшЄ№
;LD A,5
;CALL ON_BANK
LD A,H
if buf64k
INC A
else
cp 0x80
endif
POP HL
RET NZ
jp saveblock
;╚═╚╓╚└╦╚╟└╓╚▀ ─┼╧AKEPA
initdepk=initCRC;Z6629
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;ьхЄюф store
ZD102
LD A,B
CP 8
CALL NZ,read_a_bits
EX DE,HL ;??? (hl=0x802b) фышэр сыюър
CALL readbyte_d
LD E,D
CALL readbyte_d ;??? (de=0x7fd4)
LD A,D
XOR H
LD D,A
LD A,E
XOR L
AND D
INC A
call NZ,depkqerror ;save whole buffer ш т√щЄш
;CALL readbyte_d
EX DE,HL
;ZD11F=$+1
;LD HL,0
;DEC HL
_ZD122
;LD A,(HL)
;INC HL
;push hl
;LD HL,(Z6546)
;bit 7,h
;jr nz,$
;pop hl
ziprdbyte
CALL SBYTE ;чряшё№ юфэюую срщЄр т ярь Є№ + юсэютыхэшх CRC32 + яЁш эхюсїюфшьюёЄш ёюїЁрэхэшх
;PUSH HL
;LD BC,#4001
;ADD HL,BC
;POP HL
;JR NC,ZD135
;CALL LBLOKZIP
;LD HL,BUFER
;ZD135
DEC DE
LD A,D
OR E
JR NZ,_ZD122
;LD (ZD11F),HL
POP DE ;ёэшьрхь рфЁхё тючтЁрЄр
JR _ZD14D ;ўшЄрхь ёыхфє■∙шщ сыюъ
;ZD140
INFLATING
;init read buffer, inflate file
XOR A
LD (_ZD159),A ;эх яюёыхфэшщ сыюъ
;CALL LBLOKZIP
;LD HL,0
; LD (U6546),HL ;ёъюы№ъю срщЄ ёюїЁрэшЄ№ = Єхъє∙шщ рфЁхё т сєЇхЁх
_ZD14D
;LD HL,(ZD11F)
;LD E,(HL)
;INC HL
;LD (ZD11F),HL
ziprdbyte
ld e,a
CALL readbyte_d ;єёЄрэютшЄ b=8
_ZD158 ;ё■фр яюярфрхь яю ъюфє 256 (end of block)
;push hl
;ld hl,(Z6546)
;jr $
;pop hl
_ZD159=$+1
LD A,0 ;1 = с√ы яюёыхфэшщ сыюъ
OR A
jp NZ,savelastblock ;save (U6546) bytes, т√їюф
CALL readbit_de ;1 = last block, 0 = not last block
LD HL,_ZD159 ;ёь. т√°х
RR (HL)
CALL readtrees;ZD2E4
_ZD168
;push de
;push hl
;LD HL,(Z6546)
;bit 7,h
;jr nz,$ ;яюўхьє-Єю эх яюярфрхь ё■фр
;ld hl,(Z6546)
;ld de,0x53c7;0x546f
;or a
;sbc hl,de
;jr nc,$
;pop hl
;pop de
CALL readcodetree1 ;out: hl=code
;jr $
LD A,H
OR A
JR NZ,_ZD175 ;хёыш ъюф - эх срщЄ
LD A,L ;срщЄ
CALL SBYTE ;чряшё№ юфэюую срщЄр т ярь Є№ + юсэютыхэшх CRC32 + яЁш эхюсїюфшьюёЄш ёюїЁрэхэшх
JR _ZD168
_ZD175 DEC A
OR L
;256: end of block Ц stop processing if last block, otherwise start processing next block.
;257Ц285: combined with extra-bits, a match length of 3Ц258 bytes.
;286, 287: not used, reserved and illegal but still part of the tree.
;jr z,$ ;эх фюїюфшь ё■фр эр adv 1,2, р т adv3 хую эхЄ т яхЁтюь сыюъх
;push hl
;LD HL,(Z6546)
;pop hl
JR Z,_ZD158 ;хёыш 256 (end of block), Єю эрчрф эр ўЄхэшх чруюыютър сыюър ш фхЁхт№хт
;jr $
DEC H
INC HL,HL
PUSH HL ;2+(ъюф-256) = ёъюы№ъю
CALL readcodetree2 ;distance
INC HL
POP AF
PUSH BC,DE,AF
POP BC ;2+(ъюф-256) = ёъюы№ъю
EX DE,HL ;de=ъюф яю tree2 (ЁрёёЄю эшх?)
LD HL,(U6546) ;ёъюы№ъю срщЄ ёюїЁрэшЄ№ = Єхъє∙шщ рфЁхё т сєЇхЁх
OR A
SBC HL,DE
JR NC,_ZD1B5 ;ЁрёёЄю эшх єьх∙рхЄё тэєЄЁш эхёюїЁрэ╕ээюую сыюър?
EX DE,HL ;de = -ёъюы№ъю срщЄ эх їтрЄрхЄ?
LD HL,0
OR A
SBC HL,DE ;ёъюы№ъю срщЄ эх їтрЄрхЄ?
PUSH HL
LD HL,#2121
TD198=$-2 ;ёъюы№ъю срщЄ ёюїЁрэ ыш т яЁю°ы√щ Ёрч
ADD HL,DE ;hl = ёъюы№ъю срщЄ ёюїЁрэ ыш - ёъюы№ъю срщЄ эх їтрЄрхЄ? (яюыєўрхЄё рфЁхё т яЁю°ыюь сєЇхЁх?)
POP DE
EX DE,HL ;de=рфЁхё т яЁю°ыюь сєЇхЁх?, hl=ёъюы№ъю срщЄ эх їтрЄрхЄ?
PUSH HL ;ёъюы№ъю срщЄ эх їтрЄрхЄ?
CP A
SBC HL,BC ;NC=сыюъ эх яхЁхёхърхЄ уЁрэшЎє ёЄрЁюую ш эютюую сєЇхЁют (ёъюы№ъю срщЄ эх їтрЄрхЄ >= ёъюы№ъю)
POP HL ;ёъюы№ъю срщЄ эх їтрЄрхЄ?
EX DE,HL
JR NC,_ZD1B5 ;хёыш сыюъ эх яхЁхёхърхЄ уЁрэшЎє ёЄрЁюую ш эютюую сєЇхЁют, Єю юЄъєфр = рфЁхё т яЁю°ыюь сєЇхЁх?
EX DE,HL
PUSH BC
EX (SP),HL
POP BC ;hl=ёъюы№ъю, bc=ёъюы№ъю срщЄ эх їтрЄрхЄ?
AND A
SBC HL,BC
PUSH HL ;ёъюы№ъю-ёъюы№ъю срщЄ эх їтрЄрхЄ
EX DE,HL ;hl=рфЁхё т яЁю°ыюь сєЇхЁх, bc=ёъюы№ъю срщЄ эх їтрЄрхЄ?
CALL ldirinpages ;ёъюяшЁютрыш яхЁт√щ ъєёюъ т Єхъє∙шщ рфЁхё т сєЇхЁх ;TODO ЁрчЁхчрЄ№ эр 2 ўрёЄш яЁш яхЁхёхўхэшш 32╩
LD HL,0 ;яЁюфюыцхэшх сєфхь ъюяшЁютрЄ№ шч эрўрыр эютюую сєЇхЁр
POP BC ;фышэр яЁюфюыцхэш (ёъюы№ъю-ёъюы№ъю срщЄ эх їтрЄрхЄ)
;TODO ёфхырЄ№ эрёЄю ∙хх ёъюы№ч ∙хх юъэю 32╩, Є.ъ. Relative back-references can be made across any number of blocks, as long as the distance appears within the last 32 KiB of uncompressed data decoded (termed the sliding window)
_ZD1B5
;hl = юЄъєфр (ыюушўхёъшщ рфЁхё т сєЇхЁх)
;bc = ёъюы№ъю
CALL ldirinpages ;ъюяшЁєхь т Єхъє∙шщ рфЁхё т сєЇхЁх ;TODO ЁрчЁхчрЄ№ эр 2 ўрёЄш яЁш яхЁхёхўхэшш 32╩
LD A,(Z6546+1) ;(Z6546) = ёъюы№ъю срщЄ ёюїЁрэшЄ№ = Єхъє∙шщ рфЁхё т сєЇхЁх
if buf64k
CP -1
else
CP 0x80
endif
CALL NC,saveblock ;save whole buffer ;сєЇхЁ эр [64K]32K, эрфю ёюїЁрэшЄ№ ш ёючфрЄ№ эют√щ сєЇхЁ ;TODO чрЎшъышЄ№ юъэю
POP DE
POP BC
JR _ZD168 ;ўшЄрхь ёыхфє■∙шщ ъюф
;?
;DS 10
;ъръшх-Єю ёЄрэфрЁЄэ√х фышэ√ ъюфют
;256: end of block Ц stop processing if last block, otherwise start processing next block.
;257Ц285: combined with extra-bits, a match length of 3Ц258 bytes.
;286, 287: not used, reserved and illegal but still part of the tree.
;TODO яюўхьє ЄєЄ тёхую 19 ёЄрэфрЁЄэ√ї фышэ, р эх 28?
TD1EE db #10,#11
db #12,0
db 8,7
db 9,6
db #A,5
db #B,4
db #C,3
db #D,2
db #E,1
db #F ;,1 ;#F чрїюфшы эр ёыхфє■∙шщ ёхуьхэЄ, р 1 с√ы ўрёЄ№■ TD201 ;ўшЄрхЄё ьръёшьєь 19 срщЄ, Є.х. фю #F тъы■ўшЄхы№эю (т gunzip эхЄ 1)
align 256
db 0 ;ўЄюс√ эр 1 срщЄ яючцх
TD201 DB 1,3,7,#F,#1F,#3F,#7F,-1 ;ьрёъш
;?
TD209 DS 34;70 ;Єєфр яш°хЄё 32 срщЄр (2-срщЄэ√х ёў╕Єўшъш, ёъюы№ъю Ёрч тёЄЁхЄшырё№ ърцфр фышэр ъюфр 0..15)
TD22B ds 70-34 ;ё #xx2d ыхцрЄ 2-срщЄэ√х эрўры№э√х ъюф√ фы ърцфющ фышэ√ ъюфр (1..15)
get_a_bits_tohl;ZD24F
CP 9
JR C,_ZD262
SUB 8
LD H,A
LD A,8
CALL get_a_bits
LD L,A
LD A,H
CALL get_a_bits
LD H,A
RET
_ZD262 CALL get_a_bits
LD H,0
LD L,A
RET
get_a_bits;ZD269
;a=ўшёыю сшЄ, b=ўшёыю сшЄ d т эрышўшш, de=фрээ√х т эрышўшш
;out: a=ўшёыю шч e (ьырф°шх сшЄ√ яю ьрёъх ъюышўхёЄтр сшЄ)
LD (_ZD26E),A
EXA
_ZD26E=$+1
LD A,(TD201) ;a=ьрёър 0x01,0x03,0x07...0xff (фы 1,2,3...8)
AND E
PUSH AF
EXA
CALL read_a_bits
POP AF
RET
readbit_de;ZD278
;"ўшЄрЄ№ сшЄ" (Єхъє∙шх сшЄ√ т de, b=ўшёыю тхЁэ√ї сшЄют d)
;out: CY=т√ыхЄхт°шщ ьырф°шщ сшЄ de
SRL D
RR E
DEC B
RET NZ
readbyte_d;ZD27E
;ўшЄрЄ№ срщЄ т d, єёЄрэютшЄ№ b=8
;TODO ьръЁюё ш схч push af
PUSH AF
;push HL
;push BC
;LD HL,(ZD11F)
;LD BC,#4001
;ADD HL,BC
;POP BC
;CALL C,LBLOKZIP
;LD HL,(ZD11F)
;LD D,(HL)
;INC HL
;LD (ZD11F),HL
ziprdbyte
ld d,a
LD B,8
;POP HL
pop AF
RET
;a=ўшёыю сшЄ (с√трхЄ 8)
;b=ўшёыю сшЄ d т эрышўшш
;de=шьх■∙шхё фрээ√х (e - ёрь√х ёЄрЁ√х)
read_a_bits;ZD299
CP B ;ёъюы№ъю сшЄ т d
JR C,_ZD2A6 ;т d фюёЄрЄюўэю сшЄ
_ZD29C SRL D
RR E
DEC A
DJNZ _ZD29C
CALL readbyte_d
;ЄхяхЁ№ т d шьххЄё 8 сшЄ, b=8, a єьхэ№°хэю эр ёъюы№ъю шьхыюё№ сшЄ
_ZD2A6 OR A
RET Z ;т√їюфшь, ъюуфр яЁюўшЄрыш эєцэюх ъюышўхёЄтю сшЄ
SRL D
RR E
DEC A
DJNZ _ZD2A6
;ё■фр ьюцэю яюярёЄ№ Єюы№ъю яЁш a >= 8+ёъюы№ъю шьхыюё№ сшЄ
;ёЄЁюшь фхЁхт№ яю єьюыўрэш■ (ъюф√ 0..127 яю 8 сшЄ, 128..255 яю 9 сшЄ ш Є.ф.)
;b=0
;a=ёъюы№ъю сшЄ эх їтрЄшыю (ьюцхЄ с√Є№ 0)
_ZD2AF PUSH BC,DE
LD HL,ziptrees ;фышэ√ ъюфют яхЁтюую фхЁхтр?
LD BC,#9008
_ZD2B7 LD (HL),C
INC HL
DJNZ _ZD2B7
LD BC,#7009 ;...яЁюфюыцхэшх
_ZD2BE LD (HL),C
INC HL
DJNZ _ZD2BE
LD BC,#1807
_ZD2C5 LD (HL),C
INC HL
DJNZ _ZD2C5
LD BC,#808
_ZD2CC LD (HL),C
INC HL
DJNZ _ZD2CC
LD HL,ziptrees+#140 ;фышэ√ ъюфют тЄюЁюую фхЁхтр?
LD BC,#2005
LD A,B ;32
_ZD2D7 LD (HL),C
INC HL
DJNZ _ZD2D7
LD (ZD3C8),A ;ўшёыю ъюфют тЄюЁюую фхЁхтр?
LD (ZD3B8),A ;ўшёыю ъюфют яхЁтюую фхЁхтр (-256)?
JP gentrees;ZD3B7 ;яюёЄЁюшЄ№ 2 фхЁхтр?
readtrees;ZD2E4
LD A,2
CALL get_a_bits ;ўшЄрхь ьхЄюф
DEC A
JP M,ZD102 ;00 = stored/raw/literal section, between 0 and 65,535 bytes in length
JR Z,_ZD2AF ;01 = static Huffman compressed block, using a pre-agreed Huffman tree
DEC A
call NZ,depkqerror ;11 = ю°шсър, save whole buffer ш т√щЄш
;10 = compressed block complete with the Huffman table supplied
LD A,5
CALL get_a_bits
INC A
LD (ZD3B8),A ;ўшёыю ъюфют яхЁтюую фхЁхтр (-256)
LD A,5
CALL get_a_bits
INC A
LD (ZD3C8),A ;ўшёыю ъюфют тЄюЁюую фхЁхтр
LD HL,ziptrees+#560 ;яюўхьє ё■фр ъырфєЄё фышэ√ ъюфют??? TODO
LD A,#13
_ZD30A LD (HL),0
INC HL
DEC A
JR NZ,_ZD30A
LD A,4
CALL get_a_bits
ADD A,4 ;4..19 ъюфют
LD C,A
LD HL,TD1EE
_ZD31B LD A,3
CALL get_a_bits
PUSH DE
LD E,(HL)
LD D,0
PUSH HL
LD HL,ziptrees+#560 ;яюўхьє ё■фр ъырфєЄё фышэ√ ъюфют??? TODO
ADD HL,DE
LD (HL),A
POP HL,DE
INC HL
DEC C
JR NZ,_ZD31B
PUSH BC
push DE
LD HL,ziptrees+#160 ;Єрь сєфхЄ ыхцрЄ№ яхЁтюх фхЁхтю
LD DE,ziptrees+#560 ;яюўхьє юЄё■фр схЁєЄё фышэ√ ъюфют??? TODO
LD BC,#13
CALL gentree
LD HL,(ZD3B8) ;ўшёыю ъюфют яхЁтюую фхЁхтр
LD DE,(ZD3C8) ;ўшёыю ъюфют тЄюЁюую фхЁхтр
ADD HL,DE
DEC HL
POP DE
pop BC
LD IX,ziptrees ;фышэ√ ъюфют яхЁтюую фхЁхтр (Ёхры№эю яЁюўшЄрхь юср (Єрь ьхёЄю ё чрярёюь), яюЄюь яхЁхсЁюёшь юёЄрЄюъ фышэ)
ZD34D PUSH HL,DE
LD D,0
LD HL,ziptrees+#160 ;яхЁтюх фхЁхтю
ADD HL,DE
ADD HL,DE
LD E,(HL)
LD HL,ziptrees+#560 ;фышэ√ ъюфют???
ADD HL,DE
LD A,(HL)
LD C,E
POP DE
CALL read_a_bits
LD A,C
POP HL
CP #10
JR NC,ZD36C
;< #10: ¤Єю сєфхЄ фышэр ъюфр, яш°хь х╕
LD C,A ;фышэр ъюфр?
LD A,1 ;ўшёыю яютЄюЁют
JR _ZD390
ZD36C JR NZ,ZD37A
;= #10: яш°хь 3..6 яЁхф√фє∙шї фышэ
LD A,2
CALL get_a_bits
ADD A,3 ;ўшёыю яютЄюЁют
LD C,(IX-1) ;фышэр ъюфр?
JR _ZD390
ZD37A CP #11
JR NZ,_ZD387
;= #11: яш°хь 3..10 фышэ 0
LD A,3
CALL get_a_bits
ADD A,3
JR _ZD38E
_ZD387
;> #11: яш°хь 11..138 фышэ 0
LD A,7
CALL get_a_bits
ADD A,#B ;ўшёыю яютЄюЁют
_ZD38E LD C,0
_ZD390 LD (IX),C ;фышэр ъюфр
INC IX
DEC A
DEC HL
JR Z,ZD3A0
BIT 7,H
call NZ,depkqerror ;save whole buffer ш т√щЄш
JR _ZD390
ZD3A0 BIT 7,H
JR Z,ZD34D
PUSH BC
push DE
LD HL,ziptrees ;фышэ√ ъюфют яхЁтюую фхЁхтр
LD DE,(ZD3B8) ;ўшёыю ъюфют яхЁтюую фхЁхтр
ADD HL,DE
LD DE,ziptrees+#140 ;фышэ√ ъюфют тЄюЁюую фхЁхтр
LD BC,(ZD3C8) ;ўшёыю ъюфют тЄюЁюую фхЁхтр
LDIR ;TODO lddr ш єсЁрЄ№ чрярё яюёых ziptrees, шыш яЁхфртрЄ№ єърчрЄхы№ эр фышэ√ ъюфют тЄюЁюую фхЁхтр т gentrees
gentrees;ZD3B7
;эр ёЄхъх de,bc
ZD3B8=$+1 ;яш°хЄё 1 срщЄ
LD BC,#100 ;ўшёыю ъюфют яхЁтюую фхЁхтр
LD DE,ziptrees ;фышэ√ ъюфют яхЁтюую фхЁхтр
LD HL,ziptrees+#160 ;Єрь сєфхЄ ыхцрЄ№ яхЁтюх фхЁхтю
LD IX,ziptrees+#560
CALL gentree
ZD3C8=$+1
LD BC,0 ;ўшёыю ъюфют тЄюЁюую фхЁхтр ;юс√ўэю 32
LD DE,ziptrees+#140 ;фышэ√ ъюфют тЄюЁюую фхЁхтр
LD HL,ziptrees+#360 ;Єрь сєфхЄ ыхцрЄ№ тЄюЁюх фхЁхтю
LD IX,ziptrees+#9E0
CALL gentree
POP DE
pop BC
RET
;яюёЄЁюхэшх фхЁхтр
;de=фышэ√ ъюфют
;hl=рфЁхё, уфх сєфхЄ ыхцрЄ№ фхЁхтю
;ix=? (чряшё√трхЄё т (ZD523) - ўЄю-Єю фы ъюфют фышээхх 8)
;bc=ўшёыю ъюфют = #100+(ZD3B8) фы яхЁтюую фхЁхтр, (ZD3C8) фы тЄюЁюую (юс√ўэю 32)
gentree;ZD3DA
LD A,B
OR C
RET Z
LD (ZD443),BC ;ўшёыю ъюфют
LD (ZD4A9),HL
;юўш∙рхь, ёъюы№ъю Ёрч тёЄЁхЄшышё№ ъюф√ ърцфющ фышэ√ (0..15)
LD HL,TD209
PUSH HL
push BC
LD BC,#2000
_ZD3EC LD (HL),C;0
INC HL
DJNZ _ZD3EC
POP BC
pop HL
PUSH DE ;фышэ√ ъюфют
;ёўшЄрхь, ёъюы№ъю Ёрч тёЄЁхЄшышё№ ъюф√ ърцфющ фышэ√ (0..15)
_ZD3F3 LD A,(DE)
INC DE
ADD A,A
ADD A,9 ;TD209
LD L,A
INC (HL)
JR NZ,_ZD3FE
INC HL
INC (HL)
_ZD3FE DEC BC
LD A,B
OR C
JR NZ,_ZD3F3
;ЄхяхЁ№ т TD209 ыхцрЄ 2-срщЄэ√х чэрўхэш , ёъюы№ъю Ёрч тёЄЁхЄшышё№ ъюф√ ърцфющ фышэ√ (0..15)
LD L,#2D ;TD22B+2
LD (HL),C;0
INC HL
LD (HL),C;0 ;эрўры№э√щ ъюф фы фышэ√ 1 ;TODO ld (TD22B+2),bc
PUSH BC;0 ;Єхъє∙шщ ъюф?
LD BC,#F02 ;яхЁхсшЁрхь фышэ√ ъюфют 1..15
_ZD40C LD A,C ;фышэр ъюфр*2
ADD A,9 ;TD209
LD L,A
LD E,(HL)
INC HL
LD D,(HL) ;de=ёъюы№ъю Ёрч тёЄЁхЄшырё№ ¤Єр фышэр ъюфр
EX (SP),HL
ADD HL,DE
ADD HL,HL
LD E,L
LD D,H ;ъръющ-Єю ьрушхщ ЇюЁьшЁєхь Єхъє∙шщ ъюф шч яЁхф√фє∙хую
EX (SP),HL
INC C
INC C
LD A,C
ADD A,#2B ;TD22B
LD L,A
LD (HL),E
INC HL
LD (HL),D ;эрўры№э√щ ъюф фы чрфрээющ фышэ√ ъюфр
DJNZ _ZD40C
POP DE ;Єхъє∙шщ ъюф?
LD A,D
OR E
JR Z,ZD440 ;яюёыхфэшщ эрўры№э√щ ъюф фюыцхэ яюыєўшЄ№ё 0 (Є.х. тёх трЁшрэЄ√ т сшэрЁэюь фхЁхтх шёяюы№чютрэ√)
;ю°шсюўэюх фхЁхтю?
LD D,B
LD E,B;de=0
LD A,#F
LD L,#B ;TD209+2
_ZD42F LD C,(HL)
INC HL
LD B,(HL) ;ёъюы№ъю Ёрч тёЄЁхЄшыё ъюф ¤Єющ фышэ√
INC HL
EX DE,HL
ADD HL,BC
EX DE,HL
DEC A
JR NZ,_ZD42F
;de=ъюышўхёЄтю эхэєыхт√ї фышэ ъюфют -2
LD HL,-2
ADD HL,DE
call C,depkqerror ;хёыш ъюфют сюыхх 1, save whole buffer ш т√щЄш (ю°шсюўэюх фхЁхтю? т рЁїштх ё рфтхэЄ■ЁхЁрьш - эр ърцфюь сюы№°юь Їрщых)
;тёхую 1 ъюф шёяюы№чєхЄё - ёўшЄрхь, ўЄю эх ю°шсър, ўЄю эх яюыєўшыюё№ яюёЄЁюшЄ№ фхЁхтю шч 1 ъюфр?
ZD440
POP DE ;фышэ√ ъюфют
PUSH DE ;фышэ√ ъюфют
ZD443=$+1
LD BC,0 ;ўшёыю ъюфют
LD HL,ziptrees+#A60 ;ё■фр яюыюцшь тёх ъюф√ яю 2 срщЄр эр ъюф
_ZD448 LD A,(DE) ;фышэр ъюфр
INC DE
PUSH DE
ADD A,A
LD E,A
LD D,A
JR Z,__ZD45F ;фышэр ъюфр=de=0
;схЁ╕ь ъюф эюьхЁ "фышэр ъюфр" т de (ш шэъЁхьхэЄшЁєхь хую Єрь, уфх юэ ыхцры)
PUSH HL
LD H,TD209/256;UD2
ADD A,#2B ;TD22B
LD L,A
LD E,(HL)
INC HL
LD D,(HL)
INC DE
LD (HL),D
DEC HL
LD (HL),E
DEC DE
POP HL
__ZD45F LD (HL),E
INC HL
LD (HL),D
INC HL
POP DE
DEC BC
LD A,C
OR B
JR NZ,_ZD448
POP DE ;фышэ√ ъюфют
PUSH DE ;фышэ√ ъюфют
LD HL,ziptrees+#A60 ;тёх ъюф√ яю 2 срщЄр эр ъюф
LD BC,(ZD443) ;ўшёыю ъюфют
_ZD472 LD A,(DE)
INC DE
DEC A
JP M,_ZD4A1 ;ъюф фышэющ 0 (эхшёяюы№чєхь√щ) - яЁюяєёърхь
JR Z,_ZD4A1 ;ъюф фышэющ 1 - яЁюяєёърхь
PUSH DE
LD E,(HL)
INC HL
LD D,(HL) ;схЁ╕ь ъюф
PUSH HL
LD HL,0
;эрўшэрхь яхЁхтюЁрўштрЄ№ ъюф, ёэрўрыр фышэръюфр-1 сшЄшъют:
_ZD482 SRL D
RR E
ADC HL,HL
EXA
LD A,D
OR E
JR Z,_ZD493 ;ъюф ъюэўшыё
EXA
DEC A
JR NZ,_ZD482
INC A ;a=1: ёфтшэхь яюЄюь х∙╕ эр 1 сшЄшъ
EXA
_ZD493 EXA
;ёфтшэхь эр эхёъюы№ъю юёЄрт°шїё сшЄшъют:
RR E
_ZD496 ADC HL,HL
DEC A
JR NZ,_ZD496
EX DE,HL
POP HL
LD (HL),D
DEC HL
LD (HL),E ;чряшёрыш яхЁхт╕ЁэєЄ√щ ъюф
POP DE
_ZD4A1 INC HL
INC HL
DEC BC
LD A,C
OR B
JR NZ,_ZD472
ZD4A9=$+1
LD HL,0 ;рфЁхё фхЁхтр
LD E,L
LD D,H
INC DE
LD BC,#1FF
LD (HL),A;0
LDIR ;юўшёЄшыш 512 срщЄ (TODO яюўхьє эх сюы№°х? ышЄхЁрыют ьюцхЄ с√Є№ сюы№°х 256!)
POP HL ;фышэ√ ъюфют
LD BC,(ZD443) ;ўшёыю ъюфют
DEC BC
ADD HL,BC
EX DE,HL ;de=єърчрЄхы№ эр фышэє яюёыхфэхую ъюфр
LD (ZD523),IX ;ъръющ-Єю рфЁхё фы ъюфют фышээхх 8
LD HL,ziptrees+#A60+1 ;тёх ъюф√ яю 2 срщЄр эр ъюф (єцх яхЁхт╕ЁэєЄ√х)
ADD HL,BC
ADD HL,BC ;єърчрЄхы№ эр яюёыхфэшщ срщЄ яюёыхфэхую ъюфр
;ухэхЁшЁєхь фхЁхтю:
_ZD4C5
;bc=ышЄхЁры
LD A,(DE)
DEC DE
OR A
JR Z,_ZD503 ;ъюф фышэющ 0 (эхшёяюы№чєхь√щ) - яЁюяєёърхь
CP 9
PUSH DE
LD D,(HL)
DEC HL
LD E,(HL) ;de=ъюф
INC HL
PUSH HL ;TODO т√°х
JR NC,_ZD50B ;ъюф эх єьх∙рхЄё т 1 срщЄ - шёяюы№чєхь сєЇхЁ ix+...
;ъюф єьх∙рхЄё т 1 срщЄ
LD HL,1
INC A ;1..9
_ZD4D8 ADD HL,HL
DEC A
JR NZ,_ZD4D8
EX DE,HL ;de=1<<(1..9)
ADD HL,HL ;ъюф*2
LD A,(ZD4A9) ;рфЁхё фхЁхтр
ADD A,L
LD L,A
LD (__ZD4FE),A ;¤Єю ш...
LD A,(ZD4A9+1)
ADC A,H
LD H,A
INC A,A
LD (__ZD4F7),A ;...¤Єю чрфр╕Є рфЁхё т√їюфр (рфЁхё фхЁхтр + ъюф*2 + 512)
DEC DE
;ъырф╕ь ышЄхЁры т фхЁхтю
_ZD4F1 LD (HL),C
INC HL
LD (HL),B ;ъырф╕ь ышЄхЁры
ADD HL,DE ;ъръющ-Єю ьрушхщ эрїюфшь ёыхфє■∙шщ рфЁхё (рфЁхё ышЄхЁрыр + ъюф*2)
LD A,H
__ZD4F7=$+1
CP 0
JR C,_ZD4F1
JR NZ,_ZD501
LD A,L
__ZD4FE=$+1
CP 0
JR C,_ZD4F1 ;яюър эх фю°ыш фю рфЁхёр т√їюфр, ъырф╕ь ¤ЄюЄ ышЄхЁры (TODO чрўхь ьэюую Ёрч???)
_ZD501
POP HL,DE
_ZD503
DEC HL
DEC HL ;яЁхф√фє∙шщ ъюф
DEC BC ;яЁхф√фє∙шщ ышЄхЁры
BIT 7,B
JR Z,_ZD4C5
RET
_ZD50B
;ъюф эх єьх∙рхЄё т 1 срщЄ - шёяюы№чєхь сєЇхЁ ix+...
;a=фышэр ъюфр
;de=ъюф
SUB 8
PUSH BC ;ышЄхЁры
LD B,A ;фышэр ъюфр-8
LD A,D
LD D,0
LD HL,(ZD4A9) ;рфЁхё фхЁхтр
ADD HL,DE
ADD HL,DE
LD C,1 ;эхъшщ сшЄ фы яЁютхЁъш ёЄрЁ°хую срщЄр ъюфр
EXA
_ZD51A LD E,(HL)
INC HL
LD D,(HL) ;схЁ╕ь ышЄхЁры шч фхЁхтр яю ёьх∙хэш■ 2*(ъюф-256) (шыш рфЁхё ix+... яюёых яЁюїюфр - ёь. эшцх)
DEC HL
LD A,D
OR E
JR NZ,_ZD535 ;ышЄхЁры єцх чряюыэхэ!
;эєыхтющ ышЄхЁры (х∙╕ эх чряюыэхээ√щ)
ZD523=$+1
LD DE,0 ;ёэрўрыр Єєфр ъырыш ix
LD (HL),E
INC HL
LD (HL),D ;ъырф╕ь ¤ЄюЄ рфЁхё т фхЁхтю эр ьхёЄю х∙╕ эх чряюыэхээюую ышЄхЁрыр
LD H,D
LD L,E
LD (HL),A;0
INC HL
LD (HL),A;0
INC HL
LD (HL),A;0
INC HL
LD (HL),A;0 ;ш ъырф╕ь 4 эєы яю ¤Єюьє рфЁхёє (эр ёыхфє■∙хь яЁюїюфх ьюцхь шёяюы№чютрЄ№ яхЁт√х фтр шыш яюёыхфэшх фтр эєы , ўЄюс√ яюыюцшЄ№ Єєфр рфЁхё ышЄхЁрыр шыш ышЄхЁры)
INC HL
LD (ZD523),HL ;юсэюты хь с√т°шщ ix
_ZD535
EX DE,HL ;hl=рфЁхё = ix+... (шыш єцх чряюыэхээ√щ ышЄхЁры)
EXA
LD E,A ;ёЄрЁ°шщ срщЄ ъюфр
AND C ;яЁютхЁ хь эхъшщ сшЄ
LD A,E ;ёЄрЁ°шщ срщЄ ъюфр
JR Z,_ZD53E
INC HL,HL ;хёыш єёЄрэютыхэ, Єю рфЁхё+2 (TODO р хёыш ¤Єю с√ы ышЄхЁры???)
_ZD53E EXA
SLA C ;ёфтшурхь эхъшщ сшЄ
DJNZ _ZD51A ;яюяЁюсєхь ёыхфє■∙шщ рфЁхё шыш х∙╕ Ёрч ¤ЄюЄ цх (TODO р ўЄю хёыш ¤Єю с√ы ышЄхЁры, р эх ix+..., р сшЄшъ эх ёютяры - яютЄюЁшь ё Єхь цх рфЁхёюь???)
POP BC
LD (HL),C
INC HL
LD (HL),B ;ъырф╕ь ышЄхЁры
JR _ZD501 ;ъюэхЎ Єхъє∙хую ъюфр
readcodetree1;ZD549
;de=шьх■∙шхё фрээ√х
;out: hl=code
PUSH DE
XOR A
LD D,A
LD HL,ziptrees+#160+1 ;ЄєЄ ыхцшЄ яхЁтюх фхЁхтю
ADD HL,DE
ADD HL,DE ;hl=рфЁхё тЄюЁюую срщЄр ъюфр эюьхЁ e т фхЁхтх
OR (HL)
DEC HL
LD L,(HL)
LD H,A
if ziptrees>=0x8000
else
add a,a
endif
JP M,_ZD58C ;h bit 6 чэрўшЄ фхЁхтю, шэрўх hl=ышЄхЁры
PUSH HL
LD DE,ziptrees ;фышэ√ ъюфют яхЁтюую фхЁхтр???
ADD HL,DE
LD A,(HL) ;фышэр фюсртъш ъюфр фы шьх■∙хуюё hl???
POP HL
pop DE
_ZD560
;256: end of block Ц stop processing if last block, otherwise start processing next block.
;257Ц285: combined with extra-bits, a match length of 3Ц258 bytes.
;286, 287: not used, reserved and illegal but still part of the tree.
CALL read_a_bits
LD A,H
OR A
RET Z
LD A,L
CP 9
RET C
CP #1D
LD HL,#200
RET Z
DEC A
LD C,A
SRL C
SRL C
DEC C
AND 3
ADD A,4
LD H,L
LD L,A
LD A,C
_ZD57E ADD HL,HL
DEC C
JR NZ,_ZD57E
INC H
CALL get_a_bits
INC A
ADD A,L
LD L,A
RET NC
INC H
RET
_ZD58C POP DE
CALL ZD5CB ;ўшЄрЄ№ 8 сшЄ ш яЁющЄш яю эшь фхЁхтю hl
JR _ZD560
readcodetree2;ZD592
;de=шьх■∙шхё фрээ√х
;out: hl=code
;The distance tree contains space for 32 symbols:
;0Ц3: distances 1Ц4
;4Ц5: distances 5Ц8, 1 extra bit
;6Ц7: distances 9Ц16, 2 extra bits
;8Ц9: distances 17Ц32, 3 extra bits
;...
;26Ц27: distances 8,193Ц16,384, 12 extra bits
;28Ц29: distances 16,385Ц32,768, 13 extra bits
;30Ц31: not used, reserved and illegal but still part of the tree.
;Note that for the match distance symbols 2Ц29, the number of extra bits can be calculated as [n/2]-1.
PUSH DE
XOR A
LD D,A
LD HL,ziptrees+#360+1
ADD HL,DE
ADD HL,DE
OR (HL)
DEC HL
LD L,(HL)
LD H,A ;h bit 6 чэрўшЄ фхЁхтю, шэрўх hl=ышЄхЁры
if ziptrees>=0x8000
else
add a,a
endif
JP M,_ZD5C5 ;ўшЄрЄ№ 8 сшЄ ш яЁющЄш яю эшь фхЁхтю hl
PUSH HL
LD DE,ziptrees+#140 ;фышэ√ ъюфют тЄюЁюую фхЁхтр???
ADD HL,DE
LD A,(HL) ;фышэр фюсртъш ъюфр фы шьх■∙хуюё hl???
POP HL,DE
_ZD5A9 CALL read_a_bits ;фюўшЄ√трхь ёЄюы№ъю сшЄ, ёъюы№ъю яЁю°рурыш?
LD A,L ;ышЄхЁры
CP 4
RET C
RRA
DEC A
LD C,A
LD L,H
RL L
INC L,L
ZD5B8 ADD HL,HL
DEC C
JR NZ,ZD5B8
PUSH HL
CALL get_a_bits_tohl
EX DE,HL
EX (SP),HL
ADD HL,DE
POP DE
RET
_ZD5C5 POP DE
CALL ZD5CB ;ўшЄрЄ№ 8 сшЄ ш яЁющЄш яю эшь фхЁхтю hl
JR _ZD5A9
ZD5CB
;ўшЄрЄ№ 8 сшЄ ш яЁющЄш яю эшь фхЁхтю hl
;out: a=ёъюы№ъю сшЄ Ёхры№эю яЁю°рурыш, l=ышЄхЁры?
LD A,8
CALL read_a_bits
LD C,E ;¤ътштрыхэЄэю ld a,8:call get_a_bits:ld c,a ?
;їюфшь яю фхЁхтє hl, шьх ъюф C (ьырф°шх сшЄ√ ёэрўрыр)
XOR A
ZD5D2 INC A
RR C
JR NC,ZD5D9
INC HL
inc HL
ZD5D9 LD (ZD5DD),HL
ZD5DD=$+1
LD HL,(0)
if ziptrees>=0x8000
BIT 7,H
else
BIT 6,H ;h bit 6 чэрўшЄ фхЁхтю, шэрўх l=ышЄхЁры
endif
JR NZ,ZD5D2
RET
; ENT
;END_DEP=$
U6546=Z6546 ;ёъюы№ъю срщЄ ёюїЁрэшЄ№ = Єхъє∙шщ рфЁхё т сєЇхЁх