snes9xgx/source/ngc/sram.cpp

194 lines
4.3 KiB
C++
Raw Normal View History

/****************************************************************************
* Snes9x 1.51 Nintendo Wii/Gamecube Port
2008-09-05 00:42:33 +02:00
*
* crunchy2 April 2007-July 2007
2008-09-23 06:13:33 +02:00
* Michniewski 2008
2009-03-11 18:28:37 +01:00
* Tantric 2008-2009
*
* sram.cpp
*
* SRAM save/load/import/export handling
***************************************************************************/
#include <gccore.h>
#include <stdio.h>
#include <string.h>
#include <ogcsys.h>
#include "snes9x.h"
#include "memmap.h"
#include "srtc.h"
2008-09-09 19:36:48 +02:00
#include "snes9xGX.h"
2009-03-21 03:01:40 +01:00
#include "memcardop.h"
2009-03-11 18:28:37 +01:00
#include "menu.h"
2008-12-18 19:36:30 +01:00
#include "fileop.h"
2009-03-11 18:28:37 +01:00
#include "filebrowser.h"
#include "input.h"
/****************************************************************************
* Load SRAM
***************************************************************************/
bool
2009-03-11 18:28:37 +01:00
LoadSRAM (char * filepath, int method, bool silent)
{
2008-11-12 08:50:39 +01:00
int offset = 0;
2008-08-12 05:25:16 +02:00
if(method == METHOD_AUTO)
method = autoSaveMethod(silent); // we use 'Save' because SRAM needs R/W
2009-03-11 18:28:37 +01:00
if(method == METHOD_AUTO)
return false;
2008-11-12 08:50:39 +01:00
AllocSaveBuffer();
2008-08-17 07:25:33 +02:00
2008-11-12 08:50:39 +01:00
offset = LoadFile(filepath, method, silent);
if (offset > 0)
{
int size = Memory.SRAMSize ? (1 << (Memory.SRAMSize + 3)) * 128 : 0;
if (size > 0x20000)
size = 0x20000;
2009-03-21 03:01:40 +01:00
if (method == METHOD_MC_SLOTA || method == METHOD_MC_SLOTB ||
offset == size + 512 || offset == size + 512 + SRTC_SRAM_PAD)
{
// SRAM has a 512 byte header - remove it, then import the SRAM,
// ignoring anything after the SRAM
memcpy(Memory.SRAM, savebuffer+512, size);
}
2009-03-21 03:01:40 +01:00
else if (offset == size || offset == size + SRTC_SRAM_PAD)
{
// SRAM data should be at the start of the file, just import it and
// ignore anything after the SRAM
memcpy (Memory.SRAM, savebuffer, size);
}
else
{
ErrorPrompt("Incompatible SRAM save!");
}
S9xSoftReset();
2008-11-12 08:50:39 +01:00
FreeSaveBuffer ();
return true;
2008-09-27 09:13:52 +02:00
}
else
{
2008-11-12 08:50:39 +01:00
FreeSaveBuffer ();
2008-09-27 09:13:52 +02:00
// if we reached here, nothing was done!
if(!silent)
2009-03-11 18:28:37 +01:00
ErrorPrompt("SRAM file not found");
2008-09-27 09:13:52 +02:00
return false;
2008-09-27 09:13:52 +02:00
}
}
2009-03-11 18:28:37 +01:00
bool
LoadSRAMAuto (int method, bool silent)
{
2009-03-16 07:58:50 +01:00
if(method == METHOD_AUTO)
method = autoSaveMethod(silent);
if(method == METHOD_AUTO)
return false;
char filepath[MAXPATHLEN];
char fullpath[MAXPATHLEN];
char filepath2[MAXPATHLEN];
char fullpath2[MAXPATHLEN];
2009-03-11 18:28:37 +01:00
// look for Auto save file
2009-03-20 09:26:10 +01:00
if(!MakeFilePath(filepath, FILE_SRAM, method, Memory.ROMFilename, 0))
return false;
if (LoadSRAM(filepath, method, silent))
return true;
// look for file with no number or Auto appended
if(!MakeFilePath(filepath2, FILE_SRAM, method, Memory.ROMFilename, -1))
return false;
if(LoadSRAM(filepath2, method, silent))
{
// rename this file - append Auto
sprintf(fullpath, "%s%s", rootdir, filepath); // add device to path
sprintf(fullpath2, "%s%s", rootdir, filepath2); // add device to path
rename(fullpath2, fullpath); // rename file (to avoid duplicates)
return true;
}
return false;
2009-03-11 18:28:37 +01:00
}
/****************************************************************************
* Save SRAM
***************************************************************************/
bool
2009-03-11 18:28:37 +01:00
SaveSRAM (char * filepath, int method, bool silent)
{
bool retval = false;
int offset = 0;
2008-11-12 08:50:39 +01:00
if(method == METHOD_AUTO)
method = autoSaveMethod(silent);
2008-11-12 08:50:39 +01:00
2009-03-11 18:28:37 +01:00
if(method == METHOD_AUTO)
2008-11-12 08:50:39 +01:00
return false;
// determine SRAM size
int size = Memory.SRAMSize ? (1 << (Memory.SRAMSize + 3)) * 128 : 0;
2008-09-27 09:13:52 +02:00
if (size > 0x20000)
size = 0x20000;
if (size > 0)
{
if(method == METHOD_MC_SLOTA || method == METHOD_MC_SLOTB)
{
// Set the sramcomments
char sramcomment[2][32];
memset(sramcomment, 0, 64);
sprintf (sramcomment[0], "%s SRAM", APPNAME);
sprintf (sramcomment[1], Memory.ROMName);
SetMCSaveComments(sramcomment);
}
AllocSaveBuffer ();
// copy in the SRAM, leaving a 512 byte header (for compatibility with other platforms)
memcpy(savebuffer+512, Memory.SRAM, size);
offset = SaveFile(filepath, size+512, method, silent);
FreeSaveBuffer ();
if (offset > 0)
{
2009-03-11 18:28:37 +01:00
if (!silent)
InfoPrompt("Save successful");
retval = true;
}
}
2008-09-09 06:13:42 +02:00
else
{
if(!silent)
2009-03-11 18:28:37 +01:00
ErrorPrompt("No SRAM data to save!");
2008-09-09 06:13:42 +02:00
}
return retval;
}
2009-03-11 18:28:37 +01:00
bool
SaveSRAMAuto (int method, bool silent)
{
2009-03-16 07:58:50 +01:00
if(method == METHOD_AUTO)
method = autoSaveMethod(silent);
if(method == METHOD_AUTO)
return false;
2009-03-11 18:28:37 +01:00
char filepath[1024];
2009-03-16 07:58:50 +01:00
if(!MakeFilePath(filepath, FILE_SRAM, method, Memory.ROMFilename, 0))
return false;
2009-03-11 18:28:37 +01:00
return SaveSRAM(filepath, method, silent);
}