From bbd251ddbc854bd82783be0c5bebf38e2911876c Mon Sep 17 00:00:00 2001
From: StapleButter <thetotalworm@gmail.com>
Date: Tue, 13 Jun 2017 11:17:22 +0200
Subject: fix QADD/QSUB/QDADD/QDSUB, those would write their result to the
 wrong register. also make them ARM9-only.

---
 src/ARM.h                  |  8 ++++++++
 src/ARMInterpreter_ALU.cpp | 16 ++++++++--------
 2 files changed, 16 insertions(+), 8 deletions(-)

(limited to 'src')

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;
 }
 
 
-- 
cgit v1.2.3