new cfg file system
authornotaz <notasas@gmail.com>
Thu, 20 Mar 2008 21:30:17 +0000 (21:30 +0000)
committernotaz <notasas@gmail.com>
Thu, 20 Mar 2008 21:30:17 +0000 (21:30 +0000)
git-svn-id: file:///home/notaz/opt/svn/PicoDrive@390 be3aeb3a-fb24-0410-a615-afba39da0efa

13 files changed:
platform/common/emu.c
platform/common/emu.h
platform/common/menu.c
platform/common/menu.h
platform/gizmondo/emu.c
platform/gizmondo/menu.c
platform/gp2x/Makefile
platform/gp2x/emu.c
platform/gp2x/main.c
platform/gp2x/menu.c
platform/linux/Makefile
platform/psp/emu.c
platform/psp/menu.c

index b7832bb..8ec61a2 100644 (file)
@@ -14,6 +14,7 @@
 #include "menu.h"\r
 #include "fonts.h"\r
 #include "lprintf.h"\r
+#include "config.h"\r
 \r
 #include <Pico/PicoInt.h>\r
 #include <Pico/Patch.h>\r
@@ -33,8 +34,8 @@
  #define SCREEN_BUFFER psp_screen\r
 #endif\r
 \r
-char *PicoConfigFile = "picoconfig.bin";\r
-currentConfig_t currentConfig;\r
+char *PicoConfigFile = "picoconfig.cfg";\r
+currentConfig_t currentConfig, defaultConfig;\r
 int rom_loaded = 0;\r
 char noticeMsg[64];\r
 int state_slot = 0;\r
@@ -150,6 +151,8 @@ static int emu_isBios(const char *name)
        return 0;\r
 }\r
 \r
+static unsigned char scd_id_header[0x100];\r
+\r
 /* checks if romFileName points to valid MegaCD image\r
  * if so, checks for suitable BIOS */\r
 int emu_cdCheck(int *pregion)\r
@@ -173,6 +176,9 @@ int emu_cdCheck(int *pregion)
                return 0;\r
        }\r
 \r
+       pm_seek(cd_f, (type == 1) ? 0x100 : 0x110, SEEK_SET);\r
+       pm_read(scd_id_header, sizeof(scd_id_header), cd_f);\r
+\r
        /* it seems we have a CD image here. Try to detect region now.. */\r
        pm_seek(cd_f, (type == 1) ? 0x100+0x10B : 0x110+0x10B, SEEK_SET);\r
        pm_read(buf, 1, cd_f);\r
@@ -189,6 +195,68 @@ int emu_cdCheck(int *pregion)
        return type;\r
 }\r
 \r
