All pastes #590641 Raw Edit

Someone

public text v1 · immutable
#590641 ·published 2007-06-26 18:14 UTC
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);                                                 \
}                                                                             \