-
Notifications
You must be signed in to change notification settings - Fork 2
/
deexo.asm
128 lines (124 loc) · 4.66 KB
/
deexo.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
;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.
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: call 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: call 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
call exo_getbit ;literal?
jr c, exo_literalcopy
ld c, 239
exo_getindex: call 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