bugfixes, refactoring
[picodrive.git] / platform / gp2x / emu.c
index 1fd7665..0375a7f 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
@@ -47,7 +48,6 @@ extern int crashed_940;
 static short __attribute__((aligned(4))) sndBuffer[2*44100/50];\r
 static struct timeval noticeMsgTime = { 0, 0 };        // when started showing\r
 static int osd_fps_x;\r
-static int combo_keys = 0, combo_acts = 0;     // keys and actions which need button combos\r
 static int gp2x_old_gamma = 100;\r
 char noticeMsg[64];                    // notice msg to draw\r
 unsigned char *PicoDraw2FB = NULL;  // temporary buffer for alt renderer\r
@@ -97,48 +97,6 @@ void emu_Init(void)
 }\r
 \r
 \r
-static void find_combos(void)\r
-{\r
-       int act, u;\r
-\r
-       // find out which keys and actions are combos\r
-       combo_keys = combo_acts = 0;\r
-       for (act = 0; act < 32; act++)\r
-       {\r
-               int keyc = 0, keyc2 = 0;\r
-               if (act == 16 || act == 17) continue; // player2 flag\r
-               if (act > 17)\r
-               {\r
-                       for (u = 0; u < 32; u++)\r
-                               if (currentConfig.KeyBinds[u] & (1 << act)) keyc++;\r
-               }\r
-               else\r
-               {\r
-                       for (u = 0; u < 32; u++)\r
-                               if ((currentConfig.KeyBinds[u] & 0x30000) == 0 && // pl. 1\r
-                                       (currentConfig.KeyBinds[u] & (1 << act))) keyc++;\r
-                       for (u = 0; u < 32; u++)\r
-                               if ((currentConfig.KeyBinds[u] & 0x30000) == 1 && // pl. 2\r
-                                       (currentConfig.KeyBinds[u] & (1 << act))) keyc2++;\r
-                       if (keyc2 > keyc) keyc = keyc2;\r
-               }\r
-               if (keyc > 1)\r
-               {\r
-                       // loop again and mark those keys and actions as combo\r
-                       for (u = 0; u < 32; u++)\r
-                       {\r
-                               if (currentConfig.KeyBinds[u] & (1 << act)) {\r
-                                       combo_keys |= 1 << u;\r
-                                       combo_acts |= 1 << act;\r
-                               }\r
-                       }\r
-               }\r
-       }\r
-\r
-       // printf("combo keys/acts: %08x %08x\n", combo_keys, combo_acts);\r
-}\r
-\r
-\r
 static void scaling_update(void)\r
 {\r
        PicoOpt &= ~0x4100;\r
@@ -160,20 +118,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 +133,43 @@ void emu_Deinit(void)
                set_gamma(100, 0);\r
 }\r
 \r
+void emu_prepareDefaultConfig(void)\r
+{\r
+       memset(&defaultConfig, 0, sizeof(defaultConfig));\r
+       defaultConfig.EmuOpt    = 0x1d | 0x00700; // | <- ram_tmng, confirm_save, cd_leds\r
+       defaultConfig.s_PicoOpt = 0x0f | 0x20e00; // | <- use_940, cd_pcm, cd_cdda, svp drc\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
@@ -577,23 +534,26 @@ static void updateKeys(void)
 \r
        for (i = 0; i < 32; i++)\r
        {\r
-               if (keys & (1 << i)) {\r
+               if (keys & (1 << i))\r
+               {\r
                        int pl, acts = currentConfig.KeyBinds[i];\r
                        if (!acts) continue;\r
                        pl = (acts >> 16) & 1;\r
-                       if (combo_keys & (1 << i)) {\r
-                               int u = i+1, acts_c = acts & combo_acts;\r
+                       if (kb_combo_keys & (1 << i))\r
+                       {\r
+                               int u, acts_c = acts & kb_combo_acts;\r
                                // let's try to find the other one\r
-                               if (acts_c)\r
-                                       for (; u < 32; u++)\r
-                                               if ( (currentConfig.KeyBinds[u] & acts_c) && (keys & (1 << u)) ) {\r
-                                                       allActions[pl] |= acts_c;\r
+                               if (acts_c) {\r
+                                       for (u = i + 1; u < 32; u++)\r
+                                               if ( (keys & (1 << u)) && (currentConfig.KeyBinds[u] & acts_c) ) {\r
+                                                       allActions[pl] |= acts_c & currentConfig.KeyBinds[u];\r
                                                        keys &= ~((1 << i) | (1 << u));\r
                                                        break;\r
                                                }\r
+                               }\r
                                // add non-combo actions if combo ones were not found\r
                                if (!acts_c || u == 32)\r
-                                       allActions[pl] |= acts & ~combo_acts;\r
+                                       allActions[pl] |= acts & ~kb_combo_acts;\r
                        } else {\r
                                allActions[pl] |= acts;\r
                        }\r
@@ -740,7 +700,7 @@ void emu_Loop(void)
        scaling_update();\r
        Pico.m.dirtyPal = 1;\r
        oldmodes = ((Pico.video.reg[12]&1)<<2) ^ 0xc;\r
-       find_combos();\r
+       emu_findKeyBindCombos();\r
 \r
        // pal/ntsc might have changed, reset related stuff\r
        target_fps = Pico.m.pal ? 50 : 60;\r