core

index
index principal

Description

Vocabulaire de base du système ForthEx.
Liste de références utiles concernant le langage Forth.
REF: http://www.forth200x.org/documents/forth16-1.pdf
REF: http://www.eecs.wsu.edu/~hauser/teaching/Arch-F07/handouts/jonesforth.s.txt
REF: http://www.bradrodriguez.com/papers/
REF: http://www.camelforth.com/download.php?view.25
REF: http://sinclairql.speccy.org/archivo/docs/books/Threaded_interpretive_languages.pdf
REF: http://www.exemark.com/FORTH/eForthOverviewv5.pdf
REF: http://forthfiles.net/ting/sysguidefig.pdf
index principal

EXIT ( R: a-addr -- )

A n'utiliser qu'à l'intérieur d'une définition.
Retourne l'exécution à la routine appelante. Lors de l'invocation de EXIT
La pile des retours doit avoir à son sommet l'adresse du point de retour
sinon c'est un plantage assuré.

arguments:
a-addr   Adresse de retour dans la routine appellante au sommet de R:
retourne:
rien  
index
haut
index principal

Description

Cette section décris les différentes constantes utilisées par le système ForthEx.
index principal

VERSION ( -- c-addr )

Constante système, Adresse de la chaîne compté qui contient l'information de version firmware.
Utilisation: VERSION COUNT TYPE

arguments:
aucun   
retourne:
c-addr   Adresse de la chaîne constante en mémoire FLASH.
index
haut
index principal

R0 ( -- a-addr )

Constante système, retourne l'adresse de la base de la pile des retours.

arguments:
aucun   
retourne:
a-addr   Adresse de la base de la pile des retours.
index
haut
index principal

S0 ( -- a-addr )

Constante système qui retourne l'adresse de la base de la piles des arguments.

arguments:
aucun   
retourne:
a-addr   Adresse de la base de la pile des arguments.
index
haut
index principal

RAMEND ( -- a-addr )

Constante système qui retourne l'adresse qui suis la fin de la mémoire RAM.

arguments:
aucun   
retourne:
a-addr   Adresse fin de la RAM+1
index
haut
index principal

ULIMIT ( -- a-addr )

Constante système qui retourne l'adresse qui suis la fin de la RAM utilisateur.
Cette adresse correspond au début de la mémoire HEAP qui est gérée par les définitions dans dynamem.s
Microchip appelle cette mémoire RAM, débutant à 0x8000, EDS (Extended Data Space).
Le mémoire tampon vidéo se trouve à la fin de l'EDS. Le reste de l'EDS constitue
le HEAP (mémoire dynamique).

arguments:
aucun   
retourne:
a-addr   Adresse début HEAP.
index
haut
index principal

TRUE ( -- f )

Constante système qui retourne la valeur Booléenne VRAI. Cette valeur est représentée
par l'entier -1 (tous les bit à 1 ).

arguments:
rien   
retourne:
f   indicateur Booléen VRAI = -1
index
haut
index principal

FALSE ( -- f )

Constante système qui retourne la valeur Booléenne FAUX. Cette valeur est représentée
par l'entier 0 ( tous les bits à zéro).

arguments:
rien   
retourne:
f   indicateur Booléen FAUX = 0
index
haut
index principal

DP0 ( -- a-addr )

Constante système qui retourne l'adresse du début de l'espace de données utilisateur.

arguments:
rien   
retourne:
a-addr   Adresse du début de l'espace utilisateur en mémoire RAM.
index
haut
index principal

CELL ( -- u )

Constante système qui retourne la taille d'une cellule.
Une cellule est le nom donné à un élément de la pile.
Pour forthEx sur PIC24EP les entiers sont de 16 bits donc
la pile utilise des cellules de 2 octets.

arguments:
aucun   
retourne:
u   Grandeur d'une cellule en octets.
index
haut
index principal

Description

