ys2-intro/loader/tools/exomizer-3.1/rawdecrs/z80/deexoopt_b3.asm
2025-11-13 19:07:39 +03:00

290 lines
7.6 KiB
NASM

;Exomizer 3 Z80 decoder
;Copyright (C) 2008-2018 by Jaime Tejedor Gomez (Metalbrain)
;
;Optimized by Antonio Villena and Urusergi
;
;Compression algorithm by Magnus Lind
; exomizer raw -P15 -T0 -b (literals=1) (reuse=0)
; exomizer raw -P15 -T1 -b (literals=0) (reuse=0)
; exomizer raw -P47 -T0 -b (literals=1) (reuse=1)
; exomizer raw -P47 -T1 -b (literals=0) (reuse=1)
;
; 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
;
IF mapbase-mapbase/256*256<240 AND mapbase-mapbase/256*256>135
ld iy, 256+mapbase/256*256
ELSE
ld iy, (mapbase+16)/256*256+112
ENDIF
ld a, 128
ld b, 52
push de
cp a
init ld c, 16
jr nz, get4
ld de, 1
ld ixl, c
defb 218
gb4 ld a, (hl)
dec hl
get4 adc a, a
jr z, gb4
rl c
jr nc, get4
ex af, af'
ld a, c
rrca
inc a
IF mapbase-mapbase/256*256<240 AND mapbase-mapbase/256*256>135
ld (iy-256+mapbase-mapbase/256*256), a
ELSE
ld (iy-112+mapbase-(mapbase+16)/256*256), a
ENDIF
jr nc, get5
xor 136
get5 push hl
ld hl, 1
defb 56
setbit add hl, hl
dec a
jr nz, setbit
ex af, af'
IF mapbase-mapbase/256*256<240 AND mapbase-mapbase/256*256>135
ld (iy-204+mapbase-mapbase/256*256), e
ld (iy-152+mapbase-mapbase/256*256), d
ELSE
ld (iy-60+mapbase-(mapbase+16)/256*256), e
ld (iy-8+mapbase-(mapbase+16)/256*256), d
ENDIF
add hl, de
ex de, hl
inc iyl
pop hl
dec ixl
djnz init
IF reuse=1
push iy
pop ix
IF mapbase-mapbase/256*256<240 AND mapbase-mapbase/256*256>135
ld (ix-152+mapbase-mapbase/256*256), 1
ELSE
ld (ix-6+mapbase-(mapbase+16)/256*256), 1
ENDIF
scf
ENDIF
pop de
litcop ldd
mloo1
IF reuse=1
IF mapbase-mapbase/256*256<240 AND mapbase-mapbase/256*256>135
rl (ix-152+mapbase-mapbase/256*256)
ELSE
rl (ix-6+mapbase-(mapbase+16)/256*256)
ENDIF
ENDIF
mloop add a, a
IF reuse=0
jr z, gbm
ELSE
jr nz, gbm
ld a, (hl)
dec hl
adc a, a
gbm
ENDIF
jr c, litcop
gbmc
IF mapbase-mapbase/256*256<240 AND mapbase-mapbase/256*256>135
ld c, 256-1
ELSE
ld c, 112-1
ENDIF
getind add a, a
jr z, gbi
gbic inc c
jr nc, getind
ccf
IF mapbase-mapbase/256*256<240 AND mapbase-mapbase/256*256>135
bit 4, c
IF literals=1
jr nz, litcat
ELSE
ret nz
ENDIF
ELSE
IF literals=1
jp m, litcat
ELSE
ret m
ENDIF
ENDIF
push de
ld iyl, c
ld de, 0
IF mapbase-mapbase/256*256<240 AND mapbase-mapbase/256*256>135
ld b, (iy-256+mapbase-mapbase/256*256)
ELSE
ld b, (iy-112+mapbase-(mapbase+16)/256*256)
ENDIF
dec b
call nz, getbits
ex de, hl
IF mapbase-mapbase/256*256<240 AND mapbase-mapbase/256*256>135
ld c, (iy-204+mapbase-mapbase/256*256)
ld b, (iy-152+mapbase-mapbase/256*256)
ELSE
ld c, (iy-60+mapbase-(mapbase+16)/256*256)
ld b, (iy-8+mapbase-(mapbase+16)/256*256)
ENDIF
add hl, bc
IF reuse=1
IF mapbase-mapbase/256*256<240 AND mapbase-mapbase/256*256>135
rl (ix-152+mapbase-mapbase/256*256)
ELSE
rl (ix-6+mapbase-(mapbase+16)/256*256)
ENDIF
and a
ENDIF
ex de, hl
push de
IF mapbase-mapbase/256*256<240 AND mapbase-mapbase/256*256>135
ld bc, 512+48
dec e
jr z, goit
dec e
ld bc, 1024+32
jr z, goit
ld c, 16
ELSE
ld bc, 512+160
dec e
jr z, goit
dec e
ld bc, 1024+144
jr z, goit
ld c, 128
ENDIF
IF reuse=1
goit
IF mapbase-mapbase/256*256<240 AND mapbase-mapbase/256*256>135
ld e, (ix-152+mapbase-mapbase/256*256)
ELSE
ld e, (ix-6+mapbase-(mapbase+16)/256*256)
ENDIF
bit 1, e
jr z, aqui
bit 2, e
jr nz, aqui
add a, a
ld de, (mapbase+156)
jr z, gba
jr c, caof
aqui ld de, 0
ELSE
ld e, 0
goit ld d, e
ENDIF
call lee8
ld iyl, c
add iy, de
ld e, d
IF mapbase-mapbase/256*256<240 AND mapbase-mapbase/256*256>135
ld b, (iy-256+mapbase-mapbase/256*256)
ELSE
ld b, (iy-112+mapbase-(mapbase+16)/256*256)
ENDIF
dec b
call nz, getbits
ex de, hl
IF mapbase-mapbase/256*256<240 AND mapbase-mapbase/256*256>135
ld c, (iy-204+mapbase-mapbase/256*256)
ld b, (iy-152+mapbase-mapbase/256*256)
ELSE
ld c, (iy-60+mapbase-(mapbase+16)/256*256)
ld b, (iy-8+mapbase-(mapbase+16)/256*256)
ENDIF
add hl, bc
IF reuse=1
ld (mapbase+156), hl
ENDIF
ex de, hl
caof pop bc
ex (sp), hl
ex de, hl
add hl, de
lddr
pop hl
jr mloop
IF literals=1
litcat
IF mapbase-mapbase/256*256<240 AND mapbase-mapbase/256*256>135
rl c
ENDIF
ret pe
ld b, (hl)
dec hl
ld c, (hl)
dec hl
lddr
IF reuse=0
jr mloo1
ELSE
scf
jp mloo1
ENDIF
ENDIF
gbi ld a, (hl)
dec hl
adc a, a
jp gbic
IF reuse=0
gbm ld a, (hl)
dec hl
adc a, a
jr nc, gbmc
jp litcop
ELSE
gba ld a, (hl)
dec hl
adc a, a
jr nc, aqui
jp caof
ENDIF
getbits jp p, lee8
rl b
jr z, gby
srl b
defb 250
xopy ld a, (hl)
dec hl
lee16 adc a, a
jr z, xopy
rl d
djnz lee16
gby ld e, (hl)
dec hl
ret
copy ld a, (hl)
dec hl
lee8 adc a, a
jr z, copy
rl e
djnz lee8
ret