1 // license:BSD-3-Clause
2 // copyright-holders:Ryan Holtz
3 /***************************************************************************
4 
5   gio64.h - SGI GIO64 slot bus and GIO64 device emulation
6 
7 ***************************************************************************/
8 
9 #ifndef MAME_BUS_GIO64_GIO64_H
10 #define MAME_BUS_GIO64_GIO64_H
11 
12 #pragma once
13 
14 class gio64_device;
15 
16 class gio64_slot_device : public device_t, public device_slot_interface
17 {
18 public:
19 	enum slot_type_t : uint32_t
20 	{
21 		GIO64_SLOT_GFX  = 0,
22 		GIO64_SLOT_EXP0 = 1,
23 		GIO64_SLOT_EXP1 = 2,
24 	};
25 
26 	// construction/destruction
27 	template <typename T, typename U>
gio64_slot_device(const machine_config & mconfig,const char * tag,device_t * owner,T && gio64_tag,slot_type_t slot_type,U && opts,const char * dflt)28 	gio64_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&gio64_tag, slot_type_t slot_type, U &&opts, const char *dflt)
29 		: gio64_slot_device(mconfig, tag, owner, (uint32_t)0, slot_type)
30 	{
31 		option_reset();
32 		opts(*this);
33 		set_default_option(dflt);
34 		set_fixed(false);
35 		m_gio64.set_tag(std::forward<T>(gio64_tag));
36 	}
37 	gio64_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, slot_type_t slot_type = GIO64_SLOT_EXP0);
38 
39 protected:
40 	// device-level overrides
41 	virtual void device_validity_check(validity_checker &valid) const override;
42 	virtual void device_resolve_objects() override;
43 	virtual void device_start() override;
44 
45 	// configuration
46 	required_device<gio64_device> m_gio64;
47 	slot_type_t const m_slot_type;
48 };
49 
DECLARE_DEVICE_TYPE(GIO64_SLOT,gio64_slot_device)50 DECLARE_DEVICE_TYPE(GIO64_SLOT, gio64_slot_device)
51 
52 
53 // class representing interface-specific live GIO64 card
54 class device_gio64_card_interface : public device_interface
55 {
56 	friend class gio64_device;
57 public:
58 	// construction/destruction
59 	virtual ~device_gio64_card_interface();
60 
61 	// inline configuration
62 	void set_gio64(gio64_device *gio64, gio64_slot_device::slot_type_t slot_type);
63 
64 	virtual void mem_map(address_map &map) = 0;
65 
66 protected:
67 	device_gio64_card_interface(const machine_config &mconfig, device_t &device);
68 
69 	virtual void interface_pre_start() override;
70 
71 	gio64_device *m_gio64;
72 };
73 
74 
75 class gio64_device : public device_t,
76 	public device_memory_interface
77 {
78 	friend class device_gio64_card_interface;
79 public:
80 	// construction/destruction
81 	template <typename T>
gio64_device(const machine_config & mconfig,const char * tag,device_t * owner,T && cpu_tag)82 	gio64_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&cpu_tag)
83 		: gio64_device(mconfig, tag, owner, (uint32_t)0)
84 	{
85 	}
86 
87 	gio64_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
88 
89 	// inline configuration
interrupt_cb()90 	template <int N> auto interrupt_cb() { return m_interrupt_cb[N].bind(); }
91 
92 	virtual space_config_vector memory_space_config() const override;
93 
94 	const address_space_config m_space_config;
95 
96 	device_gio64_card_interface *get_gio64_card(int slot);
97 
install_card(gio64_slot_device::slot_type_t slot_type,T & device,void (T::* map)(class address_map & map))98 	template<typename T> void install_card(gio64_slot_device::slot_type_t slot_type, T &device, void (T::*map)(class address_map &map))
99 	{
100 		m_device_list[slot_type] = &device;
101 
102 		switch (slot_type)
103 		{
104 		case gio64_slot_device::GIO64_SLOT_GFX:  space(0).install_device(0x000000, 0x3fffff, device, map); break;
105 		case gio64_slot_device::GIO64_SLOT_EXP0: space(0).install_device(0x400000, 0x5fffff, device, map); break;
106 		case gio64_slot_device::GIO64_SLOT_EXP1: space(0).install_device(0x600000, 0x9fffff, device, map); break;
107 		}
108 	}
109 
DECLARE_WRITE_LINE_MEMBER(interrupt)110 	template <int N> DECLARE_WRITE_LINE_MEMBER(interrupt) { m_interrupt_cb[N](state); }
111 
112 	u64 read(offs_t offset, u64 mem_mask);
113 	void write(offs_t offset, u64 data, u64 mem_mask);
114 
115 protected:
116 	gio64_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
117 
118 	// device-level overrides
119 	virtual void device_resolve_objects() override;
120 	virtual void device_start() override;
121 
122 	// internal state
123 	device_gio64_card_interface *m_device_list[3];
124 
125 private:
126 	devcb_write_line::array<3> m_interrupt_cb;
127 };
128 
129 DECLARE_DEVICE_TYPE(GIO64, gio64_device)
130 
131 
132 void gio64_cards(device_slot_interface &device);
133 
134 #endif // MAME_BUS_GIO_GIO_H
135