From 08bbe7f816c278560e1cdee2314fd41ff1194e62 Mon Sep 17 00:00:00 2001 From: kub Date: Sat, 12 Dec 2020 14:59:09 +0100 Subject: [PATCH] vdp rendering, fix handling of palettes 0-2 color 14 in sprite drawing --- pico/draw.c | 27 +++++++++++--------- pico/draw_arm.S | 65 ++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 71 insertions(+), 21 deletions(-) diff --git a/pico/draw.c b/pico/draw.c index 6318713f..a9e7bde0 100644 --- a/pico/draw.c +++ b/pico/draw.c @@ -187,6 +187,14 @@ TileFlipMaker(TileFlip, pix_just_write) #ifndef _ASM_DRAW_C +// draw low prio sprite non-s/h pixels in s/h mode +#define pix_nonsh(x) \ + if (t == 0xe) pd[x]=(pal|t)&~0x80; /* disable shadow for color 14 (hw bug?) */ \ + else if (t) pd[x]=pal|t + +TileNormMaker(TileNormNonSH, pix_nonsh) +TileFlipMaker(TileFlipNonSH, pix_nonsh) + // draw sprite pixels, process operator colors #define pix_sh(x) \ if (t) { \ @@ -824,6 +832,9 @@ static void DrawSprite(int *sprite, int sh, int w) if (sh && (code&0x6000) == 0x6000) { if(code&0x0800) fTileFunc=TileFlipSH_markop; else fTileFunc=TileNormSH_markop; + } else if (sh) { + if(code&0x0800) fTileFunc=TileFlipNonSH; + else fTileFunc=TileNormNonSH; } else { if(code&0x0800) fTileFunc=TileFlip; else fTileFunc=TileNorm; @@ -1556,26 +1567,23 @@ void PicoDoHighPal555_8bit(int sh, int line, struct PicoEState *est) // otherwise intensity difference between this and s/h will be wrong t = PXCONV(t); t |= (t >> 4) & PXMASKL; - dpal[i] = dpal[0xc0/2 + i] = t; + dpal[i] = t; } // norm: xxx0, sh: 0xxx, hi: 0xxx + 7 if (sh) { // shadowed pixels - for (i = 0; i < 0x40 / 2; i++) + for (i = 0; i < 0x40 / 2; i++) { + dpal[0xc0/2 + i] = dpal[i]; dpal[0x80/2 + i] = (dpal[i] >> 1) & PXMASKH; + } // hilighted pixels for (i = 0; i < 0x40 / 2; i++) { t = ((dpal[i] >> 1) & PXMASKH) + PXMASKH; t |= (t >> 4) & PXMASKL; dpal[0x40/2 + i] = t; } - // shadowed pixels in color 14 always appear normal (hw bug?) - unsigned short *hpal = est->HighPal; - hpal[0x80 + 0x0e] = hpal[0x0e]; - hpal[0x80 + 0x1e] = hpal[0x1e]; - hpal[0x80 + 0x2e] = hpal[0x2e]; } } @@ -1611,11 +1619,6 @@ void PicoDoHighPal555(int sh, int line, struct PicoEState *est) t |= (t >> 4) & PXMASKL; dpal[0x40/2 + i] = t; } - // shadowed pixels in color 14 always appear normal (hw bug?) - unsigned short *hpal = est->HighPal; - hpal[0x80 + 0x0e] = hpal[0x0e]; - hpal[0x80 + 0x1e] = hpal[0x1e]; - hpal[0x80 + 0x2e] = hpal[0x2e]; } } diff --git a/pico/draw_arm.S b/pico/draw_arm.S index 37441222..8b717a50 100644 --- a/pico/draw_arm.S +++ b/pico/draw_arm.S @@ -69,6 +69,45 @@ @ shadow/hilight mode +@ +.macro TilePixelNonSH pat lsrr offs +.if !\lsrr + ands r4, \pat, r2 +.else + ands r4, \pat, r2, lsr #\lsrr +.endif + beq 0f + cmp r4, #0xe + orr r4, r3, r4 + biceq r4, #0x80 + strb r4, [r1,#\offs] +0: +.endm + +@ TileNormNonSH (r1=pdest, r2=pixels8, r3=pal) r4: scratch, pat: register with helper pattern 0xf +.macro TileNormNonSH pat + TilePixelNonSH \pat, 12, 0 @ #0x0000f000 + TilePixelNonSH \pat, 8, 1 @ #0x00000f00 + TilePixelNonSH \pat, 4, 2 @ #0x000000f0 + TilePixelNonSH \pat, 0, 3 @ #0x0000000f + TilePixelNonSH \pat, 28, 4 @ #0xf0000000 + TilePixelNonSH \pat, 24, 5 @ #0x0f000000 + TilePixelNonSH \pat, 20, 6 @ #0x00f00000 + TilePixelNonSH \pat, 16, 7 @ #0x000f0000 +.endm + +@ TileFlipNonSH (r1=pdest, r2=pixels8, r3=pal) r4: scratch, pat: register with helper pattern 0xf +.macro TileFlipNonSH pat + TilePixelNonSH \pat, 16, 0 @ #0x000f0000 + TilePixelNonSH \pat, 20, 1 @ #0x00f00000 + TilePixelNonSH \pat, 24, 2 @ #0x0f000000 + TilePixelNonSH \pat, 28, 3 @ #0xf0000000 + TilePixelNonSH \pat, 0, 4 @ #0x0000000f + TilePixelNonSH \pat, 4, 5 @ #0x000000f0 + TilePixelNonSH \pat, 8, 6 @ #0x00000f00 + TilePixelNonSH \pat, 12, 7 @ #0x0000f000 +.endm + @ this one is for hi priority layer .macro TilePixelShHP lsrr offs .if !\lsrr @@ -1260,6 +1299,9 @@ DrawSprite: cmp r12, r9, lsr #28 beq .dspr_shadow + tst r9, #0x80000000 + bne .dspr_shnonsh + cmp r2, r2, ror #4 beq .dspr_SingleColor @ tileline singlecolor @@ -1293,6 +1335,20 @@ DrawSprite: strneb r4, [r1], #1 b .dspr_loop +.dspr_shnonsh: + tst r9, #0x0800 + bne .dspr_TileFlipNonSH + + @ (r1=pdest, r2=pixels8, r3=pal) r4: scratch, r12: helper pattern +@ scratch: r4, r7 +.dspr_TileNormNonSH: + TileNormNonSH r12 + b .dspr_loop + +.dspr_TileFlipNonSH: + TileFlipNonSH r12 + b .dspr_loop + .dspr_shadow: cmp r2, r2, ror #4 beq .dspr_singlec_sh @@ -1567,15 +1623,6 @@ PicoDoHighPal555: stmia r4!, {r1,r6} bne .fl_loopcpRGB555_sh - @ fixup shadowed color 14 in palette 0,1,2 (always normal) - sub r4, r3, #0x40*2 - ldrh r1, [r4, #0x0e*2] @ 0x0e, 0x1e, 0x2e - ldrh r5, [r4, #0x1e*2] - ldrh r6, [r4, #0x2e*2] - strh r1, [r3, #0x4e*2] @ 0x8e, 0x9e, 0xae - strh r5, [r3, #0x5e*2] - strh r6, [r3, #0x6e*2] - mov r0, #1 PicoDoHighPal555_end: ldmfd sp!, {r4-r10,pc} -- 2.39.2