diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua index a0a0f571bf5..0fb2ad140d9 100644 --- a/scripts/src/bus.lua +++ b/scripts/src/bus.lua @@ -909,6 +909,8 @@ if (BUSES["COLECO_CART"]~=null) then files { MAME_DIR .. "src/devices/bus/coleco/cartridge/exp.cpp", MAME_DIR .. "src/devices/bus/coleco/cartridge/exp.h", + MAME_DIR .. "src/devices/bus/coleco/cartridge/megacart.cpp", + MAME_DIR .. "src/devices/bus/coleco/cartridge/megacart.h", MAME_DIR .. "src/devices/bus/coleco/cartridge/std.cpp", MAME_DIR .. "src/devices/bus/coleco/cartridge/std.h", MAME_DIR .. "src/devices/bus/coleco/cartridge/xin1.h", diff --git a/src/devices/bus/coleco/cartridge/exp.cpp b/src/devices/bus/coleco/cartridge/exp.cpp index 0cc3e3db90e..7ceb5443c07 100644 --- a/src/devices/bus/coleco/cartridge/exp.cpp +++ b/src/devices/bus/coleco/cartridge/exp.cpp @@ -109,6 +109,12 @@ std::string colecovision_cartridge_slot_device::get_default_card_software(get_de uint32_t length = hook.image_file()->size(); if (length == 0x100000 || length == 0x200000) return software_get_default_slot("xin1"); + + if (length > 0x8000) + { + // Assume roms longer than 32K are megacarts. + return software_get_default_slot("megacart"); + } } return software_get_default_slot("standard"); } @@ -118,27 +124,28 @@ std::string colecovision_cartridge_slot_device::get_default_card_software(get_de // bd_r - cartridge data read //------------------------------------------------- + uint8_t colecovision_cartridge_slot_device::bd_r(offs_t offset, uint8_t data, int _8000, int _a000, int _c000, int _e000) { - if (m_card != nullptr) - { - data = m_card->bd_r(offset, data, _8000, _a000, _c000, _e000); - } + if (m_card) + data = m_card->bd_r(offset , data, _8000, _a000, _c000, _e000); return data; -} + } //------------------------------------------------- // SLOT_INTERFACE( colecovision_cartridges ) //------------------------------------------------- +#include "megacart.h" #include "std.h" #include "xin1.h" void colecovision_cartridges(device_slot_interface &device) { // the following need ROMs from the software list + device.option_add_internal("megacart", COLECOVISION_MEGACART); device.option_add_internal("standard", COLECOVISION_STANDARD); device.option_add_internal("xin1", COLECOVISION_XIN1); } diff --git a/src/devices/bus/coleco/cartridge/megacart.cpp b/src/devices/bus/coleco/cartridge/megacart.cpp new file mode 100644 index 00000000000..dddf28ec851 --- /dev/null +++ b/src/devices/bus/coleco/cartridge/megacart.cpp @@ -0,0 +1,93 @@ +// license:BSD-3-Clause +// copyright-holders:Mark/Space Inc. +/********************************************************************** + + ColecoVision MegaCart emulation + +**********************************************************************/ + +#include "emu.h" +#include "megacart.h" + + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +DEFINE_DEVICE_TYPE(COLECOVISION_MEGACART, colecovision_megacart_cartridge_device, "colecovision_megacart", "ColecoVision MegaCart") + + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// colecovision_megacart_cartridge_device - constructor +//------------------------------------------------- + +colecovision_megacart_cartridge_device::colecovision_megacart_cartridge_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + device_t(mconfig, COLECOVISION_MEGACART, tag, owner, clock), + device_colecovision_cartridge_interface(mconfig, *this), + m_bankcount(0), + m_activebank(0) +{ +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void colecovision_megacart_cartridge_device::device_start() +{ +} + + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void colecovision_megacart_cartridge_device::device_reset() +{ + m_bankcount = m_rom_size >> 14; + m_activebank = 0; +} + + +//------------------------------------------------- +// read - cartridge data read +//------------------------------------------------- + +uint8_t colecovision_megacart_cartridge_device::bd_r(offs_t offset, uint8_t data, int _8000, int _a000, int _c000, int _e000) +{ + if (!_8000 || !_a000 || !_c000 || !_e000) + { + if (m_bankcount > 2) + { + // offset as passed to us is a delta from address 0x8000. + + if (offset >= 0x7FC0) + { + // Reads within the final 64 bytes select which megacart bank is active. + m_activebank = offset & (m_bankcount - 1); + } + + if (offset >= 0x4000) + { + // The offset is within the active megacart bank. + offset = (m_activebank << 14) + (offset - 0x4000); + } + else + { + // The offset is within the last bank. + offset = (m_bankcount << 14) + (offset - 0x4000); + } + } + + data = m_rom[offset]; + } + + return data; +} diff --git a/src/devices/bus/coleco/cartridge/megacart.h b/src/devices/bus/coleco/cartridge/megacart.h new file mode 100644 index 00000000000..f91ec6b0e7b --- /dev/null +++ b/src/devices/bus/coleco/cartridge/megacart.h @@ -0,0 +1,49 @@ +// license:BSD-3-Clause +// copyright-holders:Mark/Space Inc. +/********************************************************************** + + ColecoVision MegaCart emulation + +**********************************************************************/ + +#ifndef MAME_BUS_COLECO_MEGACART_H +#define MAME_BUS_COLECO_MEGACART_H + +#pragma once + +#include "exp.h" + + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> colecovision_megacart_cartridge_device + +class colecovision_megacart_cartridge_device : public device_t, + public device_colecovision_cartridge_interface +{ +public: + // construction/destruction + colecovision_megacart_cartridge_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + // device_t overrides + virtual void device_start() override; + virtual void device_reset() override; + + // device_colecovision_cartridge_interface overrides + virtual uint8_t bd_r(offs_t offset, uint8_t data, int _8000, int _a000, int _c000, int _e000) override; + +private: + size_t m_bankcount; + size_t m_activebank; +}; + + +// device type definition +DECLARE_DEVICE_TYPE(COLECOVISION_MEGACART, colecovision_megacart_cartridge_device) + + +#endif // MAME_BUS_COLECO_MEGACART_H