summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author angelosa <salese_corp_ltd@email.it>2017-08-29 11:05:22 +0200
committer angelosa <salese_corp_ltd@email.it>2017-08-29 11:05:22 +0200
commitd3ce43f6a89becec050b81f47edd25c48d77b420 (patch)
tree4dcd04d837100f8a1e0d258cab02b714e5f4ea48
parent3a9849a5b3006743bf1d3eaa974749a0248a1261 (diff)
gstriker.cpp: added buffered spriteram (sprites being ahead 2 frames) [Angelo Salese]
-rw-r--r--src/mame/drivers/gstriker.cpp9
-rw-r--r--src/mame/includes/gstriker.h3
-rw-r--r--src/mame/video/gstriker.cpp23
-rw-r--r--src/mame/video/mb60553.cpp1
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;