DS: Improve step stability

This commit is contained in:
Vicki Pfau 2017-02-21 01:07:11 -08:00
parent 7389176033
commit 1039569b01
2 changed files with 23 additions and 15 deletions

View File

@ -303,11 +303,13 @@ void ARMHalt(struct ARMCore* cpu) {
} \ } \
\ \
void ARM ## VERSION ## Run(struct ARMCore* cpu) { \ void ARM ## VERSION ## Run(struct ARMCore* cpu) { \
if (cpu->cycles < cpu->nextEvent) { \
if (cpu->executionMode == MODE_THUMB) { \ if (cpu->executionMode == MODE_THUMB) { \
Thumb ## VERSION ## Step(cpu); \ Thumb ## VERSION ## Step(cpu); \
} else { \ } else { \
ARM ## VERSION ## Step(cpu); \ ARM ## VERSION ## Step(cpu); \
} \ } \
} \
if (cpu->cycles >= cpu->nextEvent) { \ if (cpu->cycles >= cpu->nextEvent) { \
cpu->irqh.processEvents(cpu); \ cpu->irqh.processEvents(cpu); \
} \ } \

View File

@ -359,7 +359,7 @@ static void DSProcessEvents(struct DSCommon* dscore) {
int32_t cycles = cpu->cycles; int32_t cycles = cpu->cycles;
cpu->cycles = 0; cpu->cycles = 0;
cpu->nextEvent = INT_MAX; cpu->nextEvent = 0;
#ifndef NDEBUG #ifndef NDEBUG
if (cycles < 0) { if (cycles < 0) {
@ -371,12 +371,12 @@ static void DSProcessEvents(struct DSCommon* dscore) {
nextEvent = mTimingTick(&dscore->timing, nextEvent); nextEvent = mTimingTick(&dscore->timing, nextEvent);
} while (ds->cpuBlocked); } while (ds->cpuBlocked);
cpu->nextEvent = nextEvent;
if (ds->earlyExit) { if (ds->earlyExit) {
ds->earlyExit = false; ds->earlyExit = false;
break; break;
} }
cpu->nextEvent = nextEvent;
if (cpu->halted) { if (cpu->halted) {
cpu->cycles = nextEvent; cpu->cycles = nextEvent;
} }
@ -397,17 +397,23 @@ void DSRunLoop(struct DS* ds) {
} }
void DS7Step(struct DS* ds) { void DS7Step(struct DS* ds) {
int32_t pc = ds->ds7.cpu->gprs[ARM_PC];
do {
while (ds->activeCpu == ds->ds9.cpu) { while (ds->activeCpu == ds->ds9.cpu) {
ARMv5RunLoop(ds->ds9.cpu); ARMv5RunLoop(ds->ds9.cpu);
} }
ARMv4Run(ds->ds7.cpu); ARMv4Run(ds->ds7.cpu);
} while (ds->ds7.cpu->halted || ds->ds7.cpu->gprs[ARM_PC] == pc);
} }
void DS9Step(struct DS* ds) { void DS9Step(struct DS* ds) {
int32_t pc = ds->ds9.cpu->gprs[ARM_PC];
do {
while (ds->activeCpu == ds->ds7.cpu) { while (ds->activeCpu == ds->ds7.cpu) {
ARMv4RunLoop(ds->ds7.cpu); ARMv4RunLoop(ds->ds7.cpu);
} }
ARMv5Run(ds->ds9.cpu); ARMv5Run(ds->ds9.cpu);
} while (ds->ds9.cpu->halted || ds->ds9.cpu->gprs[ARM_PC] == pc);
} }
void DSAttachDebugger(struct DS* ds, struct mDebugger* debugger) { void DSAttachDebugger(struct DS* ds, struct mDebugger* debugger) {