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
the same thing that we are doing (ignoring the 6295 status).
- VERY bad sprite lag in iganinju and plusalph and generally others.
Is this a sprites buffer issue ?
- Understand properly how irqs truly works, kazan / iganinju is (again) broken.
- 64street: player characters in attract mode doesn't move at all, protection
or btanb?
- Understand a handful of unknown bits in video regs
@ -1480,6 +1482,7 @@ static MACHINE_DRIVER_START( system_A )
MDRV_PALETTE_INIT(megasys1)
MDRV_VIDEO_START(megasys1)
MDRV_VIDEO_UPDATE(megasys1)
MDRV_VIDEO_EOF(megasys1)
/* sound hardware */
MDRV_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
@ -1584,6 +1587,7 @@ static MACHINE_DRIVER_START( system_D )
MDRV_PALETTE_INIT(megasys1)
MDRV_VIDEO_START(megasys1)
MDRV_VIDEO_UPDATE(megasys1)
MDRV_VIDEO_EOF(megasys1)
/* sound hardware */
MDRV_SPEAKER_STANDARD_MONO("mono")

View File

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

View File

@ -216,6 +216,8 @@ static int hardware_type_z;
static void create_tilemaps(running_machine *machine);
static UINT16 *megasys1_buffer_objectram,*megasys1_buffer2_objectram,*megasys1_buffer_spriteram16,*megasys1_buffer2_spriteram16;
#ifdef MAME_DEBUG
@ -247,6 +249,11 @@ VIDEO_START( megasys1 )
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);
megasys1_tmap[0] = megasys1_tilemap[0][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 ++)
{
UINT16 *objectdata = &megasys1_objectram[offs + (0x800/2) * sprite];
UINT16 *spritedata = &spriteram16[ (objectdata[ 0 ] & 0x7f) * 0x10/2];
UINT16 *objectdata = &megasys1_buffer2_objectram[offs + (0x800/2) * sprite];
UINT16 *spritedata = &megasys1_buffer2_spriteram16[ (objectdata[ 0 ] & 0x7f) * 0x10/2];
attr = spritedata[ 8/2 ];
if (((attr & 0xc0)>>6) != sprite) continue; // flipping
@ -1020,3 +1027,16 @@ VIDEO_UPDATE( megasys1 )
draw_sprites(screen->machine,bitmap,cliprect);
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);
}