From 8ba04b825aea9113c131aeff903fe335e4acfd51 Mon Sep 17 00:00:00 2001 From: Aaron Giles Date: Thu, 10 Dec 2009 15:32:44 +0000 Subject: [PATCH] Apply mirrors and global masks at address map detokenizing time rather than later. Also added disabled code to detect address maps with overlapping regions for future analysis. --- src/emu/memory.c | 16 ++++++++++++++++ src/emu/validity.c | 19 ++++++++++++++++++- src/mame/drivers/punchout.c | 12 ++++++------ 3 files changed, 40 insertions(+), 7 deletions(-) diff --git a/src/emu/memory.c b/src/emu/memory.c index ba79c3f0745..e9bee208fd7 100644 --- a/src/emu/memory.c +++ b/src/emu/memory.c @@ -2293,6 +2293,7 @@ static void memory_exit(running_machine *machine) static void map_detokenize(memory_private *memdata, address_map *map, const game_driver *driver, const char *devtag, const addrmap_token *tokens) { + address_map_entry **firstentryptr; address_map_entry **entryptr; address_map_entry *entry; address_map tmap = {0}; @@ -2315,6 +2316,7 @@ static void map_detokenize(memory_private *memdata, address_map *map, const game /* find the end of the list */ for (entryptr = &map->entrylist; *entryptr != NULL; entryptr = &(*entryptr)->next) ; + firstentryptr = entryptr; entry = NULL; /* loop over tokens until we hit the end */ @@ -2367,6 +2369,11 @@ static void map_detokenize(memory_private *memdata, address_map *map, const game check_entry_field(addrmirror); TOKEN_UNGET_UINT32(tokens); TOKEN_GET_UINT64_UNPACK2(tokens, entrytype, 8, entry->addrmirror, 32); + if (entry->addrmirror != 0) + { + entry->addrstart &= ~entry->addrmirror; + entry->addrend &= ~entry->addrmirror; + } break; case ADDRMAP_TOKEN_READ: @@ -2489,6 +2496,15 @@ static void map_detokenize(memory_private *memdata, address_map *map, const game break; } } + + /* post-process to apply the global mask */ + if (map->globalmask != 0) + for (entry = map->entrylist; entry != NULL; entry = entry->next) + { + entry->addrstart &= map->globalmask; + entry->addrend &= map->globalmask; + entry->addrmask &= map->globalmask; + } } diff --git a/src/emu/validity.c b/src/emu/validity.c index e789b199113..8ed341b9fce 100644 --- a/src/emu/validity.c +++ b/src/emu/validity.c @@ -23,7 +23,8 @@ DEBUGGING ***************************************************************************/ -#define REPORT_TIMES (0) +#define REPORT_TIMES (0) +#define DETECT_OVERLAPPING_MEMORY (0) @@ -1253,6 +1254,7 @@ static int validate_devices(int drivnum, const machine_config *config, const inp for (device = device_list_first(&config->devicelist, DEVICE_TYPE_WILDCARD); device != NULL; device = device_list_next(device, DEVICE_TYPE_WILDCARD)) { device_validity_check_func validity_check = (device_validity_check_func) device_get_info_fct(device, DEVINFO_FCT_VALIDITY_CHECK); + int detected_overlap = DETECT_OVERLAPPING_MEMORY ? FALSE : TRUE; const device_config *scandevice; int spacenum; @@ -1309,6 +1311,21 @@ static int validate_devices(int drivnum, const machine_config *config, const inp { UINT32 bytestart = SPACE_SHIFT(entry->addrstart); UINT32 byteend = SPACE_SHIFT_END(entry->addrend); + + /* look for overlapping entries */ + if (!detected_overlap) + { + address_map_entry *scan; + for (scan = map->entrylist; scan != entry; scan = scan->next) + if (entry->addrstart <= scan->addrend && entry->addrend >= scan->addrstart && + ((entry->read.type != AMH_NONE && scan->read.type != AMH_NONE) || + (entry->write.type != AMH_NONE && scan->write.type != AMH_NONE))) + { + mame_printf_warning("%s: %s '%s' %s space has overlapping memory (%X-%X,%d,%d) vs (%X-%X,%d,%d)\n", driver->source_file, driver->name, device->tag, address_space_names[spacenum], entry->addrstart, entry->addrend, entry->read.type, entry->write.type, scan->addrstart, scan->addrend, scan->read.type, scan->write.type); + detected_overlap = TRUE; + break; + } + } /* look for inverted start/end pairs */ if (byteend < bytestart) diff --git a/src/mame/drivers/punchout.c b/src/mame/drivers/punchout.c index c2c800db9b4..6b7657203c7 100644 --- a/src/mame/drivers/punchout.c +++ b/src/mame/drivers/punchout.c @@ -340,10 +340,10 @@ static ADDRESS_MAP_START( punchout_map, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0x0000, 0xbfff) AM_ROM AM_RANGE(0xc000, 0xc3ff) AM_RAM AM_BASE_SIZE_GENERIC(nvram) AM_RANGE(0xd000, 0xd7ff) AM_RAM - AM_RANGE(0xdff0, 0xdff7) AM_RAM AM_BASE(&punchout_spr1_ctrlram) - AM_RANGE(0xdff8, 0xdffc) AM_RAM AM_BASE(&punchout_spr2_ctrlram) - AM_RANGE(0xdffd, 0xdffd) AM_RAM AM_BASE(&punchout_palettebank) AM_RANGE(0xd800, 0xdfff) AM_RAM_WRITE(punchout_bg_top_videoram_w) AM_BASE(&punchout_bg_top_videoram) + AM_RANGE(0xdff0, 0xdff7) AM_BASE(&punchout_spr1_ctrlram) + AM_RANGE(0xdff8, 0xdffc) AM_BASE(&punchout_spr2_ctrlram) + AM_RANGE(0xdffd, 0xdffd) AM_BASE(&punchout_palettebank) AM_RANGE(0xe000, 0xe7ff) AM_RAM_WRITE(punchout_spr1_videoram_w) AM_BASE(&punchout_spr1_videoram) AM_RANGE(0xe800, 0xefff) AM_RAM_WRITE(punchout_spr2_videoram_w) AM_BASE(&punchout_spr2_videoram) AM_RANGE(0xf000, 0xffff) AM_RAM_WRITE(punchout_bg_bot_videoram_w) AM_BASE(&punchout_bg_bot_videoram) // also contains scroll RAM @@ -354,10 +354,10 @@ static ADDRESS_MAP_START( armwrest_map, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0x0000, 0xbfff) AM_ROM AM_RANGE(0xc000, 0xc3ff) AM_RAM AM_BASE_SIZE_GENERIC(nvram) AM_RANGE(0xd000, 0xd7ff) AM_RAM - AM_RANGE(0xdff0, 0xdff7) AM_RAM AM_BASE(&punchout_spr1_ctrlram) - AM_RANGE(0xdff8, 0xdffc) AM_RAM AM_BASE(&punchout_spr2_ctrlram) - AM_RANGE(0xdffd, 0xdffd) AM_RAM AM_BASE(&punchout_palettebank) AM_RANGE(0xd800, 0xdfff) AM_RAM_WRITE(armwrest_fg_videoram_w) AM_BASE(&armwrest_fg_videoram) + AM_RANGE(0xdff0, 0xdff7) AM_BASE(&punchout_spr1_ctrlram) + AM_RANGE(0xdff8, 0xdffc) AM_BASE(&punchout_spr2_ctrlram) + AM_RANGE(0xdffd, 0xdffd) AM_BASE(&punchout_palettebank) AM_RANGE(0xe000, 0xe7ff) AM_RAM_WRITE(punchout_spr1_videoram_w) AM_BASE(&punchout_spr1_videoram) AM_RANGE(0xe800, 0xefff) AM_RAM_WRITE(punchout_spr2_videoram_w) AM_BASE(&punchout_spr2_videoram) AM_RANGE(0xf000, 0xf7ff) AM_RAM_WRITE(punchout_bg_bot_videoram_w) AM_BASE(&punchout_bg_bot_videoram)