Cette section décris les différentes variables utilisées par le système.
index principal

DP ( -- a-addr )

Variable système qui contient la position du pointeur de donnée dans l'esapce utilisateur.
Lorsqu'une nouvelle définition est créée ou que de l'espace est réservé avec ALLOT ce
pointeur avance à la première position libre. La valeur de cette variable est retournée
par le mot HERE.

arguments:
aucun   
retourne:
a-addr   Adresse de la variable.
index
haut
index principal

BASE ( -- a-addr )

Variable système qui contient la valeur de la base numérique active.
Le contenu de cette variable est modifiée par les mots HEX et DECIMAL.
Peut aussi être modifiée manuellement exemple:
2 BASE ! \ passage en base binaire.

arguments:
aucun   
retourne:
a-addr   Adresse de la variable.
index
haut
index principal

SYSLATEST ( -- a-addr )

Variable système qui contient le NFA (Name Field Address) du dernier mot défini dans le dictionnaire
système en mémoire FLASH. Le dictionnaire est divisé en 2 parties, la partie système
qui réside en mémoire FLASH et la partie utilisateur qui réside en mémoire RAM.

arguments:
aucun   
retourne:
a-addr   Adresse de la variable.
index
haut
index principal

LATEST ( -- a-addr )

Variable système qui contient le NFA du dernier mot défini par l'utilisateur.
Si le dictionnaire utilisateur est vide LASTEST contient la même valeur que SYSLATEST.
C'est le début de la liste des mots définis par l'utilisateur.

arguments:
aucun   
retourne:
a-addr   Adresse de la variable.
index
haut
index principal

Description

La machine Virtuelle ForthEx utilise 3 piles.
La pile des arguments sert a passer des arguments d'une fonction à une autre
ainsi qu'à retourner les valeurs des fonctions.
La pile des retours sert principalement a conserver la valeur du pointeur
d'instruction lors de l'appel de mots de haut-niveau afin de retourner au point
initial. Mais elle sert aussi à conserver des valeurs temporaires.
La 3ième pile est utilisée seulement par le compilateur pour conserver des adresses
de sauts qui doivent-être résolues avant de terminer la compilation.
Les mots suivants servent à manipuler le contenu des piles.
Lorsqu'il n'y a pas d'indication il s'agit de la pile des arguments autrement,
R: représente la pile des retours et C: la pile de contrôle.
index principal

DUP ( x1 -- x1 x2 )

Clone la valeur au sommet de la pile.

arguments:
x1   Valeur au sommet de la pile des arguments.
retourne:
x1   Valeur originale.
x2   Copie de x1.
index
haut
index principal

2DUP ( d1 -- d1 d2 )

Clone l'entier double qui est au sommet de la pile.

arguments:
d1   Entier double.
retourne:
d1   Valeur originale.
d2   Copie de d1.
index
haut
index principal

?DUP ( x1 -- 0 | x1 x2 )

Clone la valeur au sommet de la pile si cette valeur est différente de zéro.

arguments:
x1   Valeur au sommet de la pile.
retourne:
x1   Valeur originale.
x2   Copie de x1 si x1<>0.
index
haut
index principal

DROP ( x -- )

Jette la valeur au sommet de la pile.

arguments:
x   Valeur au sommet de la pile.
retourne:
rien   La pile contient 1 élément de moins.
index
haut
index principal

2DROP ( x1 x2 -- )

Jette les 2 valeurs au sommet de la pile.

arguments:
x1   Valeur sous le sommet.
x2   Valeur au sommet de la pile.
retourne:
rien   La pile contient 2 éléments de moins.
index
haut
index principal

RDROP ( R: x -- )

Jette la valeur au sommet de la pile des retours.

arguments:
x   Valeur au sommet de la pile des retours.
retourne:
rien   La pile des retours contient 1 élément de moins.
index
haut
index principal

SWAP ( x1 x2 -- x2 x1 )

