Block.cs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. using System;
  2. using System.Collections.Generic;
  3. namespace ARMeilleure.Decoders
  4. {
  5. class Block
  6. {
  7. public ulong Address { get; set; }
  8. public ulong EndAddress { get; set; }
  9. public Block Next { get; set; }
  10. public Block Branch { get; set; }
  11. public bool Exit { get; set; }
  12. public List<OpCode> OpCodes { get; }
  13. public Block()
  14. {
  15. OpCodes = new List<OpCode>();
  16. }
  17. public Block(ulong address) : this()
  18. {
  19. Address = address;
  20. }
  21. public void Split(Block rightBlock)
  22. {
  23. int splitIndex = BinarySearch(OpCodes, rightBlock.Address);
  24. if (OpCodes[splitIndex].Address < rightBlock.Address)
  25. {
  26. splitIndex++;
  27. }
  28. int splitCount = OpCodes.Count - splitIndex;
  29. if (splitCount <= 0)
  30. {
  31. throw new ArgumentException("Can't split at right block address.");
  32. }
  33. rightBlock.EndAddress = EndAddress;
  34. rightBlock.Next = Next;
  35. rightBlock.Branch = Branch;
  36. rightBlock.OpCodes.AddRange(OpCodes.GetRange(splitIndex, splitCount));
  37. EndAddress = rightBlock.Address;
  38. Next = rightBlock;
  39. Branch = null;
  40. OpCodes.RemoveRange(splitIndex, splitCount);
  41. }
  42. private static int BinarySearch(List<OpCode> opCodes, ulong address)
  43. {
  44. int left = 0;
  45. int middle = 0;
  46. int right = opCodes.Count - 1;
  47. while (left <= right)
  48. {
  49. int size = right - left;
  50. middle = left + (size >> 1);
  51. OpCode opCode = opCodes[middle];
  52. if (address == (ulong)opCode.Address)
  53. {
  54. break;
  55. }
  56. if (address < (ulong)opCode.Address)
  57. {
  58. right = middle - 1;
  59. }
  60. else
  61. {
  62. left = middle + 1;
  63. }
  64. }
  65. return middle;
  66. }
  67. public OpCode GetLastOp()
  68. {
  69. if (OpCodes.Count > 0)
  70. {
  71. return OpCodes[OpCodes.Count - 1];
  72. }
  73. return null;
  74. }
  75. }
  76. }