From c5defbf8e087e687e72c8e6ea7dd700d1d3cf449 Mon Sep 17 00:00:00 2001 From: Olivier Galibert Date: Wed, 18 Nov 2020 11:53:45 +0100 Subject: Fix the 315-5195, should help a lot of sega --- src/mame/machine/315_5195.cpp | 27 +++++++++++++-------------- src/mame/machine/315_5195.h | 20 ++++++++++++-------- 2 files changed, 25 insertions(+), 22 deletions(-) diff --git a/src/mame/machine/315_5195.cpp b/src/mame/machine/315_5195.cpp index 2ed58b60793..d97b51cbc4d 100644 --- a/src/mame/machine/315_5195.cpp +++ b/src/mame/machine/315_5195.cpp @@ -47,6 +47,7 @@ sega_315_5195_mapper_device::sega_315_5195_mapper_device(const machine_config &m , m_mcu_int_callback(*this) , m_space(nullptr) , m_decrypted_space(nullptr) + , m_decryption_banks(*this, "decrypted bank %u", 0U) , m_curregion(0) , m_to_sound(0) , m_from_sound(0) @@ -239,13 +240,12 @@ void sega_315_5195_mapper_device::map_as_rom(u32 offset, u32 length, offs_t mirr void *memptr = m_cpuregion->base() + rgnoffset; // remember this bank, and decrypt if necessary - void *decrypt = m_banks[m_curregion].set(info.start, romend, rgnoffset, memptr); + m_banks[m_curregion].set(info.start, romend, rgnoffset, memptr, m_decryption_banks[m_curregion].target()); // map now m_space->install_rom(info.start, romend, info.mirror, memptr); if (m_decrypted_space) - m_decrypted_space->install_rom(info.start, romend, info.mirror, decrypt ? decrypt : memptr); - + m_decrypted_space->install_read_bank(info.start, romend, info.mirror, m_decryption_banks[m_curregion].target()); } // either install a write handler if provided or unmap the region @@ -330,8 +330,8 @@ void sega_315_5195_mapper_device::configure_explicit(const u8 *map_data) void sega_315_5195_mapper_device::fd1094_state_change(u8 state) { // iterate over regions and set the decrypted address of any ROM banks - for (auto & elem : m_banks) - elem.update(); + for (int i=0; i != 8; i++) + m_banks[i].update(m_decryption_banks[i].target()); } @@ -547,15 +547,15 @@ void sega_315_5195_mapper_device::decrypt_bank::set_decrypt(fd1094_device *fd109 // a change //------------------------------------------------- -void *sega_315_5195_mapper_device::decrypt_bank::set(offs_t start, offs_t end, offs_t rgnoffs, void *src) +void sega_315_5195_mapper_device::decrypt_bank::set(offs_t start, offs_t end, offs_t rgnoffs, void *src, memory_bank *bank) { // ignore if not encrypted if (m_fd1089 == nullptr && m_fd1094_cache == nullptr) - return nullptr; + return; // ignore if nothing is changing if (start == m_start && end == m_end && rgnoffs == m_rgnoffs && src == m_srcptr) - return nullptr; + return; // if the start, end, or src change, throw away any cached data reset(); @@ -571,7 +571,7 @@ void *sega_315_5195_mapper_device::decrypt_bank::set(offs_t start, offs_t end, o m_fd1094_cache->configure(m_start, m_end + 1 - m_start, m_rgnoffs); // force an update of what we have - return update(); + update(bank); } @@ -580,22 +580,21 @@ void *sega_315_5195_mapper_device::decrypt_bank::set(offs_t start, offs_t end, o // if this rom bank has been assigned //------------------------------------------------- -void *sega_315_5195_mapper_device::decrypt_bank::update() +void sega_315_5195_mapper_device::decrypt_bank::update(memory_bank *bank) { // if this isn't a valid state, don't try to do anything if (m_srcptr == nullptr) - return nullptr; + return; // fd1089 case if (m_fd1089 != nullptr) { m_fd1089_decrypted.resize((m_end + 1 - m_start) / 2); m_fd1089->decrypt(m_start, m_end + 1 - m_start, m_rgnoffs, &m_fd1089_decrypted[0], reinterpret_cast(m_srcptr)); - return &m_fd1089_decrypted[0]; + bank->set_base(&m_fd1089_decrypted[0]); } // fd1094 case if (m_fd1094_cache != nullptr) - return m_fd1094_cache->decrypted_opcodes(m_fd1094_cache->fd1094().state()); - return nullptr; + bank->set_base(m_fd1094_cache->decrypted_opcodes(m_fd1094_cache->fd1094().state())); } diff --git a/src/mame/machine/315_5195.h b/src/mame/machine/315_5195.h index 0386cbccb8b..f12d8bc14a7 100644 --- a/src/mame/machine/315_5195.h +++ b/src/mame/machine/315_5195.h @@ -51,6 +51,9 @@ public: u8 pread(); void pwrite(u8 data); + // to use when the underlying decryption changes and remapping is needed + void decryption_changed(); + // 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); @@ -92,11 +95,11 @@ private: // configuration void set_decrypt(fd1089_base_device *fd1089); void set_decrypt(fd1094_device *fd1094); - void clear() { set(0, 0, ~0, nullptr); } - void *set(offs_t start, offs_t end, offs_t rgnoffs, void *src); + void clear() { m_start = 0; m_end = ~0; m_rgnoffs = 0; m_srcptr = nullptr; } + void set(offs_t start, offs_t end, offs_t rgnoffs, void *src, memory_bank *bank); // updating - void *update(); + void update(memory_bank *bank); void reset() { m_fd1089_decrypted.clear(); if (m_fd1094_cache != nullptr) m_fd1094_cache->reset(); } private: @@ -123,11 +126,12 @@ private: devcb_write_line m_mcu_int_callback; // internal state - address_space * m_space; - address_space * m_decrypted_space; - u8 m_regs[0x20]; - u8 m_curregion; - decrypt_bank m_banks[8]; + address_space * m_space; + address_space * m_decrypted_space; + memory_bank_array_creator<8> m_decryption_banks; + u8 m_regs[0x20]; + u8 m_curregion; + decrypt_bank m_banks[8]; // communication registers u8 m_to_sound; -- cgit v1.2.3