aboutsummaryrefslogtreecommitdiff
path: root/src/ARMInterpreter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ARMInterpreter.cpp')
-rw-r--r--src/ARMInterpreter.cpp22
1 files changed, 19 insertions, 3 deletions
diff --git a/src/ARMInterpreter.cpp b/src/ARMInterpreter.cpp
index 32b3a00..aa69816 100644
--- a/src/ARMInterpreter.cpp
+++ b/src/ARMInterpreter.cpp
@@ -32,14 +32,30 @@ namespace ARMInterpreter
void A_UNK(ARM* cpu)
{
printf("undefined ARM%d instruction %08X @ %08X\n", cpu->Num?7:9, cpu->CurInstr, cpu->R[15]-8);
- for (int i = 0; i < 16; i++) printf("R%d: %08X\n", i, cpu->R[i]);
- NDS::Halt();
+ //for (int i = 0; i < 16; i++) printf("R%d: %08X\n", i, cpu->R[i]);
+ //NDS::Halt();
+ u32 oldcpsr = cpu->CPSR;
+ cpu->CPSR &= ~0xFF;
+ cpu->CPSR |= 0xDB;
+ cpu->UpdateMode(oldcpsr, cpu->CPSR);
+
+ cpu->R_UND[2] = oldcpsr;
+ cpu->R[14] = cpu->R[15] - 4;
+ cpu->JumpTo(cpu->ExceptionBase + 0x04);
}
void T_UNK(ARM* cpu)
{
printf("undefined THUMB%d instruction %04X @ %08X\n", cpu->Num?7:9, cpu->CurInstr, cpu->R[15]-4);
- NDS::Halt();
+ //NDS::Halt();
+ u32 oldcpsr = cpu->CPSR;
+ cpu->CPSR &= ~0xFF;
+ cpu->CPSR |= 0xDB;
+ cpu->UpdateMode(oldcpsr, cpu->CPSR);
+
+ cpu->R_UND[2] = oldcpsr;
+ cpu->R[14] = cpu->R[15] - 2;
+ cpu->JumpTo(cpu->ExceptionBase + 0x04);
}