From 4537a4b428f4241c85259f3c2b779ef77d7d7580 Mon Sep 17 00:00:00 2001 From: Olivier Galibert Date: Tue, 24 Nov 2020 12:33:17 +0100 Subject: Fix sega outrun and system 16b, some confusion between regions and shares and a bank initialized too late --- src/mame/drivers/segaorun.cpp | 4 ++-- src/mame/drivers/segas16b.cpp | 3 +++ src/mame/machine/315_5195.cpp | 25 +++++++++++++++++++++++++ src/mame/machine/315_5195.h | 1 + 4 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/mame/drivers/segaorun.cpp b/src/mame/drivers/segaorun.cpp index 338578930ef..369dde654a2 100644 --- a/src/mame/drivers/segaorun.cpp +++ b/src/mame/drivers/segaorun.cpp @@ -448,7 +448,7 @@ void segaorun_state::memory_mapper(sega_315_5195_mapper_device &mapper, uint8_t mapper.map_as_handler(0x90000, 0x10000, 0xf00000, read16_delegate(*this, FUNC(segaorun_state::sega_road_control_0_r)), write16_delegate(*this, FUNC(segaorun_state::sega_road_control_0_w))); mapper.map_as_ram(0x80000, 0x01000, 0xf0f000, "segaic16road:roadram", write16_delegate(*this)); mapper.map_as_ram(0x60000, 0x08000, 0xf18000, "cpu1ram", write16_delegate(*this)); - mapper.map_as_ram(0x00000, 0x60000, 0xf00000, "cpu1rom", write16_delegate(*this, FUNC(segaorun_state::nop_w))); + mapper.map_as_region(0x00000, 0x60000, 0xf00000, "subcpu", write16_delegate(*this, FUNC(segaorun_state::nop_w))); break; case 4: @@ -876,7 +876,7 @@ void segaorun_state::sub_map(address_map &map) { map.unmap_value_high(); map.global_mask(0xfffff); - map(0x000000, 0x05ffff).rom().share("cpu1rom"); + map(0x000000, 0x05ffff).rom(); map(0x060000, 0x067fff).mirror(0x018000).ram().share("cpu1ram"); map(0x080000, 0x080fff).mirror(0x00f000).ram().share("segaic16road:roadram"); map(0x090000, 0x09ffff).rw(m_segaic16road, FUNC(segaic16_road_device::segaic16_road_control_0_r), FUNC(segaic16_road_device::segaic16_road_control_0_w)); diff --git a/src/mame/drivers/segas16b.cpp b/src/mame/drivers/segas16b.cpp index 7e47e8b3517..00ce76e02fd 100644 --- a/src/mame/drivers/segas16b.cpp +++ b/src/mame/drivers/segas16b.cpp @@ -1291,6 +1291,9 @@ void segas16b_state::machine_reset() for (int banknum = 0; banknum < 16; banknum++) m_sprites->set_bank(banknum, banklist[banknum]); } + + // ensure the sound bank points somewhere sane + membank("soundbank")->set_base(memregion("soundcpu")->base() + 0x10000); } diff --git a/src/mame/machine/315_5195.cpp b/src/mame/machine/315_5195.cpp index d97b51cbc4d..21778a618ef 100644 --- a/src/mame/machine/315_5195.cpp +++ b/src/mame/machine/315_5195.cpp @@ -285,6 +285,31 @@ void sega_315_5195_mapper_device::map_as_ram(u32 offset, u32 length, offs_t mirr } +//------------------------------------------------- +// map_as_region - map a region as ROM, with an +// optional write handler +//------------------------------------------------- + +void sega_315_5195_mapper_device::map_as_region(u32 offset, u32 length, offs_t mirror, const char *region_name, write16_delegate whandler) +{ + // determine parameters + region_info info; + compute_region(info, m_curregion, length, mirror, offset); + LOG("Map %06X-%06X (%06X) as REGION(%s) with handler=%s\n", info.start, info.end, info.mirror, region_name, + whandler.isnull() ? "none" : whandler.name()); + + // map now + m_space->install_rom(info.start, info.end, info.mirror, owner()->memregion(region_name)->base()); + + // either install a write handler or a write bank, as appropriate + if (!whandler.isnull()) + m_space->install_write_handler(info.start, info.end, 0, info.mirror, 0, whandler); + + // clear this rom bank reference + m_banks[m_curregion].clear(); +} + + //------------------------------------------------- // map_as_handler - map a region as a pair of // read write handlers diff --git a/src/mame/machine/315_5195.h b/src/mame/machine/315_5195.h index f12d8bc14a7..3934d426d5a 100644 --- a/src/mame/machine/315_5195.h +++ b/src/mame/machine/315_5195.h @@ -57,6 +57,7 @@ public: // mapping helpers void map_as_rom(u32 offset, u32 length, offs_t mirror, const char *bank_name, const char *decrypted_bank_name, offs_t rgnoffset, write16_delegate whandler); void map_as_ram(u32 offset, u32 length, offs_t mirror, const char *bank_share_name, write16_delegate whandler); + void map_as_region(u32 offset, u32 length, offs_t mirror, const char *region_name, write16_delegate whandler); void map_as_handler(u32 offset, u32 length, offs_t mirror, read16_delegate rhandler, write16_delegate whandler); // perform an explicit configuration (for bootlegs with hard-coded mappings) -- cgit v1.2.3