FAMEC idle loops, PSP port sync, minor adjustments
[picodrive.git] / platform / common / emu.c
index feb3167..44e15a6 100644 (file)
@@ -18,6 +18,7 @@
 \r
 #include <Pico/PicoInt.h>\r
 #include <Pico/Patch.h>\r
+#include <Pico/cd/cue.h>\r
 #include <zlib/zlib.h>\r
 \r
 #if   defined(__GP2X__)\r
@@ -42,6 +43,7 @@ int state_slot = 0;
 int config_slot = 0, config_slot_current = 0;\r
 char lastRomFile[512];\r
 int kb_combo_keys = 0, kb_combo_acts = 0;      // keys and actions which need button combos\r
+int pico_inp_mode = 0;\r
 \r
 unsigned char *movie_data = NULL;\r
 static int movie_size = 0;\r
@@ -163,9 +165,24 @@ int emu_cdCheck(int *pregion)
 {\r
        unsigned char buf[32];\r
        pm_file *cd_f;\r
-       int type = 0, region = 4; // 1: Japan, 4: US, 8: Europe\r
+       int region = 4; // 1: Japan, 4: US, 8: Europe\r
+       char ext[5], *fname = romFileName;\r
+       cue_track_type type = CT_UNKNOWN;\r
+       cue_data_t *cue_data = NULL;\r
+\r
+       get_ext(romFileName, ext);\r
+       if (strcasecmp(ext, ".cue") == 0) {\r
+               cue_data = cue_parse(romFileName);\r
+               if (cue_data != NULL) {\r
+                       fname = cue_data->tracks[1].fname;\r
+                       type  = cue_data->tracks[1].type;\r
+               }\r
+       }\r
+\r
+       cd_f = pm_open(fname);\r
+       if (cue_data != NULL)\r
+               cue_destroy(cue_data);\r
 \r
-       cd_f = pm_open(romFileName);\r
        if (!cd_f) return 0; // let the upper level handle this\r
 \r
        if (pm_read(buf, 32, cd_f) != 32) {\r
@@ -173,18 +190,27 @@ int emu_cdCheck(int *pregion)
                return 0;\r
        }\r
 \r
-       if (!strncasecmp("SEGADISCSYSTEM", (char *)buf+0x00, 14)) type = 1;       // Sega CD (ISO)\r
-       if (!strncasecmp("SEGADISCSYSTEM", (char *)buf+0x10, 14)) type = 2;       // Sega CD (BIN)\r
-       if (type == 0) {\r
+       if (!strncasecmp("SEGADISCSYSTEM", (char *)buf+0x00, 14)) {\r
+               if (type && type != CT_ISO)\r
+                       elprintf(EL_STATUS, ".cue has wrong type: %i", type);\r
+               type = CT_ISO;       // Sega CD (ISO)\r
+       }\r
+       if (!strncasecmp("SEGADISCSYSTEM", (char *)buf+0x10, 14)) {\r
+               if (type && type != CT_BIN)\r
+                       elprintf(EL_STATUS, ".cue has wrong type: %i", type);\r
+               type = CT_BIN;       // Sega CD (BIN)\r
+       }\r
+\r
+       if (type == CT_UNKNOWN) {\r
                pm_close(cd_f);\r
                return 0;\r
        }\r
 \r
-       pm_seek(cd_f, (type == 1) ? 0x100 : 0x110, SEEK_SET);\r
+       pm_seek(cd_f, (type == CT_ISO) ? 0x100 : 0x110, SEEK_SET);\r
        pm_read(id_header, sizeof(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_seek(cd_f, (type == CT_ISO) ? 0x100+0x10B : 0x110+0x10B, SEEK_SET);\r
        pm_read(buf, 1, cd_f);\r
        pm_close(cd_f);\r
 \r
@@ -192,14 +218,14 @@ int emu_cdCheck(int *pregion)
        if (buf[0] == 0xa1) region = 1; // JAP\r
 \r
        lprintf("detected %s Sega/Mega CD image with %s region\n",\r
-               type == 2 ? "BIN" : "ISO", region != 4 ? (region == 8 ? "EU" : "JAP") : "USA");\r
+               type == CT_BIN ? "BIN" : "ISO", region != 4 ? (region == 8 ? "EU" : "JAP") : "USA");\r
 \r
        if (pregion != NULL) *pregion = region;\r
 \r
        return type;\r
 }\r
 \r
-static int extract_text(char *dest, unsigned char *src, int len, int swab)\r
+static int extract_text(char *dest, const unsigned char *src, int len, int swab)\r
 {\r
        char *p = dest;\r
        int i;\r
@@ -330,7 +356,7 @@ int emu_ReloadRom(void)
 \r
        // check for MegaCD image\r
        cd_state = emu_cdCheck(&cd_region);\r
-       if (cd_state > 0)\r
+       if (cd_state != CIT_NOT_CD)\r
        {\r
                PicoAHW |= PAHW_MCD;\r
                // valid CD image, check for BIOS..\r
@@ -402,11 +428,9 @@ int emu_ReloadRom(void)
                return 0;\r
        }\r
 \r
-       Pico.m.frame_count = 0;\r
-\r
        // insert CD if it was detected\r
-       if (cd_state > 0) {\r
-               ret = Insert_CD(romFileName, cd_state == 2);\r
+       if (cd_state != CIT_NOT_CD) {\r
+               ret = Insert_CD(romFileName, cd_state);\r
                if (ret != 0) {\r
                        sprintf(menuErrorMsg, "Insert_CD() failed, invalid CD image?");\r
                        lprintf("%s\n", menuErrorMsg);\r
@@ -427,7 +451,7 @@ int emu_ReloadRom(void)
                if(movie_data[0x14] == '6')\r
                     PicoOpt |=  POPT_6BTN_PAD; // 6 button pad\r
                else PicoOpt &= ~POPT_6BTN_PAD;\r
-               PicoOpt |= POPT_DIS_VDP_FIFO|POPT_ACC_TIMING; // accurate timing, no VDP fifo timing\r
+               PicoOpt |= POPT_DIS_VDP_FIFO; // no VDP fifo timing\r
                if(movie_data[0xF] >= 'A') {\r
                        if(movie_data[0x16] & 0x80) {\r
                                PicoRegionOverride = 8;\r
@@ -948,3 +972,60 @@ int emu_SaveLoadGame(int load, int sram)
        }\r
 }\r
 \r
+void emu_changeFastForward(int set_on)\r
+{\r
+       static void *set_PsndOut = NULL;\r
+       static int set_Frameskip, set_EmuOpt, is_on = 0;\r
+\r
+       if (set_on && !is_on) {\r
+               set_PsndOut = PsndOut;\r
+               set_Frameskip = currentConfig.Frameskip;\r
+               set_EmuOpt = currentConfig.EmuOpt;\r
+               PsndOut = NULL;\r
+               currentConfig.Frameskip = 8;\r
+               currentConfig.EmuOpt &= ~4;\r
+               currentConfig.EmuOpt |= 0x40000;\r
+               is_on = 1;\r
+               strcpy(noticeMsg, "FAST FORWARD   ");\r
+               emu_noticeMsgUpdated();\r
+       }\r
+       else if (!set_on && is_on) {\r
+               PsndOut = set_PsndOut;\r
+               currentConfig.Frameskip = set_Frameskip;\r
+               currentConfig.EmuOpt = set_EmuOpt;\r
+               PsndRerate(1);\r
+               is_on = 0;\r
+       }\r
+}\r
+\r
+void emu_RunEventsPico(unsigned int events)\r
+{\r
+       if (events & (1 << 3)) {\r
+               pico_inp_mode++;\r
+               if (pico_inp_mode > 2) pico_inp_mode = 0;\r
+               switch (pico_inp_mode) {\r
+                       case 2: strcpy(noticeMsg, "Input: Pen on Pad      "); break;\r
+                       case 1: strcpy(noticeMsg, "Input: Pen on Storyware"); break;\r
+                       case 0: strcpy(noticeMsg, "Input: Joytick         ");\r
+                               PicoPicohw.pen_pos[0] = PicoPicohw.pen_pos[1] = 0x8000;\r
+                               break;\r
+               }\r
+               emu_noticeMsgUpdated();\r
+       }\r
+       if (events & (1 << 4)) {\r
+               PicoPicohw.page--;\r
+               if (PicoPicohw.page < 0) PicoPicohw.page = 0;\r
+               sprintf(noticeMsg, "Page %i                 ", PicoPicohw.page);\r
+               emu_noticeMsgUpdated();\r
+       }\r
+       if (events & (1 << 5)) {\r
+               PicoPicohw.page++;\r
+               if (PicoPicohw.page > 6) PicoPicohw.page = 6;\r
+               sprintf(noticeMsg, "Page %i                 ", PicoPicohw.page);\r
+               emu_noticeMsgUpdated();\r
+       }\r
+}\r
+\r
+\r
+\r
+\r