📄 cpu.c
字号:
} \#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 + -