summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Dirk Best <mail@dirk-best.de>2015-06-10 09:59:15 +0200
committer Dirk Best <mail@dirk-best.de>2015-06-10 10:12:02 +0200
commit58e21376c9cc831b923196e00037e5048279c646 (patch)
tree83d322870b04474154181f9a22770b5b07ed8b70
parent9de83ac835aaf4d0212a3aa9859c5b0f61a72f76 (diff)
apricot: fix iop ram access with expansion cards
-rw-r--r--src/emu/bus/apricot/expansion.c34
-rw-r--r--src/emu/bus/apricot/expansion.h18
-rw-r--r--src/emu/bus/apricot/ram.c10
-rw-r--r--src/mess/drivers/apricot.c1
4 files changed, 50 insertions, 13 deletions
diff --git a/src/emu/bus/apricot/expansion.c b/src/emu/bus/apricot/expansion.c
index 26b18e0a551..7fe2b2a721c 100644
--- a/src/emu/bus/apricot/expansion.c
+++ b/src/emu/bus/apricot/expansion.c
@@ -62,6 +62,8 @@ apricot_expansion_bus_device::apricot_expansion_bus_device(const machine_config
device_t(mconfig, APRICOT_EXPANSION_BUS, "Apricot Expansion Bus", tag, owner, clock, "apricot_exp_bus", __FILE__),
m_program(NULL),
m_io(NULL),
+ m_program_iop(NULL),
+ m_io_iop(NULL),
m_dma1_handler(*this),
m_dma2_handler(*this),
m_ext1_handler(*this),
@@ -102,10 +104,12 @@ void apricot_expansion_bus_device::device_start()
void apricot_expansion_bus_device::device_reset()
{
cpu_device *cpu = m_owner->subdevice<cpu_device>(m_cpu_tag);
-if (!cpu->started())
- printf("cpu not running yet\n");
m_program = &cpu->space(AS_PROGRAM);
m_io = &cpu->space(AS_IO);
+
+ cpu_device *iop = m_owner->subdevice<cpu_device>(m_iop_tag);
+ m_program_iop = &iop->space(AS_PROGRAM);
+ m_io_iop = &iop->space(AS_IO);
}
//-------------------------------------------------
@@ -122,10 +126,20 @@ void apricot_expansion_bus_device::add_card(device_apricot_expansion_card_interf
// set_cpu_tag - set cpu we are attached to
//-------------------------------------------------
-void apricot_expansion_bus_device::set_cpu_tag(device_t &device, device_t *owner, const char *cpu_tag)
+void apricot_expansion_bus_device::set_cpu_tag(device_t &device, device_t *owner, const char *tag)
+{
+ apricot_expansion_bus_device &bus = dynamic_cast<apricot_expansion_bus_device &>(device);
+ bus.m_cpu_tag = tag;
+}
+
+//-------------------------------------------------
+// set_iop_tag - set iop we are attached to
+//-------------------------------------------------
+
+void apricot_expansion_bus_device::set_iop_tag(device_t &device, device_t *owner, const char *tag)
{
apricot_expansion_bus_device &bus = dynamic_cast<apricot_expansion_bus_device &>(device);
- bus.m_cpu_tag = cpu_tag;
+ bus.m_iop_tag = tag;
}
// callbacks from slot device to the host
@@ -136,6 +150,18 @@ WRITE_LINE_MEMBER( apricot_expansion_bus_device::ext2_w ) { m_ext2_handler(state
WRITE_LINE_MEMBER( apricot_expansion_bus_device::int2_w ) { m_int2_handler(state); }
WRITE_LINE_MEMBER( apricot_expansion_bus_device::int3_w ) { m_int3_handler(state); }
+//-------------------------------------------------
+// install_ram - attach ram to cpu/iop
+//-------------------------------------------------
+
+void apricot_expansion_bus_device::install_ram(offs_t addrstart, offs_t addrend, void *baseptr)
+{
+ m_program->install_ram(addrstart, addrend, baseptr);
+
+ if (m_program_iop)
+ m_program_iop->install_ram(addrstart, addrend, baseptr);
+}
+
//**************************************************************************
// CARTRIDGE INTERFACE
diff --git a/src/emu/bus/apricot/expansion.h b/src/emu/bus/apricot/expansion.h
index 7847345ac1b..91b3e8e31c8 100644
--- a/src/emu/bus/apricot/expansion.h
+++ b/src/emu/bus/apricot/expansion.h
@@ -57,6 +57,9 @@
MCFG_DEVICE_ADD(_tag, APRICOT_EXPANSION_BUS, 0) \
apricot_expansion_bus_device::set_cpu_tag(*device, owner, _cpu_tag);
+#define MCFG_EXPANSION_IOP_ADD(_tag) \
+ apricot_expansion_bus_device::set_iop_tag(*device, owner, _tag);
+
#define MCFG_EXPANSION_SLOT_ADD(_tag, _slot_intf, _def_slot) \
MCFG_DEVICE_ADD(_tag, APRICOT_EXPANSION_SLOT, 0) \
MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
@@ -134,13 +137,11 @@ public:
{ return downcast<apricot_expansion_bus_device &>(device).m_int3_handler.set_callback(object); }
// inline configuration
- static void set_cpu_tag(device_t &device, device_t *owner, const char *cpu_tag);
+ static void set_cpu_tag(device_t &device, device_t *owner, const char *tag);
+ static void set_iop_tag(device_t &device, device_t *owner, const char *tag);
void add_card(device_apricot_expansion_card_interface *card);
- address_space *m_program;
- address_space *m_io;
-
// from cards
DECLARE_WRITE_LINE_MEMBER( dma1_w );
DECLARE_WRITE_LINE_MEMBER( dma2_w );
@@ -149,6 +150,8 @@ public:
DECLARE_WRITE_LINE_MEMBER( int2_w );
DECLARE_WRITE_LINE_MEMBER( int3_w );
+ void install_ram(offs_t addrstart, offs_t addrend, void *baseptr);
+
protected:
// device-level overrides
virtual void device_start();
@@ -157,6 +160,12 @@ protected:
private:
simple_list<device_apricot_expansion_card_interface> m_dev;
+ // address spaces we have access to
+ address_space *m_program;
+ address_space *m_io;
+ address_space *m_program_iop;
+ address_space *m_io_iop;
+
devcb_write_line m_dma1_handler;
devcb_write_line m_dma2_handler;
devcb_write_line m_ext1_handler;
@@ -166,6 +175,7 @@ private:
// configuration
const char *m_cpu_tag;
+ const char *m_iop_tag;
};
// device type definition
diff --git a/src/emu/bus/apricot/ram.c b/src/emu/bus/apricot/ram.c
index 0a166c82e6d..2221ae37227 100644
--- a/src/emu/bus/apricot/ram.c
+++ b/src/emu/bus/apricot/ram.c
@@ -65,9 +65,9 @@ void apricot_256k_ram_device::device_start()
void apricot_256k_ram_device::device_reset()
{
if (m_sw->read() == 0)
- m_bus->m_program->install_ram(0x40000, 0x7ffff, &m_ram[0]);
+ m_bus->install_ram(0x40000, 0x7ffff, &m_ram[0]);
else
- m_bus->m_program->install_ram(0x80000, 0xbffff, &m_ram[0]);
+ m_bus->install_ram(0x80000, 0xbffff, &m_ram[0]);
}
@@ -119,9 +119,9 @@ void apricot_128k_ram_device::device_start()
void apricot_128k_ram_device::device_reset()
{
if (m_strap->read() == 1)
- m_bus->m_program->install_ram(0x40000, 0x5ffff, &m_ram[0]);
+ m_bus->install_ram(0x40000, 0x5ffff, &m_ram[0]);
else if (m_strap->read() == 2)
- m_bus->m_program->install_ram(0x60000, 0x7ffff, &m_ram[0]);
+ m_bus->install_ram(0x60000, 0x7ffff, &m_ram[0]);
}
@@ -173,5 +173,5 @@ void apricot_512k_ram_device::device_start()
void apricot_512k_ram_device::device_reset()
{
if (m_strap->read() == 0)
- m_bus->m_program->install_ram(0x40000, 0xbffff, &m_ram[0]);
+ m_bus->install_ram(0x40000, 0xbffff, &m_ram[0]);
}
diff --git a/src/mess/drivers/apricot.c b/src/mess/drivers/apricot.c
index 36d0fd5b524..15f5f1d5982 100644
--- a/src/mess/drivers/apricot.c
+++ b/src/mess/drivers/apricot.c
@@ -473,6 +473,7 @@ static MACHINE_CONFIG_START( apricot, apricot_state )
// expansion bus
MCFG_EXPANSION_ADD("exp", "ic91")
+ MCFG_EXPANSION_IOP_ADD("ic71")
MCFG_EXPANSION_SLOT_ADD("exp:1", apricot_expansion_cards, NULL)
MCFG_EXPANSION_SLOT_ADD("exp:2", apricot_expansion_cards, NULL)
MACHINE_CONFIG_END