Inverse l'ordre des 2 éléments au sommet de la pile des arguments.

arguments:
x1   Deuxième élément de la pile.
x2   Élément au sommet de la pile.
retourne:
x2   La valeur qui était au sommet est maintenant en second.
x1   La valeur qui était en second est maintenant au sommet.
index
haut
index principal

2SWAP ( d1 d2 -- d2 d1 )

Notation alternative: ( n1 n2 n3 n4 -- n3 n4 n1 n2 )
Inverse l'ordre de 2 entiers doubles au sommet de la pile.

arguments:
d1   Second entier double de la pile des arguments.
d2   Entier double au sommet.
retourne:
d2   Le sommet est maintenant en second.
d1   Le second est maintenant au sommet.
index
haut
index principal

ROT ( n1 n2 n3 -- n2 n3 n1 )

Rotation des 3 éléments du sommet de sorte que le 3ième se retrouve au sommet.

arguments:
n1   Élément en 3ième position de la pile.
n2   Élément en 2ième position de la pile.
n3   Élément a sommet de la pile.
retourne:
n2   Le second est maintenant en 3ième position.
n3   Le sommet est maintenant en 2ième position.
n1   Le 3ième est maintenant au sommet.
index
haut
index principal

-ROT ( n1 n2 n3 -- n3 n1 n2 )

Rotation inverse des 3 éléments du sommet de la pile.
Le sommet est envoyé en 3ième position.

arguments:
n1   3ième élément de la pile.
n2   2ième élément de la pile.
n3   1ier élément de la pile.
retourne:
n3   Le sommet est maintenant en 3ième position.
n1   Le 3ième est maintenant en 2ième position.
n2   Le second élément est maintenant au sommet.
index
haut
index principal

OVER ( n1 n2 -- n1 n2 n1 )

Copie du second élément de la pile par dessus le sommet de celle-ci.

arguments:
n1   Second élément de la pile.
n2   Sommet de la pile.
retourne:
n1   Le second est maintenant le 3ième.
n2   Le sommet est maintenant le 2ième.
n1   Une copie du second se retrouve maintenant au somment.
index
haut
index principal

2OVER ( d1 d2 -- d1 d2 d1 )

Si on considère qu'il y a 2 entiers doubles au sommet de la pile, une
copie du second est créé au sommet. La pile s'allonge donc de 2 cellules.

arguments:
d1   Entier double en seconde position.
d2   Entier double au somment.
retourne:
d1   L'entier double qui était en second est maintenant en 3ième position.
d2   L'entier double qui était au sommet est maintenant en 2ième position.
d1   Une copie du 2ième entier double est maintenant au somment.
index
haut
index principal

NIP ( x1 x2 -- x2 )

Jette le second élément de la pile.

arguments:
x1   Valeur en second sur la pile.
x2   Valeur au sommet de la pile.
retourne:
x2   La valeur au sommet n'a pas changée mais le 2ième élément est disparue.
index
haut
index principal

TUCK ( x1 x2 -- x2 x1 x2 )

Insère une copie de la valeur au sommet de la pile des arguments
Sous la valeur en 2ième position. Après cette opération la pile contient
1 élément de plus.

arguments:
x1   Second éléméent de la pile.
x2   Élément au sommet de la pile.
retourne:
x2   copie du sommet de la pile.
x1   2ieme élément de la pile demeure inchangé.
x2   Sommet de la pile demeure inchangé.
index
haut
index principal

>R ( x -- R: -- x )

Transfert le sommet de la pile des arguments au sommet de la pile des retours.
Après cette opération la pile des arguments a raccourcie d'un élément et la
pile des retours a rallongée d'un élément.

arguments:
x   Valeur au sommet de la pile des arguments.
retourne:
rien   La valeur x est maintenant au sommet de la pile des retours.
index
haut
index principal

R> ( -- x R: x -- )

