CpuTest.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. using ChocolArm64;
  2. using ChocolArm64.Memory;
  3. using ChocolArm64.State;
  4. using NUnit.Framework;
  5. using System.Threading;
  6. namespace Ryujinx.Tests.Cpu
  7. {
  8. [TestFixture]
  9. public class CpuTest
  10. {
  11. protected long Position { get; private set; }
  12. private long Size;
  13. private long EntryPoint;
  14. private AMemory Memory;
  15. private AThread Thread;
  16. [SetUp]
  17. public void Setup()
  18. {
  19. Position = 0x0;
  20. Size = 0x1000;
  21. EntryPoint = Position;
  22. ATranslator Translator = new ATranslator();
  23. Memory = new AMemory();
  24. Memory.Manager.Map(Position, Size, 2, AMemoryPerm.Read | AMemoryPerm.Write | AMemoryPerm.Execute);
  25. Thread = new AThread(Translator, Memory, EntryPoint);
  26. }
  27. [TearDown]
  28. public void Teardown()
  29. {
  30. Memory.Dispose();
  31. Thread = null;
  32. Memory = null;
  33. }
  34. protected void Reset()
  35. {
  36. Teardown();
  37. Setup();
  38. }
  39. protected void Opcode(uint Opcode)
  40. {
  41. Thread.Memory.WriteUInt32Unchecked(Position, Opcode);
  42. Position += 4;
  43. }
  44. protected void SetThreadState(ulong X0 = 0, ulong X1 = 0, ulong X2 = 0, ulong X3 = 0, ulong X31 = 0,
  45. AVec V0 = default(AVec), AVec V1 = default(AVec), AVec V2 = default(AVec),
  46. bool Overflow = false, bool Carry = false, bool Zero = false, bool Negative = false,
  47. int Fpcr = 0x0, int Fpsr = 0x0)
  48. {
  49. Thread.ThreadState.X0 = X0;
  50. Thread.ThreadState.X1 = X1;
  51. Thread.ThreadState.X2 = X2;
  52. Thread.ThreadState.X3 = X3;
  53. Thread.ThreadState.X31 = X31;
  54. Thread.ThreadState.V0 = V0;
  55. Thread.ThreadState.V1 = V1;
  56. Thread.ThreadState.V2 = V2;
  57. Thread.ThreadState.Overflow = Overflow;
  58. Thread.ThreadState.Carry = Carry;
  59. Thread.ThreadState.Zero = Zero;
  60. Thread.ThreadState.Negative = Negative;
  61. Thread.ThreadState.Fpcr = Fpcr;
  62. Thread.ThreadState.Fpsr = Fpsr;
  63. }
  64. protected void ExecuteOpcodes()
  65. {
  66. using (ManualResetEvent Wait = new ManualResetEvent(false))
  67. {
  68. Thread.ThreadState.Break += (sender, e) => Thread.StopExecution();
  69. Thread.WorkFinished += (sender, e) => Wait.Set();
  70. Thread.Execute();
  71. Wait.WaitOne();
  72. }
  73. }
  74. protected AThreadState GetThreadState()
  75. {
  76. return Thread.ThreadState;
  77. }
  78. protected AThreadState SingleOpcode(uint Opcode,
  79. ulong X0 = 0, ulong X1 = 0, ulong X2 = 0, ulong X3 = 0, ulong X31 = 0,
  80. AVec V0 = default(AVec), AVec V1 = default(AVec), AVec V2 = default(AVec),
  81. bool Overflow = false, bool Carry = false, bool Zero = false, bool Negative = false,
  82. int Fpcr = 0x0, int Fpsr = 0x0)
  83. {
  84. this.Opcode(Opcode);
  85. this.Opcode(0xD4200000); // BRK #0
  86. this.Opcode(0xD65F03C0); // RET
  87. SetThreadState(X0, X1, X2, X3, X31, V0, V1, V2, Overflow, Carry, Zero, Negative, Fpcr, Fpsr);
  88. ExecuteOpcodes();
  89. return GetThreadState();
  90. }
  91. }
  92. }