From 30841f5881b3b63e64680a502c541ac583bcccfd Mon Sep 17 00:00:00 2001 From: Mikael Brunnhede Date: Sun, 5 May 2019 23:58:30 +0200 Subject: 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. --- src/cpuexec.c | 97 ++++++++++++++++++++++++++++++++++++++++------------------- src/gfx.c | 5 +++ src/gfx16.c | 5 +++ src/globals.c | 4 +++ src/snes9x.h | 4 +++ 5 files changed, 84 insertions(+), 31 deletions(-) (limited to 'src') 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); -- cgit v1.2.3 From 25f5a184255518b92c5a9786312fb543fb6278d0 Mon Sep 17 00:00:00 2001 From: Mikael Brunnhede Date: Mon, 6 May 2019 13:26:17 +0200 Subject: Fix issue with save states caused by input lag fix. --- src/cpuexec.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/cpuexec.c b/src/cpuexec.c index 7102ade..950b7b9 100644 --- a/src/cpuexec.c +++ b/src/cpuexec.c @@ -384,6 +384,7 @@ S9xMainLoop(void) if (!finishedFrame) { #endif +#ifndef LAGFIX Registers.PC = CPU.PC - CPU.PCBase; #ifndef ASMCPU @@ -391,7 +392,7 @@ S9xMainLoop(void) #endif S9xAPUPackStatus(); - +#endif //if (CPU.Flags & SCAN_KEYS_FLAG) // { @@ -409,6 +410,15 @@ S9xMainLoop(void) else { finishedFrame = false; + + Registers.PC = CPU.PC - CPU.PCBase; + +#ifndef ASMCPU + S9xPackStatus(); +#endif + + S9xAPUPackStatus(); + break; } } while (!finishedFrame); -- cgit v1.2.3