// Sample Input for Saturn: // 160949FC 0090 // Address: 0949FC // Value: 90 // Note, 3XXXXXXX are Big Endian // Remove first two octets public static IDecodeResult Decode(string code) { if (code == null) { throw new ArgumentNullException(nameof(code)); } if (code.IndexOf(" ") != 8) { return(new InvalidCheatCode("All Saturn GameShark Codes need to contain a space after the eighth character.")); } if (code.Length != 13) { return(new InvalidCheatCode("All Saturn GameShark Cheats need to be 13 characters in length.")); } var result = new DecodeResult { Size = WatchSize.Word }; // Only the first character really matters? 16 or 36? var test = code.Remove(2, 11).Remove(1, 1); if (test == "3") { result.Size = WatchSize.Byte; } var s = code.Remove(0, 2); result.Address = int.Parse(s.Remove(6, 5), NumberStyles.HexNumber); result.Value = int.Parse(s.Remove(0, 7)); return(result); }
// 30XXXXXX 00YY public static IDecodeResult Decode(string code) { if (code == null) { throw new ArgumentNullException(nameof(code)); } if (code.IndexOf(" ") != 8) { return(new InvalidCheatCode("All PSX GameShark Codes need to contain a space after the eighth character.")); } if (code.Length != 13) { return(new InvalidCheatCode("All PSX GameShark Cheats need to be 13 characters in length.")); } var result = new DecodeResult(); var type = code.Substring(0, 2); result.Size = type switch { "10" => WatchSize.Word, "11" => WatchSize.Word, "20" => WatchSize.Byte, "21" => WatchSize.Byte, "30" => WatchSize.Byte, "80" => WatchSize.Word, "D0" => WatchSize.Word, "D1" => WatchSize.Word, "D2" => WatchSize.Word, "D3" => WatchSize.Word, "D4" => WatchSize.Word, "D5" => WatchSize.Word, "D6" => WatchSize.Word, "E0" => WatchSize.Byte, "E1" => WatchSize.Byte, "E2" => WatchSize.Byte, "E3" => WatchSize.Byte, _ => WatchSize.Byte }; var s = code.Remove(0, 2); result.Address = int.Parse(s.Remove(6, 5), NumberStyles.HexNumber); result.Value = int.Parse(s.Remove(0, 7), NumberStyles.HexNumber); return(result); } }
public static Cheat ToCheat(this DecodeResult result, MemoryDomain domain, string description) { var watch = Watch.GenerateWatch( domain, result.Address, result.Size, DisplayType.Hex, domain.EndianType == MemoryDomain.Endian.Big, description); return(result.Compare.HasValue ? new Cheat(watch, result.Value, result.Compare.Value, true, Cheat.CompareType.Equal) : new Cheat(watch, result.Value)); }
// Sample Input for GB/GBC: // 010FF6C1 // Becomes: // Address C1F6 // Value 0F public static IDecodeResult Decode(string code) { if (code == null) { throw new ArgumentNullException(nameof(code)); } if (code.Length != 8 || code.Contains("-")) { return(new InvalidCheatCode("GameShark codes must be 8 characters with no dashes.")); } var test = code.Substring(0, 2); if (test != "00" && test != "01") { return(new InvalidCheatCode("All GameShark Codes for GameBoy need to start with 00 or 01")); } var result = new DecodeResult { Size = WatchSize.Byte }; code = code.Remove(0, 2); var valueStr = code.Remove(2, 4); code = code.Remove(0, 2); var addrStr = code.Remove(0, 2); addrStr += code.Remove(2, 2); result.Value = int.Parse(valueStr, NumberStyles.HexNumber); result.Address = int.Parse(addrStr, NumberStyles.HexNumber); return(result); }
public static IDecodeResult Decode(string code) { if (code == null) { throw new ArgumentNullException(nameof(code)); } if (code.IndexOf("-") != 3 && code.Length != 9) { return(new InvalidCheatCode("Action Replay Codes must be 9 characters with a dash after the third character")); } var result = new DecodeResult { Size = WatchSize.Byte }; var s = code.Remove(0, 2); var ramAddress = s.Remove(4, 2).Replace("-", ""); var ramValue = s.Remove(0, 5); result.Address = int.Parse(ramAddress, NumberStyles.HexNumber); result.Value = int.Parse(ramValue, NumberStyles.HexNumber); return(result); }
public static IDecodeResult Decode(string code) { if (code == null) { throw new ArgumentNullException(nameof(code)); } if (!code.Contains("-") && code.Length != 9) { return new InvalidCheatCode("Game genie codes must be 9 characters with a format of xxyy-yyyy"); } // 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 // XXYY-YYYY, where XX is the value, and YY-YYYY is the address. // Char # | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | // 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| Value |i|j|k|l|q|r|s|t|o|p|a|b|c|d|u|v|w|x|e|f|g|h|m|n| // order | Value |a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x| var result = new DecodeResult { Size = WatchSize.Byte }; int x; // Value if (code.Length > 0) { SNESGameGenieTable.TryGetValue(code[0], out x); result.Value = x << 4; } if (code.Length > 1) { SNESGameGenieTable.TryGetValue(code[1], out x); result.Value |= x; } // Address if (code.Length > 2) { SNESGameGenieTable.TryGetValue(code[2], out x); result.Address = x << 12; } if (code.Length > 3) { SNESGameGenieTable.TryGetValue(code[3], out x); result.Address |= x << 4; } if (code.Length > 4) { SNESGameGenieTable.TryGetValue(code[4], out x); result.Address |= (x & 0xC) << 6; result.Address |= (x & 0x3) << 22; } if (code.Length > 5) { SNESGameGenieTable.TryGetValue(code[5], out x); result.Address |= (x & 0xC) << 18; result.Address |= (x & 0x3) << 2; } if (code.Length > 6) { SNESGameGenieTable.TryGetValue(code[6], out x); result.Address |= (x & 0xC) >> 2; result.Address |= (x & 0x3) << 18; } if (code.Length > 7) { SNESGameGenieTable.TryGetValue(code[7], out x); result.Address |= (x & 0xC) << 14; result.Address |= (x & 0x3) << 10; } return result; }
public static bool IsValid(this IDecodeResult result, out DecodeResult valid) { valid = result as DecodeResult; return(result is DecodeResult); }
public static IDecodeResult Decode(string code) { if (code == null) { throw new ArgumentNullException(nameof(code)); } if (code.Length != 6 && code.Length != 8) { return(new InvalidCheatCode("Game Genie codes need to be six or eight characters in length.")); } var result = new DecodeResult { Size = WatchSize.Byte }; // char 3 bit 3 denotes the code length. if (code.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| result.Value = 0; result.Address = 0x8000; GameGenieTable.TryGetValue(code[0], out var x); result.Value |= x & 0x07; result.Value |= (x & 0x08) << 4; GameGenieTable.TryGetValue(code[1], out x); result.Value |= (x & 0x07) << 4; result.Address |= (x & 0x08) << 4; GameGenieTable.TryGetValue(code[2], out x); result.Address |= (x & 0x07) << 4; GameGenieTable.TryGetValue(code[3], out x); result.Address |= (x & 0x07) << 12; result.Address |= x & 0x08; GameGenieTable.TryGetValue(code[4], out x); result.Address |= x & 0x07; result.Address |= (x & 0x08) << 8; GameGenieTable.TryGetValue(code[5], out x); result.Address |= (x & 0x07) << 8; result.Value |= x & 0x08; } else { // 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|@|#|$| result.Value = 0; result.Address = 0x8000; result.Compare = 0; GameGenieTable.TryGetValue(code[0], out var x); result.Value |= x & 0x07; result.Value |= (x & 0x08) << 4; GameGenieTable.TryGetValue(code[1], out x); result.Value |= (x & 0x07) << 4; result.Address |= (x & 0x08) << 4; GameGenieTable.TryGetValue(code[2], out x); result.Address |= (x & 0x07) << 4; GameGenieTable.TryGetValue(code[3], out x); result.Address |= (x & 0x07) << 12; result.Address |= x & 0x08; GameGenieTable.TryGetValue(code[4], out x); result.Address |= x & 0x07; result.Address |= (x & 0x08) << 8; GameGenieTable.TryGetValue(code[5], out x); result.Address |= (x & 0x07) << 8; result.Compare |= x & 0x08; GameGenieTable.TryGetValue(code[6], out x); result.Compare |= x & 0x07; result.Compare |= (x & 0x08) << 4; GameGenieTable.TryGetValue(code[7], out x); result.Compare |= (x & 0x07) << 4; result.Value |= x & 0x08; } return(result); }
public static IDecodeResult Decode(string _code) { if (_code == null) { throw new ArgumentNullException(nameof(_code)); } if (_code.LastIndexOf("-") != 7 || _code.IndexOf("-") != 3) { return(new InvalidCheatCode("All Master System Game Genie Codes need to have a dash after the third character and seventh character.")); } // No cypher on value // Char # | 0 | 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|3|2|1|0| // maps to| Value |A|B|C|D|E|F|G|H|I|J|K|L|XOR 0xF|a|b|c|c|NotUsed|e|f|g|h| // proper | Value |XOR 0xF|A|B|C|D|E|F|G|H|I|J|K|L|g|h|a|b|Nothing|c|d|e|f| var result = new DecodeResult { Size = WatchSize.Byte }; int x; // Getting Value if (_code.Length > 0) { _gbGgGameGenieTable.TryGetValue(_code[0], out x); result.Value = x << 4; } if (_code.Length > 1) { _gbGgGameGenieTable.TryGetValue(_code[1], out x); result.Value |= x; } // Address if (_code.Length > 2) { _gbGgGameGenieTable.TryGetValue(_code[2], out x); result.Value = x << 8; } else { result.Value = -1; } if (_code.Length > 3) { _gbGgGameGenieTable.TryGetValue(_code[3], out x); result.Address |= x << 4; } if (_code.Length > 4) { _gbGgGameGenieTable.TryGetValue(_code[4], out x); result.Address |= x; } if (_code.Length > 5) { _gbGgGameGenieTable.TryGetValue(_code[5], out x); result.Address |= (x ^ 0xF) << 12; } // compare need to be full if (_code.Length > 8) { _gbGgGameGenieTable.TryGetValue(_code[6], out x); var comp = x << 2; // 8th character ignored _gbGgGameGenieTable.TryGetValue(_code[8], out x); comp |= (x & 0xC) >> 2; comp |= (x & 0x3) << 6; result.Compare = comp ^ 0xBA; } return(result); }