--- /dev/null
+@ some color conversion and blitting routines\r
+\r
+@ (c) Copyright 2006, notaz\r
+@ All Rights Reserved\r
+\r
+\r
+@ Convert 0000bbb0 ggg0rrr0 0000bbb0 ggg0rrr0\r
+@ to 00000000 rrr00000 ggg00000 bbb00000 ...\r
+\r
+@ lr = 0x00e000e0, out: r3=lower_pix, r2=higher_pix; trashes rin\r
+@ if sh==2, r8=0x00404040 (sh!=0 destroys flags!)\r
+.macro convRGB32_2 rin sh=0\r
+ and r2, lr, \rin, lsr #4 @ blue\r
+ and r3, \rin, lr\r
+ orr r2, r2, r3, lsl #8 @ g0b0g0b0\r
+\r
+ mov r3, r2, lsl #16 @ g0b00000\r
+ and \rin,lr, \rin, ror #12 @ 00r000r0 (reversed)\r
+ orr r3, r3, \rin, lsr #16 @ g0b000r0\r
+.if \sh == 1\r
+ mov r3, r3, ror #17 @ shadow mode\r
+.elseif \sh == 2\r
+ adds r3, r3, #0x40000000 @ green\r
+ orrcs r3, r3, #0xe0000000\r
+ mov r3, r3, ror #8\r
+ adds r3, r3, #0x40000000\r
+ orrcs r3, r3, #0xe0000000\r
+ mov r3, r3, ror #16\r
+ adds r3, r3, #0x40000000\r
+ orrcs r3, r3, #0xe0000000\r
+ mov r3, r3, ror #24\r
+ orr r3, r3, r3, lsr #3\r
+.else\r
+ mov r3, r3, ror #16 @ r3=low\r
+ orr r3, r3, r3, lsr #3\r
+.endif\r
+\r
+ str r3, [r0], #4\r
+\r
+ mov r2, r2, lsr #16\r
+ orr r2, r2, \rin, lsl #16\r
+.if \sh == 1\r
+ mov r2, r2, lsr #1\r
+.elseif \sh == 2\r
+ mov r2, r2, ror #8\r
+ adds r2, r2, #0x40000000 @ blue\r
+ orrcs r2, r2, #0xe0000000\r
+ mov r2, r2, ror #8\r
+ adds r2, r2, #0x40000000\r
+ orrcs r2, r2, #0xe0000000\r
+ mov r2, r2, ror #8\r
+ adds r2, r2, #0x40000000\r
+ orrcs r2, r2, #0xe0000000\r
+ mov r2, r2, ror #8\r
+ orr r2, r2, r2, lsr #3\r
+.else\r
+ orr r2, r2, r2, lsr #3\r
+.endif\r
+\r
+ str r2, [r0], #4\r
+.endm\r
+\r
+\r
+.global vidConvCpyRGB32 @ void *to, void *from, int pixels\r
+\r
+vidConvCpyRGB32:\r
+ stmfd sp!, {r4-r7,lr}\r
+\r
+ mov r12, r2, lsr #3 @ repeats\r
+ mov lr, #0x00e00000\r
+ orr lr, lr, #0x00e0\r
+\r
+.loopRGB32:\r
+ subs r12, r12, #1\r
+\r
+ ldmia r1!, {r4-r7}\r
+ convRGB32_2 r4\r
+ convRGB32_2 r5\r
+ convRGB32_2 r6\r
+ convRGB32_2 r7\r
+\r
+ bgt .loopRGB32\r
+\r
+ ldmfd sp!, {r4-r7,lr}\r
+ bx lr\r
+\r
+\r
+.global vidConvCpyRGB32sh @ void *to, void *from, int pixels\r
+\r
+vidConvCpyRGB32sh:\r
+ stmfd sp!, {r4-r7,lr}\r
+\r
+ mov r12, r2, lsr #3 @ repeats\r
+ mov lr, #0x00e00000\r
+ orr lr, lr, #0x00e0\r
+\r
+.loopRGB32sh:\r
+ subs r12, r12, #1\r
+\r
+ ldmia r1!, {r4-r7}\r
+ convRGB32_2 r4, 1\r
+ convRGB32_2 r5, 1\r
+ convRGB32_2 r6, 1\r
+ convRGB32_2 r7, 1\r
+\r
+ bgt .loopRGB32sh\r
+\r
+ ldmfd sp!, {r4-r7,lr}\r
+ bx lr\r
+\r
+\r
+.global vidConvCpyRGB32hi @ void *to, void *from, int pixels\r
+\r
+vidConvCpyRGB32hi:\r
+ stmfd sp!, {r4-r7,lr}\r
+\r
+ mov r12, r2, lsr #3 @ repeats\r
+ mov lr, #0x00e00000\r
+ orr lr, lr, #0x00e0\r
+\r
+.loopRGB32hi:\r
+ ldmia r1!, {r4-r7}\r
+ convRGB32_2 r4, 2\r
+ convRGB32_2 r5, 2\r
+ convRGB32_2 r6, 2\r
+ convRGB32_2 r7, 2\r
+\r
+ subs r12, r12, #1\r
+ bgt .loopRGB32hi\r
+\r
+ ldmfd sp!, {r4-r7,lr}\r
+ bx lr\r
+\r
+\r
+@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
+\r
+@ -------- M2 stuff ---------\r
+/*\r
+.global vidConvCpy_90 @ void *to, void *from, int width\r
+\r
+vidConvCpy_90:\r
+ stmfd sp!, {r4-r10,lr}\r
+\r
+ mov lr, #0x00F00000\r
+ orr lr, lr, #0x00F0\r
+\r
+ mov r12, #224/4 @ row counter\r
+ mov r10, r2, lsl #2 @ we do 2 pixel wide copies\r
+\r
+ add r8, r0, #256*4 @ parallel line\r
+ add r1, r1, #0x23000\r
+ add r1, r1, #0x00B80 @ r1+=328*223*2+8*2\r
+ mov r9, r1\r
+\r
+ mov r4, #0 @ fill bottom border\r
+ mov r5, #0\r
+ mov r6, #0\r
+ mov r7, #0\r
+ stmia r0!, {r4-r7}\r
+ stmia r0!, {r4-r7}\r
+ stmia r8!, {r4-r7}\r
+ stmia r8!, {r4-r7}\r
+\r
+.loopM2RGB32_90:\r
+ subs r12, r12, #1\r
+\r
+ @ at first this loop was written differently: src pixels were fetched with ldm's and\r
+ @ dest was not sequential. It ran nearly 2 times slower. It seems it is very important\r
+ @ to do sequential memory access on those items, which we have more (to offload addressing bus?).\r
+\r
+ ldr r4, [r1], #-328*2\r
+ ldr r5, [r1], #-328*2\r
+ ldr r6, [r1], #-328*2\r
+ ldr r7, [r1], #-328*2\r
+\r
+ convRGB32_2 r4, 1\r
+ convRGB32_2 r5, 1\r
+ convRGB32_2 r6, 1\r
+ convRGB32_2 r7, 1\r
+\r
+ str r4, [r8], #4\r
+ str r5, [r8], #4\r
+ str r6, [r8], #4\r
+ str r7, [r8], #4\r
+\r
+ bne .loopM2RGB32_90\r
+\r
+ mov r4, #0 @ top border\r
+ mov r5, #0\r
+ mov r6, #0\r
+ stmia r0!, {r4-r6,r12}\r
+ stmia r0!, {r4-r6,r12}\r
+ stmia r8!, {r4-r6,r12}\r
+ stmia r8!, {r4-r6,r12}\r
+\r
+ subs r10, r10, #1\r
+ ldmeqfd sp!, {r4-r10,pc} @ return\r
+\r
+ add r0, r8, #16*4 @ set new dst pointer\r
+ add r8, r0, #256*4\r
+ add r9, r9, #2*2 @ fix src pointer\r
+ mov r1, r9\r
+\r
+ stmia r0!, {r4-r6,r12} @ bottom border\r
+ stmia r0!, {r4-r6,r12}\r
+ stmia r8!, {r4-r6,r12}\r
+ stmia r8!, {r4-r6,r12}\r
+\r
+ mov r12, #224/4 @ restore row counter\r
+ b .loopM2RGB32_90\r
+\r
+\r
+\r
+@ converter for vidConvCpy_270\r
+@ lr = 0x00F000F0, out: r3=lower_pix, r2=higher_pix; trashes rin\r
+.macro convRGB32_3 rin\r
+ and r2, lr, \rin, lsr #4 @ blue\r
+ and r3, \rin, lr\r
+ orr r2, r2, r3, lsl #8 @ g0b0g0b0\r
+\r
+ mov r3, r2, lsl #16 @ g0b00000\r
+ and \rin,lr, \rin, ror #12 @ 00r000r0 (reversed)\r
+ orr r3, r3, \rin, lsr #16 @ g0b000r0\r
+\r
+ mov r2, r2, lsr #16\r
+ orr r2, r2, \rin, lsl #16\r
+ str r2, [r0], #4\r
+\r
+ mov \rin,r3, ror #16 @ r3=low\r
+.endm\r
+*/\r
+@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
+\r
+\r
+@ takes byte-sized pixels from r3-r6, fetches from pal and stores to r7,r8,r10,lr\r
+@ r2=pal\r
+.macro mode2_4pix shift\r
+ and r7, r11, r3, lsr #\shift\r
+ ldr r7, [r2, r7, lsl #2]\r
+\r
+ and r8, r11, r4, lsr #\shift\r
+ ldr r8, [r2, r8, lsl #2]\r
+\r
+ and r10,r11, r5, lsr #\shift\r
+ ldr r10,[r2, r10,lsl #2]\r
+\r
+ and lr, r11, r6, lsr #\shift\r
+ ldr lr, [r2, lr, lsl #2]\r
+.endm\r
+\r
+@ r2=pal, r11=0xff\r
+.macro mode2_4pix_getpix0 dreg sreg\r
+ and \dreg, r11, \sreg\r
+ ldr \dreg, [r2, \dreg, lsl #2]\r
+.endm\r
+\r
+.macro mode2_4pix_getpix1 dreg sreg\r
+ and \dreg, r11, \sreg, lsr #8\r
+ ldr \dreg, [r2, \dreg, lsl #2]\r
+.endm\r
+\r
+.macro mode2_4pix_getpix2 dreg sreg\r
+ and \dreg, r11, \sreg, lsr #16\r
+ ldr \dreg, [r2, \dreg, lsl #2]\r
+.endm\r
+\r
+.macro mode2_4pix_getpix3 dreg sreg\r
+ and \dreg, r11, \sreg, lsr #24\r
+ ldr \dreg, [r2, \dreg, lsl #2]\r
+.endm\r
+\r
+@ takes byte-sized pixels from reg, fetches from pal and stores to r3-r6\r
+@ r11=0xFF, r2=pal\r
+.macro mode2_4pix2_0 reg\r
+ mode2_4pix_getpix0 r3, \reg\r
+ mode2_4pix_getpix1 r4, \reg\r
+ mode2_4pix_getpix2 r5, \reg\r
+ mode2_4pix_getpix3 r6, \reg\r
+.endm\r
+\r
+@ ...\r
+.macro mode2_4pix2_180 reg\r
+ mode2_4pix_getpix3 r3, \reg\r
+ mode2_4pix_getpix2 r4, \reg\r
+ mode2_4pix_getpix1 r5, \reg\r
+ mode2_4pix_getpix0 r6, \reg\r
+.endm\r
+\r
+@ takes byte-sized pixels from reg, fetches from pal and stores to r3-r5\r
+@ r11=0xFF, r2=pal, r10=0xfcfcfc, r6=tmp\r
+.macro mode2_4pix_to3 reg is180\r
+.if \is180\r
+ mode2_4pix_getpix3 r3, \reg\r
+ mode2_4pix_getpix2 r4, \reg\r
+.else\r
+ mode2_4pix_getpix0 r3, \reg @ gathering loads cause a weird-hang\r
+ mode2_4pix_getpix1 r4, \reg\r
+.endif\r
+\r
+ sub r3, r3, r3, lsr #2 @ r3 *= 0.75\r
+ add r3, r3, r4, lsr #2 @ r3 += r4 * 0.25\r
+ and r3, r3, r10\r
+\r
+.if \is180\r
+ mode2_4pix_getpix1 r5, \reg\r
+ mode2_4pix_getpix0 r6, \reg\r
+.else\r
+ mode2_4pix_getpix2 r5, \reg\r
+ mode2_4pix_getpix3 r6, \reg\r
+.endif\r
+\r
+ mov r4, r4, lsr #1\r
+ add r4, r4, r5, lsr #1 @ r4 = (r4 + r5) / 2;\r
+@ and r4, r4, r10\r
+ sub r6, r6, r6, lsr #2 @ r6 *= 0.75\r
+ add r5, r6, r5, lsr #2 @ r5 = r6 + r5 * 0.25\r
+ and r5, r5, r10\r
+.endm\r
+\r
+\r
+@ void *to, void *from, void *pal, int width\r
+.macro vidConvCpyM2_landscape is270\r
+ stmfd sp!, {r4-r11,lr}\r
+\r
+ mov r11, #0xff\r
+\r
+ mov r12, #(224/4-1)<<16 @ row counter\r
+ orr r12, r12, r3, lsl #1 @ we do 4 pixel wide copies (right to left)\r
+\r
+.if \is270\r
+ add r1, r1, #324\r
+.else\r
+ add r1, r1, #0x11c00\r
+ add r1, r1, #0x00308 @ 328*224+8\r
+.endif\r
+ mov r9, r1\r
+\r
+ mov r3, #0 @ fill top border\r
+ mov r4, #0\r
+ mov r5, #0\r
+ mov r6, #0\r
+ stmia r0!, {r3-r6}\r
+ stmia r0!, {r3-r6}\r
+ add r7, r0, #256*4-8*4\r
+ stmia r7!, {r3-r6}\r
+ stmia r7!, {r3-r6}\r
+ add r7, r7, #256*4-8*4\r
+ stmia r7!, {r3-r6}\r
+ stmia r7!, {r3-r6}\r
+ add r7, r7, #256*4-8*4\r
+ stmia r7!, {r3-r6}\r
+ stmia r7!, {r3-r6}\r
+\r
+0: @ .loopM2RGB32_270:\r
+ subs r12, r12, #1<<16\r
+\r
+.if \is270\r
+ ldr r3, [r1], #328\r
+ ldr r4, [r1], #328\r
+ ldr r5, [r1], #328\r
+ ldr r6, [r1], #328\r
+.else\r
+ ldr r3, [r1, #-328]!\r
+ ldr r4, [r1, #-328]!\r
+ ldr r5, [r1, #-328]!\r
+ ldr r6, [r1, #-328]!\r
+.endif\r
+\r
+.if \is270\r
+ mode2_4pix 24\r
+.else\r
+ mode2_4pix 0\r
+.endif\r
+ stmia r0, {r7,r8,r10,lr}\r
+ add r0, r0, #256*4\r
+\r
+.if \is270\r
+ mode2_4pix 16\r
+.else\r
+ mode2_4pix 8\r
+.endif\r
+ stmia r0, {r7,r8,r10,lr}\r
+ add r0, r0, #256*4\r
+\r
+.if \is270\r
+ mode2_4pix 8\r
+.else\r
+ mode2_4pix 16\r
+.endif\r
+ stmia r0, {r7,r8,r10,lr}\r
+ add r0, r0, #256*4\r
+\r
+.if \is270\r
+ mode2_4pix 0\r
+.else\r
+ mode2_4pix 24\r
+.endif\r
+ stmia r0!,{r7,r8,r10,lr}\r
+ sub r0, r0, #256*4*3\r
+\r
+ bpl 0b @ .loopM2RGB32_270\r
+\r
+ mov r3, #0 @ bottom border\r
+ mov r4, #0\r
+ mov r5, #0\r
+ mov r6, #0\r
+ stmia r0!, {r3-r6}\r
+ stmia r0!, {r3-r6}\r
+ add r0, r0, #256*4-8*4\r
+ stmia r0!, {r3-r6}\r
+ stmia r0!, {r3-r6}\r
+ add r0, r0, #256*4-8*4\r
+ stmia r0!, {r3-r6}\r
+ stmia r0!, {r3-r6}\r
+ add r0, r0, #256*4-8*4\r
+ stmia r0!, {r3-r6}\r
+ nop @ phone crashes if this is commented out. Do I stress it too much?\r
+ stmia r0!, {r3-r6}\r
+\r
+ add r12, r12, #1<<16\r
+ subs r12, r12, #1\r
+ ldmeqfd sp!, {r4-r11,pc} @ return\r
+\r
+ add r0, r0, #16*4\r
+.if \is270\r
+ sub r9, r9, #4 @ fix src pointer\r
+.else\r
+ add r9, r9, #4\r
+.endif\r
+ mov r1, r9\r
+\r
+ stmia r0!, {r3-r6} @ top border\r
+ stmia r0!, {r3-r6}\r
+ add r7, r0, #256*4-8*4\r
+ stmia r7!, {r3-r6}\r
+ stmia r7!, {r3-r6}\r
+ add r7, r7, #256*4-8*4\r
+ stmia r7!, {r3-r6}\r
+ stmia r7!, {r3-r6}\r
+ add r7, r7, #256*4-8*4\r
+ stmia r7!, {r3-r6}\r
+ stmia r7!, {r3-r6}\r
+\r
+ orr r12, r12, #(224/4-1)<<16 @ restore row counter\r
+ b 0b @ .loopM2RGB32_270\r
+.endm\r
+\r
+\r
+.global vidConvCpy_90 @ void *to, void *from, void *pal, int width\r
+\r
+vidConvCpy_90:\r
+ vidConvCpyM2_landscape 0\r
+\r
+\r
+.global vidConvCpy_270 @ void *to, void *from, void *pal, int width\r
+\r
+vidConvCpy_270:\r
+ vidConvCpyM2_landscape 1\r
+\r
+\r
+.global vidConvCpy_center_0 @ void *to, void *from, void *pal\r
+\r
+vidConvCpy_center_0:\r
+ stmfd sp!, {r4-r6,r11,lr}\r
+\r
+ mov r11, #0xff\r
+ add r1, r1, #8 @ not border (centering 32col here)\r
+\r
+ mov r12, #(240/4-1)<<16\r
+ orr r12, r12, #224\r
+\r
+.loopRGB32_c0:\r
+ ldr lr, [r1], #4\r
+ subs r12, r12, #1<<16\r
+\r
+ mode2_4pix2_0 lr\r
+ stmia r0!, {r3-r6}\r
+ bpl .loopRGB32_c0\r
+\r
+ sub r12, r12, #1\r
+ adds r12, r12, #1<<16\r
+ ldmeqfd sp!, {r4-r6,r11,pc} @ return\r
+ add r0, r0, #16*4\r
+ add r1, r1, #88\r
+ orr r12, #(240/4-1)<<16\r
+ b .loopRGB32_c0\r
+\r
+\r
+.global vidConvCpy_center_180 @ void *to, void *from, void *pal\r
+\r
+vidConvCpy_center_180:\r
+ stmfd sp!, {r4-r6,r11,lr}\r
+\r
+ mov r11, #0xff\r
+ add r1, r1, #0x11c00\r
+ add r1, r1, #0x002B8 @ #328*224-72\r
+\r
+ mov r12, #(240/4-1)<<16\r
+ orr r12, r12, #224\r
+\r
+.loopRGB32_c180:\r
+ ldr lr, [r1, #-4]!\r
+ subs r12, r12, #1<<16\r
+\r
+ mode2_4pix2_180 lr\r
+ stmia r0!, {r3-r6}\r
+ bpl .loopRGB32_c180\r
+\r
+ sub r12, r12, #1\r
+ adds r12, r12, #1<<16\r
+ ldmeqfd sp!, {r4-r6,r11,pc} @ return\r
+ add r0, r0, #16*4\r
+ sub r1, r1, #88\r
+ orr r12, #(240/4-1)<<16\r
+ b .loopRGB32_c180\r
+\r
+\r
+@ note: the following code assumes that (pal[x] & 0x030303) == 0\r
+\r
+.global vidConvCpy_center2_40c_0 @ void *to, void *from, void *pal, int lines\r
+\r
+vidConvCpy_center2_40c_0:\r
+ stmfd sp!, {r4-r6,r10,r11,lr}\r
+\r
+ mov r11, #0xff\r
+ mov r10, #0xfc\r
+ orr r10, r10, lsl #8\r
+ orr r10, r10, lsl #8\r
+ add r1, r1, #8 @ border\r
+\r
+ mov r12, #(240/3-1)<<16\r
+ orr r12, r12, r3\r
+\r
+.loopRGB32_c2_40c_0:\r
+ ldr lr, [r1], #4\r
+ subs r12, r12, #1<<16\r
+\r
+ mode2_4pix_to3 lr, 0\r
+\r
+ stmia r0!, {r3-r5}\r
+ bpl .loopRGB32_c2_40c_0\r
+\r
+ sub r12, r12, #1\r
+ adds r12, r12, #1<<16\r
+ ldmeqfd sp!, {r4-r6,r10,r11,pc} @ return\r
+ add r0, r0, #16*4\r
+ add r1, r1, #8\r
+ orr r12, #(240/3-1)<<16\r
+ b .loopRGB32_c2_40c_0\r
+\r
+\r
+.global vidConvCpy_center2_40c_180 @ void *to, void *from, void *pal, int lines\r
+\r
+vidConvCpy_center2_40c_180:\r
+ stmfd sp!, {r4-r6,r10,r11,lr}\r
+\r
+ mov r11, #0xff\r
+ mov r10, #0xfc\r
+ orr r10, r10, lsl #8\r
+ orr r10, r10, lsl #8\r
+\r
+ mov r4, #328\r
+ mla r1, r3, r4, r1\r
+@ add r1, r1, #0x11000\r
+@ add r1, r1, #0x00f00 @ #328*224\r
+\r
+ mov r12, #(240/3-1)<<16\r
+ orr r12, r12, r3\r
+\r
+.loop_c2_40c_180:\r
+ ldr lr, [r1, #-4]!\r
+ subs r12, r12, #1<<16\r
+\r
+ mode2_4pix_to3 lr, 1\r
+\r
+ stmia r0!, {r3-r5}\r
+ bpl .loop_c2_40c_180\r
+\r
+ sub r12, r12, #1\r
+ adds r12, r12, #1<<16\r
+ ldmeqfd sp!, {r4-r6,r10,r11,pc} @ return\r
+ add r0, r0, #16*4\r
+ sub r1, r1, #8\r
+ orr r12, #(240/3-1)<<16\r
+ b .loop_c2_40c_180\r
+\r
+\r
+.global vidConvCpy_center2_32c_0 @ void *to, void *from, void *pal, int lines\r
+\r
+vidConvCpy_center2_32c_0:\r
+ stmfd sp!, {r4-r11,lr}\r
+\r
+ mov r10, #0xfc\r
+ orr r10, r10, lsl #8\r
+ orr r10, r10, lsl #8\r
+ mov r11, #0xff\r
+ add r1, r1, #8 @ border\r
+\r
+ mov r12, #(240/15-1)<<16\r
+ orr r12, r12, r3\r
+\r
+.loop_c2_32c_0:\r
+ ldmia r1!, {r7-r9,lr}\r
+ subs r12, r12, #1<<16\r
+\r
+ mode2_4pix2_0 r7\r
+ stmia r0!, {r3-r6}\r
+ mode2_4pix2_0 r8\r
+ stmia r0!, {r3-r6}\r
+ mode2_4pix2_0 r9\r
+ stmia r0!, {r3-r6}\r
+ mode2_4pix_to3 lr, 0\r
+ stmia r0!, {r3-r5}\r
+ bpl .loop_c2_32c_0\r
+\r
+ sub r12, r12, #1\r
+ adds r12, r12, #1<<16\r
+ ldmeqfd sp!, {r4-r11,pc} @ return\r
+ add r0, r0, #16*4\r
+ add r1, r1, #64+8\r
+ orr r12, #(240/15-1)<<16\r
+ b .loop_c2_32c_0\r
+\r
+\r
+.global vidConvCpy_center2_32c_180 @ void *to, void *from, void *pal, int lines\r
+\r
+vidConvCpy_center2_32c_180:\r
+ stmfd sp!, {r4-r11,lr}\r
+\r
+ mov r10, #0xfc\r
+ orr r10, r10, lsl #8\r
+ orr r10, r10, lsl #8\r
+ mov r11, #0xff\r
+\r
+ mov r4, #328\r
+ mla r1, r3, r4, r1\r
+@ add r1, r1, #0x11000\r
+@ add r1, r1, #0x00f00 @ #328*224\r
+\r
+ mov r12, #(240/15-1)<<16\r
+ orr r12, r12, r3\r
+\r
+.loop_c2_32c_180:\r
+ ldmdb r1!, {r7-r9,lr}\r
+ subs r12, r12, #1<<16\r
+\r
+ mode2_4pix2_180 lr\r
+ stmia r0!, {r3-r6}\r
+ mode2_4pix2_180 r9\r
+ stmia r0!, {r3-r6}\r
+ mode2_4pix2_180 r8\r
+ stmia r0!, {r3-r6}\r
+ mode2_4pix_to3 r7, 1\r
+ stmia r0!, {r3-r5}\r
+ bpl .loop_c2_32c_180\r
+\r
+ sub r12, r12, #1\r
+ adds r12, r12, #1<<16\r
+ ldmeqfd sp!, {r4-r11,pc} @ return\r
+ add r0, r0, #16*4\r
+ sub r1, r1, #64+8\r
+ orr r12, #(240/15-1)<<16\r
+ b .loop_c2_32c_180\r
+\r
+\r
+@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
+\r
+\r
+.global vidClear @ void *to, int lines\r
+\r
+vidClear:\r
+ stmfd sp!, {lr}\r
+ mov r12, #240/16-1\r
+ orr r12, r1, r12, lsl #16\r
+ mov r1, #0\r
+ mov r2, #0\r
+ mov r3, #0\r
+ mov lr, #0\r
+\r
+.loopVidClear:\r
+ subs r12, r12, #1<<16\r
+\r
+ stmia r0!, {r1-r3,lr}\r
+ stmia r0!, {r1-r3,lr}\r
+ stmia r0!, {r1-r3,lr}\r
+ stmia r0!, {r1-r3,lr}\r
+ bpl .loopVidClear\r
+\r
+ sub r12, r12, #1\r
+ adds r12, r12, #1<<16\r
+ ldmeqfd sp!, {pc} @ return\r
+ add r0, r0, #16*4\r
+ orr r12, #(240/16-1)<<16\r
+ b .loopVidClear\r
+\r