sms renderer, fix for zoomed sprites

This commit is contained in:
kub 2021-11-02 22:18:59 +01:00
parent fe8611f9af
commit f90bf8cdcf

View file

@ -143,8 +143,8 @@ static void DrawSpritesM4(int scanline)
{ {
struct PicoVideo *pv = &Pico.video; struct PicoVideo *pv = &Pico.video;
unsigned char mb[1+256/8+2] = {0}; // zoomed unsigned char mb[1+256/8+2] = {0}; // zoomed
unsigned int sprites_addr[8]; unsigned int sprites_addr[64];
unsigned int sprites_x[8]; unsigned int sprites_x[64];
unsigned int pack; unsigned int pack;
u8 *sat; u8 *sat;
int xoff = 8; // relative to HighCol, which is (screen - 8) int xoff = 8; // relative to HighCol, which is (screen - 8)
@ -157,6 +157,7 @@ static void DrawSpritesM4(int scanline)
xoff += line_offset; xoff += line_offset;
if ((Pico.m.hardware & 0x3) == 0x3) if ((Pico.m.hardware & 0x3) == 0x3)
xoff -= 48; // GG LCD, adjust to center 160 px xoff -= 48; // GG LCD, adjust to center 160 px
scanline --;
sat = (u8 *)PicoMem.vram + ((pv->reg[5] & 0x7e) << 7); sat = (u8 *)PicoMem.vram + ((pv->reg[5] & 0x7e) << 7);
if (pv->reg[1] & 2) { if (pv->reg[1] & 2) {
@ -170,15 +171,17 @@ static void DrawSpritesM4(int scanline)
for (i = s = 0; i < 64; i++) for (i = s = 0; i < 64; i++)
{ {
int y; int y;
y = (sat[MEM_LE2(i)] + 1) & 0xff; y = sat[MEM_LE2(i)];
if (y == 0xd1 && !((pv->reg[0] & 6) == 6 && (pv->reg[1] & 0x18))) if (y == 0xd0 && !((pv->reg[0] & 6) == 6 && (pv->reg[1] & 0x18)))
break; break;
if (y > 0xe0) if (y >= 0xe0)
y -= 256; y -= 256;
y &= ~zoomed; // zoomed sprites apparently only on even lines, see GG Tarzan
if (y + h <= scanline || scanline < y) if (y + h <= scanline || scanline < y)
continue; // not on this line continue; // not on this line
if (s >= 8) { if (s >= 8) {
pv->status |= SR_SOVR; pv->status |= SR_SOVR;
if (!(PicoIn.opt & POPT_DIS_SPRITE_LIM) || s >= 64)
break; break;
} }
@ -378,8 +381,8 @@ static void DrawSpritesTMS(int scanline)
{ {
struct PicoVideo *pv = &Pico.video; struct PicoVideo *pv = &Pico.video;
unsigned char mb[1+256/8+4] = {0}; // zoomed+doublesize unsigned char mb[1+256/8+4] = {0}; // zoomed+doublesize
unsigned int sprites_addr[4]; unsigned int sprites_addr[32];
unsigned int sprites_x[4]; unsigned int sprites_x[32];
unsigned int pack; unsigned int pack;
u8 *sat; u8 *sat;
int xoff = 8; // relative to HighCol, which is (screen - 8) int xoff = 8; // relative to HighCol, which is (screen - 8)
@ -388,6 +391,7 @@ static void DrawSpritesTMS(int scanline)
int i, s, h, m; int i, s, h, m;
xoff += line_offset; xoff += line_offset;
scanline --;
sat = (u8 *)PicoMem.vramb + ((pv->reg[5] & 0x7e) << 7); sat = (u8 *)PicoMem.vramb + ((pv->reg[5] & 0x7e) << 7);
if (pv->reg[1] & 2) { if (pv->reg[1] & 2) {
@ -403,15 +407,17 @@ static void DrawSpritesTMS(int scanline)
for (i = s = 0; i < 32; i++) for (i = s = 0; i < 32; i++)
{ {
int y; int y;
y = (sat[MEM_LE2(4*i)] + 1) & 0xff; y = sat[MEM_LE2(4*i)];
if (y == 0xd1) if (y == 0xd0)
break; break;
if (y > 0xe0) if (y >= 0xe0)
y -= 256; y -= 256;
y &= ~zoomed;
if (y + h <= scanline || scanline < y) if (y + h <= scanline || scanline < y)
continue; // not on this line continue; // not on this line
if (s >= 4) { if (s >= 4) {
pv->status |= SR_SOVR | i; pv->status |= SR_SOVR | i;
if (!(PicoIn.opt & POPT_DIS_SPRITE_LIM) || s >= 32)
break; break;
} }