From 85774767c8952a0454e206e2bcb89d7177ac7711 Mon Sep 17 00:00:00 2001 From: wilbertpol Date: Thu, 16 May 2024 18:16:45 +0100 Subject: [PATCH] bus/msx/cart/ram.cpp: Added Popolon Musical Memory Mapper cartride. (#12365) --- src/devices/bus/msx/cart/ram.cpp | 59 ++++++++++++++++++++++-- src/devices/bus/msx/cart/slotoptions.cpp | 1 + src/devices/bus/msx/cart/slotoptions.h | 1 + 3 files changed, 58 insertions(+), 3 deletions(-) diff --git a/src/devices/bus/msx/cart/ram.cpp b/src/devices/bus/msx/cart/ram.cpp index 9b98460df50..b745a28ae08 100644 --- a/src/devices/bus/msx/cart/ram.cpp +++ b/src/devices/bus/msx/cart/ram.cpp @@ -88,7 +88,6 @@ Not supported memory mappers: - MSX Cartridge Shop MegaFlashROM SCC+ SD - Padial LPE-4FMB-V8SKP - 4MB memory mapper + MegaRam mode - Playsonic - 4MB memory mapper, up to 16MB through extra register -- Popolon Musical Memory Mapper - 1MB memory mapper + SN76489AN - Stichting CODE MCR-025 - 256KB memory mapper + RAM Disk + Printer buffer - Stichting CODE MCR-051 - 512KB memory mapper + RAM Disk + Printer buffer - Stichting CODE MCR-076 - 768KB memory mapper + RAM Disk + Printer buffer @@ -100,8 +99,8 @@ Not supported memory mappers: #include "slotoptions.h" #include "bus/msx/slot/cartridge.h" - #include "bus/generic/slot.h" +#include "sound/sn76496.h" @@ -115,6 +114,7 @@ DECLARE_DEVICE_TYPE(MSX_CART_768K_MM_RAM, msx_cart_interface) DECLARE_DEVICE_TYPE(MSX_CART_1024K_MM_RAM, msx_cart_interface) DECLARE_DEVICE_TYPE(MSX_CART_2048K_MM_RAM, msx_cart_interface) DECLARE_DEVICE_TYPE(MSX_CART_4096K_MM_RAM, msx_cart_interface) +DECLARE_DEVICE_TYPE(MSX_CART_MMM, msx_cart_interface) void msx_cart_ram_register_options(device_slot_interface &device) { @@ -129,6 +129,7 @@ void msx_cart_ram_register_options(device_slot_interface &device) device.option_add(slotoptions::MM1024K, MSX_CART_1024K_MM_RAM); device.option_add(slotoptions::MM2048K, MSX_CART_2048K_MM_RAM); device.option_add(slotoptions::MM4096K, MSX_CART_4096K_MM_RAM); + device.option_add(slotoptions::MMM, MSX_CART_MMM); } namespace { @@ -244,7 +245,6 @@ protected: template void bank_w(u8 data); -private: memory_bank_array_creator<4> m_rambank; u8 m_bank_mask; }; @@ -334,6 +334,58 @@ public: { } }; + +class msx_cart_mmm_device : public msx_cart_base_mm_ram_device +{ +public: + msx_cart_mmm_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : msx_cart_base_mm_ram_device(mconfig, MSX_CART_MMM, tag, owner, clock, 1024 * 1024) + , m_sn76489a(*this, "sn76489a") + , m_access_enabled(false) + , m_sn76489_enabled(false) + { } + +protected: + virtual void device_start() override; + virtual void device_add_mconfig(machine_config &config) override; + +private: + required_device m_sn76489a; + bool m_access_enabled; + bool m_sn76489_enabled; +}; + +void msx_cart_mmm_device::device_start() +{ + msx_cart_base_mm_ram_device::device_start(); + + m_access_enabled = false; + m_sn76489_enabled = false; + + io_space().install_write_tap(0x3c, 0x3c, "ena_access", [this] (offs_t, u8& data, u8){ this->m_access_enabled = BIT(data, 7); }); + io_space().install_write_tap(0x3f, 0x3f, "sn76489w", [this] (offs_t, u8& data, u8){ if (m_sn76489_enabled) this->m_sn76489a->write(data); }); + + page(2)->install_write_tap(0x803c, 0x803c, "ena_sn76489", [this] (offs_t, u8& data, u8){ if (m_access_enabled) this->m_sn76489_enabled |= BIT(data, 6); }); + page(2)->install_read_tap(0x80fc, 0x80fc, "map00r", [this] (offs_t, u8& data, u8){ if (m_access_enabled) data = 0xc0 | this->m_rambank[0]->entry(); }); + page(2)->install_read_tap(0x80fd, 0x80fd, "map40r", [this] (offs_t, u8& data, u8){ if (m_access_enabled) data = 0xc0 | this->m_rambank[1]->entry(); }); + page(2)->install_read_tap(0x80fe, 0x80fe, "map80r", [this] (offs_t, u8& data, u8){ if (m_access_enabled) data = 0xc0 | this->m_rambank[2]->entry(); }); + page(2)->install_read_tap(0x80ff, 0x80ff, "mapc0r", [this] (offs_t, u8& data, u8){ if (m_access_enabled) data = 0xc0 | this->m_rambank[3]->entry(); }); + page(2)->install_write_tap(0x80fc, 0x80fc, "map00w", [this] (offs_t, u8& data, u8){ if (m_access_enabled) this->bank_w<0>(data); }); + page(2)->install_write_tap(0x80fd, 0x80fd, "map40w", [this] (offs_t, u8& data, u8){ if (m_access_enabled) this->bank_w<1>(data); }); + page(2)->install_write_tap(0x80fe, 0x80fe, "map80w", [this] (offs_t, u8& data, u8){ if (m_access_enabled) this->bank_w<2>(data); }); + page(2)->install_write_tap(0x80ff, 0x80ff, "mapc0w", [this] (offs_t, u8& data, u8){ if (m_access_enabled) this->bank_w<3>(data); }); + + save_item(NAME(m_access_enabled)); + save_item(NAME(m_sn76489_enabled)); +} + +void msx_cart_mmm_device::device_add_mconfig(machine_config &config) +{ + SN76489A(config, m_sn76489a, DERIVED_CLOCK(1, 3)); + if (parent_slot()) + m_sn76489a->add_route(ALL_OUTPUTS, soundin(), 0.8); +} + } // anonymous namespace @@ -347,3 +399,4 @@ DEFINE_DEVICE_TYPE_PRIVATE(MSX_CART_768K_MM_RAM, msx_cart_interface, msx_cart_7 DEFINE_DEVICE_TYPE_PRIVATE(MSX_CART_1024K_MM_RAM, msx_cart_interface, msx_cart_1024k_mm_ram_device, "msx_cart_1024k_mm_ram", "Generic MSX 1024K MM RAM Expansion") DEFINE_DEVICE_TYPE_PRIVATE(MSX_CART_2048K_MM_RAM, msx_cart_interface, msx_cart_2048k_mm_ram_device, "msx_cart_2048k_mm_ram", "Generic MSX 2048K MM RAM Expansion") DEFINE_DEVICE_TYPE_PRIVATE(MSX_CART_4096K_MM_RAM, msx_cart_interface, msx_cart_4096k_mm_ram_device, "msx_cart_4096k_mm_ram", "Generic MSX 4096K MM RAM Expansion") +DEFINE_DEVICE_TYPE_PRIVATE(MSX_CART_MMM, msx_cart_interface, msx_cart_mmm_device, "msx_cart_mmm", "Popolon Musical Memory Mapper") diff --git a/src/devices/bus/msx/cart/slotoptions.cpp b/src/devices/bus/msx/cart/slotoptions.cpp index c3f97dc8b1f..046a164ddbe 100644 --- a/src/devices/bus/msx/cart/slotoptions.cpp +++ b/src/devices/bus/msx/cart/slotoptions.cpp @@ -63,6 +63,7 @@ char const *const MM768K = "mm768k"; char const *const MM1024K = "mm1024k"; char const *const MM2048K = "mm2048k"; char const *const MM4096K = "mm4096k"; +char const *const MMM = "mmm"; char const *const MOONSOUND = "moonsound"; char const *const MSXAUD_FSCA1 = "msxaud_fsca1"; char const *const MSXAUD_HXMU900 = "msxaud_hxmu900"; diff --git a/src/devices/bus/msx/cart/slotoptions.h b/src/devices/bus/msx/cart/slotoptions.h index c6505053745..9ea5cc31d87 100644 --- a/src/devices/bus/msx/cart/slotoptions.h +++ b/src/devices/bus/msx/cart/slotoptions.h @@ -66,6 +66,7 @@ extern char const *const MM768K; extern char const *const MM1024K; extern char const *const MM2048K ; extern char const *const MM4096K; +extern char const *const MMM; extern char const *const MOONSOUND; extern char const *const MSXAUD_FSCA1; extern char const *const MSXAUD_HXMU900;