From 248c175609b435fb3a3ebdcc1f7a2c17d9bd77fd Mon Sep 17 00:00:00 2001 From: Tatsuya79 Date: Thu, 8 Feb 2018 13:02:18 +0100 Subject: Overclock by reducing cycles. --- libretro/libretro.c | 31 +++++++++++++++++++++++++++++++ src/snes9x.h | 8 +++++--- 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/libretro/libretro.c b/libretro/libretro.c index b7d371c..959d2e6 100644 --- a/libretro/libretro.c +++ b/libretro/libretro.c @@ -91,6 +91,7 @@ static uint32 joys[5]; bool8 ROMAPUEnabled = 0; char currentWorkingDir[MAX_PATH+1] = {0}; +bool overclock_cycles = false; memstream_t *s_stream; @@ -351,10 +352,17 @@ static void snes_init (void) void retro_init (void) { + static const struct retro_variable vars[] = + { + { "snes9x2002_overclock_cycles", "CPU Overclock (Hack, Unsafe, Restart); disabled|enabled" }, + { NULL, NULL }, + }; + if (!environ_cb(RETRO_ENVIRONMENT_GET_OVERSCAN, &use_overscan)) use_overscan = FALSE; snes_init(); + environ_cb(RETRO_ENVIRONMENT_SET_VARIABLES, (void*)vars); } /* libsnes uses relative values for analogue devices. @@ -414,10 +422,31 @@ static void report_buttons (void) } } +static void check_variables(void) +{ + struct retro_variable var; + + var.key = "snes9x2002_overclock_cycles"; + var.value = NULL; + + if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) + { + if (strcmp(var.value, "enabled") == 0) + overclock_cycles = true; + else + overclock_cycles = false; + } +} + //#define FRAME_SKIP void retro_run (void) { + bool updated = false; + + if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE_UPDATE, &updated) && updated) + check_variables(); + #ifdef FRAME_SKIP IPPU.RenderThisFrame = !IPPU.RenderThisFrame; #else @@ -517,6 +546,8 @@ bool retro_load_game(const struct retro_game_info *game) bool8 loaded; enum retro_pixel_format fmt = RETRO_PIXEL_FORMAT_RGB565; + check_variables(); + if (!environ_cb(RETRO_ENVIRONMENT_SET_PIXEL_FORMAT, &fmt)) { fprintf(stderr, "[libretro]: RGB565 is not supported.\n"); diff --git a/src/snes9x.h b/src/snes9x.h index d7dd7ef..065b98d 100644 --- a/src/snes9x.h +++ b/src/snes9x.h @@ -133,6 +133,8 @@ enum SNES_MAX_CONTROLLER_OPTIONS }; +extern bool overclock_cycles; + #define DEBUG_MODE_FLAG (1 << 0) #define TRACE_FLAG (1 << 1) #define SINGLE_STEP_FLAG (1 << 2) @@ -147,9 +149,9 @@ enum #define IRQ_PENDING_FLAG (1 << 11) #ifdef VAR_CYCLES -#define ONE_CYCLE 6 -#define SLOW_ONE_CYCLE 8 -#define TWO_CYCLES 12 +#define ONE_CYCLE (overclock_cycles ? 4 : 6) +#define SLOW_ONE_CYCLE (overclock_cycles ? 4 : 8) +#define TWO_CYCLES (overclock_cycles ? 6 : 12) #else #define ONE_CYCLE 1 #define SLOW_ONE_CYCLE 1 -- cgit v1.2.3