improved sprite masking accuracy

This commit is contained in:
ekeeke31 2009-04-06 17:24:16 +00:00
parent 36e91c70aa
commit ae3ac87f7c
2 changed files with 48 additions and 20 deletions

View File

@ -1619,6 +1619,8 @@ void parse_satb(uint32 line)
}
}
static int spr_over = 0;
static void render_obj(uint32 line, uint8 *buf, uint8 *table)
{
uint16 ypos;
@ -1642,21 +1644,27 @@ static void render_obj(uint32 line, uint8 *buf, uint8 *table)
uint8 palette;
int attr_mask, nt_row;
int mask = 0;
for(count = 0; count < object_index_count; count += 1)
{
xpos = object_info[count].xpos & 0x1ff;
/* sprite masking (low priority sprite only) */
if(!xpos && count) return;
/* sprite masking (ignore the 1st sprite) */
if (xpos) spr_over = 1;
else if (spr_over)
{
spr_over = 0;
mask = 1;
}
size = object_info[count].size & 0x0f;
width = sizetab[(size >> 2) & 3];
/* update pixel count (off-screen sprites included) */
pixelcount += width;
pixelcount += xpos ? width : (width * 2);
if(((xpos + width) >= left) && (xpos < right))
if(((xpos + width) >= left) && (xpos < right) && !mask)
{
ypos = object_info[count].ypos;
attr = object_info[count].attr;
@ -1676,7 +1684,11 @@ static void render_obj(uint32 line, uint8 *buf, uint8 *table)
/* number of tiles to draw */
/* adjusted for sprite limit */
if (pixelcount > bitmap.viewport.w) width -= (pixelcount - bitmap.viewport.w);
if (pixelcount > bitmap.viewport.w)
{
width -= (pixelcount - bitmap.viewport.w);
}
width >>= 3;
for(column = 0; column < width; column += 1, lb+=8)
@ -1685,13 +1697,17 @@ static void render_obj(uint32 line, uint8 *buf, uint8 *table)
src = &bg_pattern_cache[(index << 6) | (v_line)];
DRAW_SPRITE_TILE;
}
}
/* sprite limit (256 or 320 pixels) */
if (pixelcount >= bitmap.viewport.w) return;
if (pixelcount >= bitmap.viewport.w)
{
spr_over = 1;
return;
}
}
spr_over = 0;
}
static void render_obj_im2(uint32 line, uint32 odd, uint8 *buf, uint8 *table)
@ -1718,21 +1734,27 @@ static void render_obj_im2(uint32 line, uint32 odd, uint8 *buf, uint8 *table)
uint32 offs;
int attr_mask, nt_row;
int mask = 0;
for(count = 0; count < object_index_count; count += 1)
{
xpos = object_info[count].xpos & 0x1ff;
/* sprite masking (low priority sprite only) */
if(!xpos && count) return;
/* sprite masking (ignore the 1st sprite) */
if (xpos) spr_over = 1;
else if(spr_over)
{
spr_over = 0;
mask = 1;
}
size = object_info[count].size & 0x0f;
width = sizetab[(size >> 2) & 3];
/* update pixel count (off-screen sprites included) */
pixelcount += width;
pixelcount += xpos ? width : (width * 2);
if(((xpos + width) >= left) && (xpos < right))
if(((xpos + width) >= left) && (xpos < right) && !mask)
{
ypos = object_info[count].ypos;
attr = object_info[count].attr;
@ -1766,7 +1788,13 @@ static void render_obj_im2(uint32 line, uint32 odd, uint8 *buf, uint8 *table)
}
/* sprite limit (256 or 320 pixels) */
if (pixelcount >= bitmap.viewport.w) return;
if (pixelcount >= bitmap.viewport.w)
{
spr_over = 1;
return;
}
}
spr_over = 0;
}

View File

@ -556,8 +556,8 @@ void vdp_ctrl_w(unsigned int data)
}
else pending = 1;
addr = ((addr_latch & 0xC000) | (data & 0x3FFF)) & 0xFFFF;
code = ((code & 0x3C) | ((data >> 14) & 0x03)) & 0x3F;
addr = ((addr_latch & 0xC000) | (data & 0x3FFF));
code = ((code & 0x3C) | ((data >> 14) & 0x03));
}
else
{
@ -565,8 +565,8 @@ void vdp_ctrl_w(unsigned int data)
pending = 0;
/* Update address and code registers */
addr = ((addr & 0x3FFF) | ((data & 3) << 14)) & 0xFFFF;
code = ((code & 0x03) | ((data >> 2) & 0x3C)) & 0x3F;
addr = ((addr & 0x3FFF) | ((data & 3) << 14));
code = ((code & 0x03) | ((data >> 2) & 0x3C));
/* Save address bits A15 and A14 */
addr_latch = (addr & 0xC000);