diff options
Diffstat (limited to 'src/devices/bus/mtx/exp.cpp')
-rw-r--r-- | src/devices/bus/mtx/exp.cpp | 90 |
1 files changed, 84 insertions, 6 deletions
diff --git a/src/devices/bus/mtx/exp.cpp b/src/devices/bus/mtx/exp.cpp index 58071cd1a38..3a8a5f64801 100644 --- a/src/devices/bus/mtx/exp.cpp +++ b/src/devices/bus/mtx/exp.cpp @@ -27,11 +27,27 @@ DEFINE_DEVICE_TYPE(MTX_EXP_SLOT, mtx_exp_slot_device, "mtx_exp_slot", "MTX expan device_mtx_exp_interface::device_mtx_exp_interface(const machine_config &mconfig, device_t &device) : device_interface(device, "mtxexp") + , m_rom(nullptr) + , m_rom_size(0) { m_slot = dynamic_cast<mtx_exp_slot_device *>(device.owner()); } +//------------------------------------------------- +// rom_alloc - alloc the space for the ROM +//------------------------------------------------- + +void device_mtx_exp_interface::rom_alloc(uint32_t size, const char *tag) +{ + if (m_rom == nullptr) + { + m_rom = device().machine().memory().region_alloc(std::string(tag).append(":cart:rom"), size, 1, ENDIANNESS_LITTLE)->base(); + m_rom_size = size; + } +} + + //************************************************************************** // LIVE DEVICE //************************************************************************** @@ -43,11 +59,13 @@ device_mtx_exp_interface::device_mtx_exp_interface(const machine_config &mconfig mtx_exp_slot_device::mtx_exp_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, MTX_EXP_SLOT, tag, owner, clock) , device_single_card_slot_interface<device_mtx_exp_interface>(mconfig, *this) + , device_cartrom_image_interface(mconfig, *this) , m_program(*this, finder_base::DUMMY_TAG, -1) , m_io(*this, finder_base::DUMMY_TAG, -1) , m_busreq_handler(*this) , m_int_handler(*this) , m_nmi_handler(*this) + , m_card(nullptr) { } @@ -58,10 +76,58 @@ mtx_exp_slot_device::mtx_exp_slot_device(const machine_config &mconfig, const ch void mtx_exp_slot_device::device_start() { - // resolve callbacks - m_busreq_handler.resolve_safe(); - m_int_handler.resolve_safe(); - m_nmi_handler.resolve_safe(); + m_card = get_card_device(); +} + + +//------------------------------------------------- +// call_load +//------------------------------------------------- + +std::pair<std::error_condition, std::string> mtx_exp_slot_device::call_load() +{ + if (m_card) + { + uint32_t const size = !loaded_through_softlist() ? length() : get_software_region_length("rom"); + + if (size % 0x2000) + return std::make_pair(image_error::INVALIDLENGTH, "Unsupported cartridge size (must be a multiple of 8K)"); + + m_card->rom_alloc(size, tag()); + + if (!loaded_through_softlist()) + fread(m_card->get_rom_base(), size); + else + memcpy(m_card->get_rom_base(), get_software_region("rom"), size); + } + + return std::make_pair(std::error_condition(), std::string()); +} + + +//------------------------------------------------- +// get_default_card_software - +//------------------------------------------------- + +std::string mtx_exp_slot_device::get_default_card_software(get_default_card_software_hook &hook) const +{ + if (hook.image_file()) + { + uint64_t len; + hook.image_file()->length(len); // FIXME: check error return + + if (len == 0x80000) + return software_get_default_slot("magrom"); + } + + return software_get_default_slot("rompak"); +} + + +void mtx_exp_slot_device::bankswitch(uint8_t data) +{ + if (m_card) + m_card->bankswitch(data); } @@ -71,13 +137,25 @@ void mtx_exp_slot_device::device_start() // slot devices +#include "cfx.h" //#include "fdx.h" +#include "magrom.h" +#include "rompak.h" #include "sdx.h" -void mtx_expansion_devices(device_slot_interface &device) +void mtx_int_expansion_devices(device_slot_interface &device) { + device.option_add("cfx", MTX_CFX); //device.option_add("fdx", MTX_FDX); /* FDX Floppy Disc System */ - device.option_add("sdxbas", MTX_SDXBAS); /* SDX Floppy Disc System (SDX ROM)*/ + device.option_add_internal("magrom", MTX_MAGROM); device.option_add("sdxcpm", MTX_SDXCPM); /* SDX Floppy Disc System (CP/M ROM and 80 column card) */ } + +void mtx_ext_expansion_devices(device_slot_interface &device) +{ + device.option_add("cfx", MTX_CFX); + device.option_add_internal("magrom", MTX_MAGROM); + device.option_add_internal("rompak", MTX_ROMPAK); + device.option_add("sdxbas", MTX_SDXBAS); /* SDX Floppy Disc System (SDX ROM)*/ +} |