summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author AJR <ajrhacker@users.noreply.github.com>2019-05-29 16:57:34 -0400
committer AJR <ajrhacker@users.noreply.github.com>2019-05-29 16:57:34 -0400
commit1de17bc02513a08285ea6cdd1bf3c9a04793d23f (patch)
treeab58089dc27b5efc05cb654bcf5f3b92d4210cb1
parentb6301261370ecd5c7221dd3144f5ad51af49dff9 (diff)
gio64: Get rid of strcmp hacks; decouple interrupts from HPC3 device (nw)
-rw-r--r--src/devices/bus/gio64/gio64.cpp42
-rw-r--r--src/devices/bus/gio64/gio64.h42
-rw-r--r--src/devices/bus/gio64/newport.cpp4
-rw-r--r--src/mame/drivers/indy_indigo2.cpp11
-rw-r--r--src/mame/machine/hpc3.cpp24
-rw-r--r--src/mame/machine/hpc3.h4
6 files changed, 79 insertions, 48 deletions
diff --git a/src/devices/bus/gio64/gio64.cpp b/src/devices/bus/gio64/gio64.cpp
index 179debbc658..20caf53124b 100644
--- a/src/devices/bus/gio64/gio64.cpp
+++ b/src/devices/bus/gio64/gio64.cpp
@@ -30,11 +30,15 @@ gio64_slot_device::gio64_slot_device(const machine_config &mconfig, device_type
: device_t(mconfig, type, tag, owner, clock)
, device_slot_interface(mconfig, *this)
, m_gio64(*this, finder_base::DUMMY_TAG)
+ , m_slot_type(GIO64_SLOT_COUNT)
{
}
void gio64_slot_device::device_validity_check(validity_checker &valid) const
{
+ if (m_slot_type == GIO64_SLOT_COUNT)
+ osd_printf_error("Slot type not defined\n");
+
device_t *const card(get_card_device());
if (card && !dynamic_cast<device_gio64_card_interface *>(card))
osd_printf_error("Card device %s (%s) does not implement device_gio64_card_interface\n", card->tag(), card->name());
@@ -44,7 +48,7 @@ void gio64_slot_device::device_resolve_objects()
{
device_gio64_card_interface *const gio64_card(dynamic_cast<device_gio64_card_interface *>(get_card_device()));
if (gio64_card)
- gio64_card->set_gio64(m_gio64, tag());
+ gio64_card->set_gio64(m_gio64, m_slot_type);
}
void gio64_slot_device::device_start()
@@ -74,12 +78,14 @@ gio64_device::gio64_device(const machine_config &mconfig, device_type type, cons
, device_memory_interface(mconfig, *this)
, m_space_config("GIO64 Space", ENDIANNESS_BIG, 64, 32, 0, address_map_constructor())
, m_maincpu(*this, finder_base::DUMMY_TAG)
- , m_hpc3(*this, finder_base::DUMMY_TAG)
+ , m_interrupt_cb{{*this}, {*this}, {*this}}
{
}
void gio64_device::device_resolve_objects()
{
+ for (auto &cb : m_interrupt_cb)
+ cb.resolve_safe();
}
void gio64_device::device_start()
@@ -124,8 +130,9 @@ device_gio64_card_interface *gio64_device::get_gio64_card(int slot)
return nullptr;
}
-void gio64_device::add_gio64_card(device_gio64_card_interface::gio64_slot_type_t slot_type, device_gio64_card_interface *card)
+void gio64_device::add_gio64_card(gio64_slot_device::slot_type_t slot_type, device_gio64_card_interface *card)
{
+ assert(slot_type >= 0 && slot_type < gio64_slot_device::GIO64_SLOT_COUNT);
m_device_list[slot_type] = card;
card->install_device();
}
@@ -136,7 +143,7 @@ device_gio64_card_interface::device_gio64_card_interface(const machine_config &m
: device_slot_card_interface(mconfig, device)
, m_gio64(nullptr)
, m_gio64_slottag(nullptr)
- , m_slot_type(GIO64_SLOT_COUNT)
+ , m_slot_type(gio64_slot_device::GIO64_SLOT_COUNT)
{
}
@@ -157,26 +164,17 @@ void device_gio64_card_interface::interface_pre_start()
fatalerror("Can't find SGI GIO64 device\n");
}
- if (GIO64_SLOT_COUNT == m_slot_type)
- {
- if (!m_gio64->started())
- throw device_missing_dependencies();
-
- if (strcmp(m_gio64_slottag, ":gio64_gfx") == 0)
- m_slot_type = GIO64_SLOT_GFX;
- else if (strcmp(m_gio64_slottag, ":gio64_exp0") == 0)
- m_slot_type = GIO64_SLOT_EXP0;
- else if (strcmp(m_gio64_slottag, ":gio64_exp1") == 0)
- m_slot_type = GIO64_SLOT_EXP1;
- else
- fatalerror("Slot %s incorrectly named for SGI GIO64 graphics slot\n", m_gio64_slottag);
-
- m_gio64->add_gio64_card(m_slot_type, this);
- }
+ if (!m_gio64->started())
+ throw device_missing_dependencies();
+}
+
+void device_gio64_card_interface::interface_post_start()
+{
+ m_gio64->add_gio64_card(m_slot_type, this);
}
-void device_gio64_card_interface::set_gio64(gio64_device *gio64, const char *slottag)
+void device_gio64_card_interface::set_gio64(gio64_device *gio64, gio64_slot_device::slot_type_t slot_type)
{
m_gio64 = gio64;
- m_gio64_slottag = slottag;
+ m_slot_type = slot_type;
}
diff --git a/src/devices/bus/gio64/gio64.h b/src/devices/bus/gio64/gio64.h
index 9cbea5a3ab1..dd2c77aefc6 100644
--- a/src/devices/bus/gio64/gio64.h
+++ b/src/devices/bus/gio64/gio64.h
@@ -12,16 +12,24 @@
#pragma once
#include "cpu/mips/r4000.h"
-#include "machine/hpc3.h"
class gio64_device;
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
+ };
+
// construction/destruction
template <typename T, typename U>
- gio64_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&gio64_tag, U &&opts, const char *dflt)
+ 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)
: gio64_slot_device(mconfig, tag, owner, (uint32_t)0)
{
option_reset();
@@ -29,6 +37,7 @@ 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);
@@ -42,6 +51,7 @@ protected:
// configuration
required_device<gio64_device> m_gio64;
+ slot_type_t m_slot_type;
DECLARE_READ32_MEMBER(timeout_r);
DECLARE_WRITE32_MEMBER(timeout_w);
@@ -59,31 +69,23 @@ public:
virtual ~device_gio64_card_interface();
// inline configuration
- void set_gio64(gio64_device *gio64, const char *slottag);
+ void set_gio64(gio64_device *gio64, gio64_slot_device::slot_type_t slot_type);
virtual void mem_map(address_map &map) = 0;
protected:
device_gio64_card_interface(const machine_config &mconfig, device_t &device);
- enum gio64_slot_type_t : uint32_t
- {
- GIO64_SLOT_GFX,
- GIO64_SLOT_EXP0,
- GIO64_SLOT_EXP1,
-
- GIO64_SLOT_COUNT
- };
-
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_type_t m_slot_type;
+ gio64_slot_device::slot_type_t m_slot_type;
};
@@ -93,25 +95,24 @@ class gio64_device : public device_t,
friend class device_gio64_card_interface;
public:
// construction/destruction
- template <typename T, typename U>
- gio64_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&cpu_tag, U &&hpc3_tag)
+ template <typename T>
+ 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));
- set_hpc3_tag(std::forward<U>(hpc3_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 <typename T> void set_hpc3_tag(T &&tag) { m_hpc3.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(device_gio64_card_interface::gio64_slot_type_t slot_type, device_gio64_card_interface *card);
+ 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))
@@ -129,7 +130,7 @@ public:
fatalerror("Invalid SGI GIO64 expansion slot index: %d\n", index);
}
- hpc3_base_device* get_hpc3() { return m_hpc3.target(); }
+ template <int N> DECLARE_WRITE_LINE_MEMBER(interrupt) { m_interrupt_cb[N](state); }
DECLARE_READ64_MEMBER(read);
DECLARE_WRITE64_MEMBER(write);
@@ -143,12 +144,13 @@ protected:
// internal state
required_device<r4000_base_device> m_maincpu;
- required_device<hpc3_base_device> m_hpc3;
address_space *m_space;
device_gio64_card_interface *m_device_list[3];
private:
+ devcb_write_line m_interrupt_cb[3];
+
DECLARE_READ64_MEMBER(no_gfx_r);
DECLARE_READ64_MEMBER(no_exp0_r);
DECLARE_READ64_MEMBER(no_exp1_r);
diff --git a/src/devices/bus/gio64/newport.cpp b/src/devices/bus/gio64/newport.cpp
index 6a564fb11cd..0ba2b129f7f 100644
--- a/src/devices/bus/gio64/newport.cpp
+++ b/src/devices/bus/gio64/newport.cpp
@@ -1348,7 +1348,7 @@ WRITE_LINE_MEMBER(newport_base_device::vblank_w)
if (BIT(m_vc2.m_display_ctrl, 0))
{
m_rex3.m_status |= STATUS_VRINT;
- m_gio64->get_hpc3()->raise_local_irq(1, ioc2_device::INT3_LOCAL1_RETRACE);
+ m_gio64->interrupt<2>(ASSERT_LINE);
}
}
}
@@ -1784,7 +1784,7 @@ READ64_MEMBER(newport_base_device::rex3_r)
LOGMASKED(LOG_REX3, "REX3 Status Read: %08x\n", m_rex3.m_status);
uint32_t old_status = m_rex3.m_status;
m_rex3.m_status &= ~STATUS_VRINT;
- m_gio64->get_hpc3()->lower_local_irq(1, ioc2_device::INT3_LOCAL1_RETRACE);
+ m_gio64->interrupt<2>(CLEAR_LINE);
ret |= (uint64_t)(old_status | 3) << 32;
}
if (ACCESSING_BITS_0_31)
diff --git a/src/mame/drivers/indy_indigo2.cpp b/src/mame/drivers/indy_indigo2.cpp
index 95e96d94298..fab987cabef 100644
--- a/src/mame/drivers/indy_indigo2.cpp
+++ b/src/mame/drivers/indy_indigo2.cpp
@@ -245,10 +245,13 @@ void ip22_state::ip22_base(machine_config &config)
NSCSI_CONNECTOR(config, "scsibus:7", scsi_devices, nullptr, false);
// GIO64
- GIO64(config, m_gio64, m_maincpu, m_hpc3);
- GIO64_SLOT(config, m_gio64_gfx, m_gio64, gio64_cards, "xl24");
- GIO64_SLOT(config, m_gio64_exp0, m_gio64, gio64_cards, nullptr);
- GIO64_SLOT(config, m_gio64_exp1, m_gio64, gio64_cards, nullptr);
+ GIO64(config, m_gio64, m_maincpu);
+ m_gio64->interrupt_cb<0>().set(m_hpc3, FUNC(hpc3_base_device::gio_int0));
+ m_gio64->interrupt_cb<1>().set(m_hpc3, FUNC(hpc3_base_device::gio_int1));
+ m_gio64->interrupt_cb<2>().set(m_hpc3, FUNC(hpc3_base_device::gio_int2));
+ GIO64_SLOT(config, m_gio64_gfx, m_gio64, gio64_slot_device::GIO64_SLOT_GFX, gio64_cards, "xl24");
+ GIO64_SLOT(config, m_gio64_exp0, m_gio64, gio64_slot_device::GIO64_SLOT_EXP0, gio64_cards, nullptr);
+ GIO64_SLOT(config, m_gio64_exp1, m_gio64, gio64_slot_device::GIO64_SLOT_EXP1, gio64_cards, nullptr);
}
void ip22_state::ip225015(machine_config &config)
diff --git a/src/mame/machine/hpc3.cpp b/src/mame/machine/hpc3.cpp
index aa866bd29e4..e682b0d5c60 100644
--- a/src/mame/machine/hpc3.cpp
+++ b/src/mame/machine/hpc3.cpp
@@ -1055,3 +1055,27 @@ WRITE32_MEMBER(hpc3_base_device::eeprom_w)
m_eeprom->cs_write(BIT(data, 1));
m_eeprom->clk_write(BIT(data, 2));
}
+
+WRITE_LINE_MEMBER(hpc3_base_device::gio_int0)
+{
+ if (state == ASSERT_LINE)
+ raise_local_irq(0, ioc2_device::INT3_LOCAL0_FIFO);
+ else
+ lower_local_irq(0, ioc2_device::INT3_LOCAL0_FIFO);
+}
+
+WRITE_LINE_MEMBER(hpc3_base_device::gio_int1)
+{
+ if (state == ASSERT_LINE)
+ raise_local_irq(0, ioc2_device::INT3_LOCAL0_GRAPHICS);
+ else
+ lower_local_irq(0, ioc2_device::INT3_LOCAL0_GRAPHICS);
+}
+
+WRITE_LINE_MEMBER(hpc3_base_device::gio_int2)
+{
+ if (state == ASSERT_LINE)
+ raise_local_irq(1, ioc2_device::INT3_LOCAL1_RETRACE);
+ else
+ lower_local_irq(1, ioc2_device::INT3_LOCAL1_RETRACE);
+}
diff --git a/src/mame/machine/hpc3.h b/src/mame/machine/hpc3.h
index 5b10a724be5..ca1e0197aad 100644
--- a/src/mame/machine/hpc3.h
+++ b/src/mame/machine/hpc3.h
@@ -36,6 +36,10 @@ public:
DECLARE_WRITE_LINE_MEMBER(scsi1_irq);
DECLARE_WRITE_LINE_MEMBER(scsi1_drq);
+ DECLARE_WRITE_LINE_MEMBER(gio_int0);
+ DECLARE_WRITE_LINE_MEMBER(gio_int1);
+ DECLARE_WRITE_LINE_MEMBER(gio_int2);
+
protected:
hpc3_base_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);