summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/msx/cart/softcard.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/msx/cart/softcard.cpp')
-rw-r--r--src/devices/bus/msx/cart/softcard.cpp92
1 files changed, 92 insertions, 0 deletions
diff --git a/src/devices/bus/msx/cart/softcard.cpp b/src/devices/bus/msx/cart/softcard.cpp
new file mode 100644
index 00000000000..5a42f004ead
--- /dev/null
+++ b/src/devices/bus/msx/cart/softcard.cpp
@@ -0,0 +1,92 @@
+// license:BSD-3-Clause
+// copyright-holders:Wilbert Pol
+/***********************************************************************************
+
+Emulation for the Electric Software Astron SoftCard Adaptor cartridge.
+
+This cartridge allows SoftCards to be used on an MSX system.
+
+***********************************************************************************/
+
+#include "emu.h"
+#include "softcard.h"
+#include "bus/msx/softcard/softcard.h"
+#include "softlist_dev.h"
+
+
+DEFINE_DEVICE_TYPE(MSX_CART_SOFTCARD, msx_cart_softcard_device, "msx_cart_softcard", "Electric Software Astron SoftCard Adaptor")
+
+
+msx_cart_softcard_device::msx_cart_softcard_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : device_t(mconfig, MSX_CART_SOFTCARD, tag, owner, clock)
+ , device_cartrom_image_interface(mconfig, *this)
+ , device_single_card_slot_interface<softcard_interface>(mconfig, *this)
+ , msx_cart_interface(mconfig, *this)
+{
+}
+
+void msx_cart_softcard_device::device_resolve_objects()
+{
+ m_softcard = get_card_device();
+ if (m_softcard)
+ {
+ m_softcard->set_views(page(0), page(1), page(2), page(3));
+ }
+}
+
+void msx_cart_softcard_device::device_add_mconfig(machine_config &config)
+{
+ softcard(*this);
+ SOFTWARE_LIST(config, "softcard_list").set_original("msx_softcard");
+}
+
+std::pair<std::error_condition, std::string> msx_cart_softcard_device::call_load()
+{
+ if (m_softcard)
+ {
+ if (loaded_through_softlist())
+ {
+ u32 const length = get_software_region_length("rom");
+ // Only 32KB images are supported
+ if (length != 0x8000)
+ return std::pair(image_error::BADSOFTWARE, "Invalid file size for a softcard (must be 32K)");
+ }
+ else
+ {
+ u32 const length = this->length();
+ // Only 32KB images are supported
+ if (length != 0x8000)
+ return std::pair(image_error::BADSOFTWARE, "Invalid file size for a softcard (must be 32K)");
+
+ memory_region *const romregion = machine().memory().region_alloc(subtag("rom"), length, 1, ENDIANNESS_LITTLE);
+ if (fread(romregion->base(), length) != length)
+ return std::make_pair(image_error::UNSPECIFIED, "Unable to fully read file");
+ }
+
+ std::string message;
+ std::error_condition result = m_softcard->initialize_cartridge(message);
+ return std::make_pair(result, message);
+ }
+ return std::make_pair(std::error_condition(), std::string());
+}
+
+std::string msx_cart_softcard_device::get_default_card_software(get_default_card_software_hook &hook) const
+{
+ return software_get_default_slot("nomapper");
+}
+
+
+softcard_interface::softcard_interface(const machine_config &mconfig, device_t &device)
+ : device_interface(device, "softcard")
+ , m_page{nullptr, nullptr, nullptr, nullptr}
+ , m_slot(dynamic_cast<msx_cart_softcard_device *>(device.owner()))
+{
+}
+
+void softcard_interface::set_views(memory_view::memory_view_entry *page0, memory_view::memory_view_entry *page1, memory_view::memory_view_entry *page2, memory_view::memory_view_entry *page3)
+{
+ m_page[0] = page0;
+ m_page[1] = page1;
+ m_page[2] = page2;
+ m_page[3] = page3;
+}