PACKfil
;hl=addr
;[b=size in sectors]
;[de=first sector]
;hl'=fout+
;de'=0?
packfilsz=0x8000
;TODO яЁхфтрЁшЄхы№эю яЁютхЁшЄ№, ўЄю Їрщы ёє∙хёЄтєхЄ
ld a,(filehandle)
ld b,a
OS_GETFILESIZE ;dehl=filesize
ld (filesize),hl
ld (filesizeHSW),de
ld hl,0
;ld (paksz),hl
;ld (paksz+2),hl
ld (unpsz),hl
ld (unpsz+2),hl
;ld a,pgTEXT
;call OUTME
;тъы■ўхэр pgTEXT?
EXX
LD de,0;D,0 ;saved ;TODO de?
;LD (oldsaved),DE ;фы яхЁхяръютъш т Ёхцшьх store
;LD (oldhl_),HL ;фы яхЁхяръютъш т Ёхцшьх store
EXX
LD A,(tmethod)
SUB "p"
JR Z,$+4 ;store
LD A,4 ;pack
dic0
;PUSH HL
;LD HL,(SAVE1st)
;LD (oldSAVE1st),HL ;фы яхЁхяръютъш т Ёхцшьх store?
;LD HL,(lded)
;LD (oldlded),HL ;фы яхЁхяръютъш т Ёхцшьх store
pACKREP
;xor a ;"store"
LD (POISKIP),A
;LD HL,(unpsz)
;LD (remainsz),HL
call BYTEsPP_startfile ;ёюїЁрэшЄ№ шыш яЁюяєёЄшЄ№ яхЁт√х 2 ёхъЄюЁр Їрщыр
LD A,62
LD (p2NOjr),A ;яхЁт√щ Ёрч яЁюяєёърхь jr
LD HL,0
LD (CURCRC),HL
LD (CURCRC2),HL
;POP HL
LZ
;PUSH BC
call OUTpgTEXT
exx
push bc
push de
push hl
exx
ld de,-packfilsz
ld (ADRfrom),de
ld hl,packfilsz
;de=buf
;hl=size
call readstream_file
push hl
ld de,(unpsz)
add hl,de
ld (unpsz),hl
ld hl,(unpsz+2)
jr nc,$+3
inc hl
ld (unpsz+2),hl
pop hl
;ld (remainsz),hl
exx
pop hl
pop de
pop bc
exx
;hl=block length
p2NOjr=$
JR p2NO1stKUS ;яхЁт√щ Ёрч ld a,N
;яхЁт√щ сыюъ Їрщыр:
EXX
PUSH HL ;fheadCRC arc pos
EXX
LD A,(THEADON)
CP "n" ;чруюыютъш ЁрчЁх°хэ√?
push hl
LD IX,fihd-2
LD A,(fihdsz)
LD B,A
CALL Z,BLOCK ;чряшё√трхь чруюыютюъ Їрщыр
pop hl
EXX
LD C,1 ;bit collector
PUSH DE
PUSH HL ;file start pos
EXX
p2NO1stKUS
ld a,h
or l
jp z,packnoremain ;яєёЄющ Їрщы/яєёЄющ 32ъ сыюъ Їрщыр ;яЁртшы№э√щ т√їюф яЁш фышэх 0 (эр ёЄхъх 3 ўшёыр)
exx
PUSH BC,DE,HL
exx
push hl ;block length
call mktcrc ;TODO юфшэ Ёрч яЁш ёЄрЁЄх
call clearhashes
exx
; LD HL,pgLZ*256+pgTEXT ;TODO єсЁрЄ№ ¤Єш ъюэёЄрэЄ√ т ЁхушёЄЁрї
; IF k256
; LD DE,#352
; ELSE
; LD DE,#3EC
; ENDIF
;LD BC,32765
;OUT (C),L
call OUTpgTEXT
exx
pop bc ;block length
ADRfrom=$+1
LD HL,0
push bc
push hl
;hl=addr, bc=length
call gencrc
ld hl,frqs
ld bc,frqend-frqs-1
ld (hl),-1
call fillmem ;ўшёЄшь frqs
ld hl,ddfrq
ld bc,ddfrqend-ddfrq-1
ld (hl),-1
call fillmem ;ўшёЄшь ddfrq+rdfrq
pop hl
pop bc
LD DE,pakto
;hl=TEKADR
;de=PUTBITB=pakto (TODO 0)
;bc=length
LD A,1
LD (PUTBITC),A
LD (PUTBITB),DE
PUSH HL
ADD HL,BC
LD (INEND),HL
POP HL ;TEKADR
;jr $
CALL CRUNgo;LZPP
if 1==1
LD A,(POISKIP) ;method (0=store)
OR A
JR Z,NO269 ;store
;фюсртшь 269
filesize=$+1
ld hl,0
ld de,(unpsz)
;or a
sbc hl,de
ld a,h
or l
filesizeHSW=$+1
ld hl,0
ld de,(unpsz+2)
;or a
sbc hl,de
or h
or l
ADD A,-1 ;хёыш ¤Єю с√ы яюёыхфэшщ сыюъ Їрщыр (FILEremain=0), Єю сєфхЄ NC - эх чряш°хь ышЄхЁры
LD A,269&0xff
CALL C,PUTBYTi ;чряшёрыш ышЄхЁры юсэютыхэш фхЁхт№хт? яюёых сыюър! Є.х ьхцфє сыюърьш
NO269
endif
SCF
SBC A,A
CALL PUTBIT
CALL PUTBYTE ;чряшёрыш ышЄхЁры ъюэЎр сыюър (эхтючьюцэ√щ)
LD B,7
CALL PUT0
DJNZ $-3 ;flush сшЄютюую сєЇхЁр
;;Huffman:
EXX
;OUT (C),H
ld a,pgLZ
call OUTME
;IFN ramdisk
; LD A,H
; LD (BYTEPG),A
;ENDIF
POP HL,DE,BC
EXX
call packmktrees
LD HL,LBYTE
LD A,(POISKIP)
OR A
JR Z,infa ;"store"
call packwrtrees ;т яхЁтюь сыюъх Їрщыр яЁшэєфшЄхы№эю яш°хь фхЁхт№ схч ъюьрэф√, т яюёыхфє■∙шї ¤Єю сєфхЄ яюёых ъюьрэф√ (ъюЄюЁр т ъюэЎх тёхї сыюъют, ъЁюьх яюёыхфэхую)
LD HL,PKLHPP
infa
LD (pkiCALL+1),HL ;PKLHPP (ъюфшЁєхь ўхЁхч фхЁхтю)/LBYTE (яЁюёЄю ъюяшЁєхь срщЄ√)
LD A,24
LD (p2NOjr),A
IF fastWRI
LD A,(PUTBITB+1) ;уфх юёЄрэютшыё LZ ъюфхЁ (HSB)
CP #C0
JR NC,$+4 ;LZ ъюфхЁ тё╕ єьхёЄшы т ёЄЁрэшЎє - ьюцэю шьхЄ№ сюы№°ющ сєЇхЁ чряшёш ш ёюїЁрэ Є№ сюы№°шь сыюъюь
;хёыш lz data т√°ыю чр яЁхфхы√ ёЄЁрэшЎ√ ш єцх т pak9+ - эхы№ч шьхЄ№ сюы№°ющ сєЇхЁ чряшёш
LD A,fout/256+2+(svbfsz/256);fout/256+4 ;ё■фр эх яюярфрхь яЁш сыюърї 4K
LD (BYTEend),A ;рфЁхё (HSB), яЁш фюёЄшцхэшш ъюЄюЁюую яЁюЎхфєЁр BYTE яш°хЄ эр фшёъ
ENDIF
call packencodehuff
;CALL OUTpgTEXT ;!!! Ёрчтх фю ¤Єюую с√ыю эх тъы■ўхэю?
IF fastWRI ;??? TODO
;save buf
EXX
LD A,H
CP fout/256+2
JR C,FremNS ;т сєЇхЁх чряшёш ёухэхЁшЁютрэю эх сюыхх 512 срщЄ
PUSH BC
PUSH HL
CALL BYTEsPP ;ёюїЁрэшыш Ўхыюх ўшёыю ёхъЄюЁют
;HL=fout+512
;TODO фтшурЄ№ de, хёыш ёюїЁрэ ыш юЄ fout? ёхщўрё ъюёЄ√ы№ т ъюэЎх Їрщыр
EX DE,HL ;saved
EX (SP),HL
LD C,L
LD B,E
LD L,E
INC BC
LDIR ;юёЄрЄюъ яхЁхэюёшь т fout+512
DEC DE
EX DE,HL
POP DE ;saved TODO
POP BC
FremNS
EXX
ENDIF
;фюуЁєчшЄ№
JP LZ
PKST
EXX
LD HL,fout
LD E,L;0
LD D,L ;for CREATE empty (de=SAVEsz in sectors)
EXX
RET
packnoremain
;т ёЄхъх 3 ўшёыр
LD B,7
CALL PKBDpp ;фют√уЁєчшЄ№ срщЄ
;---continue filehead
EXX
PUSH DE ;saved ёхщўрё
EXX
POP HL
POP DE ;file start pos
POP BC ;saved с√ыю
inc bc
inc bc ;ъюёЄ√ы№ TODO
XOR A
SBC HL,BC ;add H
LD B,L
ld C,A ;c=0
LD A,H
EXX
PUSH HL
EXX
POP HL ;current outfile pos
SBC HL,DE
ADD HL,BC ;add H
ADC A,C ;c=0
POP DE ;filehead CRC outfile pos
LD IX,2
ADD IX,DE
;HL=filehead paksz
;c=0
LD (paksz),HL ;TODO єсЁрЄ№ (ёхщўрё фы яюърчр ЎшЇЁ?)
;ld bc,0
LD B,A
;EI
;ld hl,(paksz)
;ld bc,(paksz+2)
;bchl=paksz
LD A,(CPn)
CP "n"
RET NZ ;no CRC??? TODO
LD A,(THEADON)
CP "n"
ret nz;jr NZ,SAVE_ ;no rar header
PUSH DE ;filehead CRC outfile pos
LD (IX+5),L
LD (IX+6),H
LD (IX+7),c
LD (IX+8),b
ld hl,(unpsz)
ld (ix+9),l
ld (ix+10),h
ld hl,(unpsz+2)
ld (ix+11),l
ld (ix+12),h
POISKIP=$+1
JR $+6
LD (IX+23),"0"
LD HL,(CURCRC)
LD (IX+14),L
LD (IX+15),H
LD HL,(CURCRC2)
LD (IX+16),L
LD (IX+17),H
LD A,(fihdsz)
SUB 2 ;ЁрчьхЁ чруюыютър - 2
LD B,A
CALL UPCRC1
POP HL ;filehead CRC outfile pos
LD (HL),E
INC HL
LD (HL),D
if 1==1
;xor a
;jp pACKREP
ret
else
LD HL,(unpsz)
LD BC,(paksz)
OR A
SBC HL,BC
ret nc;jr NC,SAVE_ ;unpsz >= paksz
;яхЁхёюїЁрэ хь т Ёхцшьх stored
;TODO
;oldSAVE1st=$+1
; LD HL,0
; LD (SAVE1st),HL
oldlded=$+1
LD HL,0
LD (lded),HL
oldsaved=$+1
LD DE,0
oldhl_=$+1
LD HL,0
EXX
CALL CON1NAM
XOR A ;"store"
PUSH HL
JP pACKREP
endif
;flush and close outfile
SAVE_
EXX
;LD A,L
;LD (SAVElenLS1),A
push hl
call BYTEsPP_endfile ;ёюїЁрэ хь, ўЄю эх єёяхыш ёюїЁрэшЄ№
;SAVE1st=$+1
;LD HL,0 ;1stfree
;LD (BYTEsvTS),HL
pop hl
ret;jp SAVECLOSE
IF dolds
copdd
LD C,48
LD A,3
copdd0 PUSH BC,DE,HL
LDIR
POP HL,DE,BC
INC H,D
DEC A
jr NZ,copdd0
RET
ENDIF
clearhashes
;ўшёЄшь ї¤°-ЄрсышЎє
IF k256
LD A,k256
CALL CLPG
else
ld hl,keys
ld bc,+((keymask+1)*512)-1
ld (hl),0
call fillmem
ENDIF
;TODO яюЄюь тхЁэєЄ№ ¤Єю єёъюЁхэшх юўшёЄъш
;LD A,(ADRfrom+1)
;CP #E0
LD A,3;#17
CALL CLPG
;ret nc ;JR NC,LZncl
DEC A
CALL CLPG
;LD A,(ADRfrom+1)
;CP #C0
;ret nc ;JR NC,LZncl
dec a;LD A,#14
CALL CLPG
DEC A
jp CLPG
packmktrees
;ёхщўрё т frqs ўрёЄюЄ√ тёхї ышЄхЁрыют
LD HL,ldbit
LD BC,298
call HUFFMAN
;ЄхяхЁ№ т ldbit - фышэ√ ъюфют ш ёрьш ъюф√
LD DE,lens
LDIR
PUSH DE
;ёЄЁюшь фхЁхтю dd
;jr $
LD HL,ddfrq
LD DE,frqs
LD BC,298*2
LDIR
LD HL,ddbit
LD C,48
call HUFFMAN
POP DE
LDIR
IF dolds
PUSH DE
;фхЁхтю rd
LD HL,ddfrq;rdfrq ;(rd ыхцшЄ ъръ ышЄхЁры√ 48..75 т dd)
LD DE,frqs
LD BC,298*2
LDIR
LD HL,frqs
LD B,2*48 ;ышёЄ№ dd
LD (HL),-1 ;эх тёЄЁхўрышё№
INC L
DJNZ $-3
LD HL,ddbit
LD DE,ddbit+48+28 ;Єшїюх ьхёЄю
PUSH DE
push HL
CALL copdd
LD HL,ddbit;rdbit
LD C,48+28;28
call HUFFMAN
POP DE
pop HL
CALL copdd
LD HL,rdbit
POP DE
LD C,28
LDIR
ELSE
LD H,D
ld L,E
INC DE
LD C,27
LD (HL),B
LDIR
ENDIF
LD A,-1
LD (DE),A
;ёЄЁюшь фхЁхтю bd
;фы эрўрыр яЁхюсЁрчєхь lens
;ъюф√ 16,17,18 - т 2-срщЄэюь ЇюЁьрЄх
LD HL,lens-1
LD D,H
ld E,L
prlensN
LD A,(HL)
prlensD LD (DE),A
INC HL
inc DE
LD BC,255 ;тьхёЄю -1;INC B:DJNZ
LD A,(HL)
CP C
JR Z,prlensQ
PUSH HL
prlensR INC BC
inc HL
CP (HL)
JR Z,prlensR
POP HL
OR A
LD A,C
JR Z,prlensZ
DJNZ prlR256
CP 4-1
JR C,prlensN
CP 4+4-1
JR C,prlen16
prlR256 LD BC,4+3-1 ;max repeat
prlen16 LD A,(HL)
ADD HL,BC
LD (DE),A
INC DE
LD A,16
LD (DE),A
INC DE
LD A,C
SUB 4-1
JR prlensD
prlensZ
DJNZ prlZ256
CP 3-1
JR C,prlensN
CP 11-1
JR C,prlen17
CP 11+128-1
JR C,prlen18
prlZ256 LD BC,11+127-1 ;max repeat zero
prlen18 ADD HL,BC
LD A,18
LD (DE),A
INC DE
LD A,C
SUB 11-1
JR prlensD
prlen17 ADD HL,BC
LD A,17
LD (DE),A
INC DE
LD A,C
SUB 3-1
JR prlensD
prlensQ
LD (DE),A ;-1
LD HL,frqs
;PUSH HL
LD BC,298*2
LD (HL),A;-1
CALL fillmem;CLSA
DEC B
LD HL,lens
;POP DE
LD DE,frqs
FRQL0 PUSH HL
LD L,(HL)
LD H,B;0
ADD HL,HL
ADD HL,DE
INC (HL)
JR NZ,$+4
INC HL
INC (HL)
POP HL
BIT 4,(HL)
JR Z,$+3
INC HL
INC HL
LD A,(HL)
INC A
JR NZ,FRQL0
LD HL,bdbit
LD C,19
jp HUFFMAN
packwrtrees
;no MMC
CALL bit0
;clear old
CALL bit0
;---tree
LD HL,bdbit
LD C,19
pkbdli
LD A,(HL)
RLA
RLA
RLA
RLA
INC L
LD B,4
CALL PKBDpp
DEC C
JR NZ,pkbdli
LD HL,lens
pkiL PUSH HL
LD L,(HL)
LD H,bdbit/256
CALL PKNNpp ;яш°хь ъюф ╒рЇЇьрэр (т hl ўхЁхч 256: фышэр, HSB, LSB) - яш°хь ёЄрЁ°шх сшЄ√
POP HL
LD A,(HL)
CP 16
JR C,pkLN16
CP 17
INC HL
LD A,(HL)
LD B,3
JR Z,pkL17
DEC B
JR C,pkL16
LD B,7
RLA
JR pkLadd
pkL17 RRCA
pkL16 RRCA
RRCA
pkLadd CALL PKBDpp
pkLN16 INC HL
LD A,(HL)
INC A
JR NZ,pkiL
ret
packencodehuff
LD HL,pakto
LD DE,(ADRfrom) ;фы opt2s
LD A,128
pki0
ADD A,A
JR NZ,GET9Q
LD A,(HL)
INC L
CALL Z,INCH
RLA
GET9Q
PUSH HL
LD L,(HL)
LD H,ldbit/512
RL H
LD B,(HL)
INC H
inc H
LD C,(HL)
INC H
inc H
EXA
LD A,H
RRA
JR NC,pkiNC
LD A,L
OR A
JP M,pki0Q ;ышЄхЁры ъюэЎр ЄхъёЄр (эхтючьюцэ√щ)
SUB 261&0xff
CP 8
JP C,pkiL2
LD A,1
pkiNC
LD A,H
pkiCALL CALL PKLHPP ;/LBYTE фы "store"
POP HL
CP ldbit/256+5
JP NZ,pkiN ;byte
LD A,(HL)
IF dolds
OR A
JP Z,pkiYOLD
ENDIF
CP 269&0xff
JP Z,pkinewtrees;pkiNDE ;юсэютыхэшх фхЁхт№хт?
INC L
CALL Z,INCH
IF dolds
CP 261&0xff
JR NC,pkiN4
;olddisp 257..260=+1..4,len8
LD B,A
PUSH HL
LD A,(HL) ;len
DJNZ $+5
LD HL,(OLDSMES)
DJNZ $+5
LD HL,(OL2SMES)
DJNZ $+5
LD HL,(OL3SMES)
DJNZ $+5
LD HL,(OL4SMES)
LD (SMESH),HL
LD (pkiOLD),A
POP HL
INC L
CALL Z,INCH
LD A,(HL) ;ёъюЁЁхъЄшЁютрээ√щ len
CALL LZMID
;C=Єюъхэ
PUSH BC,HL
;A=юёЄрЄюъ,B=ўшёыю сшЄ
PUSH AF
LD A,C
ADD A,rdbit&0xff
LD L,A ;ышЄхЁры√ 48..75 тьхёЄю 0..27
POP AF
LD H,rdbit/256
LD B,(HL)
INC H
LD C,(HL)
INC H
LD L,(HL)
LD H,C
ADD HL,HL
CALL bit
DJNZ $-4
POP HL,BC
INC B
DEC B
JR Z,pkioQ
CPL ;!
LD C,B
RRCA
DJNZ $-1
LD B,C
RLA
CALL bit
DJNZ $-4
pkioQ JP pkiYOLD
pkiN4
ENDIF
CP 278&0xff
JP NC,pkiLL
;len<=10 270..277=+E..15,-disp16
SUB 0xff&(270-3)
LD (pkiOLD),A
JP pkiLQ
;len=2 261..268=+5..C,-disp8
pkiL2
;dolds яюёых len=2 эх сєфхЄ 4 Ёрчр
LD L,(HL)
LD H,C
LD (codeL2),HL
POP HL
INC L
CALL Z,INCH
IF dolds
LD A,-1
LD (SMESH+1),A
ENDIF
LD A,(HL)
IF dolds
LD (SMESH),A
ENDIF
PUSH HL
PUSH BC
CALL LZLITPP
;A=юёЄрЄюъ,B=ўшёыю сшЄ
CPL ;!
LD C,B
RRCA
DJNZ $-1
LD B,C
ld C,A
POP AF
IF opt2s
ADD A,B
LD LX,A
;ёўшЄрхь 2 срщЄр т DE, хёыш шї эх чрЄхЁыш
;ш хёыш юэш хёЄ№ т tree (р юэш хёЄ№, Є.ъ. tree юфэю)
LD HL,(PUTBITB) ;HL' эх трцхэ
LD A,H
ADD A,pak9/256
LD H,A
JR C,pkiL2CP
SBC HL,DE
INC DE
JR NC,pkiL2Z ;чрЄхЁыш
DEC DE
pkiL2CP PUSH BC
LD A,pgTEXT;16
CALL OUTNO ;тЁхьхээю тъы■ўрхь 0-■ ёЄЁрэшЎє
LD A,(DE)
INC DE
LD L,A
LD H,ldbit/256+4
LD C,(HL)
DEC H
dec H
LD B,(HL)
DEC H
dec H
LD (code1),BC
LD B,(HL)
EX DE,HL
LD E,(HL)
EX DE,HL
CALL BYTEPG-1 ;тъы■ўрхь ёЄрЁє■ ёЄЁрэшЎє TODO
LD A,B
ADD A,(HL)
PUSH HL
INC H
inc H
LD C,(HL)
INC H
inc H
CP LX
LD A,(HL)
JR NC,pkiL2Y ;т√уюфэхх ёё√ыър
;т√уюфэхх ёшьтюы√
code1=$+1
LD HL,0
CALL PKHLPP
POP HL
LD B,(HL)
LD H,C
ld L,A
CALL PKHLPP
POP AF
JR pkiNPOPnSSYL
pkiL2Y POP AF
POP BC
pkiL2Z LD A,LX
SUB B
ENDIF
codeL2=$+1
LD HL,0
PUSH BC
LD B,A
CALL PKHLPP
POP BC
LD A,C
CALL PKBDpp
;IFN dolds ;т v0.33 єцх чръюььхэЄшЁютрэю
;LD A,2
;LD (pkiOLD),A
;ENDIF
JR pkiNPOP
;len>10 278..297=+16..29,len8,-disp16
pkiLL
LD A,(HL)
LD (pkiOLD),A
DEC A ;len фхъЁхьхэЄшЁютрэ
CALL LZMIDPP
;A=юёЄрЄюъ,B=ўшёыю сшЄ
CPL ;!
LD C,B
RRCA
DJNZ $-1
LD B,C
CALL PKBDpp
INC L
CALL Z,INCH
pkiLQ
;фы юс√ўэ√ї ёё√ыюъ Єшяр >=3 ш Єшяр >=11
PUSH DE
LD E,(HL)
INC L
CALL Z,INCH
LD D,(HL)
IF dolds
LD (SMESH),DE
ENDIF
PUSH HL
LD HL,#1FFF
ADD HL,DE
JR C,$+6
LD HL,pkiOLD
INC (HL) ;>=#2000
;DE=-disp16
CALL LZDISPP
;A=dd code
;HL=юёЄрЄюъ,B=ўшёыю сшЄ+1
PUSH BC
DEC B
JR Z,pkiLRQ
RR H
rr L
rr D
rr E
DJNZ $-8
pkiLRQ ;PUSH DE
LD L,A
LD H,ddbit/256
CALL PKNNpp
;POP HL
EX DE,HL
CALL INVHL
POP BC
;HL=юёЄрЄюъ<<,B=ўшёыю сшЄ+1
DEC B
CALL NZ,PKHLPP
;;
POP HL
POP DE
pkiYOLD
;ъюф 256, ъюэхЎ юсЁрсюЄъш 257..260 ш яЁюёЄ√ї ёё√ыюъ
PUSH HL
pkiOLD=$+1 ;фы 256 ш фы opt2s
LD HL,0
DEC HL
ADD HL,DE
EX DE,HL
pkiNPOP
;ъюэхЎ юсЁрсюЄъш len=2:ёё√ыър (INC DE Єрь тэєЄЁш)
IF dolds
CALL LZPUTQQ ;ёфтшу сєЇхЁр SMESH'хщ
ENDIF
pkiNPOPnSSYL
;ъюэхЎ юсЁрсюЄъш len=2:ёшьтюы√
POP HL
pkiN
;or a
;jr z,$
;cp 3
;jr z,$
INC DE ;эхяръ. рфЁхё фы opt2s
pkinewtrees
pkiNDE INC L
CALL Z,INCH
EXA
JP pki0
pki0Q
POP HL
ret