mirror of
https://github.com/holub/mame
synced 2025-05-21 13:18:56 +03:00
instead of discarding lowest bit of sprite-x and scroll-x, add support for sub-pixel x alignment
(i'll fix cocktail mode another time, it already is/was in a broken state)
This commit is contained in:
parent
c8884d28c6
commit
137161c9fc
@ -2163,7 +2163,7 @@ static MACHINE_CONFIG_START( sys1ppi, system1_state )
|
||||
|
||||
MCFG_SCREEN_ADD("screen", RASTER)
|
||||
MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
|
||||
MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/4, 320, 0, 256, 260, 0, 224)
|
||||
MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/2, 640, 0, 512, 260, 0, 224)
|
||||
MCFG_SCREEN_UPDATE(system1)
|
||||
|
||||
MCFG_GFXDECODE(system1)
|
||||
@ -2186,7 +2186,7 @@ static MACHINE_CONFIG_DERIVED( sys1ppis, sys1ppi )
|
||||
|
||||
/* video hardware */
|
||||
MCFG_SCREEN_MODIFY("screen")
|
||||
MCFG_SCREEN_VISIBLE_AREA(0*8+8, 32*8-1-8, 0*8, 28*8-1)
|
||||
MCFG_SCREEN_VISIBLE_AREA(2*(0*8+8), 2*(32*8-1-8), 0*8, 28*8-1)
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
|
||||
@ -2206,7 +2206,7 @@ static MACHINE_CONFIG_DERIVED( sys1pios, sys1pio )
|
||||
|
||||
/* video hardware */
|
||||
MCFG_SCREEN_MODIFY("screen")
|
||||
MCFG_SCREEN_VISIBLE_AREA(0*8+8, 32*8-1-8, 0*8, 28*8-1)
|
||||
MCFG_SCREEN_VISIBLE_AREA(2*(0*8+8), 2*(32*8-1-8), 0*8, 28*8-1)
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
|
||||
|
@ -128,7 +128,7 @@ static void video_start_common(running_machine &machine, int pagecount)
|
||||
}
|
||||
|
||||
/* allocate a temporary bitmap for sprite rendering */
|
||||
state->m_sprite_bitmap = auto_bitmap_alloc(machine, 256, 256, BITMAP_FORMAT_INDEXED16);
|
||||
state->m_sprite_bitmap = auto_bitmap_alloc(machine, 512, 256, BITMAP_FORMAT_INDEXED16);
|
||||
|
||||
/* register for save stats */
|
||||
state_save_register_global(machine, state->m_video_mode);
|
||||
@ -377,12 +377,12 @@ static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const recta
|
||||
UINT16 srcaddr = spritedata[6] + (spritedata[7] << 8);
|
||||
UINT16 stride = spritedata[4] + (spritedata[5] << 8);
|
||||
UINT8 bank = ((spritedata[3] & 0x80) >> 7) | ((spritedata[3] & 0x40) >> 5) | ((spritedata[3] & 0x20) >> 3);
|
||||
int xstart = ((spritedata[2] + (spritedata[3] << 8)) & 0x1ff) / 2 + xoffset;
|
||||
int xstart = ((spritedata[2] | (spritedata[3] << 8)) & 0x1ff) + xoffset;
|
||||
int bottom = spritedata[1] + 1;
|
||||
int top = spritedata[0] + 1;
|
||||
UINT16 palettebase = spritenum * 0x10;
|
||||
const UINT8 *gfxbankbase;
|
||||
int x, y;
|
||||
int x, y, i;
|
||||
|
||||
/* writing an 0xff into the first byte of sprite RAM seems to disable all sprites;
|
||||
not sure if this applies to each sprite or only to the first one; see pitfall2
|
||||
@ -418,7 +418,7 @@ static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const recta
|
||||
|
||||
/* iterate over X */
|
||||
addrdelta = (srcaddr & 0x8000) ? -1 : 1;
|
||||
for (x = xstart, curaddr = srcaddr; ; x += 2, curaddr += addrdelta)
|
||||
for (x = xstart, curaddr = srcaddr; ; x += 4, curaddr += addrdelta)
|
||||
{
|
||||
UINT8 color1, color2;
|
||||
UINT8 data;
|
||||
@ -444,14 +444,17 @@ static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const recta
|
||||
/* draw if non-transparent */
|
||||
if (color1 != 0)
|
||||
{
|
||||
int effx = flipscreen ? 255 - (x + 0) : (x + 0);
|
||||
if (effx >= cliprect->min_x && effx <= cliprect->max_x)
|
||||
for (i = 0; i < 2; i++)
|
||||
{
|
||||
int prevpix = destbase[effx];
|
||||
int effx = flipscreen ? 255 - (x + i) : (x + i);
|
||||
if (effx >= cliprect->min_x && effx <= cliprect->max_x)
|
||||
{
|
||||
int prevpix = destbase[effx];
|
||||
|
||||
if ((prevpix & 0x0f) != 0)
|
||||
state->m_sprite_collide[((prevpix >> 4) & 0x1f) + 32 * spritenum] = state->m_sprite_collide_summary = 1;
|
||||
destbase[effx] = color1 | palettebase;
|
||||
if ((prevpix & 0x0f) != 0)
|
||||
state->m_sprite_collide[((prevpix >> 4) & 0x1f) + 32 * spritenum] = state->m_sprite_collide_summary = 1;
|
||||
destbase[effx] = color1 | palettebase;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -462,14 +465,17 @@ static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const recta
|
||||
/* draw if non-transparent */
|
||||
if (color2 != 0)
|
||||
{
|
||||
int effx = flipscreen ? 255 - (x + 1) : (x + 1);
|
||||
if (effx >= cliprect->min_x && effx <= cliprect->max_x)
|
||||
for (i = 0; i < 2; i++)
|
||||
{
|
||||
int prevpix = destbase[effx];
|
||||
int effx = flipscreen ? 255 - (x + 2 + i) : (x + 2 + i);
|
||||
if (effx >= cliprect->min_x && effx <= cliprect->max_x)
|
||||
{
|
||||
int prevpix = destbase[effx];
|
||||
|
||||
if ((prevpix & 0x0f) != 0)
|
||||
state->m_sprite_collide[((prevpix >> 4) & 0x1f) + 32 * spritenum] = state->m_sprite_collide_summary = 1;
|
||||
destbase[effx] = color2 | palettebase;
|
||||
if ((prevpix & 0x0f) != 0)
|
||||
state->m_sprite_collide[((prevpix >> 4) & 0x1f) + 32 * spritenum] = state->m_sprite_collide_summary = 1;
|
||||
destbase[effx] = color2 | palettebase;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -512,8 +518,8 @@ static void video_update_common(device_t *screen, bitmap_t *bitmap, const rectan
|
||||
/* iterate over pixels */
|
||||
for (x = cliprect->min_x; x <= cliprect->max_x; x++)
|
||||
{
|
||||
int bgx = (x - bgxscroll) & 0x1ff;
|
||||
UINT16 fgpix = fgbase[x];
|
||||
int bgx = ((x - bgxscroll) / 2) & 0x1ff;
|
||||
UINT16 fgpix = fgbase[x / 2];
|
||||
UINT16 bgpix = bgbase[bgx >> 8][bgx & 0xff];
|
||||
UINT16 sprpix = sprbase[x];
|
||||
UINT8 lookup_index;
|
||||
@ -569,7 +575,7 @@ SCREEN_UPDATE( system1 )
|
||||
fgpixmap = tilemap_get_pixmap(state->m_tilemap_page[1]);
|
||||
|
||||
/* get fixed scroll offsets */
|
||||
xscroll = (videoram[0xffc] | (videoram[0xffd] << 8)) / 2 + 14;
|
||||
xscroll = (videoram[0xffc] | (videoram[0xffd] << 8)) + 28;
|
||||
yscroll = videoram[0xfbd];
|
||||
|
||||
/* adjust for flipping */
|
||||
@ -611,9 +617,9 @@ SCREEN_UPDATE( system2 )
|
||||
/* get scroll offsets */
|
||||
if (!flip_screen_get(screen->machine()))
|
||||
{
|
||||
xscroll = (((videoram[0x7c0] | (videoram[0x7c1] << 8)) / 2) & 0xff) - 256 + 5;
|
||||
xscroll = ((videoram[0x7c0] | (videoram[0x7c1] << 8)) & 0x1ff) - 512 + 10;
|
||||
yscroll = videoram[0x7ba];
|
||||
sprxoffset = 7;
|
||||
sprxoffset = 14;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -654,7 +660,7 @@ SCREEN_UPDATE( system2_rowscroll )
|
||||
if (!flip_screen_get(screen->machine()))
|
||||
{
|
||||
for (y = 0; y < 32; y++)
|
||||
rowscroll[y] = (((videoram[0x7c0 + y * 2] | (videoram[0x7c1 + y * 2] << 8)) / 2) & 0xff) - 256 + 5;
|
||||
rowscroll[y] = ((videoram[0x7c0 + y * 2] | (videoram[0x7c1 + y * 2] << 8)) & 0x1ff) - 512 + 10;
|
||||
yscroll = videoram[0x7ba];
|
||||
}
|
||||
else
|
||||
@ -665,6 +671,6 @@ SCREEN_UPDATE( system2_rowscroll )
|
||||
}
|
||||
|
||||
/* common update */
|
||||
video_update_common(screen, bitmap, cliprect, fgpixmap, bgpixmaps, rowscroll, yscroll, 7);
|
||||
video_update_common(screen, bitmap, cliprect, fgpixmap, bgpixmaps, rowscroll, yscroll, 14);
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user