diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/cpuexec.c | 107 | ||||
-rw-r--r-- | src/gfx.c | 5 | ||||
-rw-r--r-- | src/gfx16.c | 5 | ||||
-rw-r--r-- | src/globals.c | 4 | ||||
-rw-r--r-- | src/snes9x.h | 4 |
5 files changed, 94 insertions, 31 deletions
diff --git a/src/cpuexec.c b/src/cpuexec.c index ad7b254..950b7b9 100644 --- a/src/cpuexec.c +++ b/src/cpuexec.c @@ -131,6 +131,10 @@ void S9xMainLoop_SA1_APU(void) S9xSA1MainLoop();
DO_HBLANK_CHECK();
+#ifdef LAGFIX
+ if (finishedFrame) + break;
+#endif
}
}
@@ -196,6 +200,10 @@ void S9xMainLoop_SA1_NoAPU(void) S9xSA1MainLoop();
DO_HBLANK_CHECK();
+#ifdef LAGFIX
+ if (finishedFrame) + break;
+#endif
}
}
// USE_SA1
@@ -260,6 +268,11 @@ void S9xMainLoop_NoSA1_APU(void) //S9xUpdateAPUTimer ();
DO_HBLANK_CHECK();
+
+#ifdef LAGFIX
+ if (finishedFrame) + break;
+#endif
}
}
@@ -323,6 +336,10 @@ void S9xMainLoop_NoSA1_NoAPU(void) DO_HBLANK_CHECK();
+#ifdef LAGFIX
+ if (finishedFrame) + break;
+#endif
}
}
#endif
@@ -331,53 +348,81 @@ void S9xMainLoop_NoSA1_NoAPU(void) void
S9xMainLoop(void)
{
-#ifndef ASMCPU
- if (Settings.APUEnabled == 1)
+#ifdef LAGFIX
+ do
{
-#ifdef USE_SA1
- if (Settings.SA1)
- S9xMainLoop_SA1_APU();
- else
#endif
- S9xMainLoop_NoSA1_APU();
- }
- else
- {
+#ifndef ASMCPU
+ if (Settings.APUEnabled == 1)
+ {
#ifdef USE_SA1
- if (Settings.SA1)
- S9xMainLoop_SA1_NoAPU();
+ if (Settings.SA1)
+ S9xMainLoop_SA1_APU();
+ else
+#endif
+ S9xMainLoop_NoSA1_APU();
+ }
else
+ {
+#ifdef USE_SA1
+ if (Settings.SA1)
+ S9xMainLoop_SA1_NoAPU();
+ else
#endif
- S9xMainLoop_NoSA1_NoAPU();
- }
+ S9xMainLoop_NoSA1_NoAPU();
+ }
#else
#ifdef ASM_SPC700
- if (Settings.asmspc700)
- asmMainLoop_spcAsm(&CPU);
- else
+ if (Settings.asmspc700)
+ asmMainLoop_spcAsm(&CPU);
+ else
#endif
- asmMainLoop_spcC(&CPU);
+ asmMainLoop_spcC(&CPU);
#endif
- Registers.PC = CPU.PC - CPU.PCBase;
+
+#ifdef LAGFIX
+ if (!finishedFrame)
+ {
+#endif
+#ifndef LAGFIX
+ Registers.PC = CPU.PC - CPU.PCBase;
#ifndef ASMCPU
- S9xPackStatus();
+ S9xPackStatus();
#endif
- S9xAPUPackStatus();
+ S9xAPUPackStatus();
+#endif
+ //if (CPU.Flags & SCAN_KEYS_FLAG)
+ // {
+ CPU.Flags &= ~SCAN_KEYS_FLAG;
+ //}
- //if (CPU.Flags & SCAN_KEYS_FLAG)
- // {
- CPU.Flags &= ~SCAN_KEYS_FLAG;
- //}
+ if (CPU.BRKTriggered && Settings.SuperFX && !CPU.TriedInterleavedMode2)
+ {
+ CPU.TriedInterleavedMode2 = TRUE;
+ CPU.BRKTriggered = FALSE;
+ S9xDeinterleaveMode2();
+ }
+#ifdef LAGFIX
+ }
+ else
+ {
+ finishedFrame = false; + + Registers.PC = CPU.PC - CPU.PCBase;
- if (CPU.BRKTriggered && Settings.SuperFX && !CPU.TriedInterleavedMode2)
- {
- CPU.TriedInterleavedMode2 = TRUE;
- CPU.BRKTriggered = FALSE;
- S9xDeinterleaveMode2();
- }
+#ifndef ASMCPU
+ S9xPackStatus();
+#endif
+
+ S9xAPUPackStatus(); + + break;
+ }
+ } while (!finishedFrame);
+#endif
}
void S9xSetIRQ(uint32 source)
@@ -635,6 +635,11 @@ void S9xEndScreenRefresh() S9xDeinitUpdate(IPPU.RenderedScreenWidth, IPPU.RenderedScreenHeight, 1); } + +#ifdef LAGFIX + finishedFrame = true; +#endif + #ifndef RC_OPTIMIZED S9xApplyCheats(); #endif diff --git a/src/gfx16.c b/src/gfx16.c index 5653a44..51d1240 100644 --- a/src/gfx16.c +++ b/src/gfx16.c @@ -655,6 +655,11 @@ void S9xEndScreenRefresh() S9xDeinitUpdate(IPPU.RenderedScreenWidth, IPPU.RenderedScreenHeight, 1); } + +#ifdef LAGFIX + finishedFrame = true; +#endif + #ifndef RC_OPTIMIZED S9xApplyCheats(); #endif diff --git a/src/globals.c b/src/globals.c index 8d09213..f7bfe5e 100644 --- a/src/globals.c +++ b/src/globals.c @@ -162,6 +162,10 @@ uint32 current_graphic_format = RGB565; uint8 GetBank = 0; SCheatData Cheat; +#ifdef LAGFIX +bool8 finishedFrame = false; +#endif + SoundStatus so; SSoundData SoundData; int Echo [24000]; diff --git a/src/snes9x.h b/src/snes9x.h index 3bc6df0..424cce8 100644 --- a/src/snes9x.h +++ b/src/snes9x.h @@ -378,6 +378,10 @@ extern SCPUState CPU; extern SSNESGameFixes SNESGameFixes;
extern char String [513];
+#ifdef LAGFIX
+extern bool8 finishedFrame;
+#endif
+
void S9xExit(void);
void S9xMessage(int type, int number, const char* message);
void S9xLoadSDD1Data(void);
|