From 806b86ebb7ab018e6e9e699ebabeb3348d130331 Mon Sep 17 00:00:00 2001 From: cam900 Date: Wed, 15 Oct 2025 17:13:45 +0900 Subject: [PATCH 1/2] seibu/seibucats.cpp, seibu/seibuspi.cpp: Fix regression since 3bc4210656939f870e68f95e1990345571383150 seibuspi_base_state::video_start() contains needs-to-initialized variables, and should be called after initialization routine in each child video_start() functions. seibu/seibuspi.cpp: Add notes --- src/mame/seibu/seibucats.cpp | 4 ++-- src/mame/seibu/seibuspi.cpp | 2 +- src/mame/seibu/seibuspi_v.cpp | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/mame/seibu/seibucats.cpp b/src/mame/seibu/seibucats.cpp index f1840a6ecbb98..fc294195a2498 100644 --- a/src/mame/seibu/seibucats.cpp +++ b/src/mame/seibu/seibucats.cpp @@ -122,8 +122,6 @@ class seibucats_state : public seibuspi_base_state void seibucats_state::video_start() { - seibuspi_base_state::video_start(); - m_video_dma_length = 0; m_video_dma_address = 0; m_layer_enable = 0; @@ -138,6 +136,8 @@ void seibucats_state::video_start() m_palette->basemem().set(&m_palette_ram[0], m_palette_ram_size, 32, ENDIANNESS_LITTLE, 2); memset(m_alpha_table, 0, 0x2000); // TODO : no alpha blending? + + seibuspi_base_state::video_start(); } // identical to EJ Sakura diff --git a/src/mame/seibu/seibuspi.cpp b/src/mame/seibu/seibuspi.cpp index 54735ca5bc845..f818a85c47194 100644 --- a/src/mame/seibu/seibuspi.cpp +++ b/src/mame/seibu/seibuspi.cpp @@ -63,7 +63,7 @@ * data in transparent pen? nope * color bit 15? nope * writes to $100/104/108 might be interesting... -- not sure if layer priorities are completely right +- not sure if layer priorities are completely right - it's maybe differs per game? */ diff --git a/src/mame/seibu/seibuspi_v.cpp b/src/mame/seibu/seibuspi_v.cpp index 93aea91ef85d8..59fdb3a9a6b9c 100644 --- a/src/mame/seibu/seibuspi_v.cpp +++ b/src/mame/seibu/seibuspi_v.cpp @@ -713,8 +713,6 @@ void seibuspi_base_state::video_start() void seibuspi_tilemap_state::video_start() { - seibuspi_base_state::video_start(); - m_video_dma_length = 0; m_video_dma_address = 0; m_layer_enable = 0; @@ -797,6 +795,8 @@ void seibuspi_tilemap_state::video_start() save_item(NAME(m_fore_layer_d14)); save_pointer(NAME(m_tilemap_ram), m_tilemap_ram_size/4); + + seibuspi_base_state::video_start(); } VIDEO_START_MEMBER(seibuspi_state,ejanhs) @@ -808,8 +808,6 @@ VIDEO_START_MEMBER(seibuspi_state,ejanhs) void sys386f_state::video_start() { - seibuspi_base_state::video_start(); - m_video_dma_length = 0; m_video_dma_address = 0; m_layer_enable = 0; @@ -824,4 +822,6 @@ void sys386f_state::video_start() m_palette->basemem().set(&m_palette_ram[0], m_palette_ram_size, 32, ENDIANNESS_LITTLE, 2); memset(m_alpha_table, 0, 0x2000); // no alpha blending + + seibuspi_base_state::video_start(); } From f26bf0ff65ba09435d310dfc53f63fd0fb56f716 Mon Sep 17 00:00:00 2001 From: cam900 Date: Thu, 16 Oct 2025 18:40:38 +0900 Subject: [PATCH 2/2] seibu/seibuspi.cpp: Move RAM size and sprite BPP config into initializer --- src/mame/seibu/seibucats.cpp | 15 ++++-------- src/mame/seibu/seibuspi.h | 24 +++++++++++-------- src/mame/seibu/seibuspi_v.cpp | 44 +++++++++++------------------------ 3 files changed, 31 insertions(+), 52 deletions(-) diff --git a/src/mame/seibu/seibucats.cpp b/src/mame/seibu/seibucats.cpp index fc294195a2498..cac9bea14cfa9 100644 --- a/src/mame/seibu/seibucats.cpp +++ b/src/mame/seibu/seibucats.cpp @@ -87,7 +87,7 @@ class seibucats_state : public seibuspi_base_state { public: seibucats_state(const machine_config &mconfig, device_type type, const char *tag) - : seibuspi_base_state(mconfig, type, tag) + : seibuspi_base_state(mconfig, type, tag, 0x4000, 0x2000, 6) // see above - RAM size is correct? // m_key(*this, "KEY%u", 0) { } @@ -122,22 +122,15 @@ class seibucats_state : public seibuspi_base_state void seibucats_state::video_start() { + seibuspi_base_state::video_start(); + m_video_dma_length = 0; m_video_dma_address = 0; m_layer_enable = 0; - m_palette_ram_size = 0x4000; // TODO : correct? - m_sprite_ram_size = 0x2000; // TODO : correct? - m_sprite_bpp = 6; // see above - - m_palette_ram = make_unique_clear(m_palette_ram_size/4); - m_sprite_ram = make_unique_clear(m_sprite_ram_size/4); - - m_palette->basemem().set(&m_palette_ram[0], m_palette_ram_size, 32, ENDIANNESS_LITTLE, 2); + m_palette->basemem().set(&m_palette_ram[0], m_palette_ram.bytes(), 32, ENDIANNESS_LITTLE, 2); memset(m_alpha_table, 0, 0x2000); // TODO : no alpha blending? - - seibuspi_base_state::video_start(); } // identical to EJ Sakura diff --git a/src/mame/seibu/seibuspi.h b/src/mame/seibu/seibuspi.h index be01407551e10..6f02de11daf0b 100644 --- a/src/mame/seibu/seibuspi.h +++ b/src/mame/seibu/seibuspi.h @@ -23,15 +23,18 @@ class seibuspi_base_state : public driver_device { protected: - seibuspi_base_state(const machine_config &mconfig, device_type type, const char *tag) + seibuspi_base_state(const machine_config &mconfig, device_type type, const char *tag, size_t paletteram_size, size_t spriteram_size, u32 sprite_bpp) : driver_device(mconfig, type, tag) , m_maincpu(*this, "maincpu") , m_mainram(*this, "mainram") , m_eeprom(*this, "eeprom") , m_gfxdecode(*this, "gfxdecode") , m_palette(*this, "palette") + , m_palette_ram(*this, "palette_ram", paletteram_size, ENDIANNESS_LITTLE) + , m_sprite_ram(*this, "sprite_ram", spriteram_size, ENDIANNESS_LITTLE) , m_key(*this, "KEY%u", 0) , m_special(*this, "SPECIAL") + , m_sprite_bpp(sprite_bpp) { } required_device m_maincpu; @@ -40,18 +43,18 @@ class seibuspi_base_state : public driver_device required_device m_gfxdecode; required_device m_palette; + memory_share_creator m_palette_ram; + memory_share_creator m_sprite_ram; + optional_ioport_array<5> m_key; optional_ioport m_special; + const u32 m_sprite_bpp; + u32 m_video_dma_length = 0; u32 m_video_dma_address = 0; u16 m_layer_enable = 0; - std::unique_ptr m_palette_ram; - std::unique_ptr m_sprite_ram; - u32 m_palette_ram_size = 0; - u32 m_sprite_ram_size = 0; u8 m_alpha_table[0x2000]{}; - u32 m_sprite_bpp = 0; virtual void video_start() override ATTR_COLD; @@ -78,7 +81,7 @@ class sys386f_state : public seibuspi_base_state { public: sys386f_state(const machine_config &mconfig, device_type type, const char *tag) - : seibuspi_base_state(mconfig, type, tag) + : seibuspi_base_state(mconfig, type, tag, 0x4000, 0x2000, 8) { } void sys386f(machine_config &config) ATTR_COLD; @@ -103,13 +106,16 @@ class seibuspi_tilemap_state : public seibuspi_base_state { public: seibuspi_tilemap_state(const machine_config &mconfig, device_type type, const char *tag) - : seibuspi_base_state(mconfig, type, tag) + : seibuspi_base_state(mconfig, type, tag, 0x3000, 0x1000, 6) + , m_tilemap_ram(*this, "tilemap_ram", 0x4000, ENDIANNESS_LITTLE) { } void init_rdft22kc() ATTR_COLD; void init_rfjet2kc() ATTR_COLD; protected: + memory_share_creator m_tilemap_ram; + tilemap_t *m_text_layer = nullptr; tilemap_t *m_back_layer = nullptr; tilemap_t *m_midl_layer = nullptr; @@ -125,8 +131,6 @@ class seibuspi_tilemap_state : public seibuspi_base_state u32 m_back_layer_d14 = 0; u32 m_midl_layer_d14 = 0; u32 m_fore_layer_d14 = 0; - std::unique_ptr m_tilemap_ram; - u32 m_tilemap_ram_size = 0; u32 m_bg_fore_layer_position = 0; virtual void video_start() override ATTR_COLD; diff --git a/src/mame/seibu/seibuspi_v.cpp b/src/mame/seibu/seibuspi_v.cpp index 59fdb3a9a6b9c..b8ab8fd9f98a1 100644 --- a/src/mame/seibu/seibuspi_v.cpp +++ b/src/mame/seibu/seibuspi_v.cpp @@ -326,10 +326,11 @@ void seibuspi_tilemap_state::tilemap_dma_start_w(u32 data) void seibuspi_base_state::palette_dma_start_w(u32 data) { + const size_t palette_ram_size = m_palette_ram.bytes(); const int dma_length = (m_video_dma_length + 1) * 2; // safety check - if (!DWORD_ALIGNED(m_video_dma_address) || (m_video_dma_length & 3) != 3 || dma_length > m_palette_ram_size || (m_video_dma_address + dma_length) > 0x40000) + if (!DWORD_ALIGNED(m_video_dma_address) || (m_video_dma_length & 3) != 3 || dma_length > palette_ram_size || (m_video_dma_address + dma_length) > 0x40000) popmessage("Pal DMA %X %X, contact MAMEdev", m_video_dma_address, m_video_dma_length); // shouldn't happen if (m_video_dma_address < 0x800) logerror("palette_dma_start_w in I/O area: %X\n", m_video_dma_address); @@ -349,13 +350,14 @@ void seibuspi_base_state::palette_dma_start_w(u32 data) void seibuspi_base_state::sprite_dma_start_w(u16 data) { + const size_t sprite_ram_size = m_sprite_ram.bytes(); // safety check - if (!DWORD_ALIGNED(m_video_dma_address) || (m_video_dma_address + m_sprite_ram_size) > 0x40000) + if (!DWORD_ALIGNED(m_video_dma_address) || (m_video_dma_address + sprite_ram_size) > 0x40000) popmessage("Sprite DMA %X, contact MAMEdev", m_video_dma_address); // shouldn't happen if (m_video_dma_address < 0x800) logerror("sprite_dma_start_w in I/O area: %X\n", m_video_dma_address); - std::copy_n(&m_mainram[m_video_dma_address / 4], m_sprite_ram_size / 4, &m_sprite_ram[0]); + std::copy_n(&m_mainram[m_video_dma_address / 4], sprite_ram_size / 4, &m_sprite_ram[0]); } @@ -481,7 +483,8 @@ void seibuspi_base_state::draw_sprites(bitmap_rgb32 &bitmap, const rectangle &cl if (m_layer_enable & 0x10) return; - for (int a = 0; a < (m_sprite_ram_size / 4); a += 2) + const size_t sprite_ram_length = m_sprite_ram.length(); + for (int a = 0; a < sprite_ram_length; a += 2) { /* Word 0 @@ -706,13 +709,12 @@ void seibuspi_base_state::video_start() save_item(NAME(m_video_dma_length)); save_item(NAME(m_video_dma_address)); save_item(NAME(m_layer_enable)); - - save_pointer(NAME(m_palette_ram), m_palette_ram_size/4); - save_pointer(NAME(m_sprite_ram), m_sprite_ram_size/4); } void seibuspi_tilemap_state::video_start() { + seibuspi_base_state::video_start(); + m_video_dma_length = 0; m_video_dma_address = 0; m_layer_enable = 0; @@ -736,16 +738,7 @@ void seibuspi_tilemap_state::video_start() else m_bg_fore_layer_position = 0x8000; - m_tilemap_ram_size = 0x4000; - m_palette_ram_size = 0x3000; - m_sprite_ram_size = 0x1000; - m_sprite_bpp = 6; - - m_tilemap_ram = make_unique_clear(m_tilemap_ram_size/4); - m_palette_ram = make_unique_clear(m_palette_ram_size/4); - m_sprite_ram = make_unique_clear(m_sprite_ram_size/4); - - m_palette->basemem().set(&m_palette_ram[0], m_palette_ram_size, 32, ENDIANNESS_LITTLE, 2); + m_palette->basemem().set(&m_palette_ram[0], m_palette_ram.bytes(), 32, ENDIANNESS_LITTLE, 2); m_text_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(seibuspi_tilemap_state::get_text_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64,32); m_back_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(seibuspi_tilemap_state::get_back_tile_info)), TILEMAP_SCAN_COLS, 16,16, 32,32); @@ -793,10 +786,6 @@ void seibuspi_tilemap_state::video_start() save_item(NAME(m_back_layer_d14)); save_item(NAME(m_midl_layer_d14)); save_item(NAME(m_fore_layer_d14)); - - save_pointer(NAME(m_tilemap_ram), m_tilemap_ram_size/4); - - seibuspi_base_state::video_start(); } VIDEO_START_MEMBER(seibuspi_state,ejanhs) @@ -808,20 +797,13 @@ VIDEO_START_MEMBER(seibuspi_state,ejanhs) void sys386f_state::video_start() { + seibuspi_base_state::video_start(); + m_video_dma_length = 0; m_video_dma_address = 0; m_layer_enable = 0; - m_palette_ram_size = 0x4000; - m_sprite_ram_size = 0x2000; - m_sprite_bpp = 8; - - m_palette_ram = make_unique_clear(m_palette_ram_size/4); - m_sprite_ram = make_unique_clear(m_sprite_ram_size/4); - - m_palette->basemem().set(&m_palette_ram[0], m_palette_ram_size, 32, ENDIANNESS_LITTLE, 2); + m_palette->basemem().set(&m_palette_ram[0], m_palette_ram.bytes(), 32, ENDIANNESS_LITTLE, 2); memset(m_alpha_table, 0, 0x2000); // no alpha blending - - seibuspi_base_state::video_start(); }