		Les instructions arithm‚tiques sur la pile
		******************************************

	Le FORTH repose sur l'utilisation d'une pile, pour chaque fonction
ex‚cut‚e on doit au pr‚alable empiler les paramŠtres d'entr‚e et on
r‚cup‚rera sur cette mˆme pile les paramŠtres de sortie (si il y en a).

1 Les mouvements de la pile
***************************

	Chaque nombre rencontr‚ par l'interpr‚teur est simplement d‚pos‚
sur la pile, les fonctions utilisent toujours comme paramŠtres les derniŠres
valeurs d‚pos‚es (le sommet de la pile). Afin de ramener au sommet la
valeur voulue, il existe plusieurs mots permettant de modifier l'ordre des
valeurs sur la pile:

dup
---
	duplique la valeur au sommet de la pile.

?dup
----
	duplique le sommet de la pile si il est non nul.

drop
----
	jette le sommet de la pile.

swap
----
	permute les deux valeurs au sommet de la pile.

dropm
-----
	n dropm  :  jette n valeurs du sommet de la pile.

dupm
----
	n dupm  :  duplique les n valeurs du sommet de la pile.

rot
---
	a  b  c  rot  :  effectue une permutation circulaire sur 3 valeurs, on
obtient c  a  b.

roll
----
	n  roll  :  effectue un permutation circulaire sur n valeurs (la premiŠre
devient la derniŠre).

over
----
	duplique la deuxiŠme valeur par dessus la premiŠre.

pick
----
	n  pick  :  duplique la valeur de rang n par dessus le sommet de la
pile.


sp!
---
	vide entiŠrement la pile.

.s
--
	affiche le contenu de la pile (le sommet ‚tant l'‚l‚ment … gauche).
L'affichage de "*" signale un d‚bordement inf‚rieur de pile (trop de valeurs
d‚pil‚es). Il faut imm‚diatement utiliser sp!.


2 Les op‚rations de base
************************

	Chacune de ces op‚rations d‚pile d'abord ses paramŠtres, seul le
r‚sultat reste sur la pile.

+
	a  b  +  :  fournit a+b sur la pile.

-
	a  b  -  : fournit a-b sur la pile.

*
	a  b  *  :  fournit a*b sur la pile.

/
	a  b  /  :  fournit a/b sur la pile.

mod
---
	a  b  mod  :  fournit le reste de la division de a par b.

/mod
----
	a  b  /mod  :  fournit d'abord le quotient, puis au sommet le reste de
la division de a par b.

w/
--
	a  b  w/  :  divise a par b avec les limites suivantes : b et le quotient
doivent ˆtre dans l'intervalle [-32768,32767], c'est … dire tenir sur 2 octets.
L'op‚ration est plus rapide que /.

w*
--
	a  b  w*  :  fournit a*b plus rapidement que * si a et b sont dans
l'intervalle [-32768,32767].

w/mod
-----
	a  b  w/mod  :  avec les limitations de w/, fournit le quotient et le
reste de a/b.

1+
--
	augmente la valeur au sommet de 1.

1-
--
	diminue la valeur au sommet de 1.

2+
--
	augmente la valeur au sommet de 2.

2-
--
	diminue la valeur au sommet de 2.

2*
--
	multiplie par 2 la valeur au sommet.

2/
--
	divise par 2 la valeur au sommet.

0<
--
	renvoit 1 (vrai) si la valeur au sommet est n‚gative, 0 (faux) sinon.

0>
--
	renvoit 1 (vrai) si la valeur au sommet est positive, 0 (faux) sinon.

0=
--
	renvoit 1 si la valeur au sommet est nulle, 0 sinon.

>
	a  b  >  :  renvoit 1 si a>b, 0 sinon.

<
	a  b  <  :  renvoit 1 si a<b, 0 sinon.

=
	a  b  =  :  renvoit 1 si a=b, 0 sinon.

<>
--
	a  b  <>  : renvoit 1 si a est diff‚rent de b, 0 sinon.

min
---
	a  b  min  : renvoit le plus petit de a et b.

max
---
	a  b  max  : renvoit le plus grand de a et b.

and
---
	a  b  and  :  effectue un ET logique entre a et b.

or
--
	a  b  or  :  effectue un OU logique entre a et b.


xor
---
	a  b  xor  :  effectue un OU EXCLUSIF logique entre a et b.

not
---
	effectue un NON logique sur le sommet de la pile.

negate
------
	fournit l'oppos‚ du nombre au sommet de la pile.

+-
--
	a  b  +-  :  applique la rŠgle des signes de b sur a:
		si b<0, a est chang‚ en son oppos‚
		si b>0, a reste tel quel.
	b est d‚pil‚ et seul reste a ‚ventuellement modifi‚.

abs
---
	fournit la valeur absolue du sommet de la pile.

<seg>
-----
	x  a  b  <seg>  :  renvoit 1 si x est entre a et b  (a et b inclus), 0
sinon.

>seg<
-----
	x  a  b  >seg<  :  renvoit 1 si x est entre a et b  (a et b exclus), 0
sinon.

4 Travail sur plusieurs piles
*****************************

	Il existe deux piles en FORTH, la pile des donn‚es (celle utilis‚e pour
les calculs courants) et la pile des retours. Cette deuxiŠme pile est g‚r‚e de
maniŠre interne et conserve les adresse de retour d'un sous programme, les
donn‚es d'une boucle etc... On peut acc‚der … cette seconde pile pour peu
qu'elle retrouve son ‚tat initial avant un mot l'utilisant (fin de boucle, fin de
mot... )

