[Tuxnes-devel] Code Sharing Patch
Brought to you by:
tmmm
From: W. M. P. <mi...@fl...> - 2002-03-24 17:00:15
|
Enclosed you should find a patch to TuxNES 0.75 that attempts to share code between renderers at bit more. It adds a file named renderer_util.c that is a collection of functions used by the renderers. This patch requires my SDL patch, which I emailed to this mailing list a few days ago. My SDL patch is also available at http://www.flyn.org. I have not tested the trivial changes to w.c and ggi.c, as I do not use these systems. Please let me know what you think. ================================================================================ diff -u --new-file --recursive tuxnes-0.75-sdl/Makefile.am tuxnes-0.75-codeshare/Makefile.am --- tuxnes-0.75-sdl/Makefile.am Sun Mar 24 17:34:31 2002 +++ tuxnes-0.75-codeshare/Makefile.am Sun Mar 24 16:28:43 2002 @@ -6,8 +6,8 @@ tuxnes_SOURCES = x86.S d6502.c dynrec.c emu.c fb.c gamegenie.c io.c mapper.c \ sdl.c sound.c sound.h ggi.c x11.c w.c consts.h gamegenie.h globals.h \ - mapper.h renderer.c renderer.h ntsc_pal.c unzip.c unzip.h \ - ziploader.c ziploader.h + mapper.h renderer.c renderer.h renderer_util.c ntsc_pal.c unzip.c \ + unzip.h ziploader.c ziploader.h EXTRA_tuxnes_SOURCES = pixels.h tuxnes_LDADD = table.o diff -u --new-file --recursive tuxnes-0.75-sdl/ggi.c tuxnes-0.75-codeshare/ggi.c --- tuxnes-0.75-sdl/ggi.c Wed Apr 11 23:45:47 2001 +++ tuxnes-0.75-codeshare/ggi.c Sun Mar 24 17:31:06 2002 @@ -20,8 +20,6 @@ #include <unistd.h> #include <sys/stat.h> #include <sys/types.h> -#include <sys/time.h> -#include <dirent.h> #include <errno.h> #include <stdio.h> #include <stdlib.h> @@ -1047,8 +1045,7 @@ ggiFillscreen (visualGGI); ggiSetGCForeground (visualGGI, whitepixel); ggiFlush (visualGGI); - gettimeofday (&time, NULL); - renderer_data.basetime = time.tv_sec; + set_renderer_basetime(); return 0; } @@ -1145,24 +1142,7 @@ /* do audio update */ UpdateAudio(); - - /* Check the time. If we're getting behind, skip a frame to stay in sync. */ - gettimeofday (&time, NULL); - timeframe = (time.tv_sec - renderer_data.basetime) * 50 + time.tv_usec / 20000; /* PAL */ - timeframe = (time.tv_sec - renderer_data.basetime) * 60 + time.tv_usec / 16666; /* NTSC */ - frame++; - if (halfspeed) - timeframe >>= 1; - if (doublespeed == 2) - timeframe <<= 1; - else if (doublespeed > 2) - timeframe *= doublespeed; - if (desync) - frame = timeframe; - desync = 0; - if (frame < timeframe - 20 && frame % 20 == 0) - desync = 1; /* If we're more than 20 frames behind, might as well stop counting. */ - + set_timeframe(&frame, &timeframe, &desync); if (! nodisplay) { drawimage (PBL); @@ -1281,13 +1261,7 @@ needsredraw = 0; redrawbackground = 0; redrawall = 0; - - /* Slow down if we're getting ahead */ - if (frame > timeframe + 1 && frameskip == 0) - { - usleep (16666 * (frame - timeframe - 1)); - } - + resynchronize(frame, timeframe, frameskip); /* Input loop */ do { struct timeval tv = { 0, 0 }; @@ -1310,20 +1284,7 @@ HandleKeyboardGGI (ev); } } while (renderer_data.pause_display); - - /* Check the time. If we're getting behind, skip next frame to stay in sync. */ - gettimeofday (&time, NULL); - timeframe = (time.tv_sec - renderer_data.basetime) * 60 + time.tv_usec / 16666; /* NTSC */ - if (halfspeed) - timeframe >>= 1; - if (doublespeed == 2) - timeframe <<= 1; - else if (doublespeed > 2) - timeframe *= doublespeed; - if (frame >= timeframe || frame % 20 == 0) - frameskip = 0; - else - frameskip = 1; + set_frameskip (frame, &timeframe, &frameskip); } #endif diff -u --new-file --recursive tuxnes-0.75-sdl/renderer.c tuxnes-0.75-codeshare/renderer.c --- tuxnes-0.75-sdl/renderer.c Sun Mar 24 17:34:31 2002 +++ tuxnes-0.75-codeshare/renderer.c Sun Mar 24 17:29:49 2002 @@ -204,24 +204,7 @@ /* do audio update */ UpdateAudio(); - - /* Check the time. If we're getting behind, skip a frame to stay in sync. */ - gettimeofday (&time, NULL); - timeframe = (time.tv_sec - renderer_data.basetime) * 50 + time.tv_usec / 20000; /* PAL */ - timeframe = (time.tv_sec - renderer_data.basetime) * 60 + time.tv_usec / 16666; /* NTSC */ - frame++; - if (halfspeed) - timeframe >>= 1; - if (doublespeed == 2) - timeframe <<= 1; - else if (doublespeed > 2) - timeframe *= doublespeed; - if (desync) - frame = timeframe; - desync = 0; - if (frame < timeframe - 20 && frame % 20 == 0) - desync = 1; /* If we're more than 20 frames behind, might as well stop counting. */ - + set_timeframe(&frame, &timeframe, &desync); /* Slow down if we're getting ahead */ if (frame > timeframe + 1 && frameskip == 0) { @@ -240,20 +223,7 @@ HandleJoystickLinux(1); } } while (renderer_data.pause_display); - - /* Check the time. If we're getting behind, skip next frame to stay in sync. */ - gettimeofday (&time, NULL); - timeframe = (time.tv_sec - renderer_data.basetime) * 60 + time.tv_usec / 16666; /* NTSC */ - if (halfspeed) - timeframe >>= 1; - if (doublespeed == 2) - timeframe <<= 1; - else if (doublespeed > 2) - timeframe *= doublespeed; - if (frame >= timeframe || frame % 20 == 0) - frameskip = 0; - else - frameskip = 1; + set_frameskip (frame, &timeframe, &frameskip); } /* Update the colors on the screen if the palette changed */ diff -u --new-file --recursive tuxnes-0.75-sdl/renderer_util.c tuxnes-0.75-codeshare/renderer_util.c --- tuxnes-0.75-sdl/renderer_util.c Thu Jan 1 01:00:00 1970 +++ tuxnes-0.75-codeshare/renderer_util.c Sun Mar 24 17:27:28 2002 @@ -0,0 +1,130 @@ +/* + * This file is part of the TuxNES project codebase. + * + * Please see the README and COPYING files for more information regarding + * this project. + * + * Description: Shared code used by all of the tuxnes renderers. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif /* HAVE_CONFIG_H */ + +#include <dirent.h> +#include <sys/stat.h> +#include <string.h> +#include <stdlib.h> +#include <globals.h> +#include <stdio.h> +#include <sys/time.h> +#include <renderer.h> +#include <unistd.h> + +/* ============================ screenshot_init () ========================= */ +void screenshot_init(char *ext, char **ssfile, int *ssnumber) +{ + DIR *dir; + struct dirent *dirp; + int currentnumber = 0; + /* Allocate space for (tuxnesdir) + (basefilename-snap-xxxx.ext) + ('\0') */ + if ((*ssfile = (char *) malloc(strlen(tuxnesdir) + + strlen(basefilename) + 1 + 4 + + 1 + 4 + 1 + 3 + 1)) == NULL) { + perror("malloc"); + exit(1); + } + sprintf(*ssfile, "%s-snap-", basefilename); + /* open the screenshot directory */ + if ((dir = opendir(tuxnesdir)) == NULL) { + return; + } + /* iterate through the files and establish the starting screenshot number */ + while ((dirp = readdir(dir)) != NULL) { + if ((strlen(dirp->d_name) >= 8) + && (strncmp(dirp->d_name, *ssfile, strlen(*ssfile)) + == 0) + && + (strncmp + (dirp->d_name + strlen(dirp->d_name) - 4, ext, + strlen(ext)) == 0)) { + dirp->d_name[strlen(dirp->d_name) - 4] = '\0'; + if ((currentnumber = + atoi(dirp->d_name + strlen(*ssfile))) > *ssnumber) { + *ssnumber = currentnumber; + } + } + } + if (++*ssnumber > 9999) { + *ssnumber = 0; + } + closedir(dir); +} + +/* ============================ screenshot_check_filename () =============== */ +void screenshot_check_filename(char *ext, char *ssfile, int *ssnumber) +{ + /* make sure we don't over-write screenshots written by a concurrent TuxNES process */ + { + struct stat buf[1]; + do + sprintf(ssfile, "%s%s-snap-%04u%s", tuxnesdir, + basefilename, *ssnumber++, ext); + while ((!stat(ssfile, buf)) && !(*ssnumber > 9999)); + } + if (*ssnumber > 9999) + *ssnumber = 0; +} + +/* ============================ set_renderer_basetime () =================== */ +void set_renderer_basetime(void) +{ + struct timeval time; + gettimeofday(&time, NULL); + renderer_data.basetime = time.tv_sec; +} + +/* ============================ set_frameskip () =========================== */ +void set_frameskip(int frame, int *timeframe, int *frameskip) +{ + struct timeval time; + gettimeofday(&time, NULL); + *timeframe = (time.tv_sec - renderer_data.basetime) * 60 + time.tv_usec / 16666; /* NTSC */ + if (halfspeed) + *timeframe >>= 1; + if (doublespeed == 2) + *timeframe <<= 1; + else if (doublespeed > 2) + *timeframe *= doublespeed; + if (frame >= *timeframe || frame % 20 == 0) + *frameskip = 0; + else + *frameskip = 1; + +} + +/* ============================ set_timeframe () =========================== */ +void set_timeframe(int *frame, int *timeframe, int *desync) +{ + struct timeval time; + gettimeofday(&time, NULL); + *timeframe = (time.tv_sec - renderer_data.basetime) * 50 + time.tv_usec / 20000; /* PAL */ + *timeframe = (time.tv_sec - renderer_data.basetime) * 60 + time.tv_usec / 16666; /* NTSC */ + (*frame)++; + if (halfspeed) + *timeframe >>= 1; + if (doublespeed > 1) + *timeframe *= doublespeed; + if (*desync) + *frame = *timeframe; + *desync = 0; + if (*frame < *timeframe - 20 && *frame % 20 == 0) + *desync = 1; /* If we're more than 20 frames behind, might as well stop counting. */ +} + +/* ============================ resynchronize () =========================== */ +void resynchronize(int frame, int timeframe, int frameskip) +{ + if (frame > timeframe + 1 && frameskip == 0) + usleep(16666 * (frame - timeframe - 1)); +} diff -u --new-file --recursive tuxnes-0.75-sdl/renderer_util.h tuxnes-0.75-codeshare/renderer_util.h --- tuxnes-0.75-sdl/renderer_util.h Thu Jan 1 01:00:00 1970 +++ tuxnes-0.75-codeshare/renderer_util.h Sun Mar 24 17:27:57 2002 @@ -0,0 +1,31 @@ +/* + * This file is part of the TuxNES project codebase. + * + * Please see the README and COPYING files for more information regarding + * this project. + * + * Description: Shared code used by all of the tuxnes renderers. + */ + +#ifndef _RENDERER_UTIL_H +#define _RENDERER_UTIL_H + +/* ============================ screenshot_init () ========================= */ +void screenshot_init(char *ext, char **ssfile, int *ssnumber); + +/* ============================ screenshot_check_filename () =============== */ +void screenshot_check_filename(char *ext, char *ssfile, int *ssnumber); + +/* ============================ set_renderer_basetime () =================== */ +void set_renderer_basetime(void); + +/* ============================ set_frameskip () =========================== */ +void set_frameskip(int frame, int *timeframe, int *frameskip); + +/* ============================ set_timeframe () =========================== */ +void set_timeframe(int *frame, int *timeframe, int *desync); + +/* ============================ resynchronize () =========================== */ +void resynchronize (int frame, int timeframe, int frameskip); + +#endif /* RENDERER_UTIL_H */ diff -u --new-file --recursive tuxnes-0.75-sdl/sdl.c tuxnes-0.75-codeshare/sdl.c --- tuxnes-0.75-sdl/sdl.c Sun Mar 24 17:34:31 2002 +++ tuxnes-0.75-codeshare/sdl.c Sun Mar 24 17:31:39 2002 @@ -19,6 +19,7 @@ #include "globals.h" #include "mapper.h" #include "renderer.h" +#include "renderer_util.h" #include "sound.h" #ifdef HAVE_SDL @@ -27,12 +28,8 @@ #include <SDL/SDL_endian.h> #include <stdlib.h> #include <string.h> -#include <sys/time.h> #include <unistd.h> -/* FIXME: Share with x11.c, w.c, etc. */ -#include <dirent.h> -#include <sys/stat.h> char *screenshotfile; static int screenshotnumber = 0; @@ -41,64 +38,10 @@ SDL_Surface *screen; unsigned int paletteSDL[64]; -/* ============================ InitScreenshotSDL () ======================= */ -static void InitScreenshotSDL(void) -{ - DIR *dir; - struct dirent *dirp; - int currentnumber = 0; - /* Allocate space for (tuxnesdir) + (basefilename-snap-xxxx.bmp) + ('\0') */ - if ((screenshotfile = (char *) malloc(strlen(tuxnesdir) + - strlen(basefilename) + 1 + 4 + - 1 + 4 + 1 + 3 + 1)) == NULL) { - perror("malloc"); - exit(1); - } - sprintf(screenshotfile, "%s-snap-", basefilename); - /* open the screenshot directory */ - if ((dir = opendir(tuxnesdir)) == NULL) { - return; - } - /* iterate through the files and establish the starting screenshot number */ - while ((dirp = readdir(dir)) != NULL) { - if ((strlen(dirp->d_name) >= 8) - && - (strncmp(dirp->d_name, screenshotfile, strlen(screenshotfile)) - == 0) - && - (strncmp - (dirp->d_name + strlen(dirp->d_name) - 4, ".bmp", - strlen(".bmp")) == 0)) { - dirp->d_name[strlen(dirp->d_name) - 4] = '\0'; - if ((currentnumber = - atoi(dirp->d_name + strlen(screenshotfile))) > - screenshotnumber) { - screenshotnumber = currentnumber; - } - } - } - if (++screenshotnumber > 9999) { - screenshotnumber = 0; - } - closedir(dir); -} - - /* ============================ SaveScreenshotSDL () ======================= */ static void SaveScreenshotSDL(void) { - int status; - /* make sure we don't over-write screenshots written by a concurrent TuxNES process */ - { - struct stat buf[1]; - do - sprintf(screenshotfile, "%s%s-snap-%04u.bmp", tuxnesdir, - basefilename, screenshotnumber++); - while ((!stat(screenshotfile, buf)) && !(screenshotnumber > 9999)); - } - if (screenshotnumber > 9999) { - screenshotnumber = 0; - } + screenshot_check_filename (".bmp", screenshotfile, &screenshotnumber); SDL_SaveBMP(screen, screenshotfile); } @@ -106,7 +49,6 @@ int InitDisplaySDL(int argc, char **argv) { int i; - struct timeval time; if (magstep < 1) magstep = 1; if (magstep > maxsize) { @@ -128,7 +70,7 @@ SDL_GetError()); exit(1); } - SDL_WM_ToggleFullScreen(screen); + //SDL_WM_ToggleFullScreen(screen); rfb = fb = screen->pixels; for (i = 0; i < 64; i++) { unsigned char r, g, b; @@ -138,9 +80,8 @@ paletteSDL[i] = (r << 11) | (g << 5) | (b); } fbinit(); - InitScreenshotSDL(); - gettimeofday(&time, NULL); - renderer_data.basetime = time.tv_sec; + screenshot_init(".bmp", &screenshotfile, &screenshotnumber); + set_renderer_basetime(); return 0; } @@ -346,34 +287,18 @@ /* ============================ UpdateDisplaySDL () ======================== */ void UpdateDisplaySDL(void) { - struct timeval time; unsigned static int frame; unsigned int timeframe; SDL_Event event; /* FIXME: Write SDL audio handler */ UpdateAudio(); - gettimeofday(&time, NULL); - timeframe = (time.tv_sec - renderer_data.basetime) * 50 + time.tv_usec / 20000; /* PAL */ - timeframe = (time.tv_sec - renderer_data.basetime) * 60 + time.tv_usec / 16666; /* NTSC */ - frame++; - if (halfspeed) - timeframe >>= 1; - if (doublespeed == 2) - timeframe <<= 1; - else if (doublespeed > 2) - timeframe *= doublespeed; - if (desync) - frame = timeframe; - desync = 0; - if (frame < timeframe - 20 && frame % 20 == 0) - desync = 1; /* If we're more than 20 frames behind, might as well stop counting. */ + + set_timeframe(&frame, &timeframe, &desync); drawimage(PBL); if (!frameskip) { SDL_UpdateRect(screen, 0, 0, 0, 0); } - if (frame > timeframe + 1 && frameskip == 0) { - usleep(16666 * (frame - timeframe - 1)); - } + resynchronize(frame, timeframe, frameskip); /* FIXME: write SDL handler */ if (jsfd[0] >= 0) @@ -392,19 +317,7 @@ exit(0); } } - - gettimeofday(&time, NULL); - timeframe = (time.tv_sec - renderer_data.basetime) * 60 + time.tv_usec / 16666; /* NTSC */ - if (halfspeed) - timeframe >>= 1; - if (doublespeed == 2) - timeframe <<= 1; - else if (doublespeed > 2) - timeframe *= doublespeed; - if (frame >= timeframe || frame % 20 == 0) - frameskip = 0; - else - frameskip = 1; + set_frameskip (frame, &timeframe, &frameskip); } /* ============================ UpdateColorsSDL () ========================= */ diff -u --new-file --recursive tuxnes-0.75-sdl/w.c tuxnes-0.75-codeshare/w.c --- tuxnes-0.75-sdl/w.c Wed Apr 11 23:45:48 2001 +++ tuxnes-0.75-codeshare/w.c Sun Mar 24 17:31:04 2002 @@ -20,8 +20,6 @@ #include <sys/stat.h> #include <sys/types.h> -#include <sys/time.h> -#include <dirent.h> #include <errno.h> #include <stdio.h> #include <stdlib.h> @@ -606,7 +604,6 @@ { int x; rgb_t color; - struct timeval time; if (magstep < 1) { magstep = 1; @@ -930,8 +927,7 @@ scanlines = old_scanlines; } w_flush (); - gettimeofday (&time, NULL); - renderer_data.basetime = time.tv_sec; + set_renderer_basetime(); return 0; } @@ -1029,31 +1025,13 @@ void UpdateDisplayW(void) { - struct timeval time; unsigned static int frame; unsigned int timeframe; static int nodisplay = 0; /* do audio update */ UpdateAudio(); - - /* Check the time. If we're getting behind, skip a frame to stay in sync. */ - gettimeofday (&time, NULL); - timeframe = (time.tv_sec - renderer_data.basetime) * 50 + time.tv_usec / 20000; /* PAL */ - timeframe = (time.tv_sec - renderer_data.basetime) * 60 + time.tv_usec / 16666; /* NTSC */ - frame++; - if (halfspeed) - timeframe >>= 1; - if (doublespeed == 2) - timeframe <<= 1; - else if (doublespeed > 2) - timeframe *= doublespeed; - if (desync) - frame = timeframe; - desync = 0; - if (frame < timeframe - 20 && frame % 20 == 0) - desync = 1; /* If we're more than 20 frames behind, might as well stop counting. */ - + set_timeframe(&frame, &timeframe, &desync); if (! nodisplay) { drawimage (PBL); @@ -1071,13 +1049,7 @@ needsredraw = 0; redrawbackground = 0; redrawall = 0; - - /* Slow down if we're getting ahead */ - if (frame > timeframe + 1 && frameskip == 0) - { - usleep (16666 * (frame - timeframe - 1)); - } - + resynchronize(frame, timeframe, frameskip); /* Input loop */ do { WEVENT *ev; @@ -1142,20 +1114,7 @@ } } } while (renderer_data.pause_display); - - /* Check the time. If we're getting behind, skip next frame to stay in sync. */ - gettimeofday (&time, NULL); - timeframe = (time.tv_sec - renderer_data.basetime) * 60 + time.tv_usec / 16666; /* NTSC */ - if (halfspeed) - timeframe >>= 1; - if (doublespeed == 2) - timeframe <<= 1; - else if (doublespeed > 2) - timeframe *= doublespeed; - if (frame >= timeframe || frame % 20 == 0) - frameskip = 0; - else - frameskip = 1; + set_frameskip (frame, &timeframe, &frameskip); } #endif diff -u --new-file --recursive tuxnes-0.75-sdl/x11.c tuxnes-0.75-codeshare/x11.c --- tuxnes-0.75-sdl/x11.c Wed Apr 11 23:45:48 2001 +++ tuxnes-0.75-codeshare/x11.c Sun Mar 24 17:31:27 2002 @@ -20,15 +20,14 @@ #include <sys/stat.h> #include <sys/types.h> -#include <sys/time.h> #include <sys/wait.h> -#include <dirent.h> #include <errno.h> #include <signal.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> +#include <renderer_util.h> #if defined(__FreeBSD__) #include <machine/endian.h> #elif defined(__NetBSD__) || defined(__OpenBSD__) @@ -181,7 +180,6 @@ void fbinit(void); void quit(void); void START(void); -static void InitScreenshotX11(void); static void SaveScreenshotX11(void); static void DiffUpdateOldX11(void); static void DoBackgroundOldX11(void); @@ -258,71 +256,11 @@ #endif void -InitScreenshotX11(void) -{ - DIR *dir; - struct dirent *dirp; - int currentnumber = 0; - - /* Allocate space for (tuxnesdir) + (basefilename-snap-xxxx.xpm) + ('\0') */ - if ((screenshotfile = (char *) malloc (strlen (tuxnesdir) + - strlen (basefilename) + 1 + 4 + 1 + 4 + 1 + 3 + 1)) == NULL) - { - perror ("malloc"); - exit (1); - } - sprintf(screenshotfile, "%s-snap-", basefilename); - - /* open the screenshot directory */ - if ((dir = opendir (tuxnesdir)) == NULL) - { - return; - } - - /* iterate through the files and establish the starting screenshot number */ - while ((dirp = readdir (dir)) != NULL) - { - if ((strlen(dirp->d_name) >= 8) - && (strncmp (dirp->d_name, screenshotfile, strlen (screenshotfile)) == 0) - && (strncmp (dirp->d_name + strlen (dirp->d_name) - 4, ".xpm", - strlen (".xpm")) == 0)) - { - dirp->d_name[strlen (dirp->d_name) - 4] = '\0'; - if ((currentnumber = atoi (dirp->d_name + strlen (screenshotfile))) > - screenshotnumber) - { - screenshotnumber = currentnumber; - } - } - } - - if (++screenshotnumber > 9999) - { - screenshotnumber = 0; - } - - closedir (dir); -} - -void SaveScreenshotX11(void) { int status; - /* make sure we don't over-write screenshots written by a concurrent TuxNES process */ - { - struct stat buf[1]; - - do - sprintf (screenshotfile, "%s%s-snap-%04u.xpm", tuxnesdir, basefilename, - screenshotnumber ++); - while ((! stat (screenshotfile, buf)) && ! (screenshotnumber > 9999)); - } - - if (screenshotnumber > 9999) - { - screenshotnumber = 0; - } + screenshot_check_filename (".xpm", screenshotfile, &screenshotnumber); #ifdef HAVE_XPM if (renderer->_flags & RENDERER_OLD) { @@ -394,7 +332,6 @@ int x, y; int geometry_mask; int border; - struct timeval time; char *wname[] = { PRETTY_NAME, PACKAGE @@ -709,8 +646,7 @@ for (y = 0; y < tilecachedepth; y++) for (x = 0; x < 256; x++) tiledirty[y][x] = 1; - gettimeofday (&time, NULL); - renderer_data.basetime = time.tv_sec; + set_renderer_basetime(); layout = XCreatePixmap (display, w, 256 * magstep, 240 * magstep, depth); #ifdef HAVE_SHM @@ -837,7 +773,7 @@ XFillRectangle (display, w, blackgc, 0, 0, width, height); - InitScreenshotX11 (); + screenshot_init(".xpm", &screenshotfile, &screenshotnumber); fbinit (); return 0; } @@ -1405,7 +1341,6 @@ UpdateDisplayX11(void) { static XEvent ev; - struct timeval time; unsigned static int frame; unsigned int timeframe; static int sleep = 0; /* Initially we start with the emulation running. If you want to wait until the window receives input focus, change this. */ @@ -1413,24 +1348,7 @@ /* do audio update */ UpdateAudio(); - - /* Check the time. If we're getting behind, skip a frame to stay in sync. */ - gettimeofday (&time, NULL); - timeframe = (time.tv_sec - renderer_data.basetime) * 50 + time.tv_usec / 20000; /* PAL */ - timeframe = (time.tv_sec - renderer_data.basetime) * 60 + time.tv_usec / 16666; /* NTSC */ - frame++; - if (halfspeed) - timeframe >>= 1; - if (doublespeed == 2) - timeframe <<= 1; - else if (doublespeed > 2) - timeframe *= doublespeed; - if (desync) - frame = timeframe; - desync = 0; - if (frame < timeframe - 20 && frame % 20 == 0) - desync = 1; /* If we're more than 20 frames behind, might as well stop counting. */ - + set_timeframe(&frame, &timeframe, &desync); if (! nodisplay) { drawimage (PBL); @@ -1579,13 +1497,7 @@ redrawall = needsredraw = 0; } } - - /* Slow down if we're getting ahead */ - if (frame > timeframe + 1 && frameskip == 0) - { - usleep (16666 * (frame - timeframe - 1)); - } - + resynchronize(frame, timeframe, frameskip); /* Input loop */ do { /* Handle joystick input */ @@ -1694,20 +1606,7 @@ needsredraw = 0; redrawbackground = 0; redrawall = 0; - - /* Check the time. If we're getting behind, skip next frame to stay in sync. */ - gettimeofday (&time, NULL); - timeframe = (time.tv_sec - renderer_data.basetime) * 60 + time.tv_usec / 16666; /* NTSC */ - if (halfspeed) - timeframe >>= 1; - if (doublespeed == 2) - timeframe <<= 1; - else if (doublespeed > 2) - timeframe *= doublespeed; - if (frame >= timeframe || frame % 20 == 0) - frameskip = 0; - else - frameskip = 1; + set_frameskip (frame, &timeframe, &frameskip); } /* @@ -1729,7 +1628,6 @@ UpdateDisplayOldX11(void) { static XEvent ev; - struct timeval time; unsigned static int frame; unsigned int timeframe; static int sleep = 0; /* Initially we start with the emulation running. If you want to wait until the window receives input focus, change this. */ @@ -1737,24 +1635,7 @@ /* do audio update */ UpdateAudio(); - - /* Check the time. If we're getting behind, skip a frame to stay in sync. */ - gettimeofday (&time, NULL); - timeframe = (time.tv_sec - renderer_data.basetime) * 50 + time.tv_usec / 20000; /* PAL */ - timeframe = (time.tv_sec - renderer_data.basetime) * 60 + time.tv_usec / 16666; /* NTSC */ - frame++; - if (halfspeed) - timeframe >>= 1; - if (doublespeed == 2) - timeframe <<= 1; - else if (doublespeed > 2) - timeframe *= doublespeed; - if (desync) - frame = timeframe; - desync = 0; - if (frame < timeframe - 20 && frame % 20 == 0) - desync = 1; /* If we're more than 20 frames behind, might as well stop counting. */ - + set_timeframe(&frame, &timeframe, &desync); if (! nodisplay) { if (frame >= timeframe || frame % 20 == 0) @@ -1773,13 +1654,7 @@ DrawSpritesOldX11(); } } - - /* Slow down if we're getting ahead */ - if (frame > timeframe + 1) - { - usleep (16666 * (frame - timeframe - 1)); - } - + resynchronize(frame, timeframe, frameskip); /* Input loop */ do { /* Handle joystick input */ ================================================================================ -- Mike :wq |