📄 cpu_threaded.c
字号:
u32 rd = opcode & 0x07 \#define thumb_decode_add_sp() \ u32 imm = opcode & 0x7F \#define thumb_decode_rlist() \ u32 reg_list = opcode & 0xFF \#define thumb_decode_branch_cond() \ s32 offset = (s8)(opcode & 0xFF) \#define thumb_decode_swi() \ u32 comment = opcode & 0xFF \#define thumb_decode_branch() \ u32 offset = opcode & 0x07FF \#define check_pc_region(pc) \ 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); \ } \#define translate_arm_instruction() \ check_pc_region(pc); \ opcode = address32(pc_address_block, (pc & 0x7FFF)); \ condition = block_data[block_data_position].condition; \ \ if((condition != last_condition) || (condition >= 0x20)) \ { \ condition_check_type condition_check; \ \ if((last_condition & 0x0F) != 0x0E) \ { \ generate_branch_patch_conditional(backpatch_address, translation_ptr); \ } \ \ last_condition = condition; \ \ condition &= 0x0F; \ \ if(condition != 0x0E) \ { \ arm_conditional_block_header(); \ } \ } \ \ switch((opcode >> 20) & 0xFF) \ { \ case 0x00: \ if((opcode & 0x90) == 0x90) \ { \ if(opcode & 0x20) \ { \ /* STRH rd, [rn], -rm */ \ arm_access_memory(store, down, post, u16, half_reg); \ } \ else \ { \ /* MUL rd, rm, rs */ \ arm_multiply(no, no); \ } \ } \ else \ { \ /* AND rd, rn, reg_op */ \ arm_data_proc(and, reg, no_flags); \ } \ break; \ \ case 0x01: \ if((opcode & 0x90) == 0x90) \ { \ switch((opcode >> 5) & 0x03) \ { \ case 0: \ /* MULS rd, rm, rs */ \ arm_multiply(no, yes); \ break; \ \ case 1: \ /* LDRH rd, [rn], -rm */ \ arm_access_memory(load, down, post, u16, half_reg); \ break; \ \ case 2: \ /* LDRSB rd, [rn], -rm */ \ arm_access_memory(load, down, post, s8, half_reg); \ break; \ \ case 3: \ /* LDRSH rd, [rn], -rm */ \ arm_access_memory(load, down, post, s16, half_reg); \ break; \ } \ } \ else \ { \ /* ANDS rd, rn, reg_op */ \ arm_data_proc(ands, reg_flags, flags); \ } \ break; \ \ case 0x02: \ if((opcode & 0x90) == 0x90) \ { \ if(opcode & 0x20) \ { \ /* STRH rd, [rn], -rm */ \ arm_access_memory(store, down, post, u16, half_reg); \ } \ else \ { \ /* MLA rd, rm, rs, rn */ \ arm_multiply(yes, no); \ } \ } \ else \ { \ /* EOR rd, rn, reg_op */ \ arm_data_proc(eor, reg, no_flags); \ } \ break; \ \ case 0x03: \ if((opcode & 0x90) == 0x90) \ { \ switch((opcode >> 5) & 0x03) \ { \ case 0: \ /* MLAS rd, rm, rs, rn */ \ arm_multiply(yes, yes); \ break; \ \ case 1: \ /* LDRH rd, [rn], -rm */ \ arm_access_memory(load, down, post, u16, half_reg); \ break; \ \ case 2: \ /* LDRSB rd, [rn], -rm */ \ arm_access_memory(load, down, post, s8, half_reg); \ break; \ \ case 3: \ /* LDRSH rd, [rn], -rm */ \ arm_access_memory(load, down, post, s16, half_reg); \ break; \ } \ } \ else \ { \ /* EORS rd, rn, reg_op */ \ arm_data_proc(eors, reg_flags, flags); \ } \ break; \ \ case 0x04: \ if((opcode & 0x90) == 0x90) \ { \ /* STRH rd, [rn], -imm */ \ arm_access_memory(store, down, post, u16, half_imm); \ } \ else \ { \ /* SUB rd, rn, reg_op */ \ arm_data_proc(sub, reg, no_flags); \ } \ break; \ \ case 0x05: \ if((opcode & 0x90) == 0x90) \ { \ switch((opcode >> 5) & 0x03) \ { \
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -