diff --git a/src/arm/arm.c b/src/arm/arm.c index 2086f793b..3261d923f 100644 --- a/src/arm/arm.c +++ b/src/arm/arm.c @@ -301,9 +301,14 @@ void ARMRun(struct ARMCore* cpu) { } void ARMRunLoop(struct ARMCore* cpu) { - if (cpu->dynarec.inDynarec) { + if (cpu->dynarec.currentEntry) { + cpu->dynarec.inDynarec = true; + while (cpu->dynarec.currentEntry) { + void (*entry)(struct ARMCore*) = cpu->dynarec.currentEntry; + cpu->dynarec.currentEntry = NULL; + entry(cpu); + } cpu->dynarec.inDynarec = false; - cpu->dynarec.currentEntry(cpu); return; } if (cpu->executionMode == MODE_THUMB) { diff --git a/src/arm/dynarec.c b/src/arm/dynarec.c index e4b86e933..3ffc542fe 100644 --- a/src/arm/dynarec.c +++ b/src/arm/dynarec.c @@ -54,8 +54,9 @@ void ARMDynarecCountTrace(struct ARMCore* cpu, uint32_t address, enum ExecutionM ARMDynarecRecompileTrace(cpu, trace); } if (trace->entry) { - cpu->dynarec.inDynarec = true; - cpu->nextEvent = cpu->cycles; + if (!cpu->dynarec.inDynarec) { + cpu->nextEvent = cpu->cycles; + } cpu->dynarec.currentEntry = trace->entry; } } diff --git a/src/gba/memory.c b/src/gba/memory.c index 945c4c31b..a731726ca 100644 --- a/src/gba/memory.c +++ b/src/gba/memory.c @@ -243,7 +243,7 @@ static void GBASetActiveRegion(struct ARMCore* cpu, uint32_t address) { gba->lastJump = address; memory->lastPrefetchedPc = 0; memory->lastPrefetchedLoads = 0; - cpu->dynarec.inDynarec = false; + cpu->dynarec.currentEntry = NULL; if (newRegion == memory->activeRegion) { if (cpu->executor == ARM_DYNAREC && newRegion >= REGION_CART0) { ARMDynarecCountTrace(cpu, address,cpu->executionMode);