463 lines
11 KiB
NASM
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 |