; aPPack decompressor ; original source by dwedit ; very slightly adapted by utopian ; optimized by Metalbrain ;hl = source ;de = dest depack: ld a, 128 apbranch1: ldi aploop2: ld ixh, 1 aploop: add a, a jr z, ap1 jr nc, apbranch1 apnogetbit1: add a, a jr z, ap2 jr nc, apbranch2 apnogetbit2: add a, a jr z, ap3 jr nc, apbranch3 apnogetbit3: ld bc, 16 ;get an offset apget4bits: add a, a jr z, ap4 apnogetbit4: rl c jp nc, apget4bits jr nz, apbranch4 ex de, hl ld (hl), b ;write a 0 ex de, hl inc de jp aploop2 ap1: ld a, (hl) inc hl rla jr c, apnogetbit1 jp apbranch1 ap4: ld a, (hl) inc hl rla jp apnogetbit4 apbranch4: ex af, af' ex de, hl ;write a previous byte (1-15 away from dest) sbc hl, bc ld a, (hl) add hl, bc ld (hl), a ex af, af' ex de, hl inc de jp aploop2 ap3: ld a, (hl) inc hl rla jr c, apnogetbit3 apbranch3: ld c, (hl) ;use 7 bit offset, length = 2 or 3 inc hl ex af, af' rr c ret z ;if a zero is found here, it's EOF ld a, 2 ld b, 0 adc a, b push hl ld iyh, b ld iyl, c ld h, d ld l, e sbc hl, bc ld c, a ex af, af' ldir pop hl ld ixh, b jp aploop ap2: ld a, (hl) inc hl rla jr c, apnogetbit2 apbranch2: call ap_getgamma ;use a gamma code * 256 for offset, another gamma code for length dec c ex af, af' ld a, c sub ixh jr z, ap_r0_gamma dec a ;do I even need this code? ;bc=bc*256+(hl), lazy 16bit way ld b, a ld c, (hl) inc hl ld iyh, b ld iyl, c push bc call ap_getgamma2 ex (sp), hl ;bc = len, hl=offs push de ex de, hl ex af, af' ld a, 4 cp d jr nc, apskip2 inc bc or a apskip2: ld hl, 127 sbc hl, de jr c, apskip3 inc bc inc bc apskip3: pop hl ;bc = len, de = offs, hl=junk push hl or a sbc hl, de ex af, af' pop de ;hl=dest-offs, bc=len, de = dest ldir pop hl ld ixh, b jp aploop ap_r0_gamma: call ap_getgamma2 ;and a new gamma code for length push hl push de ex de, hl ld d, iyh ld e, iyl sbc hl, de pop de ;hl=dest-offs, bc=len, de = dest ldir pop hl ld ixh, b jp aploop ap5: ld a,(hl) inc hl rla jp apnogetbit5 ap6: ld a, (hl) inc hl rla jp apnogetbit6 ap7: ld a, (hl) inc hl rla jp apnogetbit7 ap8: ld a, (hl) inc hl rla jp apnogetbit8 ap9: ld a, (hl) inc hl rla jp apnogetbit9 ap10: ld a, (hl) inc hl rla ret nc jp ap_getgammaloop ap_getgamma2: ex af, af' ap_getgamma: ld bc, 1 add a, a jr z, ap5 apnogetbit5: rl c add a, a jr z, ap6 apnogetbit6: ret nc add a, a jr z, ap7 apnogetbit7: rl c add a, a jr z, ap8 apnogetbit8: ret nc ap_getgammaloop:add a, a jr z, ap9 apnogetbit9: rl c rl b add a, a jr z, ap10 apnogetbit10: ret nc jp ap_getgammaloop