r0
--
	d‚pose sur la pile des donn‚es l'adresse de base de la pile des retours.
Cette pile est descendante (on empile … l'aide de -(a4) et on d‚pile avec
(a4)+), c'est-…-dire que la base est au dessus de la pile elle-mˆme.

rp@
---
	d‚pose sur la pile des donn‚es l'adresse du pointeur de la pile des
retours. Cette adresse est donc inf‚rieure … r0.

>r
--
	d‚place le sommet de la pile des donn‚es sur le sommet de la pile des
retours. Utile pour ‚carter momentan‚ment une valeur.


r@
--
	copie le sommet de la pile des retours sur la pile des donn‚es (la
valeurs reste donc encore sur la pile des retours).

r>
--
	d‚place le sommet de la pile des retours sur la pile des donn‚es.

rp!
---
	vide la pile des retours (… ne pas faire en plein milieu d'un
programme, son utilisation est r‚serv‚e … un nettoyage si un programme s'est
interrompu pr‚matur‚ment lors d'une erreur).

	L'utilisation de cette deuxiŠme pile est limit‚e et peut ˆtre fatale pour
un programme. On peut ˆtre amen‚ … cr‚er d'autres piles de donn‚es qui
n'auront plus les contraintes de la pile des retours. Une deuxiŠme pile peut
aussi s'av‚rer utile lors de la mise au point d'un programme pour conserver
des valeurs prises en cours d'ex‚cution sans perturber son d‚roulement.

&stack
------
	n &stack XXX  :  cr‚e un mot XXX qui sera une pile contenant au
maximum n entiers de 4 octets (un r‚el compte pour 2 entiers=8 octets). A
l'ex‚cution XXX laisse sur la pile courante l'adresse de sa propre base.

current
-------
	XXX current  :  la pile XXX de vient la pile courante, toutes les
op‚rations se font dans cette nouvelle pile maintenant.

stack0
------
	pile du FORTH, par exemple :  stack0  current  , permet de revenir …
la pile normale. Cette pile de 4096 octets contient jusqu'a 1024 entiers ou
512 r‚els.

>st
---
	x  XXX  >st  :  d‚place la valeur x de la pile courante sur la pile XXX.

st>
---
	XXX  st>  :  d‚place le sommet de la pile XXX sur la pile courante.

s0
--
	d‚pose sur la pile la base de la pile courante. Les piles de donn‚es
sont descendantes comme la pile des retours (on empile avec -(a6) et on
d‚pile avec (a6)+).

sp@
---
	d‚pose sur la pile courante le pointeur de la pile courante, cette
valeur est inf‚rieure … s0.

depth
-----
	d‚pose sur la pile courante le nombre d'entiers pr‚sents sur cette pile.

5 Les nombres r‚els
*******************

	Ils sont au format IEEE double (celui du MC68882). Tous les calculs
seront effectu‚s avec cette pr‚cision. Pour sp‚cifier au FORTH qu'on utilise
un nombre r‚el il faut le faire pr‚c‚der de %f. Un nombre r‚el utilise 8 octets
sur la pile, la place de deux entiers.

f+  f-  f*  f/  fneg
--------------------
	remplacent +, -, *, / et negate pour les r‚els.

f=  f>
------
	remplacent = et > pour les r‚els.

fdup  fdrop  fswap  fover  frot  fpick  f>r  r>f
------------------------------------------------
	remplacent dup, drop, swap, over, rot, pick >r, r>  pour les r‚els.

itof  ftoi
----------
	transforment l'entier (int) en r‚el (fl) ou le contraire. La conversion
vers un entier est faite par troncature.

sin  cos  tan  atn
------------------
	calculent le sinus, le cosinus, la tangente ou l'arctangente d'un r‚el.
Les angles sont en radians.

sincos
------
	calcule simultan‚ment le sinus et le cosinus d'un angle. Le cosinus est
au smomet de la pile.

pi
--
	d‚pose la valeur de pi sur la pile.

exp  log
--------
	calcule l'exponentielle ou le logarithme n‚p‚rien d'un r‚el.

1/x  x^2  sqr
-------------
	calcule l'inverse, le carr‚ ou la racine carr‚e d'un nombre.

x^y
---
	x  y  x^y  :  calcule x … la puissance y.

fabs  int  frac  round
-----------------------
	calcule la valeur absolue, la partie entiŠre, la partie fractionnaire ou
l'arrondi d'un r‚el (le r‚sultat reste au format r‚el).

f*2^n
-----
	x  n  f*2^n  :  multiplie le r‚el x par 2^n (n ‚tant au format entier).
Pour multiplier par 4 on utlise n=2, par 32 c'est n=5, pour diviser par 2 on
utilise n=-1 etc... Cette op‚ration est extrŠmement rapide par rapport … f*
puisqu'il suffit de r‚aliser une addition sur l'exposant du r‚el.

sign
----
	renvoit le signe d'un nombre r‚el. 1 si il est positif, -1 si il est n‚gatif,
0 si il est nul. La valeur renvoy‚e est un entier.

setdigits
---------
	n setdigits  :  fixe, pour les r‚els, le nombre de chiffres … afficher. Ceci
n'influe pas sur la pr‚cision des calculs.

fval
----
	chaine  fval  :  transforme une chaine de caractŠres en un nombre r‚el
(les caractŠres %f devant le r‚el ne sont pas n‚cessaires). Fonction utile en
liaison avec input$ pour l'entr‚e de paramŠtres r‚els.