From d8f70e6446ddc528c1af060ddcc2c822e6dbcf09 Mon Sep 17 00:00:00 2001 From: wilbertpol Date: Tue, 14 Feb 2023 18:23:22 +0000 Subject: bus/msx/cart/ram.cpp: Added RAM expansion cartridges. (#10888) --- scripts/src/bus.lua | 2 + src/devices/bus/msx/cart/cartridge.cpp | 2 + src/devices/bus/msx/cart/ram.cpp | 353 +++++++++++++++++++++++++++++++++ src/devices/bus/msx/cart/ram.h | 10 + src/devices/bus/msx/slot/cartridge.h | 1 + 5 files changed, 368 insertions(+) create mode 100644 src/devices/bus/msx/cart/ram.cpp create mode 100644 src/devices/bus/msx/cart/ram.h diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua index dbb738bd1bb..577e20237ba 100644 --- a/scripts/src/bus.lua +++ b/scripts/src/bus.lua @@ -1933,6 +1933,8 @@ if (BUSES["MSX_SLOT"]~=null) then MAME_DIR .. "src/devices/bus/msx/cart/msxdos2.h", MAME_DIR .. "src/devices/bus/msx/cart/nomapper.cpp", MAME_DIR .. "src/devices/bus/msx/cart/nomapper.h", + MAME_DIR .. "src/devices/bus/msx/cart/ram.cpp", + MAME_DIR .. "src/devices/bus/msx/cart/ram.h", MAME_DIR .. "src/devices/bus/msx/cart/rtype.cpp", MAME_DIR .. "src/devices/bus/msx/cart/rtype.h", MAME_DIR .. "src/devices/bus/msx/cart/softcard.cpp", diff --git a/src/devices/bus/msx/cart/cartridge.cpp b/src/devices/bus/msx/cart/cartridge.cpp index 9715e54e3f2..089740e0a8d 100644 --- a/src/devices/bus/msx/cart/cartridge.cpp +++ b/src/devices/bus/msx/cart/cartridge.cpp @@ -25,6 +25,7 @@ #include "msx_audio.h" #include "msxdos2.h" #include "nomapper.h" +#include "ram.h" #include "rtype.h" #include "softcard.h" #include "superloderunner.h" @@ -37,6 +38,7 @@ void msx_cart(device_slot_interface &device) { msx_cart_disk_register_options(device); + msx_cart_ram_register_options(device); device.option_add_internal("arc", MSX_CART_ARC); device.option_add_internal("ascii8", MSX_CART_ASCII8); device.option_add_internal("ascii8_sram", MSX_CART_ASCII8_SRAM); diff --git a/src/devices/bus/msx/cart/ram.cpp b/src/devices/bus/msx/cart/ram.cpp new file mode 100644 index 00000000000..3608376e94c --- /dev/null +++ b/src/devices/bus/msx/cart/ram.cpp @@ -0,0 +1,353 @@ +// license:BSD-3-Clause +// copyright-holders:Wilbert Pol +#include "emu.h" +#include "ram.h" + +#include "bus/msx/slot/cartridge.h" + +#include "bus/generic/slot.h" + + +/* +Emulation of memory expansions for the MSX system. + +Standard 16K RAM expansions: +- Addcom ADMSM 301 +- Casio OR-216 +- General RJ-102 +- Hitachi MP-RA01H +- Mitsubishi ML-16RAM +- National CF-2131 +- Philips VU 0031 +- Sanyo MRP-16 +- Sony HBM-16 +- Toshiba HX-M250 + +Standard 32K RAM expansions: +- Addcom ADMSM 302 +- Pioneer PX-RA32 +- Yamaha URM-01 + +Standard 48K RAM expansions: +- Addcom ADMSM 303 +- Neos RM-48 + +Standard 64K RAM expansions: +- Casio OR-264 +- Philips VU 0034 +- Sanyo Memoire Ram 64Ko +- Sanyo MRP-64 +- Sharp-Epcom HB-4100 +- Sony HBM-64 +- Spectravideo SVI-747 +- Toshiba HX-M251 +- Walther Miller WM 0587 + +Not supported: +- Fujitsu MB22451 - Fujitsu FM-X only, adds 16K memory and a printer port +- Yamaha SRE-01 - 60pin 32K memory expansion +- Yamaha SRM-01 - 60pin 32K memory expansion and slot expander + + + +256KB Memmory Mapper expansions +- R. & J.Jansen Memory Mapper 256 + +512KB Memory Mapper expansions +- Green MSX WBM512 +- Hardware Partners TM 512KB +- HSH RE-512 MM +- Padial LPE-512KBSRAM-V3 +- R. & J.Jansen Memory Mapper 512 +- Sony HBM-512 + +768KB Memory Mapper expansions +- ASCII MEM-768 + +1MB Memory Mapper expansions +- 8bits4ever MEGA-MAPPER 1024KB +- Digital KC MSX Memory Mapper 1024KB +- Hardware Partners TM 1M +- MK MSX Memory Mapper 1024KB +- MSX Club Gouda Memory Mapper 1MB +- Popolon MSX Memory Mapper + +2MB Memory Mapper expansions +- 8bits4ever MEGA-MAPPER 2048KB +- Digital KC MSX Memory Mapper 2048KB +- MFP Extended Memory-2048K +- MK MSX Memory Mapper 2048KB +- MSX Club Gouda Memory Mapper 2MB + +4MB Memory Mapper expansions +- 8bits4ever MEGA-MAPPER 4096KB +- Digital KC MSX Memory Mapper 4096KB +- MK MSX Memory Mapper 4096KB +- MSX Club Gouda Memory Mapper 4MB +- Padial LPE-4MB-V42KP +- T.N.S. Addram +- Tecnobytes Double RAM (MegaRam not supported) + +Not supported memory mappers: +- 8bits4ever SD-512 +- RBSC Carnivore2 +- Classic PC 16MB Expansion Memory - 4 x 4MB memory mapper +- GR8NET +- 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 +- Stichting CODE MCR-102 - 1MB memory mapper + RAM Disk + Printer buffer +- Stichting CODE MCR-204 - 2MB memory mapper + RAM Disk + Printer buffer +*/ + +DECLARE_DEVICE_TYPE(MSX_CART_16K_RAM, msx_cart_interface) +DECLARE_DEVICE_TYPE(MSX_CART_32K_RAM, msx_cart_interface) +DECLARE_DEVICE_TYPE(MSX_CART_48K_RAM, msx_cart_interface) +DECLARE_DEVICE_TYPE(MSX_CART_64K_RAM, msx_cart_interface) +DECLARE_DEVICE_TYPE(MSX_CART_256K_MM_RAM, msx_cart_interface) +DECLARE_DEVICE_TYPE(MSX_CART_512K_MM_RAM, msx_cart_interface) +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) + +void msx_cart_ram_register_options(device_slot_interface &device) +{ + device.option_add("ram16k", MSX_CART_16K_RAM); + device.option_add("ram32k", MSX_CART_32K_RAM); + device.option_add("ram48k", MSX_CART_48K_RAM); + device.option_add("ram64k", MSX_CART_64K_RAM); + device.option_add("mm256k", MSX_CART_256K_MM_RAM); + device.option_add("mm512k", MSX_CART_512K_MM_RAM); + device.option_add("mm768k", MSX_CART_768K_MM_RAM); + device.option_add("mm1024k", MSX_CART_1024K_MM_RAM); + device.option_add("mm2048k", MSX_CART_2048K_MM_RAM); + device.option_add("mm4096k", MSX_CART_4096K_MM_RAM); +} + +namespace { + +class msx_cart_base_ram_device : public device_t, public msx_cart_interface +{ +protected: + msx_cart_base_ram_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u32 ram_size) + : device_t(mconfig, type, tag, owner, clock) + , msx_cart_interface(mconfig, *this) + , m_ram_size(ram_size) + { } + + virtual void device_start() override + { + m_ram = std::make_unique(m_ram_size); + save_pointer(NAME(m_ram), m_ram_size); + } + + u8 *ram_data() + { + return m_ram.get(); + } + + u32 get_ram_size() const + { + return m_ram_size; + } + +private: + std::unique_ptr m_ram; + const u32 m_ram_size; +}; + + +class msx_cart_16k_ram_device : public msx_cart_base_ram_device +{ +public: + msx_cart_16k_ram_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : msx_cart_base_ram_device(mconfig, MSX_CART_16K_RAM, tag, owner, clock, 16 * 1024) + { } + +protected: + virtual void device_start() override + { + msx_cart_base_ram_device::device_start(); + page(2)->install_ram(0x8000, 0xbfff, ram_data()); + } +}; + +class msx_cart_32k_ram_device : public msx_cart_base_ram_device +{ +public: + msx_cart_32k_ram_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : msx_cart_base_ram_device(mconfig, MSX_CART_32K_RAM, tag, owner, clock, 32 * 1024) + { } + +protected: + virtual void device_start() override + { + msx_cart_base_ram_device::device_start(); + page(0)->install_ram(0x0000, 0x3fff, ram_data()); + page(1)->install_ram(0x4000, 0x7fff, ram_data() + 0x4000); + } +}; + +class msx_cart_48k_ram_device : public msx_cart_base_ram_device +{ +public: + msx_cart_48k_ram_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : msx_cart_base_ram_device(mconfig, MSX_CART_48K_RAM, tag, owner, clock, 48 * 1024) + { } + +protected: + virtual void device_start() override + { + msx_cart_base_ram_device::device_start(); + page(0)->install_ram(0x0000, 0x3fff, ram_data()); + page(1)->install_ram(0x4000, 0x7fff, ram_data() + 0x4000); + page(2)->install_ram(0x8000, 0xbfff, ram_data() + 0x8000); + } +}; + +class msx_cart_64k_ram_device : public msx_cart_base_ram_device +{ +public: + msx_cart_64k_ram_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : msx_cart_base_ram_device(mconfig, MSX_CART_64K_RAM, tag, owner, clock, 64 * 1024) + { } + +protected: + virtual void device_start() override + { + msx_cart_base_ram_device::device_start(); + page(0)->install_ram(0x0000, 0x3fff, ram_data()); + page(1)->install_ram(0x4000, 0x7fff, ram_data() + 0x4000); + page(2)->install_ram(0x8000, 0xbfff, ram_data() + 0x8000); + page(3)->install_ram(0xc000, 0xffff, ram_data() + 0xc000); + } +}; + + +class msx_cart_base_mm_ram_device : public msx_cart_base_ram_device +{ +protected: + msx_cart_base_mm_ram_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u32 ram_size) + : msx_cart_base_ram_device(mconfig, type, tag, owner, clock, ram_size) + , m_rambank(*this, "rambank%u", 0U) + , m_bank_mask(0) + { } + + virtual void device_start() override; + + template void bank_w(u8 data); + +private: + memory_bank_array_creator<4> m_rambank; + u8 m_bank_mask; +}; + +void msx_cart_base_mm_ram_device::device_start() +{ + msx_cart_base_ram_device::device_start(); + + m_bank_mask = device_generic_cart_interface::map_non_power_of_two( + unsigned(get_ram_size() / 0x4000), + [this] (unsigned entry, unsigned page) + { + for (int i = 0; i < 4; i++) + m_rambank[i]->configure_entry(entry, ram_data() + 0x4000 * page); + } + ); + + // The MSX system allows multiple devices to react to I/O, so we use taps. + io_space().install_write_tap(0xfc, 0xfc, "bank0", [this] (offs_t, u8& data, u8){ this->bank_w<0>(data); }); + io_space().install_write_tap(0xfd, 0xfd, "bank1", [this] (offs_t, u8& data, u8){ this->bank_w<1>(data); }); + io_space().install_write_tap(0xfe, 0xfe, "bank2", [this] (offs_t, u8& data, u8){ this->bank_w<2>(data); }); + io_space().install_write_tap(0xff, 0xff, "bank3", [this] (offs_t, u8& data, u8){ this->bank_w<3>(data); }); + + // Not all memory mapper expansions allow reading of mapper registers. + io_space().install_read_tap(0xfc, 0xfc, "bank0", [this] (offs_t, u8& data, u8){ if (!machine().side_effects_disabled()) data = ~m_bank_mask | m_rambank[0]->entry(); }); + io_space().install_read_tap(0xfd, 0xfd, "bank1", [this] (offs_t, u8& data, u8){ if (!machine().side_effects_disabled()) data = ~m_bank_mask | m_rambank[1]->entry(); }); + io_space().install_read_tap(0xfe, 0xfe, "bank2", [this] (offs_t, u8& data, u8){ if (!machine().side_effects_disabled()) data = ~m_bank_mask | m_rambank[2]->entry(); }); + io_space().install_read_tap(0xff, 0xff, "bank3", [this] (offs_t, u8& data, u8){ if (!machine().side_effects_disabled()) data = ~m_bank_mask | m_rambank[3]->entry(); }); + + page(0)->install_readwrite_bank(0x0000, 0x3fff, m_rambank[0]); + page(1)->install_readwrite_bank(0x4000, 0x7fff, m_rambank[1]); + page(2)->install_readwrite_bank(0x8000, 0xbfff, m_rambank[2]); + page(3)->install_readwrite_bank(0xc000, 0xffff, m_rambank[3]); + + m_rambank[0]->set_entry(3); + m_rambank[1]->set_entry(2); + m_rambank[2]->set_entry(1); + m_rambank[3]->set_entry(0); +} + +template +void msx_cart_base_mm_ram_device::bank_w(u8 data) +{ + m_rambank[Bank]->set_entry(data & m_bank_mask); +} + + +class msx_cart_256k_mm_ram_device : public msx_cart_base_mm_ram_device +{ +public: + msx_cart_256k_mm_ram_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : msx_cart_base_mm_ram_device(mconfig, MSX_CART_256K_MM_RAM, tag, owner, clock, 256 * 1024) + { } +}; + +class msx_cart_512k_mm_ram_device : public msx_cart_base_mm_ram_device +{ +public: + msx_cart_512k_mm_ram_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : msx_cart_base_mm_ram_device(mconfig, MSX_CART_512K_MM_RAM, tag, owner, clock, 512 * 1024) + { } +}; + +class msx_cart_768k_mm_ram_device : public msx_cart_base_mm_ram_device +{ +public: + msx_cart_768k_mm_ram_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : msx_cart_base_mm_ram_device(mconfig, MSX_CART_768K_MM_RAM, tag, owner, clock, 768 * 1024) + { } +}; + +class msx_cart_1024k_mm_ram_device : public msx_cart_base_mm_ram_device +{ +public: + msx_cart_1024k_mm_ram_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : msx_cart_base_mm_ram_device(mconfig, MSX_CART_1024K_MM_RAM, tag, owner, clock, 1024 * 1024) + { } +}; + +class msx_cart_2048k_mm_ram_device : public msx_cart_base_mm_ram_device +{ +public: + msx_cart_2048k_mm_ram_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : msx_cart_base_mm_ram_device(mconfig, MSX_CART_2048K_MM_RAM, tag, owner, clock, 2048 * 1024) + { } +}; + +class msx_cart_4096k_mm_ram_device : public msx_cart_base_mm_ram_device +{ +public: + msx_cart_4096k_mm_ram_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : msx_cart_base_mm_ram_device(mconfig, MSX_CART_4096K_MM_RAM, tag, owner, clock, 4096 * 1024) + { } +}; + +} // anonymous namespace + + +DEFINE_DEVICE_TYPE_PRIVATE(MSX_CART_16K_RAM, msx_cart_interface, msx_cart_16k_ram_device, "msx_cart_16k_ram", "Generic MSX 16K RAM Expansion") +DEFINE_DEVICE_TYPE_PRIVATE(MSX_CART_32K_RAM, msx_cart_interface, msx_cart_32k_ram_device, "msx_cart_32k_ram", "Generic MSX 32K RAM Expansion") +DEFINE_DEVICE_TYPE_PRIVATE(MSX_CART_48K_RAM, msx_cart_interface, msx_cart_48k_ram_device, "msx_cart_48k_ram", "Generic MSX 48K RAM Expansion") +DEFINE_DEVICE_TYPE_PRIVATE(MSX_CART_64K_RAM, msx_cart_interface, msx_cart_64k_ram_device, "msx_cart_64k_ram", "Generic MSX 64K RAM Expansion") +DEFINE_DEVICE_TYPE_PRIVATE(MSX_CART_256K_MM_RAM, msx_cart_interface, msx_cart_256k_mm_ram_device, "msx_cart_256k_mm_ram", "Generic MSX 256K MM RAM Expansion") +DEFINE_DEVICE_TYPE_PRIVATE(MSX_CART_512K_MM_RAM, msx_cart_interface, msx_cart_512k_mm_ram_device, "msx_cart_512k_mm_ram", "Generic MSX 512K MM RAM Expansion") +DEFINE_DEVICE_TYPE_PRIVATE(MSX_CART_768K_MM_RAM, msx_cart_interface, msx_cart_768k_mm_ram_device, "msx_cart_768k_mm_ram", "Generic MSX 768K MM RAM Expansion") +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") diff --git a/src/devices/bus/msx/cart/ram.h b/src/devices/bus/msx/cart/ram.h new file mode 100644 index 00000000000..e23d950a720 --- /dev/null +++ b/src/devices/bus/msx/cart/ram.h @@ -0,0 +1,10 @@ +// license:BSD-3-Clause +// copyright-holders:Wilbert Pol +#ifndef MAME_BUS_MSX_CART_RAM_H +#define MAME_BUS_MSX_CART_RAM_H + +#pragma once + +void msx_cart_ram_register_options(device_slot_interface &device); + +#endif // MAME_BUS_MSX_CART_RAM_H diff --git a/src/devices/bus/msx/slot/cartridge.h b/src/devices/bus/msx/slot/cartridge.h index aef5fbdfe1f..50c97aca3d2 100644 --- a/src/devices/bus/msx/slot/cartridge.h +++ b/src/devices/bus/msx/slot/cartridge.h @@ -6,6 +6,7 @@ #pragma once #include "slot.h" +#include "bus/generic/slot.h" #include "bus/msx/cart/cartridge.h" #include "imagedev/cartrom.h" -- cgit v1.2.3