diff options
Diffstat (limited to 'src/Ryujinx.HLE/HOS/Tamper/CompilationContext.cs')
-rw-r--r-- | src/Ryujinx.HLE/HOS/Tamper/CompilationContext.cs | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/src/Ryujinx.HLE/HOS/Tamper/CompilationContext.cs b/src/Ryujinx.HLE/HOS/Tamper/CompilationContext.cs new file mode 100644 index 00000000..45a47f44 --- /dev/null +++ b/src/Ryujinx.HLE/HOS/Tamper/CompilationContext.cs @@ -0,0 +1,75 @@ +using Ryujinx.HLE.HOS.Tamper.Operations; +using System.Collections.Generic; + +namespace Ryujinx.HLE.HOS.Tamper +{ + class CompilationContext + { + public OperationBlock CurrentBlock => BlockStack.Peek(); + public List<IOperation> CurrentOperations => CurrentBlock.Operations; + + public ITamperedProcess Process { get; } + public Parameter<long> PressedKeys { get; } + public Stack<OperationBlock> BlockStack { get; } + public Dictionary<byte, Register> Registers { get; } + public Dictionary<byte, Register> SavedRegisters { get; } + public Dictionary<byte, Register> StaticRegisters { get; } + public ulong ExeAddress { get; } + public ulong HeapAddress { get; } + public ulong AliasAddress { get; } + public ulong AslrAddress { get; } + + public CompilationContext(ulong exeAddress, ulong heapAddress, ulong aliasAddress, ulong aslrAddress, ITamperedProcess process) + { + Process = process; + PressedKeys = new Parameter<long>(0); + BlockStack = new Stack<OperationBlock>(); + Registers = new Dictionary<byte, Register>(); + SavedRegisters = new Dictionary<byte, Register>(); + StaticRegisters = new Dictionary<byte, Register>(); + ExeAddress = exeAddress; + HeapAddress = heapAddress; + AliasAddress = aliasAddress; + AslrAddress = aslrAddress; + } + + public Register GetRegister(byte index) + { + if (Registers.TryGetValue(index, out Register register)) + { + return register; + } + + register = new Register($"R_{index:X2}"); + Registers.Add(index, register); + + return register; + } + + public Register GetSavedRegister(byte index) + { + if (SavedRegisters.TryGetValue(index, out Register register)) + { + return register; + } + + register = new Register($"S_{index:X2}"); + SavedRegisters.Add(index, register); + + return register; + } + + public Register GetStaticRegister(byte index) + { + if (SavedRegisters.TryGetValue(index, out Register register)) + { + return register; + } + + register = new Register($"T_{index:X2}"); + SavedRegisters.Add(index, register); + + return register; + } + } +} |