core vdp, fix layer/window borders for vertical window

This commit is contained in:
kub 2024-07-17 22:47:02 +02:00
parent 4a347fbe94
commit 1fad746a1f
2 changed files with 204 additions and 112 deletions

View file

@ -433,11 +433,11 @@ DrawLayer:
movs r3, r9, lsl #1 @ (force[31]|sh[30]) << 1
mov r3, #0
orrmi r10,r10, #1<<23 @ r10=cells[31:24]|sh[23]|hi_not_empty[22]
@ orrcc r10,r10, #1<<20 @ |had_output[21]|!force[20]|ty[15:0]
@ orrcc r10,r10, #1<<20 @ |had_output[21]|!force[20]|hscroll[19:17]|ty[15:0]
movmi r3, #0x80 @ default to shadowed pal on sh mode
cmp r7, #8
addne r10,r10, #0x01000000 @ we will loop cells+1 times if there is scroll
and r4, r7, #7
orr r10,r10, r4, lsl #16 @ we will process cells+1 if there is scroll
and r9, r9, #0xff00
add r8, r8, r9, lsr #8 @ tilex+=cellskip
@ -452,9 +452,40 @@ DrawLayer:
mvn r9, #0 @ r9=prevcode=-1
add r1, r11, r7 @ r1=pdest
@ r10=cells[31:24]|sh[23]|hi_not_empty[22]|had_output[21]|!force[20]|ty[15:0]
@ r10=cells[31:24]|sh[23]|hi_not_empty[22]|had_output[21]|!force[20]|hscroll[19:17]|ty[15:0]
@ r1=pd+dx r2=pack r3=pal r5=xmask r6=hc r8=tilex r9=prevcode r11=HighCol r12=nametab lr=vram
@ r4 & r7 are scratch in this loop
ands r4, r10, #7<<16 @ hscroll?
beq .dsloop_subr1
subs r10,r10, #0x01000000
bmi .dsloop_exit
and r7, r5, r8 @ do first cut tile
add r7, lr, r7, lsl #1 @ Pico.vram+((tilex&ts->xmask) as halfwords)
ldrh r9, [r7, r12] @ r7=code (int, but from unsigned, no sign extend)
add r8, r8, #1
movs r2, r9, lsl #20 @ if (code&0x1000)
mov r2, r2, lsl #1
add r2, r2, r10, lsl #17
mov r2, r2, lsr #17
eorcs r2, r2, #0x0e @ if (code&0x1000) addr^=0xe;
ldr r2, [lr, r2, lsl #1] @ pack=*(unsigned int *)(Pico.vram+addr); // Get 8 pixels
mvn r7, #0
mov r4, r4, lsr #16-2 @ (dx&7)*4
tst r9, #0x0800
moveq r7, r7, lsl r4 @ mask = ~0 [shift] (dx&7)*4
movne r7, r7, lsr r4
mvn r7, r7, ror #16
and r2, r2, r7 @ pack&mask
orr r9, r9, #0x80000000 @ invalidate oldcode since pack is masked
b .DrawStrip_samecode
.dsloop_subr1:
sub r1, r1, #8
.dsloop: @ 40-41 times
@ -480,7 +511,6 @@ DrawLayer:
eorcs r2, r2, #0x0e @ if (code&0x1000) addr^=0xe;
ldr r2, [lr, r2, lsl #1] @ pack=*(unsigned int *)(Pico.vram+addr); // Get 8 pixels
.DrawStrip_samecode:
tst r9, #0x8000
@ tstne r10, #1<<20 @ !force[20]
@ -538,6 +568,35 @@ DrawLayer:
b .dsloop
.dsloop_exit:
ands r4,r10, #7<<16 @ hscroll?
beq .DrawStrip_noscroll
and r7, r5, r8 @ do one more cut tile
add r7, lr, r7, lsl #1 @ Pico.vram+((tilex&ts->xmask) as halfwords)
ldrh r9, [r7, r12] @ r7=code (int, but from unsigned, no sign extend)
add r1, r1, #8
movs r2, r9, lsl #20 @ if (code&0x1000)
mov r2, r2, lsl #1
add r2, r2, r10, lsl #17
mov r2, r2, lsr #17
eorcs r2, r2, #0x0e @ if (code&0x1000) addr^=0xe;
ldr r2, [lr, r2, lsl #1] @ pack=*(unsigned int *)(Pico.vram+addr); // Get 8 pixels
mvn r7, #0
mov r4, r4, lsr #16-2 @ (dx&7)*4
tst r9, #0x0800
moveq r7, r7, lsl r4 @ mask = ~0 [shift] (dx&7)*4
movne r7, r7, lsr r4
mov r7, r7, ror #16
and r2, r2, r7 @ pack&mask
bic r10,r10, #7<<16
b .DrawStrip_samecode @ one last time, with last tile now masked
.DrawStrip_noscroll:
tst r10, #1<<21 @ seen non hi-prio tile
ldr r1, [sp, #9*4] @ est
mov r0, #0
@ -939,15 +998,17 @@ DrawTilesFromCache:
b .dtfc_loop
.dtfc_cut_tile:
add r4, r4, #7 @ 0-6
cmn r4, #8
ble .dtfc_loop @ off limits
rsb r4, r4, #0 @ 1-7
mov r4, r4, lsl #2
mov r12,#0xf<<28
mov r12,r12,asr r4
mov r2, r2, ror #16
mvn r12,#0
tst r6, #0x0800 @ flipped?
mvnne r12,r12
moveq r12,r12, lsl r4
movne r12,r12, lsr r4
mov r12,r12, ror #16
and r2, r2, r12
mov r2, r2, ror #16
mov r12,#0xf
tst r8, #1
bne .dtfc_shadow