Hex Editor - properly handle (and not throw exceptions) the display of cheat values in a byte size not equal to the cheat byte size

This commit is contained in:
adelikat 2014-07-28 00:49:48 +00:00
parent f43aa4cb34
commit ef14f661c0
2 changed files with 52 additions and 1 deletions

View File

@ -193,6 +193,11 @@ namespace BizHawk.Client.Common
return _cheatList.Any(c => c == cheat);
}
public bool Contains(MemoryDomain domain, int address)
{
return _cheatList.Any(c => c.Domain == domain && c.Address == address);
}
public void CopyTo(Cheat[] array, int arrayIndex)
{
_cheatList.CopyTo(array, arrayIndex);
@ -268,6 +273,52 @@ namespace BizHawk.Client.Common
return activeCheat.GetByteVal(addr);
}
/// <summary>
/// Returns the value of a given cheat, or a partial value of a multi-byte cheat
/// Note that address + size MUST NOT exceed the range of the cheat or undefined behavior will occur
/// </summary>
/// <param name="addr">The starting address for which you will get the number of bytes
/// <param name="size">The number of bytes of the cheat to return</param>
/// <returns>The value, or null if it can't resolve the address with a given cheat</returns>
public int? GetCheatValue(MemoryDomain domain, int addr, Watch.WatchSize size)
{
var activeCheat = _cheatList.FirstOrDefault(cheat => cheat.Contains(addr));
if (activeCheat == (Cheat)null)
{
return null;
}
switch (activeCheat.Size)
{
default:
case Watch.WatchSize.Byte:
return activeCheat.Value;
case Watch.WatchSize.Word:
if (size == Watch.WatchSize.Byte)
{
return GetByteValue(domain, addr);
}
return activeCheat.Value;
case Watch.WatchSize.DWord:
if (size == Watch.WatchSize.Byte)
{
return GetByteValue(domain, addr);
}
else if (size == Watch.WatchSize.Word)
{
if (activeCheat.Address == addr)
{
return (activeCheat.Value.Value >> 16) & 0xFFFF;
}
return activeCheat.Value.Value & 0xFFFF;
}
return activeCheat.Value;
}
}
public void SaveOnClose()
{
if (Global.Config.CheatsAutoSaveOnClose)

View File

@ -574,7 +574,7 @@ namespace BizHawk.Client.EmuHawk
{
if (Global.CheatList.IsActive(_domain, address))
{
return Global.CheatList[_domain, address].Value.Value;
return Global.CheatList.GetCheatValue(_domain, address, (Watch.WatchSize)_dataSize ).Value;
}
switch (_dataSize)