From 94c9f1eaf69798a9ada069f8a4a5e37391dbff7a Mon Sep 17 00:00:00 2001
From: CasualPokePlayer <50538166+CasualPokePlayer@users.noreply.github.com>
Date: Fri, 6 Sep 2024 14:08:06 -0700
Subject: [PATCH] use new scratchpad mem domain for cheevos

---
 .../RetroAchievements/RAIntegration.cs        |  2 +-
 .../RetroAchievements/RCheevos.cs             |  4 +-
 .../RetroAchievements.Memory.cs               | 65 +++++--------------
 3 files changed, 19 insertions(+), 52 deletions(-)

diff --git a/src/BizHawk.Client.EmuHawk/RetroAchievements/RAIntegration.cs b/src/BizHawk.Client.EmuHawk/RetroAchievements/RAIntegration.cs
index cd11e62906..dfbeb53ca9 100644
--- a/src/BizHawk.Client.EmuHawk/RetroAchievements/RAIntegration.cs
+++ b/src/BizHawk.Client.EmuHawk/RetroAchievements/RAIntegration.cs
@@ -211,7 +211,7 @@ namespace BizHawk.Client.EmuHawk
 
 			if (Emu.HasMemoryDomains())
 			{
-				_memFunctions = CreateMemoryBanks(consoleId, Domains, Emu.CanDebug() ? Emu.AsDebuggable() : null);
+				_memFunctions = CreateMemoryBanks(consoleId, Domains);
 
 				for (var i = 0; i < _memFunctions.Count; i++)
 				{
diff --git a/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevos.cs b/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevos.cs
index 2e3a2ceb5a..f2801c30d8 100644
--- a/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevos.cs
+++ b/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevos.cs
@@ -376,11 +376,11 @@ namespace BizHawk.Client.EmuHawk
 			_consoleId = SystemIdToConsoleId();
 
 			// init the read map
-			_readMap = Array.Empty<byte>();
+			_readMap = [ ];
 
 			if (Emu.HasMemoryDomains())
 			{
-				_memFunctions = CreateMemoryBanks(_consoleId, Domains, Emu.CanDebug() ? Emu.AsDebuggable() : null);
+				_memFunctions = CreateMemoryBanks(_consoleId, Domains);
 				if (_memFunctions.Count > 255)
 				{
 					throw new InvalidOperationException("_memFunctions must have less than 256 memory banks");
diff --git a/src/BizHawk.Client.EmuHawk/RetroAchievements/RetroAchievements.Memory.cs b/src/BizHawk.Client.EmuHawk/RetroAchievements/RetroAchievements.Memory.cs
index 2a64c8804e..a43f3c9953 100644
--- a/src/BizHawk.Client.EmuHawk/RetroAchievements/RetroAchievements.Memory.cs
+++ b/src/BizHawk.Client.EmuHawk/RetroAchievements/RetroAchievements.Memory.cs
@@ -264,31 +264,23 @@ namespace BizHawk.Client.EmuHawk
 			}
 		}
 
-		private class ChanFMemFunctions : MemFunctions
+		// our vram is unpacked, but RA expects it packed
+		private class ChanFMemFunctions(MemoryDomain vram)
+			: MemFunctions(null, 0, 0x800)
 		{
-			private readonly IDebuggable _debuggable;
-			private readonly MemoryDomain _vram; // our vram is unpacked, but RA expects it packed
-
 			private byte ReadVRAMPacked(uint addr)
 			{
-				return (byte)(((_vram.PeekByte(addr * 4 + 0) & 3) << 6)
-					| ((_vram.PeekByte(addr * 4 + 1) & 3) << 4)
-					| ((_vram.PeekByte(addr * 4 + 2) & 3) << 2)
-					| ((_vram.PeekByte(addr * 4 + 3) & 3) << 0));
+				return (byte)(((vram.PeekByte(addr * 4 + 0) & 3) << 6)
+					| ((vram.PeekByte(addr * 4 + 1) & 3) << 4)
+					| ((vram.PeekByte(addr * 4 + 2) & 3) << 2)
+					| ((vram.PeekByte(addr * 4 + 3) & 3) << 0));
 			}
 
 			protected override byte ReadMem(uint addr)
 			{
 				using (MemGuard.EnterExit())
 				{
-					if (addr < 0x40)
-					{
-						return (byte)_debuggable.GetCpuFlagsAndRegisters()["SPR" + addr].Value;
-					}
-					else
-					{
-						return ReadVRAMPacked(addr - 0x40);
-					}
+					return ReadVRAMPacked(addr);
 				}
 			}
 
@@ -296,18 +288,10 @@ namespace BizHawk.Client.EmuHawk
 			{
 				using (MemGuard.EnterExit())
 				{
-					if (addr < 0x40)
-					{
-						_debuggable.SetCpuRegister("SPR" + addr, val);
-					}
-					else
-					{
-						addr -= 0x40;
-						_vram.PokeByte(addr * 4 + 0, (byte)((val >> 6) & 3));
-						_vram.PokeByte(addr * 4 + 1, (byte)((val >> 4) & 3));
-						_vram.PokeByte(addr * 4 + 2, (byte)((val >> 2) & 3));
-						_vram.PokeByte(addr * 4 + 3, (byte)((val >> 0) & 3));
-					}
+					vram.PokeByte(addr * 4 + 0, (byte)((val >> 6) & 3));
+					vram.PokeByte(addr * 4 + 1, (byte)((val >> 4) & 3));
+					vram.PokeByte(addr * 4 + 2, (byte)((val >> 2) & 3));
+					vram.PokeByte(addr * 4 + 3, (byte)((val >> 0) & 3));
 				}
 			}
 
@@ -320,36 +304,18 @@ namespace BizHawk.Client.EmuHawk
 
 				using (MemGuard.EnterExit())
 				{
-					var regs = _debuggable.GetCpuFlagsAndRegisters();
 					var end = Math.Min(addr + bytes, BankSize);
 					for (var i = addr; i < end; i++)
 					{
-						byte val;
-						if (i < 0x40)
-						{
-							val = (byte)regs["SPR" + i].Value;
-						}
-						else
-						{
-							val = ReadVRAMPacked(i - 0x40);
-						}
-
 						unsafe
 						{
-							((byte*)buffer)![i - addr] = val;
+							((byte*)buffer)![i - addr] = ReadVRAMPacked(i);
 						}
 					}
 
 					return end - addr;
 				}
 			}
-
-			public ChanFMemFunctions(IDebuggable debuggable, MemoryDomain vram)
-				: base(null, 0, 0x840)
-			{
-				_debuggable = debuggable;
-				_vram = vram;
-			}
 		}
 
 		// these consoles will use the entire system bus
@@ -374,7 +340,7 @@ namespace BizHawk.Client.EmuHawk
 
 		// anything more complicated will be handled accordingly
 
-		protected static IReadOnlyList<MemFunctions> CreateMemoryBanks(ConsoleID consoleId, IMemoryDomains domains, IDebuggable debuggable)
+		protected static IReadOnlyList<MemFunctions> CreateMemoryBanks(ConsoleID consoleId, IMemoryDomains domains)
 		{
 			var mfs = new List<MemFunctions>();
 
@@ -562,8 +528,9 @@ namespace BizHawk.Client.EmuHawk
 						TryAddDomain("EEPROM");
 						break;
 					case ConsoleID.FairchildChannelF:
+						mfs.Add(new(domains["Scratchpad"], 0, domains["Scratchpad"].Size));
 						// special case
-						mfs.Add(new ChanFMemFunctions(debuggable, domains["VRAM"]));
+						mfs.Add(new ChanFMemFunctions(domains["VRAM"]));
 						mfs.Add(new(domains.SystemBus, 0, domains.SystemBus.Size));
 						// only add in SRAM if it's from HANG/MAZE carts (where SRAM isn't on the System Bus)
 						if (domains.Has("SRAM") && domains["SRAM"].Size == 0x400)