⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 x86_emit.h

📁 psp上的GBA模拟器
💻 H
📖 第 1 页 / 共 5 页
字号:
  check_for_interrupts();  if(reg[REG_CPSR] & 0x20)    address |= 0x01;  return address;}#define generate_store_reg_pc_flags(ireg, reg_index)                          \  generate_store_reg(ireg, reg_index);                                        \  if(reg_index == 15)                                                         \  {                                                                           \    generate_mov(a0, ireg);                                                   \    generate_function_call(execute_spsr_restore);                             \    generate_mov(a0, rv);                                                     \    generate_indirect_branch_dual();                                          \  }                                                                           \typedef enum{  CONDITION_TRUE,  CONDITION_FALSE,  CONDITION_EQUAL,  CONDITION_NOT_EQUAL} condition_check_type;#define generate_condition_eq(ireg_a, ireg_b)                                 \  generate_load_reg(ireg_a, REG_Z_FLAG);                                      \  condition_check = CONDITION_TRUE                                            \#define generate_condition_ne(ireg_a, ireg_b)                                 \  generate_load_reg(ireg_a, REG_Z_FLAG);                                      \  condition_check = CONDITION_FALSE                                           \#define generate_condition_cs(ireg_a, ireg_b)                                 \  generate_load_reg(ireg_a, REG_C_FLAG);                                      \  condition_check = CONDITION_TRUE                                            \#define generate_condition_cc(ireg_a, ireg_b)                                 \  generate_load_reg(ireg_a, REG_C_FLAG);                                      \  condition_check = CONDITION_FALSE                                           \#define generate_condition_mi(ireg_a, ireg_b)                                 \  generate_load_reg(ireg_a, REG_N_FLAG);                                      \  condition_check = CONDITION_TRUE                                            \#define generate_condition_pl(ireg_a, ireg_b)                                 \  generate_load_reg(ireg_a, REG_N_FLAG);                                      \  condition_check = CONDITION_FALSE                                           \#define generate_condition_vs(ireg_a, ireg_b)                                 \  generate_load_reg(ireg_a, REG_V_FLAG);                                      \  condition_check = CONDITION_TRUE                                            \#define generate_condition_vc(ireg_a, ireg_b)                                 \  generate_load_reg(ireg_a, REG_V_FLAG);                                      \  condition_check = CONDITION_FALSE                                           \#define generate_condition_hi(ireg_a, ireg_b)                                 \  generate_load_reg(ireg_a, REG_C_FLAG);                                      \  generate_xor_imm(ireg_a, 1);                                                \  generate_load_reg(ireg_b, REG_Z_FLAG);                                      \  generate_or(ireg_a, ireg_b);                                                \  condition_check = CONDITION_FALSE                                           \#define generate_condition_ls(ireg_a, ireg_b)                                 \  generate_load_reg(ireg_a, REG_C_FLAG);                                      \  generate_xor_imm(ireg_a, 1);                                                \  generate_load_reg(ireg_b, REG_Z_FLAG);                                      \  generate_or(ireg_a, ireg_b);                                                \  condition_check = CONDITION_TRUE                                            \#define generate_condition_ge(ireg_a, ireg_b)                                 \  generate_load_reg(ireg_a, REG_N_FLAG);                                      \  generate_load_reg(ireg_b, REG_V_FLAG);                                      \  condition_check = CONDITION_EQUAL                                           \#define generate_condition_lt(ireg_a, ireg_b)                                 \  generate_load_reg(ireg_a, REG_N_FLAG);                                      \  generate_load_reg(ireg_b, REG_V_FLAG);                                      \  condition_check = CONDITION_NOT_EQUAL                                       \#define generate_condition_gt(ireg_a, ireg_b)                                 \  generate_load_reg(ireg_a, REG_N_FLAG);                                      \  generate_load_reg(ireg_b, REG_V_FLAG);                                      \  generate_xor(ireg_b, ireg_a);                                               \  generate_load_reg(a0, REG_Z_FLAG);                                          \  generate_or(ireg_a, ireg_b);                                                \  condition_check = CONDITION_FALSE                                           \#define generate_condition_le(ireg_a, ireg_b)                                 \  generate_load_reg(ireg_a, REG_N_FLAG);                                      \  generate_load_reg(ireg_b, REG_V_FLAG);                                      \  generate_xor(ireg_b, ireg_a);                                               \  generate_load_reg(a0, REG_Z_FLAG);                                          \  generate_or(ireg_a, ireg_b);                                                \  condition_check = CONDITION_TRUE                                            \#define generate_condition(ireg_a, ireg_b)                                    \  switch(condition)                                                           \  {                                                                           \    case 0x0:                                                                 \      generate_condition_eq(ireg_a, ireg_b);                                  \      break;                                                                  \                                                                              \    case 0x1:                                                                 \      generate_condition_ne(ireg_a, ireg_b);                                  \      break;                                                                  \                                                                              \    case 0x2:                                                                 \      generate_condition_cs(ireg_a, ireg_b);                                  \      break;                                                                  \                                                                              \    case 0x3:                                                                 \      generate_condition_cc(ireg_a, ireg_b);                                  \      break;                                                                  \                                                                              \    case 0x4:                                                                 \      generate_condition_mi(ireg_a, ireg_b);                                  \      break;                                                                  \                                                                              \    case 0x5:                                                                 \      generate_condition_pl(ireg_a, ireg_b);                                  \      break;                                                                  \                                                                              \    case 0x6:                                                                 \      generate_condition_vs(ireg_a, ireg_b);                                  \      break;                                                                  \                                                                              \    case 0x7:                                                                 \      generate_condition_vc(ireg_a, ireg_b);                                  \      break;                                                                  \                                                                              \    case 0x8:                                                                 \      generate_condition_hi(ireg_a, ireg_b);                                  \      break;                                                                  \                                                                              \    case 0x9:                                                                 \      generate_condition_ls(ireg_a, ireg_b);                                  \      break;                                                                  \                                                                              \    case 0xA:                                                                 \      generate_condition_ge(ireg_a, ireg_b);                                  \      break;                                                                  \                                                                              \    case 0xB:                                                                 \      generate_condition_lt(ireg_a, ireg_b);                                  \      break;                                                                  \                                                                              \    case 0xC:                                                                 \      generate_condition_gt(ireg_a, ireg_b);                                  \      break;                                                                  \                                                                              \    case 0xD:                                                                 \      generate_condition_le(ireg_a, ireg_b);                                  \      break;                                                                  \                                                                              \    case 0xE:                                                                 \      /* AL       */                                                          \      break;                                                                  \                                                                              \    case 0xF:                                                                 \      /* Reserved */                                                          \      break;                                                                  \  }                                                                           \#define generate_conditional_branch_type(ireg_a, ireg_b)                      \  switch(condition_check)                                                     \  {                                                                           \    case CONDITION_TRUE:                                                      \      generate_conditional_branch(ireg_a, ireg_b, true, backpatch_address);   \      break;                                                                  \                                                                              \    case CONDITION_FALSE:                                                     \      generate_conditional_branch(ireg_a, ireg_b, false, backpatch_address);  \      break;                                                                  \                                                                              \    case CONDITION_EQUAL:                                                     \      generate_conditional_branch(ireg_a, ireg_b, equal, backpatch_address);  \      break;                                                                  \                                                                              \    case CONDITION_NOT_EQUAL:                                                 \      generate_conditional_branch(ireg_a, ireg_b, not_equal,                  \       backpatch_address);                                                    \      break;                                                                  \  }                                                                           \#define generate_branch()                                                     \{                                                                             \  generate_branch_cycle_update(                                               \   block_exits[block_exit_position].branch_source,                            \   block_exits[block_exit_position].branch_target);                           \  block_exit_position++;                                                      \}                                                                             \#define rm_op_reg rm#define rm_op_imm imm#define arm_data_proc_reg_flags()                                             \  arm_decode_data_proc_reg();                                                 \  if(flag_status & 0x02)                                                      \  {                                                                           \    generate_load_rm_sh(flags)                                                \  }                                                                           \  else                                                                        \  {                                                                           \    generate_load_rm_sh(no_flags);                                            \  }                                                                           \#define arm_data_proc_reg()                                                   \  arm_decode_data_proc_reg();                                                 \  generate_load_rm_sh(no_flags)                                               \#define arm_data_proc_imm()                                                   \  arm_decode_data_proc_imm();                                                 \  generate_load_imm(a0, imm)                                                  \#define arm_data_proc(name, type, flags_op)                                   \{                                                                             \  arm_data_proc_##type();                                                     \  generate_load_reg_pc(a1, rn, 8);                                            \  generate_function_call(execute_##name);                                     \  generate_store_reg_pc_##flags_op(rv, rd);                                   \}                                                                             \#define arm_data_proc_test(name, type)                                        \{                                                                             \  arm_data_

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -