aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStapleButter <thetotalworm@gmail.com>2017-06-13 11:17:22 +0200
committerStapleButter <thetotalworm@gmail.com>2017-06-13 11:17:22 +0200
commitbbd251ddbc854bd82783be0c5bebf38e2911876c (patch)
treec9a5fb8fbad538e7f8e5fda1dd29d173f009b502
parent581a0954adf844143109b34435ce2e04b920a03b (diff)
fix QADD/QSUB/QDADD/QDSUB, those would write their result to the wrong register.
also make them ARM9-only.
-rw-r--r--src/ARM.h8
-rw-r--r--src/ARMInterpreter_ALU.cpp16
2 files changed, 16 insertions, 8 deletions
diff --git a/src/ARM.h b/src/ARM.h
index a51c3ff..564c7bb 100644
--- a/src/ARM.h
+++ b/src/ARM.h
@@ -241,4 +241,12 @@ public:
u32 debug;
};
+namespace ARMInterpreter
+{
+
+void A_UNK(ARM* cpu);
+void T_UNK(ARM* cpu);
+
+}
+
#endif // ARM_H
diff --git a/src/ARMInterpreter_ALU.cpp b/src/ARMInterpreter_ALU.cpp
index 822bf49..340adf4 100644
--- a/src/ARMInterpreter_ALU.cpp
+++ b/src/ARMInterpreter_ALU.cpp
@@ -985,7 +985,7 @@ void A_CLZ(ARM* cpu)
void A_QADD(ARM* cpu)
{
- // TODO: ARM9 only
+ if (cpu->Num != 0) return A_UNK(cpu);
u32 rm = cpu->R[cpu->CurInstr & 0xF];
u32 rn = cpu->R[(cpu->CurInstr >> 16) & 0xF];
@@ -997,12 +997,12 @@ void A_QADD(ARM* cpu)
cpu->CPSR |= 0x08000000;
}
- cpu->R[(cpu->CurInstr >> 16) & 0xF] = res;
+ cpu->R[(cpu->CurInstr >> 12) & 0xF] = res;
}
void A_QSUB(ARM* cpu)
{
- // TODO: ARM9 only
+ if (cpu->Num != 0) return A_UNK(cpu);
u32 rm = cpu->R[cpu->CurInstr & 0xF];
u32 rn = cpu->R[(cpu->CurInstr >> 16) & 0xF];
@@ -1014,12 +1014,12 @@ void A_QSUB(ARM* cpu)
cpu->CPSR |= 0x08000000;
}
- cpu->R[(cpu->CurInstr >> 16) & 0xF] = res;
+ cpu->R[(cpu->CurInstr >> 12) & 0xF] = res;
}
void A_QDADD(ARM* cpu)
{
- // TODO: ARM9 only
+ if (cpu->Num != 0) return A_UNK(cpu);
u32 rm = cpu->R[cpu->CurInstr & 0xF];
u32 rn = cpu->R[(cpu->CurInstr >> 16) & 0xF];
@@ -1039,12 +1039,12 @@ void A_QDADD(ARM* cpu)
cpu->CPSR |= 0x08000000;
}
- cpu->R[(cpu->CurInstr >> 16) & 0xF] = res;
+ cpu->R[(cpu->CurInstr >> 12) & 0xF] = res;
}
void A_QDSUB(ARM* cpu)
{
- // TODO: ARM9 only
+ if (cpu->Num != 0) return A_UNK(cpu);
u32 rm = cpu->R[cpu->CurInstr & 0xF];
u32 rn = cpu->R[(cpu->CurInstr >> 16) & 0xF];
@@ -1064,7 +1064,7 @@ void A_QDSUB(ARM* cpu)
cpu->CPSR |= 0x08000000;
}
- cpu->R[(cpu->CurInstr >> 16) & 0xF] = res;
+ cpu->R[(cpu->CurInstr >> 12) & 0xF] = res;
}