summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/multibus/multibus.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/multibus/multibus.cpp')
-rw-r--r--src/devices/bus/multibus/multibus.cpp86
1 files changed, 51 insertions, 35 deletions
diff --git a/src/devices/bus/multibus/multibus.cpp b/src/devices/bus/multibus/multibus.cpp
index 0bf13449394..6f08efb58b4 100644
--- a/src/devices/bus/multibus/multibus.cpp
+++ b/src/devices/bus/multibus/multibus.cpp
@@ -8,66 +8,82 @@
*********************************************************************/
+/*
+ * TODO:
+ * - shared interrupts
+ * - vectored and non-vectored irq acknowledge
+ * - inhibit lines
+ * - lock/unlock
+ * - bus arbitration/priority
+ */
+
#include "emu.h"
#include "multibus.h"
-#include "isbc202.h"
// device type definition
+DEFINE_DEVICE_TYPE(MULTIBUS, multibus_device, "multibus", "Intel Multibus")
DEFINE_DEVICE_TYPE(MULTIBUS_SLOT, multibus_slot_device, "multibus_slot", "Intel Multibus slot")
-multibus_slot_device::multibus_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : device_t(mconfig , MULTIBUS_SLOT , tag , owner , clock)
- , device_single_card_slot_interface<device_multibus_interface>(mconfig , *this)
- , m_irq_cb(*this)
- , m_irqa_cb(*this)
+multibus_device::multibus_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock)
+ : device_t(mconfig, MULTIBUS, tag, owner, clock)
+ , device_memory_interface(mconfig, *this)
+ , m_mem_config("mem", ENDIANNESS_LITTLE, 16, 24)
+ , m_pio_config("pio", ENDIANNESS_LITTLE, 16, 16)
+ , m_int_cb(*this)
+ , m_xack_cb(*this)
{
- option_reset();
- option_add("isbc202" , ISBC202);
- set_default_option(nullptr);
- set_fixed(false);
}
-multibus_slot_device::~multibus_slot_device()
+device_memory_interface::space_config_vector multibus_device::memory_space_config() const
{
+ return space_config_vector { std::make_pair(AS_PROGRAM, &m_mem_config), std::make_pair(AS_IO, &m_pio_config) };
}
-void multibus_slot_device::install_io_rw(address_space& space)
+void multibus_device::device_start()
{
- device_multibus_interface *card = get_card_device();
- if (card) {
- card->install_io_rw(space);
- }
}
-void multibus_slot_device::install_mem_rw(address_space& space)
+multibus_slot_device::multibus_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock)
+ : device_t(mconfig, MULTIBUS_SLOT, tag, owner, clock)
+ , device_slot_interface(mconfig, *this)
+ , m_bus(*this, finder_base::DUMMY_TAG)
{
- device_multibus_interface *card = get_card_device();
- if (card) {
- card->install_mem_rw(space);
- }
}
void multibus_slot_device::device_start()
{
- m_irq_cb.resolve_all_safe();
- m_irqa_cb.resolve_safe();
}
-device_multibus_interface::device_multibus_interface(const machine_config &mconfig , device_t &device)
- : device_interface(device , "multibus")
+void multibus_slot_device::device_resolve_objects()
+{
+ device_multibus_interface *const card(dynamic_cast<device_multibus_interface *>(get_card_device()));
+
+ if (card)
+ card->set_bus_device(*m_bus);
+}
+
+device_multibus_interface::device_multibus_interface(machine_config const &mconfig, device_t &device)
+ : device_interface(device, "multibus")
+ , m_bus(nullptr)
{
}
-device_multibus_interface::~device_multibus_interface()
+void device_multibus_interface::set_bus_device(multibus_device &bus_device)
{
+ m_bus = &bus_device;
}
-WRITE_LINE_MEMBER( multibus_slot_device::irq0_w ) { m_irq_cb[0](state); }
-WRITE_LINE_MEMBER( multibus_slot_device::irq1_w ) { m_irq_cb[1](state); }
-WRITE_LINE_MEMBER( multibus_slot_device::irq2_w ) { m_irq_cb[2](state); }
-WRITE_LINE_MEMBER( multibus_slot_device::irq3_w ) { m_irq_cb[3](state); }
-WRITE_LINE_MEMBER( multibus_slot_device::irq4_w ) { m_irq_cb[4](state); }
-WRITE_LINE_MEMBER( multibus_slot_device::irq5_w ) { m_irq_cb[5](state); }
-WRITE_LINE_MEMBER( multibus_slot_device::irq6_w ) { m_irq_cb[6](state); }
-WRITE_LINE_MEMBER( multibus_slot_device::irq7_w ) { m_irq_cb[7](state); }
-WRITE_LINE_MEMBER( multibus_slot_device::irqa_w ) { m_irqa_cb(state); }
+void device_multibus_interface::int_w(unsigned number, int state)
+{
+ switch (number)
+ {
+ case 0: int_w<0>(state); break;
+ case 1: int_w<1>(state); break;
+ case 2: int_w<2>(state); break;
+ case 3: int_w<3>(state); break;
+ case 4: int_w<4>(state); break;
+ case 5: int_w<5>(state); break;
+ case 6: int_w<6>(state); break;
+ case 7: int_w<7>(state); break;
+ }
+}