66 lines
1.5 KiB
C#
66 lines
1.5 KiB
C#
using System;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using BizHawk.Emulation.Common;
|
|
|
|
namespace BizHawk.Emulation.Cores.Nintendo.GBA
|
|
{
|
|
public partial class MGBAHawk : ISaveRam
|
|
{
|
|
public byte[] CloneSaveRam()
|
|
{
|
|
int len = LibmGBA.BizGetSaveRam(_core, _saveScratch, _saveScratch.Length);
|
|
if (len == _saveScratch.Length)
|
|
{
|
|
throw new InvalidOperationException("Save buffer not long enough");
|
|
}
|
|
|
|
if (len == 0)
|
|
{
|
|
return null;
|
|
}
|
|
|
|
var ret = new byte[len];
|
|
Array.Copy(_saveScratch, ret, len);
|
|
return ret;
|
|
}
|
|
|
|
public void StoreSaveRam(byte[] data)
|
|
{
|
|
if (data.Take(8).SequenceEqual(Encoding.ASCII.GetBytes("GBABATT\0")))
|
|
{
|
|
data = LegacyFix(data);
|
|
}
|
|
|
|
LibmGBA.BizPutSaveRam(_core, data, data.Length);
|
|
}
|
|
|
|
public bool SaveRamModified => LibmGBA.BizGetSaveRam(_core, _saveScratch, _saveScratch.Length) > 0;
|
|
|
|
private static byte[] LegacyFix(byte[] saveram)
|
|
{
|
|
// at one point vbanext-hawk had a special saveram format which we want to load.
|
|
var br = new BinaryReader(new MemoryStream(saveram, false));
|
|
br.ReadBytes(8); // header;
|
|
int flashSize = br.ReadInt32();
|
|
int eepromsize = br.ReadInt32();
|
|
byte[] flash = br.ReadBytes(flashSize);
|
|
byte[] eeprom = br.ReadBytes(eepromsize);
|
|
|
|
if (flash.Length == 0)
|
|
{
|
|
return eeprom;
|
|
}
|
|
|
|
if (eeprom.Length == 0)
|
|
{
|
|
return flash;
|
|
}
|
|
|
|
// well, isn't this a sticky situation!
|
|
return flash; // woops
|
|
}
|
|
}
|
|
}
|