( math DAY 06.04.2001 )

needs FPI float

\ interface words to the 
\ mathlib library

api: syslibfind
api: syslibload


create mathlibref 2 allot

: usemathlib ( -- )
   s" MathLib" drop >abs
   mathlibref >abs 
   syslibfind
   if
     'libr' 'MthL'
     mathlibref >abs
     syslibload throw
   then
   1 w>r mathlibref w@ w>r 
   \ mathlibopen
   0xa801 systrap d0 throw  
   rdrop
;

api: syslibremove

: donemathlib ( -- )
   mathlibref w@ ?dup
   if
      dfres >abs >r w>r
      0xa802 systrap \ mathlibclose
      d0 throw
      6 nrdrop dfres w@ 0=
      if
        mathlibref w@ syslibremove 
        throw
      then
   then
;

: math ( r n -- r )
   dfres >abs >r
   rot rot 2>r
   mathlibref w@ w>r
   systrap
   14 nrdrop
   dfres cell+ @
   dfres @
;

: facos ( r1 -- r2 )
   0xa805 math
;
: fasin ( r1 -- r2 )
   0xa806 math
;
: fatan ( r1 -- r2 )
   0xa807 math
;

: fcos ( r1 -- r2 )
   0xa809 math
;
: fsin ( r1 -- r2 )
   0xa80a math
;
: ftan ( r1 -- r2 )
   0xa80b math
;

: fsincos ( r1 -- r2 r3 )
   2dup fsin
   2swap fcos
;

: fcosh ( r1 -- r2 )
   0xa80d math
;
: fsinh ( r1 -- r2 )
   0xa80e math
;
: ftanh ( r1 -- r2 )
   0xa80f math
;
: facosh ( r1 -- r2 )
   0xa810 math
;
: fasinh ( r1 -- r2 )
   0xa811 math
;
: fatanh ( r1 -- r2 )
   0xa812 math
;
: fexp ( r1 -- r2 )
   0xa813 math
;

: fln ( r1 -- r2 )
   0xa816 math
;

: flog ( r1 -- r2 )
   0xa817 math
;

: fexpm1 ( r1 -- r2 )
   0xa819 math
;

: fsqrt ( r1 -- r2 )
   0xa81e math
;

: floor ( r1 -- r2 )
   0xa823 math
;

: fround ( r1 -- r2 )
   0xa831 math
;

: f** ( r1 r2 -- r3 )
   dfres >abs >r
   2>r 2>r mathlibref w@ w>r
   0xa81d systrap
   22 nrdrop
   dfres cell+ @
   dfres @
;

: 180e
    0 0x40668000
;

: >deg ( r1 -- r2 )
   180e F* FPI F/
;

: >rad ( r1 -- r2 )
   FPI F* 180e F/
;

\eof

\ Example:

UseMathLib

50e fsin fs.

DoneMathLib