Oberon/ETH Oberon/Cast

PROCEDURE Cast(VAR in&#58;ARRAY OF REAL; VAR out&#58; ARRAY OF INTEGER); CODE &#123;SYSTEM.i386, SYSTEM.FPU&#125; &#32;&#32;&#32;&#32;MOV  EDI, 8&#91;EBP&#93;         ; dest   &#61; ADR(out) &#32;&#32;&#32;&#32;MOV  ECX, 12&#91;EBP&#93;        ; count  &#61; LEN(out) &#32;&#32;&#32;&#32;MOV  ESI, 16&#91;EBP&#93;        ; source &#61; ADR(in) &#32;&#32;&#32;&#32;CMP  ECX, 20&#91;EBP&#93; &#32;&#32;&#32;&#32;JGE  Ok &#32;&#32;&#32;&#32;PUSH  99                  ; LEN(in) &#62; LEN(out)  then TRAP(99) &#32;&#32;&#32;&#32;INT  3 Ok&#58; &#32;&#32;&#32;&#32;SUB  ESP, 8              ; change FPU rounding to "chop" &#32;&#32;&#32;&#32;FSTCW 0&#91;ESP&#93; &#32;&#32;&#32;&#32;WAIT &#32;&#32;&#32;&#32;MOV  EBX, 0&#91;ESP&#93; &#32;&#32;&#32;&#32;OR   EBX, 0400H          ; clear bit 10,11 (chop/truncate toward zero) &#32;&#32;&#32;&#32;MOV  4&#91;ESP&#93;, EBX &#32;&#32;&#32;&#32;FLDCW 4&#91;ESP&#93; &#32;&#32;&#32;&#32; &#32;&#32;&#32;&#32;JMP  Check Loop&#58; &#32;&#32;&#32;&#32;DEC  ECX &#32;&#32;&#32;&#32;FLD  DWORD &#91;ESI&#93;&#91;ECX*4&#93;  ; in&#58; REAL &#32;&#32;&#32;&#32;FISTP WORD &#91;EDI&#93;&#91;ECX*2&#93;  ; out&#58; INTEGER &#32;&#32;&#32;&#32;WAIT Check&#58; &#32;&#32;&#32;&#32;CMP  ECX, 0 &#32;&#32;&#32;&#32;JG   Loop &#32;&#32;&#32;&#32;FLDCW 0&#91;ESP&#93;              ; restore original FPU configuration &#32;&#32;&#32;&#32;ADD  ESP, 8 END Cast; If in&#58; ARRAY OF LONGREAL then use &#32;&#32;&#32;&#32;FLD  QWORD &#91;ESI&#93;&#91;ECX*8&#93;  ; in&#58; LONGREAL If out&#58; ARRAY OF LONGINT then use &#32;&#32;&#32;&#32;FISTP DWORD &#91;ESI&#93;&#91;ECX*4&#93; ; out&#58; LONGINT