diff options
author | StapleButter <thetotalworm@gmail.com> | 2017-06-13 11:17:22 +0200 |
---|---|---|
committer | StapleButter <thetotalworm@gmail.com> | 2017-06-13 11:17:22 +0200 |
commit | bbd251ddbc854bd82783be0c5bebf38e2911876c (patch) | |
tree | c9a5fb8fbad538e7f8e5fda1dd29d173f009b502 | |
parent | 581a0954adf844143109b34435ce2e04b920a03b (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.h | 8 | ||||
-rw-r--r-- | src/ARMInterpreter_ALU.cpp | 16 |
2 files changed, 16 insertions, 8 deletions
@@ -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; } |