!!!Floating Point Words using the Atari 8bit Math ROM

General Information

Author: 	Carsten Strotmann \\
Language: 	FORTH \\
Compiler/Interpreter: 	volksForth \\
Published: 	Januar 2007 \\

!! Usage

The Floating Point words are in the vocabulary "FMATH". To use these word, put "FMATH" in the vocabulary searchlist: {{{FMATH ALSO}}}

Additional information about the Atari 8bit Math ROM can be found in De-Re Atari, Chapter 8 and Atari Reference Manual, Chapter 11.

All floating Point numbers are stored in 3 cells (2 byte, 6 byte in total).

__Glossary__

!! Constants 

! FR0 
 Address of 1st floating point pseudo register

! FR1 
 Address of 2nd floating point pseudo register

! FLPTR 
 Address of 2 byte pointer to user buffer for Foating point number (not used by the definitions below)

! INBUFF 
 Address of 2 byte pointer to ASCII Foating point number

! CIX 
 Address of index into INBUFF

!! Floating Point Stack words

! F@ ( addr -- fp )
  fetch floating point number (3 cells) stored at Address "addr" and place the on the data stack. Example: <code>FR0 F@</code>

! F! ( fp addr -- )
  store floating point number "fp" (3 cells) at Address "addr".

! FSWAP ( fp1 fp2 -- fp2 fp1 )
  swap two floating point numbers on the stack (3 cells each)

! FDROP ( fp -- )
  remove floating point number from top of stack (3 cells)

! FDUP  ( fp -- fp fp )
  duplicate topmost floating point number on stack

! FOVER ( fp1 fp2 -- fp1 fp2 fp1 )
  copy 2nd topmost floating point number to top of stack 

! F.TY ( -- )
  print floating point number (ASCII representation) already in Buffer referenced by INBUFF

! F. ( fp -- )
  print floating point number on top of stack

! F? ( addr -- )
  print floating point number at Address "addr"

!! Floating Point conversation

! FLOAT ( n -- fp ) 
  convert integer number "n" to floating point numner "fp"

! FIX   ( fp -- n )
  convert fix part of floating point number "fp" to integer number "n"

! ASCF ( addr -- fp )
  convert ASCII Floating Point number at "addr" (terminated by "zero" or Atari EOL 155/$9B) to floating point number "fp"

!! Floating Point Comparison

! F0= ( fp -- f )
  Flag "f" is "true" if "fp" is equal zero "0"

! F= ( fp1 fp2 -- f )
  Flag "f" is "true" if "fp1" and "fp2" are equal

! F< ( fp1 fp2 -- f )
  Flag "f" is "true" if "fp2" is smaller than "fp1". The opposite comparison can be defined by <code> : F> FSWAP F< ; </code>

!! Floating Point Arithmetics

! F+ ( fp1 fp2 -- fpn )
  add two floating point numbers on stack, leaving the result on stack

! F- ( fp1 fp2 -- fpn )
  substract two floating point numbers on stack, leaving the result on stack

! F* ( fp1 fp2 -- fpn )
  multiplicate two floating point numbers on stack, leaving the result on stack

! F/ ( fp1 fp2 -- fpn )
  divide fp1 by fp2, leaving the result on stack

! FLOG ( fp1 -- fplog )
  calculate natural logarithm of fp1

! FLOG10 ( fp1 -- fplog10 )
  calculate base 10 logarithm of fp1

! FEXP ( fp1 -- fpexp )
  calculate natural exponentation of fp1

! FEXP10 ( fp1 -- fpexp10 )
  calculate base 10 exponentation of fp1

!! Floating Point Forth Compiler Extension

! F, ( fp -- )
  store floating point number "fp" as 3 cells (6 bytes) into the directory 

! FCONSTANT ( fp -- )
  create a floating point constant. Example: <code> FP 1.234 FCONSTANT FCONST </code>

! FVARIABLE ( -- )
  create a floating point variable. Example: <code> FVARIABLE FVAR   FP 1.234 FVAR F! </code>

