summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author David Haywood <28625134+DavidHaywood@users.noreply.github.com>2022-11-05 15:35:17 +0000
committer GitHub <noreply@github.com>2022-11-05 11:35:17 -0400
commit7cbb49c5c77270898f58ed67238eb54014aa9a0d (patch)
tree4bbfa9c368654a0f988566ba0301d80c7f0e2b80
parent1f2acab17c2505d21feb24dbc6484301d7c7cef7 (diff)
x1_012: force a partial update for tilemaps whenever the scroll registers change - needed for a crude raster effect when entering underground areas on Caliber 50 (#10506)
-rw-r--r--src/mame/seta/seta.cpp48
-rw-r--r--src/mame/seta/seta.h3
-rw-r--r--src/mame/seta/x1_012.cpp3
-rw-r--r--src/mame/seta/x1_012.h4
4 files changed, 58 insertions, 0 deletions
diff --git a/src/mame/seta/seta.cpp b/src/mame/seta/seta.cpp
index 2d99b3f0d0c..600bbd0d488 100644
--- a/src/mame/seta/seta.cpp
+++ b/src/mame/seta/seta.cpp
@@ -7967,6 +7967,7 @@ void downtown_state::twineagl(machine_config &config)
screen.set_palette(m_palette);
X1_012(config, m_layers[0], m_palette, gfx_downtown);
+ m_layers[0]->set_screen(m_screen);
m_layers[0]->set_tile_offset_callback(FUNC(downtown_state::twineagl_tile_offset));
m_layers[0]->set_xoffsets(-3, 0);
@@ -8017,6 +8018,7 @@ void downtown_state::downtown(machine_config &config)
screen.set_palette(m_palette);
X1_012(config, m_layers[0], m_palette, gfx_downtown);
+ m_layers[0]->set_screen(m_screen);
m_layers[0]->set_tile_offset_callback(FUNC(downtown_state::twineagl_tile_offset));
m_layers[0]->set_xoffsets(0, -1);
@@ -8107,6 +8109,7 @@ void usclssic_state::usclssic(machine_config &config)
screen.set_palette(m_palette);
X1_012(config, m_layers[0], m_palette, gfx_usclssic);
+ m_layers[0]->set_screen(m_screen);
m_layers[0]->set_tile_offset_callback(FUNC(usclssic_state::tile_offset));
m_layers[0]->set_xoffsets(-1, 0);
@@ -8171,6 +8174,7 @@ void downtown_state::calibr50(machine_config &config)
screen.set_palette(m_palette);
X1_012(config, m_layers[0], m_palette, gfx_downtown);
+ m_layers[0]->set_screen(m_screen);
m_layers[0]->set_xoffsets(-2, -3);
PALETTE(config, m_palette).set_entries(512);
@@ -8223,6 +8227,7 @@ void downtown_state::metafox(machine_config &config)
screen.set_palette(m_palette);
X1_012(config, m_layers[0], m_palette, gfx_downtown);
+ m_layers[0]->set_screen(m_screen);
m_layers[0]->set_tile_offset_callback(FUNC(downtown_state::twineagl_tile_offset));
m_layers[0]->set_xoffsets(-19, 16);
@@ -8320,7 +8325,9 @@ void seta_state::blandia(machine_config &config)
screen.set_palette(m_palette);
X1_012(config, m_layers[0], m_palette, gfx_blandia_layer1).set_xoffsets(6, -2);
+ m_layers[0]->set_screen(m_screen);
X1_012(config, m_layers[1], m_palette, gfx_blandia_layer2).set_xoffsets(6, -2);
+ m_layers[1]->set_screen(m_screen);
PALETTE(config, m_palette, FUNC(seta_state::blandia_palette), (16*32 + 64*32*4)*2, 0x600*2); // sprites, layer1, layer2, palette effect - layers 1&2 are 6 planes deep
/* sound hardware */
@@ -8357,7 +8364,9 @@ void seta_state::blandiap(machine_config &config)
screen.set_palette(m_palette);
X1_012(config, m_layers[0], m_palette, gfx_blandia_layer1).set_xoffsets(6, -2);
+ m_layers[0]->set_screen(m_screen);
X1_012(config, m_layers[1], m_palette, gfx_blandia_layer2).set_xoffsets(6, -2);
+ m_layers[1]->set_screen(m_screen);
PALETTE(config, m_palette, FUNC(seta_state::blandia_palette), (16*32 + 64*32*4)*2, 0x600*2); // sprites, layer1, layer2, palette effect - layers 1&2 are 6 planes deep
/* sound hardware */
@@ -8471,7 +8480,9 @@ void seta_state::daioh(machine_config &config)
screen.set_palette(m_palette);
X1_012(config, m_layers[0], m_palette, gfx_msgundam_layer1).set_xoffsets(-2, -2);
+ m_layers[0]->set_screen(m_screen);
X1_012(config, m_layers[1], m_palette, gfx_msgundam_layer2).set_xoffsets(-2, -2);
+ m_layers[1]->set_screen(m_screen);
PALETTE(config, m_palette).set_entries(512 * 3); // sprites, layer1, layer2
/* sound hardware */
@@ -8529,6 +8540,7 @@ void seta_state::drgnunit(machine_config &config)
screen.set_palette(m_palette);
X1_012(config, m_layers[0], m_palette, gfx_downtown).set_xoffsets(-2, -2);
+ m_layers[0]->set_screen(m_screen);
PALETTE(config, m_palette).set_entries(512);
/* sound hardware */
@@ -8616,6 +8628,7 @@ void setaroul_state::setaroul(machine_config &config)
screen.set_palette(m_palette);
X1_012(config, m_layers[0], m_palette, gfx_setaroul).set_xoffsets(0, 5);
+ m_layers[0]->set_screen(m_screen);
PALETTE(config, m_palette, FUNC(setaroul_state::setaroul_palette), 512);
/* sound hardware */
@@ -8660,7 +8673,9 @@ void seta_state::eightfrc(machine_config &config)
screen.set_palette(m_palette);
X1_012(config, m_layers[0], m_palette, gfx_msgundam_layer1);
+ m_layers[0]->set_screen(m_screen);
X1_012(config, m_layers[1], m_palette, gfx_msgundam_layer2);
+ m_layers[1]->set_screen(m_screen);
PALETTE(config, m_palette).set_entries(512 * 3); // sprites, layer1, layer2
/* sound hardware */
@@ -8708,7 +8723,9 @@ void seta_state::extdwnhl(machine_config &config)
screen.set_palette(m_palette);
X1_012(config, m_layers[0], m_palette, gfx_zingzip_layer1).set_xoffsets(-2, -2);
+ m_layers[0]->set_screen(m_screen);
X1_012(config, m_layers[1], m_palette, gfx_zingzip_layer2).set_xoffsets(-2, -2);
+ m_layers[1]->set_screen(m_screen);
PALETTE(config, m_palette, FUNC(seta_state::zingzip_palette), 16*32 + 16*32 + 64*32*2, 0x600); // sprites, layer2, layer1 - layer 1 gfx is 6 planes deep
/* sound hardware */
@@ -8775,7 +8792,9 @@ void seta_state::gundhara(machine_config &config)
screen.set_palette(m_palette);
X1_012(config, m_layers[0], m_palette, gfx_jjsquawk_layer1);
+ m_layers[0]->set_screen(m_screen);
X1_012(config, m_layers[1], m_palette, gfx_jjsquawk_layer2);
+ m_layers[1]->set_screen(m_screen);
PALETTE(config, m_palette, FUNC(seta_state::gundhara_palette), 16*32 + 64*32*4, 0x600); // sprites, layer2, layer1 - layers are 6 planes deep (seta_state,but have only 4 palettes)
/* sound hardware */
@@ -8850,7 +8869,9 @@ void seta_state::jjsquawk(machine_config &config)
screen.set_palette(m_palette);
X1_012(config, m_layers[0], m_palette, gfx_jjsquawk_layer1).set_xoffsets(-1, -1);
+ m_layers[0]->set_screen(m_screen);
X1_012(config, m_layers[1], m_palette, gfx_jjsquawk_layer2).set_xoffsets(-1, -1);
+ m_layers[1]->set_screen(m_screen);
PALETTE(config, m_palette, FUNC(seta_state::jjsquawk_palette), 16*32 + 64*32*4, 0x600); // sprites, layer2, layer1 - layers are 6 planes deep
/* sound hardware */
@@ -8884,7 +8905,9 @@ void seta_state::jjsquawb(machine_config &config)
screen.set_palette(m_palette);
X1_012(config, m_layers[0], m_palette, gfx_jjsquawkb_layer1).set_xoffsets(-1, -1);
+ m_layers[0]->set_screen(m_screen);
X1_012(config, m_layers[1], m_palette, gfx_jjsquawkb_layer2).set_xoffsets(-1, -1);
+ m_layers[1]->set_screen(m_screen);
PALETTE(config, m_palette, FUNC(seta_state::jjsquawk_palette), 16*32 + 64*32*4, 0x600); // sprites, layer2, layer1 - layers are 6 planes deep
/* sound hardware */
@@ -8930,7 +8953,9 @@ void seta_state::kamenrid(machine_config &config)
screen.set_palette(m_palette);
X1_012(config, m_layers[0], m_palette, gfx_msgundam_layer1).set_xoffsets(-2, -2);
+ m_layers[0]->set_screen(m_screen);
X1_012(config, m_layers[1], m_palette, gfx_msgundam_layer2).set_xoffsets(-2, -2);
+ m_layers[1]->set_screen(m_screen);
PALETTE(config, m_palette).set_entries(512 * 3); // sprites, layer1, layer2
/* sound hardware */
@@ -9101,7 +9126,9 @@ void seta_state::madshark(machine_config &config)
screen.set_palette(m_palette);
X1_012(config, m_layers[0], m_palette, gfx_jjsquawk_layer1);
+ m_layers[0]->set_screen(m_screen);
X1_012(config, m_layers[1], m_palette, gfx_jjsquawk_layer2);
+ m_layers[1]->set_screen(m_screen);
PALETTE(config, m_palette, FUNC(seta_state::jjsquawk_palette), 16*32 + 64*32*4, 0x600); // sprites, layer2, layer1 - layers are 6 planes deep
/* sound hardware */
@@ -9135,7 +9162,9 @@ void seta_state::madsharkbl(machine_config &config) // bootleg doesn't actually
screen.set_palette(m_palette);
X1_012(config, m_layers[0], m_palette, gfx_jjsquawk_layer1);
+ m_layers[0]->set_screen(m_screen);
X1_012(config, m_layers[1], m_palette, gfx_jjsquawk_layer2);
+ m_layers[1]->set_screen(m_screen);
PALETTE(config, m_palette, FUNC(seta_state::jjsquawk_palette), 16*32 + 64*32*4, 0x600); // sprites, layer2, layer1 - layers are 6 planes deep
/* sound hardware */
@@ -9190,7 +9219,9 @@ void magspeed_state::magspeed(machine_config &config)
screen.set_palette(m_palette);
X1_012(config, m_layers[0], m_palette, gfx_msgundam_layer1).set_xoffsets(0, -2);
+ m_layers[0]->set_screen(m_screen);
X1_012(config, m_layers[1], m_palette, gfx_msgundam_layer2).set_xoffsets(0, -2);
+ m_layers[1]->set_screen(m_screen);
PALETTE(config, m_palette).set_entries(512 * 3); // sprites, layer1, layer2
/* sound hardware */
@@ -9236,7 +9267,9 @@ void seta_state::msgundam(machine_config &config)
screen.set_palette(m_palette);
X1_012(config, m_layers[0], m_palette, gfx_msgundam_layer1).set_xoffsets(-2, -2);
+ m_layers[0]->set_screen(m_screen);
X1_012(config, m_layers[1], m_palette, gfx_msgundam_layer2).set_xoffsets(-2, -2);
+ m_layers[1]->set_screen(m_screen);
PALETTE(config, m_palette).set_entries(512 * 3); // sprites, layer1, layer2
/* sound hardware */
@@ -9281,7 +9314,9 @@ void seta_state::oisipuzl(machine_config &config)
screen.set_palette(m_palette);
X1_012(config, m_layers[0], m_palette, gfx_msgundam_layer1).set_xoffsets(-1, -1);
+ m_layers[0]->set_screen(m_screen);
X1_012(config, m_layers[1], m_palette, gfx_msgundam_layer2).set_xoffsets(-1, -1);
+ m_layers[1]->set_screen(m_screen);
PALETTE(config, m_palette).set_entries(512 * 3); // sprites, layer1, layer2
set_tilemaps_flip(1); // flip is inverted for the tilemaps
@@ -9326,7 +9361,9 @@ void seta_state::triplfun(machine_config &config)
screen.set_palette(m_palette);
X1_012(config, m_layers[0], m_palette, gfx_msgundam_layer1).set_xoffsets(-1, -1);
+ m_layers[0]->set_screen(m_screen);
X1_012(config, m_layers[1], m_palette, gfx_msgundam_layer2).set_xoffsets(-1, -1);
+ m_layers[1]->set_screen(m_screen);
PALETTE(config, m_palette).set_entries(512 * 3); // sprites, layer1, layer2
set_tilemaps_flip(1); // flip is inverted for the tilemaps
@@ -9373,7 +9410,9 @@ void seta_state::rezon(machine_config &config)
screen.set_palette(m_palette);
X1_012(config, m_layers[0], m_palette, gfx_msgundam_layer1).set_xoffsets(-2, -2);
+ m_layers[0]->set_screen(m_screen);
X1_012(config, m_layers[1], m_palette, gfx_msgundam_layer2).set_xoffsets(-2, -2);
+ m_layers[1]->set_screen(m_screen);
PALETTE(config, m_palette).set_entries(512 * 3); // sprites, layer1, layer2
/* sound hardware */
@@ -9612,7 +9651,9 @@ void seta_state::utoukond(machine_config &config)
screen.set_palette(m_palette);
X1_012(config, m_layers[0], m_palette, gfx_msgundam_layer1).set_xoffsets(0, -2);
+ m_layers[0]->set_screen(m_screen);
X1_012(config, m_layers[1], m_palette, gfx_msgundam_layer2).set_xoffsets(0, -2);
+ m_layers[1]->set_screen(m_screen);
PALETTE(config, m_palette).set_entries(512 * 3); // sprites, layer1, layer2
/* sound hardware */
@@ -9672,7 +9713,9 @@ void seta_state::wrofaero(machine_config &config)
screen.set_palette(m_palette);
X1_012(config, m_layers[0], m_palette, gfx_msgundam_layer1);
+ m_layers[0]->set_screen(m_screen);
X1_012(config, m_layers[1], m_palette, gfx_msgundam_layer2);
+ m_layers[1]->set_screen(m_screen);
PALETTE(config, m_palette).set_entries(512 * 3); // sprites, layer1, layer2
/* sound hardware */
@@ -9718,7 +9761,9 @@ void seta_state::zingzip(machine_config &config)
screen.set_palette(m_palette);
X1_012(config, m_layers[0], m_palette, gfx_zingzip_layer1).set_xoffsets(-2, -1);
+ m_layers[0]->set_screen(m_screen);
X1_012(config, m_layers[1], m_palette, gfx_zingzip_layer2).set_xoffsets(-2, -1);
+ m_layers[1]->set_screen(m_screen);
PALETTE(config, m_palette, FUNC(seta_state::zingzip_palette), 16*32 + 16*32 + 64*32*2, 0x600); // sprites, layer2, layer1 - layer 1 gfx is 6 planes deep
/* sound hardware */
@@ -9811,7 +9856,9 @@ void seta_state::crazyfgt(machine_config &config)
screen.set_palette(m_palette);
X1_012(config, m_layers[0], m_palette, gfx_blandia_layer1).set_xoffsets(0, -2);
+ m_layers[0]->set_screen(m_screen);
X1_012(config, m_layers[1], m_palette, gfx_blandia_layer2).set_xoffsets(0, -2);
+ m_layers[1]->set_screen(m_screen);
PALETTE(config, m_palette, FUNC(seta_state::gundhara_palette), 16*32 + 64*32*4, 0x600); // sprites, layer2, layer1 - layers are 6 planes deep (seta_state,but have only 4 palettes)
/* sound hardware */
@@ -9892,6 +9939,7 @@ void jockeyc_state::jockeyc(machine_config &config)
screen.set_palette(m_palette);
X1_012(config, m_layers[0], m_palette, gfx_downtown).set_xoffsets(126, -2);
+ m_layers[0]->set_screen(m_screen);
PALETTE(config, m_palette, FUNC(seta_state::palette_init_RRRRRGGGGGBBBBB_proms), 512 * 1);
/* sound hardware */
diff --git a/src/mame/seta/seta.h b/src/mame/seta/seta.h
index ee2a07c862f..71602b157ed 100644
--- a/src/mame/seta/seta.h
+++ b/src/mame/seta/seta.h
@@ -23,6 +23,7 @@
#include "video/x1_001.h"
#include "x1_012.h"
#include "emupal.h"
+#include "screen.h"
#include "tilemap.h"
@@ -41,6 +42,7 @@ public:
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_audiocpu(*this, "audiocpu"),
+ m_screen(*this, "screen"),
m_spritegen(*this, "spritegen"),
m_layers(*this, "layer%u", 1U),
m_x1snd(*this, "x1snd"),
@@ -112,6 +114,7 @@ protected:
required_device<cpu_device> m_maincpu;
optional_device<cpu_device> m_audiocpu;
+ required_device<screen_device> m_screen;
required_device<x1_001_device> m_spritegen;
optional_device_array<x1_012_device, 2> m_layers;
optional_device<x1_010_device> m_x1snd;
diff --git a/src/mame/seta/x1_012.cpp b/src/mame/seta/x1_012.cpp
index 9e4a3a85456..2b5cf871c51 100644
--- a/src/mame/seta/x1_012.cpp
+++ b/src/mame/seta/x1_012.cpp
@@ -20,6 +20,7 @@ x1_012_device::x1_012_device(const machine_config &mconfig, const char *tag, dev
, device_gfx_interface(mconfig, *this)
, m_tile_offset_callback(*this)
, m_vram(*this, DEVICE_SELF)
+ , m_screen(*this, finder_base::DUMMY_TAG)
, m_tilemap(nullptr)
, m_xoffsets{0, 0}
, m_rambank(0)
@@ -77,6 +78,8 @@ u16 x1_012_device::vctrl_r(offs_t offset, u16 mem_mask)
void x1_012_device::vctrl_w(offs_t offset, u16 data, u16 mem_mask)
{
+ m_screen->update_partial(m_screen->vpos()); // needed for calibr50 effect when entering underground area
+
// Select tilemap bank. Only one tilemap bank per layer is enabled.
if (offset == 2 && ACCESSING_BITS_0_7)
{
diff --git a/src/mame/seta/x1_012.h b/src/mame/seta/x1_012.h
index 3ac9bfc9501..cf10fdd190e 100644
--- a/src/mame/seta/x1_012.h
+++ b/src/mame/seta/x1_012.h
@@ -5,6 +5,7 @@
#pragma once
+#include "screen.h"
#include "tilemap.h"
class x1_012_device : public device_t, public device_gfx_interface
@@ -20,6 +21,7 @@ public:
// configuration
template <typename... T> void set_tile_offset_callback(T &&... args) { m_tile_offset_callback.set(std::forward<T>(args)...); }
+ template <typename T> void set_screen(T &&tag) { m_screen.set_tag(std::forward<T>(tag)); }
void set_xoffsets(int flip, int noflip) { m_xoffsets[1] = flip; m_xoffsets[0] = noflip; }
void vram_w(offs_t offset, u16 data, u16 mem_mask = 0xffff);
@@ -46,6 +48,8 @@ private:
required_shared_ptr<u16> m_vram;
+ required_device<screen_device> m_screen;
+
tilemap_t *m_tilemap;
int m_xoffsets[2];