mirror of
https://github.com/RaySollium99/picodrive.git
synced 2025-09-05 07:17:45 -04:00
sms renderer, fix for zoomed sprites
This commit is contained in:
parent
fe8611f9af
commit
f90bf8cdcf
1 changed files with 18 additions and 12 deletions
30
pico/mode4.c
30
pico/mode4.c
|
@ -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,16 +171,18 @@ 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;
|
||||||
break;
|
if (!(PicoIn.opt & POPT_DIS_SPRITE_LIM) || s >= 64)
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (xoff + sat[MEM_LE2(0x80 + i*2)] >= 0) {
|
if (xoff + sat[MEM_LE2(0x80 + i*2)] >= 0) {
|
||||||
|
@ -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,16 +407,18 @@ 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;
|
||||||
break;
|
if (!(PicoIn.opt & POPT_DIS_SPRITE_LIM) || s >= 32)
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
sprites_x[s] = 4*i;
|
sprites_x[s] = 4*i;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue