diff options
author | 2017-08-29 11:05:22 +0200 | |
---|---|---|
committer | 2017-08-29 11:05:22 +0200 | |
commit | d3ce43f6a89becec050b81f47edd25c48d77b420 (patch) | |
tree | 4dcd04d837100f8a1e0d258cab02b714e5f4ea48 | |
parent | 3a9849a5b3006743bf1d3eaa974749a0248a1261 (diff) |
gstriker.cpp: added buffered spriteram (sprites being ahead 2 frames) [Angelo Salese]
-rw-r--r-- | src/mame/drivers/gstriker.cpp | 9 | ||||
-rw-r--r-- | src/mame/includes/gstriker.h | 3 | ||||
-rw-r--r-- | src/mame/video/gstriker.cpp | 23 | ||||
-rw-r--r-- | src/mame/video/mb60553.cpp | 1 |
4 files changed, 28 insertions, 8 deletions
diff --git a/src/mame/drivers/gstriker.cpp b/src/mame/drivers/gstriker.cpp index 3bbbd4ce5f5..6d2ec18d539 100644 --- a/src/mame/drivers/gstriker.cpp +++ b/src/mame/drivers/gstriker.cpp @@ -502,6 +502,7 @@ static MACHINE_CONFIG_START( gstriker ) MCFG_SCREEN_SIZE(64*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 28*8-1) MCFG_SCREEN_UPDATE_DRIVER(gstriker_state, screen_update) + MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(gstriker_state, screen_vblank)) MCFG_SCREEN_PALETTE("palette") MCFG_GFXDECODE_ADD("gfxdecode", "palette", gstriker) @@ -1021,7 +1022,7 @@ GAME( 1993, gstrikerj, gstriker, gstriker, gstriker, gstriker_state, 0, R /* Similar, but not identical hardware, appear to be protected by an MCU :-( */ -GAME( 1994, vgoalsoc, 0, vgoal, vgoalsoc, gstriker_state, vgoalsoc, ROT0, "Tecmo", "V Goal Soccer (Europe)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // has ger/hol/arg/bra/ita/eng/spa/fra -GAME( 1994, vgoalsca, vgoalsoc, vgoal, vgoalsoc, gstriker_state, vgoalsoc, ROT0, "Tecmo", "V Goal Soccer (US/Japan/Korea)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // has ger/hol/arg/bra/ita/kor/usa/jpn -GAME( 1994, twcup94, 0, twc94, twcup94, gstriker_state, twcup94, ROT0, "Tecmo", "Tecmo World Cup '94 (set 1)", MACHINE_NOT_WORKING | MACHINE_UNEMULATED_PROTECTION | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) -GAME( 1994, twcup94a,twcup94, twc94, twcup94, gstriker_state, twcup94a, ROT0, "Tecmo", "Tecmo World Cup '94 (set 2)", MACHINE_NOT_WORKING | MACHINE_UNEMULATED_PROTECTION | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) +GAME( 1994, vgoalsoc, 0, vgoal, vgoalsoc, gstriker_state, vgoalsoc, ROT0, "Tecmo", "V Goal Soccer (Europe)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // has ger/hol/arg/bra/ita/eng/spa/fra +GAME( 1994, vgoalsca, vgoalsoc, vgoal, vgoalsoc, gstriker_state, vgoalsoc, ROT0, "Tecmo", "V Goal Soccer (US/Japan/Korea)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // has ger/hol/arg/bra/ita/kor/usa/jpn +GAME( 1994, twcup94, 0, twc94, twcup94, gstriker_state, twcup94, ROT0, "Tecmo", "Tecmo World Cup '94 (set 1)", MACHINE_NOT_WORKING | MACHINE_UNEMULATED_PROTECTION | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) +GAME( 1994, twcup94a,twcup94, twc94, twcup94, gstriker_state, twcup94a, ROT0, "Tecmo", "Tecmo World Cup '94 (set 2)", MACHINE_NOT_WORKING | MACHINE_UNEMULATED_PROTECTION | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/includes/gstriker.h b/src/mame/includes/gstriker.h index 15fc37ff323..012913007fd 100644 --- a/src/mame/includes/gstriker.h +++ b/src/mame/includes/gstriker.h @@ -46,6 +46,8 @@ public: required_device<mb3773_device> m_watchdog; required_shared_ptr<uint16_t> m_CG10103_m_vram; + std::unique_ptr<uint16_t[]> m_buffered_spriteram; + std::unique_ptr<uint16_t[]> m_buffered_spriteram2; required_shared_ptr<uint16_t> m_work_ram; required_shared_ptr<uint16_t> m_mixerregs1; required_shared_ptr<uint16_t> m_mixerregs2; @@ -76,6 +78,7 @@ public: DECLARE_DRIVER_INIT(twcup94); uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + DECLARE_WRITE_LINE_MEMBER(screen_vblank); void mcu_init(); }; diff --git a/src/mame/video/gstriker.cpp b/src/mame/video/gstriker.cpp index 7a213a28d70..ccd683d3024 100644 --- a/src/mame/video/gstriker.cpp +++ b/src/mame/video/gstriker.cpp @@ -14,6 +14,22 @@ void gstriker_state::video_start() // Initialize the chip for the screen plane m_bg->set_transparent_pen(0xf); + + m_buffered_spriteram = std::make_unique<uint16_t[]>(0x2000); + m_buffered_spriteram2 = std::make_unique<uint16_t[]>(0x2000); + save_pointer(NAME(m_buffered_spriteram.get()), 0x2000); + save_pointer(NAME(m_buffered_spriteram2.get()), 0x2000); +} + +WRITE_LINE_MEMBER(gstriker_state::screen_vblank) +{ + // sprites are two frames ahead + // TODO: probably all Video System games are (Aero Fighters definitely desyncs wrt background) + if(state) + { + memcpy(m_buffered_spriteram.get(), m_CG10103_m_vram, 0x2000); + memcpy(m_buffered_spriteram2.get(), m_buffered_spriteram.get(), 0x2000); + } } @@ -29,15 +45,14 @@ uint32_t gstriker_state::screen_update(screen_device &screen, bitmap_ind16 &bitm m_tx->set_pal_base( (m_mixerregs1[2]&0xf000)>>8 ); - // Sandwitched screen/sprite0/score/sprite1. Surely wrong, probably - // needs sprite orthogonality + // Sandwitched screen/sprite0/score/sprite1. Surely wrong, probably needs sprite orthogonality m_bg->draw( screen, bitmap,cliprect, 0); - m_spr->draw_sprites(m_CG10103_m_vram, 0x2000, screen, bitmap, cliprect, 0x2, 0x0); + m_spr->draw_sprites(m_buffered_spriteram2.get(), 0x2000, screen, bitmap, cliprect, 0x2, 0x0); m_tx->draw(screen, bitmap, cliprect, 0); - m_spr->draw_sprites(m_CG10103_m_vram, 0x2000, screen, bitmap, cliprect, 0x2, 0x2); + m_spr->draw_sprites(m_buffered_spriteram2.get(), 0x2000, screen, bitmap, cliprect, 0x2, 0x2); return 0; } diff --git a/src/mame/video/mb60553.cpp b/src/mame/video/mb60553.cpp index f9510d7c470..e23c386ad34 100644 --- a/src/mame/video/mb60553.cpp +++ b/src/mame/video/mb60553.cpp @@ -279,6 +279,7 @@ void mb60553_zooming_tilemap_device::draw( screen_device &screen, bitmap_ind16& incxx = m_lineram[(line)*8+0]<<4; // startx has an offset based off current x zoom value // This is confirmed by Tecmo World Cup '94 startx being 0xff40 (-192) when showing footballer pics on attract mode (incxx is 0x800) + // TODO: slightly offset? xoffset = (float)incxx/(float)0x10000 * 384.0; startx = m_regs[0] + (uint32_t)xoffset; |