diff options
author | neonloop | 2021-08-14 00:56:18 +0000 |
---|---|---|
committer | neonloop | 2021-08-14 00:56:18 +0000 |
commit | 890159f001a253c64faf5b95357032c8757fd98c (patch) | |
tree | 92229446d4c56445210b442f07527163a42b44ab | |
parent | 830d847595e6e7415013b30b08a57519116d49e0 (diff) | |
download | picoarch-890159f001a253c64faf5b95357032c8757fd98c.tar.gz picoarch-890159f001a253c64faf5b95357032c8757fd98c.tar.bz2 picoarch-890159f001a253c64faf5b95357032c8757fd98c.zip |
Adds simple disc control for games that require it
-rw-r--r-- | core.c | 52 | ||||
-rw-r--r-- | core.h | 4 | ||||
-rw-r--r-- | menu.c | 38 |
3 files changed, 91 insertions, 3 deletions
@@ -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; @@ -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); @@ -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); |