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 /core.c | |
parent | 830d847595e6e7415013b30b08a57519116d49e0 (diff) | |
download | picoarch-890159f001a253c64faf5b95357032c8757fd98c.tar.gz picoarch-890159f001a253c64faf5b95357032c8757fd98c.tar.bz2 picoarch-890159f001a253c64faf5b95357032c8757fd98c.zip |
Adds simple disc control for games that require it
Diffstat (limited to 'core.c')
-rw-r--r-- | core.c | 52 |
1 files changed, 52 insertions, 0 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; |