summaryrefslogtreecommitdiff
path: root/src/frame_skip.cpp
diff options
context:
space:
mode:
authorToad King2012-06-14 03:21:06 -0400
committerToad King2012-06-14 03:21:06 -0400
commit6fb0c7a7a53e1eba7a0f5dc5b1ade312a0d76119 (patch)
tree885cf7f507139b795ba7b2a6fb829dc044da39dd /src/frame_skip.cpp
downloadsnes9x2002-6fb0c7a7a53e1eba7a0f5dc5b1ade312a0d76119.tar.gz
snes9x2002-6fb0c7a7a53e1eba7a0f5dc5b1ade312a0d76119.tar.bz2
snes9x2002-6fb0c7a7a53e1eba7a0f5dc5b1ade312a0d76119.zip
initial pocketsnes commit
Diffstat (limited to 'src/frame_skip.cpp')
-rw-r--r--src/frame_skip.cpp99
1 files changed, 99 insertions, 0 deletions
diff --git a/src/frame_skip.cpp b/src/frame_skip.cpp
new file mode 100644
index 0000000..d656a0d
--- /dev/null
+++ b/src/frame_skip.cpp
@@ -0,0 +1,99 @@
+#include <unistd.h>
+#include <sys/time.h>
+#include <time.h>
+#include <math.h>
+#include "frame_skip.h"
+#include "memmap.h"
+
+#ifndef uclock_t
+#define uclock_t unsigned int
+#endif
+
+#define TICKS_PER_SEC 1000000UL
+//#define CPU_FPS 60
+static int CPU_FPS=60;
+static uclock_t F;
+
+#define MAX_FRAMESKIP 10
+
+
+static char init_frame_skip = 1;
+char skip_next_frame = 0;
+static struct timeval init_tv = { 0, 0 };
+
+
+void reset_frame_skip(void)
+{
+ //static Uint8 init=0;
+
+ init_tv.tv_usec = 0;
+ init_tv.tv_sec = 0;
+ skip_next_frame = 0;
+ init_frame_skip = 1;
+ CPU_FPS=Memory.ROMFramesPerSecond;
+
+ F = (uclock_t) ((double) TICKS_PER_SEC / CPU_FPS);
+}
+
+uclock_t get_ticks(void)
+{
+ struct timeval tv;
+
+ gettimeofday(&tv, 0);
+ if (init_tv.tv_sec == 0)
+ init_tv = tv;
+ return (tv.tv_sec - init_tv.tv_sec) * TICKS_PER_SEC + tv.tv_usec -
+ init_tv.tv_usec;
+
+
+}
+
+int frame_skip(void)
+{
+ static int f2skip;
+ static uclock_t sec = 0;
+ static uclock_t rfd;
+ static uclock_t target;
+ static int nbFrame = 0;
+ static int skpFrm = 0;
+
+ if (init_frame_skip) {
+ init_frame_skip = 0;
+ target = get_ticks();
+ nbFrame = 0;
+ //f2skip=0;
+ //skpFrm=0;
+ sec = 0;
+ return 0;
+ }
+
+ target += F;
+ if (f2skip > 0) {
+ f2skip--;
+ skpFrm++;
+ return 1;
+ } else
+ skpFrm = 0;
+
+
+ rfd = get_ticks();
+
+ if (rfd < target && f2skip == 0) {
+ while (get_ticks() < target);
+ } else {
+ f2skip = (rfd - target) / (double) F;
+ if (f2skip > MAX_FRAMESKIP) {
+ f2skip = MAX_FRAMESKIP;
+ reset_frame_skip();
+ }
+ // printf("Skip %d frame(s) %lu %lu\n",f2skip,target,rfd);
+ }
+
+
+ nbFrame++;
+ if (get_ticks() - sec >= TICKS_PER_SEC) {
+ nbFrame = 0;
+ sec = get_ticks();
+ }
+ return 0;
+}