Added PSX and Saturn GameShark Code Support.

This commit is contained in:
hegyak 2015-11-16 06:49:00 -08:00
parent ca2a98c029
commit b3166094ca
1 changed files with 400 additions and 225 deletions

View File

@ -6,7 +6,7 @@ using System.Globalization;
namespace BizHawk.Client.EmuHawk
{
[ToolAttributes(released: true, supportedSystems: new[] { "GB", "N64" })]
[ToolAttributes(released: true, supportedSystems: new[] { "GB", "N64", "PSX", "SAT" })]
public partial class GameShark : Form, IToolForm, IToolFormAutoConfig
{
//We are using Memory Domains, so we NEED this.
@ -47,19 +47,45 @@ namespace BizHawk.Client.EmuHawk
}
private void btnGo_Click(object sender, EventArgs e)
{
//My Variables
string parseString = null;
string RAMAddress = null;
string RAMValue = null;
//What System are we running?
//We want Upper Case.
int byteSize = 0;
string testo = null;
private void btnGo_Click(object sender, EventArgs e)
{
//Reset Variables
parseString = null;
RAMAddress = null;
RAMValue = null;
byteSize = 0;
//We want Upper Case.
txtCheat.Text = txtCheat.Text.ToUpper();
string testo = txtCheat.Text.Remove(2, 11);
//This determies what kind of Code we have
testo = txtCheat.Text.Remove(2, 11);
//What System are we running?
switch (Emulator.SystemId)
{
case "GB":
GB();
break;
case "N64":
N64();
break;
case "PSX":
PSX();
break;
case "SAT":
SAT();
break;
default:
//This should NEVER happen
break;
}
}
private void GB()
{
//This Check ONLY applies to GB/GBC codes.
if (txtCheat.Text.Length != 8)
{
@ -111,9 +137,9 @@ namespace BizHawk.Client.EmuHawk
{
MessageBox.Show("An Error occured: " + ex.GetType().ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
break;
case "N64":
//These codes, more or less work without Needing much work.
}
private void N64()
{ //These codes, more or less work without Needing much work.
if (txtCheat.Text.Contains(" ") == false)
{
MessageBox.Show("All N64 GameShark Codes need to contain a space after the eighth character", "Input Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
@ -183,6 +209,8 @@ namespace BizHawk.Client.EmuHawk
case "F0":
case "F1":
case "2A":
case "3C":
case "FF":
MessageBox.Show("The code you entered is not needed by Bizhawk.", "Input Error", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
//TODO: Make Patch Code (5000XXYY) work.
@ -205,9 +233,9 @@ namespace BizHawk.Client.EmuHawk
//Address 33B21E
//Value 08FF
//Note, 8XXXXXXX 00YY
//Note, 80XXXXXX 00YY
//Is Byte, not Word
//Remove the 8X Octect
//Remove the 80 Octect
parseString = txtCheat.Text.Remove(0, 2);
//Get RAM Address
RAMAddress = parseString.Remove(6, 5);
@ -220,14 +248,14 @@ namespace BizHawk.Client.EmuHawk
//System Bus Domain, The Address to Watch, Byte size (Word), Hex Display, Description. Big Endian.
if (byteSize == 8)
{
//We have a Word (Double Byte) sized Value
//We have a Byte sized value
var watch = Watch.GenerateWatch(MemoryDomains["RDRAM"], long.Parse(RAMAddress, NumberStyles.HexNumber), Watch.WatchSize.Word, Watch.DisplayType.Hex, txtDescription.Text, true);
//Take Watch, Add our Value we want, and it should be active when addded?
Global.CheatList.Add(new Cheat(watch, int.Parse(RAMValue, NumberStyles.HexNumber)));
}
if (byteSize == 16)
{
//We have a Byte sized value
//We have a Word (Double Byte) sized Value
var watch = Watch.GenerateWatch(MemoryDomains["RDRAM"], long.Parse(RAMAddress, NumberStyles.HexNumber), Watch.WatchSize.Byte, Watch.DisplayType.Hex, txtDescription.Text, true);
//Take Watch, Add our Value we want, and it should be active when addded?
Global.CheatList.Add(new Cheat(watch, int.Parse(RAMValue, NumberStyles.HexNumber)));
@ -241,9 +269,9 @@ namespace BizHawk.Client.EmuHawk
{
MessageBox.Show("An Error occured: " + ex.GetType().ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
break;
case "PSX":
//Not yet.
}
private void PSX()
{
//These codes, more or less work without Needing much work.
if (txtCheat.Text.Contains(" ") == false)
{
@ -269,25 +297,172 @@ namespace BizHawk.Client.EmuHawk
//When value hits YYYY, make the next cheat go off
case "E0":
//E0 byteSize = 8;
case "E1":
//E1 byteSize = 8;
case "E2":
//E2 byteSize = 8;
case "D0":
//D0 byteSize = 16;
case "D1":
//D1 byteSize = 16;
case "D2":
//D2 byteSize = 16;
case "D3":
//D3 byteSize = 16;
case "D4":
//D4 byteSize = 16;
case "D5":
//D5 byteSize = 16;
case "D6":
//D6 byteSize = 16;
//Increment/Decrement Codes
case "10":
//10 byteSize = 16;
case "11":
//11 byteSize = 16;
case "20":
//20 byteSize = 8
case "21":
//21 byteSize = 8
MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
case "C0":
case "C1":
//Slow-Mo
case "40":
MessageBox.Show("The code you entered is not needed by Bizhawk.", "Input Error", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
case "C2":
case "50":
//Word?
MessageBox.Show("The code you entered is not supported by this tool. Please Submit the Game's Name, Cheat/Code and Purpose to the BizHawk forums.", "Tool Error", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
//Something wrong with their input.
default:
MessageBox.Show("The GameShark code entered is not a recognized format.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
//Leave this Method, before someone gets hurt.
return;
}
//Sample Input for PSX:
//800D10BA 0009
//Address: 0D10BA
//Value: 0009
//Remove first two octets
parseString = txtCheat.Text.Remove(0, 2);
//Get RAM Address
RAMAddress = parseString.Remove(6, 5);
//Get RAM Value
RAMValue = parseString.Remove(0, 7);
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.
//MainRAM
//My Consern is that Work RAM High may be incorrect?
if (byteSize == 8)
{
//We have a Byte sized value
var watch = Watch.GenerateWatch(MemoryDomains["MainRAM"], long.Parse(RAMAddress, NumberStyles.HexNumber), Watch.WatchSize.Word, Watch.DisplayType.Hex, txtDescription.Text, false);
//Take Watch, Add our Value we want, and it should be active when addded?
Global.CheatList.Add(new Cheat(watch, int.Parse(RAMValue, NumberStyles.HexNumber)));
}
if (byteSize == 16)
{
//We have a Word (Double Byte) sized Value
var watch = Watch.GenerateWatch(MemoryDomains["MainRAM"], long.Parse(RAMAddress, NumberStyles.HexNumber), Watch.WatchSize.Byte, Watch.DisplayType.Hex, txtDescription.Text, false);
//Take Watch, Add our Value we want, and it should be active when addded?
Global.CheatList.Add(new Cheat(watch, int.Parse(RAMValue, NumberStyles.HexNumber)));
}
//Clear old Inputs
txtCheat.Clear();
txtDescription.Clear();
}
//Someone broke the world?
catch (Exception ex)
{
MessageBox.Show("An Error occured: " + ex.GetType().ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void SAT()
{
//Not yet.
if (txtCheat.Text.Contains(" ") == false)
{
MessageBox.Show("All Saturn GameShark Cheats need to contain a space after the eighth character", "Input Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
if (txtCheat.Text.Length != 13)
{
MessageBox.Show("All Saturn GameShark Cheats need to be 13 characters in length.", "Input Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
//This is a special test. Only the first character really matters? 16 or 36?
testo = testo.Remove(1, 1);
switch (testo)
{
case "1":
byteSize = 16;
break;
case "3":
byteSize = 8;
break;
//0 writes once.
case "0":
//D is RAM Equal To Activator, do Next Value
case "D":
MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
case "F":
MessageBox.Show("The code you entered is not needed by Bizhawk.", "Input Error", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
default:
//This should NEVER happen
break;
}
MessageBox.Show("The GameShark code entered is not a recognized format.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
//Leave this Method, before someone gets hurt.
return;
}
//Sample Input for Saturn:
//160949FC 0090
//Address: 0949FC
//Value: 90
//Note, 3XXXXXXX are Big Endian
//Remove first two octets
parseString = txtCheat.Text.Remove(0, 2);
//Get RAM Address
RAMAddress = parseString.Remove(6, 5);
//Get RAM Value
RAMValue = parseString.Remove(0, 7);
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.
//My Consern is that Work RAM High may be incorrect?
if (byteSize == 8)
{
//We have a Byte sized value
var watch = Watch.GenerateWatch(MemoryDomains["Work Ram High"], long.Parse(RAMAddress, NumberStyles.HexNumber), Watch.WatchSize.Word, Watch.DisplayType.Hex, txtDescription.Text, true);
//Take Watch, Add our Value we want, and it should be active when addded?
Global.CheatList.Add(new Cheat(watch, int.Parse(RAMValue, NumberStyles.HexNumber)));
}
if (byteSize == 16)
{
//We have a Word (Double Byte) sized Value
var watch = Watch.GenerateWatch(MemoryDomains["Work Ram High"], long.Parse(RAMAddress, NumberStyles.HexNumber), Watch.WatchSize.Byte, Watch.DisplayType.Hex, txtDescription.Text, true);
//Take Watch, Add our Value we want, and it should be active when addded?
Global.CheatList.Add(new Cheat(watch, int.Parse(RAMValue, NumberStyles.HexNumber)));
}
//Clear old Inputs
txtCheat.Clear();
txtDescription.Clear();
}
//Someone broke the world?
catch (Exception ex)
{
MessageBox.Show("An Error occured: " + ex.GetType().ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void btnClear_Click(object sender, EventArgs e)
{
//Clear old Inputs