+static int extract_text(char *dest, unsigned char *src, int len, int swab)\r
+{\r
+       char *p = dest;\r
+       int i;\r
+\r
+       if (swab) swab = 1;\r
+\r
+       for (i = len - 1; i >= 0; i--)\r
+       {\r
+               if (src[i^swab] != ' ') break;\r
+       }\r
+       len = i + 1;\r
+\r
+       for (i = 0; i < len; i++)\r
+       {\r
+               unsigned char s = src[i^swab];\r
+               if (s >= 0x20 && s < 0x7f && s != '#' && s != '|' &&\r
+                       s != '[' && s != ']' && s != '\\')\r
+               {\r
+                       *p++ = s;\r
+               }\r
+               else\r
+               {\r
+                       sprintf(p, "\\%02x", s);\r
+                       p += 3;\r
+               }\r
+       }\r
+\r
+       return p - dest;\r
+}\r
+\r
+char *emu_makeRomId(void)\r
+{\r
+       static char id_string[3+0x11+0x11+0x30+16];\r
+       unsigned char *id_header;\r
+       int pos;\r
+\r
+       if (Pico.rom == NULL) {\r
+               id_string[0] = 0;\r
+               return id_string;\r
+       }\r
+\r
+       if (PicoMCD & 1) {\r
+               id_header = scd_id_header;\r
+               strcpy(id_string, "CD|");\r
+       } else {\r
+               id_header = Pico.rom + 0x100;\r
+               strcpy(id_string, "MD|");\r
+       }\r
+       pos = 3;\r
+\r
+       pos += extract_text(id_string + pos, id_header + 0x80, 0x10, 1); // seral\r
+       id_string[pos] = '|'; pos++;\r
+       pos += extract_text(id_string + pos, id_header + 0xf0, 0x10, 1); // region\r
+       id_string[pos] = '|'; pos++;\r
+       pos += extract_text(id_string + pos, id_header + 0x50, 0x30, 1); // overseas name\r
+       id_string[pos] = 0;\r
+\r
+       printf("id_string: %s\n", id_string);\r
+       return id_string;\r
+}\r
+\r
 int emu_ReloadRom(void)\r
 {\r
        unsigned int rom_size = 0;\r
@@ -421,49 +489,68 @@ static void romfname_ext(char *dst, const char *prefix, const char *ext)
 \r
 int emu_ReadConfig(int game, int no_defaults)\r
 {\r
+       char cfg[512];\r
        FILE *f;\r
-       char cfg[512], extbuf[16];\r
-       int bread = 0;\r
+       int ret;\r
 \r
        if (!game)\r
        {\r
                if (!no_defaults)\r
-               {\r
                        emu_setDefaultConfig();\r
-               }\r
                strncpy(cfg, PicoConfigFile, 511);\r
                if (config_slot != 0)\r
                {\r
                        char *p = strrchr(cfg, '.');\r
                        if (p == NULL) p = cfg + strlen(cfg);\r
-                       sprintf(extbuf, ".%i.pbcfg", config_slot);\r
-                       strncpy(p, extbuf, 511 - (p - cfg));\r
+                       sprintf(p, ".%i.cfg", config_slot);\r
                }\r
                cfg[511] = 0;\r
-       } else {\r
-               if (config_slot != 0)\r
-                    sprintf(extbuf, ".%i.pbcfg", config_slot);\r
-               else strcpy(extbuf, ".pbcfg");\r
-               romfname_ext(cfg, "cfg/", extbuf);\r
-               f = fopen(cfg, "rb");\r
-               if (!f) romfname_ext(cfg, NULL, ".pbcfg");\r
-               else fclose(f);\r
+               ret = config_readsect(cfg, NULL);\r
        }\r
+       else\r
+       {\r
+               if (!no_defaults)\r
+                       emu_setDefaultConfig();\r
 \r
-       lprintf("emu_ReadConfig: %s ", cfg);\r
-       f = fopen(cfg, "rb");\r
-       if (f) {\r
-               bread = fread(&currentConfig, 1, sizeof(currentConfig), f);\r
-               fclose(f);\r
+               // try new .cfg way\r
+               if (config_slot != 0)\r
+                    sprintf(cfg, "game.%i.cfg", config_slot);\r
+               else strcpy(cfg,  "game.cfg");\r
+               ret = config_readsect(cfg, emu_makeRomId());\r
+\r
+               if (ret != 0)\r
+               {\r
+                       // fall back to old\r
+                       char extbuf[16];\r
+                       if (config_slot != 0)\r
+                               sprintf(extbuf, ".%i.pbcfg", config_slot);\r
+                       else strcpy(extbuf, ".pbcfg");\r
+                       romfname_ext(cfg, "cfg/", extbuf);\r
+                       f = fopen(cfg, "rb");\r
+                       if (!f) {\r
+                               romfname_ext(cfg, NULL, ".pbcfg");\r
+                               f = fopen(cfg, "rb");\r
+                       }\r
+                       if (f) {\r
+                               int bread = fread(&currentConfig, 1, sizeof(currentConfig), f);\r
+                               lprintf("emu_ReadConfig: %s %s\n", cfg, bread > 0 ? "(ok)" : "(failed)");\r
+                               fclose(f);\r
+                               ret = 0;\r
+                       }\r
+\r
+                       if (ret == 0) {\r
+                               PicoOpt = currentConfig.s_PicoOpt;\r
+                               PsndRate = currentConfig.s_PsndRate;\r
+                               PicoRegionOverride = currentConfig.s_PicoRegion;\r
+                               PicoAutoRgnOrder = currentConfig.s_PicoAutoRgnOrder;\r
+                               PicoCDBuffers = currentConfig.s_PicoCDBuffers;\r
+                       }\r
+               }\r
+               else\r
+               {\r
+               }\r
        }\r
-       lprintf(bread > 0 ? "(ok)\n" : "(failed)\n");\r
 \r
-       PicoOpt = currentConfig.PicoOpt;\r
-       PsndRate = currentConfig.PsndRate;\r
-       PicoRegionOverride = currentConfig.PicoRegion;\r
-       PicoAutoRgnOrder = currentConfig.PicoAutoRgnOrder;\r
-       PicoCDBuffers = currentConfig.PicoCDBuffers;\r
-       //scaling_update();\r
        // some sanity checks\r
        if (currentConfig.CPUclock < 10 || currentConfig.CPUclock > 4096) currentConfig.CPUclock = 200;\r
 #ifdef PSP\r
@@ -479,54 +566,43 @@ int emu_ReadConfig(int game, int no_defaults)
                currentConfig.KeyBinds[22] = 1<<30; // vol down\r
        }\r
 #endif\r
-       if (bread > 0) config_slot_current = config_slot;\r
-       return (bread > 0); // == sizeof(currentConfig));\r
+       if (ret == 0) config_slot_current = config_slot;\r
+       return (ret == 0);\r
 }\r
 \r
 \r
-int emu_WriteConfig(int game)\r
+int emu_WriteConfig(int is_game)\r
 {\r
-       FILE *f;\r
-       char cfg[512], extbuf[16];\r
-       int bwrite = 0;\r
+       char cfg[512], *game_sect = NULL;\r
+       int ret, write_lrom = 0;\r
 \r
-       if (!game)\r
+       if (!is_game)\r
        {\r
                strncpy(cfg, PicoConfigFile, 511);\r
                if (config_slot != 0)\r
                {\r
                        char *p = strrchr(cfg, '.');\r
                        if (p == NULL) p = cfg + strlen(cfg);\r
-                       sprintf(extbuf, ".%i.pbcfg", config_slot);\r
-                       strncpy(p, extbuf, 511 - (p - cfg));\r
+                       sprintf(p, ".%i.cfg", config_slot);\r
                }\r
                cfg[511] = 0;\r
+               write_lrom = 1;\r
        } else {\r
                if (config_slot != 0)\r
-                    sprintf(extbuf, ".%i.pbcfg", config_slot);\r
-               else strcpy(extbuf, ".pbcfg");\r
-               romfname_ext(cfg, "cfg/", extbuf);\r
+                    sprintf(cfg, "game.%i.cfg", config_slot);\r
+               else strcpy(cfg,  "game.cfg");\r
+               game_sect = emu_makeRomId();\r
        }\r
 \r
        lprintf("emu_WriteConfig: %s ", cfg);\r
-       f = fopen(cfg, "wb");\r
-       if (f) {\r
-               currentConfig.PicoOpt = PicoOpt;\r
-               currentConfig.PsndRate = PsndRate;\r
-               currentConfig.PicoRegion = PicoRegionOverride;\r
-               currentConfig.PicoAutoRgnOrder = PicoAutoRgnOrder;\r
-               currentConfig.PicoCDBuffers = PicoCDBuffers;\r
-               bwrite = fwrite(&currentConfig, 1, sizeof(currentConfig), f);\r
-               fflush(f);\r
-               fclose(f);\r
+       ret = config_writesect(cfg, game_sect);\r
 #ifndef NO_SYNC\r
-               sync();\r
+       sync();\r
 #endif\r
-       }\r
-       lprintf((bwrite == sizeof(currentConfig)) ? "(ok)\n" : "(failed)\n");\r
+       lprintf((ret == 0) ? "(ok)\n" : "(failed)\n");\r
 \r
-       if (bwrite == sizeof(currentConfig)) config_slot_current = config_slot;\r
-       return (bwrite == sizeof(currentConfig));\r
+       if (ret == 0) config_slot_current = config_slot;\r
+       return ret == 0;\r
 }\r
 \r
 \r
index dd114ca..484080a 100644 (file)
@@ -10,24 +10,23 @@ typedef struct {
                                        // craigix_ram, confirm_save, show_cd_leds, confirm_load
                                        // A_SNs_gamma, perfect_vsync, giz_scanlines, giz_dblbuff
                                        // vsync_mode, show_clock, no_frame_limitter
-       int PicoOpt;  // used for config saving only, see Pico.h
-       int PsndRate; // ditto
-       int PicoRegion; // ditto
+       int s_PicoOpt;          // for old cfg files only
+       int s_PsndRate;
+       int s_PicoRegion;
        int Frameskip;
        int CPUclock;
        int KeyBinds[32];
        int volume;
        int gamma;
        int JoyBinds[4][32];
-       int PicoAutoRgnOrder;
-       int PicoCDBuffers;
+       int s_PicoAutoRgnOrder;
+       int s_PicoCDBuffers;
        int scaling; // gp2x: 0=center, 1=hscale, 2=hvscale, 3=hsoftscale; psp: bilinear filtering
        float scale; // psp: screen scale
        float hscale32, hscale40; // psp: horizontal scale
 } currentConfig_t;
 
-
-extern currentConfig_t currentConfig;
+extern currentConfig_t currentConfig, defaultConfig;
 extern char *PicoConfigFile;
 extern int rom_loaded;
 extern char noticeMsg[64];
@@ -48,4 +47,6 @@ int   emu_cdCheck(int *pregion);
 int   emu_findBios(int region, char **bios_file);
 void  emu_textOut8 (int x, int y, const char *text);
 void  emu_textOut16(int x, int y, const char *text);
+char *emu_makeRomId(void);
 
+void  emu_prepareDefaultConfig(void);
index 7fc7ba5..16d4342 100644 (file)
@@ -322,5 +322,25 @@ int me_process(menu_entry *entries, int count, menu_id id, int is_next)
        }\r
 }\r
 \r
