diff options
Diffstat (limited to 'ARMInterpreter_Branch.cpp')
-rw-r--r-- | ARMInterpreter_Branch.cpp | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/ARMInterpreter_Branch.cpp b/ARMInterpreter_Branch.cpp index 910f776..a92f211 100644 --- a/ARMInterpreter_Branch.cpp +++ b/ARMInterpreter_Branch.cpp @@ -1,3 +1,4 @@ +#include <stdio.h> #include "ARM.h" @@ -32,6 +33,22 @@ s32 A_BLX_IMM(ARM* cpu) return C_S(2) + C_N(1); } +s32 A_BX(ARM* cpu) +{ + cpu->JumpTo(cpu->R[cpu->CurInstr & 0xF]); + + return C_S(2) + C_N(1); +} + +s32 A_BLX_REG(ARM* cpu) +{ + u32 lr = cpu->R[15] - 4; + cpu->JumpTo(cpu->R[cpu->CurInstr & 0xF]); + cpu->R[14] = lr; + + return C_S(2) + C_N(1); +} + s32 T_BCOND(ARM* cpu) @@ -46,6 +63,28 @@ s32 T_BCOND(ARM* cpu) return C_S(1); } +s32 T_BX(ARM* cpu) +{ + cpu->JumpTo(cpu->R[(cpu->CurInstr >> 3) & 0xF]); + + return C_S(2) + C_N(1); +} + +s32 T_BLX_REG(ARM* cpu) +{ + if (cpu->Num==1) + { + printf("!! THUMB BLX_REG ON ARM7\n"); + return 1; + } + + u32 lr = cpu->R[15] - 1; + cpu->JumpTo(cpu->R[(cpu->CurInstr >> 3) & 0xF]); + cpu->R[14] = lr; + + return C_S(2) + C_N(1); +} + } |