new cfg file system
[libpicofe.git] / common / emu.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