;------------------------------------------------------------------------------ ;hl=src de=dst lz4decrunch: ld bc,7 add hl,bc ld c,(hl) inc hl ld b,(hl) ;quv} trp qpzp yx xps|r{p - px}u inc hl inc hl inc hl ;~pp| wp tp~~ }uu~y #0B ld a,l add a,c ld (.endL+1),a ld a,h adc a,b ld (.endH+1),a ;K~u~z ptu wp tp~~ .loop: ld a,(hl) inc hl ld (.litteral+1),a and #F0 jr z,.copy ;E|y t|y~p pr~p 0, {yrp wu uutp~~u tp~~u rrca rrca rrca rrca ld b,0 ld c,a cp #0F call z,.getlength ;E|y t|y~p #0F, |y t|~yu|~ t|y~ ldir ;Puutpp ~py~pu |utuz y~}pyy t|y~u .copy: ld a,l ;tys|y |y wpu tp~~u {~u~s ptup .endL: sub #FF ld a,h .endH: sbc a,#FF ret nc ;^u{yr~p ru{p zf=1 ld c,(hl) inc hl ld b,(hl) ;bc=2byte Xu~yu x~pu~y }uu~y inc hl .litteral: ld a,0 ;litteral uuyp xtu and #0F add a,#04 ;cf=0 push hl ld h,d ld l,e sbc hl,bc ;hl=de-bc I|xzu tp~~u, {u wu q|y pyu~, r {puru y~y{p uutpy ld b,0 ld c,a cp #0F+#04 ex (sp),hl call z,.getlength ex (sp),hl ldir ;Kyrp uu~ wu pxru~ tp~~ pop hl jp .loop .getlength: ;P|y t|y~ qpzp uurtp (q|u) bc=u{p }}p uurtp ld a,(hl) inc hl cp #FF ;#FF trpyrpu {p{ x~p{, xp {} |utu y~}py t|y~u jr nz,.addlen inc b dec bc ;bc += 255 jr .getlength .addlen: add a,c ld c,a adc a,b sub c ld b,a ;bc=t|y~p uutprpu}s qpzp ret ;------------------------------------------------------------------------------ ;in: hl=~pp|~z ptu bc=t|y~p ;out: bcde=ux|p crc32: push hl push bc ld de,#FFFF ; 0xFFFFFFFF ? ~pp|~u x~pu~yu CRC32, y|xu}s r ZIP ld h,d ld l,e ld c,#20 ;{pu~yu exx pop hl dec hl inc h inc l ld b,l ld c,h pop hl .loop1: ld a,(hl) inc hl exx xor e ld b,8 .loop2: srl h rr l rr d rra jp nc,.skip ld e,a ld a,h xor #ED ld h,a ld a,l xor #B8 ld l,a ld a,d xor #83 ld d,a ld a,e ; xor #20 xor c .skip: djnz .loop2 ld e,a exx djnz .loop1 dec c jp nz,.loop1 exx ld a,h ;CRC32, y|xu}z r ZIP, y~y}pu xor 0xFFFFFFFF r {~u cpl ld b,a ld a,l cpl ld c,a ld a,d cpl ld d,a ld a,e cpl ld e,a ret