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