#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); \ } \