aboutsummaryrefslogtreecommitdiff
path: root/src/ARM.cpp
diff options
context:
space:
mode:
authorRSDuck <rsduck@users.noreply.github.com>2020-04-25 13:40:51 +0200
committerRSDuck <rsduck@users.noreply.github.com>2020-04-26 13:05:17 +0200
commit3787bab1f69ae22d3e8106d70598ce923e5efe70 (patch)
tree33f1f2133832cc75e4d82b0c75c4268441c6c0cf /src/ARM.cpp
parent5d0f244f3c86c2b1c65566bffa3972ae1dbac27b (diff)
implement block linking + some refactoring
currently only supported for x64
Diffstat (limited to 'src/ARM.cpp')
-rw-r--r--src/ARM.cpp37
1 files changed, 20 insertions, 17 deletions
diff --git a/src/ARM.cpp b/src/ARM.cpp
index 9ab9546..32cb91c 100644
--- a/src/ARM.cpp
+++ b/src/ARM.cpp
@@ -206,15 +206,15 @@ void ARMv5::JumpTo(u32 addr, bool restorecpsr)
if (addr & 0x2)
{
NextInstr[0] = CodeRead32(addr-2, true) >> 16;
- Cycles += CodeCycles;
+ Cycles -= CodeCycles;
NextInstr[1] = CodeRead32(addr+2, false);
- Cycles += CodeCycles;
+ Cycles -= CodeCycles;
}
else
{
NextInstr[0] = CodeRead32(addr, true);
NextInstr[1] = NextInstr[0] >> 16;
- Cycles += CodeCycles;
+ Cycles -= CodeCycles;
}
CPSR |= 0x20;
@@ -227,9 +227,9 @@ void ARMv5::JumpTo(u32 addr, bool restorecpsr)
if (newregion != oldregion) SetupCodeMem(addr);
NextInstr[0] = CodeRead32(addr, true);
- Cycles += CodeCycles;
+ Cycles -= CodeCycles;
NextInstr[1] = CodeRead32(addr+4, false);
- Cycles += CodeCycles;
+ Cycles -= CodeCycles;
CPSR &= ~0x20;
}
@@ -272,7 +272,7 @@ void ARMv4::JumpTo(u32 addr, bool restorecpsr)
NextInstr[0] = CodeRead16(addr);
NextInstr[1] = CodeRead16(addr+2);
- Cycles += NDS::ARM7MemTimings[CodeCycles][0] + NDS::ARM7MemTimings[CodeCycles][1];
+ Cycles -= NDS::ARM7MemTimings[CodeCycles][0] + NDS::ARM7MemTimings[CodeCycles][1];
CPSR |= 0x20;
}
@@ -285,7 +285,7 @@ void ARMv4::JumpTo(u32 addr, bool restorecpsr)
NextInstr[0] = CodeRead32(addr);
NextInstr[1] = CodeRead32(addr+4);
- Cycles += NDS::ARM7MemTimings[CodeCycles][2] + NDS::ARM7MemTimings[CodeCycles][3];
+ Cycles -= NDS::ARM7MemTimings[CodeCycles][2] + NDS::ARM7MemTimings[CodeCycles][3];
CPSR &= ~0x20;
}
@@ -544,7 +544,7 @@ void ARMv5::Execute()
}*/
if (IRQ) TriggerIRQ();
- NDS::ARM9Timestamp += Cycles;
+ NDS::ARM9Timestamp -= Cycles;
Cycles = 0;
}
@@ -584,14 +584,16 @@ void ARMv5::ExecuteJIT()
return;
}
- ARMJIT::JitBlockEntry block = ARMJIT::LookUpBlock<0>(instrAddr);
+ // hack so Cycles <= 0 becomes Cycles < 0
+ Cycles = NDS::ARM9Target - NDS::ARM9Timestamp - 1;
+
+ ARMJIT::JitBlockEntry block = ARMJIT::LookUpBlockEntry(ARMJIT::TranslateAddr<0>(instrAddr));
if (block)
- Cycles += block();
+ ARM_Dispatch(this, block);
else
ARMJIT::CompileBlock(this);
- NDS::ARM9Timestamp += Cycles;
- Cycles = 0;
+ NDS::ARM9Timestamp = NDS::ARM9Target - (Cycles + 1);
if (StopExecution)
{
@@ -685,7 +687,7 @@ void ARMv4::Execute()
}*/
if (IRQ) TriggerIRQ();
- NDS::ARM7Timestamp += Cycles;
+ NDS::ARM7Timestamp -= Cycles;
Cycles = 0;
}
@@ -725,14 +727,15 @@ void ARMv4::ExecuteJIT()
return;
}
- ARMJIT::JitBlockEntry block = ARMJIT::LookUpBlock<1>(instrAddr);
+ Cycles = NDS::ARM7Target - NDS::ARM7Timestamp - 1;
+
+ ARMJIT::JitBlockEntry block = ARMJIT::LookUpBlockEntry(ARMJIT::TranslateAddr<1>(instrAddr));
if (block)
- Cycles += block();
+ ARM_Dispatch(this, block);
else
ARMJIT::CompileBlock(this);
- NDS::ARM7Timestamp += Cycles;
- Cycles = 0;
+ NDS::ARM7Timestamp = NDS::ARM7Target - (Cycles + 1);
// TODO optimize this shit!!!
if (StopExecution)