- static char saveFname[512];\r
- char ext[16];\r
-\r
- if (is_sram)\r
- {\r
- romfname_ext(saveFname, (PicoMCD&1) ? "brm/" : "srm/", (PicoMCD&1) ? ".brm" : ".srm");\r
- if (load) {\r
- if (try_ropen_file(saveFname)) return saveFname;\r
- // try in current dir..\r
- romfname_ext(saveFname, NULL, (PicoMCD&1) ? ".brm" : ".srm");\r
- if (try_ropen_file(saveFname)) return saveFname;\r
- return NULL; // give up\r
- }\r
- }\r
- else\r
- {\r
- ext[0] = 0;\r
- if(slot > 0 && slot < 10) sprintf(ext, ".%i", slot);\r
- strcat(ext, (currentConfig.EmuOpt & 8) ? ".mds.gz" : ".mds");\r
-\r
- romfname_ext(saveFname, "mds/", ext);\r
- if (load) {\r
- if (try_ropen_file(saveFname)) return saveFname;\r
- romfname_ext(saveFname, NULL, ext);\r
- if (try_ropen_file(saveFname)) return saveFname;\r
- if (currentConfig.EmuOpt & 8) {\r
- ext[0] = 0;\r
- if(slot > 0 && slot < 10) sprintf(ext, ".%i", slot);\r
- strcat(ext, ".mds");\r
-\r
- romfname_ext(saveFname, "mds/", ext);\r
- if (try_ropen_file(saveFname)) return saveFname;\r
- romfname_ext(saveFname, NULL, ext);\r
- if (try_ropen_file(saveFname)) return saveFname;\r
- }\r
- return NULL;\r
- }\r
- }\r
-\r
- return saveFname;\r
-}\r
-\r
-int emu_check_save_file(int slot)\r
-{\r
- return emu_GetSaveFName(1, 0, slot) ? 1 : 0;\r
-}\r
-\r
-void emu_set_save_cbs(int gz)\r
-{\r
- if (gz) {\r
- areaRead = gzRead2;\r
- areaWrite = gzWrite2;\r
- areaEof = (areaeof *) gzeof;\r
- areaSeek = (areaseek *) gzseek;\r
- areaClose = (areaclose *) gzclose;\r
- } else {\r
- areaRead = (arearw *) fread;\r
- areaWrite = (arearw *) fwrite;\r
- areaEof = (areaeof *) feof;\r
- areaSeek = (areaseek *) fseek;\r
- areaClose = (areaclose *) fclose;\r
- }\r
-}\r
-\r
-int emu_SaveLoadGame(int load, int sram)\r
-{\r
- int ret = 0;\r
- char *saveFname;\r
-\r
- // make save filename\r
- saveFname = emu_GetSaveFName(load, sram, state_slot);\r
- if (saveFname == NULL) {\r
- if (!sram) {\r
- strcpy(noticeMsg, load ? "LOAD FAILED (missing file)" : "SAVE FAILED ");\r
- gettimeofday(¬iceMsgTime, 0);\r
- }\r
- return -1;\r
- }\r
-\r
- printf("saveLoad (%i, %i): %s\n", load, sram, saveFname);\r
-\r
- if(sram) {\r
- FILE *sramFile;\r
- int sram_size;\r
- unsigned char *sram_data;\r
- int truncate = 1;\r
- if (PicoMCD&1) {\r
- if (PicoOpt&0x8000) { // MCD RAM cart?\r
- sram_size = 0x12000;\r
- sram_data = SRam.data;\r
- if (sram_data)\r
- memcpy32((int *)sram_data, (int *)Pico_mcd->bram, 0x2000/4);\r
- } else {\r
- sram_size = 0x2000;\r
- sram_data = Pico_mcd->bram;\r
- truncate = 0; // the .brm may contain RAM cart data after normal brm\r
- }\r
- } else {\r
- sram_size = SRam.end-SRam.start+1;\r
- if(SRam.reg_back & 4) sram_size=0x2000;\r
- sram_data = SRam.data;\r
- }\r
- if (!sram_data) return 0; // SRam forcefully disabled for this game\r
-\r
- if (load) {\r
- sramFile = fopen(saveFname, "rb");\r
- if(!sramFile) return -1;\r
- fread(sram_data, 1, sram_size, sramFile);\r
- fclose(sramFile);\r
- if ((PicoMCD&1) && (PicoOpt&0x8000))\r
- memcpy32((int *)Pico_mcd->bram, (int *)sram_data, 0x2000/4);\r
- } else {\r
- // sram save needs some special processing\r
- // see if we have anything to save\r
- for (; sram_size > 0; sram_size--)\r
- if (sram_data[sram_size-1]) break;\r
-\r
- if (sram_size) {\r
- sramFile = fopen(saveFname, truncate ? "wb" : "r+b");\r
- if (!sramFile) sramFile = fopen(saveFname, "wb"); // retry\r
- if (!sramFile) return -1;\r
- ret = fwrite(sram_data, 1, sram_size, sramFile);\r
- ret = (ret != sram_size) ? -1 : 0;\r
- fclose(sramFile);\r
-#ifndef NO_SYNC\r
- sync();\r
-#endif\r
- }\r
- }\r
- return ret;\r
- }\r
- else\r
- {\r
- void *PmovFile = NULL;\r
- if (strcmp(saveFname + strlen(saveFname) - 3, ".gz") == 0) {\r
- if( (PmovFile = gzopen(saveFname, load ? "rb" : "wb")) ) {\r
- emu_set_save_cbs(1);\r
- if(!load) gzsetparams(PmovFile, 9, Z_DEFAULT_STRATEGY);\r
- }\r
- }\r
- else\r
- {\r
- if( (PmovFile = fopen(saveFname, load ? "rb" : "wb")) ) {\r
- emu_set_save_cbs(0);\r
- }\r
- }\r
- if(PmovFile) {\r
- ret = PmovState(load ? 6 : 5, PmovFile);\r
- areaClose(PmovFile);\r
- PmovFile = 0;\r
- if (load) Pico.m.dirtyPal=1;\r
-#ifndef NO_SYNC\r
- else sync();\r
-#endif\r
- }\r
- else ret = -1;\r
- if (!ret)\r
- strcpy(noticeMsg, load ? "GAME LOADED " : "GAME SAVED ");\r
- else\r
- {\r
- strcpy(noticeMsg, load ? "LOAD FAILED " : "SAVE FAILED ");\r
- ret = -1;\r
- }\r
-\r
- gettimeofday(¬iceMsgTime, 0);\r
- return ret;\r
- }\r
+ return "PicoDrive v" VERSION " (c) notaz, 2006-2009\n\n\n"\r
+ "Credits:\n"\r
+ "fDave: Cyclone 68000 core,\n"\r
+ " base code of PicoDrive\n"\r
+ "Reesy & FluBBa: DrZ80 core\n"\r
+ "MAME devs: YM2612 and SN76496 cores\n"\r
+ "rlyeh and others: minimal SDK\n"\r
+ "Squidge: mmuhack\n"\r
+ "Dzz: ARM940 sample\n"\r
+ "GnoStiC / Puck2099: USB joy code\n"\r
+ "craigix: GP2X hardware\n"\r
+ "ketchupgun: skin design\n"\r
+ "\n"\r
+ "special thanks (for docs, ideas):\n"\r
+ " Charles MacDonald, Haze,\n"\r
+ " Stephane Dallongeville,\n"\r
+ " Lordus, Exophase, Rokas,\n"\r
+ " Nemesis, Tasco Deluxe";\r