69 lines
1.6 KiB
C#
69 lines
1.6 KiB
C#
using System;
|
|
using BizHawk.Emulation.Common;
|
|
|
|
namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
|
|
{
|
|
public partial class Gameboy : ISaveRam
|
|
{
|
|
public bool SaveRamModified
|
|
{
|
|
get
|
|
{
|
|
if (LibGambatte.gambatte_savesavedatalength(GambatteState) == 0)
|
|
return false;
|
|
else
|
|
return true; // need to wire more stuff into the core to actually know this
|
|
}
|
|
}
|
|
|
|
public byte[] CloneSaveRam()
|
|
{
|
|
int length = LibGambatte.gambatte_savesavedatalength(GambatteState);
|
|
|
|
if (length > 0)
|
|
{
|
|
byte[] ret = new byte[length];
|
|
LibGambatte.gambatte_savesavedata(GambatteState, ret);
|
|
return ret;
|
|
}
|
|
else
|
|
return new byte[0];
|
|
}
|
|
|
|
public void StoreSaveRam(byte[] data)
|
|
{
|
|
int expected = LibGambatte.gambatte_savesavedatalength(GambatteState);
|
|
switch (data.Length - expected)
|
|
{
|
|
case 0:
|
|
break;
|
|
default:
|
|
throw new ArgumentException("Size of saveram data does not match expected!");
|
|
case 44:
|
|
data = FixRTC(data, 44);
|
|
break;
|
|
case 40:
|
|
data = FixRTC(data, 40);
|
|
break;
|
|
}
|
|
LibGambatte.gambatte_loadsavedata(GambatteState, data);
|
|
}
|
|
|
|
private byte[] FixRTC(byte[] data, int offset)
|
|
{
|
|
// length - offset is the start of the VBA-only data; so
|
|
// length - offset - 4 is the start of the RTC block
|
|
int idx = data.Length - offset - 4;
|
|
|
|
byte[] ret = new byte[idx + 4];
|
|
Buffer.BlockCopy(data, 0, ret, 0, idx);
|
|
data[idx] = (byte)zerotime;
|
|
data[idx + 1] = (byte)(zerotime >> 8);
|
|
data[idx + 2] = (byte)(zerotime >> 16);
|
|
data[idx + 3] = (byte)(zerotime >> 24);
|
|
|
|
return ret;
|
|
}
|
|
}
|
|
}
|