From 2fbdf974338bde8576efdae40a819a76b2391033 Mon Sep 17 00:00:00 2001 From: "Juan J. Martinez" Date: Sun, 5 Nov 2023 11:22:55 +0000 Subject: Initial import of the open source release --- tools/rasm_src/decrunch/deexo.asm | 118 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 tools/rasm_src/decrunch/deexo.asm (limited to 'tools/rasm_src/decrunch/deexo.asm') diff --git a/tools/rasm_src/decrunch/deexo.asm b/tools/rasm_src/decrunch/deexo.asm new file mode 100644 index 0000000..6a4a7ac --- /dev/null +++ b/tools/rasm_src/decrunch/deexo.asm @@ -0,0 +1,118 @@ +;Exomizer 2 Z80 decoder +; by Metalbrain +; +; optimized by Antonio Villena and Urusergi (169 bytes) +; +; compression algorithm by Magnus Lind + +;input: hl=compressed data start +; de=uncompressed destination start +; +; you may change exo_mapbasebits to point to any free buffer +; +;ATTENTION! +;A huge speed boost (around 14%) can be gained at the cost of only 5 bytes. +;If you want this, replace all instances of "call exo_getbit" with "srl a" followed by +;"call z,exo_getbit", and remove the first two instructions in exo_getbit routine. + +Macro Mizoumizeur + +@deexo: ld iy, @exo_mapbasebits+11 + ld a, (hl) + inc hl + ld b, 52 + push de + cp a +@exo_initbits: ld c, 16 + jr nz, @exo_get4bits + ld ixl, c + ld de, 1 ;DE=b2 +@exo_get4bits: srl a: call z, @exo_getbit ;get one bit + rl c + jr nc, @exo_get4bits + inc c + push hl + ld hl, 1 + ld (iy+41), c ;bits[i]=b1 (and opcode 41 == add hl,hl) +@exo_setbit: dec c + jr nz, @exo_setbit-1 ;jump to add hl,hl instruction + ld (iy-11), e + ld (iy+93), d ;base[i]=b2 + add hl, de + ex de, hl + inc iy + pop hl + dec ixl + djnz @exo_initbits + pop de + jr @exo_mainloop +@exo_literalrun: ld e, c ;DE=1 +@exo_getbits: dec b + ret z +@exo_getbits1: srl a : call z,@exo_getbit + rl e + rl d + jr nc, @exo_getbits + ld b, d + ld c, e + pop de +@exo_literalcopy:ldir +@exo_mainloop: inc c + srl a : call z,@exo_getbit ;literal? + jr c, @exo_literalcopy + ld c, 239 +@exo_getindex: srl a : call z,@exo_getbit + inc c + jr nc,@exo_getindex + ret z + push de + ld d, b + jp p, @exo_literalrun + ld iy, @exo_mapbasebits-229 + call @exo_getpair + push de + rlc d + jr nz, @exo_dontgo + dec e + ld bc, 512+32 ;2 bits, 48 offset + jr z, @exo_goforit + dec e ;2? +@exo_dontgo: ld bc, 1024+16 ;4 bits, 32 offset + jr z, @exo_goforit + ld de, 0 + ld c, d ;16 offset +@exo_goforit: call @exo_getbits1 + ld iy, @exo_mapbasebits+27 + add iy, de + call @exo_getpair + pop bc + ex (sp), hl + push hl + sbc hl, de + pop de + ldir + pop hl + jr @exo_mainloop ;Next! + +@exo_getpair: add iy, bc + ld e, d + ld b, (iy+41) + call @exo_getbits + ex de, hl + ld c, (iy-11) + ld b, (iy+93) + add hl, bc ;Always clear C flag + ex de, hl + ret + +@exo_getbit: ; srl a + ;ret nz + ld a, (hl) + inc hl + rra + ret + +@exo_mapbasebits: defs 156 ;tables for bits, baseL, baseH + +Mend + -- cgit v1.2.3