Fix sega outrun and system 16b, some confusion between regions and shares and a bank initialized too late

This commit is contained in:
Olivier Galibert 2020-11-24 12:33:17 +01:00
parent 518efdf926
commit 4537a4b428
4 changed files with 31 additions and 2 deletions

View File

@ -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));

View File

@ -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);
}

View File

@ -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

View File

@ -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)