summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/qbus/qbus.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/qbus/qbus.h')
-rw-r--r--src/devices/bus/qbus/qbus.h162
1 files changed, 162 insertions, 0 deletions
diff --git a/src/devices/bus/qbus/qbus.h b/src/devices/bus/qbus/qbus.h
new file mode 100644
index 00000000000..ae6248c6a40
--- /dev/null
+++ b/src/devices/bus/qbus/qbus.h
@@ -0,0 +1,162 @@
+// license:BSD-3-Clause
+// copyright-holders:Sergey Svishchev
+/**********************************************************************
+
+ DEC Q-Bus emulation (skeleton)
+
+**********************************************************************/
+
+#ifndef MAME_BUS_QBUS_QBUS_H
+#define MAME_BUS_QBUS_QBUS_H
+
+#pragma once
+
+#include "machine/z80daisy.h"
+
+#include <functional>
+#include <vector>
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+class qbus_device;
+
+// ======================> device_qbus_card_interface
+
+class device_qbus_card_interface : public device_interface
+{
+ friend class qbus_device;
+
+public:
+ // Q-Bus interface
+ virtual void biaki_w(int state) { }
+ virtual void bdmgi_w(int state) { }
+
+protected:
+ // construction/destruction
+ device_qbus_card_interface(const machine_config &mconfig, device_t &device);
+
+ virtual int z80daisy_irq_state() { return 0; }
+ virtual int z80daisy_irq_ack() { return -1; }
+ virtual void z80daisy_irq_reti() { }
+
+ qbus_device *m_bus;
+};
+
+
+
+// ======================> qbus_device
+
+class qbus_device : public device_t,
+ public device_memory_interface,
+ public device_z80daisy_interface
+{
+public:
+ // construction/destruction
+ template <typename T>
+ qbus_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&cputag, int spacenum)
+ : qbus_device(mconfig, tag, owner, (uint32_t)0)
+ {
+ set_cputag(std::forward<T>(cputag), spacenum);
+ }
+
+ qbus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ ~qbus_device();
+
+ // inline configuration
+ template <typename T> void set_space(T &&tag, int spacenum) { m_space.set_tag(std::forward<T>(tag), spacenum); }
+
+ virtual space_config_vector memory_space_config() const override;
+
+ auto birq4() { return m_out_birq4_cb.bind(); }
+ auto birq5() { return m_out_birq6_cb.bind(); }
+ auto birq6() { return m_out_birq6_cb.bind(); }
+ auto birq7() { return m_out_birq7_cb.bind(); }
+
+ void add_card(device_qbus_card_interface &card);
+ void install_device(offs_t start, offs_t end, read16sm_delegate rhandler, write16sm_delegate whandler, uint32_t mask=0xffffffff);
+
+ void birq4_w(int state) { m_out_birq4_cb(state); }
+ void birq5_w(int state) { m_out_birq5_cb(state); }
+ void birq6_w(int state) { m_out_birq6_cb(state); }
+ void birq7_w(int state) { m_out_birq7_cb(state); }
+
+ void bdmr_w(int state) { m_out_bdmr_cb(state); }
+
+ const address_space_config m_program_config;
+
+protected:
+ // device_t implementation
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ // device_z80daisy_interface implementation
+ virtual int z80daisy_irq_state() override;
+ virtual int z80daisy_irq_ack() override;
+ virtual void z80daisy_irq_reti() override;
+
+ // internal state
+ required_address_space m_space;
+
+private:
+ using card_vector = std::vector<std::reference_wrapper<device_qbus_card_interface> >;
+
+ devcb_write_line m_out_birq4_cb;
+ devcb_write_line m_out_birq5_cb;
+ devcb_write_line m_out_birq6_cb;
+ devcb_write_line m_out_birq7_cb;
+ devcb_write_line m_out_bdmr_cb;
+
+ card_vector m_device_list;
+};
+
+
+// ======================> qbus_slot_device
+
+class qbus_slot_device : public device_t, public device_slot_interface
+{
+public:
+ // construction/destruction
+ template <typename T>
+ qbus_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt)
+ : qbus_slot_device(mconfig, tag, owner, DERIVED_CLOCK(1, 1))
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
+ qbus_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ // computer interface
+ void biaki_w(int state) { if (m_card) m_card->biaki_w(state); }
+ void bdmgi_w(int state) { if (m_card) m_card->bdmgi_w(state); }
+
+protected:
+ // device_t implementation
+ virtual void device_start() override;
+ virtual void device_reset() override { if (m_card) get_card_device()->reset(); }
+
+ devcb_write_line m_write_birq4;
+ devcb_write_line m_write_birq5;
+ devcb_write_line m_write_birq6;
+ devcb_write_line m_write_birq7;
+ devcb_write_line m_write_bdmr;
+
+ device_qbus_card_interface *m_card;
+
+private:
+ required_device<qbus_device> m_bus;
+};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(QBUS, qbus_device)
+DECLARE_DEVICE_TYPE(QBUS_SLOT, qbus_slot_device)
+
+void qbus_cards(device_slot_interface &device);
+
+#endif // MAME_BUS_QBUS_QBUS_H