|
|
Mathe-Float Extra
;=============================================================================== ;=============================================================================== ;=============================================================================== ;------------------------------------------------------------------------------- ;=============================================================================== comment * ---------------------------------------------------------------------- FIXME Alles Ungetestet und Beta Infos: ======= ------------------------------------------------------------------------------ * ;=============================================================================== ;=============================================================================== ;======= Code-Deklaration ;------------------------------------------------------------------------------- .386 ; Minimal Anforderung an Prozessor ;.486 ; Minimal Anforderung an Prozessor ;.586 ; Minimal Anforderung an Prozessor ;.model flat, stdcall ; Flat-Memory Modell 32Bit option casemap :none ; Case-Sensitive ;=============================================================================== ;======= Includes von Externen Prozessen und APIs ;------------------------------------------------------------------------------- ;=============================================================================== ;======= Public-Deklaration von Prozessen die Extern sichtbar sind ;------------------------------------------------------------------------------- ;=============================================================================== ;======= Daten-Deklarationen ;------------------------------------------------------------------------------- .data ; Daten-Block Beginn ;=============================================================================== ;=============================================================================== ;=============================================================================== ;======= Code-Beginn ;------------------------------------------------------------------------------- .code ; Code-Block Begin ;=============================================================================== ;======= Proceduren für den Code ;------------------------------------------------------------------------------- ;------------------------------------------------------------------------------- Test_Fpu_Swap PROC Public Val1:TBYTE, Val2:TBYTE ;=== Swap, Vertauscht 2 Werte ;=== ST0 = Val2 , ST1 = Val1 FLD Val2 ; -> ST0 = Val2 FLD Val1 ; -> ST0 = Val1 , ST1=Val2 FXCH ; ST0 <=> ST1 FWAIT RET Test_Fpu_Swap ENDP ;------------------------------------------------------------------------------- Test_Fpu_Abs PROC Public Val1:TBYTE ;=== Abs ;=== ST0 = Abs(Val1) FLD Val1 ; -> ST0 = Val1 FABS ; -- ST0 = Abs(Val1) FWAIT RET Test_Fpu_Abs ENDP Test_Fpu_Sig PROC Public Val1:TBYTE ;=== Sgn ;=== ST0 = Sgn(Val1) FLD Val1 ; -> ST0 = Val1 FTST ; "FTST" seems to cause trouble FSTSW AX SAHF JZ Jump_End ;source number = 0: result = source operand FSTP ST(0) ;throw away source number FLD1 ;assume result = 1 until proven otherwise JA Jump_End ;source number > 0: result = 1 FCHS ;source number < 0: result = -1 Jump_End: FWAIT RET Test_Fpu_Sig ENDP Test_Fpu_Sign PROC Public Val1:TBYTE ;=== Sign ;=== ST0 = Sign(Val1) FLD Val1 ; -> ST0 = Val1 FTST ; "FTST" seems to cause trouble FSTSW AX SAHF FSTP ST(0) ;throw away source number FLD1 ;result is 1 until proven otherwise JAE Jump_End ;source >= 0: result = 1 FCHS ;source < 0: result = -1 Jump_End: FWAIT RET Test_Fpu_Sign ENDP ;------------------------------------------------------------------------------- Test_Fpu_Int PROC Public Val1:TBYTE ;=== Int ;=== ST0 = Int(Val1) FLD Val1 ; -> ST0 = TrigoVal1 FNSTCW [ControlWWOrigin] FWAIT MOV BX, [ControlWWOrigin] AND BX, Round_BitMask ;mask OUT rounding-control bits OR BX, Round_Down ;set rounding mode to: "round down" MOV [ControlWW], BX ;why have one CPU when two will do? FLDCW [ControlWW] FRNDINT ;INT() the God number, finally! FLDCW [ControlWWOrigin] FWAIT RET Test_Fpu_Int ENDP Test_Fpu_Fix PROC Public Val1:TBYTE ;=== Fix ;=== ST0 = Fix(Val1) FLD Val1 ; -> ST0 = Val1 FNSTCW [ControlWWOrigin] FWAIT MOV BX, [ControlWWOrigin] OR BX, Round_Truncate ;set rounding mode to: "truncate" MOV [ControlWW], BX ;why have one CPU when two will do? FLDCW [ControlWW] FRNDINT ;FIX() the God number, finally! FLDCW [ControlWWOrigin] FWAIT RET Test_Fpu_Fix ENDP ;FIXME Fehler Test_Fpu_SelectMin PROC Public Val1:TBYTE, Val2:TBYTE ;=== SelectMin ;=== ST0 = SelectMin(Val1, Val2) FLD Val2 ; -> ST0 = Val2 FLD Val1 ; -> ST0 = Val1 , ST1=Val2 FCOM ; -- ST0 <?> ST1 FSTSW AX ; -- AX = FPU-Flag SAHF ; CPU-Flag = AX JLE Jump1 ; If Val1 <= Val2 Then Goto Jump_End FXCH ; ST0 <=> ST1 Jump1: ; =Val1 FSTP ST(0) FWAIT RET Test_Fpu_SelectMin ENDP ;FIXME Fehler Test_Fpu_SelectMax PROC Public Val1:TBYTE, Val2:TBYTE ;=== SelectMax ;=== ST0 = SelectMax(Val1, Val2) FLD Val2 ; -> ST0 = Val2 FLD Val1 ; -> ST0 = Val1 , ST1=Val2 FCOM ; -- ST0 <?> ST1 FSTSW AX ; -- AX = FPU-Flag SAHF ; CPU-Flag = AX JGE Jump1 ; If Val1 => Val2 Then Goto Jump_End FXCH ; ST0 <=> ST1 Jump1: ; =Val1 FSTP ST(0) FWAIT RET Test_Fpu_SelectMax ENDP ;FIXME Fehler Test_Fpu_OrderMin PROC Public Val1:TBYTE, Val2:TBYTE ;=== OrderMin ;=== ST0 = OrderMin(Val1, Val2) FLD Val2 ; -> ST0 = Val2 FLD Val1 ; -> ST0 = Val1 , ST1=Val2 FCOM ; -- ST0 <?> ST1 FSTSW AX ; -- AX = FPU-Flag SAHF ; CPU-Flag = AX JLE Jump_End ; If Val1 <= Val2 Then Goto Jump_End FXCH ; ST0 <=> ST1 Jump_End: ; =Val1 FWAIT RET Test_Fpu_OrderMin ENDP ;FIXME Fehler Test_Fpu_OrderMax PROC Public Val1:TBYTE, Val2:TBYTE ;=== OrderMax ;=== ST0 = OrderMax(Val1, Val2) FLD Val2 ; -> ST0 = Val2 FLD Val1 ; -> ST0 = Val1 , ST1=Val2 FCOM ; -- ST0 <?> ST1 FSTSW AX ; -- AX = FPU-Flag SAHF ; CPU-Flag = AX JGE Jump_End ; If Val1 >= Val2 Then Goto Jump_End FXCH ; ST0 <=> ST1 Jump_End: ; =Val1 FWAIT RET Test_Fpu_OrderMax ENDP ;------------------------------------------------------------------------------- ;=============================================================================== ;=============================================================================== |