sslam,drtomy: fix spriteram oob access

This commit is contained in:
hap 2022-11-05 16:11:55 +01:00
parent e8de74ea05
commit d9af94b4de
2 changed files with 21 additions and 29 deletions

View File

@ -99,19 +99,19 @@ TILE_GET_INFO_MEMBER(drtomy_state::get_tile_info_bg)
void drtomy_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect )
{
int i, x, y, ex, ey;
gfx_element *gfx = m_gfxdecode->gfx(0);
static const int x_offset[2] = {0x0, 0x2};
static const int y_offset[2] = {0x0, 0x1};
for (i = 3; i < 0x1000 / 2; i += 4)
for (int i = 3; i < m_spriteram.length() - 3; i += 4)
{
int sx = m_spriteram[i + 2] & 0x01ff;
int sy = (240 - (m_spriteram[i] & 0x00ff)) & 0x00ff;
int number = m_spriteram[i + 3];
int color = (m_spriteram[i + 2] & 0x1e00) >> 9;
int attr = (m_spriteram[i] & 0xfe00) >> 9;
const uint16_t *src = &m_spriteram[i];
int sx = src[2] & 0x01ff;
int sy = (240 - (src[0] & 0x00ff)) & 0x00ff;
int number = src[3];
int color = (src[2] & 0x1e00) >> 9;
int attr = (src[0] & 0xfe00) >> 9;
int xflip = attr & 0x20;
int yflip = attr & 0x40;
@ -122,15 +122,15 @@ void drtomy_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect
else
{
spr_size = 2;
number &= (~3);
number &= ~3;
}
for (y = 0; y < spr_size; y++)
for (int y = 0; y < spr_size; y++)
{
for (x = 0; x < spr_size; x++)
for (int x = 0; x < spr_size; x++)
{
ex = xflip ? (spr_size - 1 - x) : x;
ey = yflip ? (spr_size - 1 - y) : y;
int ex = xflip ? (spr_size - 1 - x) : x;
int ey = yflip ? (spr_size - 1 - y) : y;
gfx->transpen(bitmap,cliprect,number + x_offset[ex] + y_offset[ey],
color,xflip,yflip,

View File

@ -9,23 +9,18 @@
void sslam_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
gfx_element *gfx = m_gfxdecode->gfx(0);
uint16_t *source = m_spriteram;
uint16_t *finish = source + 0x1000/2;
source += 3; // strange
while( source<finish )
for (int i = 3; i < m_spriteram.length() - 3; i += 4)
{
int xpos, ypos, number, flipx, colr, eightbyeight;
const uint16_t *src = &m_spriteram[i];
if (src[0] & 0x2000) break;
if (source[0] & 0x2000) break;
xpos = source[2] & 0x1ff;
ypos = source[0] & 0x01ff;
colr = (source[2] & 0xf000) >> 12;
eightbyeight = source[0] & 0x1000;
flipx = source[0] & 0x4000;
number = source[3];
int xpos = src[2] & 0x1ff;
int ypos = src[0] & 0x01ff;
int colr = (src[2] & 0xf000) >> 12;
int eightbyeight = src[0] & 0x1000;
int flipx = src[0] & 0x4000;
int number = src[3];
xpos -=16; xpos -=7; xpos += m_sprites_x_offset;
ypos = 0xff - ypos;
@ -65,10 +60,7 @@ void sslam_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
gfx->transpen(bitmap,cliprect,number,colr,0,0,xpos,ypos,0);
}
}
source += 4;
}
}