1 @ vim:filetype=armasm
\r
2 @ some color conversion and blitting routines
\r
4 @ (c) Copyright 2006, 2007 notaz
\r
5 @ All Rights Reserved
\r
7 @ vim:filetype=armasm
\r
12 @ Convert 0000bbb0 ggg0rrr0 0000bbb0 ggg0rrr0
\r
13 @ to 00000000 rrr00000 ggg00000 bbb00000 ...
\r
15 @ lr = 0x00e000e0, out: r3=lower_pix, r2=higher_pix; trashes rin
\r
16 @ if sh==2, r8=0x00404040 (sh!=0 destroys flags!)
\r
17 .macro convRGB32_2 rin sh=0
\r
18 and r2, lr, \rin, lsr #4 @ blue
\r
20 orr r2, r2, r3, lsl #8 @ g0b0g0b0
\r
22 mov r3, r2, lsl #16 @ g0b00000
\r
23 and \rin,lr, \rin, ror #12 @ 00r000r0 (reversed)
\r
24 orr r3, r3, \rin, lsr #16 @ g0b000r0
\r
26 mov r3, r3, ror #17 @ shadow mode
\r
28 adds r3, r3, #0x40000000 @ green
\r
29 orrcs r3, r3, #0xe0000000
\r
31 adds r3, r3, #0x40000000
\r
32 orrcs r3, r3, #0xe0000000
\r
34 adds r3, r3, #0x40000000
\r
35 orrcs r3, r3, #0xe0000000
\r
38 mov r3, r3, ror #16 @ r3=low
\r
41 orr r3, r3, r3, lsr #3
\r
45 orr r2, r2, \rin, lsl #16
\r
50 adds r2, r2, #0x40000000 @ blue
\r
51 orrcs r2, r2, #0xe0000000
\r
53 adds r2, r2, #0x40000000
\r
54 orrcs r2, r2, #0xe0000000
\r
56 adds r2, r2, #0x40000000
\r
57 orrcs r2, r2, #0xe0000000
\r
61 orr r2, r2, r2, lsr #3
\r
66 .global vidConvCpyRGB32 @ void *to, void *from, int pixels
\r
69 stmfd sp!, {r4-r7,lr}
\r
71 mov r12, r2, lsr #3 @ repeats
\r
86 ldmfd sp!, {r4-r7,lr}
\r
90 .global vidConvCpyRGB32sh @ void *to, void *from, int pixels
\r
93 stmfd sp!, {r4-r7,lr}
\r
95 mov r12, r2, lsr #3 @ repeats
\r
110 ldmfd sp!, {r4-r7,lr}
\r
114 .global vidConvCpyRGB32hi @ void *to, void *from, int pixels
\r
117 stmfd sp!, {r4-r7,lr}
\r
119 mov r12, r2, lsr #3 @ repeats
\r
120 mov lr, #0x00e00000
\r
121 orr lr, lr, #0x00e0
\r
133 ldmfd sp!, {r4-r7,lr}
\r
137 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
\r
141 .global vidcpy_m2 @ void *dest, void *src, int m32col, int with_32c_border
\r
143 stmfd sp!, {r4-r6,lr}
\r
145 mov r12, #224 @ lines
\r
157 sub r6, r6, lr, lsr #5 @ -= 2 in 32col mode
\r
170 bne vidCpyM2_loop_out
\r
172 ldmfd sp!, {r4-r6,pc}
\r
175 .global vidcpy_m2_rot @ void *dest, void *src, int m32col, int with_32c_border
\r
177 stmfd sp!,{r4-r8,lr}
\r
180 subne r1, r1, #32 @ adjust
\r
187 vidcpy_m2_rot_loop:
\r
188 @ a bit lame but oh well..
\r
194 adr lr, after_rot_blit8
\r
195 stmfd sp!,{r4-r8,lr}
\r
202 ldmgefd sp!,{r4-r8,pc}
\r
203 b vidcpy_m2_rot_loop
\r
206 .global rotated_blit8 @ void *dst, void *linesx4, u32 y, int is_32col
\r
208 stmfd sp!,{r4-r8,lr}
\r
212 add r0, r0, #(240*320)
\r
213 sub r0, r0, #(240+4) @ y starts from 4
\r
217 subne r0, r0, #(240*32)
\r
222 rotated_blit_loop8:
\r
229 mov r6, r2, lsl #24
\r
231 orr r6, r6, r3, lsl #24
\r
233 orr r6, r6, r4, lsl #24
\r
235 orr r6, r6, r5, lsl #24
\r
236 str r6, [r0], #-240
\r
238 and r6, r3, #0xff00
\r
239 and r7, r2, #0xff00
\r
240 orr r6, r6, r7, lsr #8
\r
241 and r7, r4, #0xff00
\r
242 orr r6, r6, r7, lsl #8
\r
243 and r7, r5, #0xff00
\r
244 orr r6, r6, r7, lsl #16
\r
245 str r6, [r0], #-240
\r
247 and r6, r4, #0xff0000
\r
248 and r7, r2, #0xff0000
\r
249 orr r6, r6, r7, lsr #16
\r
250 and r7, r3, #0xff0000
\r
251 orr r6, r6, r7, lsr #8
\r
252 and r7, r5, #0xff0000
\r
253 orr r6, r6, r7, lsl #8
\r
254 str r6, [r0], #-240
\r
256 mov r6, r5, lsr #24
\r
258 orr r6, r6, r4, lsr #24
\r
260 orr r6, r6, r3, lsr #24
\r
262 orr r6, r6, r2, lsr #24
\r
263 str r6, [r0], #-240
\r
267 bne rotated_blit_loop8
\r
269 ldmfd sp!,{r4-r8,pc}
\r
276 mov r6, r2, lsl #16
\r
277 mov r7, r3, lsl #16
\r
278 orr r7, r7, r6, lsr #16
\r
279 mov r6, r4, lsl #16
\r
280 mov r8, r5, lsl #16
\r
281 orr r8, r8, r6, lsr #16
\r
285 mov r6, r2, lsr #16
\r
286 mov r7, r3, lsr #16
\r
287 orr r7, r6, r7, lsl #16
\r
288 mov r6, r4, lsr #16
\r
289 mov r8, r5, lsr #16
\r
290 orr r8, r6, r8, lsl #16
\r
293 .global rotated_blit16 @ void *dst, void *linesx4, u32 y, int is_32col
\r
295 stmfd sp!,{r4-r8,lr}
\r
297 add r0, r0, #(240*320)*2
\r
298 sub r0, r0, #(240+4)*2 @ y starts from 4
\r
299 add r0, r0, r2, lsl #1
\r
302 subne r0, r0, #(240*32)*2
\r
303 addne r1, r1, #32*2
\r
307 rotated_blit_loop16:
\r
308 ldr r2, [r1, #320*0*2]
\r
309 ldr r3, [r1, #320*1*2]
\r
310 ldr r4, [r1, #320*2*2]
\r
311 ldr r5, [r1, #320*3*2]
\r
319 ldr r2, [r1, #320*0*2+4]
\r
320 ldr r3, [r1, #320*1*2+4]
\r
321 ldr r4, [r1, #320*2*2+4]
\r
322 ldr r5, [r1, #320*3*2+4]
\r
332 bne rotated_blit_loop16
\r
334 ldmfd sp!,{r4-r8,pc}
\r
337 .global spend_cycles @ c
\r
340 mov r0, r0, lsr #2 @ 4 cycles/iteration
\r
341 sub r0, r0, #2 @ entry/exit/init
\r