Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alexbevi
GitHub Repository: alexbevi/BizHawk
Path: blob/master/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.ISaveRam.cs
2 views
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;
		}
	}
}