UIQ3 update, some makefile unification, rm old configs, stuff
[picodrive.git] / platform / uiq3 / engine / blit.s
1 @ vim:filetype=armasm\r
2 @ some color conversion and blitting routines\r
3 \r
4 @ (c) Copyright 2006, notaz\r
5 @ All Rights Reserved\r
6 \r
7 \r
8 @ Convert 0000bbb0 ggg0rrr0 0000bbb0 ggg0rrr0\r
9 @ to      00000000 rrr00000 ggg00000 bbb00000 ...\r
10 \r
11 @ lr =  0x00e000e0, out: r3=lower_pix, r2=higher_pix; trashes rin\r
12 @ if sh==2, r8=0x00404040 (sh!=0 destroys flags!)\r
13 .macro convRGB32_2 rin sh=0\r
14     and     r2,  lr, \rin, lsr #4 @ blue\r
15     and     r3,  \rin, lr\r
16     orr     r2,  r2,   r3, lsl #8         @ g0b0g0b0\r
17 \r
18     mov     r3,  r2,  lsl #16             @ g0b00000\r
19     and     \rin,lr,  \rin, ror #12       @ 00r000r0 (reversed)\r
20     orr     r3,  r3,  \rin, lsr #16       @ g0b000r0\r
21 .if \sh == 1\r
22     mov     r3,  r3,  ror #17             @ shadow mode\r
23 .elseif \sh == 2\r
24     adds    r3,  r3,  #0x40000000         @ green\r
25     orrcs   r3,  r3,  #0xe0000000\r
26     mov     r3,  r3,  ror #8\r
27     adds    r3,  r3,  #0x40000000\r
28     orrcs   r3,  r3,  #0xe0000000\r
29     mov     r3,  r3,  ror #16\r
30     adds    r3,  r3,  #0x40000000\r
31     orrcs   r3,  r3,  #0xe0000000\r
32     mov     r3,  r3,  ror #24\r
33     orr     r3,  r3,   r3, lsr #3\r
34 .else\r
35     mov     r3,  r3,  ror #16             @ r3=low\r
36     orr     r3,  r3,   r3, lsr #3\r
37 .endif\r
38 \r
39     str     r3, [r0], #4\r
40 \r
41     mov     r2,  r2,  lsr #16\r
42     orr     r2,  r2,  \rin, lsl #16\r
43 .if \sh == 1\r
44     mov     r2,  r2,  lsr #1\r
45 .elseif \sh == 2\r
46     mov     r2,  r2,  ror #8\r
47     adds    r2,  r2,  #0x40000000         @ blue\r
48     orrcs   r2,  r2,  #0xe0000000\r
49     mov     r2,  r2,  ror #8\r
50     adds    r2,  r2,  #0x40000000\r
51     orrcs   r2,  r2,  #0xe0000000\r
52     mov     r2,  r2,  ror #8\r
53     adds    r2,  r2,  #0x40000000\r
54     orrcs   r2,  r2,  #0xe0000000\r
55     mov     r2,  r2,  ror #8\r
56     orr     r2,  r2,   r2,  lsr #3\r
57 .else\r
58     orr     r2,  r2,   r2,  lsr #3\r
59 .endif\r
60 \r
61     str     r2, [r0], #4\r
62 .endm\r
63 \r
64 \r
65 .global vidConvCpyRGB32 @ void *to, void *from, int pixels\r
66 \r
67 vidConvCpyRGB32:\r
68     stmfd   sp!, {r4-r7,lr}\r
69 \r
70     mov     r12, r2, lsr #3 @ repeats\r
71     mov     lr, #0x00e00000\r
72     orr     lr, lr, #0x00e0\r
73 \r
74 .loopRGB32:\r
75     subs    r12, r12, #1\r
76 \r
77     ldmia    r1!, {r4-r7}\r
78     convRGB32_2 r4\r
79     convRGB32_2 r5\r
80     convRGB32_2 r6\r
81     convRGB32_2 r7\r
82 \r
83     bgt     .loopRGB32\r
84 \r
85     ldmfd   sp!, {r4-r7,lr}\r
86     bx      lr\r
87 \r
88 \r
89 .global vidConvCpyRGB32sh @ void *to, void *from, int pixels\r
90 \r
91 vidConvCpyRGB32sh:\r
92     stmfd   sp!, {r4-r7,lr}\r
93 \r
94     mov     r12, r2, lsr #3 @ repeats\r
95     mov     lr, #0x00e00000\r
96     orr     lr, lr, #0x00e0\r
97 \r
98 .loopRGB32sh:\r
99     subs    r12, r12, #1\r
100 \r
101     ldmia    r1!, {r4-r7}\r
102     convRGB32_2 r4, 1\r
103     convRGB32_2 r5, 1\r
104     convRGB32_2 r6, 1\r
105     convRGB32_2 r7, 1\r
106 \r
107     bgt     .loopRGB32sh\r
108 \r
109     ldmfd   sp!, {r4-r7,lr}\r
110     bx      lr\r
111 \r
112 \r
113 .global vidConvCpyRGB32hi @ void *to, void *from, int pixels\r
114 \r
115 vidConvCpyRGB32hi:\r
116     stmfd   sp!, {r4-r7,lr}\r
117 \r
118     mov     r12, r2, lsr #3 @ repeats\r
119     mov     lr, #0x00e00000\r
120     orr     lr, lr, #0x00e0\r
121 \r
122 .loopRGB32hi:\r
123      ldmia    r1!, {r4-r7}\r
124     convRGB32_2 r4, 2\r
125     convRGB32_2 r5, 2\r
126     convRGB32_2 r6, 2\r
127     convRGB32_2 r7, 2\r
128 \r
129     subs    r12, r12, #1\r
130     bgt     .loopRGB32hi\r
131 \r
132     ldmfd   sp!, {r4-r7,lr}\r
133     bx      lr\r
134 \r
135 \r
136 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
137 \r
138 @ -------- M2 stuff ---------\r
139 /*\r
140 .global vidConvCpy_90 @ void *to, void *from, int width\r
141 \r
142 vidConvCpy_90:\r
143     stmfd   sp!, {r4-r10,lr}\r
144 \r
145     mov     lr, #0x00F00000\r
146     orr     lr, lr, #0x00F0\r
147 \r
148     mov     r12, #224/4            @ row counter\r
149     mov     r10, r2, lsl #2        @ we do 2 pixel wide copies\r
150 \r
151     add     r8,  r0, #256*4        @ parallel line\r
152     add     r1,  r1, #0x23000\r
153     add     r1,  r1, #0x00B80      @ r1+=328*223*2+8*2\r
154     mov     r9,  r1\r
155 \r
156     mov     r4,  #0                @ fill bottom border\r
157     mov     r5,  #0\r
158     mov     r6,  #0\r
159     mov     r7,  #0\r
160     stmia   r0!, {r4-r7}\r
161     stmia   r0!, {r4-r7}\r
162     stmia   r8!, {r4-r7}\r
163     stmia   r8!, {r4-r7}\r
164 \r
165 .loopM2RGB32_90:\r
166         subs    r12, r12, #1\r
167 \r
168     @ at first this loop was written differently: src pixels were fetched with ldm's and\r
169     @ dest was not sequential. It ran nearly 2 times slower. It seems it is very important\r
170     @ to do sequential memory access on those items, which we have more (to offload addressing bus?).\r
171 \r
172     ldr     r4, [r1], #-328*2\r
173     ldr     r5, [r1], #-328*2\r
174     ldr     r6, [r1], #-328*2\r
175     ldr     r7, [r1], #-328*2\r
176 \r
177     convRGB32_2 r4, 1\r
178     convRGB32_2 r5, 1\r
179     convRGB32_2 r6, 1\r
180     convRGB32_2 r7, 1\r
181 \r
182     str     r4, [r8], #4\r
183     str     r5, [r8], #4\r
184     str     r6, [r8], #4\r
185     str     r7, [r8], #4\r
186 \r
187     bne     .loopM2RGB32_90\r
188 \r
189     mov     r4,  #0                @ top border\r
190     mov     r5,  #0\r
191     mov     r6,  #0\r
192     stmia   r0!, {r4-r6,r12}\r
193     stmia   r0!, {r4-r6,r12}\r
194     stmia   r8!, {r4-r6,r12}\r
195     stmia   r8!, {r4-r6,r12}\r
196 \r
197     subs    r10, r10, #1\r
198     ldmeqfd sp!, {r4-r10,pc}        @ return\r
199 \r
200     add     r0,  r8,  #16*4         @ set new dst pointer\r
201     add     r8,  r0,  #256*4\r
202     add     r9,  r9,  #2*2          @ fix src pointer\r
203     mov     r1,  r9\r
204 \r
205     stmia   r0!, {r4-r6,r12}        @ bottom border\r
206     stmia   r0!, {r4-r6,r12}\r
207     stmia   r8!, {r4-r6,r12}\r
208     stmia   r8!, {r4-r6,r12}\r
209 \r
210     mov     r12, #224/4             @ restore row counter\r
211     b       .loopM2RGB32_90\r
212 \r
213 \r
214 \r
215 @ converter for vidConvCpy_270\r
216 @ lr =  0x00F000F0, out: r3=lower_pix, r2=higher_pix; trashes rin\r
217 .macro convRGB32_3 rin\r
218     and     r2,  lr, \rin, lsr #4 @ blue\r
219     and     r3,  \rin, lr\r
220     orr     r2,  r2,   r3, lsl #8         @ g0b0g0b0\r
221 \r
222     mov     r3,  r2,  lsl #16             @ g0b00000\r
223     and     \rin,lr,  \rin, ror #12       @ 00r000r0 (reversed)\r
224     orr     r3,  r3,  \rin, lsr #16       @ g0b000r0\r
225 \r
226     mov     r2,  r2,  lsr #16\r
227     orr     r2,  r2,  \rin, lsl #16\r
228     str     r2, [r0], #4\r
229 \r
230     mov     \rin,r3,  ror #16             @ r3=low\r
231 .endm\r
232 */\r
233 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
234 \r
235 \r
236 @ takes byte-sized pixels from r3-r6, fetches from pal and stores to r7,r8,r10,lr\r
237 @ r2=pal\r
238 .macro mode2_4pix shift\r
239     and     r7, r11, r3, lsr #\shift\r
240     ldr     r7, [r2, r7, lsl #2]\r
241 \r
242     and     r8, r11, r4, lsr #\shift\r
243     ldr     r8, [r2, r8, lsl #2]\r
244 \r
245     and     r10,r11, r5, lsr #\shift\r
246     ldr     r10,[r2, r10,lsl #2]\r
247 \r
248     and     lr, r11, r6, lsr #\shift\r
249     ldr     lr, [r2, lr, lsl #2]\r
250 .endm\r
251 \r
252 @ r2=pal, r11=0xff\r
253 .macro mode2_4pix_getpix0 dreg sreg\r
254     and     \dreg, r11, \sreg\r
255     ldr     \dreg, [r2, \dreg, lsl #2]\r
256 .endm\r
257 \r
258 .macro mode2_4pix_getpix1 dreg sreg\r
259     and     \dreg, r11, \sreg, lsr #8\r
260     ldr     \dreg, [r2, \dreg, lsl #2]\r
261 .endm\r
262 \r
263 .macro mode2_4pix_getpix2 dreg sreg\r
264     and     \dreg, r11, \sreg, lsr #16\r
265     ldr     \dreg, [r2, \dreg, lsl #2]\r
266 .endm\r
267 \r
268 .macro mode2_4pix_getpix3 dreg sreg\r
269     and     \dreg, r11, \sreg, lsr #24\r
270     ldr     \dreg, [r2, \dreg, lsl #2]\r
271 .endm\r
272 \r
273 @ takes byte-sized pixels from reg, fetches from pal and stores to r3-r6\r
274 @ r11=0xFF, r2=pal\r
275 .macro mode2_4pix2_0 reg\r
276     mode2_4pix_getpix0 r3, \reg\r
277     mode2_4pix_getpix1 r4, \reg\r
278     mode2_4pix_getpix2 r5, \reg\r
279     mode2_4pix_getpix3 r6, \reg\r
280 .endm\r
281 \r
282 @ ...\r
283 .macro mode2_4pix2_180 reg\r
284     mode2_4pix_getpix3 r3, \reg\r
285     mode2_4pix_getpix2 r4, \reg\r
286     mode2_4pix_getpix1 r5, \reg\r
287     mode2_4pix_getpix0 r6, \reg\r
288 .endm\r
289 \r
290 @ takes byte-sized pixels from reg, fetches from pal and stores to r3-r5\r
291 @ r11=0xFF, r2=pal, r10=0xfcfcfc, r6=tmp\r
292 .macro mode2_4pix_to3 reg is180\r
293 .if \is180\r
294     mode2_4pix_getpix3 r3, \reg\r
295     mode2_4pix_getpix2 r4, \reg\r
296 .else\r
297     mode2_4pix_getpix0 r3, \reg     @ gathering loads cause a weird-hang\r
298     mode2_4pix_getpix1 r4, \reg\r
299 .endif\r
300 \r
301     sub     r3, r3,  r3, lsr #2     @ r3 *= 0.75\r
302     add     r3, r3,  r4, lsr #2     @ r3 += r4 * 0.25\r
303     and     r3, r3,  r10\r
304 \r
305 .if \is180\r
306     mode2_4pix_getpix1 r5, \reg\r
307     mode2_4pix_getpix0 r6, \reg\r
308 .else\r
309     mode2_4pix_getpix2 r5, \reg\r
310     mode2_4pix_getpix3 r6, \reg\r
311 .endif\r
312 \r
313     mov     r4, r4,  lsr #1\r
314     add     r4, r4,  r5, lsr #1     @ r4 = (r4 + r5) / 2;\r
315 @    and     r4, r4,  r10\r
316     sub     r6, r6,  r6, lsr #2     @ r6 *= 0.75\r
317     add     r5, r6,  r5, lsr #2     @ r5 = r6 + r5 * 0.25\r
318     and     r5, r5,  r10\r
319 .endm\r
320 \r
321 \r
322 @ void *to, void *from, void *pal, int width\r
323 .macro vidConvCpyM2_landscape is270\r
324     stmfd   sp!, {r4-r11,lr}\r
325 \r
326     mov     r11, #0xff\r
327 \r
328     mov     r12, #(224/4-1)<<16    @ row counter\r
329     orr     r12, r12, r3, lsl #1   @ we do 4 pixel wide copies (right to left)\r
330 \r
331 .if \is270\r
332     add     r1,  r1, #324\r
333 .else\r
334     add     r1,  r1, #0x11c00\r
335     add     r1,  r1, #0x00308      @ 328*224+8\r
336 .endif\r
337     mov     r9,  r1\r
338 \r
339     mov     r3,  #0                @ fill top border\r
340     mov     r4,  #0\r
341     mov     r5,  #0\r
342     mov     r6,  #0\r
343     stmia   r0!, {r3-r6}\r
344     stmia   r0!, {r3-r6}\r
345     add     r7,  r0, #256*4-8*4\r
346     stmia   r7!, {r3-r6}\r
347     stmia   r7!, {r3-r6}\r
348     add     r7,  r7, #256*4-8*4\r
349     stmia   r7!, {r3-r6}\r
350     stmia   r7!, {r3-r6}\r
351     add     r7,  r7, #256*4-8*4\r
352     stmia   r7!, {r3-r6}\r
353     stmia   r7!, {r3-r6}\r
354 \r
355 0: @ .loopM2RGB32_270:\r
356         subs    r12, r12, #1<<16\r
357 \r
358 .if \is270\r
359     ldr     r3, [r1], #328\r
360     ldr     r4, [r1], #328\r
361     ldr     r5, [r1], #328\r
362     ldr     r6, [r1], #328\r
363 .else\r
364     ldr     r3, [r1, #-328]!\r
365     ldr     r4, [r1, #-328]!\r
366     ldr     r5, [r1, #-328]!\r
367     ldr     r6, [r1, #-328]!\r
368 .endif\r
369 \r
370 .if \is270\r
371     mode2_4pix 24\r
372 .else\r
373     mode2_4pix  0\r
374 .endif\r
375     stmia   r0, {r7,r8,r10,lr}\r
376     add     r0, r0, #256*4\r
377 \r
378 .if \is270\r
379     mode2_4pix 16\r
380 .else\r
381     mode2_4pix  8\r
382 .endif\r
383     stmia   r0, {r7,r8,r10,lr}\r
384     add     r0, r0, #256*4\r
385 \r
386 .if \is270\r
387     mode2_4pix  8\r
388 .else\r
389     mode2_4pix 16\r
390 .endif\r
391     stmia   r0, {r7,r8,r10,lr}\r
392     add     r0, r0, #256*4\r
393 \r
394 .if \is270\r
395     mode2_4pix  0\r
396 .else\r
397     mode2_4pix 24\r
398 .endif\r
399     stmia   r0!,{r7,r8,r10,lr}\r
400     sub     r0, r0, #256*4*3\r
401 \r
402     bpl     0b @ .loopM2RGB32_270\r
403 \r
404     mov     r3,  #0                @ bottom border\r
405     mov     r4,  #0\r
406     mov     r5,  #0\r
407     mov     r6,  #0\r
408     stmia   r0!, {r3-r6}\r
409     stmia   r0!, {r3-r6}\r
410     add     r0,  r0, #256*4-8*4\r
411     stmia   r0!, {r3-r6}\r
412     stmia   r0!, {r3-r6}\r
413     add     r0,  r0, #256*4-8*4\r
414     stmia   r0!, {r3-r6}\r
415     stmia   r0!, {r3-r6}\r
416     add     r0,  r0, #256*4-8*4\r
417     stmia   r0!, {r3-r6}\r
418     nop                             @ phone crashes if this is commented out. Do I stress it too much?\r
419     stmia   r0!, {r3-r6}\r
420 \r
421     add     r12, r12, #1<<16\r
422     subs    r12, r12, #1\r
423     ldmeqfd sp!, {r4-r11,pc}        @ return\r
424 \r
425     add     r0,  r0, #16*4\r
426 .if \is270\r
427     sub     r9,  r9, #4            @ fix src pointer\r
428 .else\r
429     add     r9,  r9, #4\r
430 .endif\r
431     mov     r1,  r9\r
432 \r
433     stmia   r0!, {r3-r6}            @ top border\r
434     stmia   r0!, {r3-r6}\r
435     add     r7,  r0, #256*4-8*4\r
436     stmia   r7!, {r3-r6}\r
437     stmia   r7!, {r3-r6}\r
438     add     r7,  r7, #256*4-8*4\r
439     stmia   r7!, {r3-r6}\r
440     stmia   r7!, {r3-r6}\r
441     add     r7,  r7, #256*4-8*4\r
442     stmia   r7!, {r3-r6}\r
443     stmia   r7!, {r3-r6}\r
444 \r
445     orr     r12, r12, #(224/4-1)<<16 @ restore row counter\r
446     b       0b @ .loopM2RGB32_270\r
447 .endm\r
448 \r
449 \r
450 .global vidConvCpy_90 @ void *to, void *from, void *pal, int width\r
451 \r
452 vidConvCpy_90:\r
453     vidConvCpyM2_landscape 0\r
454 \r
455 \r
456 .global vidConvCpy_270 @ void *to, void *from, void *pal, int width\r
457 \r
458 vidConvCpy_270:\r
459     vidConvCpyM2_landscape 1\r
460 \r
461 \r
462 .global vidConvCpy_center_0 @ void *to, void *from, void *pal\r
463 \r
464 vidConvCpy_center_0:\r
465     stmfd   sp!, {r4-r6,r11,lr}\r
466 \r
467     mov     r11, #0xff\r
468     add     r1,  r1, #8     @ not border (centering 32col here)\r
469 \r
470     mov     r12, #(240/4-1)<<16\r
471     orr     r12, r12, #224\r
472 \r
473 .loopRGB32_c0:\r
474     ldr     lr, [r1], #4\r
475         subs    r12, r12, #1<<16\r
476 \r
477     mode2_4pix2_0 lr\r
478     stmia   r0!, {r3-r6}\r
479     bpl     .loopRGB32_c0\r
480 \r
481         sub     r12, r12, #1\r
482         adds    r12, r12, #1<<16\r
483     ldmeqfd sp!, {r4-r6,r11,pc} @ return\r
484     add     r0,  r0, #16*4\r
485     add     r1,  r1, #88\r
486     orr     r12, #(240/4-1)<<16\r
487     b       .loopRGB32_c0\r
488 \r
489 \r
490 .global vidConvCpy_center_180 @ void *to, void *from, void *pal\r
491 \r
492 vidConvCpy_center_180:\r
493     stmfd   sp!, {r4-r6,r11,lr}\r
494 \r
495     mov     r11, #0xff\r
496     add     r1,  r1, #0x11c00\r
497     add     r1,  r1, #0x002B8 @ #328*224-72\r
498 \r
499     mov     r12, #(240/4-1)<<16\r
500     orr     r12, r12, #224\r
501 \r
502 .loopRGB32_c180:\r
503     ldr     lr, [r1, #-4]!\r
504         subs    r12, r12, #1<<16\r
505 \r
506     mode2_4pix2_180 lr\r
507     stmia   r0!, {r3-r6}\r
508     bpl     .loopRGB32_c180\r
509 \r
510         sub     r12, r12, #1\r
511         adds    r12, r12, #1<<16\r
512     ldmeqfd sp!, {r4-r6,r11,pc} @ return\r
513     add     r0,  r0, #16*4\r
514     sub     r1,  r1, #88\r
515     orr     r12, #(240/4-1)<<16\r
516     b       .loopRGB32_c180\r
517 \r
518 \r
519 @ note: the following code assumes that (pal[x] & 0x030303) == 0\r
520 \r
521 .global vidConvCpy_center2_40c_0 @ void *to, void *from, void *pal, int lines\r
522 \r
523 vidConvCpy_center2_40c_0:\r
524     stmfd   sp!, {r4-r6,r10,r11,lr}\r
525 \r
526     mov     r11, #0xff\r
527     mov     r10, #0xfc\r
528     orr     r10, r10, lsl #8\r
529     orr     r10, r10, lsl #8\r
530     add     r1,  r1, #8     @ border\r
531 \r
532     mov     r12, #(240/3-1)<<16\r
533     orr     r12, r12, r3\r
534 \r
535 .loopRGB32_c2_40c_0:\r
536     ldr     lr, [r1], #4\r
537         subs    r12, r12, #1<<16\r
538 \r
539     mode2_4pix_to3 lr, 0\r
540 \r
541     stmia   r0!, {r3-r5}\r
542     bpl     .loopRGB32_c2_40c_0\r
543 \r
544         sub     r12, r12, #1\r
545         adds    r12, r12, #1<<16\r
546     ldmeqfd sp!, {r4-r6,r10,r11,pc} @ return\r
547     add     r0,  r0, #16*4\r
548     add     r1,  r1, #8\r
549     orr     r12, #(240/3-1)<<16\r
550     b       .loopRGB32_c2_40c_0\r
551 \r
552 \r
553 .global vidConvCpy_center2_40c_180 @ void *to, void *from, void *pal, int lines\r
554 \r
555 vidConvCpy_center2_40c_180:\r
556     stmfd   sp!, {r4-r6,r10,r11,lr}\r
557 \r
558     mov     r11, #0xff\r
559     mov     r10, #0xfc\r
560     orr     r10, r10, lsl #8\r
561     orr     r10, r10, lsl #8\r
562 \r
563     mov     r4,  #328\r
564     mla     r1,  r3, r4, r1\r
565 @    add     r1,  r1, #0x11000\r
566 @    add     r1,  r1, #0x00f00 @ #328*224\r
567 \r
568     mov     r12, #(240/3-1)<<16\r
569     orr     r12, r12, r3\r
570 \r
571 .loop_c2_40c_180:\r
572     ldr     lr, [r1, #-4]!\r
573         subs    r12, r12, #1<<16\r
574 \r
575     mode2_4pix_to3 lr, 1\r
576 \r
577     stmia   r0!, {r3-r5}\r
578     bpl     .loop_c2_40c_180\r
579 \r
580         sub     r12, r12, #1\r
581         adds    r12, r12, #1<<16\r
582     ldmeqfd sp!, {r4-r6,r10,r11,pc} @ return\r
583     add     r0,  r0, #16*4\r
584     sub     r1,  r1, #8\r
585     orr     r12, #(240/3-1)<<16\r
586     b       .loop_c2_40c_180\r
587 \r
588 \r
589 .global vidConvCpy_center2_32c_0 @ void *to, void *from, void *pal, int lines\r
590 \r
591 vidConvCpy_center2_32c_0:\r
592     stmfd   sp!, {r4-r11,lr}\r
593 \r
594     mov     r10, #0xfc\r
595     orr     r10, r10, lsl #8\r
596     orr     r10, r10, lsl #8\r
597     mov     r11, #0xff\r
598     add     r1,  r1, #8     @ border\r
599 \r
600     mov     r12, #(240/15-1)<<16\r
601     orr     r12, r12, r3\r
602 \r
603 .loop_c2_32c_0:\r
604     ldmia   r1!, {r7-r9,lr}\r
605         subs    r12, r12, #1<<16\r
606 \r
607     mode2_4pix2_0 r7\r
608     stmia   r0!, {r3-r6}\r
609     mode2_4pix2_0 r8\r
610     stmia   r0!, {r3-r6}\r
611     mode2_4pix2_0 r9\r
612     stmia   r0!, {r3-r6}\r
613     mode2_4pix_to3 lr, 0\r
614     stmia   r0!, {r3-r5}\r
615     bpl     .loop_c2_32c_0\r
616 \r
617         sub     r12, r12, #1\r
618         adds    r12, r12, #1<<16\r
619     ldmeqfd sp!, {r4-r11,pc} @ return\r
620     add     r0,  r0, #16*4\r
621     add     r1,  r1, #64+8\r
622     orr     r12, #(240/15-1)<<16\r
623     b       .loop_c2_32c_0\r
624 \r
625 \r
626 .global vidConvCpy_center2_32c_180 @ void *to, void *from, void *pal, int lines\r
627 \r
628 vidConvCpy_center2_32c_180:\r
629     stmfd   sp!, {r4-r11,lr}\r
630 \r
631     mov     r10, #0xfc\r
632     orr     r10, r10, lsl #8\r
633     orr     r10, r10, lsl #8\r
634     mov     r11, #0xff\r
635 \r
636     mov     r4,  #328\r
637     mla     r1,  r3, r4, r1\r
638 @    add     r1,  r1, #0x11000\r
639 @    add     r1,  r1, #0x00f00 @ #328*224\r
640 \r
641     mov     r12, #(240/15-1)<<16\r
642     orr     r12, r12, r3\r
643 \r
644 .loop_c2_32c_180:\r
645     ldmdb   r1!, {r7-r9,lr}\r
646         subs    r12, r12, #1<<16\r
647 \r
648     mode2_4pix2_180 lr\r
649     stmia   r0!, {r3-r6}\r
650     mode2_4pix2_180 r9\r
651     stmia   r0!, {r3-r6}\r
652     mode2_4pix2_180 r8\r
653     stmia   r0!, {r3-r6}\r
654     mode2_4pix_to3 r7, 1\r
655     stmia   r0!, {r3-r5}\r
656     bpl     .loop_c2_32c_180\r
657 \r
658         sub     r12, r12, #1\r
659         adds    r12, r12, #1<<16\r
660     ldmeqfd sp!, {r4-r11,pc} @ return\r
661     add     r0,  r0, #16*4\r
662     sub     r1,  r1, #64+8\r
663     orr     r12, #(240/15-1)<<16\r
664     b       .loop_c2_32c_180\r
665 \r
666 \r
667 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
668 \r
669 \r
670 .global vidClear @ void *to, int lines\r
671 \r
672 vidClear:\r
673     stmfd   sp!, {lr}\r
674     mov     r12, #240/16-1\r
675     orr     r12, r1, r12, lsl #16\r
676     mov     r1, #0\r
677     mov     r2, #0\r
678     mov     r3, #0\r
679     mov     lr, #0\r
680 \r
681 .loopVidClear:\r
682         subs    r12, r12, #1<<16\r
683 \r
684     stmia   r0!, {r1-r3,lr}\r
685     stmia   r0!, {r1-r3,lr}\r
686     stmia   r0!, {r1-r3,lr}\r
687     stmia   r0!, {r1-r3,lr}\r
688     bpl     .loopVidClear\r
689 \r
690         sub     r12, r12, #1\r
691         adds    r12, r12, #1<<16\r
692     ldmeqfd sp!, {pc}        @ return\r
693     add     r0,  r0, #16*4\r
694     orr     r12, #(240/16-1)<<16\r
695     b       .loopVidClear\r
696 \r
697 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
698 \r
699 .equ EExecSetExceptionHandler, (90)\r
700 \r
701 .global my_SetExceptionHandler\r
702 \r
703 my_SetExceptionHandler:\r
704     mov     ip, lr\r
705     swi     EExecSetExceptionHandler\r
706 \r