* See the COPYING file in the top-level directory.
*/
+#define _GNU_SOURCE 1 // strcasestr
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "../libpcsxcore/cdriso.h"
#include "../libpcsxcore/cheat.h"
#include "../plugins/dfsound/out.h"
+#include "../plugins/dfinput/externals.h"
#include "cspace.h"
#include "main.h"
#include "plugin.h"
int in_keystate;
int in_enable_vibration;
+/* PSX max resolution is 640x512, but with enhancement it's 1024x512 */
+#define VOUT_MAX_WIDTH 1024
+#define VOUT_MAX_HEIGHT 512
+
static void init_memcard(char *mcd_data)
{
unsigned off = 0;
/* libretro */
void retro_set_environment(retro_environment_t cb)
{
-#ifdef __ARM_NEON__
static const struct retro_variable vars[] = {
+ { "frameskip", "Frameskip; 0|1|2|3" },
+ { "region", "Region; Auto|NTSC|PAL" },
+#ifdef __ARM_NEON__
+ { "neon_interlace_enable", "Enable interlacing mode(s); disabled|enabled" },
{ "neon_enhancement_enable", "Enhanced resolution (slow); disabled|enabled" },
+#endif
{ NULL, NULL },
};
environ_cb = cb;
cb(RETRO_ENVIRONMENT_SET_VARIABLES, (void*)vars);
-#else
- environ_cb = cb;
-#endif
}
void retro_set_video_refresh(retro_video_refresh_t cb) { video_cb = cb; }
info->timing.sample_rate = 44100;
info->geometry.base_width = 320;
info->geometry.base_height = 240;
- info->geometry.max_width = 640;
- info->geometry.max_height = 512;
+ info->geometry.max_width = VOUT_MAX_WIDTH;
+ info->geometry.max_height = VOUT_MAX_HEIGHT;
info->geometry.aspect_ratio = 4.0 / 3.0;
}
}
plugin_call_rearmed_cbs();
+ dfinput_activate();
Config.PsxAuto = 1;
if (CheckCdrom() == -1) {
};
#define RETRO_PSX_MAP_LEN (sizeof(retro_psx_map) / sizeof(retro_psx_map[0]))
-static void update_variables(void)
+static void update_variables(bool in_flight)
{
-#ifdef __ARM_NEON__
struct retro_variable var;
+
var.value = NULL;
- var.key = "neon_enhancement_enable";
+ var.key = "frameskip";
+
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value)
+ pl_rearmed_cbs.frameskip = atoi(var.value);
+
+ var.value = NULL;
+ var.key = "region";
+
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value)
+ {
+ Config.PsxAuto = 0;
+ if (strcmp(var.value, "Automatic") == 0)
+ Config.PsxAuto = 1;
+ else if (strcmp(var.value, "NTSC") == 0)
+ Config.PsxType = 0;
+ else if (strcmp(var.value, "PAL") == 0)
+ Config.PsxType = 1;
+ }
+#ifdef __ARM_NEON__
+ var.value = "NULL";
+ var.key = "neon_interlace_enable";
+
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value)
+ {
+ if (strcmp(var.value, "disabled") == 0)
+ pl_rearmed_cbs.gpu_neon.allow_interlace = 0;
+ else if (strcmp(var.value, "enabled") == 0)
+ pl_rearmed_cbs.gpu_neon.allow_interlace = 1;
+ }
- if (!environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || !var.value)
- return;
+ var.value = NULL;
+ var.key = "neon_enhancement_enable";
- if (strcmp(var.value, "disabled") == 0)
- pl_rearmed_cbs.gpu_neon.enhancement_enable = 0;
- else if (strcmp(var.value, "enabled") == 0)
- pl_rearmed_cbs.gpu_neon.enhancement_enable = 1;
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value)
+ {
+ if (strcmp(var.value, "disabled") == 0)
+ pl_rearmed_cbs.gpu_neon.enhancement_enable = 0;
+ else if (strcmp(var.value, "enabled") == 0)
+ pl_rearmed_cbs.gpu_neon.enhancement_enable = 1;
+ }
#endif
+
+ if (in_flight) {
+ // inform core things about possible config changes
+ plugin_call_rearmed_cbs();
+
+ if (GPU_open != NULL && GPU_close != NULL) {
+ GPU_close();
+ GPU_open(&gpuDisp, "PCSX", NULL);
+ }
+
+ dfinput_activate();
+ }
}
void retro_run(void)
input_poll_cb();
- bool updated = false;
- if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE_UPDATE, &updated) && updated)
- update_variables();
+ bool updated = false;
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE_UPDATE, &updated) && updated)
+ update_variables(true);
in_keystate = 0;
for (i = 0; i < RETRO_PSX_MAP_LEN; i++)
exit(1);
}
- vout_buf = malloc(640 * 512 * 2);
+ vout_buf = malloc(VOUT_MAX_WIDTH * VOUT_MAX_HEIGHT * 2);
if (environ_cb(RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY, &dir) && dir)
{
fclose(f);
}
else
+ {
SysPrintf("no BIOS files found.\n");
+ struct retro_message msg =
+ {
+ "no BIOS found, expect bugs!",
+ 180
+ };
+ environ_cb(RETRO_ENVIRONMENT_SET_MESSAGE, (void*)&msg);
+ }
level = 1;
environ_cb(RETRO_ENVIRONMENT_SET_PERFORMANCE_LEVEL, &level);
SaveFuncs.seek = save_seek;
SaveFuncs.close = save_close;
- update_variables();
+ update_variables(false);
}
void retro_deinit(void)