7 .equiv P32XV_PRI, (1<< 7)
11 .global Pico32xNativePal
19 .macro call_scan_prep cond
21 ldr r4, =PicoScan32xBegin
22 ldr r5, =PicoScan32xEnd
30 .macro call_scan_fin_ge cond
36 .macro call_scan_begin cond
42 ldr pc, [sp, #(3+0)*4]
43 ldr r0, [sp, #(3+2)*4] @ &DrawLineDest
49 .macro call_scan_end cond
55 ldr pc, [sp, #(4+1)*4]
61 @ unsigned short *dst, unsigned short *dram, int lines_sft_offs, int mdbg
62 .macro make_do_loop_dc name call_scan do_md
65 stmfd sp!, {r4-r11,lr}
69 ldr r10,[r10, #0x40] @ Pico32x.vdp_regs[0]
71 ldr r9, =HighPal @ palmd
74 mla r11,r4,r5,r11 @ r11 = pmd = PicoDraw2FB + offs*328: md data
77 movne r10,#0x8000 @ r10 = inv_bit
78 call_scan_prep \call_scan
81 b 1f @ loop_outer_entry
84 call_scan_end \call_scan
86 sub r11,r11,#1 @ adjust for prev read
88 call_scan_fin_ge \call_scan
89 ldmgefd sp!, {r4-r11,pc}
91 1: @ loop_outer_entry:
92 call_scan_begin \call_scan
97 add r5, r1, r12, lsl #1 @ p32x = dram + dram[l]
100 ldrb r7, [r11], #1 @ MD pixel
103 ldrh r8, [r5], #2 @ 32x pixel
104 cmp r7, r3 @ MD has bg pixel?
107 ands r12,r12,#0x8000 @ !((t ^ inv) & 0x8000)
111 streqh r12,[r0], #2 @ *dst++ = palmd[*pmd]
118 orr r8, r8, r8, lsr #(10+11)
119 orr r8, r8, r12,lsl #1
120 bic r8, r8, #0x0020 @ kill prio bit
121 strh r8, [r0], #2 @ *dst++ = bgr2rgb(*p32x++)
127 @ note: this may read a few bytes over the end of PicoDraw2FB and dram,
128 @ so those should have a bit more alloc'ed than really needed.
129 @ unsigned short *dst, unsigned short *dram, int lines_sft_offs, int mdbg
130 .macro make_do_loop_pp name call_scan do_md
133 stmfd sp!, {r4-r11,lr}
136 ldr r10,=Pico32xNativePal
139 ldr r9, =HighPal @ palmd
142 mla r11,r4,r5,r11 @ r11 = pmd = PicoDraw2FB + offs*328: md data
143 call_scan_prep \call_scan
146 b 1f @ loop_outer_entry
149 call_scan_end \call_scan
152 call_scan_fin_ge \call_scan
153 ldmgefd sp!, {r4-r11,pc}
155 1: @ loop_outer_entry:
156 call_scan_begin \call_scan
161 add r5, r1, r12, lsl #1 @ p32x = dram + dram[l]
162 and r12,r2, #0x100 @ shift
163 add r5, r5, r12,lsr #8
166 @ r4,r6 - counters; r5 - 32x data; r9,r10 - md,32x pal; r11 - md data
167 @ r7,r8,r12,lr - temp
171 ldrneb r8, [r5, #2]! @ r7,r8 - pixel 0,1 index
175 beq 5f @ check_fill @ +8
186 ldrneb r12,[r11,#-2] @ MD pixel 0
188 cmpne r12,r3 @ MD has bg pixel?
191 ldrneh r7, [r9, r12] @ t = palmd[pmd[0]]
193 ldrneb lr, [r11,#-1] @ MD pixel 1
195 cmpne lr, r3 @ MD has bg pixel?
197 ldrneh r8, [r9, lr] @ t = palmd[pmd[1]]
202 ldrneb lr, [r11,#-1] @ MD pixel 1
204 cmpne lr, r3 @ MD has bg pixel?
210 @ count pixels, align if needed
213 orr lr, r7, r7, lsl #8
218 sub lr, r5, #2 @ starting r5 (32x render data start)
220 addne r5, r5, #1 @ add for the check above
221 add r6, r6, #1 @ restore from dec
222 orr r7, r7, r7, lsl #8
234 sub r5, r5, #4 @ undo readahead
236 @ fix alignment and check type
245 movgt r8, r6, lsl #1 @ r8=count
247 sub r6, r6, r8, lsr #1 @ adjust counter
260 ldrb r12,[r11],#1 @ MD pixel
262 cmp r12,r3 @ MD has bg pixel?
265 ldrneh r12,[r9, r12] @ t = palmd[*pmd]
286 @ unsigned short *dst, unsigned short *dram, int lines_sft_offs, int mdbg
287 .macro make_do_loop_rl name call_scan do_md
290 stmfd sp!, {r4-r11,lr}
293 ldr r10,=Pico32xNativePal
296 ldr r9, =HighPal @ palmd
299 mla r11,r4,r5,r11 @ r11 = pmd = PicoDraw2FB + offs*328: md data
300 call_scan_prep \call_scan
303 b 1f @ loop_outer_entry
306 call_scan_end \call_scan
308 sub r11,r11,#1 @ adjust for prev read
310 call_scan_fin_ge \call_scan
311 ldmgefd sp!, {r4-r11,pc}
313 1: @ loop_outer_entry:
314 call_scan_begin \call_scan
319 add r5, r1, r12, lsl #1 @ p32x = dram + dram[l]
322 ldrh r8, [r5], #2 @ control word
325 ldrh lr, [r10,r12] @ t = 32x pixel
329 ldrb r7, [r11], #1 @ MD pixel
332 cmp r7, r3 @ MD has bg pixel?
336 ldrneh r12,[r9, r7] @ t = palmd[*pmd]
338 strneh r12,[r0], #2 @ *dst++ = t
344 bge 3b @ loop_innermost
349 make_do_loop_dc do_loop_dc, 0, 0
350 make_do_loop_dc do_loop_dc_md, 0, 1
351 make_do_loop_dc do_loop_dc_scan, 1, 0
352 make_do_loop_dc do_loop_dc_scan_md, 1, 1
354 make_do_loop_pp do_loop_pp, 0, 0
355 make_do_loop_pp do_loop_pp_md, 0, 1
356 make_do_loop_pp do_loop_pp_scan, 1, 0
357 make_do_loop_pp do_loop_pp_scan_md, 1, 1
359 make_do_loop_rl do_loop_rl, 0, 0
360 make_do_loop_rl do_loop_rl_md, 0, 1
361 make_do_loop_rl do_loop_rl_scan, 1, 0
362 make_do_loop_rl do_loop_rl_scan_md, 1, 1