program FSINCOS_ ; {$IFDEF WINDOWS} uses WinCrt ; {$ENDIF} procedure _SinCos(var S, C : extended ; A : extended) ; begin S := Sin(A) ; C := Cos(A) end {_SinCos} ; {$IFDEF OLD} { Gives runtime fault/crash in BPW } procedure FSinCos(var S, C : extended ; A : extended) ; assembler ; asm fld [A] ; db $CD,$35,$FB { >287: => fsincos; fpatan is CD35F3 } ; les di,[C] ; fstp es:tbyte ptr[di] ; les di,[S] ; fstp es:tbyte ptr[di] ; end {FSinCos} ; function FTan(A : extended) : extended ; assembler ; asm fld [A] ; db $CD,$35,$FB ; FDIV end {FTan} ; (* OK? *) function FCot(A : extended) : extended ; assembler ; asm fld [A] ; db $CD,$35,$FB ; FDIVR end {FCot} ; (* OK? *) {$ELSE} { Gives compiler fault in Delphi - why ? } procedure FSinCos(var S, C : extended ; A : extended) ; assembler ; asm fld [A] ; db $D9,$FB { >287: => fsincos; fpatan is D9F3 } ; les di,[C] ; fstp es:tbyte ptr[di] ; les di,[S] ; fstp es:tbyte ptr[di] ; end {FSinCos} ; function FTan(A : extended) : extended ; assembler ; asm fld [A] ; db $D9,$FB ; FDIV end {FTan} ; (* OK? *) function FCot(A : extended) : extended ; assembler ; asm fld [A] ; db $D9,$FB ; FDIVR end {FCot} ; (* OK? *) {$ENDIF} var P, Q, X, Y, R : extended ; K : shortint ; BEGIN ; Writeln('Radians New FSin Old Sin Difference', {} ' New FCos Old Cos Difference') ; for k := -10 to +10 do begin R := 0.5*K ; FSinCos(P, Q, R) ; _SinCos(X, Y, R) ; Writeln(R:6:3, P:12:6, X:10:6, '':2, P-X:10, Q:12:6, Y:10:6, '':2, Q-Y:10) ; end ; Write('') ; Readln ; Writeln ('Radians New FTan Old Sin/Cos Difference Fractional') ; for k := -10 to +10 do begin R := 0.5*K ; P := FTan(R) ; _SinCos(X, Y, R) ; X := X/Y ; Write(R:6:3, P:15:6, X:15:6, '':5, P-X:10) ; if X<>0.0 then Write('':4, (P-X)/X:10) ; Writeln end ; Write('') ; Readln ; Writeln ('Radians New FCot Old Cos/Sin Difference Fractional') ; for k := -10 to +10 do if k=0 then Writeln(' 0.0') else begin R := 0.5*K ; P := FCot(R) ; _SinCos(X, Y, R) ; X := Y/X ; Write(R:6:3, P:15:6, X:15:6, '':5, P-X:10) ; if X<>0.0 then Write('':4, (P-X)/X:10) ; Writeln end ; Write('') ; Readln ; END. N.B. The actual floating-point machine instructions are given as $CDhh.. ; AIUI, the CD is a software interrupt op-code which, when using a real FPU, is replaced by the appropriate value for an FPU op-code. The program seems OK in TP7 and BP7 (DOS & DPMI); "OLD" crashes in BPW (can break Windows); Delphi 2 rejects "OLD" ("new"?) "fstp es:tbyte ptr[di]". I don't know why. www.merlyn.demon.co.uk 97/07/14, 98/10/19