CompilationContext.cs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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 CompilationContext(ulong exeAddress, ulong heapAddress, ITamperedProcess process)
  22. {
  23. Process = process;
  24. PressedKeys = new Parameter<long>(0);
  25. BlockStack = new Stack<OperationBlock>();
  26. Registers = new Dictionary<byte, Register>();
  27. SavedRegisters = new Dictionary<byte, Register>();
  28. StaticRegisters = new Dictionary<byte, Register>();
  29. ExeAddress = exeAddress;
  30. HeapAddress = heapAddress;
  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. }