From 806a3de01cad1c0d9ed9c62dce0f4b5722366326 Mon Sep 17 00:00:00 2001 From: Aaron Giles Date: Fri, 18 Jan 2008 19:34:54 +0000 Subject: [PATCH] Made detection of dynamic attempts to install ROM/RAM handlers more aggressive. Previous checks would not catch modifications in DRIVER_INIT or MACHINE_START calls. Also changed one of the cheat calls back to using more generic switch detection so they can be triggered via joysticks. --- src/emu/cheat.c | 2 +- src/emu/memory.c | 60 +++++++++++++++++++++++++++++++++--------------- src/emu/memory.h | 20 ++++++++-------- 3 files changed, 52 insertions(+), 30 deletions(-) diff --git a/src/emu/cheat.c b/src/emu/cheat.c index 368892090bf..624f24ab943 100644 --- a/src/emu/cheat.c +++ b/src/emu/cheat.c @@ -4464,7 +4464,7 @@ static int EditCheatMenu(CheatEntry * entry, int index, int selection) } else { - int code = input_code_poll_keyboard_switches(FALSE); + int code = input_code_poll_switches(FALSE); if(code == KEYCODE_ESC) { diff --git a/src/emu/memory.c b/src/emu/memory.c index 33e7871a8af..866db14ec67 100644 --- a/src/emu/memory.c +++ b/src/emu/memory.c @@ -381,6 +381,7 @@ static void init_cpudata(void); static void init_addrspace(UINT8 cpunum, UINT8 spacenum); static void preflight_memory(void); static void populate_memory(void); +static void install_mem_handler_private(addrspace_data *space, int iswrite, int databits, int ismatchmask, offs_t start, offs_t end, offs_t mask, offs_t mirror, genf *handler, int isfixed, const char *handler_name); static void install_mem_handler(addrspace_data *space, int iswrite, int databits, int ismatchmask, offs_t start, offs_t end, offs_t mask, offs_t mirror, genf *handler, int isfixed, const char *handler_name); static genf *assign_dynamic_bank(int cpunum, int spacenum, offs_t start, offs_t end, offs_t mirror, int isfixed, int ismasked); static UINT8 get_handler_index(handler_data *table, genf *handler, const char *handler_name, offs_t start, offs_t end, offs_t mask); @@ -1452,15 +1453,51 @@ static void populate_memory(void) int ismatchmask = ((map->flags & AM_FLAGS_MATCH_MASK) != 0); int isfixed = (map->memory != NULL) || (map->share != 0); if (map->read.handler != NULL) - install_mem_handler(space, 0, space->dbits, ismatchmask, map->start, map->end, map->mask, map->mirror, map->read.handler, isfixed, map->read_name); + install_mem_handler_private(space, 0, space->dbits, ismatchmask, map->start, map->end, map->mask, map->mirror, map->read.handler, isfixed, map->read_name); if (map->write.handler != NULL) - install_mem_handler(space, 1, space->dbits, ismatchmask, map->start, map->end, map->mask, map->mirror, map->write.handler, isfixed, map->write_name); + install_mem_handler_private(space, 1, space->dbits, ismatchmask, map->start, map->end, map->mask, map->mirror, map->write.handler, isfixed, map->write_name); } } } } +/*------------------------------------------------- + install_mem_handler_private - wrapper for + install_mem_handler which is used at + initialization time and converts RAM/ROM + banks to dynamically assigned banks +-------------------------------------------------*/ + +static void install_mem_handler_private(addrspace_data *space, int iswrite, int databits, int ismatchmask, offs_t start, offs_t end, offs_t mask, offs_t mirror, genf *handler, int isfixed, const char *handler_name) +{ + /* translate ROM to RAM/UNMAP here */ + if (HANDLER_IS_ROM(handler)) + handler = iswrite ? (genf *)STATIC_UNMAP : (genf *)MRA8_RAM; + + /* assign banks for RAM/ROM areas */ + if (HANDLER_IS_RAM(handler)) + { + int ismasked = (mask != 0); + offs_t temp_start = start; + offs_t temp_end = end; + offs_t temp_mask = mask; + offs_t temp_mirror = mirror; + + /* adjust the incoming addresses (temporarily) */ + adjust_addresses(space, ismatchmask, &temp_start, &temp_end, &temp_mask, &temp_mirror); + + /* assign a bank to the adjusted addresses */ + handler = (genf *)assign_dynamic_bank(space->cpunum, space->spacenum, temp_start, temp_end, temp_mirror, isfixed, ismasked); + if (!bank_ptr[HANDLER_TO_BANK(handler)]) + bank_ptr[HANDLER_TO_BANK(handler)] = memory_find_base(space->cpunum, space->spacenum, iswrite, temp_start); + } + + /* then do a normal installation */ + install_mem_handler(space, iswrite, databits, ismatchmask, start, end, mask, mirror, handler, isfixed, handler_name); +} + + /*------------------------------------------------- install_mem_handler - installs a handler for memory operations @@ -1472,10 +1509,11 @@ static void install_mem_handler(addrspace_data *space, int iswrite, int databits table_data *tabledata = iswrite ? &space->write : &space->read; UINT8 idx, prev_entry = STATIC_INVALID; int cur_index, prev_index = 0; - int ismasked = (mask != 0); int i; /* sanity check */ + if (HANDLER_IS_ROM(handler) || HANDLER_IS_RAM(handler)) + fatalerror("fatal: install_mem_handler called with ROM or RAM after initialization"); if (space->dbits != databits) fatalerror("fatal: install_mem_handler called with a %d-bit handler for a %d-bit address space", databits, space->dbits); if (start > end) @@ -1508,22 +1546,6 @@ static void install_mem_handler(addrspace_data *space, int iswrite, int databits /* adjust the incoming addresses */ adjust_addresses(space, ismatchmask, &start, &end, &mask, &mirror); - /* sanity check */ - if (HANDLER_IS_RAM(handler)) - assert_always(mame_get_phase(Machine) == MAME_PHASE_INIT, "RAM/ROM memory handlers can only be installed at init time"); - - /* translate ROM to RAM/UNMAP here */ - if (HANDLER_IS_ROM(handler)) - handler = iswrite ? (genf *)STATIC_UNMAP : (genf *)MRA8_RAM; - - /* assign banks for RAM/ROM areas */ - if (HANDLER_IS_RAM(handler)) - { - handler = (genf *)assign_dynamic_bank(space->cpunum, space->spacenum, start, end, mirror, isfixed, ismasked); - if (!bank_ptr[HANDLER_TO_BANK(handler)]) - bank_ptr[HANDLER_TO_BANK(handler)] = memory_find_base(space->cpunum, space->spacenum, iswrite, start); - } - /* if this ended up a bank handler, tag it for reads or writes */ if (HANDLER_IS_BANK(handler)) { diff --git a/src/emu/memory.h b/src/emu/memory.h index 83cdff7ecbc..8b2d36a8973 100644 --- a/src/emu/memory.h +++ b/src/emu/memory.h @@ -1058,21 +1058,21 @@ extern address_space active_address_space[]; /* address spaces */ #define memory_install_write64_handler(cpu, space, start, end, mask, mirror, handler) \ _memory_install_write64_handler(cpu, space, start, end, mask, mirror, handler, #handler) -#define memory_install_readwrite_handler(cpu, space, start, end, mask, mirror, rhandler, whandler) \ +#define memory_install_readwrite_handler(cpu, space, start, end, mask, mirror, rhandler, whandler) do { \ _memory_install_read_handler(cpu, space, start, end, mask, mirror, rhandler, #rhandler); \ - _memory_install_write_handler(cpu, space, start, end, mask, mirror, whandler, #whandler) -#define memory_install_readwrite8_handler(cpu, space, start, end, mask, mirror, rhandler, whandler) \ + _memory_install_write_handler(cpu, space, start, end, mask, mirror, whandler, #whandler); } while (0) +#define memory_install_readwrite8_handler(cpu, space, start, end, mask, mirror, rhandler, whandler) do { \ _memory_install_read8_handler(cpu, space, start, end, mask, mirror, rhandler, #rhandler); \ - _memory_install_write8_handler(cpu, space, start, end, mask, mirror, whandler, #whandler) -#define memory_install_readwrite16_handler(cpu, space, start, end, mask, mirror, rhandler, whandler) \ + _memory_install_write8_handler(cpu, space, start, end, mask, mirror, whandler, #whandler); } while (0) +#define memory_install_readwrite16_handler(cpu, space, start, end, mask, mirror, rhandler, whandler) do { \ _memory_install_read16_handler(cpu, space, start, end, mask, mirror, rhandler, #rhandler); \ - _memory_install_write16_handler(cpu, space, start, end, mask, mirror, whandler, #whandler) -#define memory_install_readwrite32_handler(cpu, space, start, end, mask, mirror, rhandler, whandler) \ + _memory_install_write16_handler(cpu, space, start, end, mask, mirror, whandler, #whandler); } while (0) +#define memory_install_readwrite32_handler(cpu, space, start, end, mask, mirror, rhandler, whandler) do { \ _memory_install_read32_handler(cpu, space, start, end, mask, mirror, rhandler, #rhandler); \ - _memory_install_write32_handler(cpu, space, start, end, mask, mirror, whandler, #whandler) -#define memory_install_readwrite64_handler(cpu, space, start, end, mask, mirror, rhandler, whandler) \ + _memory_install_write32_handler(cpu, space, start, end, mask, mirror, whandler, #whandler); } while (0) +#define memory_install_readwrite64_handler(cpu, space, start, end, mask, mirror, rhandler, whandler) do { \ _memory_install_read64_handler(cpu, space, start, end, mask, mirror, rhandler, #rhandler); \ - _memory_install_write64_handler(cpu, space, start, end, mask, mirror, whandler, #whandler) + _memory_install_write64_handler(cpu, space, start, end, mask, mirror, whandler, #whandler); } while (0) #define memory_install_read_matchmask_handler(cpu, space, start, end, mask, mirror, handler) \ _memory_install_read_matchmask_handler(cpu, space, start, end, mask, mirror, handler, #handler)