aboutsummaryrefslogtreecommitdiff
path: root/ARMInterpreter_Branch.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ARMInterpreter_Branch.cpp')
-rw-r--r--ARMInterpreter_Branch.cpp39
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);
+}
+
}