2017-04-19 14:41:52 +00:00
|
|
|
|
using System;
|
|
|
|
|
using System.Runtime.InteropServices;
|
|
|
|
|
|
|
|
|
|
using BizHawk.Emulation.Common;
|
|
|
|
|
|
|
|
|
|
namespace BizHawk.Emulation.Cores.Nintendo.SNES
|
|
|
|
|
{
|
|
|
|
|
public unsafe partial class LibsnesCore : ISaveRam
|
|
|
|
|
{
|
|
|
|
|
public bool SaveRamModified =>
|
2017-04-19 17:19:16 +00:00
|
|
|
|
Api.QUERY_get_memory_size(LibsnesApi.SNES_MEMORY.CARTRIDGE_RAM) != 0
|
|
|
|
|
|| Api.QUERY_get_memory_size(LibsnesApi.SNES_MEMORY.SGB_CARTRAM) != 0;
|
2017-04-19 14:41:52 +00:00
|
|
|
|
|
|
|
|
|
public byte[] CloneSaveRam()
|
|
|
|
|
{
|
2017-04-19 17:19:16 +00:00
|
|
|
|
byte* buf = Api.QUERY_get_memory_data(LibsnesApi.SNES_MEMORY.CARTRIDGE_RAM);
|
|
|
|
|
var size = Api.QUERY_get_memory_size(LibsnesApi.SNES_MEMORY.CARTRIDGE_RAM);
|
2017-06-16 12:50:28 +00:00
|
|
|
|
|
|
|
|
|
if (buf == null && Api.QUERY_get_memory_size(LibsnesApi.SNES_MEMORY.SGB_CARTRAM)>0)
|
2017-04-19 14:41:52 +00:00
|
|
|
|
{
|
2017-04-19 17:19:16 +00:00
|
|
|
|
buf = Api.QUERY_get_memory_data(LibsnesApi.SNES_MEMORY.SGB_CARTRAM);
|
|
|
|
|
size = Api.QUERY_get_memory_size(LibsnesApi.SNES_MEMORY.SGB_CARTRAM);
|
2017-04-19 14:41:52 +00:00
|
|
|
|
}
|
2017-06-16 12:50:28 +00:00
|
|
|
|
if (buf==null)
|
|
|
|
|
{
|
|
|
|
|
return null;
|
|
|
|
|
}
|
2017-04-19 14:41:52 +00:00
|
|
|
|
|
|
|
|
|
var ret = new byte[size];
|
|
|
|
|
Marshal.Copy((IntPtr)buf, ret, 0, size);
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void StoreSaveRam(byte[] data)
|
|
|
|
|
{
|
2017-04-19 17:19:16 +00:00
|
|
|
|
byte* buf = Api.QUERY_get_memory_data(LibsnesApi.SNES_MEMORY.CARTRIDGE_RAM);
|
|
|
|
|
var size = Api.QUERY_get_memory_size(LibsnesApi.SNES_MEMORY.CARTRIDGE_RAM);
|
2017-04-19 14:41:52 +00:00
|
|
|
|
if (buf == null)
|
|
|
|
|
{
|
2017-04-19 17:19:16 +00:00
|
|
|
|
buf = Api.QUERY_get_memory_data(LibsnesApi.SNES_MEMORY.SGB_CARTRAM);
|
|
|
|
|
size = Api.QUERY_get_memory_size(LibsnesApi.SNES_MEMORY.SGB_CARTRAM);
|
2017-04-19 14:41:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (size == 0)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (size != data.Length)
|
|
|
|
|
{
|
|
|
|
|
throw new InvalidOperationException("Somehow, we got a mismatch between saveram size and what bsnes says the saveram size is");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Marshal.Copy(data, 0, (IntPtr)buf, size);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|