2 * some color conversion and blitting routines
\r
3 * (C) notaz, 2006-2009
\r
4 * (C) irixxxx, 2020-2023
\r
6 * This work is licensed under the terms of MAME license.
\r
7 * See COPYING file in the top-level directory.
\r
13 @ Convert 0000bbbb ggggrrrr 0000bbbb ggggrrrr
\r
14 @ to 00000000 rrrr0000 gggg0000 bbbb0000 ...
\r
16 @ lr = 0x00f000f0, out: r3=lower_pix, r2=higher_pix; trashes rin
\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, lr, lsl #24
\r
31 adds r3, r3, #0x40000000
\r
32 orrcs r3, r3, lr, lsl #24
\r
34 adds r3, r3, #0x40000000
\r
35 orrcs r3, r3, lr, lsl #24
\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, lr, lsl #24
\r
53 adds r2, r2, #0x40000000
\r
54 orrcs r2, r2, lr, lsl #24
\r
56 adds r2, r2, #0x40000000
\r
57 orrcs r2, r2, lr, lsl #24
\r
61 orr r2, r2, r2, lsr #3
\r
66 .global bgr444_to_rgb32 @ void *to, void *from, unsigned entries
\r
69 stmfd sp!, {r4-r7,lr}
\r
71 mov r12, r2, lsr #3 @ repeats
\r
85 ldmfd sp!, {r4-r7,pc}
\r
88 .global bgr444_to_rgb32_sh @ void *to, void *from
\r
91 stmfd sp!, {r4-r7,lr}
\r
93 mov r12, #0x40>>3 @ repeats
\r
108 mov r12, #0x40>>3 @ repeats
\r
109 sub r1, r1, #0x40*2
\r
110 and lr, lr, lr, lsl #1 @ kill LSB for correct shadow colors
\r
122 ldmfd sp!, {r4-r7,lr}
\r
126 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
\r
128 .global vidcpy_8bit @ void *dest, void *src, int x_y, int w_h
\r
130 stmfd sp!, {r4-r6,lr}
\r
132 mov r12, r2, lsl #16 @ y
\r
134 mov r4, r12, lsr #16-8 @ 320*y = 256*y+64*y
\r
135 add r4, r4, r12, lsr #16-6
\r
136 add r0, r0, r4 @ pd += 320*y + x
\r
137 add r0, r0, r2, lsr #16
\r
139 add r4, r4, r12, lsr #16-3 @ 328*y = 320*y + 8*y
\r
140 add r1, r1, r4 @ ps += 328*y + x + 8
\r
141 add r1, r1, r2, lsr #16
\r
144 mov lr, r3, lsr #16 @ w
\r
145 mov r12, r3, lsl #16 @ h
\r
147 vidCpy8bit_loop_out:
\r
148 movs r6, lr, lsr #5
\r
149 @ beq vidCpy8bit_loop_end
\r
156 bne vidCpy8bit_loop
\r
158 ands r6, lr, #0x0018
\r
159 beq vidCpy8bit_loop_end
\r
164 bne vidCpy8bit_loop2
\r
166 vidCpy8bit_loop_end:
\r
167 subs r12,r12,#1<<16
\r
172 bne vidCpy8bit_loop_out
\r
174 ldmfd sp!, {r4-r6,pc}
\r
177 .global vidcpy_8bit_rot @ void *dest, void *src, int x_y, int w_h
\r
179 stmfd sp!, {r4-r10,lr}
\r
181 mov r12, r2, lsl #16 @ y
\r
183 add r0, r0, r12, lsr #16 @ pd += y + (319-x)*240
\r
186 sub r4, r4, r2, lsr #16 @ (319-x)
\r
187 add r0, r0, r4, lsl #8
\r
188 sub r0, r0, r4, lsl #4
\r
190 mov r4, r12, lsr #16-8 @ 328*y = 256*y + 64*y + 8*y
\r
191 add r4, r4, r12, lsr #16-6
\r
192 add r4, r4, r12, lsr #16-3
\r
193 add r1, r1, r4 @ ps += 328*y + x + 8
\r
194 add r1, r1, r2, lsr #16
\r
197 mov lr, r3, lsr #16 @ w
\r
198 mov r12, r3, lsl #16 @ h
\r
201 vidCpy8bitrot_loop_out:
\r
203 movs r9, lr, lsr #2
\r
204 @ beq vidCpy8bitrot_loop_end
\r
205 vidCpy8bitrot_loop:
\r
212 mov r6, r2, lsl #24
\r
214 orr r6, r6, r3, lsl #24
\r
216 orr r6, r6, r4, lsl #24
\r
218 orr r6, r6, r5, lsl #24
\r
219 str r6, [r0], #-240
\r
221 and r6, r3, #0xff00
\r
222 and r7, r2, #0xff00
\r
223 orr r6, r6, r7, lsr #8
\r
224 and r7, r4, #0xff00
\r
225 orr r6, r6, r7, lsl #8
\r
226 and r7, r5, #0xff00
\r
227 orr r6, r6, r7, lsl #16
\r
228 str r6, [r0], #-240
\r
230 and r6, r4, #0xff0000
\r
231 and r7, r2, #0xff0000
\r
232 orr r6, r6, r7, lsr #16
\r
233 and r7, r3, #0xff0000
\r
234 orr r6, r6, r7, lsr #8
\r
235 and r7, r5, #0xff0000
\r
236 orr r6, r6, r7, lsl #8
\r
237 str r6, [r0], #-240
\r
239 mov r6, r5, lsr #24
\r
241 orr r6, r6, r4, lsr #24
\r
243 orr r6, r6, r3, lsr #24
\r
245 orr r6, r6, r2, lsr #24
\r
246 str r6, [r0], #-240
\r
250 bne vidCpy8bitrot_loop
\r
252 vidCpy8bitrot_loop_end:
\r
253 subs r12,r12,#4<<16
\r
257 bne vidCpy8bitrot_loop_out
\r
259 ldmfd sp!, {r4-r10,pc}
\r
262 .global rotated_blit8 @ void *dst, void *linesx4, u32 y, int is_32col
\r
264 stmfd sp!,{r4-r8,lr}
\r
268 add r0, r0, #(240*320)
\r
269 sub r0, r0, #(240+4) @ y starts from 4
\r
273 subne r0, r0, #(240*32)
\r
278 rotated_blit_loop8:
\r
285 mov r6, r2, lsl #24
\r
287 orr r6, r6, r3, lsl #24
\r
289 orr r6, r6, r4, lsl #24
\r
291 orr r6, r6, r5, lsl #24
\r
292 str r6, [r0], #-240
\r
294 and r6, r3, #0xff00
\r
295 and r7, r2, #0xff00
\r
296 orr r6, r6, r7, lsr #8
\r
297 and r7, r4, #0xff00
\r
298 orr r6, r6, r7, lsl #8
\r
299 and r7, r5, #0xff00
\r
300 orr r6, r6, r7, lsl #16
\r
301 str r6, [r0], #-240
\r
303 and r6, r4, #0xff0000
\r
304 and r7, r2, #0xff0000
\r
305 orr r6, r6, r7, lsr #16
\r
306 and r7, r3, #0xff0000
\r
307 orr r6, r6, r7, lsr #8
\r
308 and r7, r5, #0xff0000
\r
309 orr r6, r6, r7, lsl #8
\r
310 str r6, [r0], #-240
\r
312 mov r6, r5, lsr #24
\r
314 orr r6, r6, r4, lsr #24
\r
316 orr r6, r6, r3, lsr #24
\r
318 orr r6, r6, r2, lsr #24
\r
319 str r6, [r0], #-240
\r
323 bne rotated_blit_loop8
\r
325 ldmfd sp!,{r4-r8,pc}
\r
332 mov r6, r2, lsl #16
\r
333 mov r7, r3, lsl #16
\r
334 orr r7, r7, r6, lsr #16
\r
335 mov r6, r4, lsl #16
\r
336 mov r8, r5, lsl #16
\r
337 orr r8, r8, r6, lsr #16
\r
341 mov r6, r2, lsr #16
\r
342 mov r7, r3, lsr #16
\r
343 orr r7, r6, r7, lsl #16
\r
344 mov r6, r4, lsr #16
\r
345 mov r8, r5, lsr #16
\r
346 orr r8, r6, r8, lsl #16
\r
349 .global rotated_blit16 @ void *dst, void *linesx4, u32 y, int is_32col
\r
351 stmfd sp!,{r4-r8,lr}
\r
353 add r0, r0, #(240*320)*2
\r
354 sub r0, r0, #(240+4)*2 @ y starts from 4
\r
355 add r0, r0, r2, lsl #1
\r
358 subne r0, r0, #(240*32)*2
\r
359 addne r1, r1, #32*2
\r
363 rotated_blit_loop16:
\r
364 ldr r2, [r1, #320*0*2]
\r
365 ldr r3, [r1, #320*1*2]
\r
366 ldr r4, [r1, #320*2*2]
\r
367 ldr r5, [r1, #320*3*2]
\r
375 ldr r2, [r1, #320*0*2+4]
\r
376 ldr r3, [r1, #320*1*2+4]
\r
377 ldr r4, [r1, #320*2*2+4]
\r
378 ldr r5, [r1, #320*3*2+4]
\r
388 bne rotated_blit_loop16
\r
390 ldmfd sp!,{r4-r8,pc}
\r
393 .global spend_cycles @ c
\r
396 mov r0, r0, lsr #2 @ 4 cycles/iteration
\r
397 sub r0, r0, #2 @ entry/exit/init
\r
404 @ vim:filetype=armasm
\r