all repos — mgba @ 1039569b01af29472edff27ad8eacc5883abbfd0

mGBA Game Boy Advance Emulator

DS: Improve step stability
Vicki Pfau vi@endrift.com
Tue, 21 Feb 2017 01:07:11 -0800
commit

1039569b01af29472edff27ad8eacc5883abbfd0

parent

7389176033b34ed4eb20c4d3ebc180abc5f27d01

2 files changed, 23 insertions(+), 15 deletions(-)

jump to
M src/arm/arm.csrc/arm/arm.c

@@ -303,10 +303,12 @@ instruction(cpu, opcode); \

} \ \ void ARM ## VERSION ## Run(struct ARMCore* cpu) { \ - if (cpu->executionMode == MODE_THUMB) { \ - Thumb ## VERSION ## Step(cpu); \ - } else { \ - ARM ## VERSION ## Step(cpu); \ + if (cpu->cycles < cpu->nextEvent) { \ + if (cpu->executionMode == MODE_THUMB) { \ + Thumb ## VERSION ## Step(cpu); \ + } else { \ + ARM ## VERSION ## Step(cpu); \ + } \ } \ if (cpu->cycles >= cpu->nextEvent) { \ cpu->irqh.processEvents(cpu); \
M src/ds/ds.csrc/ds/ds.c

@@ -359,7 +359,7 @@ while (cpu->cycles >= nextEvent) {

int32_t cycles = cpu->cycles; cpu->cycles = 0; - cpu->nextEvent = INT_MAX; + cpu->nextEvent = 0; #ifndef NDEBUG if (cycles < 0) {

@@ -371,12 +371,12 @@ do {

nextEvent = mTimingTick(&dscore->timing, nextEvent); } while (ds->cpuBlocked); - cpu->nextEvent = nextEvent; - if (ds->earlyExit) { ds->earlyExit = false; break; } + + cpu->nextEvent = nextEvent; if (cpu->halted) { cpu->cycles = nextEvent; }

@@ -397,17 +397,23 @@ }

} void DS7Step(struct DS* ds) { - while (ds->activeCpu == ds->ds9.cpu) { - ARMv5RunLoop(ds->ds9.cpu); - } - ARMv4Run(ds->ds7.cpu); + int32_t pc = ds->ds7.cpu->gprs[ARM_PC]; + do { + while (ds->activeCpu == ds->ds9.cpu) { + ARMv5RunLoop(ds->ds9.cpu); + } + ARMv4Run(ds->ds7.cpu); + } while (ds->ds7.cpu->halted || ds->ds7.cpu->gprs[ARM_PC] == pc); } void DS9Step(struct DS* ds) { - while (ds->activeCpu == ds->ds7.cpu) { - ARMv4RunLoop(ds->ds7.cpu); - } - ARMv5Run(ds->ds9.cpu); + int32_t pc = ds->ds9.cpu->gprs[ARM_PC]; + do { + while (ds->activeCpu == ds->ds7.cpu) { + ARMv4RunLoop(ds->ds7.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) {