5 @* This work is licensed under the terms of MAME license.
6 @* See COPYING file in the top-level directory.
13 .equiv P32XV_PRI, (1<< 7)
17 .global Pico32xNativePal
25 .macro call_scan_prep cond
27 ldr r4, =PicoScan32xBegin
28 ldr r5, =PicoScan32xEnd
36 .macro call_scan_fin_ge cond
42 .macro call_scan_begin cond
48 ldr pc, [sp, #(3+0)*4]
49 ldr r0, [sp, #(3+2)*4] @ &DrawLineDest
55 .macro call_scan_end cond
61 ldr pc, [sp, #(4+1)*4]
67 @ unsigned short *dst, unsigned short *dram, int lines_sft_offs, int mdbg
68 .macro make_do_loop_dc name call_scan do_md
71 stmfd sp!, {r4-r11,lr}
75 ldr r10,[r10, #0x40] @ Pico32x.vdp_regs[0]
77 ldr r9, =HighPal @ palmd
80 lsl r3, #26 @ mdbg << 26
81 mla r11,r4,r5,r11 @ r11 = pmd = PicoDraw2FB + offs*328: md data
84 movne r10,#0x8000 @ r10 = inv_bit
85 call_scan_prep \call_scan
88 b 1f @ loop_outer_entry
91 call_scan_end \call_scan
93 sub r11,r11,#1 @ adjust for prev read
95 call_scan_fin_ge \call_scan
96 ldmgefd sp!, {r4-r11,pc}
98 1: @ loop_outer_entry:
99 call_scan_begin \call_scan
104 add r5, r1, r12, lsl #1 @ p32x = dram + dram[l]
107 ldrb r7, [r11], #1 @ MD pixel
110 ldrh r8, [r5], #2 @ 32x pixel
111 cmp r3, r7, lsl #26 @ MD has bg pixel?
114 ands r12,r12,#0x8000 @ !((t ^ inv) & 0x8000)
118 streqh r12,[r0], #2 @ *dst++ = palmd[*pmd]
125 orr r8, r8, r8, lsr #(10+11)
126 orr r8, r8, r12,lsl #1
127 bic r8, r8, #0x0020 @ kill prio bit
128 strh r8, [r0], #2 @ *dst++ = bgr2rgb(*p32x++)
134 @ note: this may read a few bytes over the end of PicoDraw2FB and dram,
135 @ so those should have a bit more alloc'ed than really needed.
136 @ unsigned short *dst, unsigned short *dram, int lines_sft_offs, int mdbg
137 .macro make_do_loop_pp name call_scan do_md
140 stmfd sp!, {r4-r11,lr}
143 ldr r10,=Pico32xNativePal
146 ldr r9, =HighPal @ palmd
149 lsl r3, #26 @ mdbg << 26
150 mla r11,r4,r5,r11 @ r11 = pmd = PicoDraw2FB + offs*328: md data
151 call_scan_prep \call_scan
154 b 1f @ loop_outer_entry
157 call_scan_end \call_scan
160 call_scan_fin_ge \call_scan
161 ldmgefd sp!, {r4-r11,pc}
163 1: @ loop_outer_entry:
164 call_scan_begin \call_scan
169 add r5, r1, r12, lsl #1 @ p32x = dram + dram[l]
170 and r12,r2, #0x100 @ shift
171 add r5, r5, r12,lsr #8
174 @ r4,r6 - counters; r5 - 32x data; r9,r10 - md,32x pal; r11 - md data
175 @ r7,r8,r12,lr - temp
179 ldrneb r8, [r5, #2]! @ r7,r8 - pixel 0,1 index
183 beq 5f @ check_fill @ +8
194 ldrneb r12,[r11,#-2] @ MD pixel 0
196 cmpne r3, r12, lsl #26 @ MD has bg pixel?
199 ldrneh r7, [r9, r12] @ t = palmd[pmd[0]]
201 ldrneb lr, [r11,#-1] @ MD pixel 1
203 cmpne r3, lr, lsl #26 @ MD has bg pixel?
205 ldrneh r8, [r9, lr] @ t = palmd[pmd[1]]
210 ldrneb lr, [r11,#-1] @ MD pixel 1
212 cmpne r3, lr, lsl #26 @ MD has bg pixel?
218 @ count pixels, align if needed
221 orr lr, r7, r7, lsl #8
226 sub lr, r5, #2 @ starting r5 (32x render data start)
228 addne r5, r5, #1 @ add for the check above
229 add r6, r6, #1 @ restore from dec
230 orr r7, r7, r7, lsl #8
242 sub r5, r5, #4 @ undo readahead
244 @ fix alignment and check type
253 movgt r8, r6, lsl #1 @ r8=count
255 sub r6, r6, r8, lsr #1 @ adjust counter
268 ldrb r12,[r11],#1 @ MD pixel
270 cmp r3, lr, lsl #26 @ MD has bg pixel?
273 ldrneh r12,[r9, r12] @ t = palmd[*pmd]
294 @ unsigned short *dst, unsigned short *dram, int lines_sft_offs, int mdbg
295 .macro make_do_loop_rl name call_scan do_md
298 stmfd sp!, {r4-r11,lr}
301 ldr r10,=Pico32xNativePal
304 ldr r9, =HighPal @ palmd
307 lsl r3, #26 @ mdbg << 26
308 mla r11,r4,r5,r11 @ r11 = pmd = PicoDraw2FB + offs*328: md data
309 call_scan_prep \call_scan
312 b 1f @ loop_outer_entry
315 call_scan_end \call_scan
317 sub r11,r11,#1 @ adjust for prev read
319 call_scan_fin_ge \call_scan
320 ldmgefd sp!, {r4-r11,pc}
322 1: @ loop_outer_entry:
323 call_scan_begin \call_scan
328 add r5, r1, r12, lsl #1 @ p32x = dram + dram[l]
331 ldrh r8, [r5], #2 @ control word
334 ldrh lr, [r10,r12] @ t = 32x pixel
338 ldrb r7, [r11], #1 @ MD pixel
341 cmp r3, r7, lsl #26 @ MD has bg pixel?
345 ldrneh r12,[r9, r7] @ t = palmd[*pmd]
347 strneh r12,[r0], #2 @ *dst++ = t
353 bge 3b @ loop_innermost
358 make_do_loop_dc do_loop_dc, 0, 0
359 make_do_loop_dc do_loop_dc_md, 0, 1
360 make_do_loop_dc do_loop_dc_scan, 1, 0
361 make_do_loop_dc do_loop_dc_scan_md, 1, 1
363 make_do_loop_pp do_loop_pp, 0, 0
364 make_do_loop_pp do_loop_pp_md, 0, 1
365 make_do_loop_pp do_loop_pp_scan, 1, 0
366 make_do_loop_pp do_loop_pp_scan_md, 1, 1
368 make_do_loop_rl do_loop_rl, 0, 0
369 make_do_loop_rl do_loop_rl_md, 0, 1
370 make_do_loop_rl do_loop_rl_scan, 1, 0
371 make_do_loop_rl do_loop_rl_scan_md, 1, 1
373 @ vim:filetype=armasm