rendered paste body#define thumb_load_opcode_disasm() \
opcode = address16(pc_address_block, pc) \
#define arm_load_opcode_disasm() \
opcode = address32(pc_address_block, pc) \
#define arm_next_opcode_disasm() \
pc += 4
#define thumb_next_opcode_disasm() \
pc += 2
#define make_stub_label(name) \
{ (void *)name, #name } \
disasm_label stub_labels[] =
{
make_stub_label(arm_update_gba_arm),
make_stub_label(arm_update_gba_thumb),
make_stub_label(arm_update_gba_idle_arm),
make_stub_label(arm_update_gba_idle_thumb),
make_stub_label(arm_indirect_branch_arm),
make_stub_label(arm_indirect_branch_thumb),
make_stub_label(arm_indirect_branch_dual_arm),
make_stub_label(arm_indirect_branch_dual_thumb),
make_stub_label(execute_store_u8),
make_stub_label(execute_store_u16),
make_stub_label(execute_store_u32),
make_stub_label(execute_store_u32_safe),
make_stub_label(execute_load_u8),
make_stub_label(execute_load_s8),
make_stub_label(execute_load_u16),
make_stub_label(execute_load_s16),
make_stub_label(execute_load_u32),
make_stub_label(execute_store_cpsr),
make_stub_label(execute_read_spsr),
make_stub_label(execute_store_spsr),
make_stub_label(execute_spsr_restore),
make_stub_label(execute_swi_arm),
make_stub_label(execute_swi_thumb),
make_stub_label(step_debug_arm)
};
const u32 num_stub_labels = sizeof(stub_labels) / sizeof(disasm_label);
#define log_translation(type) \
{ \
static FILE *translation_log_fp = NULL; \
char disasm_buffer[512]; \
u8 *current_translation_ptr; \
\
if(translation_log_fp == NULL) \
translation_log_fp = fopen("translation_log.txt", "wb"); \
\
fprintf(translation_log_fp, "Block PC %x (%s) -> %p\n", block_start_pc, \
#type, translation_ptr_start); \
\
pc = block_start_pc; \
\
while(pc < block_end_pc) \
{ \
check_pc_region(pc); \
type##_load_opcode_disasm(); \
\
disasm_##type##_instruction(opcode, disasm_buffer, pc, NULL, 0); \
fprintf(translation_log_fp, "%08x: %s\n", pc, disasm_buffer); \
type##_next_opcode_disasm(); \
} \
\
fprintf(translation_log_fp, "\n"); \
\
for(current_translation_ptr = translation_ptr_start; \
current_translation_ptr < translation_ptr; current_translation_ptr += 4) \
{ \
opcode = address32(current_translation_ptr, 0); \
disasm_arm_instruction(opcode, disasm_buffer, \
(u32)current_translation_ptr, stub_labels, num_stub_labels); \
fprintf(translation_log_fp, "%08x: %s\n", current_translation_ptr, \
disasm_buffer); \
} \
\
fprintf(translation_log_fp, "\n"); \
fflush(translation_log_fp); \
} \