diff options
Diffstat (limited to 'Ryujinx.Tests/Cpu/CpuTest32.cs')
-rw-r--r-- | Ryujinx.Tests/Cpu/CpuTest32.cs | 41 |
1 files changed, 40 insertions, 1 deletions
diff --git a/Ryujinx.Tests/Cpu/CpuTest32.cs b/Ryujinx.Tests/Cpu/CpuTest32.cs index 5d24af39..7fa9ba09 100644 --- a/Ryujinx.Tests/Cpu/CpuTest32.cs +++ b/Ryujinx.Tests/Cpu/CpuTest32.cs @@ -106,6 +106,18 @@ namespace Ryujinx.Tests.Cpu _currAddress += 4; } + protected void ThumbOpcode(ushort opcode) + { + _memory.Write(_currAddress, opcode); + + if (_unicornAvailable) + { + _unicornEmu.MemoryWrite16(_currAddress, opcode); + } + + _currAddress += 2; + } + protected ExecutionContext GetContext() => _context; protected void SetContext(uint r0 = 0, @@ -126,7 +138,8 @@ namespace Ryujinx.Tests.Cpu bool carry = false, bool zero = false, bool negative = false, - int fpscr = 0) + int fpscr = 0, + bool thumb = false) { _context.SetX(0, r0); _context.SetX(1, r1); @@ -151,6 +164,8 @@ namespace Ryujinx.Tests.Cpu SetFpscr((uint)fpscr); + _context.SetPstateFlag(PState.TFlag, thumb); + if (_unicornAvailable) { _unicornEmu.R[0] = r0; @@ -175,6 +190,8 @@ namespace Ryujinx.Tests.Cpu _unicornEmu.NegativeFlag = negative; _unicornEmu.Fpscr = fpscr; + + _unicornEmu.ThumbFlag = thumb; } } @@ -218,6 +235,28 @@ namespace Ryujinx.Tests.Cpu return GetContext(); } + protected ExecutionContext SingleThumbOpcode(ushort opcode, + uint r0 = 0, + uint r1 = 0, + uint r2 = 0, + uint r3 = 0, + uint sp = 0, + bool saturation = false, + bool overflow = false, + bool carry = false, + bool zero = false, + bool negative = false, + int fpscr = 0, + bool runUnicorn = true) + { + ThumbOpcode(opcode); + ThumbOpcode(0x4770); // BX LR + SetContext(r0, r1, r2, r3, sp, default, default, default, default, default, default, default, default, saturation, overflow, carry, zero, negative, fpscr, thumb: true); + ExecuteOpcodes(runUnicorn); + + return GetContext(); + } + protected void SetWorkingMemory(uint offset, byte[] data) { _memory.Write(DataBaseAddress + offset, data); |