diff options
Diffstat (limited to 'apps/plugins/sdl/src/video/ataricommon/SDL_ataric2p.S')
-rw-r--r-- | apps/plugins/sdl/src/video/ataricommon/SDL_ataric2p.S | 452 |
1 files changed, 452 insertions, 0 deletions
diff --git a/apps/plugins/sdl/src/video/ataricommon/SDL_ataric2p.S b/apps/plugins/sdl/src/video/ataricommon/SDL_ataric2p.S new file mode 100644 index 0000000000..3cd1961b85 --- /dev/null +++ b/apps/plugins/sdl/src/video/ataricommon/SDL_ataric2p.S | |||
@@ -0,0 +1,452 @@ | |||
1 | /* | ||
2 | SDL - Simple DirectMedia Layer | ||
3 | Copyright (C) 1997-2012 Sam Lantinga | ||
4 | |||
5 | This library is free software; you can redistribute it and/or | ||
6 | modify it under the terms of the GNU Lesser General Public | ||
7 | License as published by the Free Software Foundation; either | ||
8 | version 2.1 of the License, or (at your option) any later version. | ||
9 | |||
10 | This library is distributed in the hope that it will be useful, | ||
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
13 | Lesser General Public License for more details. | ||
14 | |||
15 | You should have received a copy of the GNU Lesser General Public | ||
16 | License along with this library; if not, write to the Free Software | ||
17 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
18 | |||
19 | Sam Lantinga | ||
20 | slouken@libsdl.org | ||
21 | */ | ||
22 | |||
23 | /* | ||
24 | Chunky to planar conversion routine | ||
25 | 1 byte/pixel -> 4 or 8 bit planes | ||
26 | |||
27 | Patrice Mandin | ||
28 | Xavier Joubert | ||
29 | Mikael Kalms | ||
30 | */ | ||
31 | |||
32 | .globl _SDL_Atari_C2pConvert | ||
33 | .globl _SDL_Atari_C2pConvert8 | ||
34 | .globl _SDL_Atari_C2pConvert4 | ||
35 | .globl _SDL_Atari_C2pConvert4_pal | ||
36 | |||
37 | /* ------------ Conversion C2P, 8 bits ------------ */ | ||
38 | |||
39 | .text | ||
40 | _SDL_Atari_C2pConvert8: | ||
41 | #if !defined(__mcoldfire__) | ||
42 | movel sp@(4),c2p_source | ||
43 | movel sp@(8),c2p_dest | ||
44 | movel sp@(12),c2p_width | ||
45 | movel sp@(16),c2p_height | ||
46 | movel sp@(20),c2p_dblligne | ||
47 | movel sp@(24),c2p_srcpitch | ||
48 | movel sp@(28),c2p_dstpitch | ||
49 | |||
50 | moveml d2-d7/a2-a6,sp@- | ||
51 | |||
52 | movel c2p_source,c2p_cursrc | ||
53 | movel c2p_dest,c2p_curdst | ||
54 | movel #0x0f0f0f0f,d4 | ||
55 | movel #0x00ff00ff,d5 | ||
56 | movel #0x55555555,d6 | ||
57 | movew c2p_height+2,c2p_row | ||
58 | movew c2p_width+2,d0 | ||
59 | andw #-8,d0 | ||
60 | movew d0,c2p_rowlen | ||
61 | |||
62 | SDL_Atari_C2p8_rowloop: | ||
63 | |||
64 | movel c2p_cursrc,a0 | ||
65 | movel c2p_curdst,a1 | ||
66 | |||
67 | movel a0,a2 | ||
68 | addw c2p_rowlen,a2 | ||
69 | |||
70 | movel a0@+,d0 | ||
71 | movel a0@+,d1 | ||
72 | movel a0@+,d2 | ||
73 | movel a0@+,d3 | ||
74 | /* | ||
75 | d0 = a7a6a5a4a3a2a1a0 b7b6b5b4b3b2b1b0 c7c6c5c4c3c2c1c0 d7d6d5d4d3d2d1d0 | ||
76 | d1 = e7e6e5e4e3e2e1e0 f7f6f5f4f3f2f1f0 g7g6g5g4g3g2g1g0 h7h6h5h4h3h2h1h0 | ||
77 | d2 = i7i6i5i4i3i2i1i0 j7j6j5j4j3j2j1j0 k7k6k5k4k3k2k1k0 l7l6l5l4l3l2l1l0 | ||
78 | d3 = m7m6m5m4m3m2m1m0 n7n6n5n4n3n2n1n0 o7o6o5o4o3o2o1o0 p7p6p5p4p3p2p1p0 | ||
79 | */ | ||
80 | movel d1,d7 | ||
81 | lsrl #4,d7 | ||
82 | eorl d0,d7 | ||
83 | andl d4,d7 | ||
84 | eorl d7,d0 | ||
85 | lsll #4,d7 | ||
86 | eorl d7,d1 | ||
87 | |||
88 | movel d3,d7 | ||
89 | lsrl #4,d7 | ||
90 | eorl d2,d7 | ||
91 | andl d4,d7 | ||
92 | eorl d7,d2 | ||
93 | lsll #4,d7 | ||
94 | eorl d7,d3 | ||
95 | |||
96 | movel d2,d7 | ||
97 | lsrl #8,d7 | ||
98 | eorl d0,d7 | ||
99 | andl d5,d7 | ||
100 | eorl d7,d0 | ||
101 | lsll #8,d7 | ||
102 | eorl d7,d2 | ||
103 | |||
104 | movel d3,d7 | ||
105 | lsrl #8,d7 | ||
106 | eorl d1,d7 | ||
107 | andl d5,d7 | ||
108 | eorl d7,d1 | ||
109 | lsll #8,d7 | ||
110 | eorl d7,d3 | ||
111 | /* | ||
112 | d0 = a7a6a5a4e7e6e5e4 i7i6i5i4m7m6m5m4 c7c6c5c4g7g6g5g4 k7k6k5k4o7o6o5o4 | ||
113 | d1 = a3a2a1a0e3e2e1e0 i3i2i1i0m3m2m1m0 c3c2c1c0g3g2g1g0 k3k2k1k0o3o2o1o0 | ||
114 | d2 = b7b6b5b4f7f6f5f4 j7j6j5j4n7n6n5n4 d7d6d5d4h7h6h5h4 l7l6l5l4p7p6p5p4 | ||
115 | d3 = b3b2b1b0f3f2f1f0 j3j2j1j0n3n2n1n0 d3d2d1d0h3h2h1h0 l3l2l1l0p3p2p1p0 | ||
116 | */ | ||
117 | bras SDL_Atari_C2p8_start | ||
118 | |||
119 | SDL_Atari_C2p8_pix16: | ||
120 | |||
121 | movel a0@+,d0 | ||
122 | movel a0@+,d1 | ||
123 | movel a0@+,d2 | ||
124 | movel a0@+,d3 | ||
125 | /* | ||
126 | d0 = a7a6a5a4a3a2a1a0 b7b6b5b4b3b2b1b0 c7c6c5c4c3c2c1c0 d7d6d5d4d3d2d1d0 | ||
127 | d1 = e7e6e5e4e3e2e1e0 f7f6f5f4f3f2f1f0 g7g6g5g4g3g2g1g0 h7h6h5h4h3h2h1h0 | ||
128 | d2 = i7i6i5i4i3i2i1i0 j7j6j5j4j3j2j1j0 k7k6k5k4k3k2k1k0 l7l6l5l4l3l2l1l0 | ||
129 | d3 = m7m6m5m4m3m2m1m0 n7n6n5n4n3n2n1n0 o7o6o5o4o3o2o1o0 p7p6p5p4p3p2p1p0 | ||
130 | */ | ||
131 | movel d1,d7 | ||
132 | lsrl #4,d7 | ||
133 | movel a3,a1@+ | ||
134 | eorl d0,d7 | ||
135 | andl d4,d7 | ||
136 | eorl d7,d0 | ||
137 | lsll #4,d7 | ||
138 | eorl d7,d1 | ||
139 | |||
140 | movel d3,d7 | ||
141 | lsrl #4,d7 | ||
142 | eorl d2,d7 | ||
143 | andl d4,d7 | ||
144 | eorl d7,d2 | ||
145 | movel a4,a1@+ | ||
146 | lsll #4,d7 | ||
147 | eorl d7,d3 | ||
148 | |||
149 | movel d2,d7 | ||
150 | lsrl #8,d7 | ||
151 | eorl d0,d7 | ||
152 | andl d5,d7 | ||
153 | eorl d7,d0 | ||
154 | movel a5,a1@+ | ||
155 | lsll #8,d7 | ||
156 | eorl d7,d2 | ||
157 | |||
158 | movel d3,d7 | ||
159 | lsrl #8,d7 | ||
160 | eorl d1,d7 | ||
161 | andl d5,d7 | ||
162 | eorl d7,d1 | ||
163 | movel a6,a1@+ | ||
164 | lsll #8,d7 | ||
165 | eorl d7,d3 | ||
166 | /* | ||
167 | d0 = a7a6a5a4e7e6e5e4 i7i6i5i4m7m6m5m4 c7c6c5c4g7g6g5g4 k7k6k5k4o7o6o5o4 | ||
168 | d1 = a3a2a1a0e3e2e1e0 i3i2i1i0m3m2m1m0 c3c2c1c0g3g2g1g0 k3k2k1k0o3o2o1o0 | ||
169 | d2 = b7b6b5b4f7f6f5f4 j7j6j5j4n7n6n5n4 d7d6d5d4h7h6h5h4 l7l6l5l4p7p6p5p4 | ||
170 | d3 = b3b2b1b0f3f2f1f0 j3j2j1j0n3n2n1n0 d3d2d1d0h3h2h1h0 l3l2l1l0p3p2p1p0 | ||
171 | */ | ||
172 | |||
173 | SDL_Atari_C2p8_start: | ||
174 | |||
175 | movel d2,d7 | ||
176 | lsrl #1,d7 | ||
177 | eorl d0,d7 | ||
178 | andl d6,d7 | ||
179 | eorl d7,d0 | ||
180 | addl d7,d7 | ||
181 | eorl d7,d2 | ||
182 | |||
183 | movel d3,d7 | ||
184 | lsrl #1,d7 | ||
185 | eorl d1,d7 | ||
186 | andl d6,d7 | ||
187 | eorl d7,d1 | ||
188 | addl d7,d7 | ||
189 | eorl d7,d3 | ||
190 | /* | ||
191 | d0 = a7b7a5b5e7f7e5f5 i7j7i5j5m7n7m5n5 c7d7c5d5g7h7g5h5 k7l7k5l5o7p7o5p5 | ||
192 | d1 = a3b3a1b1e3f3e1f1 i3j3i1j1m3n3m1n1 c3d3c1d1g3h3g1h1 k3l3k1l1o3p3o1p1 | ||
193 | d2 = a6b6a4b4e6f6e4f4 i6j6i4j4m6n6m4n4 c6d6c4d4g6h6g4h4 k6l6k4l4o6p6o4p4 | ||
194 | d3 = a2b2a0b0e2f2e0f0 i2j2i0j0m2n2m0n0 c2d2c0d0g2h2g0h0 k2l2k0l0o2p2o0p0 | ||
195 | */ | ||
196 | movew d2,d7 | ||
197 | movew d0,d2 | ||
198 | swap d2 | ||
199 | movew d2,d0 | ||
200 | movew d7,d2 | ||
201 | |||
202 | movew d3,d7 | ||
203 | movew d1,d3 | ||
204 | swap d3 | ||
205 | movew d3,d1 | ||
206 | movew d7,d3 | ||
207 | /* | ||
208 | d0 = a7b7a5b5e7f7e5f5 i7j7i5j5m7n7m5n5 a6b6a4b4e6f6e4f4 i6j6i4j4m6n6m4n4 | ||
209 | d1 = a3b3a1b1e3f3e1f1 i3j3i1j1m3n3m1n1 a2b2a0b0e2f2e0f0 i2j2i0j0m2n2m0n0 | ||
210 | d2 = c7d7c5d5g7h7g5h5 k7l7k5l5o7p7o5p5 c6d6c4d4g6h6g4h4 k6l6k4l4o6p6o4p4 | ||
211 | d3 = c3d3c1d1g3h3g1h1 k3l3k1l1o3p3o1p1 c2d2c0d0g2h2g0h0 k2l2k0l0o2p2o0p0 | ||
212 | */ | ||
213 | movel d2,d7 | ||
214 | lsrl #2,d7 | ||
215 | eorl d0,d7 | ||
216 | andl #0x33333333,d7 | ||
217 | eorl d7,d0 | ||
218 | lsll #2,d7 | ||
219 | eorl d7,d2 | ||
220 | |||
221 | movel d3,d7 | ||
222 | lsrl #2,d7 | ||
223 | eorl d1,d7 | ||
224 | andl #0x33333333,d7 | ||
225 | eorl d7,d1 | ||
226 | lsll #2,d7 | ||
227 | eorl d7,d3 | ||
228 | /* | ||
229 | d0 = a7b7c7d7e7f7g7h7 i7j7k7l7m7n7o7p7 a6b6c6d6e6f6g6h6 i6j6k6l6m6n6o6p6 | ||
230 | d1 = a3b3c3d3e3f3g3h3 i3j3k3l3m3n3o3p3 a2b2c2d2e2f2g2h2 i2j2k2l2m2n2o2p2 | ||
231 | d2 = a5b5c5d5e5f5g5h5 i5j5k5l5m5n5o5p5 a4b4c4d4e4f4g4h4 i4j4k4l4m4n4o4p4 | ||
232 | d3 = a1b1c1d1e1f1g1h1 i1j1k1l1m1n1o1p1 a0b0c0d0e0f0g0h0 i0j0k0l0m0n0o0p0 | ||
233 | */ | ||
234 | swap d0 | ||
235 | swap d1 | ||
236 | swap d2 | ||
237 | swap d3 | ||
238 | |||
239 | movel d0,a6 | ||
240 | movel d2,a5 | ||
241 | movel d1,a4 | ||
242 | movel d3,a3 | ||
243 | |||
244 | cmpl a0,a2 | ||
245 | bgt SDL_Atari_C2p8_pix16 | ||
246 | |||
247 | movel a3,a1@+ | ||
248 | movel a4,a1@+ | ||
249 | movel a5,a1@+ | ||
250 | movel a6,a1@+ | ||
251 | |||
252 | /* Double the line ? */ | ||
253 | |||
254 | movel c2p_srcpitch,d0 | ||
255 | movel c2p_dstpitch,d1 | ||
256 | |||
257 | tstl c2p_dblligne | ||
258 | beqs SDL_Atari_C2p8_nodblline | ||
259 | |||
260 | movel c2p_curdst,a0 | ||
261 | movel a0,a1 | ||
262 | addl d1,a1 | ||
263 | |||
264 | movew c2p_width+2,d7 | ||
265 | lsrw #4,d7 | ||
266 | subql #1,d7 | ||
267 | SDL_Atari_C2p8_dblloop: | ||
268 | movel a0@+,a1@+ | ||
269 | movel a0@+,a1@+ | ||
270 | movel a0@+,a1@+ | ||
271 | movel a0@+,a1@+ | ||
272 | dbra d7,SDL_Atari_C2p8_dblloop | ||
273 | |||
274 | addl d1,c2p_curdst | ||
275 | |||
276 | SDL_Atari_C2p8_nodblline: | ||
277 | |||
278 | /* Next line */ | ||
279 | |||
280 | addl d0,c2p_cursrc | ||
281 | addl d1,c2p_curdst | ||
282 | |||
283 | subqw #1,c2p_row | ||
284 | bne SDL_Atari_C2p8_rowloop | ||
285 | |||
286 | moveml sp@+,d2-d7/a2-a6 | ||
287 | #endif | ||
288 | rts | ||
289 | |||
290 | /* ------------ Conversion C2P, 4 bits ------------ */ | ||
291 | |||
292 | _SDL_Atari_C2pConvert4: | ||
293 | #if !defined(__mcoldfire__) | ||
294 | movel sp@(4),c2p_source | ||
295 | movel sp@(8),c2p_dest | ||
296 | movel sp@(12),c2p_width | ||
297 | movel sp@(16),c2p_height | ||
298 | movel sp@(20),c2p_dblligne | ||
299 | movel sp@(24),c2p_srcpitch | ||
300 | movel sp@(28),c2p_dstpitch | ||
301 | |||
302 | moveml d2-d7/a2-a6,sp@- | ||
303 | |||
304 | movel c2p_source,a0 | ||
305 | movel c2p_dest,a1 | ||
306 | lea _SDL_Atari_table_c2p,a2 | ||
307 | movel #0x00070001,d3 | ||
308 | #if defined(__mc68020__) | ||
309 | moveq #0,d0 | ||
310 | #endif | ||
311 | |||
312 | movel c2p_height,d7 | ||
313 | subql #1,d7 | ||
314 | c2p4_bcly: | ||
315 | movel a0,a4 | Save start address of source | ||
316 | movel a1,a5 | Save start address of dest | ||
317 | |||
318 | | Conversion | ||
319 | |||
320 | movel c2p_width,d6 | ||
321 | lsrw #4,d6 | ||
322 | subql #1,d6 | ||
323 | c2p4_bclx: | ||
324 | | Octets 0-7 | ||
325 | |||
326 | moveq #0,d1 | ||
327 | moveq #7,d5 | ||
328 | c2p4_bcl07: | ||
329 | #if defined(__mc68020__) | ||
330 | moveb a0@+,d0 | ||
331 | lea a2@(0,d0:w:4),a3 | ||
332 | #else | ||
333 | moveq #0,d0 | ||
334 | moveb a0@+,d0 | ||
335 | lslw #2,d0 | ||
336 | lea a2@(0,d0:w),a3 | ||
337 | #endif | ||
338 | lsll #1,d1 | ||
339 | orl a3@,d1 | ||
340 | dbra d5,c2p4_bcl07 | ||
341 | |||
342 | movepl d1,a1@(0) | ||
343 | addw d3,a1 | ||
344 | swap d3 | ||
345 | |||
346 | | Octets 8-15 | ||
347 | |||
348 | moveq #0,d1 | ||
349 | moveq #7,d5 | ||
350 | c2p4_bcl815: | ||
351 | #if defined(__mc68020__) | ||
352 | moveb a0@+,d0 | ||
353 | lea a2@(0,d0:w:4),a3 | ||
354 | #else | ||
355 | moveq #0,d0 | ||
356 | moveb a0@+,d0 | ||
357 | lslw #2,d0 | ||
358 | lea a2@(0,d0:w),a3 | ||
359 | #endif | ||
360 | lsll #1,d1 | ||
361 | orl a3@,d1 | ||
362 | dbra d5,c2p4_bcl815 | ||
363 | |||
364 | movepl d1,a1@(0) | ||
365 | addw d3,a1 | ||
366 | swap d3 | ||
367 | |||
368 | dbra d6,c2p4_bclx | ||
369 | |||
370 | | Double line ? | ||
371 | |||
372 | tstl c2p_dblligne | ||
373 | beqs c2p4_nodblligne | ||
374 | |||
375 | movel a5,a6 | src line | ||
376 | movel a5,a1 | dest line | ||
377 | addl c2p_dstpitch,a1 | ||
378 | |||
379 | movel c2p_width,d6 | ||
380 | lsrw #3,d6 | ||
381 | subql #1,d6 | ||
382 | c2p4_copydbl: | ||
383 | movel a6@+,a1@+ | ||
384 | dbra d6,c2p4_copydbl | ||
385 | |||
386 | addl c2p_dstpitch,a5 | ||
387 | c2p4_nodblligne: | ||
388 | |||
389 | | Next line | ||
390 | |||
391 | movel a4,a0 | ||
392 | addl c2p_srcpitch,a0 | ||
393 | movel a5,a1 | ||
394 | addl c2p_dstpitch,a1 | ||
395 | |||
396 | dbra d7,c2p4_bcly | ||
397 | |||
398 | moveml sp@+,d2-d7/a2-a6 | ||
399 | #endif | ||
400 | rts | ||
401 | |||
402 | /* ------------ Conversion of a light palette in 4 bits ------------ */ | ||
403 | |||
404 | _SDL_Atari_C2pConvert4_pal: | ||
405 | #if !defined(__mcoldfire__) | ||
406 | /* a0 is a 256-word light palette */ | ||
407 | movel sp@(4),a0 | ||
408 | |||
409 | moveml d2-d3,sp@- | ||
410 | |||
411 | lea _SDL_Atari_table_c2p,a1 | ||
412 | movew #255,d3 | ||
413 | c2p_pal_initbcl: | ||
414 | movew a0@+,d0 | ||
415 | lsrw #4,d0 | ||
416 | andw #15,d0 | ||
417 | |||
418 | moveq #3,d1 | ||
419 | c2p_pal_initbyte: | ||
420 | btst d1,d0 | ||
421 | sne d2 | ||
422 | negw d2 | ||
423 | moveb d2,a1@(0,d1:w) | ||
424 | |||
425 | dbra d1,c2p_pal_initbyte | ||
426 | |||
427 | addql #4,a1 | ||
428 | dbra d3,c2p_pal_initbcl | ||
429 | |||
430 | moveml sp@+,d2-d3 | ||
431 | #endif | ||
432 | rts | ||
433 | |||
434 | /* ------------ Buffers ------------ */ | ||
435 | |||
436 | .bss | ||
437 | |||
438 | .even | ||
439 | .comm _SDL_Atari_C2pConvert,4 | ||
440 | .comm _SDL_Atari_table_c2p,1024 | ||
441 | |||
442 | .comm c2p_source,4 /* Source framebuffer */ | ||
443 | .comm c2p_dest,4 /* Destination framebuffer */ | ||
444 | .comm c2p_width,4 /* Width of zone to convert */ | ||
445 | .comm c2p_height,4 /* Height of zone to convert */ | ||
446 | .comm c2p_dblligne,4 /* Double the lines while converting ? */ | ||
447 | .comm c2p_srcpitch,4 /* Source pitch */ | ||
448 | .comm c2p_dstpitch,4 /* Destination pitch */ | ||
449 | .comm c2p_cursrc,4 /* Current source line */ | ||
450 | .comm c2p_curdst,4 /* Current destination line */ | ||
451 | .comm c2p_rowlen,2 /* Line length in bytes */ | ||
452 | .comm c2p_row,2 /* Current line number */ | ||