MATHEMATICAL OPERATIONS
These are abbreviated details from the section WORD
LIST grouped here for convenience, see that section for notation definition.
Only integer mathematics in the Forth ROM is shown, see below for a summary
of integer extensions, floating point and other methods.
*
|
( n1 n2 - n1*n2 )
|
|
*/
|
( n1 n2 n3 - n4 )
|
Scale n1 by ratio n2/n3
|
*/MOD
|
( n1 n2 n3 - n4 n5 )
|
Leave quotient n5 and remainder
n4 of operation n1*n2/n3
|
+
|
( n1 n2 -
n1+n2 )
|
|
+!
|
( n addr
- )
|
Add n to value at address
|
+-
|
( n1 n2 -
n3 )
|
Apply sign of n2 to n1, which is left as n3
|
-
|
( n1 n2 -
n1-n2 )
|
|
/
|
( n1 n2 -
n1/n2 )
|
|
/MOD
|
( n1 n2 -
rem quot )
|
Leave remainder and signed quotient n1/n2
|
0<
|
( n - f )
|
True if number less than zero
|
0=0=
|
( n - f )
|
f=1 if n not zero, f=0 if n is zero
|
0=
|
( n - f )
|
True if number equal to zero
|
0>
|
( n - f )
|
True if number greater than zero
|
1+
|
( n - n+1 )
|
|
1-
|
( n - n-1 )
|
|
2*
|
( n - n*2 )
|
|
2+
|
( n - n+2 )
|
|
2-
|
( n - n-2 )
|
|
2/
|
( n - n/2 )
|
|
<
|
( n1 n2 -
f )
|
True if n1 less than n2
|
<>
|
( n1 n2 -
f )
|
True if n1 not equal to n2
|
=
|
( n1 n2 -
f )
|
True if n1 equal to n2
|
>
|
( n1 n2 -
f )
|
True if n1 greater than n2
|
ABS
|
( n - u )
|
Leave absolute value u of number n
|
C+!
|
( b a - )
|
Add lower byte of second item on the stack to byte at
addr
|
D*/
|
( d1 n1 n2
- d2 )
|
Scale double number d1 by ratio n1/n2
|
D*S
|
( d1 n -
d2 )
|
d2 = d1 * n
|
D+
|
( d1 d2 -
d1+d2 )
|
|
D+-
|
( d1 n -
d2 )
|
Apply sign of n to d1, which is left as d2
|
D-
|
( d1 d2 -
d1-d2 )
|
|
D/
|
( d1 d2 -
n )
|
n = d1 / d2
|
D/S
|
( d1 n -
d2 )
|
d2 = d1 / n
|
D0=
|
( d - f )
|
True if double number equal to zero
|
D<
|
( d1 d2 -
f )
|
True if d1 less than d2
|
D=
|
( d1 d2 -
f )
|
True if d1 equal to d2
|
DABS
|
( d - ud )
|
Leave absolute value ud of double number d
|
DMINUS
|
( d1 - d2 )
|
d2 = -d1
|
M*
|
( n1 n2 -
d )
|
d = n1 * n2
|
M+
|
( d1 n -
d2 )
|
d2 = d1 + n
|
M/
|
( d n - n2
n3 )
|
Leave remainder n2 and quot. n3 of d/n
|
M/MOD
|
( ud1 u2
- u3 ud4 )
|
Leave remainder u3 and quotient ud4 of ud1/u2
|
MAX
|
( n1 n2 -
n3 )
|
n3 is the greater of n1 and n2
|
MIN
|
( n1 n2 -
n3 )
|
n3 is the lesser of n1 and n2
|
MINUS
|
( n1 - n2 )
|
n2 = -n1
|
MOD
|
( n1 n2 -
n3 )
|
n3 is the remainder of n1/n2
|
S->D
|
( n - d )
|
Sign extend single number n to form double number d
|
T*
|
( ud u -
ut )
|
ud * u giving 48-bit product
|
T/
|
( ut u -
ud )
|
ut / u 48-bit integer divided by single to give double
integer
|
U*
|
( u1 u2 -
ud )
|
ud = u1 * u2
|
U*/
|
( ud1 u1 u2 - ud2 )
|
Scale unsigned double number
ud1 by ratio u1/u2
|
U/
|
( ud u1 - u2 u3 )
|
Leave remainder u2 and
quotient u3 of ud/u1
|
U<
|
( u1 u2 -
f )
|
True if u1 less than u2
|
INTEGER TYPES (Forth ROM and _MATH.TDS)
Use integer (16-bit) or double-integer (32-bit) where possible
because you get the best speed. Scaling the input and output to fit in the range
�2,000,000,000 generally allows this.
Integer functions in the Forth ROM are shown above but in the
file _MATH.TDS there is a wide range of others available including 48-bit arithmetic,
logarithms and exponentials.
FIXED POINT (_FIXED.TDS)
Uses 32-bit integer arithmetic for speed and accuracy but has
fixed decimal point for input and output. You can choose between 0 and 4 decimal
places.
FRACTIONAL ARITHMETIC (Forth ROM
and _SQRT.TDS)
This u ses 16-bit integer
arithmetic for speed. You scale input and output to the range �2.000 before
using the mathematical operations. Apart from the main four functions and conversion
words, sine, cosine, logarithms, exponentials and square roots are provided.
FLOATING POINT (TDS-FLOAT - optional extra)
DESCRIPTION
The package TDS-FLOAT is a fully-featured floating point and
extended string handling package for the TDS9092. It is available as an option.
Use the parts of it you need in your application code.
However be sure you really need floating point. Floating point
arithmetic enables very small numbers (like 0.0000000001) to very large numbers
(like 3000000000000) to be handled at the same time. This is very rarely needed
and the extensive 32-bit double number arithmetic routines in the TDS9092 cater
for most needs. These can handle from 0 to �2000000000, or 0.00000 to �20000.00000
for example.
Occasions do arise where floating point would be useful. TDS-FLOAT
is available in source code on a PC format disk. Apart from normal calculator
functions, a full range of trigonometrical and log/exponential functions is
included with accuracy 8 to 10 decimal digits. There are also string extensions
to give Forth equivalents of the string handling words in BASIC. A manual with
a printed source listing is provided.
TYPICAL PERFORMANCE
Floating point multiply F*
|
8ms
|
Floating point divide
F/
|
53ms
|
Floating point add
F+
|
10ms
|
Floating point sine FSIN
|
270ms
|
FLOATING POINT PRINCIPAL WORDS
1/PI
|
10^X
|
D!
|
D*
|
D>F
|
D@
|
DEG>RAD
|
DIM
|
DINT
|
E
|
E#
|
E.
|
E^X
|
F!
|
F#
|
F*
|
F+
|
F-
|
F.
|
F/
|
F/MOD
|
F10*
|
F<
|
F<0
|
F=0
|
F>0
|
F@
|
FABS
|
FACOS
|
FALN
|
FALOG
|
FASIN
|
FATAN
|
FCONSTANT
|
FCOS
|
FDROP
|
FDUP
|
FINT
|
FLITERAL
|
FLN
|
FLOAT
|
FLOG
|
FMAX
|
FMIN
|
FMINUS
|
FMOD
|
FOVER
|
FROT
|
FSIGN
|
FSIN
|
FSQR
|
FSWAP
|
FTAN
|
FVARIABLE
|
FX^N
|
FX^Y
|
PI
|
RAD>DEG
|
S>D
|
S>F
|
SINT
|
|
|
|
|
STRING FUNCTION PRINCIPAL WORDS
$!
|
$+
|
$.
|
$@
|
$DIM
|
$DROP
|
$DUP
|
$INPUT
|
$SWAP
|
$VARFILL
|
$VARIABLE
|
ASC
|
E.$
|
E.N
|
F.$
|
F.N
|
FASC
|
FLEN
|
INPUT
|
LEFT$
|
LEN
|
MID$
|
RIGHT$
|
STR$
|
VAL
|
|