readme updated for 1.55
[libpicofe.git] / common / menu.c
index bc22e1e..b7f9e4d 100644 (file)
@@ -327,7 +327,7 @@ static int me_count(const menu_entry *ent)
        return ret;\r
 }\r
 \r
-static void me_draw(const menu_entry *entries, int sel)\r
+static void me_draw(const menu_entry *entries, int sel, void (*draw_more)(void))\r
 {\r
        const menu_entry *ent;\r
        int x, y, w = 0, h = 0;\r
@@ -449,11 +449,15 @@ static void me_draw(const menu_entry *entries, int sel)
                        menu_error_msg[0] = 0;\r
        }\r
 \r
+       if (draw_more != NULL)\r
+               draw_more();\r
+\r
        plat_video_menu_end();\r
 }\r
 \r
-static int me_process(menu_entry *entry, int is_next)\r
+static int me_process(menu_entry *entry, int is_next, int is_lr)\r
 {\r
+       int c;\r
        switch (entry->beh)\r
        {\r
                case MB_OPT_ONOFF:\r
@@ -462,7 +466,8 @@ static int me_process(menu_entry *entry, int is_next)
                        return 1;\r
                case MB_OPT_RANGE:\r
                case MB_OPT_CUSTRANGE:\r
-                       *(int *)entry->var += is_next ? 1 : -1;\r
+                       c = is_lr ? 10 : 1;\r
+                       *(int *)entry->var += is_next ? c : -c;\r
                        if (*(int *)entry->var < (int)entry->min)\r
                                *(int *)entry->var = (int)entry->max;\r
                        if (*(int *)entry->var > (int)entry->max)\r
@@ -475,12 +480,12 @@ static int me_process(menu_entry *entry, int is_next)
 \r
 static void debug_menu_loop(void);\r
 \r
-static void me_loop(menu_entry *menu, int *menu_sel)\r
+static void me_loop(menu_entry *menu, int *menu_sel, void (*draw_more)(void))\r
 {\r
        int ret, inp, sel = *menu_sel, menu_sel_max;\r
 \r
        menu_sel_max = me_count(menu) - 1;\r
-       if (menu_sel_max < 1) {\r
+       if (menu_sel_max < 0) {\r
                lprintf("no enabled menu entries\n");\r
                return;\r
        }\r
@@ -489,12 +494,12 @@ static void me_loop(menu_entry *menu, int *menu_sel)
                sel++;\r
 \r
        /* make sure action buttons are not pressed on entering menu */\r
-       me_draw(menu, sel);\r
+       me_draw(menu, sel, NULL);\r
        while (in_menu_wait_any(50) & (PBTN_MOK|PBTN_MBACK|PBTN_MENU));\r
 \r
        for (;;)\r
        {\r
-               me_draw(menu, sel);\r
+               me_draw(menu, sel, draw_more);\r
                inp = in_menu_wait(PBTN_UP|PBTN_DOWN|PBTN_LEFT|PBTN_RIGHT|\r
                                        PBTN_MOK|PBTN_MBACK|PBTN_MENU|PBTN_L|PBTN_R, 70);\r
                if (inp & (PBTN_MENU|PBTN_MBACK))\r
@@ -521,8 +526,9 @@ static void me_loop(menu_entry *menu, int *menu_sel)
                if ((inp & (PBTN_L|PBTN_R)) == (PBTN_L|PBTN_R))\r
                        debug_menu_loop();\r
 \r
-               if (inp & (PBTN_LEFT|PBTN_RIGHT)) { /* multi choice */\r
-                       if (me_process(&menu[sel], (inp & PBTN_RIGHT) ? 1 : 0))\r
+               if (inp & (PBTN_LEFT|PBTN_RIGHT|PBTN_L|PBTN_R)) { /* multi choice */\r
+                       if (me_process(&menu[sel], (inp & (PBTN_RIGHT|PBTN_R)) ? 1 : 0,\r
+                                               inp & (PBTN_L|PBTN_R)))\r
                                continue;\r
                }\r
 \r
@@ -540,6 +546,9 @@ static void me_loop(menu_entry *menu, int *menu_sel)
 \r
 /* ***************************************** */\r
 \r
+/* platform specific options and handlers */\r
+#include "../gp2x/menu.c"\r
+\r
 static void draw_menu_credits(void)\r
 {\r
        const char *creds, *p;\r
@@ -1379,7 +1388,7 @@ static int menu_loop_keyconfig(menu_id id, int keys)
        static int sel = 0;\r
 \r
        me_enable(e_menu_keyconfig, MA_OPT_SAVECFG_GAME, rom_loaded);\r
-       me_loop(e_menu_keyconfig, &sel);\r
+       me_loop(e_menu_keyconfig, &sel, NULL);\r
        return 0;\r
 }\r
 \r
@@ -1412,7 +1421,7 @@ static int mh_cdopt_ra(menu_id id, int keys)
 \r
 static menu_entry e_menu_cd_options[] =\r
 {\r
-       mee_onoff("CD LEDs",              MA_CDOPT_LEDS,          currentConfig.EmuOpt, 0x0400),\r
+       mee_onoff("CD LEDs",              MA_CDOPT_LEDS,          currentConfig.EmuOpt, EOPT_EN_CD_LEDS),\r
        mee_onoff("CDDA audio",           MA_CDOPT_CDDA,          PicoOpt, POPT_EN_MCD_CDDA),\r
        mee_onoff("PCM audio",            MA_CDOPT_PCM,           PicoOpt, POPT_EN_MCD_PCM),\r
        mee_cust ("ReadAhead buffer",     MA_CDOPT_READAHEAD,     mh_cdopt_ra, mgn_cdopt_ra),\r
@@ -1425,7 +1434,7 @@ static menu_entry e_menu_cd_options[] =
 static int menu_loop_cd_options(menu_id id, int keys)\r
 {\r
        static int sel = 0;\r
-       me_loop(e_menu_cd_options, &sel);\r
+       me_loop(e_menu_cd_options, &sel, NULL);\r
        return 0;\r
 }\r
 \r
@@ -1435,23 +1444,21 @@ static menu_entry e_menu_adv_options[] =
 {\r
        mee_onoff     ("SRAM/BRAM saves",          MA_OPT_SRAM_STATES,    currentConfig.EmuOpt, EOPT_EN_SRAM),\r
        mee_onoff     ("Disable sprite limit",     MA_OPT2_NO_SPRITE_LIM, PicoOpt, POPT_DIS_SPRITE_LIM),\r
-       mee_onoff     ("Use second CPU for sound", MA_OPT_ARM940_SOUND,   PicoOpt, POPT_EXT_FM),\r
        mee_onoff     ("Emulate Z80",              MA_OPT2_ENABLE_Z80,    PicoOpt, POPT_EN_Z80),\r
        mee_onoff     ("Emulate YM2612 (FM)",      MA_OPT2_ENABLE_YM2612, PicoOpt, POPT_EN_FM),\r
        mee_onoff     ("Emulate SN76496 (PSG)",    MA_OPT2_ENABLE_SN76496,PicoOpt, POPT_EN_PSG),\r
        mee_onoff     ("gzip savestates",          MA_OPT2_GZIP_STATES,   currentConfig.EmuOpt, EOPT_GZIP_SAVES),\r
        mee_onoff     ("Don't save last used ROM", MA_OPT2_NO_LAST_ROM,   currentConfig.EmuOpt, EOPT_NO_AUTOSVCFG),\r
-       mee_onoff     ("RAM overclock",            MA_OPT2_RAMTIMINGS,    currentConfig.EmuOpt, EOPT_RAM_TIMINGS),\r
-       mee_onoff     ("MMU hack",                 MA_OPT2_SQUIDGEHACK,   currentConfig.EmuOpt, EOPT_MMUHACK),\r
-       mee_onoff     ("SVP dynarec",              MA_OPT2_SVP_DYNAREC,   PicoOpt, POPT_EN_SVP_DRC),\r
        mee_onoff     ("Disable idle loop patching",MA_OPT2_NO_IDLE_LOOPS,PicoOpt, POPT_DIS_IDLE_DET),\r
+       mee_onoff     ("Disable frame limiter",    MA_OPT2_NO_FRAME_LIMIT,currentConfig.EmuOpt, EOPT_NO_FRMLIMIT),\r
+       MENU_GP2X_OPTIONS_ADV\r
        mee_end,\r
 };\r
 \r
 static int menu_loop_adv_options(menu_id id, int keys)\r
 {\r
        static int sel = 0;\r
-       me_loop(e_menu_adv_options, &sel);\r
+       me_loop(e_menu_adv_options, &sel, NULL);\r
        return 0;\r
 }\r
 \r
@@ -1463,48 +1470,17 @@ static int mh_opt_render(menu_id id, int keys)
        return 0;\r
 }\r
 \r
-static const char *mgn_opt_renderer(menu_id id, int *offs)\r
-{\r
-       *offs = -11;\r
-       if (PicoOpt & POPT_ALT_RENDERER)\r
-               return "     8bit fast";\r
-       else if (currentConfig.EmuOpt & EOPT_16BPP)\r
-               return "16bit accurate";\r
-       else\r
-               return " 8bit accurate";\r
-}\r
-\r
-static const char *mgn_opt_scaling(menu_id id, int *offs)\r
-{\r
-       *offs = -13;\r
-       switch (currentConfig.scaling) {\r
-               default:               return "             OFF";\r
-               case EOPT_SCALE_HW_H:  return "   hw horizontal";\r
-               case EOPT_SCALE_HW_HV: return "hw horiz. + vert";\r
-               case EOPT_SCALE_SW_H:  return "   sw horizontal";\r
-       }\r
-}\r
-\r
-static const char *mgn_aopt_gamma(menu_id id, int *offs)\r
-{\r
-       sprintf(static_buff, "%i.%02i", currentConfig.gamma / 100, currentConfig.gamma%100);\r
-       return static_buff;\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("Scaling",                  MA_OPT_SCALING,        currentConfig.scaling, 0, 3, mgn_opt_scaling),\r
-       mee_range_cust("Gamma correction",         MA_OPT2_GAMMA,         currentConfig.gamma, 1, 300, mgn_aopt_gamma),\r
-       mee_onoff     ("A_SN's gamma curve",       MA_OPT2_A_SN_GAMMA,    currentConfig.EmuOpt, EOPT_A_SN_GAMMA),\r
-       mee_onoff     ("Perfect vsync",            MA_OPT2_VSYNC,         currentConfig.EmuOpt, EOPT_PSYNC),\r
+       MENU_GP2X_OPTIONS_GFX\r
        mee_end,\r
 };\r
 \r
 static int menu_loop_gfx_options(menu_id id, int keys)\r
 {\r
        static int sel = 0;\r
-       me_loop(e_menu_gfx_options, &sel);\r
+       me_loop(e_menu_gfx_options, &sel, NULL);\r
        return 0;\r
 }\r
 \r
@@ -1709,8 +1685,8 @@ static menu_entry e_menu_options[] =
        mee_cust      ("Confirm savestate",        MA_OPT_CONFIRM_STATES,mh_opt_misc, mgn_opt_c_saves),\r
        mee_range     (cpu_clk_name,               MA_OPT_CPU_CLOCKS,    currentConfig.CPUclock, 20, 900),\r
        mee_handler   ("[Display options]",        menu_loop_gfx_options),\r
-       mee_handler   ("[Advanced options]",       menu_loop_adv_options),\r
        mee_handler   ("[Sega/Mega CD options]",   menu_loop_cd_options),\r
+       mee_handler   ("[Advanced options]",       menu_loop_adv_options),\r
        mee_handler_mkname_id(MA_OPT_SAVECFG, mh_saveloadcfg, mgn_savecfg),\r
        mee_handler_id("Save cfg for current game only", MA_OPT_SAVECFG_GAME, mh_saveloadcfg),\r
        mee_handler_mkname_id(MA_OPT_LOADCFG, mh_saveloadcfg, mgn_loadcfg),\r
@@ -1725,7 +1701,7 @@ static int menu_loop_options(menu_id id, int keys)
        me_enable(e_menu_options, MA_OPT_SAVECFG_GAME, rom_loaded);\r
        me_enable(e_menu_options, MA_OPT_LOADCFG, config_slot != config_slot_current);\r
 \r
-       me_loop(e_menu_options, &sel);\r
+       me_loop(e_menu_options, &sel, NULL);\r
 \r
        if (PicoRegionOverride)\r
                // force setting possibly changed..\r
@@ -1976,7 +1952,7 @@ void menu_loop(void)
 \r
        plat_video_menu_enter(rom_loaded);\r
        in_set_blocking(1);\r
-       me_loop(e_menu_main, &sel);\r
+       me_loop(e_menu_main, &sel, menu_main_plat_draw);\r
 \r
        if (rom_loaded) {\r
                if (engineState == PGS_Menu)\r
@@ -1992,24 +1968,14 @@ void menu_loop(void)
 \r
 static int mh_tray_load_cd(menu_id id, int keys)\r
 {\r
-       cd_img_type cd_type;\r
        char *ret_name;\r
-       int ret = -1;\r
 \r
        ret_name = romsel_run();\r
        if (ret_name == NULL)\r
                return 0;\r
 \r
-       cd_type = emu_cd_check(NULL, ret_name);\r
-       if (cd_type != CIT_NOT_CD)\r
-               ret = Insert_CD(ret_name, cd_type);\r
-       if (ret != 0) {\r
-               me_update_msg("Load failed, invalid CD image?");\r
-               return 0;\r
-       }\r
-\r
        engineState = PGS_RestartRun;\r
-       return 1;\r
+       return emu_swap_cd(ret_name);\r
 }\r
 \r
 static int mh_tray_nothing(menu_id id, int keys)\r
@@ -2025,6 +1991,7 @@ static menu_entry e_menu_tray[] =
        mee_label  (""),\r
        mee_handler("Load CD image",  mh_tray_load_cd),\r
        mee_handler("Insert nothing", mh_tray_nothing),\r
+       mee_end,\r
 };\r
 \r
 int menu_loop_tray(void)\r
@@ -2034,7 +2001,7 @@ int menu_loop_tray(void)
        plat_video_menu_enter(rom_loaded);\r
 \r
        in_set_blocking(1);\r
-       me_loop(e_menu_tray, &sel);\r
+       me_loop(e_menu_tray, &sel, NULL);\r
 \r
        if (engineState != PGS_RestartRun) {\r
                engineState = PGS_RestartRun;\r
@@ -2060,13 +2027,17 @@ void me_update_msg(const char *msg)
 \r
 // ------------ util ------------\r
 \r
-/* wiz for now, probably extend later */\r
+/* GP2X/wiz for now, probably extend later */\r
 void menu_plat_setup(int is_wiz)\r
 {\r
        int i;\r
 \r
-       if (!is_wiz)\r
+       if (!is_wiz) {\r
+               me_enable(e_menu_gfx_options, MA_OPT_TEARING_FIX, 0);\r
+               i = me_id2offset(e_menu_gfx_options, MA_OPT_TEARING_FIX);\r
+               e_menu_gfx_options[i].need_to_save = 0;\r
                return;\r
+       }\r
 \r
        me_enable(e_menu_adv_options, MA_OPT_ARM940_SOUND, 0);\r
        me_enable(e_menu_gfx_options, MA_OPT2_GAMMA, 0);\r
@@ -2074,6 +2045,8 @@ void menu_plat_setup(int is_wiz)
 \r
        i = me_id2offset(e_menu_gfx_options, MA_OPT_SCALING);\r
        e_menu_gfx_options[i].max = 1;  /* only off and sw */\r
+       i = me_id2offset(e_menu_gfx_options, MA_OPT_ARM940_SOUND);\r
+       e_menu_gfx_options[i].need_to_save = 0;\r
 }\r
 \r
 /* TODO: rename */\r