CpuTest.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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 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, int Fpcr = 0x0)
  47. {
  48. Thread.ThreadState.X0 = X0;
  49. Thread.ThreadState.X1 = X1;
  50. Thread.ThreadState.X2 = X2;
  51. Thread.ThreadState.X31 = X31;
  52. Thread.ThreadState.V0 = V0;
  53. Thread.ThreadState.V1 = V1;
  54. Thread.ThreadState.V2 = V2;
  55. Thread.ThreadState.Overflow = Overflow;
  56. Thread.ThreadState.Carry = Carry;
  57. Thread.ThreadState.Zero = Zero;
  58. Thread.ThreadState.Negative = Negative;
  59. Thread.ThreadState.Fpcr = Fpcr;
  60. }
  61. protected void ExecuteOpcodes()
  62. {
  63. using (ManualResetEvent Wait = new ManualResetEvent(false))
  64. {
  65. Thread.ThreadState.Break += (sender, e) => Thread.StopExecution();
  66. Thread.WorkFinished += (sender, e) => Wait.Set();
  67. Thread.Execute();
  68. Wait.WaitOne();
  69. }
  70. }
  71. protected AThreadState GetThreadState()
  72. {
  73. return Thread.ThreadState;
  74. }
  75. protected AThreadState SingleOpcode(uint Opcode,
  76. ulong X0 = 0, ulong X1 = 0, ulong X2 = 0, ulong X31 = 0,
  77. AVec V0 = default(AVec), AVec V1 = default(AVec), AVec V2 = default(AVec),
  78. bool Overflow = false, bool Carry = false, bool Zero = false, bool Negative = false, int Fpcr = 0x0)
  79. {
  80. this.Opcode(Opcode);
  81. this.Opcode(0xD4200000); // BRK #0
  82. this.Opcode(0xD65F03C0); // RET
  83. SetThreadState(X0, X1, X2, X31, V0, V1, V2, Overflow, Carry, Zero, Negative, Fpcr);
  84. ExecuteOpcodes();
  85. return GetThreadState();
  86. }
  87. }
  88. }