diff options
| author | 2022-11-05 15:35:17 +0000 | |
|---|---|---|
| committer | 2022-11-05 11:35:17 -0400 | |
| commit | 7cbb49c5c77270898f58ed67238eb54014aa9a0d (patch) | |
| tree | 4bbfa9c368654a0f988566ba0301d80c7f0e2b80 | |
| parent | 1f2acab17c2505d21feb24dbc6484301d7c7cef7 (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.cpp | 48 | ||||
| -rw-r--r-- | src/mame/seta/seta.h | 3 | ||||
| -rw-r--r-- | src/mame/seta/x1_012.cpp | 3 | ||||
| -rw-r--r-- | src/mame/seta/x1_012.h | 4 |
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]; |
