Hooked up sprite buffering in the Jaleco Mega System 1 driver. [Angelo Salese]

This commit is contained in:
Angelo Salese 2009-05-20 21:09:56 +00:00
parent c8bfb4755b
commit f2aff17480
3 changed files with 29 additions and 4 deletions

View File

@ -102,8 +102,10 @@ RAM RW 0f0000-0f3fff 0e0000-0effff? <
bootleg version of rodlandj has one instruction patched out to do exactly bootleg version of rodlandj has one instruction patched out to do exactly
the same thing that we are doing (ignoring the 6295 status). the same thing that we are doing (ignoring the 6295 status).
- VERY bad sprite lag in iganinju and plusalph and generally others. - Understand properly how irqs truly works, kazan / iganinju is (again) broken.
Is this a sprites buffer issue ?
- 64street: player characters in attract mode doesn't move at all, protection
or btanb?
- Understand a handful of unknown bits in video regs - Understand a handful of unknown bits in video regs
@ -1480,6 +1482,7 @@ static MACHINE_DRIVER_START( system_A )
MDRV_PALETTE_INIT(megasys1) MDRV_PALETTE_INIT(megasys1)
MDRV_VIDEO_START(megasys1) MDRV_VIDEO_START(megasys1)
MDRV_VIDEO_UPDATE(megasys1) MDRV_VIDEO_UPDATE(megasys1)
MDRV_VIDEO_EOF(megasys1)
/* sound hardware */ /* sound hardware */
MDRV_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") MDRV_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
@ -1584,6 +1587,7 @@ static MACHINE_DRIVER_START( system_D )
MDRV_PALETTE_INIT(megasys1) MDRV_PALETTE_INIT(megasys1)
MDRV_VIDEO_START(megasys1) MDRV_VIDEO_START(megasys1)
MDRV_VIDEO_UPDATE(megasys1) MDRV_VIDEO_UPDATE(megasys1)
MDRV_VIDEO_EOF(megasys1)
/* sound hardware */ /* sound hardware */
MDRV_SPEAKER_STANDARD_MONO("mono") MDRV_SPEAKER_STANDARD_MONO("mono")

View File

@ -37,6 +37,7 @@ extern int megasys1_bits_per_color_code;
/* Functions */ /* Functions */
VIDEO_START( megasys1 ); VIDEO_START( megasys1 );
VIDEO_UPDATE( megasys1 ); VIDEO_UPDATE( megasys1 );
VIDEO_EOF( megasys1 );
PALETTE_INIT( megasys1 ); PALETTE_INIT( megasys1 );

View File

@ -216,6 +216,8 @@ static int hardware_type_z;
static void create_tilemaps(running_machine *machine); static void create_tilemaps(running_machine *machine);
static UINT16 *megasys1_buffer_objectram,*megasys1_buffer2_objectram,*megasys1_buffer_spriteram16,*megasys1_buffer2_spriteram16;
#ifdef MAME_DEBUG #ifdef MAME_DEBUG
@ -247,6 +249,11 @@ VIDEO_START( megasys1 )
spriteram16 = &megasys1_ram[0x8000/2]; spriteram16 = &megasys1_ram[0x8000/2];
megasys1_buffer_objectram = auto_alloc_array(machine, UINT16, 0x2000);
megasys1_buffer_spriteram16 = auto_alloc_array(machine, UINT16, 0x2000);
megasys1_buffer2_objectram = auto_alloc_array(machine, UINT16, 0x2000);
megasys1_buffer2_spriteram16 = auto_alloc_array(machine, UINT16, 0x2000);
create_tilemaps(machine); create_tilemaps(machine);
megasys1_tmap[0] = megasys1_tilemap[0][0][0]; megasys1_tmap[0] = megasys1_tilemap[0][0][0];
megasys1_tmap[1] = megasys1_tilemap[1][0][0]; megasys1_tmap[1] = megasys1_tilemap[1][0][0];
@ -587,8 +594,8 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectan
{ {
for (sprite = 0; sprite < 4 ; sprite ++) for (sprite = 0; sprite < 4 ; sprite ++)
{ {
UINT16 *objectdata = &megasys1_objectram[offs + (0x800/2) * sprite]; UINT16 *objectdata = &megasys1_buffer2_objectram[offs + (0x800/2) * sprite];
UINT16 *spritedata = &spriteram16[ (objectdata[ 0 ] & 0x7f) * 0x10/2]; UINT16 *spritedata = &megasys1_buffer2_spriteram16[ (objectdata[ 0 ] & 0x7f) * 0x10/2];
attr = spritedata[ 8/2 ]; attr = spritedata[ 8/2 ];
if (((attr & 0xc0)>>6) != sprite) continue; // flipping if (((attr & 0xc0)>>6) != sprite) continue; // flipping
@ -1020,3 +1027,16 @@ VIDEO_UPDATE( megasys1 )
draw_sprites(screen->machine,bitmap,cliprect); draw_sprites(screen->machine,bitmap,cliprect);
return 0; return 0;
} }
VIDEO_EOF( megasys1 )
{
/* Sprite are TWO frames ahead, like NMK16 HW. */
//megasys1_objectram
memcpy(megasys1_buffer2_objectram,megasys1_buffer_objectram, 0x2000);
memcpy(megasys1_buffer_objectram, megasys1_objectram, 0x2000);
//spriteram16
memcpy(megasys1_buffer2_spriteram16, megasys1_buffer_spriteram16, 0x2000);
memcpy(megasys1_buffer_spriteram16, spriteram16, 0x2000);
}