summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/debug/debugcpu.c
diff options
context:
space:
mode:
author Aaron Giles <aaron@aarongiles.com>2008-12-22 17:35:27 +0000
committer Aaron Giles <aaron@aarongiles.com>2008-12-22 17:35:27 +0000
commita70fdf00a1e29a2009b1f148373a6be79c1584cc (patch)
treebc9c76b96d6c8bb28d58a1b13b052b736e507c02 /src/emu/debug/debugcpu.c
parentb4c9d1fc8786fee54e56a20d69625ffb6285631d (diff)
CPU interface organization shuffle. The file cpuintrf.h now merely
describes the interface, but does not contain any implementation. All remaining bits of implementation have been migrated either to cpuexec.c or to debugcpu.c. Specifically, cpu_dasm() is now debug_cpu_disassemble(), and cpu_set_dasm_override() is now debug_cpu_set_dasm_override(). Also moved memory_address_physical() to debug_cpu_translate(), since it was only ever used for debugging. Changed all CPU and sound cores to use memory_find_address_space() instead of cpu_get_address_space(). The former is reliable even during early initialization when the CPU cores generally need it. Removed the dummy CPU core and cpuintrf.c. Changed the core execution loop to directly call the execute function instead of using the inline helper (which has been removed).
Diffstat (limited to 'src/emu/debug/debugcpu.c')
-rw-r--r--src/emu/debug/debugcpu.c114
1 files changed, 104 insertions, 10 deletions
diff --git a/src/emu/debug/debugcpu.c b/src/emu/debug/debugcpu.c
index 88154cbc2d8..df6a44abe19 100644
--- a/src/emu/debug/debugcpu.c
+++ b/src/emu/debug/debugcpu.c
@@ -203,6 +203,8 @@ void debug_cpu_init(running_machine *machine)
info->read = (cpu_read_func)device_get_info_fct(info->device, CPUINFO_FCT_READ);
info->write = (cpu_write_func)device_get_info_fct(info->device, CPUINFO_FCT_WRITE);
info->readop = (cpu_readop_func)device_get_info_fct(info->device, CPUINFO_FCT_READOP);
+ info->translate = (cpu_translate_func)device_get_info_fct(info->device, CPUINFO_FCT_TRANSLATE);
+ info->disassemble = (cpu_disassemble_func)device_get_info_fct(info->device, CPUINFO_FCT_DISASSEMBLE);
/* allocate a symbol table */
info->symtable = symtable_alloc(global->symtable, (void *)cpu);
@@ -360,6 +362,98 @@ symbol_table *debug_cpu_get_symtable(const device_config *device)
/***************************************************************************
+ MEMORY AND DISASSEMBLY HELPERS
+***************************************************************************/
+
+/*-------------------------------------------------
+ debug_cpu_translate - return the physical
+ address corresponding to the given logical
+ address
+-------------------------------------------------*/
+
+int debug_cpu_translate(const address_space *space, int intention, offs_t *address)
+{
+ cpu_debug_data *info = cpu_get_debug_data(space->cpu);
+ if (info->translate != NULL)
+ return (*info->translate)(space->cpu, space->spacenum, intention, address);
+ else
+ return TRUE;
+}
+
+
+/*-------------------------------------------------
+ debug_cpu_disassemble - disassemble a line at
+ a given PC on a given CPU
+-------------------------------------------------*/
+
+offs_t debug_cpu_disassemble(const device_config *device, char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram)
+{
+ cpu_debug_data *info = cpu_get_debug_data(device);
+ offs_t result = 0;
+
+ /* check for disassembler override */
+ if (info->dasm_override != NULL)
+ result = (*info->dasm_override)(device, buffer, pc, oprom, opram);
+
+ /* if we have a disassembler, run it */
+ if (result == 0 && info->disassemble != NULL)
+ result = (*info->disassemble)(device, buffer, pc, oprom, opram);
+
+ /* if we still have nothing, output vanilla bytes */
+ if (result == 0)
+ {
+ result = cpu_get_min_opcode_bytes(device);
+ switch (result)
+ {
+ case 1:
+ default:
+ sprintf(buffer, "$%02X", *(UINT8 *)oprom);
+ break;
+
+ case 2:
+ sprintf(buffer, "$%04X", *(UINT16 *)oprom);
+ break;
+
+ case 4:
+ sprintf(buffer, "$%08X", *(UINT32 *)oprom);
+ break;
+
+ case 8:
+ sprintf(buffer, "$%08X%08X", (UINT32)(*(UINT64 *)oprom >> 32), (UINT32)(*(UINT64 *)oprom >> 0));
+ break;
+ }
+ }
+
+ /* make sure we get good results */
+ assert((result & DASMFLAG_LENGTHMASK) != 0);
+#ifdef MAME_DEBUG
+{
+ const address_space *space = cpu_get_address_space(device, ADDRESS_SPACE_PROGRAM);
+ int bytes = memory_address_to_byte(space, result & DASMFLAG_LENGTHMASK);
+ assert(bytes >= cpu_get_min_opcode_bytes(device));
+ assert(bytes <= cpu_get_max_opcode_bytes(device));
+ (void) bytes; /* appease compiler */
+}
+#endif
+
+ return result;
+}
+
+
+/*-------------------------------------------------
+ debug_cpu_set_dasm_override - set an override
+ handler for disassembly
+-------------------------------------------------*/
+
+void debug_cpu_set_dasm_override(const device_config *device, cpu_disassemble_func dasm_override)
+{
+ cpu_debug_data *info = cpu_get_debug_data(device);
+ info->dasm_override = dasm_override;
+}
+
+
+
+/***************************************************************************
CORE DEBUGGER HOOKS
***************************************************************************/
@@ -1255,7 +1349,7 @@ UINT8 debug_read_byte(const address_space *space, offs_t address, int apply_tran
memory_set_debugger_access(space, global->debugger_access = TRUE);
/* translate if necessary; if not mapped, return 0xff */
- if (apply_translation && !memory_address_physical(space, TRANSLATE_READ_DEBUG, &address))
+ if (apply_translation && !debug_cpu_translate(space, TRANSLATE_READ_DEBUG, &address))
result = 0xff;
/* if there is a custom read handler, and it returns TRUE, use that value */
@@ -1308,7 +1402,7 @@ UINT16 debug_read_word(const address_space *space, offs_t address, int apply_tra
memory_set_debugger_access(space, global->debugger_access = TRUE);
/* translate if necessary; if not mapped, return 0xffff */
- if (apply_translation && !memory_address_physical(space, TRANSLATE_READ_DEBUG, &address))
+ if (apply_translation && !debug_cpu_translate(space, TRANSLATE_READ_DEBUG, &address))
result = 0xffff;
/* if there is a custom read handler, and it returns TRUE, use that value */
@@ -1363,7 +1457,7 @@ UINT32 debug_read_dword(const address_space *space, offs_t address, int apply_tr
memory_set_debugger_access(space, global->debugger_access = TRUE);
/* translate if necessary; if not mapped, return 0xffffffff */
- if (apply_translation && !memory_address_physical(space, TRANSLATE_READ_DEBUG, &address))
+ if (apply_translation && !debug_cpu_translate(space, TRANSLATE_READ_DEBUG, &address))
result = 0xffffffff;
/* if there is a custom read handler, and it returns TRUE, use that value */
@@ -1418,7 +1512,7 @@ UINT64 debug_read_qword(const address_space *space, offs_t address, int apply_tr
memory_set_debugger_access(space, global->debugger_access = TRUE);
/* translate if necessary; if not mapped, return 0xffffffffffffffff */
- if (apply_translation && !memory_address_physical(space, TRANSLATE_READ_DEBUG, &address))
+ if (apply_translation && !debug_cpu_translate(space, TRANSLATE_READ_DEBUG, &address))
result = ~(UINT64)0;
/* if there is a custom read handler, and it returns TRUE, use that value */
@@ -1454,7 +1548,7 @@ void debug_write_byte(const address_space *space, offs_t address, UINT8 data, in
memory_set_debugger_access(space, global->debugger_access = TRUE);
/* translate if necessary; if not mapped, we're done */
- if (apply_translation && !memory_address_physical(space, TRANSLATE_WRITE_DEBUG, &address))
+ if (apply_translation && !debug_cpu_translate(space, TRANSLATE_WRITE_DEBUG, &address))
;
/* if there is a custom write handler, and it returns TRUE, use that */
@@ -1507,7 +1601,7 @@ void debug_write_word(const address_space *space, offs_t address, UINT16 data, i
memory_set_debugger_access(space, global->debugger_access = TRUE);
/* translate if necessary; if not mapped, we're done */
- if (apply_translation && !memory_address_physical(space, TRANSLATE_WRITE_DEBUG, &address))
+ if (apply_translation && !debug_cpu_translate(space, TRANSLATE_WRITE_DEBUG, &address))
;
/* if there is a custom write handler, and it returns TRUE, use that */
@@ -1561,7 +1655,7 @@ void debug_write_dword(const address_space *space, offs_t address, UINT32 data,
memory_set_debugger_access(space, global->debugger_access = TRUE);
/* translate if necessary; if not mapped, we're done */
- if (apply_translation && !memory_address_physical(space, TRANSLATE_WRITE_DEBUG, &address))
+ if (apply_translation && !debug_cpu_translate(space, TRANSLATE_WRITE_DEBUG, &address))
;
/* if there is a custom write handler, and it returns TRUE, use that */
@@ -1615,7 +1709,7 @@ void debug_write_qword(const address_space *space, offs_t address, UINT64 data,
memory_set_debugger_access(space, global->debugger_access = TRUE);
/* translate if necessary; if not mapped, we're done */
- if (apply_translation && !memory_address_physical(space, TRANSLATE_WRITE_DEBUG, &address))
+ if (apply_translation && !debug_cpu_translate(space, TRANSLATE_WRITE_DEBUG, &address))
;
/* if there is a custom write handler, and it returns TRUE, use that */
@@ -1669,7 +1763,7 @@ UINT64 debug_read_opcode(const address_space *space, offs_t address, int size, i
}
/* translate to physical first */
- if (!memory_address_physical(space, TRANSLATE_FETCH_DEBUG, &address))
+ if (!debug_cpu_translate(space, TRANSLATE_FETCH_DEBUG, &address))
return ~(UINT64)0 & (~(UINT64)0 >> (64 - 8*size));
/* keep in physical range */
@@ -2262,7 +2356,7 @@ static UINT32 dasm_wrapped(const device_config *device, char *buffer, offs_t pc)
argbuf[numbytes] = debug_read_opcode(space, pcbyte + numbytes, 1, TRUE);
}
- return cpu_dasm(device, buffer, pc, opbuf, argbuf);
+ return debug_cpu_disassemble(device, buffer, pc, opbuf, argbuf);
}