core
Description
Vocabulaire de base du système ForthEx.
Liste de références utiles concernant le langage Forth.
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
Description
Cette section décris les différentes constantes utilisées par le système ForthEx.
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.
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.
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.
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
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.
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
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
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.
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.
Description
Cette section décris les différentes variables utilisées par le système.
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.
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.
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.
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.
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.
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.
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.
?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.
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.
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.
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.
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.
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.
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.
-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.
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.
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.
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.
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é.
>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.
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:.
IP@ ( -- n )
Retourne la valeur du pointeur d'instruction de la machine virtuelle forth.
arguments:
aucun
retourne:
n Valeur de IP.
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.
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.
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.
SP@ ( -- n )
Retourne la valeur du pointeur de la pile des arguments.
arguments:
aucun
retourne:
n Valeur du pointeur SP avant cette opération.
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
RP@ ( -- n )
Retourne la valeur du pointeur de la pile des retours.
arguments:
aucun
retourne:
n Valeur du pointeur de la pile des retours.
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
>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.
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.
@ ( 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.
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.
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.
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.
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.
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
! ( 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
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
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
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:
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:
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:
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.
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.
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.
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.
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.
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
Description
Les mots suivants servent à exécuter des fonctions à partir de l'information
qui se trouve sur la pile des arguments.
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.
@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é.
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.
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