| Unvollständig ;===============================================================================
;===============================================================================
;===============================================================================
;-------------------------------------------------------------------------------
;===============================================================================
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
;-------------------------------------------------------------------------------
;===============================================================================
;=============================================================================== |