aboutsummaryrefslogtreecommitdiff
path: root/ARMInterpreter_Branch.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ARMInterpreter_Branch.cpp')
-rw-r--r--ARMInterpreter_Branch.cpp21
1 files changed, 21 insertions, 0 deletions
diff --git a/ARMInterpreter_Branch.cpp b/ARMInterpreter_Branch.cpp
index a92f211..879b64f 100644
--- a/ARMInterpreter_Branch.cpp
+++ b/ARMInterpreter_Branch.cpp
@@ -85,6 +85,27 @@ s32 T_BLX_REG(ARM* cpu)
return C_S(2) + C_N(1);
}
+s32 T_BL_LONG_1(ARM* cpu)
+{
+ s32 offset = (s32)((cpu->CurInstr & 0x7FF) << 21) >> 9;
+ cpu->R[14] = cpu->R[15] + offset;
+
+ return C_S(1);
+}
+
+s32 T_BL_LONG_2(ARM* cpu)
+{
+ s32 offset = (cpu->CurInstr & 0x7FF) << 1;
+ u32 pc = cpu->R[14] + offset;
+ cpu->R[14] = (cpu->R[15] - 2) | 1;
+
+ if ((cpu->Num==1) || (cpu->CurInstr & (1<<12)))
+ pc |= 1;
+
+ cpu->JumpTo(pc);
+ return C_S(2) + C_N(1);
+}
+
}