-\r
+const char *me_region_name(unsigned int code, int auto_order)\r
+{\r
+       static const char *names[] = { "Auto", "      Japan NTSC", "      Japan PAL", "      USA", "      Europe" };\r
+       static const char *names_short[] = { "", " JP", " JP", " US", " EU" };\r
+       int u, i = 0;\r
+       if (code) {\r
+               code <<= 1;\r
+               while((code >>= 1)) i++;\r
+               if (i > 4) return "unknown";\r
+               return names[i];\r
+       } else {\r
+               static char name[24];\r
+               strcpy(name, "Auto:");\r
+               for (u = 0; u < 3; u++) {\r
+                       i = 0; code = ((auto_order >> u*4) & 0xf) << 1;\r
+                       while((code >>= 1)) i++;\r
+                       strcat(name, names_short[i]);\r
+               }\r
+               return name;\r
+       }\r
+}\r
 \r
index 2921c14..0b5aac3 100644 (file)
@@ -99,6 +99,7 @@ typedef struct
        signed char min;        /* for ranged integer settings, to be sign-extended */
        signed char max;
        char enabled;
+       char need_to_save;
 } menu_entry;
 
 
@@ -111,4 +112,5 @@ menu_id me_index2id(const menu_entry *entries, int count, int index);
 void    me_draw(const menu_entry *entries, int count, int x, int y, me_draw_custom_f *cust_draw, void *param);
 int     me_process(menu_entry *entries, int count, menu_id id, int is_next);
 
+const char *me_region_name(unsigned int code, int auto_order);
 
index 152c648..9a28553 100644 (file)
@@ -109,19 +109,8 @@ void emu_Deinit(void)
                SRam.changed = 0;
        }
 
-       if (!(currentConfig.EmuOpt & 0x20)) {
-               FILE *f = fopen(PicoConfigFile, "r+b");
-               if (!f) emu_WriteConfig(0);
-               else {
-                       // if we already have config, reload it, except last ROM
-                       fseek(f, sizeof(currentConfig.lastRomFile), SEEK_SET);
-                       fread(&currentConfig.EmuOpt, 1, sizeof(currentConfig) - sizeof(currentConfig.lastRomFile), f);
-                       fseek(f, 0, SEEK_SET);
-                       fwrite(&currentConfig, 1, sizeof(currentConfig), f);
-                       fflush(f);
-                       fclose(f);
-               }
-       }
+       if (!(currentConfig.EmuOpt & 0x20))
+               config_writelrom(PicoConfigFile);
 
        PicoExit();
 }
index b1d3b14..09520a9 100644 (file)
@@ -1080,29 +1080,6 @@ menu_entry opt_entries[] =
 #define OPT_ENTRY_COUNT (sizeof(opt_entries) / sizeof(opt_entries[0]))\r
 \r
 \r
-static const char *region_name(unsigned int code)\r
-{\r
-       static const char *names[] = { "Auto", "      Japan NTSC", "      Japan PAL", "      USA", "      Europe" };\r
-       static const char *names_short[] = { "", " JP", " JP", " US", " EU" };\r
-       int u, i = 0;\r
-       if (code) {\r
-               code <<= 1;\r
-               while((code >>= 1)) i++;\r
-               if (i > 4) return "unknown";\r
-               return names[i];\r
-       } else {\r
-               static char name[24];\r
-               strcpy(name, "Auto:");\r
-               for (u = 0; u < 3; u++) {\r
-                       i = 0; code = ((PicoAutoRgnOrder >> u*4) & 0xf) << 1;\r
-                       while((code >>= 1)) i++;\r
-                       strcat(name, names_short[i]);\r
-               }\r
-               return name;\r
-       }\r
-}\r
-\r
-\r
 static void menu_opt_cust_draw(const menu_entry *entry, int x, int y, void *param)\r
 {\r
        char *str, str24[24];\r
@@ -1129,7 +1106,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);\r
                        break;\r
                case MA_OPT_REGION:\r
