OpCodeT16MemImm5.cs 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. using ARMeilleure.Instructions;
  2. using System;
  3. namespace ARMeilleure.Decoders
  4. {
  5. class OpCodeT16MemImm5 : OpCodeT16, IOpCode32Mem
  6. {
  7. public int Rt { get; }
  8. public int Rn { get; }
  9. public bool WBack => false;
  10. public bool IsLoad { get; }
  11. public bool Index => true;
  12. public bool Add => true;
  13. public int Immediate { get; }
  14. public new static OpCode Create(InstDescriptor inst, ulong address, int opCode) => new OpCodeT16MemImm5(inst, address, opCode);
  15. public OpCodeT16MemImm5(InstDescriptor inst, ulong address, int opCode) : base(inst, address, opCode)
  16. {
  17. Rt = (opCode >> 0) & 7;
  18. Rn = (opCode >> 3) & 7;
  19. switch (inst.Name)
  20. {
  21. case InstName.Ldr:
  22. case InstName.Ldrb:
  23. case InstName.Ldrh:
  24. IsLoad = true;
  25. break;
  26. case InstName.Str:
  27. case InstName.Strb:
  28. case InstName.Strh:
  29. IsLoad = false;
  30. break;
  31. }
  32. switch (inst.Name)
  33. {
  34. case InstName.Str:
  35. case InstName.Ldr:
  36. Immediate = ((opCode >> 6) & 0x1f) << 2;
  37. break;
  38. case InstName.Strb:
  39. case InstName.Ldrb:
  40. Immediate = ((opCode >> 6) & 0x1f);
  41. break;
  42. case InstName.Strh:
  43. case InstName.Ldrh:
  44. Immediate = ((opCode >> 6) & 0x1f) << 1;
  45. break;
  46. default:
  47. throw new InvalidOperationException();
  48. }
  49. }
  50. }
  51. }