CompilationContext.cs 2.5 KB

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