public static void SetArgumentsToCpuThreadState(CpuThreadState CpuThreadState, uint Function, params object[] Arguments)
{
int GprIndex = 4;
//int FprIndex = 0;
Action<int> GprAlign = (int Alignment) =>
{
GprIndex = (int)MathUtils.NextAligned((uint)GprIndex, Alignment);
};
foreach (var Argument in Arguments)
{
var ArgumentType = Argument.GetType();
if (ArgumentType == typeof(uint))
{
GprAlign(1);
CpuThreadState.GPR[GprIndex++] = (int)(uint)Argument;
}
else if (ArgumentType == typeof(int))
{
GprAlign(1);
CpuThreadState.GPR[GprIndex++] = (int)Argument;
}
else if (ArgumentType == typeof(PspPointer))
{
GprAlign(1);
CpuThreadState.GPR[GprIndex++] = (int)(uint)(PspPointer)Argument;
}
else if (ArgumentType.IsEnum)
{
GprAlign(1);
CpuThreadState.GPR[GprIndex++] = Convert.ToInt32(Argument);
}
else
{
throw (new NotImplementedException(String.Format("Can't handle type '{0}'", ArgumentType)));
}
}
CpuThreadState.PC = Function;
//Console.Error.WriteLine(CpuThreadState);
//CpuThreadState.DumpRegisters(Console.Error);
}