cpu_threaded.c

来自「psp上的GBA模拟器」· C语言 代码 · 共 898 行 · 第 1/5 页

C
898
字号
          case 2:                                                             \            /* LDRSB rd, [rn - rm]! */                                        \            arm_access_memory(load, down, pre_wb, s8, half_reg);              \            break;                                                            \                                                                              \          case 3:                                                             \            /* LDRSH rd, [rn - rm]! */                                        \            arm_access_memory(load, down, pre_wb, s16, half_reg);             \            break;                                                            \        }                                                                     \      }                                                                       \      else                                                                    \      {                                                                       \        /* TEQ rd, rn, reg_op */                                              \        arm_data_proc_test(teq, reg_flags);                                   \      }                                                                       \      break;                                                                  \                                                                              \    case 0x14:                                                                \      if((opcode & 0x90) == 0x90)                                             \      {                                                                       \        if(opcode & 0x20)                                                     \        {                                                                     \          /* STRH rd, [rn - imm] */                                           \          arm_access_memory(store, down, pre, u16, half_imm);                 \        }                                                                     \        else                                                                  \        {                                                                     \          /* SWPB rd, rm, [rn] */                                             \          arm_swap(u8);                                                       \        }                                                                     \      }                                                                       \      else                                                                    \      {                                                                       \        /* MRS rd, spsr */                                                    \        arm_psr(reg, read, spsr);                                             \      }                                                                       \      break;                                                                  \                                                                              \    case 0x15:                                                                \      if((opcode & 0x90) == 0x90)                                             \      {                                                                       \        switch((opcode >> 5) & 0x03)                                          \        {                                                                     \          case 1:                                                             \            /* LDRH rd, [rn - imm] */                                         \            arm_access_memory(load, down, pre, u16, half_imm);                \            break;                                                            \                                                                              \          case 2:                                                             \            /* LDRSB rd, [rn - imm] */                                        \            arm_access_memory(load, down, pre, s8, half_imm);                 \            break;                                                            \                                                                              \          case 3:                                                             \            /* LDRSH rd, [rn - imm] */                                        \            arm_access_memory(load, down, pre, s16, half_imm);                \            break;                                                            \        }                                                                     \      }                                                                       \      else                                                                    \      {                                                                       \        /* CMP rn, reg_op */                                                  \        arm_data_proc_test(cmp, reg);                                         \      }                                                                       \      break;                                                                  \                                                                              \    case 0x16:                                                                \      if((opcode & 0x90) == 0x90)                                             \      {                                                                       \        /* STRH rd, [rn - imm]! */                                            \        arm_access_memory(store, down, pre_wb, u16, half_imm);                \      }                                                                       \      else                                                                    \      {                                                                       \        /* MSR spsr, rm */                                                    \        arm_psr(reg, store, spsr);                                            \      }                                                                       \      break;                                                                  \                                                                              \    case 0x17:                                                                \      if((opcode & 0x90) == 0x90)                                             \      {                                                                       \        switch((opcode >> 5) & 0x03)                                          \        {                                                                     \          case 1:                                                             \            /* LDRH rd, [rn - imm]! */                                        \            arm_access_memory(load, down, pre_wb, u16, half_imm);             \            break;                                                            \                                                                              \          case 2:                                                             \            /* LDRSB rd, [rn - imm]! */                                       \            arm_access_memory(load, down, pre_wb, s8, half_imm);              \            break;                                                            \                                                                              \          case 3:                                                             \            /* LDRSH rd, [rn - imm]! */                                       \            arm_access_memory(load, down, pre_wb, s16, half_imm);             \            break;                                                            \        }                                                                     \      }                                                                       \      else                                                                    \      {                                                                       \        /* CMN rd, rn, reg_op */                                              \        arm_data_proc_test(cmn, reg);                                         \      }                                                                       \      break;                                                                  \                                                                              \    case 0x18:                                                                \      if((opcode & 0x90) == 0x90)                                             \      {                                                                       \        /* STRH rd, [rn + rm] */                                              \        arm_access_memory(store, up, pre, u16, half_reg);                     \      }                                                                       \      else                                                                    \      {                                                                       \        /* ORR rd, rn, reg_op */                                              \        arm_data_proc(orr, reg, no_flags);                                    \      }                                                                       \      break;                                                                  \                                                                              \    case 0x19:                                                                \      if((opcode & 0x90) == 0x90)                                             \      {                                                                       \        switch((opcode >> 5) & 0x03)                                          \        {                                                                     \          case 1:                                                             \            /* LDRH rd, [rn + rm] */                                          \            arm_access_memory(load, up, pre, u16, half_reg);                  \            break;                                                            \                                                                              \          case 2:                                                             \            /* LDRSB rd, [rn + rm] */                                         \            arm_access_memory(load, up, pre, s8, half_reg);                   \            break;                                                            \                                                                              \          case 3:                                                             \            /* LDRSH rd, [rn + rm] */                                         \            arm_access_memory(load, up, pre, s16, half_reg);                  \            break;                                                            \        }                                                                     \      }                                                                       \      else                                                                    \      {                                                                       \        /* ORRS rd, rn, reg_op */                                             \        arm_data_proc(orrs, reg_flags, flags);                                \      }                                                                       \      break;                                                                  \                                                                              \    case 0x1A:                                                                \      if((opcode & 0x90) == 0x90)                                             \      {                                                                       \        /* STRH rd, [rn + rm]! */                                             \        arm_access_memory(store, up, pre_wb, u16, half_reg);                  \      }                                                                       \      else                                                                    \      {                                                                       \        /* MOV rd, reg_op */                                                  \        arm_data_proc_unary(mov, reg, no_flags);                              \      }                                                                       \      break;                                                                  \                                                                              \    case 0x1B:                                                                \      if((opcode & 0x90) == 0x90)                                             \      {                                                                       \        switch((opcode >> 5) & 0x03)                                          \        {                                                                     \          case 1:                                                             \            /* LDRH rd, [rn + rm]! */                                         \            arm_access_memory(load, up, pre_wb, u16, half_reg);               \            break;                                                            \                                                                              \          case 2:                                                             \            /* LDRSB rd, [rn + rm]! */                                        \            arm_access_memory(load, up, pre_wb, s8, half_reg);                \            break;                                                            \                                                                              \          case 3:                                                  

⌨️ 快捷键说明

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