gen: support save-ram. but not eeprom, yet.

This commit is contained in:
beirich 2012-09-16 04:42:14 +00:00
parent 27b4439575
commit e208b147ae
2 changed files with 38 additions and 9 deletions

View File

@ -4,7 +4,8 @@ namespace BizHawk.Emulation.Consoles.Sega
{
partial class Genesis
{
bool SaveRamEnabled = false;
bool SaveRamEnabled;
bool SaveRamEveryOtherByte;
int SaveRamStartOffset;
int SaveRamEndOffset;
int SaveRamLength;
@ -13,14 +14,33 @@ namespace BizHawk.Emulation.Consoles.Sega
void InitializeSaveRam(GameInfo game)
{
if (game["SaveRamOffset"])
// TODO if eeprom in use, abort saveram check
if (game["DisableSaveRam"] || RH_SRamPresent == false)
return;
SaveRamEnabled = true;
SaveRamEveryOtherByte = RH_SRamCode != 0;
SaveRamStartOffset = RH_SRamStart;
SaveRamEndOffset = RH_SRamEnd;
if (game["SaveRamStartOffset"])
SaveRamStartOffset = game.GetHexValue("SaveRamStartOffset");
if (game["SaveRamEndOffset"])
SaveRamEndOffset = game.GetHexValue("SaveRamEndOffset");
SaveRamLength = (SaveRamEndOffset - SaveRamStartOffset) + 1;
if (SaveRamEveryOtherByte)
{
SaveRamEnabled = true;
SaveRamStartOffset = game.GetHexValue("SaveRamOffset");
SaveRamLength = game.GetHexValue("SaveRamLength");
SaveRamEndOffset = SaveRamStartOffset + SaveRamLength;
SaveRAM = new byte[SaveRamLength];
SaveRamStartOffset &= 0xFFFFFE;
SaveRamEndOffset &= 0xFFFFFE;
SaveRamLength = ((SaveRamEndOffset - SaveRamStartOffset) / 2) + 1;
}
SaveRAM = new byte[SaveRamLength];
Console.WriteLine("SaveRAM enabled. Start: ${0:X6} End: ${1:X6} Length: ${2:X} Mode: {3}", SaveRamStartOffset, SaveRamEndOffset, SaveRamLength, RH_SRamInterpretation());
}
public byte[] ReadSaveRam() { return (byte[])SaveRAM.Clone(); }

View File

@ -14,7 +14,12 @@ namespace BizHawk.Emulation.Consoles.Sega
if (address < 0x400000)
{
if (SaveRamEnabled && address >= SaveRamStartOffset && address < SaveRamEndOffset)
return (sbyte) SaveRAM[address - SaveRamStartOffset];
{
if (SaveRamEveryOtherByte)
return (sbyte) SaveRAM[(address - SaveRamStartOffset) >> 1];
else
return (sbyte) SaveRAM[address - SaveRamStartOffset];
}
return (sbyte)RomData[address];
}
@ -153,7 +158,11 @@ namespace BizHawk.Emulation.Consoles.Sega
if (SaveRamEnabled && address >= SaveRamStartOffset && address < SaveRamEndOffset)
{
SaveRAM[address - SaveRamStartOffset] = (byte) value;
if (SaveRamEveryOtherByte)
SaveRAM[(address - SaveRamStartOffset) >> 1] = (byte) value;
else
SaveRAM[address - SaveRamStartOffset] = (byte) value;
SaveRamModified = true;
return;
}