menu: add bios selection
authornotaz <notasas@gmail.com>
Fri, 14 Jan 2011 10:17:08 +0000 (12:17 +0200)
committernotaz <notasas@gmail.com>
Sat, 15 Jan 2011 22:03:53 +0000 (00:03 +0200)
frontend/main.c
frontend/main.h
frontend/menu.c

index 52fa349..5f8fd5c 100644 (file)
@@ -61,15 +61,16 @@ static void CheckSubDir() {
 
 void set_cd_image(const char *fname)
 {
-       const char *ext;
-       int len;
+       const char *ext = NULL;
        
-       len = strlen(fname);
-       ext = fname;
-       if (len > 2)
-               ext = fname + len - 2;
+       if (fname != NULL) {
+               int len = strlen(fname);
+               ext = fname;
+               if (len > 2)
+                       ext = fname + len - 2;
+       }
 
-       if (strcasecmp(ext, ".z") == 0) {
+       if (ext && strcasecmp(ext, ".z") == 0) {
                SetIsoFile(NULL);
                cdrcimg_set_fname(fname);
                strcpy(Config.Cdr, "builtin_cdrcimg");
index 020b675..139c2e7 100644 (file)
@@ -35,6 +35,7 @@
 extern char cfgfile_basename[MAXPATHLEN];
 
 int get_state_filename(char *buf, int size, int i);
+void set_cd_image(const char *fname);
 
 extern unsigned long gpuDisp;
 extern int ready_to_go;
index 8e66357..b14f195 100644 (file)
@@ -36,6 +36,7 @@ typedef enum
        MA_MAIN_LOAD_STATE,
        MA_MAIN_RESET_GAME,
        MA_MAIN_LOAD_ROM,
+       MA_MAIN_RUN_BIOS,
        MA_MAIN_CONTROLS,
        MA_MAIN_CREDITS,
        MA_MAIN_EXIT,
@@ -690,7 +691,7 @@ static int menu_loop_keyconfig(int id, int keys)
 {
        static int sel = 0;
 
-//     me_enable(e_menu_keyconfig, MA_OPT_SAVECFG_GAME, ready_to_go);
+//     me_enable(e_menu_keyconfig, MA_OPT_SAVECFG_GAME, ready_to_go && CdromId[0]);
        me_loop(e_menu_keyconfig, &sel, NULL);
        return 0;
 }
@@ -845,6 +846,8 @@ static menu_entry e_menu_plugin_options[] =
        mee_end,
 };
 
+static menu_entry e_menu_main[];
+
 static int menu_loop_plugin_options(int id, int keys)
 {
        static int sel = 0;
@@ -854,6 +857,7 @@ static int menu_loop_plugin_options(int id, int keys)
        snprintf(Config.Bios, sizeof(Config.Bios), "%s", bioses[bios_sel]);
        snprintf(Config.Gpu, sizeof(Config.Gpu), "%s", gpu_plugins[gpu_plugsel]);
        snprintf(Config.Spu, sizeof(Config.Spu), "%s", spu_plugins[spu_plugsel]);
+       me_enable(e_menu_main, MA_MAIN_RUN_BIOS, bios_sel != 0);
 
        return 0;
 }
@@ -932,7 +936,7 @@ static int menu_loop_options(int id, int keys)
 
        i = me_id2offset(e_menu_options, MA_OPT_CPU_CLOCKS);
        e_menu_options[i].enabled = cpu_clock != 0 ? 1 : 0;
-       me_enable(e_menu_options, MA_OPT_SAVECFG_GAME, ready_to_go);
+       me_enable(e_menu_options, MA_OPT_SAVECFG_GAME, ready_to_go && CdromId[0]);
 
        me_loop(e_menu_options, &sel, NULL);
 
@@ -982,9 +986,50 @@ const char *plat_get_credits(void)
                "  frontend (C) 2010-2011 notaz\n";
 }
 
+static int reset_game(void)
+{
+       // sanity check
+       if (bios_sel == 0 && !Config.HLE)
+               return -1;
+
+       ClosePlugins();
+       OpenPlugins();
+       SysReset();
+       if (CheckCdrom() != -1) {
+               LoadCdrom();
+       }
+       return 0;
+}
+
+static int run_bios(void)
+{
+       if (bios_sel == 0)
+               return -1;
+
+       ready_to_go = 0;
+       pl_fbdev_buf = NULL;
+
+       ClosePlugins();
+       set_cd_image(NULL);
+       LoadPlugins();
+       NetOpened = 0;
+       if (OpenPlugins() == -1) {
+               me_update_msg("failed to open plugins");
+               return -1;
+       }
+       plugin_call_rearmed_cbs();
+
+       CdromId[0] = '\0';
+       CdromLabel[0] = '\0';
+
+       SysReset();
+
+       ready_to_go = 1;
+       return 0;
+}
+
 static int run_cd_image(const char *fname)
 {
-       extern void set_cd_image(const char *fname);
        ready_to_go = 0;
        pl_fbdev_buf = NULL;
 
@@ -1066,20 +1111,17 @@ static int main_menu_handler(int id, int keys)
                        return menu_loop_savestate(1);
                break;
        case MA_MAIN_RESET_GAME:
-               if (ready_to_go) {
-                       ClosePlugins();
-                       OpenPlugins();
-                       SysReset();
-                       if (CheckCdrom() != -1) {
-                               LoadCdrom();
-                       }
+               if (ready_to_go && reset_game() == 0)
                        return 1;
-               }
                break;
        case MA_MAIN_LOAD_ROM:
                if (romsel_run() == 0)
                        return 1;
                break;
+       case MA_MAIN_RUN_BIOS:
+               if (run_bios() == 0)
+                       return 1;
+               break;
        case MA_MAIN_CREDITS:
                draw_menu_credits(draw_frame_debug);
                in_menu_wait(PBTN_MOK|PBTN_MBACK, 70);
@@ -1104,6 +1146,7 @@ static menu_entry e_menu_main[] =
        mee_handler_id("Load State",         MA_MAIN_LOAD_STATE,  main_menu_handler),
        mee_handler_id("Reset game",         MA_MAIN_RESET_GAME,  main_menu_handler),
        mee_handler_id("Load CD image",      MA_MAIN_LOAD_ROM,    main_menu_handler),
+       mee_handler_id("Run BIOS",           MA_MAIN_RUN_BIOS,    main_menu_handler),
        mee_handler   ("Options",            menu_loop_options),
        mee_handler   ("Controls",           menu_loop_keyconfig),
        mee_handler_id("Credits",            MA_MAIN_CREDITS,     main_menu_handler),
@@ -1122,11 +1165,11 @@ void menu_loop(void)
        menu_leave_emu();
 
        me_enable(e_menu_main, MA_MAIN_RESUME_GAME, ready_to_go);
-       me_enable(e_menu_main, MA_MAIN_SAVE_STATE,  ready_to_go);
-       me_enable(e_menu_main, MA_MAIN_LOAD_STATE,  ready_to_go);
+       me_enable(e_menu_main, MA_MAIN_SAVE_STATE,  ready_to_go && CdromId[0]);
+       me_enable(e_menu_main, MA_MAIN_LOAD_STATE,  ready_to_go && CdromId[0]);
        me_enable(e_menu_main, MA_MAIN_RESET_GAME,  ready_to_go);
+       me_enable(e_menu_main, MA_MAIN_RUN_BIOS, bios_sel != 0);
 
-//     menu_enter(ready_to_go);
        in_set_config_int(0, IN_CFG_BLOCKING, 1);
 
        do {