GameShark - use NESGameGenieDecoder for nes logic

This commit is contained in:
adelikat 2020-02-28 18:54:40 -06:00
parent d4bcdf7090
commit adbcfc38bc
1 changed files with 7 additions and 114 deletions

View File

@ -78,27 +78,6 @@ namespace BizHawk.Client.EmuHawk
['9'] = 31
};
// This only applies to the NES
private readonly Dictionary<char, int> _nesGameGenieTable = new Dictionary<char, int>
{
['A'] = 0, // 0000
['P'] = 1, // 0001
['Z'] = 2, // 0010
['L'] = 3, // 0011
['G'] = 4, // 0100
['I'] = 5, // 0101
['T'] = 6, // 0110
['Y'] = 7, // 0111
['E'] = 8, // 1000
['O'] = 9, // 1001
['X'] = 10, // 1010
['U'] = 11, // 1011
['K'] = 12, // 1100
['S'] = 13, // 1101
['V'] = 14, // 1110
['N'] = 15, // 1111
};
// including transposition
// Code: D F 4 7 0 9 1 5 6 B C 8 A 2 3 E
// Hex: 0 1 2 3 4 5 6 7 8 9 A B C D E F
@ -2607,113 +2586,27 @@ namespace BizHawk.Client.EmuHawk
private void Nes()
{
string strCompare = null;
if (_singleCheat.Length != 6 || _singleCheat.Length != 8)
{
int value = 0;
int address = 0x8000;
int x;
int compare = 0;
// char 3 bit 3 denotes the code length.
string code = _singleCheat;
if (_singleCheat.Length == 6)
{
// Char # | 1 | 2 | 3 | 4 | 5 | 6 |
// Bit # |3|2|1|0|3|2|1|0|3|2|1|0|3|2|1|0|3|2|1|0|3|2|1|0|
// maps to|1|6|7|8|H|2|3|4|-|I|J|K|L|A|B|C|D|M|N|O|5|E|F|G|
_nesGameGenieTable.TryGetValue(code[0], out x);
value |= x & 0x07;
value |= (x & 0x08) << 4;
_nesGameGenieTable.TryGetValue(code[1], out x);
value |= (x & 0x07) << 4;
address |= (x & 0x08) << 4;
_nesGameGenieTable.TryGetValue(code[2], out x);
address |= (x & 0x07) << 4;
_nesGameGenieTable.TryGetValue(code[3], out x);
address |= (x & 0x07) << 12;
address |= x & 0x08;
_nesGameGenieTable.TryGetValue(code[4], out x);
address |= x & 0x07;
address |= (x & 0x08) << 8;
_nesGameGenieTable.TryGetValue(code[5], out x);
address |= (x & 0x07) << 8;
value |= x & 0x08;
_ramAddress = $"{address:X4}";
_ramValue = $"{value:X2}";
strCompare = $"{compare:X2}";
}
else if (_singleCheat.Length == 8)
{
// Char # | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
// Bit # |3|2|1|0|3|2|1|0|3|2|1|0|3|2|1|0|3|2|1|0|3|2|1|0|3|2|1|0|3|2|1|0|
// maps to|1|6|7|8|H|2|3|4|-|I|J|K|L|A|B|C|D|M|N|O|%|E|F|G|!|^|&|*|5|@|#|$|
value = 0;
address = 0x8000;
compare = 0;
_nesGameGenieTable.TryGetValue(code[0], out x);
value |= x & 0x07;
value |= (x & 0x08) << 4;
_nesGameGenieTable.TryGetValue(code[1], out x);
value |= (x & 0x07) << 4;
address |= (x & 0x08) << 4;
_nesGameGenieTable.TryGetValue(code[2], out x);
address |= (x & 0x07) << 4;
_nesGameGenieTable.TryGetValue(code[3], out x);
address |= (x & 0x07) << 12;
address |= x & 0x08;
_nesGameGenieTable.TryGetValue(code[4], out x);
address |= x & 0x07;
address |= (x & 0x08) << 8;
_nesGameGenieTable.TryGetValue(code[5], out x);
address |= (x & 0x07) << 8;
compare |= x & 0x08;
_nesGameGenieTable.TryGetValue(code[6], out x);
compare |= x & 0x07;
compare |= (x & 0x08) << 4;
_nesGameGenieTable.TryGetValue(code[7], out x);
compare |= (x & 0x07) << 4;
value |= x & 0x08;
_ramAddress = $"{address:X4}";
_ramValue = $"{value:X2}";
strCompare = $"{compare:X2}";
}
}
if (_singleCheat.Length != 6 && _singleCheat.Length != 8)
{
MessageBox.Show("Game Genie codes need to be six or eight characters in length.", "Input Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
var decoder = new NESGameGenieDecoder(_singleCheat);
try
{
// A Watch needs to be generated so we can make a cheat out of that. This is due to how the Cheat engine works.
// System Bus Domain, The Address to Watch, Byte size (Word), Hex Display, Description. Big Endian.
// We have a Byte sized value
var description = _singleCheat;
if (!string.IsNullOrWhiteSpace(txtDescription.Text))
{
description = txtDescription.Text;
}
var watch = Watch.GenerateWatch(MemoryDomains["System Bus"], long.Parse(_ramAddress, NumberStyles.HexNumber), WatchSize.Byte, Common.DisplayType.Hex, false, description);
var watch = Watch.GenerateWatch(MemoryDomains["System Bus"], decoder.Address, WatchSize.Byte, Common.DisplayType.Hex, false, description);
Global.CheatList.Add(
strCompare == "00"
? new Cheat(watch, int.Parse(_ramValue, NumberStyles.HexNumber))
: new Cheat(watch, int.Parse(_ramValue, NumberStyles.HexNumber), int.Parse(strCompare, NumberStyles.HexNumber), true, Cheat.CompareType.Equal));
decoder.Compare.HasValue
? new Cheat(watch, decoder.Value, decoder.Compare.Value, true, Cheat.CompareType.Equal)
: new Cheat(watch, decoder.Value));
}
catch (Exception ex)
{