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

463 lines
11 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 -P13 -T0 [-b] (speed<3, literals=1)
; exomizer raw -P13 -T1 [-b] (speed<3, literals=0)
; exomizer raw -P15 -T0 [-b] (speed=3, literals=1)
; exomizer raw -P15 -T1 [-b] (speed=3, literals=0)
;
; 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
;
; SIZE speed 0 speed 1 speed 2 speed 3 range88-ef
; forw nolit 148 150 167 204 +2
; back nolit 146 148 165 202 +2
; forw liter 158 160 177 214 +3
; back liter 156 158 175 212 +3
; output deexoopt.bin
; define mapbase $5b00
; define speed 3
; define back 0
; define literals 0
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
exinit ld c, 16
jr nz, exget4
ld de, 1
ld ixl, c
IF speed=0
exget4 call exgetb
ENDIF
IF speed=1
exget4 add a, a
call z, exgetb
ENDIF
IF speed=2 OR speed=3
defb 218
exgb4 ld a, (hl)
IF back=1
dec hl
ELSE
inc hl
ENDIF
exget4 adc a, a
jr z, exgb4
ENDIF
rl c
jr nc, exget4
IF speed=0 OR speed=1
IF mapbase-mapbase/256*256<240 AND mapbase-mapbase/256*256>135
ld (iy-256+mapbase-mapbase/256*256), c
ELSE
ld (iy-112+mapbase-(mapbase+16)/256*256), c
ENDIF
push hl
ld hl, 1
defb 210
ENDIF
IF speed=2
inc c
IF mapbase-mapbase/256*256<240 AND mapbase-mapbase/256*256>135
ld (iy-256+mapbase-mapbase/256*256), c
ELSE
ld (iy-112+mapbase-(mapbase+16)/256*256), c
ENDIF
push hl
ld hl, 1
defb 48
ENDIF
IF speed=3
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'
ELSE
exsetb add hl, hl
dec c
jr nz, exsetb
ENDIF
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 exinit
pop de
IF back=1
IF literals=1 AND speed=0
exlit inc c
exseq lddr
ELSE
exlit ldd
ENDIF
ELSE
IF literals=1 AND speed=0
exlit inc c
exseq ldir
ELSE
exlit ldi
ENDIF
ENDIF
IF speed=0
exloop call exgetb
jr c, exlit
IF mapbase-mapbase/256*256<240 AND mapbase-mapbase/256*256>135
ld c, 256-1
ELSE
ld c, 112-1
ENDIF
exgeti call exgetb
ENDIF
IF speed=1
exloop add a, a
call z, exgetb
jr c, exlit
IF mapbase-mapbase/256*256<240 AND mapbase-mapbase/256*256>135
ld c, 256-1
ELSE
ld c, 112-1
ENDIF
exgeti add a, a
call z, exgetb
ENDIF
IF speed=2 OR speed=3
exloop add a, a
jr z, exgbm
jr c, exlit
IF mapbase-mapbase/256*256<240 AND mapbase-mapbase/256*256>135
exgbmc ld c, 256-1
ELSE
exgbmc ld c, 112-1
ENDIF
exgeti add a, a
jr z, exgbi
exgbic inc c
jr nc, exgeti
ccf
ELSE
exgbic inc c
jr nc, exgeti
ENDIF
IF mapbase-mapbase/256*256<240 AND mapbase-mapbase/256*256>135
bit 4, c
IF literals=1
jr nz, excat
ELSE
ret nz
ENDIF
ELSE
IF literals=1
jp m, excat
ELSE
ret m
ENDIF
ENDIF
push de
ld iyl, c
IF speed=2 OR speed=3
ld de, 0
ENDIF
IF speed=3
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, exgbts
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
ex de, hl
ELSE
call expair
ENDIF
push de
IF mapbase-mapbase/256*256<240 AND mapbase-mapbase/256*256>135
ld bc, 512+48
dec e
jr z, exgoit
dec e
ld bc, 1024+32
jr z, exgoit
ld c, 16
ELSE
ld bc, 512+160
dec e
jr z, exgoit
dec e
ld bc, 1024+144
jr z, exgoit
ld c, 128
ENDIF
IF speed=0 OR speed=1
exgoit call exgbts
ENDIF
IF speed=2
ld e, 0
exgoit ld d, e
call exgbts
ENDIF
IF speed=3
ld e, 0
exgoit ld d, e
call exlee8
ENDIF
ld iyl, c
add iy, de
IF speed=2 OR speed=3
ld e, d
ENDIF
IF speed=3
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, exgbts
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
ex de, hl
ELSE
call expair
ENDIF
pop bc
ex (sp), hl
IF back=1
ex de, hl
add hl, de
lddr
ELSE
push hl
sbc hl, de
pop de
ldir
ENDIF
pop hl
jr exloop
IF literals=1
excat
IF mapbase-mapbase/256*256<240 AND mapbase-mapbase/256*256>135
rl c
ENDIF
ret pe
IF speed=3
ld b, (hl)
IF back=1
dec hl
ELSE
inc hl
ENDIF
ld c, (hl)
IF back=1
dec hl
ELSE
inc hl
ENDIF
ELSE
push de
IF speed=2
ld de, 0
ENDIF
ld b, 16
call exgbts
ld b, d
ld c, e
pop de
ENDIF
IF speed=0
jr exseq
ELSE
IF back=1
lddr
ELSE
ldir
ENDIF
jr exloop
ENDIF
ENDIF
IF speed=2 OR speed=3
exgbm ld a, (hl)
IF back=1
dec hl
ELSE
inc hl
ENDIF
adc a, a
jr nc, exgbmc
jp exlit
exgbi ld a, (hl)
IF back=1
dec hl
ELSE
inc hl
ENDIF
adc a, a
jp exgbic
ENDIF
IF speed=3
exgbts jp p, exlee8
rl b
jr z, exgby
srl b
defb 250
exxopy ld a, (hl)
IF back=1
dec hl
ELSE
inc hl
ENDIF
exl16 adc a, a
jr z, exxopy
rl d
djnz exl16
exgby ld e, (hl)
IF back=1
dec hl
ELSE
inc hl
ENDIF
ret
excopy ld a, (hl)
IF back=1
dec hl
ELSE
inc hl
ENDIF
exlee8 adc a, a
jr z, excopy
rl e
djnz exlee8
ret
ELSE
IF mapbase-mapbase/256*256<240 AND mapbase-mapbase/256*256>135
expair ld b, (iy-256+mapbase-mapbase/256*256)
ELSE
expair ld b, (iy-112+mapbase-(mapbase+16)/256*256)
ENDIF
IF speed=2
dec b
call nz, exgbts
ELSE
call exgbts
ENDIF
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
ex de, hl
ret
ENDIF
IF speed=0 OR speed=1
exgbts ld de, 0
excont dec b
ret m
IF speed=0
call exgetb
ELSE
add a, a
call z, exgetb
ENDIF
rl e
rl d
jr excont
IF speed=0
exgetb add a, a
ret nz
ld a, (hl)
IF back=1
dec hl
ELSE
inc hl
ENDIF
adc a, a
ret
ELSE
exgetb ld a, (hl)
IF back=1
dec hl
ELSE
inc hl
ENDIF
adc a, a
ret
ENDIF
ENDIF
IF speed=2
exgbg ld a, (hl)
IF back=1
dec hl
ELSE
inc hl
ENDIF
exgbts adc a, a
jr z, exgbg
rl e
rl d
djnz exgbts
ret
ENDIF