			La cration de nouveaux mots
			****************************

1 Les mots et le dictionnaire
*****************************

	Un programme FORTH peut tre dcompos en plusieurs sous-tches,
chacune recevant un nom. Lorsque ce nouveau mot est cr il est utilis
comme un mot standard, il prend ses paramtres sur la pile et y renvoit les
rsultats. Il peut aussi se servir de variables, c'est au choix, ou n'avoir aucun
paramtre.
	La dfinition de chaque mot est range dans le dictionnaire, comme
une variable. Le dictionnaire est une pile de type LIFO (dernier arriv,
premier sorti) au fonctionnement primaire. C'est  dire qu'un mot cr ne
peut utiliser que ceux dj crs avant lui (ou lui mme, le FORTH est
rcursif). Deuxime effet, lorsqu'un mot est effac, le FORTH est oblig
d'effacer tous les mots crs aprs lui galement.
	Il existe nanmoins une manire (peu jolie, mais  quoi bon?) de faire
des appels "en avant" vers des mots pas encore crs.
	Lorsqu'il est cr, un mot reoit un code FORTH (c'est son numro
d'ordre dans la suite des mots crs), ce code sera utile  certaines fonctions
mais est surtout indipensable  l'interprteur.

:  ...  ;
---------
	: XXX ... ;	ceci cr un nouveau mot XXX, sa dfinition correspond
 tout ce qui se trouve entre XXX et ;. Par exemple, voici un mot qui
additionne 65 au sommet de la pile:
	: plus65
		65 +
	;
	Donc:
	15 plus65 .		\ affiche 80 (65+15)

::  .... ;
----------
	:: XXX ... ;	Mme principe que la paire prcdente, sauf qu'
l'excution ce mot sera plus rapide.

	Lorsque le texte d'une dfinition est envoy  l'interprteur, celui-ci
remplace chaque mot FORTH par son code (sur 2 octets). Lors de l'excution,
l'interprteur lit un  un les codes et saute  la routine assembleur (pour les mots
standards) ou  une autre dfinition (pour les mots de l'utilisateur). Pour acclrer
ce processus, on peut tout simplement remplacer la suite des codes par les routines
assembleur elles mmes vitant ainsi le cycle lecture-code/recherche de
l'adresse/saut au sous-programme. C'est ce que fait :: ; amliorant ainsi la paire : ;.
Mais alors pourquoi utiliser encore : ;? Premirement parceque tous les mots ne
sont pas utilisables dans l'autre mode, ensuite pour des questions de taille
mmoire. Avec : ; (mode interprt) chaque mot n'utilise que 2 octets, avec :: ;
(mode compil ou assembl) chaque mot est une routine assembleur qui excde
bien souvent 2 octets, et parfois la vitesse d'un mot est sans infuence. Imaginons
par exemple un mot qui attend une frappe au clavier.

	Voici les rgles  retenir:
	Un mot interprt peut faire appel  n'importe quel autre mot.
	Un mot compil (ou assembl) ne peut faire appel qu' des mots standards
ou d'autres mots compils (les variables sont considres comme compiles).

find
----
	find XXX : ramne sur la pile le code FORTH du mot XXX.

adress
------
	est un tableau de type array. Chaque lment contient l'adresse d'un
mot FORTH (rangs dans l'ordre de leurs codes). Exemples:
	122 adress ?		\ affiche l'adresse du mot de code 122 (system)
	%hE00000 122 adress !
				\ modifie l'adresse du mot system, il pointe sur le
dbut du systme et lancera donc un magnifique RESET  sa prochaine
excution.
	find if adress ?	\ affiche l'adresse du mot "if".

	Pour les mots standards, l'adresse pointe directement sur une routine
assembleur. Pour un mot utilisateur, le premier code sur 2 octets peut indiquer son
type:
	140	: variable (variable, &float, &setof, &pointer, &name, &stack)
	141	: constant
	142	: array
	143	: string
	144	: array$
	145	: table
	437	: mot compil (::  ...   ;), le reste est la routine assembleur
	628	: lment d'un ensemble numr (&)
	706	: warray
	Autre	: c'est le premier code de la dfinition d'un mot interprt.

forget
------
	forget XXX : efface du dictionnaire le mot XXX et tous ceux crs aprs
lui. Libre ainsi la place prcdemment occupe. Utilis sur un mot standard,
la stabilit de l'interprteur n'est plus assure.
	Par exemple forget system, ne permet plus de quitter proprement
l'interprteur.

vlist
-----
	affiche la liste de tous les mots crs par l'utilisateur.

word$
-----
	c  word$  :  envoit dans pad la chaine de caractres correspondant au
mot de code c, l'adresse pad est laisse sur la pile. Ceci s'avre utile en
liaison avec les lments d'un ensemble numr.
	Autre exemple:
	500 0 do i word$ type space loop
	Affiche le nom de tous les mots FORTH jusqu'au code 499.

fast  slow
----------
	Dans le mode slow, on peut arrter l'excution de mots interprts 
l'aide de la combinaison Control+Alternate+Les deux shift. Le dpassement
infrieur de pile est aussi ralis (interdiction de dpiler plus qu'on avait
empil). Si un arrt est demand, l'interprteur dpose sur la pile l'adresse
de son pointeur d'excution (qui pointe sur le code de l'instruction qu'il allait
excuter).
	Dans le mode fast, ces possibilits n'existent pas, mais on y gagne en
rapidit. Le mode fast est le mode par dfaut.

exec
----
	c  exec  :  excute le mot de code c. Deux utilisations possibles pour ce
mot, d'abord l'quivalent d'un ON .... GOSUB du Basic:
	table CODES
	find sub0 ,
	find sub1 ,
	find sub2 ,	\ cre une table avec les codes de 3 routines

	input		\ l'utilisateur tape 0, 1 ou 2
	CODES 	\ ramne le code correspondant
	exec		\ excute sub1, 2 ou 3.

	Deuxime utilisation, l'appel en avant d'un mot pas encore cr:
	variable CODE		\ contiendra le code

	: essai CODE @ exec ;	\ excutera le mot point par CODE

	: coucou ." COUCOU!" ;	\ le deuxime mot

	find coucou CODE !		\ CODE pointera sur coucou

	essai				\ excutera le mot coucou cr aprs lui.

exe+
----
	n exe+  :  excute le mot dont le code est gal  celui du mot courant
plus n. Par exemple si n=1, excutera le mot suivant.
	: essai 1 exe+ 2 exe+ ;	\ excutera les deux mots qui suivent.
	: coucou ." Cou" ;
	: coucou2 ." cou!" ;
	essai			\ affiche Coucou!

2 Utilisation de l'diteur
**************************

	Pour faciliter la mise au point d'un programme un diteur est intgr dans
l'interprteur (on peut nanmoins taper toutes ses instructions en mode direct  la
suite de Ok>). La taille du texte ditable est fixe par le fichier FORTH.INF, ou, 
dfaut, au 1/6 de la mmoire libre.

