aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorStapleButter <thetotalworm@gmail.com>2018-11-09 14:10:06 +0100
committerStapleButter <thetotalworm@gmail.com>2018-11-09 14:10:06 +0100
commit27e1ca41031a0216d7d9a940b336a232217e6abf (patch)
tree27fd9cebe8d0edd2146be619f874e3f88594f7f5 /src
parent7ba32ea076496fd2d151d51264d3135a3967631f (diff)
beginning timing renovation.
smarter Reschedule(). gotta start somewhere, I guess.
Diffstat (limited to 'src')
-rw-r--r--src/NDS.cpp77
1 files changed, 44 insertions, 33 deletions
diff --git a/src/NDS.cpp b/src/NDS.cpp
index 32deeb6..f4f2c36 100644
--- a/src/NDS.cpp
+++ b/src/NDS.cpp
@@ -39,11 +39,9 @@ namespace NDS
ARM* ARM9;
ARM* ARM7;
-/*s32 ARM9Cycles, ARM7Cycles;
-s32 CompensatedCycles;
-s32 SchedCycles;*/
s32 CurIterationCycles;
s32 ARM7Offset;
+int CurCPU;
SchedEvent SchedList[Event_MAX];
u32 SchedListMask;
@@ -608,45 +606,51 @@ u32 RunFrame()
while (Running && GPU::TotalScanlines==0)
{
s32 ndscyclestorun;
- s32 ndscycles = 0;
// TODO: give it some margin, so it can directly do 17 cycles instead of 16 then 1
+ // TODO: we need to directly change CurIterationCycles when rescheduling shit
CalcIterationCycles();
- if (CPUStop & 0xFFFF)
+ if (CPUStop & 0x80000000)
{
- s32 cycles = CurIterationCycles;
- cycles = DMAs[0]->Run(cycles);
- if (cycles > 0) cycles = DMAs[1]->Run(cycles);
- if (cycles > 0) cycles = DMAs[2]->Run(cycles);
- if (cycles > 0) cycles = DMAs[3]->Run(cycles);
- ndscyclestorun = CurIterationCycles - cycles;
+ // GXFIFO stall
}
else
{
- ARM9->CyclesToRun = CurIterationCycles << 1;
- ARM9->Execute();
- ndscyclestorun = ARM9->Cycles >> 1;
- }
+ if (CPUStop & 0x0FFF)
+ {
+ s32 cycles = CurIterationCycles;
+ cycles = DMAs[0]->Run(cycles);
+ if (cycles > 0) cycles = DMAs[1]->Run(cycles);
+ if (cycles > 0) cycles = DMAs[2]->Run(cycles);
+ if (cycles > 0) cycles = DMAs[3]->Run(cycles);
+ ndscyclestorun = CurIterationCycles - cycles;
+ }
+ else
+ {
+ ARM9->CyclesToRun = CurIterationCycles << 1;
+ CurCPU = 1; ARM9->Execute(); CurCPU = 0;
+ ndscyclestorun = ARM9->Cycles >> 1;
+ }
- if (CPUStop & 0xFFFF0000)
- {
- s32 cycles = ndscyclestorun - ARM7Offset;
- cycles = DMAs[4]->Run(cycles);
- if (cycles > 0) cycles = DMAs[5]->Run(cycles);
- if (cycles > 0) cycles = DMAs[6]->Run(cycles);
- if (cycles > 0) cycles = DMAs[7]->Run(cycles);
- ARM7Offset = -cycles;
- }
- else
- {
- ARM7->CyclesToRun = ndscyclestorun - ARM7Offset;
- ARM7->Execute();
- ARM7Offset = ARM7->Cycles - ARM7->CyclesToRun;
+ if (CPUStop & 0x0FFF0000)
+ {
+ s32 cycles = ndscyclestorun - ARM7Offset;
+ cycles = DMAs[4]->Run(cycles);
+ if (cycles > 0) cycles = DMAs[5]->Run(cycles);
+ if (cycles > 0) cycles = DMAs[6]->Run(cycles);
+ if (cycles > 0) cycles = DMAs[7]->Run(cycles);
+ ARM7Offset = -cycles;
+ }
+ else
+ {
+ ARM7->CyclesToRun = ndscyclestorun - ARM7Offset;
+ CurCPU = 2; ARM7->Execute(); CurCPU = 0;
+ ARM7Offset = ARM7->Cycles - ARM7->CyclesToRun;
+ }
}
RunSystem(ndscyclestorun);
- //GPU3D::Run(ndscyclestorun);
}
return GPU::TotalScanlines;
@@ -654,11 +658,18 @@ u32 RunFrame()
void Reschedule()
{
+ s32 oldcycles = CurIterationCycles;
CalcIterationCycles();
- ARM9->CyclesToRun = CurIterationCycles << 1;
- //ARM7->CyclesToRun = CurIterationCycles - ARM7Offset;
- //ARM7->CyclesToRun = (ARM9->Cycles >> 1) - ARM7->Cycles - ARM7Offset;
+ if (CurIterationCycles > oldcycles)
+ {
+ CurIterationCycles = oldcycles;
+ return;
+ }
+
+ if (CurCPU == 1) ARM9->CyclesToRun = CurIterationCycles << 1;
+ else if (CurCPU == 2) ARM7->CyclesToRun = CurIterationCycles - ARM7Offset;
+ // this is all. a reschedule shouldn't happen during DMA or GXFIFO stall.
}
void ScheduleEvent(u32 id, bool periodic, s32 delay, void (*func)(u32), u32 param)