summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/sdk85/memexp.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/sdk85/memexp.cpp')
-rw-r--r--src/devices/bus/sdk85/memexp.cpp94
1 files changed, 94 insertions, 0 deletions
diff --git a/src/devices/bus/sdk85/memexp.cpp b/src/devices/bus/sdk85/memexp.cpp
new file mode 100644
index 00000000000..58a05e2fc88
--- /dev/null
+++ b/src/devices/bus/sdk85/memexp.cpp
@@ -0,0 +1,94 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/***************************************************************************
+
+ SDK-85 memory expansion (ALE-multiplexed)
+
+***************************************************************************/
+
+#include "emu.h"
+#include "memexp.h"
+
+#include "i8755.h"
+
+// device type definition
+DEFINE_DEVICE_TYPE(SDK85_ROMEXP, sdk85_romexp_device, "sdk85_romexp", "SDK-85 expansion ROM socket")
+
+sdk85_romexp_device::sdk85_romexp_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : device_t(mconfig, SDK85_ROMEXP, tag, owner, clock)
+ , device_rom_image_interface(mconfig, *this)
+ , device_single_card_slot_interface<device_sdk85_romexp_card_interface>(mconfig, *this)
+ , m_dev(nullptr)
+{
+}
+
+std::pair<std::error_condition, std::string> sdk85_romexp_device::call_load()
+{
+ if (get_card_device())
+ {
+ u32 const size = loaded_through_softlist() ? get_software_region_length("rom") : length();
+ u8 *const base = get_card_device()->get_rom_base(size);
+ if (!base)
+ return std::make_pair(image_error::INTERNAL, std::string());
+
+ if (loaded_through_softlist())
+ memcpy(base, get_software_region("rom"), size);
+ else
+ fread(base, size);
+ }
+
+ return std::make_pair(std::error_condition(), std::string());
+}
+
+std::string sdk85_romexp_device::get_default_card_software(get_default_card_software_hook &hook) const
+{
+ return software_get_default_slot("i8755");
+}
+
+void sdk85_romexp_device::device_start()
+{
+ m_dev = get_card_device();
+}
+
+u8 sdk85_romexp_device::memory_r(offs_t offset)
+{
+ if (m_dev != nullptr)
+ return m_dev->read_memory(offset);
+ else
+ return 0xff;
+}
+
+void sdk85_romexp_device::memory_w(offs_t offset, u8 data)
+{
+ if (m_dev != nullptr)
+ m_dev->write_memory(offset, data);
+}
+
+u8 sdk85_romexp_device::io_r(offs_t offset)
+{
+ if (m_dev != nullptr)
+ return m_dev->read_io(offset);
+ else
+ return 0xff;
+}
+
+void sdk85_romexp_device::io_w(offs_t offset, u8 data)
+{
+ if (m_dev != nullptr)
+ m_dev->write_io(offset, data);
+}
+
+void sdk85_romexp_device::rom_options(device_slot_interface &slot)
+{
+ slot.option_add_internal("i8755", SDK85_I8755);
+}
+
+device_sdk85_romexp_card_interface::device_sdk85_romexp_card_interface(const machine_config &mconfig, device_t &device)
+ : device_interface(device, "sdk85_romexp")
+{
+}
+
+u8 *device_sdk85_romexp_card_interface::get_rom_base(u32 size)
+{
+ return nullptr;
+}