32x and sms savestates. Core-independent z80 state. SS bugfixing/refactoring.
[picodrive.git] / platform / common / menu.c
index 8accc25..5b0474a 100644 (file)
@@ -19,7 +19,7 @@
 #include <version.h>\r
 #include <revision.h>\r
 \r
-#include <pico/pico_int.h>\r
+#include <pico/pico.h>\r
 #include <pico/patch.h>\r
 \r
 static char static_buff[64];\r
@@ -603,7 +603,6 @@ static void me_loop(menu_entry *menu, int *menu_sel, void (*draw_more)(void))
 #else\r
 #define MENU_OPTIONS_GFX\r
 #define MENU_OPTIONS_ADV\r
-#define mgn_opt_renderer NULL /* TODO */\r
 #define menu_main_plat_draw NULL\r
 #endif\r
 \r
@@ -1040,34 +1039,22 @@ static void state_check_slots(void)
 \r
 static void draw_savestate_bg(int slot)\r
 {\r
-       struct PicoVideo tmp_pv;\r
-       unsigned short tmp_cram[0x40];\r
-       unsigned short tmp_vsram[0x40];\r
-       void *tmp_vram;\r
        const char *fname;\r
+       void *tmp_state;\r
 \r
        fname = emu_get_save_fname(1, 0, slot);\r
-       if (!fname) return;\r
-\r
-       tmp_vram = malloc(sizeof(Pico.vram));\r
-       if (tmp_vram == NULL) return;\r
+       if (!fname)\r
+               return;\r
 \r
-       memcpy(tmp_vram, Pico.vram, sizeof(Pico.vram));\r
-       memcpy(tmp_cram, Pico.cram, sizeof(Pico.cram));\r
-       memcpy(tmp_vsram, Pico.vsram, sizeof(Pico.vsram));\r
-       memcpy(&tmp_pv, &Pico.video, sizeof(Pico.video));\r
+       tmp_state = PicoTmpStateSave();\r
 \r
-       PicoStateLoadVDP(fname);\r
+       PicoStateLoadGfx(fname);\r
 \r
        /* do a frame and fetch menu bg */\r
        pemu_forced_frame(POPT_EN_SOFTSCALE);\r
        menu_enter(1);\r
 \r
-       memcpy(Pico.vram, tmp_vram, sizeof(Pico.vram));\r
-       memcpy(Pico.cram, tmp_cram, sizeof(Pico.cram));\r
-       memcpy(Pico.vsram, tmp_vsram, sizeof(Pico.vsram));\r
-       memcpy(&Pico.video, &tmp_pv,  sizeof(Pico.video));\r
-       free(tmp_vram);\r
+       PicoTmpStateRestore(tmp_state);\r
 }\r
 \r
 static void draw_savestate_menu(int menu_sel, int is_loading)\r
@@ -1106,6 +1093,7 @@ static int menu_loop_savestate(int is_loading)
        static int menu_sel = 10;\r
        int menu_sel_max = 10;\r
        unsigned long inp = 0;\r
+       int ret = 0;\r
 \r
        state_check_slots();\r
 \r
@@ -1135,15 +1123,18 @@ static int menu_loop_savestate(int is_loading)
                                state_slot = menu_sel;\r
                                if (emu_save_load_game(is_loading, 0)) {\r
                                        me_update_msg(is_loading ? "Load failed" : "Save failed");\r
-                                       return 0;\r
+                                       break;\r
                                }\r
-                               return 1;\r
+                               ret = 1;\r
+                               break;\r
                        }\r
-                       return 0;\r
+                       break;\r
                }\r
                if (inp & PBTN_MBACK)\r
-                       return 0;\r
+                       break;\r
        }\r
+\r
+       return ret;\r
 }\r
 \r
 // -------------- key config --------------\r
@@ -1494,16 +1485,47 @@ static int menu_loop_cd_options(menu_id id, int keys)
 \r
 // ------------ 32X options menu ------------\r
 \r
