private bool DebugParameters()
{
int lineNumber = 1;
foreach (string line in scripts[tabControl1.SelectedIndex].Lines)
{
if (!line.Equals("") && !line.StartsWith("#") && !line.StartsWith("="))
{
string newLine = line;
if (line.Contains(commentString))
{
newLine = Regex.Split(newLine, commentString)[0].TrimEnd();
}
string[] info = newLine.Split(' ');
Command c;
bool success = commands.TryGetValue(info[0].ToUpper(), out c);
if (success)
{
byte[] parameterLengths = c.ParameterLengths;
for (int parameterIndex = 0; parameterIndex < c.NumberOfParameters; parameterIndex++)
{
if (c.HexID == 0x89 && parameterIndex == 0)
{
byte paramTwo;
if (info[2].ToUpper().Equals("TRUE"))
{
paramTwo = 0x40;
}
else if (info[2].ToUpper().Equals("FALSE"))
{
paramTwo = 0;
}
else
{
paramTwo = ParseByteParameter(info[2], lineNumber, 2).Byte;
if (paramTwo != 0x40)
{
paramTwo = 0;
}
}
byte byteOne = (byte)((int)ParseByteParameter(info[1], lineNumber, 1).Byte | (int)paramTwo);
bool value = ParseByteParameter(info[1], lineNumber, 1).Result;
if (!value)
{
MessageBox.Show("Parameter " + (parameterIndex + 1) + " on line " + lineNumber + " is invalid. Maximum value is 0xFFFF or 65535.");
return false;
}
parameterIndex++;
}
else
{
switch (parameterLengths[parameterIndex])
{
case 2:
{
ReturnWorked test = ParseHalfWordParameter(info[parameterIndex + 1], lineNumber, parameterIndex);
if (!test.Result)
{
if (test.GeneralReason == null)
{
MessageBox.Show("Parameter " + (parameterIndex + 1) + " on line " + lineNumber + " is too long. Maximum value is 0xFF or 255.");
}
else
{
MessageBox.Show(test.GeneralReason);
}
return false;
}
break;
}
case 4:
{
ReturnWorked test = ParseWordParameter(info[parameterIndex + 1], lineNumber, parameterIndex, true);
if (!test.Result)
{
if (test.GeneralReason == null)
{
MessageBox.Show("Parameter " + (parameterIndex + 1) + " on line " + lineNumber + " is too long. Maximum value is 0xFF or 255.");
}
else
{
MessageBox.Show(test.GeneralReason);
}
return false;
}
break;
}
default:
{
ReturnWorked test = ParseByteParameter(info[parameterIndex + 1], lineNumber, parameterIndex);
if (!test.Result)
{
if (test.GeneralReason == null)
{
MessageBox.Show("Parameter " + (parameterIndex + 1) + " on line " + lineNumber + " is too long. Maximum value is 0xFF or 255.");
}
else
{
MessageBox.Show(test.GeneralReason);
}
return false;
}
break;
}
}
}
}
}
else
{
SQLiteConnection con = new SQLiteConnection("Data Source=" + System.Windows.Forms.Application.StartupPath + @"\Data\Commands.sqlite;Version=3;");
con.Open();
SQLiteCommand com = new SQLiteCommand("select * from commands where name = '" + info[0].ToUpper() + "'", con);
SQLiteDataReader reader = com.ExecuteReader();
if (reader != null)
{
c = GetCommand(reader, con);
byte[] parameterLengths = c.ParameterLengths;
for (int parameterIndex = 0; parameterIndex < c.NumberOfParameters; parameterIndex++)
{
if (c.HexID == 0x89 && parameterIndex == 0)
{
byte paramTwo;
if (info[2].ToUpper().Equals("TRUE"))
{
paramTwo = 0x40;
}
else if (info[2].ToUpper().Equals("FALSE"))
{
paramTwo = 0;
}
else
{
paramTwo = ParseByteParameter(info[2], lineNumber, 2).Byte;
if (paramTwo != 0x40)
{
paramTwo = 0;
}
}
byte byteOne = (byte)((int)ParseByteParameter(info[1], lineNumber, 1).Byte | (int)paramTwo);
bool value = ParseByteParameter(info[1], lineNumber, 1).Result;
if (!value)
{
MessageBox.Show("Parameter " + (parameterIndex + 1) + " on line " + lineNumber + " is invalid. Maximum value is 0xFFFF or 65535.");
return false;
}
parameterIndex++;
}
else
{
switch (parameterLengths[parameterIndex])
{
case 2:
{
ReturnWorked test = ParseHalfWordParameter(info[parameterIndex + 1], lineNumber, parameterIndex);
if (!test.Result)
{
if (test.GeneralReason == null)
{
MessageBox.Show("Parameter " + (parameterIndex + 1) + " on line " + lineNumber + " is too long. Maximum value is 0xFFFFFFFF or 4294967295.");
}
else
{
MessageBox.Show(test.GeneralReason);
}
return false;
}
break;
}
case 4:
{
ReturnWorked test = ParseWordParameter(info[parameterIndex + 1], lineNumber, parameterIndex, true);
if (!test.Result)
{
if (test.GeneralReason == null)
{
MessageBox.Show("Parameter " + (parameterIndex + 1) + " on line " + lineNumber + " is too long. Maximum value is 0xFFFFFFFF or 4294967295.");
}
else
{
MessageBox.Show(test.GeneralReason);
}
return false;
}
break;
}
default:
{
ReturnWorked test = ParseByteParameter(info[parameterIndex + 1], lineNumber, parameterIndex);
if (!test.Result)
{
if (test.GeneralReason == null)
{
MessageBox.Show("Parameter " + (parameterIndex + 1) + " on line " + lineNumber + " is too long. Maximum value is 0xFFFFFFFF or 4294967295.");
}
else
{
MessageBox.Show(test.GeneralReason);
}
return false;
}
break;
}
}
}
}
}
else
{
con.Close();
SuperCommand sc;
success = superCommands.TryGetValue(info[0].ToUpper(), out sc);
if (success)
{
byte[] parameterLengths = sc.ParameterLengths;
for (int parameterIndex = 0; parameterIndex < sc.NumberOfParameters; parameterIndex++)
{
switch (parameterLengths[parameterIndex])
{
case 2:
{
ReturnWorked test = ParseHalfWordParameter(info[parameterIndex + 1], lineNumber, parameterIndex);
if (!test.Result)
{
MessageBox.Show("Parameter " + (parameterIndex + 1) + " on line " + lineNumber + " is too long. Maximum value is 0xFFFF or 65535.");
return false;
}
break;
}
case 4:
{
ReturnWorked test = ParseWordParameter(info[parameterIndex + 1], lineNumber, parameterIndex, true);
if (!test.Result && test.PointerName == null)
{
MessageBox.Show("Parameter " + (parameterIndex + 1) + " on line " + lineNumber + " is too long. Maximum value is 0xFFFFFFFF or 4294967295.");
return false;
}
else if (!test.Result && test.PointerName != null)
{
MessageBox.Show("Parameter " + (parameterIndex + 1) + " on line " + lineNumber + " is a dynamic pointer. Dynamic pointers cannot be used without first defining a dynamic search location.");
return false;
}
break;
}
default:
{
ReturnWorked test = ParseByteParameter(info[parameterIndex + 1], lineNumber, parameterIndex);
if (!test.Result)
{
MessageBox.Show("Parameter " + (parameterIndex + 1) + " on line " + lineNumber + " is too long. Maximum value is 0xFF or 255.");
return false;
}
break;
}
}
}
}
}
}
}
else if (line.StartsWith("#"))
{
string[] theLine = line.Split(' ');
switch (theLine[0])
{
case "#define":
{
int temp = 0;
bool success = Int32.TryParse(theLine[2], out temp);
if (success)
{
try
{
userDefinitions.Add(theLine[1].ToUpper(), UInt32.Parse(theLine[2]));
}
catch (FormatException)
{
MessageBox.Show("A number was expected for parameter 2 of the definition");
}
catch
{
MessageBox.Show("There was an unknown error with the custom definition");
}
}
else
{
try
{
userDefinitions.Add(theLine[1].ToUpper(), UInt32.Parse(ToDecimal(theLine[2])));
}
catch (FormatException)
{
MessageBox.Show("A number was expected for parameter 2 of the definition");
}
catch
{
MessageBox.Show("There was an unknown error with the custom definition");
}
}
break;
}
case "#org":
string[] splitLine = line.Split(' ');
if (splitLine[1].StartsWith("@"))
{
pointerNames.Add(new DynamicPointer(line.Split(' ')[1].Substring(1), lineNumber, 1), false);
insideHashOrgBracket = true;
if (!dynamicLocationSet)
{
MessageBox.Show("#org on line " + lineNumber + " references a non existant dynamic location.");
return false;
}
}
break;
case "#dynamic":
{
freeSpaceLocation = 0x720000;
ReturnWorked result = ParseWordParameter(theLine[1], lineNumber, 1, false);
if (!result.Result)
{
MessageBox.Show(result.PointerName);
return false;
}
dynamicLocationSet = true;
break;
}
case "#include":
string filePath = System.Windows.Forms.Application.StartupPath + @"\Data\" + theLine[1];
if (!filePath.EndsWith(".bsh"))
{
filePath += ".bsh";
}
if (!File.Exists(filePath))
{
MessageBox.Show("The included header file could not be found.");
break;
}
else
{
if (!theLine[1].Equals("std"))
{
string[] rbhFile = File.ReadAllLines(filePath);
ParseHeaderFile(rbhFile);
}
}
break;
case "#freespacebyte":
{
byte temp = 0;
bool success = Byte.TryParse(theLine[1], out temp);
if (!success)
{
success = Byte.TryParse(ToDecimal(theLine[1]), out temp);
if (!success)
{
MessageBox.Show("Error. Free space byte could not be parsed from script.");
}
}
}
break;
default:
break;
}
}
lineNumber++;
}
return true;
}