summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/addrmap.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/addrmap.cpp')
-rw-r--r--src/emu/addrmap.cpp349
1 files changed, 315 insertions, 34 deletions
diff --git a/src/emu/addrmap.cpp b/src/emu/addrmap.cpp
index 3a3fb07c899..f70fdce5e09 100644
--- a/src/emu/addrmap.cpp
+++ b/src/emu/addrmap.cpp
@@ -162,29 +162,80 @@ address_map_entry &address_map_entry::m(device_t *device, address_map_constructo
address_map_entry &address_map_entry::r(read8_delegate func)
{
assert(!func.isnull());
- m_read.m_type = AMH_DEVICE_DELEGATE;
+ m_read.m_type = AMH_DEVICE_DELEGATE_F;
m_read.m_bits = 8;
m_read.m_name = func.name();
m_rproto8 = func;
return *this;
}
-
address_map_entry &address_map_entry::w(write8_delegate func)
{
assert(!func.isnull());
- m_write.m_type = AMH_DEVICE_DELEGATE;
+ m_write.m_type = AMH_DEVICE_DELEGATE_F;
m_write.m_bits = 8;
m_write.m_name = func.name();
m_wproto8 = func;
return *this;
}
+address_map_entry &address_map_entry::r(read8s_delegate func)
+{
+ assert(!func.isnull());
+ m_read.m_type = AMH_DEVICE_DELEGATE_S;
+ m_read.m_bits = 8;
+ m_read.m_name = func.name();
+ m_rproto8s = func;
+ return *this;
+}
+
+address_map_entry &address_map_entry::w(write8s_delegate func)
+{
+ assert(!func.isnull());
+ m_write.m_type = AMH_DEVICE_DELEGATE_S;
+ m_write.m_bits = 8;
+ m_write.m_name = func.name();
+ m_wproto8s = func;
+ return *this;
+}
+
+address_map_entry &address_map_entry::r(read8sm_delegate func)
+{
+ assert(!func.isnull());
+ m_read.m_type = AMH_DEVICE_DELEGATE_SM;
+ m_read.m_bits = 8;
+ m_read.m_name = func.name();
+ m_rproto8sm = func;
+ return *this;
+}
+
+address_map_entry &address_map_entry::w(write8sm_delegate func)
+{
+ assert(!func.isnull());
+ m_write.m_type = AMH_DEVICE_DELEGATE_SM;
+ m_write.m_bits = 8;
+ m_write.m_name = func.name();
+ m_wproto8sm = func;
+ return *this;
+}
+
+address_map_entry &address_map_entry::r(read8smo_delegate func)
+{
+ assert(!func.isnull());
+ m_read.m_type = AMH_DEVICE_DELEGATE_F;
+ m_read.m_bits = 8;
+ m_read.m_name = func.name();
+ m_rproto8smo = func;
+ return *this;
+}
-address_map_entry &address_map_entry::rw(read8_delegate rfunc, write8_delegate wfunc)
+address_map_entry &address_map_entry::w(write8smo_delegate func)
{
- r(rfunc);
- w(wfunc);
+ assert(!func.isnull());
+ m_write.m_type = AMH_DEVICE_DELEGATE_SMO;
+ m_write.m_bits = 8;
+ m_write.m_name = func.name();
+ m_wproto8smo = func;
return *this;
}
@@ -197,29 +248,80 @@ address_map_entry &address_map_entry::rw(read8_delegate rfunc, write8_delegate w
address_map_entry &address_map_entry::r(read16_delegate func)
{
assert(!func.isnull());
- m_read.m_type = AMH_DEVICE_DELEGATE;
+ m_read.m_type = AMH_DEVICE_DELEGATE_F;
m_read.m_bits = 16;
m_read.m_name = func.name();
m_rproto16 = func;
return *this;
}
-
address_map_entry &address_map_entry::w(write16_delegate func)
{
assert(!func.isnull());
- m_write.m_type = AMH_DEVICE_DELEGATE;
+ m_write.m_type = AMH_DEVICE_DELEGATE_F;
m_write.m_bits = 16;
m_write.m_name = func.name();
m_wproto16 = func;
return *this;
}
+address_map_entry &address_map_entry::r(read16s_delegate func)
+{
+ assert(!func.isnull());
+ m_read.m_type = AMH_DEVICE_DELEGATE_S;
+ m_read.m_bits = 16;
+ m_read.m_name = func.name();
+ m_rproto16s = func;
+ return *this;
+}
-address_map_entry &address_map_entry::rw(read16_delegate rfunc, write16_delegate wfunc)
+address_map_entry &address_map_entry::w(write16s_delegate func)
{
- r(rfunc);
- w(wfunc);
+ assert(!func.isnull());
+ m_write.m_type = AMH_DEVICE_DELEGATE_S;
+ m_write.m_bits = 16;
+ m_write.m_name = func.name();
+ m_wproto16s = func;
+ return *this;
+}
+
+address_map_entry &address_map_entry::r(read16sm_delegate func)
+{
+ assert(!func.isnull());
+ m_read.m_type = AMH_DEVICE_DELEGATE_SM;
+ m_read.m_bits = 16;
+ m_read.m_name = func.name();
+ m_rproto16sm = func;
+ return *this;
+}
+
+address_map_entry &address_map_entry::w(write16sm_delegate func)
+{
+ assert(!func.isnull());
+ m_write.m_type = AMH_DEVICE_DELEGATE_SM;
+ m_write.m_bits = 16;
+ m_write.m_name = func.name();
+ m_wproto16sm = func;
+ return *this;
+}
+
+address_map_entry &address_map_entry::r(read16smo_delegate func)
+{
+ assert(!func.isnull());
+ m_read.m_type = AMH_DEVICE_DELEGATE_SM;
+ m_read.m_bits = 16;
+ m_read.m_name = func.name();
+ m_rproto16smo = func;
+ return *this;
+}
+
+address_map_entry &address_map_entry::w(write16smo_delegate func)
+{
+ assert(!func.isnull());
+ m_write.m_type = AMH_DEVICE_DELEGATE_SM;
+ m_write.m_bits = 16;
+ m_write.m_name = func.name();
+ m_wproto16smo = func;
return *this;
}
@@ -232,32 +334,82 @@ address_map_entry &address_map_entry::rw(read16_delegate rfunc, write16_delegate
address_map_entry &address_map_entry::r(read32_delegate func)
{
assert(!func.isnull());
- m_read.m_type = AMH_DEVICE_DELEGATE;
+ m_read.m_type = AMH_DEVICE_DELEGATE_F;
m_read.m_bits = 32;
m_read.m_name = func.name();
m_rproto32 = func;
return *this;
}
-
address_map_entry &address_map_entry::w(write32_delegate func)
{
assert(!func.isnull());
- m_write.m_type = AMH_DEVICE_DELEGATE;
+ m_write.m_type = AMH_DEVICE_DELEGATE_F;
m_write.m_bits = 32;
m_write.m_name = func.name();
m_wproto32 = func;
return *this;
}
+address_map_entry &address_map_entry::r(read32s_delegate func)
+{
+ assert(!func.isnull());
+ m_read.m_type = AMH_DEVICE_DELEGATE_S;
+ m_read.m_bits = 32;
+ m_read.m_name = func.name();
+ m_rproto32s = func;
+ return *this;
+}
-address_map_entry &address_map_entry::rw(read32_delegate rfunc, write32_delegate wfunc)
+address_map_entry &address_map_entry::w(write32s_delegate func)
{
- r(rfunc);
- w(wfunc);
+ assert(!func.isnull());
+ m_write.m_type = AMH_DEVICE_DELEGATE_S;
+ m_write.m_bits = 32;
+ m_write.m_name = func.name();
+ m_wproto32s = func;
return *this;
}
+address_map_entry &address_map_entry::r(read32sm_delegate func)
+{
+ assert(!func.isnull());
+ m_read.m_type = AMH_DEVICE_DELEGATE_SM;
+ m_read.m_bits = 32;
+ m_read.m_name = func.name();
+ m_rproto32sm = func;
+ return *this;
+}
+
+address_map_entry &address_map_entry::w(write32sm_delegate func)
+{
+ assert(!func.isnull());
+ m_write.m_type = AMH_DEVICE_DELEGATE_SM;
+ m_write.m_bits = 32;
+ m_write.m_name = func.name();
+ m_wproto32sm = func;
+ return *this;
+}
+
+address_map_entry &address_map_entry::r(read32smo_delegate func)
+{
+ assert(!func.isnull());
+ m_read.m_type = AMH_DEVICE_DELEGATE_SMO;
+ m_read.m_bits = 32;
+ m_read.m_name = func.name();
+ m_rproto32smo = func;
+ return *this;
+}
+
+address_map_entry &address_map_entry::w(write32smo_delegate func)
+{
+ assert(!func.isnull());
+ m_write.m_type = AMH_DEVICE_DELEGATE_SMO;
+ m_write.m_bits = 32;
+ m_write.m_name = func.name();
+ m_wproto32smo = func;
+ return *this;
+}
//-------------------------------------------------
// r/w/rw - handler setters for
@@ -267,29 +419,80 @@ address_map_entry &address_map_entry::rw(read32_delegate rfunc, write32_delegate
address_map_entry &address_map_entry::r(read64_delegate func)
{
assert(!func.isnull());
- m_read.m_type = AMH_DEVICE_DELEGATE;
+ m_read.m_type = AMH_DEVICE_DELEGATE_F;
m_read.m_bits = 64;
m_read.m_name = func.name();
m_rproto64 = func;
return *this;
}
-
address_map_entry &address_map_entry::w(write64_delegate func)
{
assert(!func.isnull());
- m_write.m_type = AMH_DEVICE_DELEGATE;
+ m_write.m_type = AMH_DEVICE_DELEGATE_F;
m_write.m_bits = 64;
m_write.m_name = func.name();
m_wproto64 = func;
return *this;
}
+address_map_entry &address_map_entry::r(read64s_delegate func)
+{
+ assert(!func.isnull());
+ m_read.m_type = AMH_DEVICE_DELEGATE_S;
+ m_read.m_bits = 64;
+ m_read.m_name = func.name();
+ m_rproto64s = func;
+ return *this;
+}
+
+address_map_entry &address_map_entry::w(write64s_delegate func)
+{
+ assert(!func.isnull());
+ m_write.m_type = AMH_DEVICE_DELEGATE_S;
+ m_write.m_bits = 64;
+ m_write.m_name = func.name();
+ m_wproto64s = func;
+ return *this;
+}
+
+address_map_entry &address_map_entry::r(read64sm_delegate func)
+{
+ assert(!func.isnull());
+ m_read.m_type = AMH_DEVICE_DELEGATE_SM;
+ m_read.m_bits = 64;
+ m_read.m_name = func.name();
+ m_rproto64sm = func;
+ return *this;
+}
+
+address_map_entry &address_map_entry::w(write64sm_delegate func)
+{
+ assert(!func.isnull());
+ m_write.m_type = AMH_DEVICE_DELEGATE_SM;
+ m_write.m_bits = 64;
+ m_write.m_name = func.name();
+ m_wproto64sm = func;
+ return *this;
+}
+
+address_map_entry &address_map_entry::r(read64smo_delegate func)
+{
+ assert(!func.isnull());
+ m_read.m_type = AMH_DEVICE_DELEGATE_SMO;
+ m_read.m_bits = 64;
+ m_read.m_name = func.name();
+ m_rproto64smo = func;
+ return *this;
+}
-address_map_entry &address_map_entry::rw(read64_delegate rfunc, write64_delegate wfunc)
+address_map_entry &address_map_entry::w(write64smo_delegate func)
{
- r(rfunc);
- w(wfunc);
+ assert(!func.isnull());
+ m_write.m_type = AMH_DEVICE_DELEGATE_SMO;
+ m_write.m_bits = 64;
+ m_write.m_name = func.name();
+ m_wproto64smo = func;
return *this;
}
@@ -749,16 +952,55 @@ void address_map::map_validity_check(validity_checker &valid, int spacenum) cons
}
// make sure all devices exist
- if (entry.m_read.m_type == AMH_DEVICE_DELEGATE)
+ if (entry.m_read.m_type == AMH_DEVICE_DELEGATE_F || entry.m_read.m_type == AMH_DEVICE_DELEGATE_S || entry.m_read.m_type == AMH_DEVICE_DELEGATE_SM || entry.m_read.m_type == AMH_DEVICE_DELEGATE_SMO)
{
// extract the device tag from the proto-delegate
const char *devtag = nullptr;
switch (entry.m_read.m_bits)
{
- case 8: devtag = entry.m_rproto8.device_name(); break;
- case 16: devtag = entry.m_rproto16.device_name(); break;
- case 32: devtag = entry.m_rproto32.device_name(); break;
- case 64: devtag = entry.m_rproto64.device_name(); break;
+ case 8:
+ if (entry.m_read.m_type == AMH_DEVICE_DELEGATE_F)
+ devtag = entry.m_rproto8.device_name();
+ else if (entry.m_read.m_type == AMH_DEVICE_DELEGATE_S)
+ devtag = entry.m_rproto8s.device_name();
+ else if (entry.m_read.m_type == AMH_DEVICE_DELEGATE_S)
+ devtag = entry.m_rproto8sm.device_name();
+ else
+ devtag = entry.m_rproto8smo.device_name();
+ break;
+
+ case 16:
+ if (entry.m_read.m_type == AMH_DEVICE_DELEGATE_F)
+ devtag = entry.m_rproto16.device_name();
+ else if (entry.m_read.m_type == AMH_DEVICE_DELEGATE_S)
+ devtag = entry.m_rproto16s.device_name();
+ else if (entry.m_read.m_type == AMH_DEVICE_DELEGATE_S)
+ devtag = entry.m_rproto16sm.device_name();
+ else
+ devtag = entry.m_rproto16smo.device_name();
+ break;
+
+ case 32:
+ if (entry.m_read.m_type == AMH_DEVICE_DELEGATE_F)
+ devtag = entry.m_rproto32.device_name();
+ else if (entry.m_read.m_type == AMH_DEVICE_DELEGATE_S)
+ devtag = entry.m_rproto32s.device_name();
+ else if (entry.m_read.m_type == AMH_DEVICE_DELEGATE_S)
+ devtag = entry.m_rproto32sm.device_name();
+ else
+ devtag = entry.m_rproto32smo.device_name();
+ break;
+
+ case 64:
+ if (entry.m_read.m_type == AMH_DEVICE_DELEGATE_F)
+ devtag = entry.m_rproto64.device_name();
+ else if (entry.m_read.m_type == AMH_DEVICE_DELEGATE_S)
+ devtag = entry.m_rproto64s.device_name();
+ else if (entry.m_read.m_type == AMH_DEVICE_DELEGATE_S)
+ devtag = entry.m_rproto64sm.device_name();
+ else
+ devtag = entry.m_rproto64smo.device_name();
+ break;
}
if (entry.m_devbase.subdevice(devtag) == nullptr)
osd_printf_error("%s space memory map entry reads from nonexistent device '%s'\n", spaceconfig.m_name, devtag ? devtag : "<unspecified>");
@@ -766,16 +1008,55 @@ void address_map::map_validity_check(validity_checker &valid, int spacenum) cons
(void)entry.unitmask_is_appropriate(entry.m_read.m_bits, entry.m_mask, entry.m_read.m_name);
#endif
}
- if (entry.m_write.m_type == AMH_DEVICE_DELEGATE)
+ if (entry.m_write.m_type == AMH_DEVICE_DELEGATE_F || entry.m_write.m_type == AMH_DEVICE_DELEGATE_S || entry.m_write.m_type == AMH_DEVICE_DELEGATE_SM || entry.m_write.m_type == AMH_DEVICE_DELEGATE_SMO)
{
// extract the device tag from the proto-delegate
const char *devtag = nullptr;
switch (entry.m_write.m_bits)
{
- case 8: devtag = entry.m_wproto8.device_name(); break;
- case 16: devtag = entry.m_wproto16.device_name(); break;
- case 32: devtag = entry.m_wproto32.device_name(); break;
- case 64: devtag = entry.m_wproto64.device_name(); break;
+ case 8:
+ if (entry.m_write.m_type == AMH_DEVICE_DELEGATE_F)
+ devtag = entry.m_wproto8.device_name();
+ else if (entry.m_write.m_type == AMH_DEVICE_DELEGATE_S)
+ devtag = entry.m_wproto8s.device_name();
+ else if (entry.m_write.m_type == AMH_DEVICE_DELEGATE_S)
+ devtag = entry.m_wproto8sm.device_name();
+ else
+ devtag = entry.m_wproto8smo.device_name();
+ break;
+
+ case 16:
+ if (entry.m_write.m_type == AMH_DEVICE_DELEGATE_F)
+ devtag = entry.m_wproto16.device_name();
+ else if (entry.m_write.m_type == AMH_DEVICE_DELEGATE_S)
+ devtag = entry.m_wproto16s.device_name();
+ else if (entry.m_write.m_type == AMH_DEVICE_DELEGATE_S)
+ devtag = entry.m_wproto16sm.device_name();
+ else
+ devtag = entry.m_wproto16smo.device_name();
+ break;
+
+ case 32:
+ if (entry.m_write.m_type == AMH_DEVICE_DELEGATE_F)
+ devtag = entry.m_wproto32.device_name();
+ else if (entry.m_write.m_type == AMH_DEVICE_DELEGATE_S)
+ devtag = entry.m_wproto32s.device_name();
+ else if (entry.m_write.m_type == AMH_DEVICE_DELEGATE_S)
+ devtag = entry.m_wproto32sm.device_name();
+ else
+ devtag = entry.m_wproto32smo.device_name();
+ break;
+
+ case 64:
+ if (entry.m_write.m_type == AMH_DEVICE_DELEGATE_F)
+ devtag = entry.m_wproto64.device_name();
+ else if (entry.m_write.m_type == AMH_DEVICE_DELEGATE_S)
+ devtag = entry.m_wproto64s.device_name();
+ else if (entry.m_write.m_type == AMH_DEVICE_DELEGATE_S)
+ devtag = entry.m_wproto64sm.device_name();
+ else
+ devtag = entry.m_wproto64smo.device_name();
+ break;
}
if (entry.m_devbase.subdevice(devtag) == nullptr)
osd_printf_error("%s space memory map entry writes to nonexistent device '%s'\n", spaceconfig.m_name, devtag ? devtag : "<unspecified>");