snes9xgx/source/ngc/sram.cpp

263 lines
6.1 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
2008-09-05 00:42:33 +02:00
* Tantric September 2008
*
* 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"
2008-08-12 05:25:16 +02:00
#include "images/saveicon.h"
2008-08-07 07:19:17 +02:00
#include "menudraw.h"
2008-08-12 05:25:16 +02:00
#include "memcardop.h"
2008-08-07 07:19:17 +02:00
#include "fileop.h"
#include "smbop.h"
#include "filesel.h"
extern int padcal;
extern unsigned short gcpadmap[];
char sramcomment[2][32];
/****************************************************************************
2008-09-02 22:15:59 +02:00
* Prepare SRAM Save Data
*
* This sets up the savebuffer for saving in a format compatible with
* snes9x on other platforms.
***************************************************************************/
int
2008-09-02 22:15:59 +02:00
preparesavedata (int method)
{
2008-09-02 22:15:59 +02:00
int offset = 0;
int size;
2008-09-02 22:15:59 +02:00
if(method == METHOD_MC_SLOTA || method == METHOD_MC_SLOTB)
{
// Copy in save icon
memcpy (savebuffer, saveicon, sizeof(saveicon));
offset += sizeof (saveicon);
}
2008-09-02 22:15:59 +02:00
// Copy in the sramcomments
sprintf (sramcomment[0], "%s SRAM", VERSIONSTR);
sprintf (sramcomment[1], Memory.ROMName);
memcpy (savebuffer + offset, sramcomment, 64);
offset += 64;
2008-09-02 22:15:59 +02:00
if(method != METHOD_MC_SLOTA && method != METHOD_MC_SLOTB)
{
// make it a 512 byte header so it is compatible with other platforms
if (offset <= 512)
offset = 512;
// header was longer than 512 bytes - hopefully this never happens!
else
return 0;
}
2008-09-02 22:15:59 +02:00
// Copy in the SRAM
size = Memory.SRAMSize ? (1 << (Memory.SRAMSize + 3)) * 128 : 0;
if (size > 0x20000)
2008-09-02 22:15:59 +02:00
size = 0x20000;
if (size != 0)
{
2008-09-02 22:15:59 +02:00
memcpy (savebuffer + offset, Memory.SRAM, size);
offset += size;
}
2008-09-05 00:42:33 +02:00
else
{
offset = 0;
}
return offset;
}
/****************************************************************************
* Decode Save Data
***************************************************************************/
void
2008-09-02 22:15:59 +02:00
decodesavedata (int method, int readsize)
{
2008-09-05 00:42:33 +02:00
int offset = 0;
2008-09-02 22:15:59 +02:00
char sramsavecomment[32];
2008-09-02 22:15:59 +02:00
int size = Memory.SRAMSize ? (1 << (Memory.SRAMSize + 3)) * 128 : 0;
2008-09-02 22:15:59 +02:00
if (size > 0x20000)
size = 0x20000;
2008-09-02 22:15:59 +02:00
// memory card save
if(method == METHOD_MC_SLOTA || method == METHOD_MC_SLOTB)
2008-09-05 00:42:33 +02:00
offset = sizeof (saveicon); // skip save icon
2008-09-05 00:42:33 +02:00
// Check for sram comment
2008-09-02 22:15:59 +02:00
memcpy (sramsavecomment, savebuffer+offset, 32);
2008-09-05 00:42:33 +02:00
// version 0xx found!
if ( (strncmp (sramsavecomment, "Snes9x GX 0", 11) == 0) )
{
2008-09-05 00:42:33 +02:00
// adjust offset
2008-09-10 00:38:02 +02:00
if(method != METHOD_MC_SLOTA && method != METHOD_MC_SLOTB)
2008-09-05 00:42:33 +02:00
offset = 512; // skip entire 512 byte header
else
offset += 64; // skip savecomments
2008-09-02 22:15:59 +02:00
// import the SRAM
memcpy (Memory.SRAM, savebuffer + offset, size);
}
2008-09-02 22:15:59 +02:00
// check for SRAM from other version/platform of snes9x
else if ( readsize == size || readsize == 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);
2008-09-02 22:15:59 +02:00
}
else if ( readsize == size + 512 )
{
// SRAM has a 512 byte header - remove it, then import the SRAM,
// ignoring anything after the SRAM
2008-09-02 22:15:59 +02:00
memcpy(Memory.SRAM, savebuffer+512, size);
}
else
{
WaitPrompt((char*)"Incompatible SRAM save!");
}
}
/****************************************************************************
* Load SRAM
***************************************************************************/
int
LoadSRAM (int method, bool silent)
{
2008-08-12 05:25:16 +02:00
ShowAction ((char*) "Loading...");
if(method == METHOD_AUTO)
2008-08-17 07:25:33 +02:00
method = autoSaveMethod(); // we use 'Save' because SRAM needs R/W
char filepath[1024];
int offset = 0;
2008-09-27 09:57:03 +02:00
AllocSaveBuffer();
2008-09-27 09:13:52 +02:00
if(method == METHOD_SD || method == METHOD_USB)
{
if(ChangeFATInterface(method, NOTSILENT))
{
sprintf (filepath, "%s/%s/%s.srm", ROOTFATDIR, GCSettings.SaveFolder, Memory.ROMFilename);
offset = LoadBufferFromFAT (filepath, silent);
}
}
else if(method == METHOD_SMB)
{
sprintf (filepath, "%s/%s.srm", GCSettings.SaveFolder, Memory.ROMFilename);
offset = LoadBufferFromSMB (filepath, silent);
}
2008-08-17 07:25:33 +02:00
else if(method == METHOD_MC_SLOTA || method == METHOD_MC_SLOTB)
{
2008-08-17 07:25:33 +02:00
sprintf (filepath, "%s.srm", Memory.ROMName);
if(method == METHOD_MC_SLOTA)
offset = LoadBufferFromMC (savebuffer, CARD_SLOTA, filepath, silent);
else
offset = LoadBufferFromMC (savebuffer, CARD_SLOTB, filepath, silent);
}
if (offset > 0)
{
2008-09-02 22:15:59 +02:00
decodesavedata (method, offset);
S9xSoftReset();
}
2008-09-27 09:13:52 +02:00
FreeSaveBuffer ();
2008-09-27 09:13:52 +02:00
if(offset > 0)
{
return 1;
}
else
{
// if we reached here, nothing was done!
if(!silent)
WaitPrompt ((char*) "SRAM file not found");
return 0;
}
}
/****************************************************************************
* Save SRAM
***************************************************************************/
bool
SaveSRAM (int method, bool silent)
{
2008-08-12 05:25:16 +02:00
ShowAction ((char*) "Saving...");
if(method == METHOD_AUTO)
method = autoSaveMethod();
bool retval = false;
char filepath[1024];
int datasize;
int offset = 0;
2008-09-27 09:13:52 +02:00
AllocSaveBuffer ();
2008-09-02 22:15:59 +02:00
datasize = preparesavedata (method);
if ( datasize )
{
if(method == METHOD_SD || method == METHOD_USB)
{
2008-08-12 05:25:16 +02:00
if(ChangeFATInterface(method, NOTSILENT))
{
sprintf (filepath, "%s/%s/%s.srm", ROOTFATDIR, GCSettings.SaveFolder, Memory.ROMFilename);
offset = SaveBufferToFAT (filepath, datasize, silent);
}
}
else if(method == METHOD_SMB)
{
sprintf (filepath, "%s/%s.srm", GCSettings.SaveFolder, Memory.ROMFilename);
offset = SaveBufferToSMB (filepath, datasize, silent);
}
2008-08-17 07:25:33 +02:00
else if(method == METHOD_MC_SLOTA || method == METHOD_MC_SLOTB)
{
2008-08-17 07:25:33 +02:00
sprintf (filepath, "%s.srm", Memory.ROMName);
if(method == METHOD_MC_SLOTA)
offset = SaveBufferToMC (savebuffer, CARD_SLOTA, filepath, datasize, silent);
else
offset = SaveBufferToMC (savebuffer, CARD_SLOTB, filepath, datasize, silent);
}
if (offset > 0)
{
if ( !silent )
2008-08-12 05:25:16 +02:00
WaitPrompt((char *)"Save successful");
retval = true;
}
}
2008-09-09 06:13:42 +02:00
else
{
if(!silent)
WaitPrompt((char *)"No SRAM data to save!");
}
2008-09-27 09:13:52 +02:00
FreeSaveBuffer ();
return retval;
}