From e208b147ae345310323680d01ffafb6a63452876 Mon Sep 17 00:00:00 2001 From: beirich Date: Sun, 16 Sep 2012 04:42:14 +0000 Subject: [PATCH] gen: support save-ram. but not eeprom, yet. --- .../Consoles/Sega/Genesis/Cart/SaveRAM.cs | 34 +++++++++++++++---- .../Consoles/Sega/Genesis/MemoryMap.68000.cs | 13 +++++-- 2 files changed, 38 insertions(+), 9 deletions(-) diff --git a/BizHawk.Emulation/Consoles/Sega/Genesis/Cart/SaveRAM.cs b/BizHawk.Emulation/Consoles/Sega/Genesis/Cart/SaveRAM.cs index 0ae5bb6c35..c4ccbbf387 100644 --- a/BizHawk.Emulation/Consoles/Sega/Genesis/Cart/SaveRAM.cs +++ b/BizHawk.Emulation/Consoles/Sega/Genesis/Cart/SaveRAM.cs @@ -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(); } diff --git a/BizHawk.Emulation/Consoles/Sega/Genesis/MemoryMap.68000.cs b/BizHawk.Emulation/Consoles/Sega/Genesis/MemoryMap.68000.cs index 0350820e11..226ad0733c 100644 --- a/BizHawk.Emulation/Consoles/Sega/Genesis/MemoryMap.68000.cs +++ b/BizHawk.Emulation/Consoles/Sega/Genesis/MemoryMap.68000.cs @@ -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; }