diff options
Diffstat (limited to 'src/emu/addrmap.cpp')
-rw-r--r-- | src/emu/addrmap.cpp | 349 |
1 files changed, 315 insertions, 34 deletions
diff --git a/src/emu/addrmap.cpp b/src/emu/addrmap.cpp index 3a3fb07c899..7e6b56ed3a1 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_SMO; + 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_SMO; + 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_SMO; + 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_SM) + 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_SM) + 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_SM) + 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_SM) + 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_SM) + 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_SM) + 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_SM) + 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_SM) + 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>"); |