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/exomizer3megachur.asm | 210 ++++++++++++++++++++++++++ 1 file changed, 210 insertions(+) create mode 100644 tools/rasm_src/decrunch/exomizer3megachur.asm (limited to 'tools/rasm_src/decrunch/exomizer3megachur.asm') diff --git a/tools/rasm_src/decrunch/exomizer3megachur.asm b/tools/rasm_src/decrunch/exomizer3megachur.asm new file mode 100644 index 0000000..ea1973e --- /dev/null +++ b/tools/rasm_src/decrunch/exomizer3megachur.asm @@ -0,0 +1,210 @@ +;Exomizer 2 Z80 decoder +;Copyright (C) 2008-2016 by Jaime Tejedor Gomez (Metalbrain) +; +;Optimized by Antonio Villena and Urusergi (169 bytes) +; +;Compression algorithm by Magnus Lind +; +; This depacker is free software; you can redistribute it and/or +; modify it under the terms of the GNU Lesser General Public +; License as published by the Free Software Foundation; either +; version 2.1 of the License, or (at your option) any later version. +; +; This library is distributed in the hope that it will be useful, +; but WITHOUT ANY WARRANTY; without even the implied warranty of +; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +; Lesser General Public License for more details. +; +; You should have received a copy of the GNU Lesser General Public +; License along with this library; if not, write to the Free Software +; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +; +; +;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. +; --------------------------- +; modified by Megachur in 2018 +; --------------------------- +; hl -> compressed data start +; de -> uncompressed destination start +; --------------------------- + +;EXO_BACKWARD equ 1 +ENABLE_MEXO_GETBIT equ 1 + +list:EXOMIZER_ADDRESS:nolist +; --------------------------- +MACRO MEXO_GETBIT + srl a + jr nz,@1 + ld a,(hl) + IFDEF EXO_BACKWARD + dec hl + ELSE + inc hl + ENDIF + rra +@1 +ENDM + +deexo: + ld iy,exo_mapbasebits+11 + ld a,(hl) + + IFDEF EXO_BACKWARD + dec hl + ELSE + inc hl + ENDIF + + 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: + IFDEF ENABLE_MEXO_GETBIT + MEXO_GETBIT + ELSE + srl a:call z,exo_getbit ;call exo_getbit ;get one bit + ENDIF + 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: + IFDEF ENABLE_MEXO_GETBIT + MEXO_GETBIT + ELSE + srl a:call z,exo_getbit ;call exo_getbit + ENDIF + rl e + rl d + jr nc,exo_getbits + ld b,d + ld c,e + pop de + +exo_literalcopy: + IFDEF EXO_BACKWARD + lddr + ELSE + ldir + ENDIF +exo_mainloop: + inc c + IFDEF ENABLE_MEXO_GETBIT + MEXO_GETBIT + ELSE + srl a:call z,exo_getbit ;call exo_getbit ;literal? + ENDIF + jr c,exo_literalcopy + ld c,239 +exo_getindex: + IFDEF ENABLE_MEXO_GETBIT + MEXO_GETBIT + ELSE + srl a:call z,exo_getbit ;call exo_getbit + ENDIF + 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 + IFDEF EXO_BACKWARD + ex de,hl + add hl,de + lddr + ELSE + push hl + sbc hl,de + pop de + ldir + ENDIF + 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 + + IFDEF ENABLE_MEXO_GETBIT + ELSE +exo_getbit: +; srl a +; ret nz + ld a,(hl) + inc hl + rra + ret + ENDIF + +exo_mapbasebits: + ds 156,#00 ;tables for bits,baseL,baseH +; --------------------------- +list:EXOMIZER_ADDRESS_LENGTH equ $-EXOMIZER_ADDRESS:nolist \ No newline at end of file -- cgit v1.2.3