From bbd251ddbc854bd82783be0c5bebf38e2911876c Mon Sep 17 00:00:00 2001 From: StapleButter Date: Tue, 13 Jun 2017 11:17:22 +0200 Subject: [PATCH] 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(-) diff --git a/src/ARM.h b/src/ARM.h index a51c3ff1..564c7bbe 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 822bf490..340adf45 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; }