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. --- .vs/slnx.sqlite | Bin 0 -> 86016 bytes Makefile | 1 + Makefile.common | 6 ++++ src/cpuexec.c | 97 ++++++++++++++++++++++++++++++++++++++------------------ src/gfx.c | 5 +++ src/gfx16.c | 5 +++ src/globals.c | 4 +++ src/snes9x.h | 4 +++ 8 files changed, 91 insertions(+), 31 deletions(-) create mode 100644 .vs/slnx.sqlite diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite new file mode 100644 index 0000000..594fc9f Binary files /dev/null and b/.vs/slnx.sqlite differ diff --git a/Makefile b/Makefile index fb4f7d6..87733b5 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,5 @@ DEBUG=0 +LAGFIX=1 TARGET_NAME = snes9x2002 ifeq ($(platform),) diff --git a/Makefile.common b/Makefile.common index 5316a49..b7078e2 100644 --- a/Makefile.common +++ b/Makefile.common @@ -118,4 +118,10 @@ CODE_DEFINES = -fomit-frame-pointer endif endif +ifeq ($(LAGFIX), 1) +ifneq ($(ASM_CPU), 1) +DEFINES += -DLAGFIX +endif +endif + COMMON_DEFINES += $(CODE_DEFINES) $(WARNINGS_DEFINES) $(fpic) 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