summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMikael Brunnhede2019-05-05 23:58:30 +0200
committerMikael Brunnhede2019-05-05 23:58:30 +0200
commit30841f5881b3b63e64680a502c541ac583bcccfd (patch)
tree5a58bba7503650b97eaf60bc72fba0f7d95bad3f /src
parent6064e58855c7f3acc76ad55ce4ea2af985fe3c59 (diff)
downloadsnes9x2002-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.c97
-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, 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)
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);