UIQ3 update, some makefile unification, rm old configs, stuff
[picodrive.git] / platform / uiq3 / engine / blit.s
CommitLineData
ca482e5d 1@ vim:filetype=armasm\r
cc68a136 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
67vidConvCpyRGB32:\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
91vidConvCpyRGB32sh:\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
115vidConvCpyRGB32hi:\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
142vidConvCpy_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
3550: @ .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
452vidConvCpy_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
458vidConvCpy_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
464vidConvCpy_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
492vidConvCpy_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
523vidConvCpy_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
555vidConvCpy_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
591vidConvCpy_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
628vidConvCpy_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
672vidClear:\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
ca482e5d 697@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
698\r
699.equ EExecSetExceptionHandler, (90)\r
700\r
701.global my_SetExceptionHandler\r
702\r
703my_SetExceptionHandler:\r
704 mov ip, lr\r
705 swi EExecSetExceptionHandler\r
706\r