mirror of
https://github.com/holub/mame
synced 2025-07-05 09:57:47 +03:00
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.
This commit is contained in:
parent
457df1ad82
commit
806a3de01c
@ -4464,7 +4464,7 @@ static int EditCheatMenu(CheatEntry * entry, int index, int selection)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int code = input_code_poll_keyboard_switches(FALSE);
|
int code = input_code_poll_switches(FALSE);
|
||||||
|
|
||||||
if(code == KEYCODE_ESC)
|
if(code == KEYCODE_ESC)
|
||||||
{
|
{
|
||||||
|
@ -381,6 +381,7 @@ static void init_cpudata(void);
|
|||||||
static void init_addrspace(UINT8 cpunum, UINT8 spacenum);
|
static void init_addrspace(UINT8 cpunum, UINT8 spacenum);
|
||||||
static void preflight_memory(void);
|
static void preflight_memory(void);
|
||||||
static void populate_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 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 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);
|
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 ismatchmask = ((map->flags & AM_FLAGS_MATCH_MASK) != 0);
|
||||||
int isfixed = (map->memory != NULL) || (map->share != 0);
|
int isfixed = (map->memory != NULL) || (map->share != 0);
|
||||||
if (map->read.handler != NULL)
|
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)
|
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
|
install_mem_handler - installs a handler for
|
||||||
memory operations
|
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;
|
table_data *tabledata = iswrite ? &space->write : &space->read;
|
||||||
UINT8 idx, prev_entry = STATIC_INVALID;
|
UINT8 idx, prev_entry = STATIC_INVALID;
|
||||||
int cur_index, prev_index = 0;
|
int cur_index, prev_index = 0;
|
||||||
int ismasked = (mask != 0);
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* sanity check */
|
/* 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)
|
if (space->dbits != databits)
|
||||||
fatalerror("fatal: install_mem_handler called with a %d-bit handler for a %d-bit address space", databits, space->dbits);
|
fatalerror("fatal: install_mem_handler called with a %d-bit handler for a %d-bit address space", databits, space->dbits);
|
||||||
if (start > end)
|
if (start > end)
|
||||||
@ -1508,22 +1546,6 @@ static void install_mem_handler(addrspace_data *space, int iswrite, int databits
|
|||||||
/* adjust the incoming addresses */
|
/* adjust the incoming addresses */
|
||||||
adjust_addresses(space, ismatchmask, &start, &end, &mask, &mirror);
|
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 this ended up a bank handler, tag it for reads or writes */
|
||||||
if (HANDLER_IS_BANK(handler))
|
if (HANDLER_IS_BANK(handler))
|
||||||
{
|
{
|
||||||
|
@ -1058,21 +1058,21 @@ extern address_space active_address_space[]; /* address spaces */
|
|||||||
#define memory_install_write64_handler(cpu, space, start, end, mask, mirror, handler) \
|
#define memory_install_write64_handler(cpu, space, start, end, mask, mirror, handler) \
|
||||||
_memory_install_write64_handler(cpu, space, start, end, mask, mirror, handler, #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_read_handler(cpu, space, start, end, mask, mirror, rhandler, #rhandler); \
|
||||||
_memory_install_write_handler(cpu, space, start, end, mask, mirror, whandler, #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) \
|
#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_read8_handler(cpu, space, start, end, mask, mirror, rhandler, #rhandler); \
|
||||||
_memory_install_write8_handler(cpu, space, start, end, mask, mirror, whandler, #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) \
|
#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_read16_handler(cpu, space, start, end, mask, mirror, rhandler, #rhandler); \
|
||||||
_memory_install_write16_handler(cpu, space, start, end, mask, mirror, whandler, #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) \
|
#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_read32_handler(cpu, space, start, end, mask, mirror, rhandler, #rhandler); \
|
||||||
_memory_install_write32_handler(cpu, space, start, end, mask, mirror, whandler, #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) \
|
#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_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) \
|
#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)
|
_memory_install_read_matchmask_handler(cpu, space, start, end, mask, mirror, handler, #handler)
|
||||||
|
Loading…
Reference in New Issue
Block a user