summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/cpuexec.c107
-rw-r--r--src/gfx.c5
-rw-r--r--src/gfx16.c5
-rw-r--r--src/globals.c4
-rw-r--r--src/snes9x.h4
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)
diff --git a/src/gfx.c b/src/gfx.c
index 3c39f87..3842d1d 100644
--- a/src/gfx.c
+++ b/src/gfx.c
@@ -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);