Transfert d'un élément de la pile des retours vers la pile des arguments.
Après cette opération la pile des retours a raccourcie de 1 élément et la
pile des arguments a rallongée d'un élément.

arguments:
x   Valeur au somment des retours.
retourne:
x   Valeur qui était au sommet de R: est maintenant ajoutée au sommet de S:.
index
haut
index principal

IP@ ( -- n )

Retourne la valeur du pointeur d'instruction de la machine virtuelle forth.

arguments:
aucun   
retourne:
n   Valeur de IP.
index
haut
index principal

DEPTH ( -- n )

Retourne le nombre d'éléments sur la pile des arguments. Le nombre d'éléments
renvoyé exclu ce nouvel élément.

arguments:
aucun   
retourne:
n   Nombre d'éléments qu'il y avait sur la pile avant cette opération.
index
haut
index principal

PICK ( i*x n -- i*x x )

Place une copie du nième élément de la pile au sommet de celle-ci.
l'argument n est retiré de la pile avant le comptage.
Si n==0 équivaut à DUP
Si n==1 équivaut à OVER

arguments:
i*x   Liste des éléments présent sur la pile.
n   Position de l'élément recherché, 0 étant le sommet.
retourne:
i*x   Liste originale des éléments.
x   Copie de l'élément en position n.
index
haut
index principal

R@ ( -- x R: x -- x )

La valeur au sommet de la pile des retours est copiée au sommet de la pile
des arguments. Le contenu de la pile des retours n'est pas modifié. Le contenu
de la pile des arguments a 1 élément supplémentaire.

arguments:
aucun  
retourne:
x   Valeur ajoutée à la pile des arguments, copie du sommet de R.
index
haut
index principal

SP@ ( -- n )

Retourne la valeur du pointeur de la pile des arguments.

arguments:
aucun   
retourne:
n   Valeur du pointeur SP avant cette opération.
index
haut
index principal

SP! ( n -- )

Initialise le pointeur de la pile des arguments avec la valeur
au sommet de la pile des arguments.

arguments:
n   Valeur d'initialisation de SP.
retourne:
rien  
index
haut
index principal

RP@ ( -- n )

Retourne la valeur du pointeur de la pile des retours.

arguments:
aucun   
retourne:
n   Valeur du pointeur de la pile des retours.
index
haut
index principal

RP! ( n -- )

Initialise le pointeur de la pile des retours avec la valeur
qui est au sommet de la pile des arguments.

arguments:
n   Valeur d'initialistaion de RP.
retourne:
rien  
index
haut
index principal

>CSTK ( x -- C: -- x )

Utiliser par le compilateur.
Tranfert du sommet de la pile des arguments
vers la pile de contrôle. Après cette opération la pile
des arguments à perdue un élément et la pile de contrôle en a
gagné un.

arguments:
x   Valeur au sommet de la pile des arguments.
retourne:
rien   Le sommet de la pile de contrôle contient x.
index
haut
index principal

CSTK> ( -- x C: x -- )

Utilisé par le compilateur.
Transfert du sommet de la pile de contrôle
vers la pile des arguments. Après cette opération la pile de contrôle
contient un élément de moins et la pile des arguments un élément de plus.

arguments:
x   Valeur au sommet de la pile de contrôle.
retourne:
x   Valeur ajoutée au sommet de la pile des arguments.
index
haut
index principal

@ ( a-addr -- n )

Retourne l'entier qui se trouve à l'adresse qui est au sommet de la pile des arguments.
Cette adresse doit-être alignée sur une adresse paire.
Les adresses >= 32768 accèdent la mémoire FLASH dans l'interval {0..32766}.
L'accès à la mémoire flash ne permet que la lecture du mot faible, i.e. bits 15:0 de l'instruction.

arguments:
a-addr   Adresse de la variable.
retourne:
n Entier   contenu à cette adresse.
index
haut
index principal