! FP ( -- fp )
  covert next word in input stream to floating point value on stack. Example: <code> FP 1.234 F. </code>

! FLOATING ( -- )
  covert next word in input stream to floating point and compile as a literal into the current definition. 
  Example: <code> : FLOATTEST FLOATING 1.234 F. </code>

! FLITERAL ( -- )
  compiler word used to compile a floating point number into an defintion

{{{
\ Floating Point Extension
\ using Atari 8bit ROM FP Routines
\ based on FIG Forth APX20029

\needs CALL INCLUDE" D:CALL.FS"

CR .( loading Floating Point ext. )

VOCABULARY FMATH
FMATH ALSO DEFINITIONS

$D4 CONSTANT FR0
$E0 CONSTANT FR1
$FC CONSTANT FLPTR
$F3 CONSTANT INBUF
$F2 CONSTANT CIX

| : XCALL CALL DROP ;

| : AFP    $D800 XCALL ;
| : FASC   $D8E6 XCALL ;
| : IFP    $D9AA XCALL ;
| : FPI    $D9D2 XCALL ;
| : FADD   $DA66 XCALL ;
| : FSUB   $DA60 XCALL ;
| : FMUL   $DADB XCALL ;
| : FDIV   $DB28 XCALL ;
| : FLG    $DECD XCALL ;
| : FLG10  $DED1 XCALL ;
| : FEX    $DDC0 XCALL ;
| : FEX10  $DDCC XCALL ;
| : FPOLY  $DD40 XCALL ;

: F@ ( addr -- fp )
  >R R@ @ R@ 2+ @ R> 4 + @ ;

: F! ( fp addr -- )
  >R R@ 4 + ! R@ 2+ ! R> ! ;

: F.TY ( -- )
  BEGIN
    INBUF @ C@ DUP $7F AND EMIT
    1 INBUF +!
  $80 > UNTIL ;

: FSWAP ( fp1 fp2 -- fp2 fp1 )
  5 ROLL 5 ROLL 5 ROLL ;

: FDROP ( fp -- )
  2DROP DROP ;

: FDUP  ( fp -- fp fp )
  2 PICK 2 PICK 2 PICK ;

: FOVER ( fp1 fp2 -- fp1 fp2 fp1 )
  5 PICK 5 PICK 5 PICK ;

: F. ( fp -- )
  FR0 F@ FSWAP FR0 F!
  FASC F.TY SPACE
  FR0 F! ;

: F? ( addr -- )
  F@ F. ;

: <F ( fp1 fp2 -- ) 
  FR1 F! FR0 F! ;

: F> ( -- fp1 )
  FR0 F@ ;

: FS ( fp -- )
  FR0 F! ;

: F+ <F FADD F> ;
: F- <F FSUB F> ;
: F* <F FMUL F> ;
: F/ <F FDIV F> ;

: FLOAT ( n -- fp ) 
  FR0 ! IFP F> ;

: FIX   ( fp -- n )
  FS FPI FR0 @ ;

: FLOG    FS FLG   F> ;
: FLOG10  FS FLG10 F> ;
: FEXP    FS FEX   F> ;
: FEXP10  FS FEX10 F> ;

: ASCF ( addr -- fp )
  INBUF ! 0 CIX C! AFP F> ;

: F0= OR OR 0= ;
: F=  F- F0= ;
: F<  F- 2DROP $80 AND 0 > ;

: F, ( fp -- )
  ROT , SWAP , , ;

: FCONSTANT
  CREATE F, DOES> F@ ;

: FVARIABLE 
  CREATE 6 ALLOT DOES> ;

| : FLIT
    R> DUP 6 + >R F@ ;

: FLITERAL
  COMPILE FLIT F, ;

: FP ( -- fp )
  BL WORD 1+ ASCF ; IMMEDIATE

: FLOATING 
  BL WORD 1+ 
  ASCF FLITERAL ; IMMEDIATE

: [FLOATING] [COMPILE] FLOATING ; IMMEDIATE

CR .( Floating Point ext. loaded. ) CR
 
ONLYFORTH
}}}