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