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

📄 cpu.c

📁 psp上的GBA模拟器
💻 C
📖 第 1 页 / 共 5 页
字号:
  }                                                                           \#define calculate_reg_offset()                                                \  u32 reg_offset;                                                             \  switch((opcode >> 5) & 0x03)                                                \  {                                                                           \    /* LSL imm */                                                             \    case 0x0:                                                                 \    {                                                                         \      reg_offset = reg[rm] << ((opcode >> 7) & 0x1F);                         \      break;                                                                  \    }                                                                         \                                                                              \    /* LSR imm */                                                             \    case 0x1:                                                                 \    {                                                                         \      u32 imm = (opcode >> 7) & 0x1F;                                         \      if(imm == 0)                                                            \        reg_offset = 0;                                                       \      else                                                                    \        reg_offset = reg[rm] >> imm;                                          \      break;                                                                  \    }                                                                         \                                                                              \    /* ASR imm */                                                             \    case 0x2:                                                                 \    {                                                                         \      u32 imm = (opcode >> 7) & 0x1F;                                         \      if(imm == 0)                                                            \        reg_offset = (s32)reg[rm] >> 31;                                      \      else                                                                    \        reg_offset = (s32)reg[rm] >> imm;                                     \      break;                                                                  \    }                                                                         \                                                                              \    /* ROR imm */                                                             \    case 0x3:                                                                 \    {                                                                         \      u32 imm = (opcode >> 7) & 0x1F;                                         \      if(imm == 0)                                                            \        reg_offset = (reg[rm] >> 1) | (c_flag << 31);                         \      else                                                                    \        ror(reg_offset, reg[rm], imm);                                        \      break;                                                                  \    }                                                                         \  }                                                                           \#define calculate_flags_add(dest, src_a, src_b)                               \  calculate_z_flag(dest);                                                     \  calculate_n_flag(dest);                                                     \  calculate_c_flag_add(dest, src_a, src_b);                                   \  calculate_v_flag_add(dest, src_a, src_b)                                    \#define calculate_flags_sub(dest, src_a, src_b)                               \  calculate_z_flag(dest);                                                     \  calculate_n_flag(dest);                                                     \  calculate_c_flag_sub(dest, src_a, src_b);                                   \  calculate_v_flag_sub(dest, src_a, src_b)                                    \#define calculate_flags_logic(dest)                                           \  calculate_z_flag(dest);                                                     \  calculate_n_flag(dest)                                                      \#define extract_flags()                                                       \  n_flag = reg[REG_CPSR] >> 31;                                               \  z_flag = (reg[REG_CPSR] >> 30) & 0x01;                                      \  c_flag = (reg[REG_CPSR] >> 29) & 0x01;                                      \  v_flag = (reg[REG_CPSR] >> 28) & 0x01;                                      \#define collapse_flags()                                                      \  reg[REG_CPSR] = (n_flag << 31) | (z_flag << 30) | (c_flag << 29) |          \   (v_flag << 28) | (reg[REG_CPSR] & 0xFF)                                    \#define memory_region(r_dest, l_dest, address)                                \  r_dest = memory_regions[address >> 24];                                     \  l_dest = memory_limits[address >> 24]                                       \#define pc_region()                                                           \  memory_region(pc_region, pc_limit, pc)                                      \#define check_pc_region()                                                     \  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);                \  }                                                                           \u32 branch_targets = 0;u32 high_frequency_branch_targets = 0;#define BRANCH_ACTIVITY_THRESHOLD 50#define arm_update_pc()                                                       \  pc = reg[REG_PC]                                                            \#define arm_pc_offset(val)                                                    \  pc += val;                                                                  \  reg[REG_PC] = pc                                                            \#define arm_pc_offset_update(val)                                             \  pc += val;                                                                  \  reg[REG_PC] = pc                                                            \#define arm_pc_offset_update_direct(val)                                      \  pc = val;                                                                   \  reg[REG_PC] = pc                                                            \// It should be okay to still generate result flags, spsr will overwrite them.// This is pretty infrequent (returning from interrupt handlers, et al) so// probably not worth optimizing for.#define check_for_interrupts()                                                \  if((io_registers[REG_IE] & io_registers[REG_IF]) &&                         \   io_registers[REG_IME] && ((reg[REG_CPSR] & 0x80) == 0))                    \  {                                                                           \    reg_mode[MODE_IRQ][6] = reg[REG_PC] + 4;                                  \    spsr[MODE_IRQ] = reg[REG_CPSR];                                           \    reg[REG_CPSR] = 0xD2;                                                     \    reg[REG_PC] = 0x00000018;                                                 \    arm_update_pc();                                                          \    set_cpu_mode(MODE_IRQ);                                                   \    goto arm_loop;                                                            \  }                                                                           \#define arm_spsr_restore()                                                    \  if(rd == 15)                                                                \  {                                                                           \    if(reg[CPU_MODE] != MODE_USER)                                            \    {                                                                         \      reg[REG_CPSR] = spsr[reg[CPU_MODE]];                                    \      extract_flags();                                                        \      set_cpu_mode(cpu_modes[reg[REG_CPSR] & 0x1F]);                          \      check_for_interrupts();                                                 \    }                                                                         \    arm_update_pc();                                                          \                                                                              \    if(reg[REG_CPSR] & 0x20)                                                  \      goto thumb_loop;                                                        \  }                                                                           \#define arm_data_proc_flags_reg()                                             \  arm_decode_data_proc_reg();                                                 \  calculate_reg_sh_flags()                                                    \#define arm_data_proc_reg()                                                   \  arm_decode_data_proc_reg();                                                 \  calculate_reg_sh()                                                          \#define arm_data_proc_flags_imm()                                             \  arm_decode_data_proc_imm()                                                  \#define arm_data_proc_imm()                                                   \  arm_decode_data_proc_imm()                                                  \#define arm_data_proc(expr, type)                                             \{                                                                             \  u32 dest;                                                                   \  arm_pc_offset(8);                                                           \  arm_data_proc_##type();                                                     \  dest = expr;                                                                \  arm_pc_offset(-4);                                                          \  reg[rd] = dest;                                                             \                                                                              \  if(rd == 15)                                                                \  {                                                                           \    arm_update_pc();                                                          \  }                                                                           \}                                                                             \#define flags_vars(src_a, src_b)                                              \  u32 dest;                                                                   \  const u32 _sa = src_a;                                                      \  const u32 _sb = src_b                                                       \#define arm_data_proc_logic_flags(expr, type)                                 \{                                                                             \  arm_pc_offset(8);                                                           \  arm_data_proc_flags_##type();                                               \  u32 dest = expr;                                                            \  calculate_flags_logic(dest);                                                \  arm_pc_offset(-4);                                                          \  reg[rd] = dest;                                                             \  arm_spsr_restore();                                                         \}                                                                             \#define arm_data_proc_add_flags(src_a, src_b, type)                           \{                                                                             \  arm_pc_offset(8);                                                           \  arm_data_proc_##type();                                                     \  flags_vars(src_a, src_b);                                                   \

⌨️ 快捷键说明

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