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

📄 cpu.c

📁 psp上的GBA模拟器
💻 C
📖 第 1 页 / 共 5 页
字号:
  dest = _sa + _sb;                                                           \  calculate_flags_add(dest, _sa, _sb);                                        \  arm_pc_offset(-4);                                                          \  reg[rd] = dest;                                                             \  arm_spsr_restore();                                                         \}#define arm_data_proc_sub_flags(src_a, src_b, type)                           \{                                                                             \  arm_pc_offset(8);                                                           \  arm_data_proc_##type();                                                     \  flags_vars(src_a, src_b);                                                   \  dest = _sa - _sb;                                                           \  calculate_flags_sub(dest, _sa, _sb);                                        \  arm_pc_offset(-4);                                                          \  reg[rd] = dest;                                                             \  arm_spsr_restore();                                                         \}                                                                             \#define arm_data_proc_test_logic(expr, type)                                  \{                                                                             \  arm_pc_offset(8);                                                           \  arm_data_proc_flags_##type();                                               \  u32 dest = expr;                                                            \  calculate_flags_logic(dest);                                                \  arm_pc_offset(-4);                                                          \}                                                                             \#define arm_data_proc_test_add(src_a, src_b, type)                            \{                                                                             \  arm_pc_offset(8);                                                           \  arm_data_proc_##type();                                                     \  flags_vars(src_a, src_b);                                                   \  dest = _sa + _sb;                                                           \  calculate_flags_add(dest, _sa, _sb);                                        \  arm_pc_offset(-4);                                                          \}                                                                             \#define arm_data_proc_test_sub(src_a, src_b, type)                            \{                                                                             \  arm_pc_offset(8);                                                           \  arm_data_proc_##type();                                                     \  flags_vars(src_a, src_b);                                                   \  dest = _sa - _sb;                                                           \  calculate_flags_sub(dest, _sa, _sb);                                        \  arm_pc_offset(-4);                                                          \}                                                                             \#define arm_multiply_flags_yes(_dest)                                         \  calculate_z_flag(_dest);                                                    \  calculate_n_flag(_dest);                                                    \#define arm_multiply_flags_no(_dest)                                          \#define arm_multiply_long_flags_yes(_dest_lo, _dest_hi)                       \  z_flag = (_dest_lo == 0) & (_dest_hi == 0);                                 \  calculate_n_flag(_dest_hi)                                                  \#define arm_multiply_long_flags_no(_dest_lo, _dest_hi)                        \#define arm_multiply(add_op, flags)                                           \{                                                                             \  u32 dest;                                                                   \  arm_decode_multiply();                                                      \  dest = (reg[rm] * reg[rs]) add_op;                                          \  arm_multiply_flags_##flags(dest);                                           \  reg[rd] = dest;                                                             \  arm_pc_offset(4);                                                           \}                                                                             \#define arm_multiply_long_addop(type)                                         \  + ((type##64)((((type##64)reg[rdhi]) << 32) | reg[rdlo]));                  \#define arm_multiply_long(add_op, flags, type)                                \{                                                                             \  type##64 dest;                                                              \  u32 dest_lo;                                                                \  u32 dest_hi;                                                                \  arm_decode_multiply_long();                                                 \  dest = ((type##64)((type##32)reg[rm]) *                                     \   (type##64)((type##32)reg[rn])) add_op;                                     \  dest_lo = (u32)dest;                                                        \  dest_hi = (u32)(dest >> 32);                                                \  arm_multiply_long_flags_##flags(dest_lo, dest_hi);                          \  reg[rdlo] = dest_lo;                                                        \  reg[rdhi] = dest_hi;                                                        \  arm_pc_offset(4);                                                           \}                                                                             \const u32 psr_masks[16] ={  0x00000000, 0x000000FF, 0x0000FF00, 0x0000FFFF, 0x00FF0000,  0x00FF00FF, 0x00FFFF00, 0x00FFFFFF, 0xFF000000, 0xFF0000FF,  0xFF00FF00, 0xFF00FFFF, 0xFFFF0000, 0xFFFF00FF, 0xFFFFFF00,  0xFFFFFFFF};#define arm_psr_read(dummy, psr_reg)                                          \  collapse_flags();                                                           \  reg[rd] = psr_reg                                                           \#define arm_psr_store_cpsr(source)                                            \  reg[REG_CPSR] = (source & store_mask) | (reg[REG_CPSR] & (~store_mask));    \  extract_flags();                                                            \  if(store_mask & 0xFF)                                                       \  {                                                                           \    set_cpu_mode(cpu_modes[reg[REG_CPSR] & 0x1F]);                            \    check_for_interrupts();                                                   \  }                                                                           \#define arm_psr_store_spsr(source)                                            \  u32 _psr = spsr[reg[CPU_MODE]];                                             \  spsr[reg[CPU_MODE]] = (source & store_mask) | (_psr & (~store_mask))        \#define arm_psr_store(source, psr_reg)                                        \  const u32 store_mask = psr_masks[psr_field];                                \  arm_psr_store_##psr_reg(source)                                             \#define arm_psr_src_reg reg[rm]#define arm_psr_src_imm imm#define arm_psr(op_type, transfer_type, psr_reg)                              \{                                                                             \  arm_decode_psr_##op_type();                                                 \  arm_pc_offset(4);                                                           \  arm_psr_##transfer_type(arm_psr_src_##op_type, psr_reg);                    \}                                                                             \#define arm_data_trans_reg()                                                  \  arm_decode_data_trans_reg();                                                \  calculate_reg_offset()                                                      \#define arm_data_trans_imm()                                                  \  arm_decode_data_trans_imm()                                                 \#define arm_data_trans_half_reg()                                             \  arm_decode_half_trans_r()                                                   \#define arm_data_trans_half_imm()                                             \  arm_decode_half_trans_of()                                                  \#define aligned_address_mask8  0xF0000000#define aligned_address_mask16 0xF0000001#define aligned_address_mask32 0xF0000003#define fast_read_memory(size, type, address, dest)                           \{                                                                             \  u8 *map;                                                                    \  u32 _address = address;                                                     \                                                                              \  if(_address < 0x10000000)                                                   \  {                                                                           \    memory_region_access_read_##type[_address >> 24]++;                       \    memory_reads_##type++;                                                    \  }                                                                           \  if(((_address >> 24) == 0) && (pc >= 0x4000))                               \  {                                                                           \    dest = *((type *)((u8 *)&bios_read_protect + (_address & 0x03)));         \  }                                                                           \  else                                                                        \                                                                              \  if(((_address & aligned_address_mask##size) == 0) &&                        \   (map = memory_map_read[address >> 15]))                                    \  {                                                                           \    dest = *((type *)((u8 *)map + (_address & 0x7FFF)));                      \  }                                                                           \  else                                                                        \  {                                                                           \    dest = (type)read_memory##size(_address);                                 \  }                                                                           \}                                                                             \#define fast_read_memory_s16(address, dest)                                   \{                                                                             \  u8 *map;                                                                    \  u32 _address = address;                                                     \  if((_address < 0x4000) && (pc >= 0x4000))                                   \  {                                                                           \    u32 b = 0xe55ec002;                                                       \                                                                              \    dest = *((s16 *)(&b + (_address & 0x03)));                                \  }                                                                           \  else                                                                        \                                                                              \                                                                              \  if(_address < 0x10000000)                                                   \  {                                                                           \    memory_region_access_read_s16[_address >> 24]++;                          \    memory_reads_s16++;                                                       \  }                                                                           \  if(((_address & aligned_address_mask16) == 0) &&                            \   (map = memory_map_read[_address >> 15]))                                   \  {                                                                           \    dest = *((s16 *)((u8 *)map + (_address & 0x7FFF)));                       \  }                                                                           \

⌨️ 快捷键说明

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