📄 cpu.c
字号:
/* ASR imm */ \ case 0x4: \ { \ u32 imm = (opcode >> 7) & 0x1F; \ reg_sh = reg[rm]; \ \ if(imm == 0) \ reg_sh = (s32)reg_sh >> 31; \ else \ reg_sh = (s32)reg_sh >> imm; \ break; \ } \ \ /* ASR reg */ \ case 0x5: \ { \ get_shift_register(reg_sh); \ if(shift <= 31) \ reg_sh = (s32)reg_sh >> shift; \ else \ reg_sh = (s32)reg_sh >> 31; \ break; \ } \ \ /* ROR imm */ \ case 0x6: \ { \ u32 imm = (opcode >> 7) & 0x1F; \ \ if(imm == 0) \ reg_sh = (reg[rm] >> 1) | (c_flag << 31); \ else \ ror(reg_sh, reg[rm], imm); \ break; \ } \ \ /* ROR reg */ \ case 0x7: \ { \ get_shift_register(reg_sh); \ ror(reg_sh, reg_sh, shift); \ break; \ } \ } \#define calculate_reg_sh_flags() \ u32 reg_sh; \ switch((opcode >> 4) & 0x07) \ { \ /* LSL imm */ \ case 0x0: \ { \ u32 imm = (opcode >> 7) & 0x1F; \ reg_sh = reg[rm]; \ \ if(imm != 0) \ { \ c_flag = (reg_sh >> (32 - imm)) & 0x01; \ reg_sh <<= imm; \ } \ \ break; \ } \ \ /* LSL reg */ \ case 0x1: \ { \ get_shift_register(reg_sh); \ if(shift != 0) \ { \ if(shift > 31) \ { \ if(shift == 32) \ c_flag = reg_sh & 0x01; \ else \ c_flag = 0; \ reg_sh = 0; \ } \ else \ { \ c_flag = (reg_sh >> (32 - shift)) & 0x01; \ reg_sh <<= shift; \ } \ } \ break; \ } \ \ /* LSR imm */ \ case 0x2: \ { \ u32 imm = (opcode >> 7) & 0x1F; \ reg_sh = reg[rm]; \ if(imm == 0) \ { \ c_flag = reg_sh >> 31; \ reg_sh = 0; \ } \ else \ { \ c_flag = (reg_sh >> (imm - 1)) & 0x01; \ reg_sh >>= imm; \ } \ break; \ } \ \ /* LSR reg */ \ case 0x3: \ { \ get_shift_register(reg_sh); \ if(shift != 0) \ { \ if(shift > 31) \ { \ if(shift == 32) \ c_flag = (reg_sh >> 31) & 0x01; \ else \ c_flag = 0; \ reg_sh = 0; \ } \ else \ { \ c_flag = (reg_sh >> (shift - 1)) & 0x01; \ reg_sh >>= shift; \ } \ } \ break; \ } \ \ /* ASR imm */ \ case 0x4: \ { \ u32 imm = (opcode >> 7) & 0x1F; \ reg_sh = reg[rm]; \ if(imm == 0) \ { \ reg_sh = (s32)reg_sh >> 31; \ c_flag = reg_sh & 0x01; \ } \ else \ { \ c_flag = (reg_sh >> (imm - 1)) & 0x01; \ reg_sh = (s32)reg_sh >> imm; \ } \ break; \ } \ \ /* ASR reg */ \ case 0x5: \ { \ get_shift_register(reg_sh); \ if(shift != 0) \ { \ if(shift > 31) \ { \ reg_sh = (s32)reg_sh >> 31; \ c_flag = reg_sh & 0x01; \ } \ else \ { \ c_flag = (reg_sh >> (shift - 1)) & 0x01; \ reg_sh = (s32)reg_sh >> shift; \ } \ } \ break; \ } \ \ /* ROR imm */ \ case 0x6: \ { \ u32 imm = (opcode >> 7) & 0x1F; \ reg_sh = reg[rm]; \ if(imm == 0) \ { \ u32 old_c_flag = c_flag; \ c_flag = reg_sh & 0x01; \ reg_sh = (reg_sh >> 1) | (old_c_flag << 31); \ } \ else \ { \ c_flag = (reg_sh >> (imm - 1)) & 0x01; \ ror(reg_sh, reg_sh, imm); \ } \ break; \ } \ \ /* ROR reg */ \ case 0x7: \ { \ get_shift_register(reg_sh); \ if(shift != 0) \ { \ c_flag = (reg_sh >> (shift - 1)) & 0x01; \ ror(reg_sh, reg_sh, shift); \ } \ break; \ } \
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -