summaryrefslogtreecommitdiff
path: root/tools/rasm/decrunch/deexo.asm
blob: 6a4a7ac37fcd3f3f0539d4999de5368d5bea2156 (plain)
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
;Exomizer 2 Z80 decoder
; by Metalbrain
;
; optimized by Antonio Villena and Urusergi (169 bytes)
;
; compression algorithm by Magnus Lind

;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.

Macro Mizoumizeur

@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:   srl a: call  z,  @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:   srl a : call    z,@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
                srl a : call    z,@exo_getbit      ;literal?
                jr      c, @exo_literalcopy
                ld      c, 239
@exo_getindex:   srl a : call    z,@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

Mend