ARM.EnetUtils.Mod 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. MODULE EnetUtils;
  2. IMPORT
  3. S := SYSTEM;
  4. TYPE
  5. Int8 = SHORTINT;
  6. Int16 = INTEGER;
  7. Int32 = LONGINT;
  8. UnalignedInt32* = ARRAY 4 OF Int8;
  9. (** Switch endianness of a 16-bit integer *)
  10. PROCEDURE -SwitchEndianness16*(x: Int16): Int16;
  11. CODE
  12. LDRH R0, [SP,#x]
  13. REV16 R0, R0
  14. ADD SP, SP, #4 ; account for 4-byte alignment done by the compiler
  15. (*TYPE Byte16 = ARRAY 2 OF Int8;
  16. VAR xx, yy: Byte16;
  17. BEGIN
  18. xx := S.VAL(Byte16,x);
  19. yy[0] := xx[1]; yy[1] := xx[0];
  20. RETURN S.VAL(Int16,yy);*)
  21. END SwitchEndianness16;
  22. (** Switch endianness of a 32-bit integer *)
  23. PROCEDURE -SwitchEndianness32*(x: Int32): Int32;
  24. CODE
  25. LDR R0, [SP,#x]
  26. REV R0, R0
  27. ADD SP, SP, #4
  28. (*TYPE Byte32 = ARRAY 4 OF Int8;
  29. VAR xx, yy: Byte32;
  30. BEGIN
  31. xx := S.VAL(Byte32,x);
  32. yy[0] := xx[3]; yy[1] := xx[2]; yy[2] := xx[1]; yy[3] := xx[0];
  33. RETURN S.VAL(Int32,yy);*)
  34. END SwitchEndianness32;
  35. OPERATOR -":="*(VAR y: Int32; x: UnalignedInt32);
  36. CODE
  37. LDR R0, [SP,#y]
  38. LDRB R1, [SP,#x]
  39. LDRB R2, [SP,#x+1]
  40. LDRB R3, [SP,#x+2]
  41. LDRB R4, [SP,#x+3]
  42. ADD R1, R1, R2, LSL #8
  43. ADD R1, R1, R3, LSL #16
  44. ADD R1, R1, R4, LSL #24
  45. STR R1, [R0,#0]
  46. ADD SP, SP, 8
  47. (*BEGIN
  48. S.MOVE(ADDRESSOF(x),ADDRESSOF(y),SIZEOF(Int32));*)
  49. END ":=";
  50. OPERATOR -":="*(VAR y: UnalignedInt32; x: Int32);
  51. CODE
  52. LDR R0, [SP,#y]
  53. LDR R1, [SP,#x]
  54. LSR R2, R1, #8
  55. LSR R3, R1, #16
  56. LSR R4, R1, #24
  57. STRB R1, [R0,#0]
  58. STRB R2, [R0,#1]
  59. STRB R3, [R0,#2]
  60. STRB R4, [R0,#3]
  61. ADD SP, SP, 8
  62. (*BEGIN
  63. S.MOVE(ADDRESSOF(x),ADDRESSOF(y),SIZEOF(Int32));*)
  64. END ":=";
  65. OPERATOR "="*(x: Int32; y: UnalignedInt32): BOOLEAN;
  66. VAR y1: Int32;
  67. BEGIN
  68. S.MOVE(ADDRESSOF(y),ADDRESSOF(y1),SIZEOF(Int32));
  69. RETURN x = y1;
  70. END "=";
  71. OPERATOR "="*(x: UnalignedInt32; y: Int32): BOOLEAN;
  72. VAR x1: Int32;
  73. BEGIN
  74. S.MOVE(ADDRESSOF(x),ADDRESSOF(x1),SIZEOF(Int32));
  75. RETURN x1 = y;
  76. END "=";
  77. END EnetUtils.