aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CATSFC/system/language.msg108
-rw-r--r--source/cheats.h2
-rw-r--r--source/cpuexec.cpp75
-rw-r--r--source/nds/entry.cpp195
-rw-r--r--source/nds/gui.c21
-rw-r--r--source/nds/gui.h62
-rw-r--r--source/nds/message.h17
-rw-r--r--source/snes9x.h4
8 files changed, 308 insertions, 176 deletions
diff --git a/CATSFC/system/language.msg b/CATSFC/system/language.msg
index 5e04014..9395db1 100644
--- a/CATSFC/system/language.msg
+++ b/CATSFC/system/language.msg
@@ -28,15 +28,13 @@ Options
#MSG_MAIN_MENU_EXIT
Exit
#FMT_VIDEO_ASPECT_RATIO
-Aspect ratio %s
+Aspect ratio %s
#FMT_VIDEO_FAST_FORWARD
-Fast-forward %s
-#FMT_VIDEO_FRAME_SKIP_AUTOMATIC
-Frame skipping %s
-#FMT_VIDEO_FRAME_SKIP_MANUAL
-Frame skipping %d
+Fast-forward %s
+#FMT_VIDEO_FRAME_SKIPPING
+Frame skipping %s
#FMT_AUDIO_SOUND
-Sound %s
+Sound %s
#MSG_SAVED_STATE_CREATE
Create saved state
#FMT_SAVED_STATE_LOAD
@@ -78,11 +76,31 @@ Select a game
#MSG_VIDEO_ASPECT_RATIO_3
[3] Middle, square pixels
#MSG_VIDEO_ASPECT_RATIO_4
-[4] Entire screen, antialiased
-#MSG_FRAMESKIP_0
-Manual
-#MSG_FRAMESKIP_1
-Automatic
+[4] Entire screen, smoothed
+#MSG_VIDEO_FRAME_SKIPPING_AUTOMATIC
+[-] Keep up with the game
+#MSG_VIDEO_FRAME_SKIPPING_0
+[0] Show all frames
+#MSG_VIDEO_FRAME_SKIPPING_1
+[1] Show 1 in 2 frames
+#MSG_VIDEO_FRAME_SKIPPING_2
+[2] Show 1 in 3 frames
+#MSG_VIDEO_FRAME_SKIPPING_3
+[3] Show 1 in 4 frames
+#MSG_VIDEO_FRAME_SKIPPING_4
+[4] Show 1 in 5 frames
+#MSG_VIDEO_FRAME_SKIPPING_5
+[5] Show 1 in 6 frames
+#MSG_VIDEO_FRAME_SKIPPING_6
+[6] Show 1 in 7 frames
+#MSG_VIDEO_FRAME_SKIPPING_7
+[7] Show 1 in 8 frames
+#MSG_VIDEO_FRAME_SKIPPING_8
+[8] Show 1 in 9 frames
+#MSG_VIDEO_FRAME_SKIPPING_9
+[9] Show 1 in 10 frames
+#MSG_VIDEO_FRAME_SKIPPING_10
+[10] Show 1 in 11 frames
#MSG_GENERAL_OFF
Off
#MSG_GENERAL_ON
@@ -186,10 +204,8 @@ STARTCHINESESIM
画面 %s
#FMT_VIDEO_FAST_FORWARD
游戏快进 %s
-#FMT_VIDEO_FRAME_SKIP_AUTOMATIC
+#FMT_VIDEO_FRAME_SKIPPING
跳帧方式 %s
-#FMT_VIDEO_FRAME_SKIP_MANUAL
-跳帧级别 %d
#FMT_AUDIO_SOUND
声音开关 %s
#MSG_SAVED_STATE_CREATE
@@ -234,10 +250,30 @@ CPU主频 %d
显示模式 3
#MSG_VIDEO_ASPECT_RATIO_4
显示模式 4
-#MSG_FRAMESKIP_0
-手动
-#MSG_FRAMESKIP_1
-自动
+#MSG_VIDEO_FRAME_SKIPPING_AUTOMATIC
+[-] Keep up with the game
+#MSG_VIDEO_FRAME_SKIPPING_0
+[0] Show all frames
+#MSG_VIDEO_FRAME_SKIPPING_1
+[1] Show 1 in 2 frames
+#MSG_VIDEO_FRAME_SKIPPING_2
+[2] Show 1 in 3 frames
+#MSG_VIDEO_FRAME_SKIPPING_3
+[3] Show 1 in 4 frames
+#MSG_VIDEO_FRAME_SKIPPING_4
+[4] Show 1 in 5 frames
+#MSG_VIDEO_FRAME_SKIPPING_5
+[5] Show 1 in 6 frames
+#MSG_VIDEO_FRAME_SKIPPING_6
+[6] Show 1 in 7 frames
+#MSG_VIDEO_FRAME_SKIPPING_7
+[7] Show 1 in 8 frames
+#MSG_VIDEO_FRAME_SKIPPING_8
+[8] Show 1 in 9 frames
+#MSG_VIDEO_FRAME_SKIPPING_9
+[9] Show 1 in 10 frames
+#MSG_VIDEO_FRAME_SKIPPING_10
+[10] Show 1 in 11 frames
#MSG_GENERAL_OFF
#MSG_GENERAL_ON
@@ -345,10 +381,8 @@ Quitter
Format d'image %s
#FMT_VIDEO_FAST_FORWARD
Avance rapide %s
-#FMT_VIDEO_FRAME_SKIP_AUTOMATIC
+#FMT_VIDEO_FRAME_SKIPPING
Omission d'images %s
-#FMT_VIDEO_FRAME_SKIP_MANUAL
-Images omises %d
#FMT_AUDIO_SOUND
Son %s
#MSG_SAVED_STATE_CREATE
@@ -392,11 +426,31 @@ Sélectionner un jeu
#MSG_VIDEO_ASPECT_RATIO_3
[3] Milieu, pixels carrés
#MSG_VIDEO_ASPECT_RATIO_4
-[4] Écran entier anticrénelé
-#MSG_FRAMESKIP_0
-Manuelle
-#MSG_FRAMESKIP_1
-Automatique
+[4] Écran entier lissé
+#MSG_VIDEO_FRAME_SKIPPING_AUTOMATIC
+[-] Suivre le jeu
+#MSG_VIDEO_FRAME_SKIPPING_0
+[0] N'omettre aucune image
+#MSG_VIDEO_FRAME_SKIPPING_1
+[1] Montrer 1 image sur 2
+#MSG_VIDEO_FRAME_SKIPPING_2
+[2] Montrer 1 image sur 3
+#MSG_VIDEO_FRAME_SKIPPING_3
+[3] Montrer 1 image sur 4
+#MSG_VIDEO_FRAME_SKIPPING_4
+[4] Montrer 1 image sur 5
+#MSG_VIDEO_FRAME_SKIPPING_5
+[5] Montrer 1 image sur 6
+#MSG_VIDEO_FRAME_SKIPPING_6
+[6] Montrer 1 image sur 7
+#MSG_VIDEO_FRAME_SKIPPING_7
+[7] Montrer 1 image sur 8
+#MSG_VIDEO_FRAME_SKIPPING_8
+[8] Montrer 1 image sur 9
+#MSG_VIDEO_FRAME_SKIPPING_9
+[9] Montrer 1 image sur 10
+#MSG_VIDEO_FRAME_SKIPPING_10
+[10] Montrer 1 image sur 11
#MSG_GENERAL_OFF
Hors fonction
#MSG_GENERAL_ON
diff --git a/source/cheats.h b/source/cheats.h
index bb2646f..2f3252e 100644
--- a/source/cheats.h
+++ b/source/cheats.h
@@ -102,7 +102,7 @@ struct SCheat
uint8 byte;
uint8 saved_byte;
// bool8 enabled;
- uint32 enabled; // THIS IS A TOTAL HACK FOR THE NDSSFC GUI, YOU HAVE BEEN WARNED [Neb]
+ u32 enabled; // THIS IS A TOTAL HACK FOR THE NDSSFC GUI, YOU HAVE BEEN WARNED [Neb]
bool8 saved;
char name[MAX_SFCCHEAT_NAME];
};
diff --git a/source/cpuexec.cpp b/source/cpuexec.cpp
index 66bb8da..b90da6d 100644
--- a/source/cpuexec.cpp
+++ b/source/cpuexec.cpp
@@ -330,81 +330,6 @@ void S9xDoHBlankProcessing ()
Snapshot (NULL);
}
#endif
- if(!game_fast_forward)
- {
- syncnow = getSysTime();
- if(syncnow > sync_next)
- {
- /*
- * Little bit of a hack here:
- * If we get behind and stay behind for a certain number
- * of frames, we automatically enable fast forward.
- * That really helps with certain games, such as
- * Super Mario RPG and Yoshi's Island.
- */
- if(skip_rate++ < 10)
- {
- syncdif = syncnow - sync_next;
- if(syncdif < 11718)
- {
- IPPU.RenderThisFrame = false;
- sync_next += 391;
- }
- else
- { //lag more than 0.5s, maybe paused
- IPPU.RenderThisFrame = true;
- sync_next = syncnow;
- framenum = 0;
- sync_last = syncnow;
- realframe = 1;
- }
- }
- else
- {
- skip_rate = 0;
- IPPU.RenderThisFrame = true;
- sync_last= syncnow;
- sync_next = syncnow+391;
- }
- }
- else
- {
- skip_rate = 0;
- syncdif = sync_next - syncnow;
- if(syncdif > 391)
- {
- udelay(syncdif*22);
- S9xProcessSound (0);
- }
-
- IPPU.RenderThisFrame = true;
- sync_next += 391; //16.7ms
- realframe += 1;
- }
-#if 0
- if(++framenum >= 60)
- {
- syncdif = syncnow - sync_last;
- sync_last = syncnow;
- framenum = 0;
- //printf("T %d %d\n", syncdif*42667/1000, realframe);
- realframe = 0;
- }
-#endif
- }
- else
- {
- sync_last= 0;
- sync_next = 0;
-
- if(skip_rate++ < 10)
- IPPU.RenderThisFrame = false;
- else
- {
- skip_rate = 0;
- IPPU.RenderThisFrame = true;
- }
- }
}
if (CPU.V_Counter == PPU.ScreenHeight + 3)
diff --git a/source/nds/entry.cpp b/source/nds/entry.cpp
index 5573f47..58adf49 100644
--- a/source/nds/entry.cpp
+++ b/source/nds/entry.cpp
@@ -343,6 +343,18 @@ void game_disableAudio()
S9xSetSoundMute (TRUE);
}
}
+
+void game_set_frameskip()
+{
+ if( game_config.frameskip_value == 0)
+ {
+ Settings.SkipFrames = AUTO_FRAMERATE;
+ }
+ else
+ {
+ Settings.SkipFrames = game_config.frameskip_value - 1 /* 1 -> 0 and so on */;
+ }
+}
void init_sfc_setting(void)
{
@@ -368,7 +380,6 @@ void init_sfc_setting(void)
Settings.ShutdownMaster = TRUE;
Settings.FrameTimePAL = 20000;
Settings.FrameTimeNTSC = 16667;
- Settings.FrameTime = Settings.FrameTimeNTSC;
Settings.DisableSampleCaching = FALSE;
Settings.DisableMasterVolume = FALSE;
Settings.Mouse = TRUE;
@@ -449,10 +460,12 @@ int load_gamepak(char* file)
game_disableAudio();
CPU.Flags = 0;
- S9xReset ();
// mdelay(50); // Delete this delay
if (!Memory.LoadROM (file))
return -1;
+ S9xReset ();
+
+ Settings.FrameTime = (Settings.PAL ? Settings.FrameTimePAL : Settings.FrameTimeNTSC);
Memory.LoadSRAM (S9xGetFilename (".srm"));
// mdelay(50); // Delete this delay
@@ -611,41 +624,18 @@ int sfc_main (int argc, char **argv)
return (0);
}
+static unsigned int sync_last= 0;
+static unsigned int sync_next = 0;
+static unsigned int framenum = 0;
+
+extern "C" u32 game_fast_forward;
+
+static unsigned int skip_rate= 0;
+
void S9xSyncSpeed ()
{
-#if 0
-#ifdef _NETPLAY_SUPPORT
- if (Settings.NetPlay)
- {
- // XXX: Send joypad position update to server
- // XXX: Wait for heart beat from server
- S9xNetPlaySendJoypadUpdate (joypads [0]);
- if (!S9xNetPlayCheckForHeartBeat ())
- {
- do
- {
- CHECK_SOUND ();
-// S9xProcessEvents (FALSE);
- } while (!S9xNetPlayCheckForHeartBeat ());
- IPPU.RenderThisFrame = TRUE;
- IPPU.SkippedFrames = 0;
- }
- else
- {
- if (IPPU.SkippedFrames < 10)
- {
- IPPU.SkippedFrames++;
- IPPU.RenderThisFrame = FALSE;
- }
- else
- {
- IPPU.RenderThisFrame = TRUE;
- IPPU.SkippedFrames = 0;
- }
- }
- }
- else
-#endif
+ uint32 syncnow;
+ int32 syncdif;
#if 0
if (Settings.SoundSync == 2)
@@ -655,30 +645,135 @@ void S9xSyncSpeed ()
return;
}
#endif
+ syncnow = getSysTime();
+
+ if (game_fast_forward)
+ {
+ sync_last = syncnow;
+ sync_next = syncnow;
+ if(++skip_rate < 10)
+ IPPU.RenderThisFrame = false;
+ else
+ {
+ skip_rate = 0;
+ IPPU.RenderThisFrame = true;
+ }
+ }
+ else if (Settings.SkipFrames == AUTO_FRAMERATE /* && !game_fast_forward */)
+ {
+ // frame_time is in getSysTime units: 42.667 microseconds.
+ uint32 frame_time = Settings.PAL ? 468 /* = 20.0 ms */ : 391 /* = 16.67 ms */;
+ if (sync_last > syncnow) // Overflow occurred! (every 50 hrs)
+ {
+ // Render this frame regardless, set the
+ // sync_next, and get the hell out.
+ IPPU.RenderThisFrame = TRUE;
+ sync_last = syncnow;
+ sync_next = syncnow + frame_time;
+ return;
+ }
+ sync_last = syncnow;
+ // If this is positive, we have syncdif*42.66 microseconds to
+ // spare.
+ // If this is negative, we're late by syncdif*42.66
+ // microseconds.
+ syncdif = sync_next - syncnow;
+ if (syncdif < 0 && syncdif >= -(frame_time / 2))
+ {
+ // We're late, but by less than half a frame. Draw it
+ // anyway. If the next frame is too late, it'll be
+ // skipped.
+ skip_rate = 0;
+ IPPU.RenderThisFrame = true;
+ sync_next += frame_time;
+ }
+ else if(syncdif < 0)
+ {
+ /*
+ * If we're consistently late, delay up to 8 frames.
+ *
+ * That really helps with certain games, such as
+ * Super Mario RPG and Yoshi's Island.
+ */
+ if(++skip_rate < 10)
+ {
+ if(syncdif >= -11719 /* not more than 500.0 ms late */)
+ {
+ IPPU.RenderThisFrame = FALSE;
+ sync_next += frame_time;
+ }
+ else
+ { //lag more than 0.5s, maybe paused
+ IPPU.RenderThisFrame = TRUE;
+ sync_next = syncnow + frame_time;
+ framenum = 0;
+ }
+ }
+ else
+ {
+ skip_rate = 0;
+ IPPU.RenderThisFrame = TRUE;
+ sync_next = syncnow + frame_time;
+ }
+ }
+ else // Early
+ {
+ skip_rate = 0;
+ ds2_setCPUclocklevel(0);
+ if (syncdif > 0)
+ udelay(syncdif * 128 / 3 /* times 42 + 2/3 microseconds */);
+ set_cpu_clock(clock_speed_number);
+ S9xProcessSound (0);
+
+ IPPU.RenderThisFrame = TRUE;
+ sync_next += frame_time;
+ }
#if 0
- if (Settings.TurboMode)
- {
- if(++IPPU.FrameSkip >= Settings.TurboSkipFrames)
- {
- IPPU.FrameSkip = 0;
- IPPU.SkippedFrames = 0;
- IPPU.RenderThisFrame = TRUE;
- }
- else
- {
- ++IPPU.SkippedFrames;
- IPPU.RenderThisFrame = FALSE;
- }
- return;
- }
+ if(++framenum >= 60)
+ {
+ syncdif = syncnow - sync_last;
+ sync_last = syncnow;
+ framenum = 0;
+ //printf("T %d %d\n", syncdif*42667/1000, realframe);
+ realframe = 0;
+ }
#endif
+ }
+ else /* if (Settings.SkipFrames != AUTO_FRAMERATE && !game_fast_forward) */
+ {
+ // frame_time is in getSysTime units: 42.667 microseconds.
+ uint32 frame_time = Settings.PAL ? 468 /* = 20.0 ms */ : 391 /* = 16.67 ms */;
+ sync_last = syncnow;
+ if (++skip_rate > Settings.SkipFrames)
+ {
+ skip_rate = 0;
+ IPPU.RenderThisFrame = TRUE;
+ // Are we early?
+ syncdif = sync_next - syncnow;
+ if (syncdif > 0)
+ {
+ ds2_setCPUclocklevel(0);
+ udelay(syncdif * 128 / 3 /* times 42 + 2/3 microseconds */);
+ set_cpu_clock(clock_speed_number);
+ S9xProcessSound (0);
+ // After that little delay, what time is it?
+ syncnow = getSysTime();
+ }
+ sync_next = syncnow + frame_time * Settings.SkipFrames;
+ }
+ else
+ {
+ IPPU.RenderThisFrame = FALSE;
+ }
+ }
#ifdef __sgi
/* BS: saves on CPU usage */
sginap(1);
#endif
+#if 0
/* Check events */
static struct timeval next1 = {0, 0};
diff --git a/source/nds/gui.c b/source/nds/gui.c
index 4ebb224..d198166 100644
--- a/source/nds/gui.c
+++ b/source/nds/gui.c
@@ -17,8 +17,8 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
+#include "snes9x.h"
-
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
@@ -78,7 +78,7 @@ GAME_CONFIG game_config;
//save state file map
char savestate_map[SAVE_STATE_SLOT_NUM];
-static unsigned int savestate_index;
+static u32 savestate_index;
#define MAKE_MENU(name, init_function, passive_function, key_function, end_function, \
focus_option, screen_focus) \
@@ -2776,7 +2776,7 @@ u32 menu(u16 *screen)
(char*)&msg[MSG_VIDEO_ASPECT_RATIO_3],
(char*)&msg[MSG_VIDEO_ASPECT_RATIO_4]};
- char *frameskip_options[] = { (char*)&msg[MSG_FRAMESKIP_0], (char*)&msg[MSG_FRAMESKIP_1] };
+ char *frameskip_options[] = { (char*)&msg[MSG_VIDEO_FRAME_SKIPPING_AUTOMATIC], (char*)&msg[MSG_VIDEO_FRAME_SKIPPING_0], (char*)&msg[MSG_VIDEO_FRAME_SKIPPING_1], (char*)&msg[MSG_VIDEO_FRAME_SKIPPING_2], (char*)&msg[MSG_VIDEO_FRAME_SKIPPING_3], (char*)&msg[MSG_VIDEO_FRAME_SKIPPING_4], (char*)&msg[MSG_VIDEO_FRAME_SKIPPING_5], (char*)&msg[MSG_VIDEO_FRAME_SKIPPING_6], (char*)&msg[MSG_VIDEO_FRAME_SKIPPING_7], (char*)&msg[MSG_VIDEO_FRAME_SKIPPING_8], (char*)&msg[MSG_VIDEO_FRAME_SKIPPING_9], (char*)&msg[MSG_VIDEO_FRAME_SKIPPING_10] };
char *on_off_options[] = { (char*)&msg[MSG_GENERAL_OFF], (char*)&msg[MSG_GENERAL_ON] };
@@ -2800,7 +2800,10 @@ u32 menu(u16 *screen)
&game_fast_forward, 2, NULL, ACTION_TYPE, 2),
/* 03 */ STRING_SELECTION_OPTION(game_disableAudio, NULL, &msg[FMT_AUDIO_SOUND], sound_seletion,
- &game_enable_audio, 2, NULL, ACTION_TYPE, 3)
+ &game_enable_audio, 2, NULL, ACTION_TYPE, 3),
+
+ /* 04 */ STRING_SELECTION_OPTION(game_set_frameskip, NULL, &msg[FMT_VIDEO_FRAME_SKIPPING], frameskip_options,
+ &game_config.frameskip_value, 12 /* auto (0) and 0..10 (1..11) make 12 option values */, NULL, ACTION_TYPE, 4)
};
MAKE_MENU(graphics, NULL, NULL, NULL, NULL, 0, 0);
@@ -4004,9 +4007,7 @@ void init_game_config(void)
game_config.clock_speed_number = 5; // 396 MHz by default
clock_speed_number = 5;
game_config.graphic = 3; // By default, have a good-looking aspect ratio
-
- game_config.gamepad_config_menu = BUTTON_ID_TOUCH;
- memcpy(game_config.gamepad_config_map, gamepad_config_map_init, sizeof(gamepad_config_map_init));
+ game_config.frameskip_value = 0; // Automatic frame skipping
game_config.backward = 0; //time backward disable
game_config.backward_time = 2; //time backward granularity 1s
@@ -4063,9 +4064,8 @@ void load_game_config_file(void)
{
fread(&game_config, 1, sizeof(GAME_CONFIG), fp);
- memcpy(gamepad_config_map, game_config.gamepad_config_map, sizeof(game_config.gamepad_config_map));
- gamepad_config_menu = game_config.gamepad_config_menu;
clock_speed_number = game_config.clock_speed_number;
+ Settings.SkipFrames = (game_config.frameskip_value == 0 ? AUTO_FRAMERATE : game_config.frameskip_value - 1 /* 1 -> 0 and so on */);
}
fclose(fp);
@@ -4113,9 +4113,6 @@ int save_game_config_file(void)
if(gamepak_name[0] == 0) return -1;
- memcpy(game_config.gamepad_config_map, gamepad_config_map, sizeof(game_config.gamepad_config_map));
- game_config.gamepad_config_menu = gamepad_config_menu;
-
sprintf(game_config_filename, "%s/%s", DEFAULT_CFG_DIR, gamepak_name);
pt = strrchr(game_config_filename, '.');
if(NULL == pt)
diff --git a/source/nds/gui.h b/source/nds/gui.h
index 5a40979..ec0dd1a 100644
--- a/source/nds/gui.h
+++ b/source/nds/gui.h
@@ -44,16 +44,63 @@ struct _EMU_CONFIG
struct _GAME_CONFIG
{
- u32 clock_speed_number;
- u32 frameskip_type;
+ u32 clock_speed_number;
+ u32 Reserved0;
u32 frameskip_value;
- u32 graphic;
- u32 enable_audio;
- u32 gamepad_config_menu;
+ u32 graphic;
+ u32 enable_audio;
+ u32 Reserved1;
u32 backward;
u32 backward_time;
- u32 reserve[32];
- u32 gamepad_config_map[MAX_GAMEPAD_MAP];
+ u32 Reserved2;
+ u32 Reserved3;
+ u32 Reserved4;
+ u32 Reserved5;
+ u32 Reserved6;
+ u32 Reserved7;
+ u32 Reserved8;
+ u32 Reserved9;
+ u32 Reserved10;
+ u32 Reserved11;
+ u32 Reserved12;
+ u32 Reserved13;
+ u32 Reserved14;
+ u32 Reserved15;
+ u32 Reserved16;
+ u32 Reserved17;
+ u32 Reserved18;
+ u32 Reserved19;
+ u32 Reserved20;
+ u32 Reserved21;
+ u32 Reserved22;
+ u32 Reserved23;
+ u32 Reserved24;
+ u32 Reserved25;
+ u32 Reserved26;
+ u32 Reserved27;
+ u32 Reserved28;
+ u32 Reserved29;
+ u32 Reserved30;
+ u32 Reserved31;
+ u32 Reserved32;
+
+ u32 Reserved33;
+ u32 Reserved34;
+ u32 Reserved35;
+ u32 Reserved36;
+ u32 Reserved37;
+ u32 Reserved38;
+ u32 Reserved39;
+ u32 Reserved40;
+ u32 Reserved41;
+ u32 Reserved42;
+ u32 Reserved43;
+ u32 Reserved44;
+ u32 Reserved45;
+ u32 Reserved46;
+ u32 Reserved47;
+ u32 Reserved48;
+ u32 Reserved49;
};
typedef enum
@@ -118,6 +165,7 @@ extern GAME_CONFIG game_config;
extern void gui_init(u32 lang_id);
extern u32 menu(u16 *original_screen);
extern void game_disableAudio();
+extern void game_set_frameskip();
extern void set_cpu_clock(u32 num);
#ifdef __cplusplus
diff --git a/source/nds/message.h b/source/nds/message.h
index ee89acd..09332bc 100644
--- a/source/nds/message.h
+++ b/source/nds/message.h
@@ -30,8 +30,7 @@ enum MSG
MSG_MAIN_MENU_EXIT,
FMT_VIDEO_ASPECT_RATIO,
FMT_VIDEO_FAST_FORWARD,
- FMT_VIDEO_FRAME_SKIP_AUTOMATIC,
- FMT_VIDEO_FRAME_SKIP_MANUAL,
+ FMT_VIDEO_FRAME_SKIPPING,
FMT_AUDIO_SOUND,
MSG_SAVED_STATE_CREATE,
FMT_SAVED_STATE_LOAD,
@@ -56,8 +55,18 @@ enum MSG
MSG_VIDEO_ASPECT_RATIO_3,
MSG_VIDEO_ASPECT_RATIO_4,
- MSG_FRAMESKIP_0, // currently unused
- MSG_FRAMESKIP_1, // currently unused
+ MSG_VIDEO_FRAME_SKIPPING_AUTOMATIC,
+ MSG_VIDEO_FRAME_SKIPPING_0,
+ MSG_VIDEO_FRAME_SKIPPING_1,
+ MSG_VIDEO_FRAME_SKIPPING_2,
+ MSG_VIDEO_FRAME_SKIPPING_3,
+ MSG_VIDEO_FRAME_SKIPPING_4,
+ MSG_VIDEO_FRAME_SKIPPING_5,
+ MSG_VIDEO_FRAME_SKIPPING_6,
+ MSG_VIDEO_FRAME_SKIPPING_7,
+ MSG_VIDEO_FRAME_SKIPPING_8,
+ MSG_VIDEO_FRAME_SKIPPING_9,
+ MSG_VIDEO_FRAME_SKIPPING_10,
MSG_GENERAL_OFF,
MSG_GENERAL_ON,
diff --git a/source/snes9x.h b/source/snes9x.h
index e9ed479..e9e29b8 100644
--- a/source/snes9x.h
+++ b/source/snes9x.h
@@ -97,9 +97,13 @@
#include "fs_api.h"
#include "ds2_malloc.h"
+#ifdef __cplusplus
extern "C" {
+#endif
extern int cprintf(const char *fmt, ...);
+#ifdef __cplusplus
}
+#endif
#ifdef __WIN32__
#include "..\wsnes9x.h"