Mathe: Float Extra

WRITEME 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
 
 
 
 
 
;-------------------------------------------------------------------------------
;===============================================================================
;===============================================================================

Runtime/Mathe-Float-Extra.txt · Zuletzt geändert: 2009/04/22 21:47 (Externe Bearbeitung)