C@ ( c-addr -- c )

Retourne l'octet contenu à l'adresse caractère qui est au sommet de la pile.
Les adresses >= 32768 accèdent la mémoire FLASH dans l'interval {0..32767}.
L'accès à la mémoire flash ne permet que la lecture des 2 octets du mot faible.
Si l'adresse est paire les bits 7:0 sont lus.
Si l'adresse est impaire les bits 15:8 sont lus.

arguments:
c-addr   Adresse alignée sur un octet.
retourne:
c   Caractère contenu à cette adresse.
index
haut
index principal

2@ ( a-addr -- d )

Retourne la valeur de type entier double qui est à l'adresse a-addr.
Cette adresse doit-être alignée sur une valeur paire.
Les adresses >= 32768 accèdent la mémoire FLASH.
S'il s'agit d'une adresse en FLASH, les valeurs du mot faible de 2 instructions
successive sont retournées.

arguments:
a-addr   Adresse de la variable
retourne:
d   Entier double, valeur de cette variable.
index
haut
index principal

BID@ ( c-addr -- d )

Empile un entier double stocké en mémoire en format BIG INDIAN

arguments:
c-addr   Adresse du premier octet.
retourne:
d   Entier double.
index
haut
index principal

TBL@ ( n a-addr -- n )

Retourne l'élément n d'un vecteur. Les valeurs d'indice débute à zéro.
L'adresse de la table doit-être alignée sur une adresse paire.
Les adresses >= 32768 sont en mémoire FLASH. S'il s'agit d'une adresse en FLASH
la valeur du mot faible de l'instruction est retourné.

arguments:
n   Indice dans le vecteur.
a-addr   Adresse du vecteur.
retourne:
n   Valeur de l'élément n du vecteur.
index
haut
index principal

TBL! ( n1 n2 a-addr -- )

Sauvegarde l'entier n1 dans l'élément d'indice n2 du vecteur dont d'adresse a-addr.
L'adresse de table doit-être alignée sur un nombre pair.
a-addr[n2] = n1.
Les adresses >= 32768 accèdent la mémoire EDS.

arguments:
n1   Valeur à affecté à l'élément.
n2   Indice de l'élément.
a-addr   Adresse de la table.
retourne:
rien   
index
haut
index principal

! ( n a-addr -- )

Sauvegarde d'un entier dans une variable.
Accède les SFR, la RAM utilisateur et la RAM EDS.

arguments:
n   Valeur à sauvegarder.
a-addr   Adresse de la variable.
retourne:
rien  
index
haut
index principal

C! ( c c-addr -- )

Sauvegarde un caractère dans une variable.
Accède les SFR, la RAM utilisateur et la RAM EDS.

arguments:
c   Valeur à sauvegarder.
c-addr   Adresse de la variable.
retourne:
rien  
index
haut
index principal

2! ( d a-addr -- )

Sauvegarde d'un entier double.
Accède les SFR, la RAM utilisateur et la RAM EDS

arguments:
d   Entier double
a-addr   Adresse de la variable.
retourne:
rien  
index
haut
index principal

2>R ( S: d -- R: -- d )

Transfert un entier double de la pile des arguments vers la pile des retours.

arguments:
d   Entier double ou 2 entiers simples.
retourne:
rien   L'entier double est maintenant sur R:
index
haut
index principal

2R> ( S: -- d R: d -- )

Transfert un entier double de la pile des retours vers la pile des arguments.

arguments:
d   Entier double sur R: à transférer sur S:.
retourne:
d   Entier double en provenance de R:
index
haut
index principal

2R@ ( S: -- d R: d -- d )

Copie un entier double de la pile des retours vers la pile des arguments.

arguments:
d   Entier double sur R: qui sera copié sur S:
retourne:
d   Copie de l'entier double en provenance de R:
index
haut
index principal

