!!!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
}}}