diff options
Diffstat (limited to 'src/devices/bus/multibus/multibus.cpp')
-rw-r--r-- | src/devices/bus/multibus/multibus.cpp | 86 |
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; + } +} |