CELL+ ( addr -- addr' )

Incrémente l'adresse au sommet de la pile de la taille d'une cellule.

arguments:
addr   Adresse.
retourne:
addr'   Adresse incrémentée de la taille d'une cellule.
index
haut
index principal

CELLS ( n1 -- n2 )

Convertie l'entier n1 en taille occupée par n1 cellules.
n2=n1*CELL_SIZE

arguments:
n1   Nombre de cellules.
retourne:
n2   Espace occupé par n1 cellules.
index
haut
index principal

I ( -- n )

Utilisé à l'intérieur d'une boucle DO ... LOOP ou +LOOP.
Retourne le compteur de boucle.

arguments:
aucun   
retourne:
n   Valeur actuelle de I.
index
haut
index principal

L ( -- n )

Utilisé à l'intérieur d'une boucle DO ... LOOP ou +LOOP.
Retourne la limite de boucle.

arguments:
aucun   
retourne:
n   Valeur de LIMIT.
index
haut
index principal

J ( -- n )

Utilisé à l'intérieur d'une boucle DO ... LOOP imbriquée dans une autre.
Retourne le compteur de la boucle externe.

arguments:
aucun   
retourne:
n   Valeur actuelle du compteur de la boucle externe.
index
haut
index principal

UNLOOP ( R: n1 n2 -- )

Utilisé à l'interieur d'une boucle DO ... LOOP ou +LOOP.
Restore les valeurs des variables I et LIMIT tels qu'elles étaient
avant l'exécution du dernier DO ou ?DO.
Après exécution LIMIT=n1, I=n2

arguments:
aucun   
retourne:
rien  
index
haut
index principal

Description

Les mots suivants servent à exécuter des fonctions à partir de l'information
qui se trouve sur la pile des arguments.
index principal

EXECUTE ( i*x a-addr -- j*x )

Exécute le mot dont le CFA (Code Field Address) est au sommet de la pile.

arguments:
i*x   Liste des arguments consommés par ce mot.
a-addr   CFA du mot à exécuter.
retourne:
j*x   Valeurs retournées par l'exécution du mot.
index
haut
index principal

@EXEC ( i*x a-addr -- j*x )

Exécution vectorisée.
Lit le contenu d'une adresse qui contient le CFA d'un mot et exécute ce mot.
: @EXEC @ EXECUTE ;

arguments:
i*x   Arguments attendus par la fonction qui sera exécutée.
a-addr   Adresse qui contient le CFA du code à exécuter. Accès RAM + FLASH
retourne:
j*x   Valeurs laissées par le mot exécuté.
index
haut
index principal

VEXEC ( i*x a-addr n -- j*x )

Excécution vectorisé de la fonction 'n' dans la table 'a-addr'.
Le premier indice de la table est zéro.
: VEXEC CELLS + @ EXECUTE ;

arguments:
i*x   Arguments requis par la fonction à exécuter.
a-addr   Adresse de la table des CFA.
n   Index de l'élément dans la table.
retourne:
j*x   Valeurs retournées par la fonction exécutée.
index
haut
index principal

CALL ( i*x ud -- j*x )

Appel d'une routine écrite en code machine et résident en mémoire flash.
La routine doit se terminée par une instruction machine RETURN.
Utilise l'instruction machine CALL.L spécifique aux PIC24E et dsPIC33E.
À utiliser avec précaution, la routine en code machine ne doit pas écraser
les registres utilisés par le système ForthEx {W8..W15}.
Le code machine doit avoir été préalablement flashée en utilisant
le mot RAM>FLASH. Un outil externe doit-être utilisé pour générer le code
binaire de cette fonction. ForthEx n'a pas d'assembleur.

arguments:
i*x   Arguments consommés par la routine, dépend de celle-ci.
ud   Adresse 24 bits de la routine.
retourne:
j*x   Valeurs laissées sur la pile par la routine, dépend de celle-ci.
index
haut
index principal

Index


haut
index principal