aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorneonloop2021-08-14 00:56:18 +0000
committerneonloop2021-08-14 00:56:18 +0000
commit890159f001a253c64faf5b95357032c8757fd98c (patch)
tree92229446d4c56445210b442f07527163a42b44ab
parent830d847595e6e7415013b30b08a57519116d49e0 (diff)
downloadpicoarch-890159f001a253c64faf5b95357032c8757fd98c.tar.gz
picoarch-890159f001a253c64faf5b95357032c8757fd98c.tar.bz2
picoarch-890159f001a253c64faf5b95357032c8757fd98c.zip
Adds simple disc control for games that require it
-rw-r--r--core.c52
-rw-r--r--core.h4
-rw-r--r--menu.c38
3 files changed, 91 insertions, 3 deletions
diff --git a/core.c b/core.c
index c4c9e13..6aaf05f 100644
--- a/core.c
+++ b/core.c
@@ -28,6 +28,7 @@ static char save_dir[MAX_PATH];
static char system_dir[MAX_PATH];
static char temp_rom[MAX_PATH];
static struct retro_game_info game_info;
+static struct retro_disk_control_ext_callback disk_control_ext;
static uint32_t buttons = 0;
@@ -217,6 +218,32 @@ error:
return ret;
}
+unsigned disc_get_count(void) {
+ if (disk_control_ext.get_num_images)
+ return disk_control_ext.get_num_images();
+
+ return 0;
+}
+
+unsigned disc_get_index(void) {
+ if (disk_control_ext.get_image_index)
+ return disk_control_ext.get_image_index();
+
+ return 0;
+}
+
+bool disc_switch_index(unsigned index) {
+ bool ret = false;
+ if (!disk_control_ext.set_eject_state || !disk_control_ext.set_image_index)
+ return false;
+
+ disk_control_ext.set_eject_state(true);
+ ret = disk_control_ext.set_image_index(index);
+ disk_control_ext.set_eject_state(false);
+
+ return ret;
+}
+
static void set_directories(void) {
const char *home = getenv("HOME");
char cwd[MAX_PATH];
@@ -277,6 +304,16 @@ static bool pa_environment(unsigned cmd, void *data) {
}
break;
}
+ case RETRO_ENVIRONMENT_SET_DISK_CONTROL_INTERFACE: { /* 13 */
+ const struct retro_disk_control_callback *var =
+ (const struct retro_disk_control_callback *)data;
+
+ if (var) {
+ memset(&disk_control_ext, 0, sizeof(struct retro_disk_control_ext_callback));
+ memcpy(&disk_control_ext, var, sizeof(struct retro_disk_control_callback));
+ }
+ break;
+ }
case RETRO_ENVIRONMENT_GET_VARIABLE: { /* 15 */
struct retro_variable *var = (struct retro_variable *)data;
if (var && var->key) {
@@ -348,6 +385,21 @@ static bool pa_environment(unsigned cmd, void *data) {
options_set_visible(display->key, display->visible);
break;
}
+ case RETRO_ENVIRONMENT_GET_DISK_CONTROL_INTERFACE_VERSION: { /* 57 */
+ unsigned *out = (unsigned *)data;
+ if (out)
+ *out = 1;
+ break;
+ }
+ case RETRO_ENVIRONMENT_SET_DISK_CONTROL_EXT_INTERFACE: { /* 58 */
+ const struct retro_disk_control_ext_callback *var =
+ (const struct retro_disk_control_ext_callback *)data;
+
+ if (var) {
+ memcpy(&disk_control_ext, var, sizeof(struct retro_disk_control_ext_callback));
+ }
+ break;
+ }
case RETRO_ENVIRONMENT_SET_AUDIO_BUFFER_STATUS_CALLBACK: { /* 62 */
const struct retro_audio_buffer_status_callback *cb =
(const struct retro_audio_buffer_status_callback *)data;
diff --git a/core.h b/core.h
index aa3c776..67cf4e2 100644
--- a/core.h
+++ b/core.h
@@ -47,6 +47,10 @@ void state_file_name(char *name, size_t size, int slot);
int state_read(void);
int state_write(void);
+unsigned disc_get_count(void);
+unsigned disc_get_index(void);
+bool disc_switch_index(unsigned index);
+
int core_load(const char *corefile);
int core_load_content(const char *path);
void core_unload(void);
diff --git a/menu.c b/menu.c
index 6ada18c..27d89fb 100644
--- a/menu.c
+++ b/menu.c
@@ -19,6 +19,7 @@ typedef enum
MA_MAIN_RESUME_GAME,
MA_MAIN_SAVE_STATE,
MA_MAIN_LOAD_STATE,
+ MA_MAIN_DISC_CTRL,
MA_MAIN_CORE_OPTS,
MA_MAIN_RESET_GAME,
MA_MAIN_CREDITS,
@@ -210,6 +211,30 @@ static void draw_src_bg(void) {
menu_darken_bg(g_menubg_ptr, g_menubg_src_ptr, g_menubg_src_h * g_menubg_src_pp, 0);
}
+static int menu_loop_disc(int id, int keys)
+{
+ static int sel = 0;
+ menu_entry e_menu_disc_options[2] = {0};
+ unsigned disc = disc_get_index() + 1;
+ menu_entry *option = &e_menu_disc_options[0];
+
+ option->name = "Disc";
+ option->beh = MB_OPT_RANGE;
+ option->var = &disc;
+ option->min = 1;
+ option->max = disc_get_count();
+ option->enabled = 1;
+ option->need_to_save = 1;
+ option->selectable = 1;
+
+ me_loop(e_menu_disc_options, &sel);
+
+ if (disc_get_index() + 1 != disc)
+ disc_switch_index(disc - 1);
+
+ return 0;
+}
+
static int menu_loop_core_options_page(int offset, int keys) {
static int sel = 0;
menu_entry *e_menu_core_options;
@@ -415,10 +440,11 @@ static int main_menu_handler(int id, int keys)
static menu_entry e_menu_main[] =
{
mee_handler_id("Resume game", MA_MAIN_RESUME_GAME, main_menu_handler),
- mee_handler_id("Save State", MA_MAIN_SAVE_STATE, main_menu_handler),
- mee_handler_id("Load State", MA_MAIN_LOAD_STATE, main_menu_handler),
+ mee_handler_id("Save state", MA_MAIN_SAVE_STATE, main_menu_handler),
+ mee_handler_id("Load state", MA_MAIN_LOAD_STATE, main_menu_handler),
+ mee_handler_id("Disc control", MA_MAIN_DISC_CTRL, menu_loop_disc),
mee_handler_id("Emulator options", MA_MAIN_CORE_OPTS, menu_loop_core_options),
- mee_handler ("Audio and Video", menu_loop_video_options),
+ mee_handler ("Audio and video", menu_loop_video_options),
mee_handler ("Controls", menu_loop_keyconfig),
/* mee_handler_id("Cheats", MA_MAIN_CHEATS, main_menu_handler), */
mee_handler ("Save config", menu_loop_config_options),
@@ -467,6 +493,7 @@ void menu_end(void)
void menu_loop(void)
{
static int sel = 0;
+ bool needs_disc_ctrl = disc_get_count() > 1;
plat_video_menu_enter(1);
me_enable(e_menu_main, MA_MAIN_CORE_OPTS, core_options.visible_len > 0);
@@ -474,11 +501,16 @@ void menu_loop(void)
me_enable(e_menu_main, MA_MAIN_SAVE_STATE, state_allowed());
me_enable(e_menu_main, MA_MAIN_LOAD_STATE, state_allowed());
+ me_enable(e_menu_main, MA_MAIN_DISC_CTRL, needs_disc_ctrl);
+
#ifdef MMENU
if (state_allowed()) {
me_enable(e_menu_main, MA_MAIN_SAVE_STATE, mmenu == NULL);
me_enable(e_menu_main, MA_MAIN_LOAD_STATE, mmenu == NULL);
}
+ if (needs_disc_ctrl) {
+ me_enable(e_menu_main, MA_MAIN_DISC_CTRL, mmenu == NULL);
+ }
#endif
me_loop_d(e_menu_main, &sel, NULL, NULL);