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

📄 cpu_threaded.c

📁 psp上的GBA模拟器
💻 C
📖 第 1 页 / 共 5 页
字号:
  u32 rd = opcode & 0x07                                                      \#define thumb_decode_add_sp()                                                 \  u32 imm = opcode & 0x7F                                                     \#define thumb_decode_rlist()                                                  \  u32 reg_list = opcode & 0xFF                                                \#define thumb_decode_branch_cond()                                            \  s32 offset = (s8)(opcode & 0xFF)                                            \#define thumb_decode_swi()                                                    \  u32 comment = opcode & 0xFF                                                 \#define thumb_decode_branch()                                                 \  u32 offset = opcode & 0x07FF                                                \#define check_pc_region(pc)                                                   \  new_pc_region = (pc >> 15);                                                 \  if(new_pc_region != pc_region)                                              \  {                                                                           \    pc_region = new_pc_region;                                                \    pc_address_block = memory_map_read[new_pc_region];                        \                                                                              \    if(pc_address_block == NULL)                                              \      pc_address_block = load_gamepak_page(pc_region & 0x3FF);                \  }                                                                           \#define translate_arm_instruction()                                           \  check_pc_region(pc);                                                        \  opcode = address32(pc_address_block, (pc & 0x7FFF));                        \  condition = block_data[block_data_position].condition;                      \                                                                              \  if((condition != last_condition) || (condition >= 0x20))                    \  {                                                                           \    condition_check_type condition_check;                                     \                                                                              \    if((last_condition & 0x0F) != 0x0E)                                       \    {                                                                         \      generate_branch_patch_conditional(backpatch_address, translation_ptr);  \    }                                                                         \                                                                              \    last_condition = condition;                                               \                                                                              \    condition &= 0x0F;                                                        \                                                                              \    if(condition != 0x0E)                                                     \    {                                                                         \      arm_conditional_block_header();                                         \    }                                                                         \  }                                                                           \                                                                              \  switch((opcode >> 20) & 0xFF)                                               \  {                                                                           \    case 0x00:                                                                \      if((opcode & 0x90) == 0x90)                                             \      {                                                                       \        if(opcode & 0x20)                                                     \        {                                                                     \          /* STRH rd, [rn], -rm */                                            \          arm_access_memory(store, down, post, u16, half_reg);                \        }                                                                     \        else                                                                  \        {                                                                     \          /* MUL rd, rm, rs */                                                \          arm_multiply(no, no);                                               \        }                                                                     \      }                                                                       \      else                                                                    \      {                                                                       \        /* AND rd, rn, reg_op */                                              \        arm_data_proc(and, reg, no_flags);                                    \      }                                                                       \      break;                                                                  \                                                                              \    case 0x01:                                                                \      if((opcode & 0x90) == 0x90)                                             \      {                                                                       \        switch((opcode >> 5) & 0x03)                                          \        {                                                                     \          case 0:                                                             \            /* MULS rd, rm, rs */                                             \            arm_multiply(no, yes);                                            \            break;                                                            \                                                                              \          case 1:                                                             \            /* LDRH rd, [rn], -rm */                                          \            arm_access_memory(load, down, post, u16, half_reg);               \            break;                                                            \                                                                              \          case 2:                                                             \            /* LDRSB rd, [rn], -rm */                                         \            arm_access_memory(load, down, post, s8, half_reg);                \            break;                                                            \                                                                              \          case 3:                                                             \            /* LDRSH rd, [rn], -rm */                                         \            arm_access_memory(load, down, post, s16, half_reg);               \            break;                                                            \        }                                                                     \      }                                                                       \      else                                                                    \      {                                                                       \        /* ANDS rd, rn, reg_op */                                             \        arm_data_proc(ands, reg_flags, flags);                                \      }                                                                       \      break;                                                                  \                                                                              \    case 0x02:                                                                \      if((opcode & 0x90) == 0x90)                                             \      {                                                                       \        if(opcode & 0x20)                                                     \        {                                                                     \          /* STRH rd, [rn], -rm */                                            \          arm_access_memory(store, down, post, u16, half_reg);                \        }                                                                     \        else                                                                  \        {                                                                     \          /* MLA rd, rm, rs, rn */                                            \          arm_multiply(yes, no);                                              \        }                                                                     \      }                                                                       \      else                                                                    \      {                                                                       \        /* EOR rd, rn, reg_op */                                              \        arm_data_proc(eor, reg, no_flags);                                    \      }                                                                       \      break;                                                                  \                                                                              \    case 0x03:                                                                \      if((opcode & 0x90) == 0x90)                                             \      {                                                                       \        switch((opcode >> 5) & 0x03)                                          \        {                                                                     \          case 0:                                                             \            /* MLAS rd, rm, rs, rn */                                         \            arm_multiply(yes, yes);                                           \            break;                                                            \                                                                              \          case 1:                                                             \            /* LDRH rd, [rn], -rm */                                          \            arm_access_memory(load, down, post, u16, half_reg);               \            break;                                                            \                                                                              \          case 2:                                                             \            /* LDRSB rd, [rn], -rm */                                         \            arm_access_memory(load, down, post, s8, half_reg);                \            break;                                                            \                                                                              \          case 3:                                                             \            /* LDRSH rd, [rn], -rm */                                         \            arm_access_memory(load, down, post, s16, half_reg);               \            break;                                                            \        }                                                                     \      }                                                                       \      else                                                                    \      {                                                                       \        /* EORS rd, rn, reg_op */                                             \        arm_data_proc(eors, reg_flags, flags);                                \      }                                                                       \      break;                                                                  \                                                                              \    case 0x04:                                                                \      if((opcode & 0x90) == 0x90)                                             \      {                                                                       \        /* STRH rd, [rn], -imm */                                             \        arm_access_memory(store, down, post, u16, half_imm);                  \      }                                                                       \      else                                                                    \      {                                                                       \        /* SUB rd, rn, reg_op */                                              \        arm_data_proc(sub, reg, no_flags);                                    \      }                                                                       \      break;                                                                  \                                                                              \    case 0x05:                                                                \      if((opcode & 0x90) == 0x90)                                             \      {                                                                       \        switch((opcode >> 5) & 0x03)                                          \        {                                                                     \

⌨️ 快捷键说明

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