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