summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/spectrum/zxbus.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/spectrum/zxbus.cpp')
-rw-r--r--src/devices/bus/spectrum/zxbus.cpp94
1 files changed, 94 insertions, 0 deletions
diff --git a/src/devices/bus/spectrum/zxbus.cpp b/src/devices/bus/spectrum/zxbus.cpp
new file mode 100644
index 00000000000..ac5e83436dd
--- /dev/null
+++ b/src/devices/bus/spectrum/zxbus.cpp
@@ -0,0 +1,94 @@
+// license:BSD-3-Clause
+// copyright-holders:Andrei I. Holub
+/*******************************************************************************************
+
+ ZXBUS device
+
+*******************************************************************************************/
+
+#include "emu.h"
+#include "zxbus.h"
+
+DEFINE_DEVICE_TYPE(ZXBUS_SLOT, zxbus_slot_device, "zxbus_slot", "ZXBUS slot")
+
+zxbus_slot_device::zxbus_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : zxbus_slot_device(mconfig, ZXBUS_SLOT, tag, owner, clock)
+{
+}
+
+zxbus_slot_device::zxbus_slot_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock)
+ : device_t(mconfig, type, tag, owner, clock)
+ , device_single_card_slot_interface<device_zxbus_card_interface>(mconfig, *this)
+ , m_zxbus_bus(*this, finder_base::DUMMY_TAG)
+{
+}
+
+void zxbus_slot_device::device_start()
+{
+ device_zxbus_card_interface *const card(get_card_device());
+ if (card) card->set_zxbusbus(*m_zxbus_bus);
+
+ m_zxbus_bus->add_slot(*this);
+}
+
+DEFINE_DEVICE_TYPE(ZXBUS, zxbus_device, "zxbus", "ZXBUS bus")
+
+zxbus_device::zxbus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : zxbus_device(mconfig, ZXBUS, tag, owner, clock)
+{
+}
+
+zxbus_device::zxbus_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, type, tag, owner, clock)
+ , m_iospace(*this, finder_base::DUMMY_TAG, -1)
+ , m_shadow_io_view(nullptr)
+{
+}
+
+void zxbus_device::device_start()
+{
+}
+
+void zxbus_device::add_slot(zxbus_slot_device &slot)
+{
+ m_slot_list.push_front(&slot);
+ if (m_shadow_io_view)
+ {
+ device_zxbus_card_interface *dev = slot.get_card_device();
+ (*m_shadow_io_view).install_device(0x0000, 0xffff, *dev, &device_zxbus_card_interface::map_shadow_io);
+ }
+}
+
+device_zxbus_card_interface::device_zxbus_card_interface(const machine_config &mconfig, device_t &device)
+ : device_interface(device, "zxbus")
+ , m_zxbus(nullptr)
+{
+}
+
+void zxbus_device::install_shadow_io(memory_view::memory_view_entry &io_view)
+{
+ m_shadow_io_view = &io_view;
+}
+
+void device_zxbus_card_interface::interface_pre_start()
+{
+ if (!m_zxbus)
+ throw device_missing_dependencies();
+}
+
+
+#include "nemoide.h"
+#include "neogs.h"
+#include "smuc.h"
+
+void zxbus_cards(device_slot_interface &device)
+{
+ device.option_add("nemoide", ZXBUS_NEMOIDE);
+ device.option_add("neogs", ZXBUS_NEOGS);
+}
+
+void zxbus_gmx_cards(device_slot_interface &device)
+{
+ zxbus_cards(device);
+ device.option_add("smuc", ZXBUS_SMUC);
+}