bugfixes, new config system and messed code for it
[libpicofe.git] / psp / menu.c
index fc44446..b5f3203 100644 (file)
@@ -153,7 +153,7 @@ void menu_romload_prepare(const char *rom_name)
        while (p > rom_name && *p != '/') p--;
 
        psp_video_switch_to_single();
-       if (rom_data) menu_draw_begin();
+       if (rom_loaded) menu_draw_begin();
        else memset32_uncached(psp_screen, 0, 512*272*2/4);
 
        smalltext_out16(1, 1, "Loading", 0xffff);
@@ -206,7 +206,7 @@ static void draw_dirlist(char *curdir, struct my_dirent **namelist, int n, int s
 
        menu_draw_begin();
 
-       if (rom_data == NULL) {
+       if (!rom_loaded) {
 //             menu_darken_bg(menu_screen, menu_screen, 321*240, 0);
        }
 
@@ -699,8 +699,6 @@ static int count_bound_keys(int action, int pl_idx)
        return keys;
 }
 
-typedef struct { char *name; int mask; } bind_action_t;
-
 static void draw_key_config(const bind_action_t *opts, int opt_cnt, int player_idx, int sel)
 {
        int x, y, tl_y = 16+40, i;
@@ -789,33 +787,17 @@ static void draw_kc_sel(int menu_sel)
 }
 
 
-// PicoPad[] format: MXYZ SACB RLDU
-static bind_action_t ctrl_actions[] =
-{
-       { "UP     ", 0x001 },
-       { "DOWN   ", 0x002 },
-       { "LEFT   ", 0x004 },
-       { "RIGHT  ", 0x008 },
-       { "A      ", 0x040 },
-       { "B      ", 0x010 },
-       { "C      ", 0x020 },
-       { "START  ", 0x080 },
-       { "MODE   ", 0x800 },
-       { "X      ", 0x400 },
-       { "Y      ", 0x200 },
-       { "Z      ", 0x100 },
-};
-
 // player2_flag, ?, ?, ?, ?, ?, ?, menu
 // "NEXT SAVE SLOT", "PREV SAVE SLOT", "SWITCH RENDERER", "SAVE STATE",
 // "LOAD STATE", "VOLUME UP", "VOLUME DOWN", "DONE"
-static bind_action_t emuctrl_actions[] =
+me_bind_action emuctrl_actions[] =
 {
        { "Load State     ", 1<<28 },
        { "Save State     ", 1<<27 },
        { "Prev Save Slot ", 1<<25 },
        { "Next Save Slot ", 1<<24 },
        { "Switch Renderer", 1<<26 },
+       { NULL,              0     }
 };
 
 static void kc_sel_loop(void)
@@ -832,11 +814,11 @@ static void kc_sel_loop(void)
                if (inp & BTN_DOWN) { menu_sel++; if (menu_sel > menu_sel_max) menu_sel = 0; }
                if (inp & BTN_CIRCLE) {
                        switch (menu_sel) {
-                               case 0: key_config_loop(ctrl_actions, is_6button ? 12 : 8, 0); return;
-                               case 1: key_config_loop(ctrl_actions, is_6button ? 12 : 8, 1); return;
+                               case 0: key_config_loop(me_ctrl_actions, is_6button ? 12 : 8, 0); return;
+                               case 1: key_config_loop(me_ctrl_actions, is_6button ? 12 : 8, 1); return;
                                case 2: key_config_loop(emuctrl_actions,
                                                sizeof(emuctrl_actions)/sizeof(emuctrl_actions[0]), -1); return;
-                               case 3: if (rom_data == NULL) emu_WriteConfig(0); return;
+                               case 3: if (!rom_loaded) emu_WriteConfig(0); return;
                                default: return;
                        }
                }
@@ -1051,7 +1033,7 @@ static void menu_opt3_preview(int is_32col)
 {
        void *oldstate = NULL;
 
-       if (rom_data == NULL || ((Pico.video.reg[12]&1)^1) != is_32col)
+       if (!rom_loaded || ((Pico.video.reg[12]&1)^1) != is_32col)
        {
                extern char bgdatac32_start[], bgdatac40_start[];
                extern int bgdatac32_size, bgdatac40_size;
@@ -1061,7 +1043,7 @@ static void menu_opt3_preview(int is_32col)
                ret = uncompress((Bytef *)bg_buffer, &outsize, bgdata, insize);
                if (ret == 0)
                {
-                       if (rom_data != NULL) oldstate = get_oldstate_for_preview();
+                       if (rom_loaded) oldstate = get_oldstate_for_preview();
                        memcpy(Pico.vram,  bg_buffer, sizeof(Pico.vram));
                        memcpy(Pico.cram,  (char *)bg_buffer + 0x10000, 0x40*2);
                        memcpy(Pico.vsram, (char *)bg_buffer + 0x10080, 0x40*2);
@@ -1261,29 +1243,6 @@ menu_entry opt_entries[] =
 #define OPT_ENTRY_COUNT (sizeof(opt_entries) / sizeof(opt_entries[0]))
 
 
-static const char *region_name(unsigned int code)
-{
-       static const char *names[] = { "Auto", "      Japan NTSC", "      Japan PAL", "      USA", "      Europe" };
-       static const char *names_short[] = { "", " JP", " JP", " US", " EU" };
-       int u, i = 0;
-       if (code) {
-               code <<= 1;
-               while((code >>= 1)) i++;
-               if (i > 4) return "unknown";
-               return names[i];
-       } else {
-               static char name[24];
-               strcpy(name, "Auto:");
-               for (u = 0; u < 3; u++) {
-                       i = 0; code = ((PicoAutoRgnOrder >> u*4) & 0xf) << 1;
-                       while((code >>= 1)) i++;
-                       strcat(name, names_short[i]);
-               }
-               return name;
-       }
-}
-
-
 static void menu_opt_cust_draw(const menu_entry *entry, int x, int y, void *param)
 {
        char *str, str24[24];
@@ -1310,7 +1269,7 @@ static void menu_opt_cust_draw(const menu_entry *entry, int x, int y, void *para
                        text_out16(x, y, "Sound Quality:     %5iHz %s", currentConfig.PsndRate, str);
                        break;
                case MA_OPT_REGION:
-                       text_out16(x, y, "Region:              %s", region_name(currentConfig.PicoRegion));
+                       text_out16(x, y, "Region:              %s", me_region_name(PicoRegionOverride, PicoAutoRgnOrder));
                        break;
                case MA_OPT_CONFIRM_STATES:
                        switch ((currentConfig.EmuOpt >> 9) & 5) {
@@ -1371,21 +1330,21 @@ static void region_prevnext(int right)
        static int rgn_orders[] = { 0x148, 0x184, 0x814, 0x418, 0x841, 0x481 };
        int i;
        if (right) {
-               if (!currentConfig.PicoRegion) {
+               if (!PicoRegionOverride) {
                        for (i = 0; i < 6; i++)
                                if (rgn_orders[i] == PicoAutoRgnOrder) break;
                        if (i < 5) PicoAutoRgnOrder = rgn_orders[i+1];
-                       else currentConfig.PicoRegion=1;
+                       else PicoRegionOverride=1;
                }
-               else currentConfig.PicoRegion<<=1;
-               if (currentConfig.PicoRegion > 8) currentConfig.PicoRegion = 8;
+               else PicoRegionOverride<<=1;
+               if (PicoRegionOverride > 8) PicoRegionOverride = 8;
        } else {
-               if (!currentConfig.PicoRegion) {
+               if (!PicoRegionOverride) {
                        for (i = 0; i < 6; i++)
                                if (rgn_orders[i] == PicoAutoRgnOrder) break;
                        if (i > 0) PicoAutoRgnOrder = rgn_orders[i-1];
                }
-               else currentConfig.PicoRegion>>=1;
+               else PicoRegionOverride>>=1;
        }
 }
 
@@ -1393,7 +1352,10 @@ static void menu_options_save(void)
 {
        PicoOpt = currentConfig.PicoOpt;
        PsndRate = currentConfig.PsndRate;
-       PicoRegionOverride = currentConfig.PicoRegion;
+       if (PicoRegionOverride) {
+               // force setting possibly changed..
+               Pico.m.pal = (PicoRegionOverride == 2 || PicoRegionOverride == 8) ? 1 : 0;
+       }
        if (!(PicoOpt & 0x20)) {
                // unbind XYZ MODE, just in case
                unbind_action(0xf00);
@@ -1409,9 +1371,8 @@ static int menu_loop_options(void)
 
        currentConfig.PicoOpt = PicoOpt;
        currentConfig.PsndRate = PsndRate;
-       currentConfig.PicoRegion = PicoRegionOverride;
 
-       me_enable(opt_entries, OPT_ENTRY_COUNT, MA_OPT_SAVECFG_GAME, rom_data != NULL);
+       me_enable(opt_entries, OPT_ENTRY_COUNT, MA_OPT_SAVECFG_GAME, rom_loaded);
        me_enable(opt_entries, OPT_ENTRY_COUNT, MA_OPT_LOADCFG, config_slot != config_slot_current);
        menu_sel_max = me_count_enabled(opt_entries, OPT_ENTRY_COUNT) - 1;
        if (menu_sel > menu_sel_max) menu_sel = menu_sel_max;
@@ -1598,10 +1559,10 @@ static void menu_loop_root(void)
        int ret, menu_sel_max;
        unsigned long inp = 0;
 
-       me_enable(main_entries, MAIN_ENTRY_COUNT, MA_MAIN_RESUME_GAME, rom_data != NULL);
-       me_enable(main_entries, MAIN_ENTRY_COUNT, MA_MAIN_SAVE_STATE,  rom_data != NULL);
-       me_enable(main_entries, MAIN_ENTRY_COUNT, MA_MAIN_LOAD_STATE,  rom_data != NULL);
-       me_enable(main_entries, MAIN_ENTRY_COUNT, MA_MAIN_RESET_GAME,  rom_data != NULL);
+       me_enable(main_entries, MAIN_ENTRY_COUNT, MA_MAIN_RESUME_GAME, rom_loaded);
+       me_enable(main_entries, MAIN_ENTRY_COUNT, MA_MAIN_SAVE_STATE,  rom_loaded);
+       me_enable(main_entries, MAIN_ENTRY_COUNT, MA_MAIN_LOAD_STATE,  rom_loaded);
+       me_enable(main_entries, MAIN_ENTRY_COUNT, MA_MAIN_RESET_GAME,  rom_loaded);
        me_enable(main_entries, MAIN_ENTRY_COUNT, MA_MAIN_PATCHES,     PicoPatches != NULL);
 
        menu_sel_max = me_count_enabled(main_entries, MAIN_ENTRY_COUNT) - 1;
@@ -1628,7 +1589,7 @@ static void menu_loop_root(void)
                if(inp & BTN_DOWN)  { menu_sel++; if (menu_sel > menu_sel_max) menu_sel = 0; }
                if((inp & (BTN_L|BTN_R)) == (BTN_L|BTN_R)) debug_menu_loop();
                if( inp & (BTN_SELECT|BTN_X)) {
-                       if (rom_data) {
+                       if (rom_loaded) {
                                while (psp_pad_read(1) & (BTN_SELECT|BTN_X)) psp_msleep(50); // wait until released
                                engineState = PGS_Running;
                                break;
@@ -1639,14 +1600,14 @@ static void menu_loop_root(void)
                        switch (me_index2id(main_entries, MAIN_ENTRY_COUNT, menu_sel))
                        {
                                case MA_MAIN_RESUME_GAME:
-                                       if (rom_data) {
+                                       if (rom_loaded) {
                                                while (psp_pad_read(1) & BTN_CIRCLE) psp_msleep(50);
                                                engineState = PGS_Running;
                                                return;
                                        }
                                        break;
                                case MA_MAIN_SAVE_STATE:
-                                       if (rom_data) {
+                                       if (rom_loaded) {
                                                if(savestate_menu_loop(0))
                                                        continue;
                                                engineState = PGS_Running;
@@ -1654,7 +1615,7 @@ static void menu_loop_root(void)
                                        }
                                        break;
                                case MA_MAIN_LOAD_STATE:
-                                       if (rom_data) {
+                                       if (rom_loaded) {
                                                if(savestate_menu_loop(1))
                                                        continue;
                                                engineState = PGS_Running;
@@ -1662,7 +1623,7 @@ static void menu_loop_root(void)
                                        }
                                        break;
                                case MA_MAIN_RESET_GAME:
-                                       if (rom_data) {
+                                       if (rom_loaded) {
                                                emu_ResetGame();
                                                engineState = PGS_Running;
                                                return;
@@ -1707,7 +1668,7 @@ static void menu_loop_root(void)
                                        engineState = PGS_Quit;
                                        return;
                                case MA_MAIN_PATCHES:
-                                       if (rom_data && PicoPatches) {
+                                       if (rom_loaded && PicoPatches) {
                                                patches_menu_loop();
                                                PicoPatchApply();
                                                strcpy(menuErrorMsg, "Patches applied");
@@ -1769,7 +1730,7 @@ static void menu_prepare_bg(int use_game_bg, int use_fg)
 
 static void menu_gfx_prepare(void)
 {
-       menu_prepare_bg(rom_data != NULL, 1);
+       menu_prepare_bg(rom_loaded, 1);
 
        menu_draw_begin();
        menu_draw_end();