summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/video/system1.c
diff options
context:
space:
mode:
author Michaël Banaan Ananas <happppp@users.noreply.github.com>2011-12-16 04:10:07 +0000
committer Michaël Banaan Ananas <happppp@users.noreply.github.com>2011-12-16 04:10:07 +0000
commit137161c9fc524737067c4e4ec22f6e24431333b4 (patch)
tree05710ebc0d63c9e7948d9d57ab093066b3462b94 /src/mame/video/system1.c
parentc8884d28c656b42386b81bac550151e9a639d514 (diff)
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)
Diffstat (limited to 'src/mame/video/system1.c')
-rw-r--r--src/mame/video/system1.c56
1 files changed, 31 insertions, 25 deletions
diff --git a/src/mame/video/system1.c b/src/mame/video/system1.c
index 9b9d4c4c172..dc3b365a54e 100644
--- a/src/mame/video/system1.c
+++ b/src/mame/video/system1.c
@@ -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];
-
- if ((prevpix & 0x0f) != 0)
- state->m_sprite_collide[((prevpix >> 4) & 0x1f) + 32 * spritenum] = state->m_sprite_collide_summary = 1;
- destbase[effx] = color1 | palettebase;
+ 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;
+ }
}
}
@@ -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];
-
- if ((prevpix & 0x0f) != 0)
- state->m_sprite_collide[((prevpix >> 4) & 0x1f) + 32 * spritenum] = state->m_sprite_collide_summary = 1;
- destbase[effx] = color2 | palettebase;
+ 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;
+ }
}
}
}
@@ -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;
}