1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- MODULE EnetUtils;
- IMPORT
- S := SYSTEM;
- TYPE
- Int8 = SHORTINT;
- Int16 = INTEGER;
- Int32 = LONGINT;
- UnalignedInt32* = ARRAY 4 OF Int8;
- (** Switch endianness of a 16-bit integer *)
- PROCEDURE -SwitchEndianness16*(x: Int16): Int16;
- CODE
- LDRH R0, [SP,#x]
- REV16 R0, R0
- ADD SP, SP, #4 ; account for 4-byte alignment done by the compiler
- (*TYPE Byte16 = ARRAY 2 OF Int8;
- VAR xx, yy: Byte16;
- BEGIN
- xx := S.VAL(Byte16,x);
- yy[0] := xx[1]; yy[1] := xx[0];
- RETURN S.VAL(Int16,yy);*)
- END SwitchEndianness16;
- (** Switch endianness of a 32-bit integer *)
- PROCEDURE -SwitchEndianness32*(x: Int32): Int32;
- CODE
- LDR R0, [SP,#x]
- REV R0, R0
- ADD SP, SP, #4
- (*TYPE Byte32 = ARRAY 4 OF Int8;
- VAR xx, yy: Byte32;
- BEGIN
- xx := S.VAL(Byte32,x);
- yy[0] := xx[3]; yy[1] := xx[2]; yy[2] := xx[1]; yy[3] := xx[0];
- RETURN S.VAL(Int32,yy);*)
- END SwitchEndianness32;
- OPERATOR -":="*(VAR y: Int32; x: UnalignedInt32);
- CODE
- LDR R0, [SP,#y]
- LDRB R1, [SP,#x]
- LDRB R2, [SP,#x+1]
- LDRB R3, [SP,#x+2]
- LDRB R4, [SP,#x+3]
- ADD R1, R1, R2, LSL #8
- ADD R1, R1, R3, LSL #16
- ADD R1, R1, R4, LSL #24
- STR R1, [R0,#0]
- ADD SP, SP, 8
- (*BEGIN
- S.MOVE(ADDRESSOF(x),ADDRESSOF(y),SIZEOF(Int32));*)
- END ":=";
- OPERATOR -":="*(VAR y: UnalignedInt32; x: Int32);
- CODE
- LDR R0, [SP,#y]
- LDR R1, [SP,#x]
- LSR R2, R1, #8
- LSR R3, R1, #16
- LSR R4, R1, #24
-
- STRB R1, [R0,#0]
- STRB R2, [R0,#1]
- STRB R3, [R0,#2]
- STRB R4, [R0,#3]
- ADD SP, SP, 8
- (*BEGIN
- S.MOVE(ADDRESSOF(x),ADDRESSOF(y),SIZEOF(Int32));*)
- END ":=";
- OPERATOR "="*(x: Int32; y: UnalignedInt32): BOOLEAN;
- VAR y1: Int32;
- BEGIN
- S.MOVE(ADDRESSOF(y),ADDRESSOF(y1),SIZEOF(Int32));
- RETURN x = y1;
- END "=";
- OPERATOR "="*(x: UnalignedInt32; y: Int32): BOOLEAN;
- VAR x1: Int32;
- BEGIN
- S.MOVE(ADDRESSOF(x),ADDRESSOF(x1),SIZEOF(Int32));
- RETURN x1 = y;
- END "=";
- END EnetUtils.
|