diff options
Diffstat (limited to 'src/emu/addrmap.cpp')
-rw-r--r-- | src/emu/addrmap.cpp | 186 |
1 files changed, 117 insertions, 69 deletions
diff --git a/src/emu/addrmap.cpp b/src/emu/addrmap.cpp index eca9457e76e..c1ba4545492 100644 --- a/src/emu/addrmap.cpp +++ b/src/emu/addrmap.cpp @@ -61,21 +61,69 @@ static char *core_i64_hex_format(u64 value, u8 mindigits) //------------------------------------------------- address_map_entry::address_map_entry(device_t &device, address_map &map, offs_t start, offs_t end) - : m_next(nullptr), - m_map(map), - m_devbase(device), - m_addrstart(start), - m_addrend(end), - m_addrmirror(0), - m_addrmask(0), - m_addrselect(0), - m_mask(0), - m_cswidth(0), - m_share(nullptr), - m_region(nullptr), - m_rgnoffs(0), - m_submap_device(nullptr), - m_memory(nullptr) + : m_next(nullptr) + , m_map(map) + , m_devbase(device) + , m_addrstart(start) + , m_addrend(end) + , m_addrmirror(0) + , m_addrmask(0) + , m_addrselect(0) + , m_mask(0) + , m_cswidth(0) + , m_share(nullptr) + , m_region(nullptr) + , m_rgnoffs(0) + , m_rproto8(device) + , m_rproto16(device) + , m_rproto32(device) + , m_rproto64(device) + , m_wproto8(device) + , m_wproto16(device) + , m_wproto32(device) + , m_wproto64(device) + , m_rproto8m(device) + , m_rproto16m(device) + , m_rproto32m(device) + , m_rproto64m(device) + , m_wproto8m(device) + , m_wproto16m(device) + , m_wproto32m(device) + , m_wproto64m(device) + , m_rproto8s(device) + , m_rproto16s(device) + , m_rproto32s(device) + , m_rproto64s(device) + , m_wproto8s(device) + , m_wproto16s(device) + , m_wproto32s(device) + , m_wproto64s(device) + , m_rproto8sm(device) + , m_rproto16sm(device) + , m_rproto32sm(device) + , m_rproto64sm(device) + , m_wproto8sm(device) + , m_wproto16sm(device) + , m_wproto32sm(device) + , m_wproto64sm(device) + , m_rproto8mo(device) + , m_rproto16mo(device) + , m_rproto32mo(device) + , m_rproto64mo(device) + , m_wproto8mo(device) + , m_wproto16mo(device) + , m_wproto32mo(device) + , m_wproto64mo(device) + , m_rproto8smo(device) + , m_rproto16smo(device) + , m_rproto32smo(device) + , m_rproto64smo(device) + , m_wproto8smo(device) + , m_wproto16smo(device) + , m_wproto32smo(device) + , m_wproto64smo(device) + , m_submap_device(nullptr) + , m_memory(nullptr) { } @@ -1142,71 +1190,71 @@ void address_map::map_validity_check(validity_checker &valid, int spacenum) cons if (entry.m_read.m_type == AMH_DEVICE_DELEGATE || entry.m_read.m_type == AMH_DEVICE_DELEGATE_M || 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_MO || entry.m_read.m_type == AMH_DEVICE_DELEGATE_SMO) { // extract the device tag from the proto-delegate - const char *devtag = nullptr; + std::pair<std::reference_wrapper<device_t>, const char *> devtag(entry.m_devbase, nullptr); switch (entry.m_read.m_bits) { case 8: if (entry.m_read.m_type == AMH_DEVICE_DELEGATE) - devtag = entry.m_rproto8.device_name(); + devtag = entry.m_rproto8.finder_target(); else if (entry.m_read.m_type == AMH_DEVICE_DELEGATE_M) - devtag = entry.m_rproto8m.device_name(); + devtag = entry.m_rproto8m.finder_target(); else if (entry.m_read.m_type == AMH_DEVICE_DELEGATE_S) - devtag = entry.m_rproto8s.device_name(); + devtag = entry.m_rproto8s.finder_target(); else if (entry.m_read.m_type == AMH_DEVICE_DELEGATE_SM) - devtag = entry.m_rproto8sm.device_name(); + devtag = entry.m_rproto8sm.finder_target(); else if (entry.m_read.m_type == AMH_DEVICE_DELEGATE_MO) - devtag = entry.m_rproto8mo.device_name(); + devtag = entry.m_rproto8mo.finder_target(); else - devtag = entry.m_rproto8smo.device_name(); + devtag = entry.m_rproto8smo.finder_target(); break; case 16: if (entry.m_read.m_type == AMH_DEVICE_DELEGATE) - devtag = entry.m_rproto16.device_name(); + devtag = entry.m_rproto16.finder_target(); else if (entry.m_read.m_type == AMH_DEVICE_DELEGATE_M) - devtag = entry.m_rproto16m.device_name(); + devtag = entry.m_rproto16m.finder_target(); else if (entry.m_read.m_type == AMH_DEVICE_DELEGATE_S) - devtag = entry.m_rproto16s.device_name(); + devtag = entry.m_rproto16s.finder_target(); else if (entry.m_read.m_type == AMH_DEVICE_DELEGATE_SM) - devtag = entry.m_rproto16sm.device_name(); + devtag = entry.m_rproto16sm.finder_target(); else if (entry.m_read.m_type == AMH_DEVICE_DELEGATE_MO) - devtag = entry.m_rproto16mo.device_name(); + devtag = entry.m_rproto16mo.finder_target(); else - devtag = entry.m_rproto16smo.device_name(); + devtag = entry.m_rproto16smo.finder_target(); break; case 32: if (entry.m_read.m_type == AMH_DEVICE_DELEGATE) - devtag = entry.m_rproto32.device_name(); + devtag = entry.m_rproto32.finder_target(); else if (entry.m_read.m_type == AMH_DEVICE_DELEGATE_M) - devtag = entry.m_rproto32m.device_name(); + devtag = entry.m_rproto32m.finder_target(); else if (entry.m_read.m_type == AMH_DEVICE_DELEGATE_S) - devtag = entry.m_rproto32s.device_name(); + devtag = entry.m_rproto32s.finder_target(); else if (entry.m_read.m_type == AMH_DEVICE_DELEGATE_SM) - devtag = entry.m_rproto32sm.device_name(); + devtag = entry.m_rproto32sm.finder_target(); else if (entry.m_read.m_type == AMH_DEVICE_DELEGATE_MO) - devtag = entry.m_rproto32mo.device_name(); + devtag = entry.m_rproto32mo.finder_target(); else - devtag = entry.m_rproto32smo.device_name(); + devtag = entry.m_rproto32smo.finder_target(); break; case 64: if (entry.m_read.m_type == AMH_DEVICE_DELEGATE) - devtag = entry.m_rproto64.device_name(); + devtag = entry.m_rproto64.finder_target(); else if (entry.m_read.m_type == AMH_DEVICE_DELEGATE_M) - devtag = entry.m_rproto64m.device_name(); + devtag = entry.m_rproto64m.finder_target(); else if (entry.m_read.m_type == AMH_DEVICE_DELEGATE_S) - devtag = entry.m_rproto64s.device_name(); + devtag = entry.m_rproto64s.finder_target(); else if (entry.m_read.m_type == AMH_DEVICE_DELEGATE_SM) - devtag = entry.m_rproto64sm.device_name(); + devtag = entry.m_rproto64sm.finder_target(); else if (entry.m_read.m_type == AMH_DEVICE_DELEGATE_MO) - devtag = entry.m_rproto64mo.device_name(); + devtag = entry.m_rproto64mo.finder_target(); else - devtag = entry.m_rproto64smo.device_name(); + devtag = entry.m_rproto64smo.finder_target(); 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>"); + if (devtag.second && !devtag.first.get().subdevice(devtag.second)) + osd_printf_error("%s space memory map entry reads from nonexistent device '%s'\n", spaceconfig.m_name, devtag.first.get().subtag(devtag.second).c_str()); #ifndef MAME_DEBUG // assert will catch this earlier (void)entry.unitmask_is_appropriate(entry.m_read.m_bits, entry.m_mask, entry.m_read.m_name); #endif @@ -1214,71 +1262,71 @@ void address_map::map_validity_check(validity_checker &valid, int spacenum) cons if (entry.m_write.m_type == AMH_DEVICE_DELEGATE || entry.m_read.m_type == AMH_DEVICE_DELEGATE_M || entry.m_write.m_type == AMH_DEVICE_DELEGATE_S || entry.m_write.m_type == AMH_DEVICE_DELEGATE_SM || entry.m_read.m_type == AMH_DEVICE_DELEGATE_MO || entry.m_write.m_type == AMH_DEVICE_DELEGATE_SMO) { // extract the device tag from the proto-delegate - const char *devtag = nullptr; + std::pair<std::reference_wrapper<device_t>, const char *> devtag(entry.m_devbase, nullptr); switch (entry.m_write.m_bits) { case 8: if (entry.m_write.m_type == AMH_DEVICE_DELEGATE) - devtag = entry.m_wproto8.device_name(); + devtag = entry.m_wproto8.finder_target(); else if (entry.m_write.m_type == AMH_DEVICE_DELEGATE_M) - devtag = entry.m_wproto8m.device_name(); + devtag = entry.m_wproto8m.finder_target(); else if (entry.m_write.m_type == AMH_DEVICE_DELEGATE_S) - devtag = entry.m_wproto8s.device_name(); + devtag = entry.m_wproto8s.finder_target(); else if (entry.m_write.m_type == AMH_DEVICE_DELEGATE_SM) - devtag = entry.m_wproto8sm.device_name(); + devtag = entry.m_wproto8sm.finder_target(); else if (entry.m_write.m_type == AMH_DEVICE_DELEGATE_MO) - devtag = entry.m_wproto8mo.device_name(); + devtag = entry.m_wproto8mo.finder_target(); else - devtag = entry.m_wproto8smo.device_name(); + devtag = entry.m_wproto8smo.finder_target(); break; case 16: if (entry.m_write.m_type == AMH_DEVICE_DELEGATE) - devtag = entry.m_wproto16.device_name(); + devtag = entry.m_wproto16.finder_target(); else if (entry.m_write.m_type == AMH_DEVICE_DELEGATE_M) - devtag = entry.m_wproto16m.device_name(); + devtag = entry.m_wproto16m.finder_target(); else if (entry.m_write.m_type == AMH_DEVICE_DELEGATE_S) - devtag = entry.m_wproto16s.device_name(); + devtag = entry.m_wproto16s.finder_target(); else if (entry.m_write.m_type == AMH_DEVICE_DELEGATE_SM) - devtag = entry.m_wproto16sm.device_name(); + devtag = entry.m_wproto16sm.finder_target(); else if (entry.m_write.m_type == AMH_DEVICE_DELEGATE_MO) - devtag = entry.m_wproto16mo.device_name(); + devtag = entry.m_wproto16mo.finder_target(); else - devtag = entry.m_wproto16smo.device_name(); + devtag = entry.m_wproto16smo.finder_target(); break; case 32: if (entry.m_write.m_type == AMH_DEVICE_DELEGATE) - devtag = entry.m_wproto32.device_name(); + devtag = entry.m_wproto32.finder_target(); else if (entry.m_write.m_type == AMH_DEVICE_DELEGATE_M) - devtag = entry.m_wproto32m.device_name(); + devtag = entry.m_wproto32m.finder_target(); else if (entry.m_write.m_type == AMH_DEVICE_DELEGATE_S) - devtag = entry.m_wproto32s.device_name(); + devtag = entry.m_wproto32s.finder_target(); else if (entry.m_write.m_type == AMH_DEVICE_DELEGATE_SM) - devtag = entry.m_wproto32sm.device_name(); + devtag = entry.m_wproto32sm.finder_target(); else if (entry.m_write.m_type == AMH_DEVICE_DELEGATE_MO) - devtag = entry.m_wproto32mo.device_name(); + devtag = entry.m_wproto32mo.finder_target(); else - devtag = entry.m_wproto32smo.device_name(); + devtag = entry.m_wproto32smo.finder_target(); break; case 64: if (entry.m_write.m_type == AMH_DEVICE_DELEGATE) - devtag = entry.m_wproto64.device_name(); + devtag = entry.m_wproto64.finder_target(); else if (entry.m_write.m_type == AMH_DEVICE_DELEGATE_M) - devtag = entry.m_wproto64m.device_name(); + devtag = entry.m_wproto64m.finder_target(); else if (entry.m_write.m_type == AMH_DEVICE_DELEGATE_S) - devtag = entry.m_wproto64s.device_name(); + devtag = entry.m_wproto64s.finder_target(); else if (entry.m_write.m_type == AMH_DEVICE_DELEGATE_SM) - devtag = entry.m_wproto64sm.device_name(); + devtag = entry.m_wproto64sm.finder_target(); else if (entry.m_write.m_type == AMH_DEVICE_DELEGATE_MO) - devtag = entry.m_wproto64mo.device_name(); + devtag = entry.m_wproto64mo.finder_target(); else - devtag = entry.m_wproto64smo.device_name(); + devtag = entry.m_wproto64smo.finder_target(); 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>"); + if (devtag.second && !devtag.first.get().subdevice(devtag.second)) + osd_printf_error("%s space memory map entry writes to nonexistent device '%s'\n", spaceconfig.m_name, devtag.first.get().subtag(devtag.second).c_str()); #ifndef MAME_DEBUG // assert will catch this earlier (void)entry.unitmask_is_appropriate(entry.m_write.m_bits, entry.m_mask, entry.m_write.m_name); #endif |