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 mla r11,r4,r5,r11 @ r11 = pmd = PicoDraw2FB + offs*328: md data
83 movne r10,#0x8000 @ r10 = inv_bit
84 call_scan_prep \call_scan
87 b 1f @ loop_outer_entry
90 call_scan_end \call_scan
92 sub r11,r11,#1 @ adjust for prev read
94 call_scan_fin_ge \call_scan
95 ldmgefd sp!, {r4-r11,pc}
97 1: @ loop_outer_entry:
98 call_scan_begin \call_scan
103 add r5, r1, r12, lsl #1 @ p32x = dram + dram[l]
106 ldrb r7, [r11], #1 @ MD pixel
109 ldrh r8, [r5], #2 @ 32x pixel
110 cmp r7, r3 @ MD has bg pixel?
113 ands r12,r12,#0x8000 @ !((t ^ inv) & 0x8000)
117 streqh r12,[r0], #2 @ *dst++ = palmd[*pmd]
124 orr r8, r8, r8, lsr #(10+11)
125 orr r8, r8, r12,lsl #1
126 bic r8, r8, #0x0020 @ kill prio bit
127 strh r8, [r0], #2 @ *dst++ = bgr2rgb(*p32x++)
133 @ note: this may read a few bytes over the end of PicoDraw2FB and dram,
134 @ so those should have a bit more alloc'ed than really needed.
135 @ unsigned short *dst, unsigned short *dram, int lines_sft_offs, int mdbg
136 .macro make_do_loop_pp name call_scan do_md
139 stmfd sp!, {r4-r11,lr}
142 ldr r10,=Pico32xNativePal
145 ldr r9, =HighPal @ palmd
148 mla r11,r4,r5,r11 @ r11 = pmd = PicoDraw2FB + offs*328: md data
149 call_scan_prep \call_scan
152 b 1f @ loop_outer_entry
155 call_scan_end \call_scan
158 call_scan_fin_ge \call_scan
159 ldmgefd sp!, {r4-r11,pc}
161 1: @ loop_outer_entry:
162 call_scan_begin \call_scan
167 add r5, r1, r12, lsl #1 @ p32x = dram + dram[l]
168 and r12,r2, #0x100 @ shift
169 add r5, r5, r12,lsr #8
172 @ r4,r6 - counters; r5 - 32x data; r9,r10 - md,32x pal; r11 - md data
173 @ r7,r8,r12,lr - temp
177 ldrneb r8, [r5, #2]! @ r7,r8 - pixel 0,1 index
181 beq 5f @ check_fill @ +8
192 ldrneb r12,[r11,#-2] @ MD pixel 0
194 cmpne r12,r3 @ MD has bg pixel?
197 ldrneh r7, [r9, r12] @ t = palmd[pmd[0]]
199 ldrneb lr, [r11,#-1] @ MD pixel 1
201 cmpne lr, r3 @ MD has bg pixel?
203 ldrneh r8, [r9, lr] @ t = palmd[pmd[1]]
208 ldrneb lr, [r11,#-1] @ MD pixel 1
210 cmpne lr, r3 @ MD has bg pixel?
216 @ count pixels, align if needed
219 orr lr, r7, r7, lsl #8
224 sub lr, r5, #2 @ starting r5 (32x render data start)
226 addne r5, r5, #1 @ add for the check above
227 add r6, r6, #1 @ restore from dec
228 orr r7, r7, r7, lsl #8
240 sub r5, r5, #4 @ undo readahead
242 @ fix alignment and check type
251 movgt r8, r6, lsl #1 @ r8=count
253 sub r6, r6, r8, lsr #1 @ adjust counter
266 ldrb r12,[r11],#1 @ MD pixel
268 cmp r12,r3 @ MD has bg pixel?
271 ldrneh r12,[r9, r12] @ t = palmd[*pmd]
292 @ unsigned short *dst, unsigned short *dram, int lines_sft_offs, int mdbg
293 .macro make_do_loop_rl name call_scan do_md
296 stmfd sp!, {r4-r11,lr}
299 ldr r10,=Pico32xNativePal
302 ldr r9, =HighPal @ palmd
305 mla r11,r4,r5,r11 @ r11 = pmd = PicoDraw2FB + offs*328: md data
306 call_scan_prep \call_scan
309 b 1f @ loop_outer_entry
312 call_scan_end \call_scan
314 sub r11,r11,#1 @ adjust for prev read
316 call_scan_fin_ge \call_scan
317 ldmgefd sp!, {r4-r11,pc}
319 1: @ loop_outer_entry:
320 call_scan_begin \call_scan
325 add r5, r1, r12, lsl #1 @ p32x = dram + dram[l]
328 ldrh r8, [r5], #2 @ control word
331 ldrh lr, [r10,r12] @ t = 32x pixel
335 ldrb r7, [r11], #1 @ MD pixel
338 cmp r7, r3 @ MD has bg pixel?
342 ldrneh r12,[r9, r7] @ t = palmd[*pmd]
344 strneh r12,[r0], #2 @ *dst++ = t
350 bge 3b @ loop_innermost
355 make_do_loop_dc do_loop_dc, 0, 0
356 make_do_loop_dc do_loop_dc_md, 0, 1
357 make_do_loop_dc do_loop_dc_scan, 1, 0
358 make_do_loop_dc do_loop_dc_scan_md, 1, 1
360 make_do_loop_pp do_loop_pp, 0, 0
361 make_do_loop_pp do_loop_pp_md, 0, 1
362 make_do_loop_pp do_loop_pp_scan, 1, 0
363 make_do_loop_pp do_loop_pp_scan_md, 1, 1
365 make_do_loop_rl do_loop_rl, 0, 0
366 make_do_loop_rl do_loop_rl_md, 0, 1
367 make_do_loop_rl do_loop_rl_scan, 1, 0
368 make_do_loop_rl do_loop_rl_scan_md, 1, 1
370 @ vim:filetype=armasm