+static const char *get_rname(const char **rn, int val, int *offs)\r
+{\r
+       int i, len, found = -1, maxlen = 0;\r
+\r
+       for (i = 0; rn[i] != NULL; i++) {\r
+               len = strlen(rn[i]);\r
+               if (len > maxlen)\r
+                       maxlen = len;\r
+               if (i == val)\r
+                       found = i;\r
+       }\r
+\r
+       *offs = 3 - maxlen;\r
+       if (found >= 0)\r
+               return rn[found];\r
+       return "???";\r
+}\r
+\r
+static const char *mgn_opt_renderer32x(menu_id id, int *offs)\r
+{\r
+       return get_rname(renderer_names32x, currentConfig.renderer32x, offs);\r
+}\r
+\r
 static menu_entry e_menu_32x_options[] =\r
 {\r
-       mee_onoff("32X enabled",          MA_32XOPT_ENABLE_32X,   PicoOpt, POPT_EN_32X),\r
-       mee_onoff("PWM sound",            MA_32XOPT_PWM,          PicoOpt, POPT_EN_PWM),\r
+       mee_onoff     ("32X enabled",  MA_32XOPT_ENABLE_32X, PicoOpt, POPT_EN_32X),\r
+       mee_range_cust("32X renderer", MA_32XOPT_RENDERER,   currentConfig.renderer32x, 0, 0, mgn_opt_renderer32x),\r
+       mee_onoff     ("PWM sound",    MA_32XOPT_PWM,        PicoOpt, POPT_EN_PWM),\r
        mee_end,\r
 };\r
 \r
 static int menu_loop_32x_options(menu_id id, int keys)\r
 {\r
        static int sel = 0;\r
+       int i, c;\r
+\r
+       for (c = 0; renderer_names32x != NULL && renderer_names32x[c] != NULL; )\r
+               c++;\r
+       i = me_id2offset(e_menu_32x_options, MA_32XOPT_RENDERER);\r
+       e_menu_32x_options[i].max = c > 0 ? (c - 1) : 0;\r
+\r
        me_loop(e_menu_32x_options, &sel, NULL);\r
        return 0;\r
 }\r
@@ -1534,15 +1556,14 @@ static int menu_loop_adv_options(menu_id id, int keys)
 \r
 // ------------ gfx options menu ------------\r
 \r
-static int mh_opt_render(menu_id id, int keys)\r
+static const char *mgn_opt_renderer(menu_id id, int *offs)\r
 {\r
-       plat_video_toggle_renderer((keys & PBTN_RIGHT) ? 1 : 0, 0, 1);\r
-       return 0;\r
+       return get_rname(renderer_names, currentConfig.renderer, offs);\r
 }\r
 \r
 static menu_entry e_menu_gfx_options[] =\r
 {\r
-       mee_cust      ("Renderer",                 MA_OPT_RENDERER,       mh_opt_render, mgn_opt_renderer),\r
+       mee_range_cust("Renderer", MA_OPT_RENDERER,   currentConfig.renderer, 0, 0, mgn_opt_renderer),\r
        MENU_OPTIONS_GFX\r
        mee_end,\r
 };\r
@@ -1550,6 +1571,14 @@ static menu_entry e_menu_gfx_options[] =
 static int menu_loop_gfx_options(menu_id id, int keys)\r
 {\r
        static int sel = 0;\r
+       int i, c;\r
+\r
+       for (c = 0; renderer_names != NULL && renderer_names[c] != NULL; )\r
+               c++;\r
+       i = me_id2offset(e_menu_gfx_options, MA_OPT_RENDERER);\r
+       e_menu_gfx_options[i].max = c > 0 ? (c - 1) : 0;\r
+       me_enable(e_menu_gfx_options, MA_OPT_RENDERER, renderer_names != NULL);\r
+\r
        me_loop(e_menu_gfx_options, &sel, NULL);\r
        return 0;\r
 }\r