aboutsummaryrefslogtreecommitdiff
path: root/source/cpuexec.cpp
diff options
context:
space:
mode:
authorNebuleon Fumika2012-12-21 03:50:10 -0500
committerNebuleon Fumika2012-12-21 03:50:10 -0500
commita0d0c5e7a5bdc396b4c370a750273b6e3b963bb0 (patch)
tree6bc433422db602b974a01dffbfc5ce5d84afc578 /source/cpuexec.cpp
parent3972512b2a5c25236ea3ba586621dba6e5b56361 (diff)
downloadsnes9x2005-a0d0c5e7a5bdc396b4c370a750273b6e3b963bb0.tar.gz
snes9x2005-a0d0c5e7a5bdc396b4c370a750273b6e3b963bb0.tar.bz2
snes9x2005-a0d0c5e7a5bdc396b4c370a750273b6e3b963bb0.zip
Eliminate the latency of button press recognition, which was bad enough to lose keys entirely sometimes, and could otherwise delay a button press or release by 200 ms.
This was the entire reason I created the fork, and I finally did it! It syncs the controls every scanline of a frame, which costs about 60,000 MIPS instructions per frame to deal with. Luckily, the processor runs at 396 MHz, which means the cost of checking the controls is 1% of the CPU's power.
Diffstat (limited to 'source/cpuexec.cpp')
-rw-r--r--source/cpuexec.cpp14
1 files changed, 14 insertions, 0 deletions
diff --git a/source/cpuexec.cpp b/source/cpuexec.cpp
index 21b1574..5fb79e5 100644
--- a/source/cpuexec.cpp
+++ b/source/cpuexec.cpp
@@ -105,6 +105,10 @@
#include "sa1.h"
#include "spc7110.h"
+#ifdef SYNC_JOYPAD_AT_HBLANK
+#include "display.h"
+#endif
+
extern void S9xProcessSound (unsigned int);
void S9xMainLoop (void)
@@ -226,6 +230,16 @@ void S9xDoHBlankProcessing ()
switch (CPU.WhichEvent)
{
case HBLANK_START_EVENT:
+#ifdef SYNC_JOYPAD_AT_HBLANK
+ // Re-get the controls every hblank. A resolution algorithm in
+ // ppu.cpp will determine with greater accuracy whether a key was
+ // pressed or released during the frame.
+ uint32 i;
+ for (i = 0; i < 5; i++)
+ {
+ IPPU.JoypadsAtHBlanks [i][CPU.V_Counter] = S9xReadJoypad (i);
+ }
+#endif
if (IPPU.HDMA && CPU.V_Counter <= PPU.ScreenHeight)
IPPU.HDMA = S9xDoHDMA (IPPU.HDMA);