]> git.sur5r.net Git - cc65/blob - libsrc/common/lz4.s
Remove _ from internal vars
[cc65] / libsrc / common / lz4.s
1 ;
2 ; Lauri Kasanen, 6 Jun 2017
3 ; (C) Mega Cat Studios
4 ; An optimized LZ4 decompressor
5 ;
6
7         .importzp       sp, sreg, regsave, regbank
8         .importzp       tmp1, tmp2, tmp3, tmp4, ptr1, ptr2, ptr3, ptr4
9         .macpack        longbranch
10         .import         memcpy_upwards,pushax,popax
11         .export         _decompress_lz4
12
13 out = regsave
14 written = regsave + 2
15 tmp = tmp1
16 token = tmp2
17 offset = ptr3
18 in = sreg
19 outlen = ptr4
20
21 ; ---------------------------------------------------------------
22 ; void decompress_lz4 (const u8 *in, u8 * const out, const u16 outlen)
23 ; ---------------------------------------------------------------
24
25 .segment        "CODE"
26
27 .proc   _decompress_lz4: near
28
29         sta     outlen
30         stx     outlen+1
31
32         jsr     popax
33         sta     out
34         stx     out+1
35
36         jsr     popax
37         sta     in
38         stx     in+1
39
40 ;
41 ; written = 0;
42 ;
43         lda     #$00
44         sta     written
45 ;
46 ; while (written < outlen) {
47 ;
48         jmp     L0046
49 ;
50 ; token = *in++;
51 ;
52 L0004:  ldy     #0
53         lda     (in),y
54         sta     token
55
56         inc     in
57         bne     L000A
58         inc     in+1
59 L000A:
60 ;
61 ; offset = token >> 4;
62 ;
63         ldx     #$00
64         lsr     a
65         lsr     a
66         lsr     a
67         lsr     a
68         sta     offset
69         stx     offset+1
70 ;
71 ; token &= 0xf;
72 ; token += 4; // Minmatch
73 ;
74         lda     token
75         and     #$0F
76         clc
77         adc     #4
78         sta     token
79 ;
80 ; if (offset == 15) {
81 ;
82         lda     offset
83         cmp     #$0F
84 L0013:  bne     L001A
85 ;
86 ; tmp = *in++;
87 ;
88         ldy     #0
89         lda     (in),y
90         sta     tmp
91
92         inc     in
93         bne     L0017
94         inc     in+1
95 L0017:
96 ;
97 ; offset += tmp;
98 ;
99         clc
100         adc     offset
101         sta     offset
102         lda     #$00
103         adc     offset+1
104         sta     offset+1
105 ;
106 ; if (tmp == 255)
107 ;
108         lda     tmp
109         cmp     #$FF
110 ;
111 ; goto moreliterals;
112 ;
113         jmp     L0013
114 ;
115 ; if (offset) {
116 ;
117 L001A:  lda     offset
118         ora     offset+1
119         beq     L001C
120 ;
121 ; memcpy(&out[written], in, offset);
122 ;
123         lda     out
124         clc
125         adc     written
126         sta     ptr2
127         lda     out+1
128         adc     written+1
129         tax
130         lda     ptr2
131         stx     ptr2+1
132         jsr     pushax
133         lda     in
134         ldx     in+1
135         sta     ptr1
136         stx     ptr1+1
137         ldy     #0
138         jsr     memcpy_upwards
139 ;
140 ; written += offset;
141 ;
142         lda     offset
143         clc
144         adc     written
145         sta     written
146         lda     offset+1
147         adc     written+1
148         sta     written+1
149 ;
150 ; in += offset;
151 ;
152         lda     offset
153         clc
154         adc     in
155         sta     in
156         lda     offset+1
157         adc     in+1
158         sta     in+1
159 ;
160 ; if (written >= outlen)
161 ;
162 L001C:  lda     written
163         cmp     outlen
164         lda     written+1
165         sbc     outlen+1
166 ;
167 ; return;
168 ;
169         bcc     L0047
170         rts
171 ;
172 ; memcpy(&offset, in, 2);
173 ;
174 L0047:  ldy     #0
175         lda     (in),y
176         sta     offset
177         iny
178         lda     (in),y
179         sta     offset+1
180 ;
181 ; in += 2;
182 ;
183         lda     #$02
184         clc
185         adc     in
186         sta     in
187         bcc     L002F
188         inc     in+1
189 ;
190 ; copysrc = out + written - offset;
191 ;
192 L002F:  lda     out
193         clc
194         adc     written
195         pha
196         lda     out+1
197         adc     written+1
198         tax
199         pla
200         sec
201         sbc     offset
202         sta     ptr1
203         txa
204         sbc     offset+1
205         sta     ptr1+1
206 ;
207 ; offset = token;
208 ;
209         lda     #$00
210         sta     offset+1
211         lda     token
212         sta     offset
213 ;
214 ; if (token == 19) {
215 ;
216         cmp     #$13
217 L0045:  bne     L003C
218 ;
219 ; tmp = *in++;
220 ;
221         ldy     #0
222         lda     (in),y
223         sta     tmp
224
225         inc     in
226         bne     L0039
227         inc     in+1
228 L0039:
229 ;
230 ; offset += tmp;
231 ;
232         clc
233         adc     offset
234         sta     offset
235         tya
236         adc     offset+1
237         sta     offset+1
238 ;
239 ; if (tmp == 255)
240 ;
241         lda     tmp
242         cmp     #$FF
243 ;
244 ; goto morematches;
245 ;
246         jmp     L0045
247 ;
248 ; memcpy(&out[written], copysrc, offset);
249 ;
250 L003C:  lda     out
251         clc
252         adc     written
253         sta     ptr2
254         lda     out+1
255         adc     written+1
256         tax
257         lda     ptr2
258         stx     ptr2+1
259         jsr     pushax
260         jsr     memcpy_upwards
261 ;
262 ; written += offset;
263 ;
264         lda     offset
265         clc
266         adc     written
267         sta     written
268         lda     offset+1
269         adc     written+1
270 L0046:  sta     written+1
271 ;
272 ; while (written < outlen) {
273 ;
274         lda     written
275         cmp     outlen
276         lda     written+1
277         sbc     outlen+1
278         jcc     L0004
279
280         rts
281
282 .endproc
283