CompilationContext.cs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. using Ryujinx.HLE.HOS.Tamper.Operations;
  2. using System.Collections.Generic;
  3. namespace Ryujinx.HLE.HOS.Tamper
  4. {
  5. class CompilationContext
  6. {
  7. public OperationBlock CurrentBlock => BlockStack.Peek();
  8. public List<IOperation> CurrentOperations => CurrentBlock.Operations;
  9. public ITamperedProcess Process { get; }
  10. public Parameter<long> PressedKeys { get; }
  11. public Stack<OperationBlock> BlockStack { get; }
  12. public Dictionary<byte, Register> Registers { get; }
  13. public Dictionary<byte, Register> SavedRegisters { get; }
  14. public Dictionary<byte, Register> StaticRegisters { get; }
  15. public ulong ExeAddress { get; }
  16. public ulong HeapAddress { get; }
  17. public ulong AliasAddress { get; }
  18. public ulong AslrAddress { get; }
  19. public CompilationContext(ulong exeAddress, ulong heapAddress, ulong aliasAddress, ulong aslrAddress, ITamperedProcess process)
  20. {
  21. Process = process;
  22. PressedKeys = new Parameter<long>(0);
  23. BlockStack = new Stack<OperationBlock>();
  24. Registers = new Dictionary<byte, Register>();
  25. SavedRegisters = new Dictionary<byte, Register>();
  26. StaticRegisters = new Dictionary<byte, Register>();
  27. ExeAddress = exeAddress;
  28. HeapAddress = heapAddress;
  29. AliasAddress = aliasAddress;
  30. AslrAddress = aslrAddress;
  31. }
  32. public Register GetRegister(byte index)
  33. {
  34. if (Registers.TryGetValue(index, out Register register))
  35. {
  36. return register;
  37. }
  38. register = new Register($"R_{index:X2}");
  39. Registers.Add(index, register);
  40. return register;
  41. }
  42. public Register GetSavedRegister(byte index)
  43. {
  44. if (SavedRegisters.TryGetValue(index, out Register register))
  45. {
  46. return register;
  47. }
  48. register = new Register($"S_{index:X2}");
  49. SavedRegisters.Add(index, register);
  50. return register;
  51. }
  52. public Register GetStaticRegister(byte index)
  53. {
  54. if (SavedRegisters.TryGetValue(index, out Register register))
  55. {
  56. return register;
  57. }
  58. register = new Register($"T_{index:X2}");
  59. SavedRegisters.Add(index, register);
  60. return register;
  61. }
  62. }
  63. }