diff options
author | Mikael Brunnhede | 2019-05-05 23:58:30 +0200 |
---|---|---|
committer | Mikael Brunnhede | 2019-05-05 23:58:30 +0200 |
commit | 30841f5881b3b63e64680a502c541ac583bcccfd (patch) | |
tree | 5a58bba7503650b97eaf60bc72fba0f7d95bad3f /src | |
parent | 6064e58855c7f3acc76ad55ce4ea2af985fe3c59 (diff) | |
download | snes9x2002-30841f5881b3b63e64680a502c541ac583bcccfd.tar.gz snes9x2002-30841f5881b3b63e64680a502c541ac583bcccfd.tar.bz2 snes9x2002-30841f5881b3b63e64680a502c541ac583bcccfd.zip |
Port the input lag fix already present in the other snes9x cores. With this fix active, the main loop exit occurs right after generating the finished frame, but before reading the input. This means each new frame begins with reading input, then running game logic, ensuring the input used is as fresh as possible.
Diffstat (limited to 'src')
-rw-r--r-- | src/cpuexec.c | 97 | ||||
-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, 84 insertions, 31 deletions
diff --git a/src/cpuexec.c b/src/cpuexec.c index ad7b254..7102ade 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,71 @@ 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);
#endif
- asmMainLoop_spcC(&CPU);
+
+#ifdef LAGFIX
+ if (!finishedFrame)
+ {
#endif
- Registers.PC = CPU.PC - CPU.PCBase;
+ Registers.PC = CPU.PC - CPU.PCBase;
#ifndef ASMCPU
- S9xPackStatus();
+ S9xPackStatus();
#endif
- S9xAPUPackStatus();
+ S9xAPUPackStatus();
- //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();
- }
+ if (CPU.BRKTriggered && Settings.SuperFX && !CPU.TriedInterleavedMode2)
+ {
+ CPU.TriedInterleavedMode2 = TRUE;
+ CPU.BRKTriggered = FALSE;
+ S9xDeinterleaveMode2();
+ }
+#ifdef LAGFIX
+ }
+ else
+ {
+ finishedFrame = false; + 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);
|