From d9a72ea0766c5b3016df781cee00156ddf4a6bd3 Mon Sep 17 00:00:00 2001 From: TwinAphex51224 Date: Fri, 20 Jan 2012 18:00:33 +0100 Subject: [PATCH] (PS3) Implemented SSNES control flow --- ps3/main.c | 58 ++++++++++++++++++++++++++++++++++++++++------------ ps3/menu.c | 4 ++++ ps3/shared.h | 12 +++++++++++ 3 files changed, 61 insertions(+), 13 deletions(-) diff --git a/ps3/main.c b/ps3/main.c index f6cce562e2..2f58b000c0 100644 --- a/ps3/main.c +++ b/ps3/main.c @@ -66,10 +66,13 @@ if(!(config_get_array(currentconfig, charstring, setting, sizeof(setting)))) \ strncpy(setting,defaultvalue, sizeof(setting)); + uint32_t g_emulator_initialized = 0; char special_action_msg[256]; /* message which should be overlaid on top of the screen*/ uint32_t special_action_msg_expired; /* time at which the message no longer needs to be overlaid onscreen*/ +uint32_t mode_switch = MODE_MENU; +bool init_ssnes = false; char contentInfoPath[MAX_PATH_LENGTH]; char usrDirPath[MAX_PATH_LENGTH]; @@ -200,7 +203,6 @@ static void callback_sysutil_exit(uint64_t status, uint64_t param, void *userdat case CELL_SYSUTIL_REQUEST_EXITGAME: menu_is_running = 0; g_quitting = true; - sys_process_exit(0); break; } } @@ -252,23 +254,53 @@ int main(int argc, char *argv[]) ps3_input_init(); menu_init(); - menu_loop(); - char arg1[] = "ssnes"; - char arg2[PATH_MAX]; - - snprintf(arg2, sizeof(arg2), g_extern.system.fullpath); - char arg3[] = "-v"; - char arg4[] = "-c"; - char arg5[MAX_PATH_LENGTH]; +begin_loop: + if(mode_switch == MODE_EMULATION) + { + while(ssnes_main_iterate()); + ssnes_main_deinit(); + } + else if(mode_switch == MODE_MENU) + { + menu_loop(); + if(init_ssnes) + { + char arg1[] = "ssnes"; + char arg2[PATH_MAX]; - snprintf(arg5, sizeof(arg5), SYS_CONFIG_FILE); - char *argv_[] = { arg1, arg2, arg3, arg4, arg5, NULL }; + snprintf(arg2, sizeof(arg2), g_extern.system.fullpath); + char arg3[] = "-v"; + char arg4[] = "-c"; + char arg5[MAX_PATH_LENGTH]; - g_emulator_initialized = 1; + snprintf(arg5, sizeof(arg5), SYS_CONFIG_FILE); + char *argv_[] = { arg1, arg2, arg3, arg4, arg5, NULL }; - return ssnes_main(sizeof(argv_) / sizeof(argv_[0]) - 1, argv_); + g_emulator_initialized = 1; + int argc = sizeof(argv_) / sizeof(argv_[0]) - 1; + int init_ret = ssnes_main_init(argc, argv_); + printf("init_ret: %d\n", init_ret); + if(init_ret) + { + mode_switch = MODE_MENU; + ssnes_main_deinit(); + } + init_ssnes = 0; + } + } +#ifdef MULTIMAN_SUPPORT + else if(mode_switch == MODE_MULTIMAN_STARTUP) + { + } +#endif + else + goto begin_shutdown; + goto begin_loop; + +begin_shutdown: ps3_input_deinit(); ps3_video_deinit(); + sys_process_exit(0); } diff --git a/ps3/menu.c b/ps3/menu.c index 2e2359b0df..91e73bd6a9 100644 --- a/ps3/menu.c +++ b/ps3/menu.c @@ -279,6 +279,7 @@ static void browser_update(filebrowser_t * b) if (g_emulator_initialized) { menu_is_running = 0; + mode_switch = MODE_EMULATION; set_text_message("", 15); } } @@ -1197,6 +1198,7 @@ static void select_setting(menu * menu_obj) if (g_emulator_initialized) { menu_is_running = 0; + mode_switch = MODE_EMULATION; set_text_message("", 15); } old_state = state; @@ -1277,6 +1279,8 @@ static void select_rom(void) menu_is_running = 0; snprintf(g_extern.system.fullpath, sizeof(g_extern.system.fullpath), "%s/%s", FILEBROWSER_GET_CURRENT_DIRECTORY_NAME(browser), FILEBROWSER_GET_CURRENT_FILENAME(browser)); + init_ssnes = 1; + mode_switch = MODE_EMULATION; old_state = state; return; diff --git a/ps3/shared.h b/ps3/shared.h index d737f5d3bb..b903f5a6fd 100644 --- a/ps3/shared.h +++ b/ps3/shared.h @@ -18,10 +18,22 @@ #define MAX_PATH_LENGTH 1024 +enum +{ + MODE_EMULATION, + MODE_MENU, +#ifdef MULTIMAN_SUPPORT + MODE_MULTIMAN_STARTUP, +#endif + MODE_EXIT +}; + extern char special_action_msg[256]; extern uint32_t g_emulator_initialized; extern uint32_t special_action_msg_expired; +extern uint32_t mode_switch; extern unsigned g_frame_count; +extern bool init_ssnes; extern bool g_quitting; extern char contentInfoPath[MAX_PATH_LENGTH];