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

📄 cpu.c

📁 psp上的GBA模拟器
💻 C
📖 第 1 页 / 共 5 页
字号:
    /* ASR imm */                                                             \    case 0x4:                                                                 \    {                                                                         \      u32 imm = (opcode >> 7) & 0x1F;                                         \      reg_sh = reg[rm];                                                       \                                                                              \      if(imm == 0)                                                            \        reg_sh = (s32)reg_sh >> 31;                                           \      else                                                                    \        reg_sh = (s32)reg_sh >> imm;                                          \      break;                                                                  \    }                                                                         \                                                                              \    /* ASR reg */                                                             \    case 0x5:                                                                 \    {                                                                         \      get_shift_register(reg_sh);                                             \      if(shift <= 31)                                                         \        reg_sh = (s32)reg_sh >> shift;                                        \      else                                                                    \        reg_sh = (s32)reg_sh >> 31;                                           \      break;                                                                  \    }                                                                         \                                                                              \    /* ROR imm */                                                             \    case 0x6:                                                                 \    {                                                                         \      u32 imm = (opcode >> 7) & 0x1F;                                         \                                                                              \      if(imm == 0)                                                            \        reg_sh = (reg[rm] >> 1) | (c_flag << 31);                             \      else                                                                    \        ror(reg_sh, reg[rm], imm);                                            \      break;                                                                  \    }                                                                         \                                                                              \    /* ROR reg */                                                             \    case 0x7:                                                                 \    {                                                                         \      get_shift_register(reg_sh);                                             \      ror(reg_sh, reg_sh, shift);                                             \      break;                                                                  \    }                                                                         \  }                                                                           \#define calculate_reg_sh_flags()                                              \  u32 reg_sh;                                                                 \  switch((opcode >> 4) & 0x07)                                                \  {                                                                           \    /* LSL imm */                                                             \    case 0x0:                                                                 \    {                                                                         \      u32 imm = (opcode >> 7) & 0x1F;                                         \      reg_sh = reg[rm];                                                       \                                                                              \      if(imm != 0)                                                            \      {                                                                       \        c_flag = (reg_sh >> (32 - imm)) & 0x01;                               \        reg_sh <<= imm;                                                       \      }                                                                       \                                                                              \      break;                                                                  \    }                                                                         \                                                                              \    /* LSL reg */                                                             \    case 0x1:                                                                 \    {                                                                         \      get_shift_register(reg_sh);                                             \      if(shift != 0)                                                          \      {                                                                       \        if(shift > 31)                                                        \        {                                                                     \          if(shift == 32)                                                     \            c_flag = reg_sh & 0x01;                                           \          else                                                                \            c_flag = 0;                                                       \          reg_sh = 0;                                                         \        }                                                                     \        else                                                                  \        {                                                                     \          c_flag = (reg_sh >> (32 - shift)) & 0x01;                           \          reg_sh <<= shift;                                                   \        }                                                                     \      }                                                                       \      break;                                                                  \    }                                                                         \                                                                              \    /* LSR imm */                                                             \    case 0x2:                                                                 \    {                                                                         \      u32 imm = (opcode >> 7) & 0x1F;                                         \      reg_sh = reg[rm];                                                       \      if(imm == 0)                                                            \      {                                                                       \        c_flag = reg_sh >> 31;                                                \        reg_sh = 0;                                                           \      }                                                                       \      else                                                                    \      {                                                                       \        c_flag = (reg_sh >> (imm - 1)) & 0x01;                                \        reg_sh >>= imm;                                                       \      }                                                                       \      break;                                                                  \    }                                                                         \                                                                              \    /* LSR reg */                                                             \    case 0x3:                                                                 \    {                                                                         \      get_shift_register(reg_sh);                                             \      if(shift != 0)                                                          \      {                                                                       \        if(shift > 31)                                                        \        {                                                                     \          if(shift == 32)                                                     \            c_flag = (reg_sh >> 31) & 0x01;                                   \          else                                                                \            c_flag = 0;                                                       \          reg_sh = 0;                                                         \        }                                                                     \        else                                                                  \        {                                                                     \          c_flag = (reg_sh >> (shift - 1)) & 0x01;                            \          reg_sh >>= shift;                                                   \        }                                                                     \      }                                                                       \      break;                                                                  \    }                                                                         \                                                                              \    /* ASR imm */                                                             \    case 0x4:                                                                 \    {                                                                         \      u32 imm = (opcode >> 7) & 0x1F;                                         \      reg_sh = reg[rm];                                                       \      if(imm == 0)                                                            \      {                                                                       \        reg_sh = (s32)reg_sh >> 31;                                           \        c_flag = reg_sh & 0x01;                                               \      }                                                                       \      else                                                                    \      {                                                                       \        c_flag = (reg_sh >> (imm - 1)) & 0x01;                                \        reg_sh = (s32)reg_sh >> imm;                                          \      }                                                                       \      break;                                                                  \    }                                                                         \                                                                              \    /* ASR reg */                                                             \    case 0x5:                                                                 \    {                                                                         \      get_shift_register(reg_sh);                                             \      if(shift != 0)                                                          \      {                                                                       \        if(shift > 31)                                                        \        {                                                                     \          reg_sh = (s32)reg_sh >> 31;                                         \          c_flag = reg_sh & 0x01;                                             \        }                                                                     \        else                                                                  \        {                                                                     \          c_flag = (reg_sh >> (shift - 1)) & 0x01;                            \          reg_sh = (s32)reg_sh >> shift;                                      \        }                                                                     \      }                                                                       \      break;                                                                  \    }                                                                         \                                                                              \    /* ROR imm */                                                             \    case 0x6:                                                                 \    {                                                                         \      u32 imm = (opcode >> 7) & 0x1F;                                         \      reg_sh = reg[rm];                                                       \      if(imm == 0)                                                            \      {                                                                       \        u32 old_c_flag = c_flag;                                              \        c_flag = reg_sh & 0x01;                                               \        reg_sh = (reg_sh >> 1) | (old_c_flag << 31);                          \      }                                                                       \      else                                                                    \      {                                                                       \        c_flag = (reg_sh >> (imm - 1)) & 0x01;                                \        ror(reg_sh, reg_sh, imm);                                             \      }                                                                       \      break;                                                                  \    }                                                                         \                                                                              \    /* ROR reg */                                                             \    case 0x7:                                                                 \    {                                                                         \      get_shift_register(reg_sh);                                             \      if(shift != 0)                                                          \      {                                                                       \        c_flag = (reg_sh >> (shift - 1)) & 0x01;                              \        ror(reg_sh, reg_sh, shift);                                           \      }                                                                       \      break;                                                                  \    }                                                                         \

⌨️ 快捷键说明

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