summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/gio64/gio64.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/gio64/gio64.h')
-rw-r--r--src/devices/bus/gio64/gio64.h62
1 files changed, 16 insertions, 46 deletions
diff --git a/src/devices/bus/gio64/gio64.h b/src/devices/bus/gio64/gio64.h
index 421fa2bf75d..8419b8adc3f 100644
--- a/src/devices/bus/gio64/gio64.h
+++ b/src/devices/bus/gio64/gio64.h
@@ -11,8 +11,6 @@
#pragma once
-#include "cpu/mips/r4000.h"
-
class gio64_device;
class gio64_slot_device : public device_t, public device_slot_interface
@@ -20,11 +18,9 @@ class gio64_slot_device : public device_t, public device_slot_interface
public:
enum slot_type_t : uint32_t
{
- GIO64_SLOT_GFX,
- GIO64_SLOT_EXP0,
- GIO64_SLOT_EXP1,
-
- GIO64_SLOT_COUNT
+ GIO64_SLOT_GFX = 0,
+ GIO64_SLOT_EXP0 = 1,
+ GIO64_SLOT_EXP1 = 2,
};
// construction/destruction
@@ -37,13 +33,10 @@ public:
set_default_option(dflt);
set_fixed(false);
m_gio64.set_tag(std::forward<T>(gio64_tag));
- m_slot_type = slot_type;
}
- gio64_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ gio64_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, slot_type_t slot_type = GIO64_SLOT_EXP0);
protected:
- gio64_slot_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
-
// device-level overrides
virtual void device_validity_check(validity_checker &valid) const override;
virtual void device_resolve_objects() override;
@@ -51,7 +44,7 @@ protected:
// configuration
required_device<gio64_device> m_gio64;
- slot_type_t m_slot_type;
+ slot_type_t const m_slot_type;
DECLARE_READ32_MEMBER(timeout_r);
DECLARE_WRITE32_MEMBER(timeout_w);
@@ -76,16 +69,9 @@ public:
protected:
device_gio64_card_interface(const machine_config &mconfig, device_t &device);
- virtual void interface_validity_check(validity_checker &valid) const override;
virtual void interface_pre_start() override;
- virtual void interface_post_start() override;
- virtual void install_device() = 0;
-
- gio64_device &gio64() { assert(m_gio64); return *m_gio64; }
gio64_device *m_gio64;
- const char *m_gio64_slottag;
- gio64_slot_device::slot_type_t m_slot_type;
};
@@ -99,41 +85,35 @@ public:
gio64_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&cpu_tag)
: gio64_device(mconfig, tag, owner, (uint32_t)0)
{
- set_cpu_tag(std::forward<T>(cpu_tag));
}
gio64_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// inline configuration
- template <typename T> void set_cpu_tag(T &&tag) { m_maincpu.set_tag(std::forward<T>(tag)); }
template <int N> auto interrupt_cb() { return m_interrupt_cb[N].bind(); }
virtual space_config_vector memory_space_config() const override;
const address_space_config m_space_config;
- void add_gio64_card(gio64_slot_device::slot_type_t slot_type, device_gio64_card_interface *card);
device_gio64_card_interface *get_gio64_card(int slot);
- template<typename T> void install_graphics(T &device, void (T::*map)(class address_map &map), uint64_t unitmask = ~u64(0))
+ template<typename T> void install_card(gio64_slot_device::slot_type_t slot_type, T &device, void (T::*map)(class address_map &map))
{
- m_space->install_device(0x000000, 0x3fffff, device, map, unitmask);
- }
-
- template<typename T> void install_expansion(int index, T &device, void (T::*map)(class address_map &map), uint64_t unitmask = ~u64(0))
- {
- if (index == 0)
- m_space->install_device(0x400000, 0x5fffff, device, map, unitmask);
- else if (index == 1)
- m_space->install_device(0x600000, 0x9fffff, device, map, unitmask);
- else
- fatalerror("Invalid SGI GIO64 expansion slot index: %d\n", index);
+ m_device_list[slot_type] = &device;
+
+ switch (slot_type)
+ {
+ case gio64_slot_device::GIO64_SLOT_GFX: space(0).install_device(0x000000, 0x3fffff, device, map); break;
+ case gio64_slot_device::GIO64_SLOT_EXP0: space(0).install_device(0x400000, 0x5fffff, device, map); break;
+ case gio64_slot_device::GIO64_SLOT_EXP1: space(0).install_device(0x600000, 0x9fffff, device, map); break;
+ }
}
template <int N> DECLARE_WRITE_LINE_MEMBER(interrupt) { m_interrupt_cb[N](state); }
- DECLARE_READ64_MEMBER(read);
- DECLARE_WRITE64_MEMBER(write);
+ u64 read(offs_t offset, u64 mem_mask);
+ void write(offs_t offset, u64 data, u64 mem_mask);
protected:
gio64_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
@@ -143,20 +123,10 @@ protected:
virtual void device_start() override;
// internal state
- required_device<r4000_base_device> m_maincpu;
- address_space *m_space;
-
device_gio64_card_interface *m_device_list[3];
private:
devcb_write_line::array<3> m_interrupt_cb;
-
- DECLARE_READ64_MEMBER(no_gfx_r);
- DECLARE_READ64_MEMBER(no_exp0_r);
- DECLARE_READ64_MEMBER(no_exp1_r);
- DECLARE_WRITE64_MEMBER(no_gfx_w);
- DECLARE_WRITE64_MEMBER(no_exp0_w);
- DECLARE_WRITE64_MEMBER(no_exp1_w);
};
DECLARE_DEVICE_TYPE(GIO64, gio64_device)