aboutsummaryrefslogtreecommitdiff
path: root/ARM.h
diff options
context:
space:
mode:
Diffstat (limited to 'ARM.h')
-rw-r--r--ARM.h36
1 files changed, 36 insertions, 0 deletions
diff --git a/ARM.h b/ARM.h
index b1ce0bf..cd4a417 100644
--- a/ARM.h
+++ b/ARM.h
@@ -9,6 +9,9 @@
// lame
#define C_S(x) x
#define C_N(x) x
+#define C_I(x) x
+
+#define ROR(x, n) (((x) >> (n)) | ((x) << (32-(n))))
class ARM
{
@@ -19,8 +22,39 @@ public:
void Reset();
void JumpTo(u32 addr);
+ void RestoreCPSR();
+
s32 Execute(s32 cycles);
+ bool CheckCondition(u32 code)
+ {
+ if (code == 0xE) return true;
+ if (ConditionTable[code] & (1 << (CPSR>>28))) return true;
+ return false;
+ }
+
+ void SetC(bool c)
+ {
+ if (c) CPSR |= 0x20000000;
+ else CPSR &= ~0x20000000;
+ }
+
+ void SetNZ(bool n, bool z)
+ {
+ CPSR &= ~0xC0000000;
+ if (n) CPSR |= 0x80000000;
+ if (z) CPSR |= 0x40000000;
+ }
+
+ void SetNZCV(bool n, bool z, bool c, bool v)
+ {
+ CPSR &= ~0xF0000000;
+ if (n) CPSR |= 0x80000000;
+ if (z) CPSR |= 0x40000000;
+ if (c) CPSR |= 0x20000000;
+ if (v) CPSR |= 0x10000000;
+ }
+
u32 Read32(u32 addr)
{
if (Num) return NDS::ARM7Read32(addr);
@@ -41,6 +75,8 @@ public:
u32 NextInstr;
u32 ExceptionBase;
+
+ static u32 ConditionTable[16];
};
#endif // ARM_H