-                       text_out16(x, y, "Region:              %s", region_name(currentConfig.PicoRegion));\r
+                       text_out16(x, y, "Region:              %s", me_region_name(PicoRegionOverride, PicoAutoRgnOrder));\r
                        break;\r
                case MA_OPT_CONFIRM_STATES:\r
                        switch ((currentConfig.EmuOpt >> 9) & 5) {\r
@@ -1188,21 +1165,21 @@ static void region_prevnext(int right)
        static int rgn_orders[] = { 0x148, 0x184, 0x814, 0x418, 0x841, 0x481 };\r
        int i;\r
        if (right) {\r
-               if (!currentConfig.PicoRegion) {\r
+               if (!PicoRegionOverride) {\r
                        for (i = 0; i < 6; i++)\r
                                if (rgn_orders[i] == PicoAutoRgnOrder) break;\r
                        if (i < 5) PicoAutoRgnOrder = rgn_orders[i+1];\r
-                       else currentConfig.PicoRegion=1;\r
+                       else PicoRegionOverride=1;\r
                }\r
-               else currentConfig.PicoRegion<<=1;\r
-               if (currentConfig.PicoRegion > 8) currentConfig.PicoRegion = 8;\r
+               else PicoRegionOverride<<=1;\r
+               if (PicoRegionOverride > 8) PicoRegionOverride = 8;\r
        } else {\r
-               if (!currentConfig.PicoRegion) {\r
+               if (!PicoRegionOverride) {\r
                        for (i = 0; i < 6; i++)\r
                                if (rgn_orders[i] == PicoAutoRgnOrder) break;\r
                        if (i > 0) PicoAutoRgnOrder = rgn_orders[i-1];\r
                }\r
-               else currentConfig.PicoRegion>>=1;\r
+               else PicoRegionOverride>>=1;\r
        }\r
 }\r
 \r
@@ -1210,7 +1187,6 @@ static void menu_options_save(void)
 {\r
        PicoOpt = currentConfig.PicoOpt;\r
        PsndRate = currentConfig.PsndRate;\r
-       PicoRegionOverride = currentConfig.PicoRegion;\r
        if (PicoRegionOverride) {\r
                // force setting possibly changed..\r
                Pico.m.pal = (PicoRegionOverride == 2 || PicoRegionOverride == 8) ? 1 : 0;\r
@@ -1230,7 +1206,6 @@ static int menu_loop_options(void)
 \r
        currentConfig.PicoOpt = PicoOpt;\r
        currentConfig.PsndRate = PsndRate;\r
-       currentConfig.PicoRegion = PicoRegionOverride;\r
 \r
        me_enable(opt_entries, OPT_ENTRY_COUNT, MA_OPT_SAVECFG_GAME, rom_loaded);\r
        me_enable(opt_entries, OPT_ENTRY_COUNT, MA_OPT_LOADCFG, config_slot != config_slot_current);\r
index e456f3e..e96126d 100644 (file)
@@ -58,7 +58,7 @@ OBJS += main.o menu.o gp2x.o usbjoy.o emu.o squidgehack.o cpuctrl.o
 OBJS += 940ctl.o\r
 \r
 # common\r
-OBJS += ../common/emu.o ../common/menu.o ../common/fonts.o ../common/arm_utils.o \\r
+OBJS += ../common/emu.o ../common/menu.o ../common/fonts.o ../common/config.o ../common/arm_utils.o \\r
        ../common/readpng.o ../common/mp3_helix.o\r
 \r
 # Pico\r
index 1fd7665..bd4253d 100644 (file)
@@ -21,6 +21,7 @@
 #include "../common/arm_utils.h"\r
 #include "../common/fonts.h"\r
 #include "../common/emu.h"\r
+#include "../common/config.h"\r
 #include "cpuctrl.h"\r
 \r
 #include <Pico/PicoInt.h>\r
@@ -160,20 +161,10 @@ void emu_Deinit(void)
        }\r
 \r
        if (!(currentConfig.EmuOpt & 0x20)) {\r
-               FILE *f = fopen(PicoConfigFile, "r+b");\r
-               if (!f) emu_WriteConfig(0);\r
-               else {\r
-                       // if we already have config, reload it, except last ROM\r
-                       fseek(f, sizeof(currentConfig.lastRomFile), SEEK_SET);\r
-                       fread(&currentConfig.EmuOpt, 1, sizeof(currentConfig) - sizeof(currentConfig.lastRomFile), f);\r
-                       fseek(f, 0, SEEK_SET);\r
-                       fwrite(&currentConfig, 1, sizeof(currentConfig), f);\r
-                       fflush(f);\r
-                       fclose(f);\r
+               config_writelrom(PicoConfigFile);\r
 #ifndef NO_SYNC\r
-                       sync();\r
+               sync();\r
 #endif\r
-               }\r
        }\r
 \r
        free(PicoDraw2FB);\r
@@ -185,34 +176,44 @@ void emu_Deinit(void)
                set_gamma(100, 0);\r
 }\r
 \r
+void emu_prepareDefaultConfig(void)\r
+{\r
+       memset(&defaultConfig, 0, sizeof(defaultConfig));\r
+       defaultConfig.lastRomFile[0] = 0;\r
+       defaultConfig.EmuOpt  = 0x1f | 0x600; // | confirm_save, cd_leds\r
+       defaultConfig.s_PicoOpt = 0x0f | 0xe00; // | use_940, cd_pcm, cd_cdda\r
+       defaultConfig.s_PsndRate = 44100;\r
+       defaultConfig.s_PicoRegion = 0; // auto\r
+       defaultConfig.s_PicoAutoRgnOrder = 0x184; // US, EU, JP\r
+       defaultConfig.s_PicoCDBuffers = 64;\r
+       defaultConfig.Frameskip = -1; // auto\r
+       defaultConfig.CPUclock = 200;\r
+       defaultConfig.volume = 50;\r
+       defaultConfig.KeyBinds[ 0] = 1<<0; // SACB RLDU\r
+       defaultConfig.KeyBinds[ 4] = 1<<1;\r
+       defaultConfig.KeyBinds[ 2] = 1<<2;\r
+       defaultConfig.KeyBinds[ 6] = 1<<3;\r
+       defaultConfig.KeyBinds[14] = 1<<4;\r
+       defaultConfig.KeyBinds[13] = 1<<5;\r
+       defaultConfig.KeyBinds[12] = 1<<6;\r
+       defaultConfig.KeyBinds[ 8] = 1<<7;\r
+       defaultConfig.KeyBinds[15] = 1<<26; // switch rend\r
+       defaultConfig.KeyBinds[10] = 1<<27; // save state\r
+       defaultConfig.KeyBinds[11] = 1<<28; // load state\r
+       defaultConfig.KeyBinds[23] = 1<<29; // vol up\r
+       defaultConfig.KeyBinds[22] = 1<<30; // vol down\r
+       defaultConfig.gamma = 100;\r
+       defaultConfig.scaling = 0;\r
+}\r
+\r
 void emu_setDefaultConfig(void)\r
 {\r
-       memset(&currentConfig, 0, sizeof(currentConfig));\r
-       currentConfig.lastRomFile[0] = 0;\r
-       currentConfig.EmuOpt  = 0x1f | 0x600; // | confirm_save, cd_leds\r
-       currentConfig.PicoOpt = 0x0f | 0xe00; // | use_940, cd_pcm, cd_cdda\r
-       currentConfig.PsndRate = 22050; // 44100;\r
-       currentConfig.PicoRegion = 0; // auto\r
-       currentConfig.PicoAutoRgnOrder = 0x184; // US, EU, JP\r
-       currentConfig.Frameskip = -1; // auto\r
-       currentConfig.CPUclock = 200;\r
-       currentConfig.volume = 50;\r
-       currentConfig.KeyBinds[ 0] = 1<<0; // SACB RLDU\r
-       currentConfig.KeyBinds[ 4] = 1<<1;\r
-       currentConfig.KeyBinds[ 2] = 1<<2;\r
-       currentConfig.KeyBinds[ 6] = 1<<3;\r
-       currentConfig.KeyBinds[14] = 1<<4;\r
-       currentConfig.KeyBinds[13] = 1<<5;\r
-       currentConfig.KeyBinds[12] = 1<<6;\r
-       currentConfig.KeyBinds[ 8] = 1<<7;\r
-       currentConfig.KeyBinds[15] = 1<<26; // switch rend\r
-       currentConfig.KeyBinds[10] = 1<<27; // save state\r
-       currentConfig.KeyBinds[11] = 1<<28; // load state\r
-       currentConfig.KeyBinds[23] = 1<<29; // vol up\r
-       currentConfig.KeyBinds[22] = 1<<30; // vol down\r
-       currentConfig.gamma = 100;\r
-       currentConfig.PicoCDBuffers = 64;\r
-       currentConfig.scaling = 0;\r
+       memcpy(&currentConfig, &defaultConfig, sizeof(currentConfig));\r
+       PicoOpt = currentConfig.s_PicoOpt;\r
+       PsndRate = currentConfig.s_PsndRate;\r
+       PicoRegionOverride = currentConfig.s_PicoRegion;\r
+       PicoAutoRgnOrder = currentConfig.s_PicoAutoRgnOrder;\r
+       PicoCDBuffers = currentConfig.s_PicoCDBuffers;\r
 }\r
 \r
 void osd_text(int x, int y, const char *text)\r
index 95e0e9f..3728685 100644 (file)
@@ -13,6 +13,7 @@
 #include "menu.h"\r
 #include "../common/menu.h"\r
 #include "../common/emu.h"\r
+#include "../common/config.h"\r
 #include "emu.h"\r
 #include "940ctl.h"\r
 #include "version.h"\r
@@ -81,7 +82,9 @@ int main(int argc, char *argv[])
 {\r
        g_argv = argv;\r
 \r
+       emu_prepareDefaultConfig();\r
        emu_ReadConfig(0, 0);\r
+\r
        gp2x_init();\r
        if (currentConfig.EmuOpt&0x10) {\r
                int ret = mmuhack();\r
index 5ff8ac0..b3c1d75 100644 (file)
@@ -846,7 +846,7 @@ static void kc_sel_loop(void)
 {\r
        int menu_sel = 3, menu_sel_max = 3;\r
        unsigned long inp = 0;\r
-       int is_6button = currentConfig.PicoOpt & 0x020;\r
+       int is_6button = PicoOpt & 0x020;\r
 \r
        while (1)\r
        {\r
@@ -873,19 +873,20 @@ static void kc_sel_loop(void)
 \r
 menu_entry cdopt_entries[] =\r
 {\r
-       { NULL,                        MB_NONE,  MA_CDOPT_TESTBIOS_USA, NULL, 0, 0, 0, 1 },\r
-       { NULL,                        MB_NONE,  MA_CDOPT_TESTBIOS_EUR, NULL, 0, 0, 0, 1 },\r
-       { NULL,                        MB_NONE,  MA_CDOPT_TESTBIOS_JAP, NULL, 0, 0, 0, 1 },\r
-       { "CD LEDs",                   MB_ONOFF, MA_CDOPT_LEDS,         &currentConfig.EmuOpt,  0x0400, 0, 0, 1 },\r
-       { "CDDA audio (using mp3s)",   MB_ONOFF, MA_CDOPT_CDDA,         &currentConfig.PicoOpt, 0x0800, 0, 0, 1 },\r
-       { "PCM audio",                 MB_ONOFF, MA_CDOPT_PCM,          &currentConfig.PicoOpt, 0x0400, 0, 0, 1 },\r
-       { NULL,                        MB_NONE,  MA_CDOPT_READAHEAD,    NULL, 0, 0, 0, 1 },\r
-       { "SaveRAM cart",              MB_ONOFF, MA_CDOPT_SAVERAM,      &currentConfig.PicoOpt, 0x8000, 0, 0, 1 },\r
-       { "Scale/Rot. fx (slow)",      MB_ONOFF, MA_CDOPT_SCALEROT_CHIP,&currentConfig.PicoOpt, 0x1000, 0, 0, 1 },\r
-       { "Better sync (slow)",        MB_ONOFF, MA_CDOPT_BETTER_SYNC,  &currentConfig.PicoOpt, 0x2000, 0, 0, 1 },\r
-       { "done",                      MB_NONE,  MA_CDOPT_DONE,         NULL, 0, 0, 0, 1 },\r
+       { NULL,                        MB_NONE,  MA_CDOPT_TESTBIOS_USA, NULL, 0, 0, 0, 1, 0 },\r
+       { NULL,                        MB_NONE,  MA_CDOPT_TESTBIOS_EUR, NULL, 0, 0, 0, 1, 0 },\r
+       { NULL,                        MB_NONE,  MA_CDOPT_TESTBIOS_JAP, NULL, 0, 0, 0, 1, 0 },\r
+       { "CD LEDs",                   MB_ONOFF, MA_CDOPT_LEDS,         &currentConfig.EmuOpt, 0x0400, 0, 0, 1, 1 },\r
+       { "CDDA audio (using mp3s)",   MB_ONOFF, MA_CDOPT_CDDA,         &PicoOpt, 0x0800, 0, 0, 1, 1 },\r
+       { "PCM audio",                 MB_ONOFF, MA_CDOPT_PCM,          &PicoOpt, 0x0400, 0, 0, 1, 1 },\r
+       { NULL,                        MB_NONE,  MA_CDOPT_READAHEAD,    NULL, 0, 0, 0, 1, 1 },\r
+       { "SaveRAM cart",              MB_ONOFF, MA_CDOPT_SAVERAM,      &PicoOpt, 0x8000, 0, 0, 1, 1 },\r
+       { "Scale/Rot. fx (slow)",      MB_ONOFF, MA_CDOPT_SCALEROT_CHIP,&PicoOpt, 0x1000, 0, 0, 1, 1 },\r
+       { "Better sync (slow)",        MB_ONOFF, MA_CDOPT_BETTER_SYNC,  &PicoOpt, 0x2000, 0, 0, 1, 1 },\r
+       { "done",                      MB_NONE,  MA_CDOPT_DONE,         NULL, 0, 0, 0, 1, 0 },\r
 };\r
 \r
+const int cdopt_entry_count = (sizeof(cdopt_entries) / sizeof(cdopt_entries[0]));\r
 #define CDOPT_ENTRY_COUNT (sizeof(cdopt_entries) / sizeof(cdopt_entries[0]))\r
 \r
 \r
@@ -1023,28 +1024,29 @@ static void cd_menu_loop_options(void)
 \r
 menu_entry opt2_entries[] =\r
 {\r
-       { NULL,                        MB_NONE,  MA_OPT2_GAMMA,         NULL, 0, 0, 0, 1 },\r
-       { "A_SN's gamma curve",        MB_ONOFF, MA_OPT2_A_SN_GAMMA,    &currentConfig.EmuOpt, 0x1000, 0, 0, 1 },\r
-       { "Perfect vsync",             MB_ONOFF, MA_OPT2_VSYNC,         &currentConfig.EmuOpt, 0x2000, 0, 0, 1 },\r
-       { "Emulate Z80",               MB_ONOFF, MA_OPT2_ENABLE_Z80,    &currentConfig.PicoOpt,0x0004, 0, 0, 1 },\r
-       { "Emulate YM2612 (FM)",       MB_ONOFF, MA_OPT2_ENABLE_YM2612, &currentConfig.PicoOpt,0x0001, 0, 0, 1 },\r
-       { "Emulate SN76496 (PSG)",     MB_ONOFF, MA_OPT2_ENABLE_SN76496,&currentConfig.PicoOpt,0x0002, 0, 0, 1 },\r
-       { "gzip savestates",           MB_ONOFF, MA_OPT2_GZIP_STATES,   &currentConfig.EmuOpt, 0x0008, 0, 0, 1 },\r
-       { "Don't save last used ROM",  MB_ONOFF, MA_OPT2_NO_LAST_ROM,   &currentConfig.EmuOpt, 0x0020, 0, 0, 1 },\r
-       { "needs restart:",            MB_NONE,  MA_NONE,               NULL, 0, 0, 0, 1 },\r
-       { "craigix's RAM timings",     MB_ONOFF, MA_OPT2_RAMTIMINGS,    &currentConfig.EmuOpt, 0x0100, 0, 0, 1 },\r
-       { NULL,                        MB_ONOFF, MA_OPT2_SQUIDGEHACK,   &currentConfig.EmuOpt, 0x0010, 0, 0, 1 },\r
-       { "done",                      MB_NONE,  MA_OPT2_DONE,          NULL, 0, 0, 0, 1 },\r
+       { NULL,                        MB_NONE,  MA_OPT2_GAMMA,         NULL, 0, 0, 0, 1, 1 },\r
+       { "A_SN's gamma curve",        MB_ONOFF, MA_OPT2_A_SN_GAMMA,    &currentConfig.EmuOpt, 0x1000, 0, 0, 1, 1 },\r
+       { "Perfect vsync",             MB_ONOFF, MA_OPT2_VSYNC,         &currentConfig.EmuOpt, 0x2000, 0, 0, 1, 1 },\r
+       { "Emulate Z80",               MB_ONOFF, MA_OPT2_ENABLE_Z80,    &PicoOpt, 0x0004, 0, 0, 1, 1 },\r
+       { "Emulate YM2612 (FM)",       MB_ONOFF, MA_OPT2_ENABLE_YM2612, &PicoOpt, 0x0001, 0, 0, 1, 1 },\r
+       { "Emulate SN76496 (PSG)",     MB_ONOFF, MA_OPT2_ENABLE_SN76496,&PicoOpt, 0x0002, 0, 0, 1, 1 },\r
+       { "gzip savestates",           MB_ONOFF, MA_OPT2_GZIP_STATES,   &currentConfig.EmuOpt, 0x0008, 0, 0, 1, 1 },\r
+       { "Don't save last used ROM",  MB_ONOFF, MA_OPT2_NO_LAST_ROM,   &currentConfig.EmuOpt, 0x0020, 0, 0, 1, 1 },\r
+       { "needs restart:",            MB_NONE,  MA_NONE,               NULL, 0, 0, 0, 1, 0 },\r
+       { "craigix's RAM timings",     MB_ONOFF, MA_OPT2_RAMTIMINGS,    &currentConfig.EmuOpt, 0x0100, 0, 0, 1, 1 },\r
+       { NULL,                        MB_ONOFF, MA_OPT2_SQUIDGEHACK,   &currentConfig.EmuOpt, 0x0010, 0, 0, 1, 1 },\r
+       { "done",                      MB_NONE,  MA_OPT2_DONE,          NULL, 0, 0, 0, 1, 0 },\r
 };\r
 \r
 #define OPT2_ENTRY_COUNT (sizeof(opt2_entries) / sizeof(opt2_entries[0]))\r
+const int opt2_entry_count = (sizeof(opt2_entries) / sizeof(opt2_entries[0]));\r
 \r
 static void menu_opt2_cust_draw(const menu_entry *entry, int x, int y, void *param)\r
 {\r
        if (entry->id == MA_OPT2_GAMMA)\r
                text_out16(x, y, "Gamma correction           %i.%02i", currentConfig.gamma / 100, currentConfig.gamma%100);\r
        else if (entry->id == MA_OPT2_SQUIDGEHACK)\r
-               text_out16(x, y, "squidgehack (now %s %s", mmuhack_status ? "active)  " : "inactive)",\r
+               text_out16(x, y, "Squidgehack (now %s %s", mmuhack_status ? "active)  " : "inactive)",\r
                        (currentConfig.EmuOpt&0x0010)?"ON":"OFF");\r
 }\r
 \r
@@ -1105,52 +1107,30 @@ static void amenu_loop_options(void)
 \r
 menu_entry opt_entries[] =\r
 {\r
-       { NULL,                        MB_NONE,  MA_OPT_RENDERER,      NULL, 0, 0, 0, 1 },\r
-       { NULL,                        MB_RANGE, MA_OPT_SCALING,       &currentConfig.scaling, 0, 0, 3, 1 },\r
-       { "Accurate timing (slower)",  MB_ONOFF, MA_OPT_ACC_TIMING,    &currentConfig.PicoOpt, 0x040, 0, 0, 1 },\r
-       { "Accurate sprites (slower)", MB_ONOFF, MA_OPT_ACC_SPRITES,   &currentConfig.PicoOpt, 0x080, 0, 0, 1 },\r
-       { "Show FPS",                  MB_ONOFF, MA_OPT_SHOW_FPS,      &currentConfig.EmuOpt,  0x002, 0, 0, 1 },\r
-       { NULL,                        MB_RANGE, MA_OPT_FRAMESKIP,     &currentConfig.Frameskip, 0, -1, 16, 1 },\r
-       { "Enable sound",              MB_ONOFF, MA_OPT_ENABLE_SOUND,  &currentConfig.EmuOpt,  0x004, 0, 0, 1 },\r
-       { NULL,                        MB_NONE,  MA_OPT_SOUND_QUALITY, NULL, 0, 0, 0, 1 },\r
-       { "Use ARM940 core for sound", MB_ONOFF, MA_OPT_ARM940_SOUND,  &currentConfig.PicoOpt, 0x200, 0, 0, 1 },\r
-       { "6 button pad",              MB_ONOFF, MA_OPT_6BUTTON_PAD,   &currentConfig.PicoOpt, 0x020, 0, 0, 1 },\r
-       { NULL,                        MB_NONE,  MA_OPT_REGION,        NULL, 0, 0, 0, 1 },\r
-       { "Use SRAM/BRAM savestates",  MB_ONOFF, MA_OPT_SRAM_STATES,   &currentConfig.EmuOpt,  0x001, 0, 0, 1 },\r
-       { NULL,                        MB_NONE,  MA_OPT_CONFIRM_STATES,NULL, 0, 0, 0, 1 },\r
-       { "Save slot",                 MB_RANGE, MA_OPT_SAVE_SLOT,     &state_slot, 0, 0, 9, 1 },\r
-       { NULL,                        MB_NONE,  MA_OPT_CPU_CLOCKS,    NULL, 0, 0, 0, 1 },\r
-       { "[Sega/Mega CD options]",    MB_NONE,  MA_OPT_SCD_OPTS,      NULL, 0, 0, 0, 1 },\r
-       { "[advanced options]",        MB_NONE,  MA_OPT_ADV_OPTS,      NULL, 0, 0, 0, 1 },\r
-       { NULL,                        MB_NONE,  MA_OPT_SAVECFG,       NULL, 0, 0, 0, 1 },\r
-       { "Save cfg for current game only",MB_NONE,MA_OPT_SAVECFG_GAME,NULL, 0, 0, 0, 1 },\r
-       { NULL,                        MB_NONE,  MA_OPT_LOADCFG,       NULL, 0, 0, 0, 1 },\r
+       { NULL,                        MB_NONE,  MA_OPT_RENDERER,      NULL, 0, 0, 0, 1, 1 },\r
+       { NULL,                        MB_RANGE, MA_OPT_SCALING,       &currentConfig.scaling, 0, 0, 3, 1, 1 },\r
+       { "Accurate timing (slower)",  MB_ONOFF, MA_OPT_ACC_TIMING,    &PicoOpt, 0x040, 0, 0, 1, 1 },\r
+       { "Accurate sprites (slower)", MB_ONOFF, MA_OPT_ACC_SPRITES,   &PicoOpt, 0x080, 0, 0, 1, 1 },\r
+       { "Show FPS",                  MB_ONOFF, MA_OPT_SHOW_FPS,      &currentConfig.EmuOpt,  0x002, 0, 0, 1, 1 },\r
+       { NULL,                        MB_RANGE, MA_OPT_FRAMESKIP,     &currentConfig.Frameskip, 0, -1, 16, 1, 1 },\r
+       { "Enable sound",              MB_ONOFF, MA_OPT_ENABLE_SOUND,  &currentConfig.EmuOpt,  0x004, 0, 0, 1, 1 },\r
+       { NULL,                        MB_NONE,  MA_OPT_SOUND_QUALITY, NULL, 0, 0, 0, 1, 1 },\r
+       { "Use ARM940 core for sound", MB_ONOFF, MA_OPT_ARM940_SOUND,  &PicoOpt, 0x200, 0, 0, 1, 1 },\r
+       { "6 button pad",              MB_ONOFF, MA_OPT_6BUTTON_PAD,   &PicoOpt, 0x020, 0, 0, 1, 1 },\r
+       { NULL,                        MB_NONE,  MA_OPT_REGION,        NULL, 0, 0, 0, 1, 1 },\r
+       { "Use SRAM/BRAM savestates",  MB_ONOFF, MA_OPT_SRAM_STATES,   &currentConfig.EmuOpt,  0x001, 0, 0, 1, 1 },\r
+       { NULL,                        MB_NONE,  MA_OPT_CONFIRM_STATES,NULL, 0, 0, 0, 1, 1 },\r
+       { "Save slot",                 MB_RANGE, MA_OPT_SAVE_SLOT,     &state_slot, 0, 0, 9, 1, 1 },\r
+       { NULL,                        MB_NONE,  MA_OPT_CPU_CLOCKS,    NULL, 0, 0, 0, 1, 1 },\r
+       { "[Sega/Mega CD options]",    MB_NONE,  MA_OPT_SCD_OPTS,      NULL, 0, 0, 0, 1, 0 },\r
+       { "[advanced options]",        MB_NONE,  MA_OPT_ADV_OPTS,      NULL, 0, 0, 0, 1, 0 },\r
+       { NULL,                        MB_NONE,  MA_OPT_SAVECFG,       NULL, 0, 0, 0, 1, 0 },\r
+       { "Save cfg for current game only",MB_NONE,MA_OPT_SAVECFG_GAME,NULL, 0, 0, 0, 1, 0 },\r
+       { NULL,                        MB_NONE,  MA_OPT_LOADCFG,       NULL, 0, 0, 0, 1, 0 },\r
 };\r
 \r
 #define OPT_ENTRY_COUNT (sizeof(opt_entries) / sizeof(opt_entries[0]))\r
-\r
-\r
-static const char *region_name(unsigned int code)\r
-{\r
-       static const char *names[] = { "Auto", "      Japan NTSC", "      Japan PAL", "      USA", "      Europe" };\r
-       static const char *names_short[] = { "", " JP", " JP", " US", " EU" };\r
-       int u, i = 0;\r
-       if (code) {\r
-               code <<= 1;\r
-               while((code >>= 1)) i++;\r
-               if (i > 4) return "unknown";\r
-               return names[i];\r
-       } else {\r
-               static char name[24];\r
-               strcpy(name, "Auto:");\r
-               for (u = 0; u < 3; u++) {\r
-                       i = 0; code = ((PicoAutoRgnOrder >> u*4) & 0xf) << 1;\r
-                       while((code >>= 1)) i++;\r
-                       strcat(name, names_short[i]);\r
-               }\r
-               return name;\r
-       }\r
-}\r
+const int opt_entry_count = OPT_ENTRY_COUNT;\r
 \r
 \r
 static void menu_opt_cust_draw(const menu_entry *entry, int x, int y, void *param)\r
@@ -1160,7 +1140,7 @@ static void menu_opt_cust_draw(const menu_entry *entry, int x, int y, void *para
        switch (entry->id)\r
        {\r
                case MA_OPT_RENDERER:\r
-                       if (currentConfig.PicoOpt&0x10)\r
+                       if (PicoOpt&0x10)\r
                                str = " 8bit fast";\r
                        else if (currentConfig.EmuOpt&0x80)\r
                                str = "16bit accurate";\r
@@ -1184,11 +1164,11 @@ static void menu_opt_cust_draw(const menu_entry *entry, int x, int y, void *para
                        text_out16(x, y, "Frameskip                  %s", str24);\r
                        break;\r
                case MA_OPT_SOUND_QUALITY:\r
-                       str = (currentConfig.PicoOpt&0x08)?"stereo":"mono";\r
-                       text_out16(x, y, "Sound Quality:     %5iHz %s", currentConfig.PsndRate, str);\r
+                       str = (PicoOpt&0x08)?"stereo":"mono";\r
+                       text_out16(x, y, "Sound Quality:     %5iHz %s", PsndRate, str);\r
                        break;\r
                case MA_OPT_REGION:\r
-                       text_out16(x, y, "Region:              %s", region_name(currentConfig.PicoRegion));\r
+                       text_out16(x, y, "Region:              %s", me_region_name(PicoRegionOverride, PicoAutoRgnOrder));\r
                        break;\r
                case MA_OPT_CONFIRM_STATES:\r
                        switch ((currentConfig.EmuOpt >> 9) & 5) {\r
@@ -1250,29 +1230,26 @@ static void region_prevnext(int right)
        static int rgn_orders[] = { 0x148, 0x184, 0x814, 0x418, 0x841, 0x481 };\r
        int i;\r
        if (right) {\r
-               if (!currentConfig.PicoRegion) {\r
+               if (!PicoRegionOverride) {\r
                        for (i = 0; i < 6; i++)\r
                                if (rgn_orders[i] == PicoAutoRgnOrder) break;\r
                        if (i < 5) PicoAutoRgnOrder = rgn_orders[i+1];\r
-                       else currentConfig.PicoRegion=1;\r
+                       else PicoRegionOverride=1;\r
                }\r
-               else currentConfig.PicoRegion<<=1;\r
-               if (currentConfig.PicoRegion > 8) currentConfig.PicoRegion = 8;\r
+               else PicoRegionOverride<<=1;\r
+               if (PicoRegionOverride > 8) PicoRegionOverride = 8;\r
        } else {\r
-               if (!currentConfig.PicoRegion) {\r
+               if (!PicoRegionOverride) {\r
                        for (i = 0; i < 6; i++)\r
                                if (rgn_orders[i] == PicoAutoRgnOrder) break;\r
                        if (i > 0) PicoAutoRgnOrder = rgn_orders[i-1];\r
                }\r
-               else currentConfig.PicoRegion>>=1;\r
+               else PicoRegionOverride>>=1;\r
        }\r
 }\r
 \r
 static void menu_options_save(void)\r
 {\r
-       PicoOpt = currentConfig.PicoOpt;\r
-       PsndRate = currentConfig.PsndRate;\r
-       PicoRegionOverride = currentConfig.PicoRegion;\r
        if (PicoRegionOverride) {\r
                // force setting possibly changed..\r
                Pico.m.pal = (PicoRegionOverride == 2 || PicoRegionOverride == 8) ? 1 : 0;\r
@@ -1290,10 +1267,6 @@ static int menu_loop_options(void)
        unsigned long inp = 0;\r
        menu_id selected_id;\r
 \r
-       currentConfig.PicoOpt = PicoOpt;\r
-       currentConfig.PsndRate = PsndRate;\r
-       currentConfig.PicoRegion = PicoRegionOverride;\r
-\r
        me_enable(opt_entries, OPT_ENTRY_COUNT, MA_OPT_SAVECFG_GAME, rom_loaded);\r
        me_enable(opt_entries, OPT_ENTRY_COUNT, MA_OPT_LOADCFG, config_slot != config_slot_current);\r
        menu_sel_max = me_count_enabled(opt_entries, OPT_ENTRY_COUNT) - 1;\r
@@ -1306,26 +1279,26 @@ static int menu_loop_options(void)
                if (inp & GP2X_UP  ) { menu_sel--; if (menu_sel < 0) menu_sel = menu_sel_max; }\r
                if (inp & GP2X_DOWN) { menu_sel++; if (menu_sel > menu_sel_max) menu_sel = 0; }\r
                selected_id = me_index2id(opt_entries, OPT_ENTRY_COUNT, menu_sel);\r
-               if (inp & (GP2X_LEFT|GP2X_RIGHT)) { // multi choise\r
+               if (inp & (GP2X_LEFT|GP2X_RIGHT)) { // multi choice\r
                        if (!me_process(opt_entries, OPT_ENTRY_COUNT, selected_id, (inp&GP2X_RIGHT) ? 1 : 0)) {\r
                                switch (selected_id) {\r
                                        case MA_OPT_RENDERER:\r
                                                if (inp & GP2X_LEFT) {\r
-                                                       if      (  currentConfig.PicoOpt&0x10) currentConfig.PicoOpt&= ~0x10;\r
+                                                       if      (PicoOpt&0x10) PicoOpt&= ~0x10;\r
                                                        else if (!(currentConfig.EmuOpt &0x80))currentConfig.EmuOpt |=  0x80;\r
                                                        else if (  currentConfig.EmuOpt &0x80) break;\r
                                                } else {\r
-                                                       if      (  currentConfig.PicoOpt&0x10) break;\r
-                                                       else if (!(currentConfig.EmuOpt &0x80))currentConfig.PicoOpt|=  0x10;\r
+                                                       if      (PicoOpt&0x10) break;\r
+                                                       else if (!(currentConfig.EmuOpt &0x80))PicoOpt|=  0x10;\r
                                                        else if (  currentConfig.EmuOpt &0x80) currentConfig.EmuOpt &= ~0x80;\r
                                                }\r
                                                break;\r
                                        case MA_OPT_SOUND_QUALITY:\r
-                                               if ((inp & GP2X_RIGHT) && currentConfig.PsndRate == 44100 && !(currentConfig.PicoOpt&0x08)) {\r
-                                                       currentConfig.PsndRate = 8000;  currentConfig.PicoOpt|= 0x08;\r
-                                               } else if ((inp & GP2X_LEFT) && currentConfig.PsndRate == 8000 && (currentConfig.PicoOpt&0x08)) {\r
-                                                       currentConfig.PsndRate = 44100; currentConfig.PicoOpt&=~0x08;\r
-                                               } else currentConfig.PsndRate = sndrate_prevnext(currentConfig.PsndRate, inp & GP2X_RIGHT);\r
+                                               if ((inp & GP2X_RIGHT) && PsndRate == 44100 && !(PicoOpt&0x08)) {\r
+                                                       PsndRate = 8000; PicoOpt|= 0x08;\r
+                                               } else if ((inp & GP2X_LEFT) && PsndRate == 8000 && (PicoOpt&0x08)) {\r
+                                                       PsndRate = 44100; PicoOpt&=~0x08;\r
+                                               } else  PsndRate = sndrate_prevnext(PsndRate, inp & GP2X_RIGHT);\r
                                                break;\r
                                        case MA_OPT_REGION:\r
                                                region_prevnext(inp & GP2X_RIGHT);\r
@@ -1444,16 +1417,16 @@ static void draw_menu_credits(void)
 \r
 menu_entry main_entries[] =\r
 {\r
-       { "Resume game",        MB_NONE, MA_MAIN_RESUME_GAME, NULL, 0, 0, 0, 0 },\r
-       { "Save State",         MB_NONE, MA_MAIN_SAVE_STATE,  NULL, 0, 0, 0, 0 },\r
-       { "Load State",         MB_NONE, MA_MAIN_LOAD_STATE,  NULL, 0, 0, 0, 0 },\r
-       { "Reset game",         MB_NONE, MA_MAIN_RESET_GAME,  NULL, 0, 0, 0, 0 },\r
-       { "Load new ROM/ISO",   MB_NONE, MA_MAIN_LOAD_ROM,    NULL, 0, 0, 0, 1 },\r
-       { "Change options",     MB_NONE, MA_MAIN_OPTIONS,     NULL, 0, 0, 0, 1 },\r
-       { "Configure controls", MB_NONE, MA_MAIN_CONTROLS,    NULL, 0, 0, 0, 1 },\r
-       { "Credits",            MB_NONE, MA_MAIN_CREDITS,     NULL, 0, 0, 0, 1 },\r
-       { "Patches / GameGenie",MB_NONE, MA_MAIN_PATCHES,     NULL, 0, 0, 0, 0 },\r
-       { "Exit",               MB_NONE, MA_MAIN_EXIT,        NULL, 0, 0, 0, 1 }\r
+       { "Resume game",        MB_NONE, MA_MAIN_RESUME_GAME, NULL, 0, 0, 0, 0, 0 },\r
+       { "Save State",         MB_NONE, MA_MAIN_SAVE_STATE,  NULL, 0, 0, 0, 0, 0 },\r
+       { "Load State",         MB_NONE, MA_MAIN_LOAD_STATE,  NULL, 0, 0, 0, 0, 0 },\r
+       { "Reset game",         MB_NONE, MA_MAIN_RESET_GAME,  NULL, 0, 0, 0, 0, 0 },\r
+       { "Load new ROM/ISO",   MB_NONE, MA_MAIN_LOAD_ROM,    NULL, 0, 0, 0, 1, 0 },\r
+       { "Change options",     MB_NONE, MA_MAIN_OPTIONS,     NULL, 0, 0, 0, 1, 0 },\r
+       { "Configure controls", MB_NONE, MA_MAIN_CONTROLS,    NULL, 0, 0, 0, 1, 0 },\r
+       { "Credits",            MB_NONE, MA_MAIN_CREDITS,     NULL, 0, 0, 0, 1, 0 },\r
+       { "Patches / GameGenie",MB_NONE, MA_MAIN_PATCHES,     NULL, 0, 0, 0, 0, 0 },\r
+       { "Exit",               MB_NONE, MA_MAIN_EXIT,        NULL, 0, 0, 0, 1, 0 }\r
 };\r
 \r
 #define MAIN_ENTRY_COUNT (sizeof(main_entries) / sizeof(main_entries[0]))\r
index 19e8823..5e7d9ff 100644 (file)
@@ -31,7 +31,7 @@ OBJS += platform/gp2x/main.o platform/gp2x/menu.o platform/gp2x/emu.o platform/g
                gp2x.o 940ctl_ym2612.o log_io.o
 
 # common
-OBJS += platform/common/emu.o platform/common/menu.o platform/common/fonts.o \
+OBJS += platform/common/emu.o platform/common/menu.o platform/common/config.o platform/common/fonts.o \
                platform/common/readpng.o platform/common/mp3_helix.o
 
 # Pico
index a5e6ba7..4af44b9 100644 (file)
@@ -111,19 +111,8 @@ void emu_Deinit(void)
                SRam.changed = 0;
        }
 
-       if (!(currentConfig.EmuOpt & 0x20)) {
-               FILE *f = fopen(PicoConfigFile, "r+b");
-               if (!f) emu_WriteConfig(0);
-               else {
-                       // if we already have config, reload it, except last ROM
-                       fseek(f, sizeof(currentConfig.lastRomFile), SEEK_SET);
-                       fread(&currentConfig.EmuOpt, 1, sizeof(currentConfig) - sizeof(currentConfig.lastRomFile), f);
-                       fseek(f, 0, SEEK_SET);
-                       fwrite(&currentConfig, 1, sizeof(currentConfig), f);
-                       fflush(f);
-                       fclose(f);
-               }
-       }
+       if (!(currentConfig.EmuOpt & 0x20))
+               config_writelrom(PicoConfigFile);
 
        PicoExit();
        sound_deinit();
index c2df05f..15c01c9 100644 (file)
@@ -1261,29 +1261,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 +1287,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 +1348,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 +1370,6 @@ 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;
@@ -1413,7 +1389,6 @@ 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_loaded);
        me_enable(opt_entries, OPT_ENTRY_COUNT, MA_OPT_LOADCFG, config_slot != config_slot_current);