diff options
Diffstat (limited to 'src/devices/bus/wangpc/wangpc.h')
-rw-r--r-- | src/devices/bus/wangpc/wangpc.h | 80 |
1 files changed, 37 insertions, 43 deletions
diff --git a/src/devices/bus/wangpc/wangpc.h b/src/devices/bus/wangpc/wangpc.h index bb8c7a3c4ac..4c9e4cc69a8 100644 --- a/src/devices/bus/wangpc/wangpc.h +++ b/src/devices/bus/wangpc/wangpc.h @@ -14,50 +14,49 @@ #pragma once +#include <functional> +#include <vector> //************************************************************************** -// CONSTANTS +// TYPE DEFINITIONS //************************************************************************** -#define WANGPC_BUS_TAG "wangpcbus" +class device_wangpcbus_card_interface; +class wangpcbus_device; -//************************************************************************** -// TYPE DEFINITIONS -//************************************************************************** - // ======================> wangpcbus_slot_device -class wangpcbus_device; - -class wangpcbus_slot_device : public device_t, public device_slot_interface +class wangpcbus_slot_device : public device_t, public device_single_card_slot_interface<device_wangpcbus_card_interface> { public: // construction/destruction - template <typename T> - wangpcbus_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt, int sid) + template <typename T, typename U> + wangpcbus_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&bus, U &&opts, char const *dflt, int sid) : wangpcbus_slot_device(mconfig, tag, owner, 0) { option_reset(); opts(*this); set_default_option(dflt); set_fixed(false); - set_wangpcbus_slot(sid); + set_bus(std::forward<T>(bus)); + set_bus_slot(sid); } wangpcbus_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); // inline configuration - void set_wangpcbus_slot(int sid) { m_sid = sid; } + template <typename T> void set_bus(T &&tag) { m_bus.set_tag(std::forward<T>(tag)); } + void set_bus_slot(int sid) { m_sid = sid; } protected: - // device-level overrides - virtual void device_start() override; + // device_t implementation + virtual void device_start() override ATTR_COLD; private: // configuration - wangpcbus_device *m_bus; + required_device<wangpcbus_device> m_bus; int m_sid; }; @@ -66,9 +65,6 @@ private: DECLARE_DEVICE_TYPE(WANGPC_BUS_SLOT, wangpcbus_slot_device) -class device_wangpcbus_card_interface; - - // ======================> wangpcbus_device class wangpcbus_device : public device_t @@ -76,7 +72,7 @@ class wangpcbus_device : public device_t public: // construction/destruction wangpcbus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - ~wangpcbus_device() { m_device_list.detach_all(); } + ~wangpcbus_device(); auto irq2_wr_callback() { return m_write_irq2.bind(); } auto irq3_wr_callback() { return m_write_irq3.bind(); } @@ -89,7 +85,7 @@ public: auto drq3_wr_callback() { return m_write_drq3.bind(); } auto ioerror_wr_callback() { return m_write_ioerror.bind(); } - void add_card(device_wangpcbus_card_interface *card, int sid); + void add_card(device_wangpcbus_card_interface &card, int sid); // computer interface uint16_t mrdc_r(offs_t offset, uint16_t mem_mask = 0xffff); @@ -110,25 +106,27 @@ public: uint8_t dack3_r() { return dack_r(3); } void dack3_w(uint8_t data) { dack_w(3, data); } - DECLARE_WRITE_LINE_MEMBER( tc_w ); + void tc_w(int state); // peripheral interface - DECLARE_WRITE_LINE_MEMBER( irq2_w ) { m_write_irq2(state); } - DECLARE_WRITE_LINE_MEMBER( irq3_w ) { m_write_irq3(state); } - DECLARE_WRITE_LINE_MEMBER( irq4_w ) { m_write_irq4(state); } - DECLARE_WRITE_LINE_MEMBER( irq5_w ) { m_write_irq5(state); } - DECLARE_WRITE_LINE_MEMBER( irq6_w ) { m_write_irq6(state); } - DECLARE_WRITE_LINE_MEMBER( irq7_w ) { m_write_irq7(state); } - DECLARE_WRITE_LINE_MEMBER( drq1_w ) { m_write_drq1(state); } - DECLARE_WRITE_LINE_MEMBER( drq2_w ) { m_write_drq2(state); } - DECLARE_WRITE_LINE_MEMBER( drq3_w ) { m_write_drq3(state); } - DECLARE_WRITE_LINE_MEMBER( ioerror_w ) { m_write_ioerror(state); } + void irq2_w(int state) { m_write_irq2(state); } + void irq3_w(int state) { m_write_irq3(state); } + void irq4_w(int state) { m_write_irq4(state); } + void irq5_w(int state) { m_write_irq5(state); } + void irq6_w(int state) { m_write_irq6(state); } + void irq7_w(int state) { m_write_irq7(state); } + void drq1_w(int state) { m_write_drq1(state); } + void drq2_w(int state) { m_write_drq2(state); } + void drq3_w(int state) { m_write_drq3(state); } + void ioerror_w(int state) { m_write_ioerror(state); } protected: - // device-level overrides - virtual void device_start() override; + // devicedevice_t implementation + virtual void device_start() override ATTR_COLD; private: + using card_vector = std::vector<std::reference_wrapper<device_wangpcbus_card_interface> >; + devcb_write_line m_write_irq2; devcb_write_line m_write_irq3; devcb_write_line m_write_irq4; @@ -140,7 +138,7 @@ private: devcb_write_line m_write_drq3; devcb_write_line m_write_ioerror; - simple_list<device_wangpcbus_card_interface> m_device_list; + card_vector m_device_list; }; @@ -151,14 +149,11 @@ DECLARE_DEVICE_TYPE(WANGPC_BUS, wangpcbus_device) // ======================> device_wangpcbus_card_interface // class representing interface-specific live wangpcbus card -class device_wangpcbus_card_interface : public device_slot_card_interface +class device_wangpcbus_card_interface : public device_interface { friend class wangpcbus_device; - template <class ElementType> friend class simple_list; public: - device_wangpcbus_card_interface *next() const { return m_next; } - // memory access virtual uint16_t wangpcbus_mrdc_r(offs_t offset, uint16_t mem_mask) { return 0; } virtual void wangpcbus_amwc_w(offs_t offset, uint16_t mem_mask, uint16_t data) { } @@ -178,13 +173,12 @@ protected: // construction/destruction device_wangpcbus_card_interface(const machine_config &mconfig, device_t &device); + virtual void interface_pre_start() override; + wangpcbus_device *m_bus; - wangpcbus_slot_device *m_slot; + wangpcbus_slot_device *const m_slot; int m_sid; - -private: - device_wangpcbus_card_interface *m_next; }; |