edit
----
	passe sous l'diteur. La fentre est coupe en deux parties. En haut
une ligne indique la taille mmoire restant pour le texte du programme ainsi
que le numro de la ligne sous le curseur (commence  0). En bas, c'est le
texte du programme qui est affich.
	Chaque ligne peut contenir jusqu' 80 caractres. Si la largeur de la
fentre est insuffisante, un scrolling horizontal se fera pour accder  toute
la ligne.
	Touches actives sous l'diteur:
	F1	: dbut du texte
	F2	: demi cran vers le haut
	F3	: marque le dbut du bloc
	F4	: marque la fin du bloc
	F5	: annule le marquage du bloc
	F6	: aller  la ligne... (utilise la ligne d'informations)
	F7	: chercher une chaine (utilise la ligne d'informations)
	F8	: chercher encore
	F9	: demi-cran vers le bas
	F10	: fin du texte

	Shift F5	: effacer bloc
	Shift F6	: dplacer bloc avant la ligne sous le curseur.
	Shift F7	: copier bloc avant la ligne sous le curseur.

	La fonction de recherche de texte ne dtecte qu'une occurence de la
chaine par ligne.
	Le marquage du bloc s'effectue par numros de lignes. De ce fait, si
une ligne est insre avant le bloc, les lignes marques ne sont plus les
mmes. Le mieux est de marquer le bloc puis d'effectuer immdiatement la
fonction de bloc associe. Les focntions de bloc sont irrmdiables, pas de
UNDO prvu.

	flches	: haut, bas, droite, gauche.
	Shift Gauche	: fin de ligne
	Shift Droit	: dbut de ligne
	Enter		: fin de ligne et cration d'une nouvelle (coupure de
l'ancienne ligne au niveau du curseur)
	Undo		: annule les modifications de la ligne courante.
	Backspace	: efface en reculant
	Delete	: efface sous le curseur
	Contrl Del	: efface la ligne courante
	Tab		: avance de 3 positions vers la droite
	Shift Haut	: demi-cran vers le haut, quivalent de F2.
	Shift Bas	: demi-cran vers le bas, quivalent de F9.

	L'identation est automatique.

	Esc		: quitte l'diteur. S'affiche alors un message indiquant si
il reste un bloc marqu ou non, car les fonctions saveb, writeb sont limites
au bloc si il existe.


writeb
------
	imprime le bloc slectionn (si il existe) ou tout le texte.

saveb
-----
	sauve le bloc slectionn (si il existe) ou tout le texte. Le slecteur de
fichier est ouvert, il suffit d'entrer le nom dsir. Si un fichier du mme nom
existe dj, son contenu est remplac par celui de l'diteur.

export
------
	comme saveb, sauf qu'il est envoy au format ASCII simple (pourra
tre retrait par un autre traitement de textes). Efface pads (voir ensembles).

append
------
	mme principe que saveb, sauf que si le fichier existe dj, le contenu
de l'diteur est ajout  l'ancien contenu.

loadb
-----
	charge un fichier dans l'diteur par l'intermdiaire du slecteur de
fichier. Si un texte est dj prsent, alors le fichier est ajout  la suite de ce
texte.

import
------
	comme loadb, sauf que le fichier est au format ASCII simple et sera
recod avant sa copie dans l'diteur. Efface pads (voir ensembles).

select+
select-
-------
	dterminent le mode de fonctionnement des mots loadb, saveb et
append. En mode select+ (par dfaut), le selecteur de fichier est ouvert. En
mode select-, une chaine contenant le chemin complet d'accs est attendue
sur la pile, par exemple:
	" D:\FORTH\TEST.FOR" saveb

compilb
-------
	envoit le bloc slectionn (si il existe) ou tout le texte  l'interprteur.
Les parties excutables sont excutes, les dfinitions de mots sont ranges
dans le dictionnaire. Si une erreur est dtecte elle est signale et l'excution
de edit amnera le curseur sur la ligne fautive.

>comp
-----
	l'utilisation de ce mot est rserve  l'intrieur de l'diteur. Comme
expliqu prcdemment, le FORTH lit d'abord un texte, le code, puis
l'excute. De ce fait, il utilise un buffer d'excution dans lequel il entrepose
en premire lecture les codes des instructions. Ce buffer est limit et il arrive
qu'il se remplisse. Si le FORTH signale cette erreur, il suffit de couper la
partie excutable par un >comp qui enverra en plusieurs parties les donnes
 l'interprteur.
	>comp ne peut pas se trouver au milieu d'une boucle ou de toute
autre structure de contrle (if, case, etc...). De ce fait, les parties excutables
inscrites dans une boucle (ou autre) sont limites en taille. Attention, ceci
n'affecte pas les dfinitions des instructions (entre : et ;, ou :: et ;) puisque le
buffer d'excution n'est pas utilis, tout est directement envoy dans le
dictionnaire.
	>comp est galement utilis en liaison avec >export (voir le
pr-processeur).

eval
----
	ce mot se comporte comme compilb sauf qu'au lieu d'aller chercher le
texte dans l'diteur, il le prend dans une chaine.
	" chaine" eval		: interprte la chaine comme une suite de
commandes FORTH, excute ce qui doit l'tre et range les dfinitions
rencontre dans le dictionnaire. On peut ainsi raliser un interprteur
FORTH en FORTH:
	begin
		." Ok>" input$ eval
	again
	Cette boucle ralise le mme travail que le mode direct de
l'interprteur. La chaine peut elle mme contenir la fonction eval. A chaque
niveau une nouvelle couche de l'interprteur est cr.

lmax
----
	variable sur 2 octets contenant le numro de la dernire ligne de
l'diteur. Modifier cette variable est un peu dangereux si on ne conait pas le
codage des lignes de l'diteur.

bstart   bsize
--------------
	Ces deux variables sur deux octets chacune contiennent
respectivement le numro de la premire ligne du bloc et le nombre-1 de
lignes du bloc. Si bstart=-1 (ou 65535) aucun bloc n'est dfini. Si le bloc est
dfini et que bsize=-1 (ou 65535), le bloc s'tend jusqu' la fin du texte.
	10 bstart w!
	5   bsize w!		\ marque manuellement un bloc commenant 
la ligne 10 et long de 6 lignes.
	writeb			\ imprime ces 6 lignes.

buf0   buf
----------
	buf0 est une constante contenant l'adresse de dpart du texte dans
l'diteur. Buf est une variable (4 octets) contenant l'adresse de la fin du texte
dans l'diteur.
	buf @ buf0 - .	\ affiche la taille du texte dans l'diteur.

buf!
----
	vide le texte de l'diteur.

	Dans l'diteur les lignes sont codes ainsi:
	2 octets	: offset pour la prochaine ligne ou 0 si dernire ligne
	1 octet		: 1+nombre d'espaces en dbut de ligne
	ensuite vient le texte de la ligne complt ventuellement par un espace pour
que la ligne suivante commence  une adresse paire.