MODULE srE;
IMPORT SYSTEM, srBase;
TYPE SREAL=srBase.SREAL;
PROCEDURE E*(VAR p: srBase.PT; VAR ijk: srBase.IPT);
VAR
in: ARRAY 3 OF SREAL;
out: ARRAY 3 OF INTEGER;
BEGIN
in[0]:=p.x;in[1]:=p.y; in[2]:=p.z;
Eprime(in,out);
ijk.i:=out[0]; ijk.j:=out[1]; ijk.k:=out[2];
END E;
PROCEDURE Eprime(VAR in:ARRAY OF SREAL; VAR out: ARRAY OF INTEGER);
CODE {SYSTEM.i386, SYSTEM.FPU}
MOV EDI, [EBP+8] ; dest = ADR(out)
MOV ECX, [EBP+12] ; count = LEN(out)
MOV ESI, [EBP+16] ; source = ADR(in)
CMP ECX, [EBP+20]
JGE Ok
PUSH 99 ; LEN(in) > LEN(out) then TRAP(99)
INT 3
Ok:
SUB ESP, 8 ; change FPU rounding to "chop"
FSTCW [ESP]
FWAIT
MOV EBX, [ESP]
OR EBX, 0400H ; clear bit 10,11 (chop/truncate toward zero)
MOV [ESP+4], EBX
FLDCW [ESP+4]
JMP Check
Loop:
DEC ECX
FLD DWORD [ESI+ECX*4] ; in: SREAL
FISTP WORD [EDI+ECX*2] ; out: INTEGER
FWAIT
Check:
CMP ECX, 0
JG Loop
FLDCW [ESP] ; restore original FPU configuration
ADD ESP, 8
END Eprime;
PROCEDURE E2*(in: srBase.PT; VAR out: srBase.IPT);
END E2;
PROCEDURE -ROUND*(x: SREAL; VAR y: LONGINT);
CODE {SYSTEM.i386, SYSTEM.FPU}
POP EAX
FLD DWORD [EBP]
ADD ESP, 4
FISTP DWORD [EAX]
END ROUND;
(* PROCEDURE -ROUND(x: LONGSREAL; VAR y: LONGINT);
CODE {SYSTEM.i386, SYSTEM.FPU}
POP EAX
FLD QWORD [EBP]
ADD ESP, 8
FISTP DWORD [EAX]
END ROUND;
*)
END srE.