{ File: FixMath.p Contains: Fixed Math Interfaces. Version: Technology: Mac OS 8 Release: Universal Interfaces 3.4.2 Copyright: © 1985-2002 by Apple Computer, Inc., all rights reserved Bugs?: For bug reports, consult the following page on the World Wide Web: http://www.freepascal.org/bugs.html } { Modified for use with Free Pascal Version 200 Please report any bugs to } {$mode macpas} {$packenum 1} {$macro on} {$inline on} {$CALLING MWPASCAL} unit FixMath; interface {$setc UNIVERSAL_INTERFACES_VERSION := $0342} {$setc GAP_INTERFACES_VERSION := $0200} {$ifc not defined USE_CFSTR_CONSTANT_MACROS} {$setc USE_CFSTR_CONSTANT_MACROS := TRUE} {$endc} {$ifc defined CPUPOWERPC and defined CPUI386} {$error Conflicting initial definitions for CPUPOWERPC and CPUI386} {$endc} {$ifc defined FPC_BIG_ENDIAN and defined FPC_LITTLE_ENDIAN} {$error Conflicting initial definitions for FPC_BIG_ENDIAN and FPC_LITTLE_ENDIAN} {$endc} {$ifc not defined __ppc__ and defined CPUPOWERPC} {$setc __ppc__ := 1} {$elsec} {$setc __ppc__ := 0} {$endc} {$ifc not defined __i386__ and defined CPUI386} {$setc __i386__ := 1} {$elsec} {$setc __i386__ := 0} {$endc} {$ifc defined __ppc__ and __ppc__ and defined __i386__ and __i386__} {$error Conflicting definitions for __ppc__ and __i386__} {$endc} {$ifc defined __ppc__ and __ppc__} {$setc TARGET_CPU_PPC := TRUE} {$setc TARGET_CPU_X86 := FALSE} {$elifc defined __i386__ and __i386__} {$setc TARGET_CPU_PPC := FALSE} {$setc TARGET_CPU_X86 := TRUE} {$elsec} {$error Neither __ppc__ nor __i386__ is defined.} {$endc} {$setc TARGET_CPU_PPC_64 := FALSE} {$ifc defined FPC_BIG_ENDIAN} {$setc TARGET_RT_BIG_ENDIAN := TRUE} {$setc TARGET_RT_LITTLE_ENDIAN := FALSE} {$elifc defined FPC_LITTLE_ENDIAN} {$setc TARGET_RT_BIG_ENDIAN := FALSE} {$setc TARGET_RT_LITTLE_ENDIAN := TRUE} {$elsec} {$error Neither FPC_BIG_ENDIAN nor FPC_LITTLE_ENDIAN are defined.} {$endc} {$setc ACCESSOR_CALLS_ARE_FUNCTIONS := TRUE} {$setc CALL_NOT_IN_CARBON := FALSE} {$setc OLDROUTINENAMES := FALSE} {$setc OPAQUE_TOOLBOX_STRUCTS := TRUE} {$setc OPAQUE_UPP_TYPES := TRUE} {$setc OTCARBONAPPLICATION := TRUE} {$setc OTKERNEL := FALSE} {$setc PM_USE_SESSION_APIS := TRUE} {$setc TARGET_API_MAC_CARBON := TRUE} {$setc TARGET_API_MAC_OS8 := FALSE} {$setc TARGET_API_MAC_OSX := TRUE} {$setc TARGET_CARBON := TRUE} {$setc TARGET_CPU_68K := FALSE} {$setc TARGET_CPU_MIPS := FALSE} {$setc TARGET_CPU_SPARC := FALSE} {$setc TARGET_OS_MAC := TRUE} {$setc TARGET_OS_UNIX := FALSE} {$setc TARGET_OS_WIN32 := FALSE} {$setc TARGET_RT_MAC_68881 := FALSE} {$setc TARGET_RT_MAC_CFM := FALSE} {$setc TARGET_RT_MAC_MACHO := TRUE} {$setc TYPED_FUNCTION_POINTERS := TRUE} {$setc TYPE_BOOL := FALSE} {$setc TYPE_EXTENDED := FALSE} {$setc TYPE_LONGLONG := TRUE} uses MacTypes; {$ALIGN MAC68K} const fixed1 = $00010000; fract1 = $40000000; positiveInfinity = $7FFFFFFF; negativeInfinity = $80000000; { FixRatio, FixMul, and FixRound were previously in ToolUtils.h } { * FixRatio() * * Availability: * Non-Carbon CFM: in InterfaceLib 7.1 and later * CarbonLib: in CarbonLib 1.0 and later * Mac OS X: in version 10.0 and later } function FixRatio(numer: SInt16; denom: SInt16): Fixed; external name '_FixRatio'; { * FixMul() * * Availability: * Non-Carbon CFM: in InterfaceLib 7.1 and later * CarbonLib: in CarbonLib 1.0 and later * Mac OS X: in version 10.0 and later } function FixMul(a: Fixed; b: Fixed): Fixed; external name '_FixMul'; { * FixRound() * * Availability: * Non-Carbon CFM: in InterfaceLib 7.1 and later * CarbonLib: in CarbonLib 1.0 and later * Mac OS X: in version 10.0 and later } function FixRound(x: Fixed): SInt16; external name '_FixRound'; { * Fix2Frac() * * Availability: * Non-Carbon CFM: in InterfaceLib 7.1 and later * CarbonLib: in CarbonLib 1.0 and later * Mac OS X: in version 10.0 and later } function Fix2Frac(x: Fixed): Fract; external name '_Fix2Frac'; { * Fix2Long() * * Availability: * Non-Carbon CFM: in InterfaceLib 7.1 and later * CarbonLib: in CarbonLib 1.0 and later * Mac OS X: in version 10.0 and later } function Fix2Long(x: Fixed): SInt32; external name '_Fix2Long'; { * Long2Fix() * * Availability: * Non-Carbon CFM: in InterfaceLib 7.1 and later * CarbonLib: in CarbonLib 1.0 and later * Mac OS X: in version 10.0 and later } function Long2Fix(x: SInt32): Fixed; external name '_Long2Fix'; { * Frac2Fix() * * Availability: * Non-Carbon CFM: in InterfaceLib 7.1 and later * CarbonLib: in CarbonLib 1.0 and later * Mac OS X: in version 10.0 and later } function Frac2Fix(x: Fract): Fixed; external name '_Frac2Fix'; { * FracMul() * * Availability: * Non-Carbon CFM: in InterfaceLib 7.1 and later * CarbonLib: in CarbonLib 1.0 and later * Mac OS X: in version 10.0 and later } function FracMul(x: Fract; y: Fract): Fract; external name '_FracMul'; { * FixDiv() * * Availability: * Non-Carbon CFM: in InterfaceLib 7.1 and later * CarbonLib: in CarbonLib 1.0 and later * Mac OS X: in version 10.0 and later } function FixDiv(x: Fixed; y: Fixed): Fixed; external name '_FixDiv'; { * FracDiv() * * Availability: * Non-Carbon CFM: in InterfaceLib 7.1 and later * CarbonLib: in CarbonLib 1.0 and later * Mac OS X: in version 10.0 and later } function FracDiv(x: Fract; y: Fract): Fract; external name '_FracDiv'; { * FracSqrt() * * Availability: * Non-Carbon CFM: in InterfaceLib 7.1 and later * CarbonLib: in CarbonLib 1.0 and later * Mac OS X: in version 10.0 and later } function FracSqrt(x: Fract): Fract; external name '_FracSqrt'; { * FracSin() * * Availability: * Non-Carbon CFM: in InterfaceLib 7.1 and later * CarbonLib: in CarbonLib 1.0 and later * Mac OS X: in version 10.0 and later } function FracSin(x: Fixed): Fract; external name '_FracSin'; { * FracCos() * * Availability: * Non-Carbon CFM: in InterfaceLib 7.1 and later * CarbonLib: in CarbonLib 1.0 and later * Mac OS X: in version 10.0 and later } function FracCos(x: Fixed): Fract; external name '_FracCos'; { * FixATan2() * * Availability: * Non-Carbon CFM: in InterfaceLib 7.1 and later * CarbonLib: in CarbonLib 1.0 and later * Mac OS X: in version 10.0 and later } function FixATan2(x: SInt32; y: SInt32): Fixed; external name '_FixATan2'; { Frac2X, Fix2X, X2Fix, and X2Frac translate to and from the floating point type "extended" (that's what the X is for). On the original Mac this was 80-bits and the functions could be accessed via A-Traps. When the 68881 co-processor was added, it used 96-bit floating point types, so the A-Traps could not be used. When PowerPC was added, it used 64-bit floating point types, so yet another prototype was added. } {$ifc TARGET_CPU_68K} {$ifc TARGET_RT_MAC_68881} {$ifc CALL_NOT_IN_CARBON} { * Frac2X() * * Availability: * Non-Carbon CFM: not available * CarbonLib: not available * Mac OS X: not available } function Frac2X(x: Fract): extended; external name '_Frac2X'; { * Fix2X() * * Availability: * Non-Carbon CFM: not available * CarbonLib: not available * Mac OS X: not available } function Fix2X(x: Fixed): extended; external name '_Fix2X'; { * X2Fix() * * Availability: * Non-Carbon CFM: not available * CarbonLib: not available * Mac OS X: not available } function X2Fix(x: extended): Fixed; external name '_X2Fix'; { * X2Frac() * * Availability: * Non-Carbon CFM: not available * CarbonLib: not available * Mac OS X: not available } function X2Frac(x: extended): Fract; external name '_X2Frac'; {$endc} {CALL_NOT_IN_CARBON} {$elsec} {$ifc CALL_NOT_IN_CARBON} { * Frac2X() * * Availability: * Non-Carbon CFM: not available * CarbonLib: not available * Mac OS X: not available } function Frac2X(x: Fract): extended; external name '_Frac2X'; { * Fix2X() * * Availability: * Non-Carbon CFM: not available * CarbonLib: not available * Mac OS X: not available } function Fix2X(x: Fixed): extended; external name '_Fix2X'; { * X2Fix() * * Availability: * Non-Carbon CFM: not available * CarbonLib: not available * Mac OS X: not available } function X2Fix(x: extended): Fixed; external name '_X2Fix'; { * X2Frac() * * Availability: * Non-Carbon CFM: not available * CarbonLib: not available * Mac OS X: not available } function X2Frac(x: extended): Fract; external name '_X2Frac'; {$endc} {CALL_NOT_IN_CARBON} {$endc} {TARGET_RT_MAC_68881} {$elsec} { * Frac2X() * * Availability: * Non-Carbon CFM: in InterfaceLib 7.1 and later * CarbonLib: in CarbonLib 1.0 and later * Mac OS X: in version 10.0 and later } function Frac2X(x: Fract): Double; external name '_Frac2X'; { * Fix2X() * * Availability: * Non-Carbon CFM: in InterfaceLib 7.1 and later * CarbonLib: in CarbonLib 1.0 and later * Mac OS X: in version 10.0 and later } function Fix2X(x: Fixed): Double; external name '_Fix2X'; { * X2Fix() * * Availability: * Non-Carbon CFM: in InterfaceLib 7.1 and later * CarbonLib: in CarbonLib 1.0 and later * Mac OS X: in version 10.0 and later } function X2Fix(x: Double): Fixed; external name '_X2Fix'; { * X2Frac() * * Availability: * Non-Carbon CFM: in InterfaceLib 7.1 and later * CarbonLib: in CarbonLib 1.0 and later * Mac OS X: in version 10.0 and later } function X2Frac(x: Double): Fract; external name '_X2Frac'; {$endc} {TARGET_CPU_68K} { QuickTime 3.0 makes these Wide routines available on other platforms } {$ifc TARGET_CPU_PPC OR NOT TARGET_OS_MAC} { * WideCompare() * * Availability: * Non-Carbon CFM: in InterfaceLib 7.1 and later * CarbonLib: in CarbonLib 1.0 and later * Mac OS X: in version 10.0 and later } function WideCompare(const (*var*) target: wide; const (*var*) source: wide): SInt16; external name '_WideCompare'; { * WideAdd() * * Availability: * Non-Carbon CFM: in InterfaceLib 7.1 and later * CarbonLib: in CarbonLib 1.0 and later * Mac OS X: in version 10.0 and later } function WideAdd(var target: wide; const (*var*) source: wide): widePtr; external name '_WideAdd'; { * WideSubtract() * * Availability: * Non-Carbon CFM: in InterfaceLib 7.1 and later * CarbonLib: in CarbonLib 1.0 and later * Mac OS X: in version 10.0 and later } function WideSubtract(var target: wide; const (*var*) source: wide): widePtr; external name '_WideSubtract'; { * WideNegate() * * Availability: * Non-Carbon CFM: in InterfaceLib 7.1 and later * CarbonLib: in CarbonLib 1.0 and later * Mac OS X: in version 10.0 and later } function WideNegate(var target: wide): widePtr; external name '_WideNegate'; { * WideShift() * * Availability: * Non-Carbon CFM: in InterfaceLib 7.1 and later * CarbonLib: in CarbonLib 1.0 and later * Mac OS X: in version 10.0 and later } function WideShift(var target: wide; shift: SInt32): widePtr; external name '_WideShift'; { * WideSquareRoot() * * Availability: * Non-Carbon CFM: in InterfaceLib 7.1 and later * CarbonLib: in CarbonLib 1.0 and later * Mac OS X: in version 10.0 and later } function WideSquareRoot(const (*var*) source: wide): UInt32; external name '_WideSquareRoot'; { * WideMultiply() * * Availability: * Non-Carbon CFM: in InterfaceLib 7.1 and later * CarbonLib: in CarbonLib 1.0 and later * Mac OS X: in version 10.0 and later } function WideMultiply(multiplicand: SInt32; multiplier: SInt32; var target: wide): widePtr; external name '_WideMultiply'; { returns the quotient } { * WideDivide() * * Availability: * Non-Carbon CFM: in InterfaceLib 7.1 and later * CarbonLib: in CarbonLib 1.0 and later * Mac OS X: in version 10.0 and later } function WideDivide(const (*var*) dividend: wide; divisor: SInt32; var remainder: SInt32): SInt32; external name '_WideDivide'; { quotient replaces dividend } { * WideWideDivide() * * Availability: * Non-Carbon CFM: in InterfaceLib 7.1 and later * CarbonLib: in CarbonLib 1.0 and later * Mac OS X: in version 10.0 and later } function WideWideDivide(var dividend: wide; divisor: SInt32; var remainder: SInt32): widePtr; external name '_WideWideDivide'; { * WideBitShift() * * Availability: * Non-Carbon CFM: in InterfaceLib 7.1 and later * CarbonLib: in CarbonLib 1.0 and later * Mac OS X: in version 10.0 and later } function WideBitShift(var src: wide; shift: SInt32): widePtr; external name '_WideBitShift'; {$endc} {$ALIGN MAC68K} end.