Tous les mots
Généralités
Les mots sont classés par catégories sémantiques et par ordre alphabétique dans ces catégories. Chaque entrée commence par un rappel de la catégorie du mot, de sa signature, et d'une mention indiquant si c'est un mot immédiat.
Suit une description du mot et, pour la majorité des mots, un exemple d'utilisation.
Nommages
Les mots Forth obéissent à certaines règles de nommage générales.
- Les mots qui commencent par
D
ou2
traitent de nombres en double précisions. - Les mots qui commencent par
C
traitent de caractères/octets. - Les mots entre parenthèses sont des mots utilisés par d'autres mots de même nom sans les parenthèses.
- Les mots entourés par des crochets sont des mots immédiats pendant la compilation (il n'y en a qu'un dans ce Forth,
COMPILE
).
TODOs
Certains passages sont marqués par ?TODO?. Il s'agit d'endroits qui ne m'ont pas semblé clair à l'usage, ou bien où l'usage n'est pas conforme à la documentation trouvée, et sur lesquels il faudra se pencher plus.
De même, les mots dans la section À trier
sont à étudier pour les documenter et les déplacer dans les sections appropriées.
Affichage
.
Groupe | Signature |
---|---|
Affichage | ( n - ) |
Affiche n
à l'écran dans la base de conversion courante.
123 . \ affiche `123`
?
Groupe | Signature |
---|---|
Affichage | ( addr - ) |
Affiche à l'écran la valeur 16 bits pointée par addr
.
HERE ? \ affiche l'adresse de fin de la zone de dictionnaire.
AT
Groupe | Signature |
---|---|
Affichage | ( n1 n2 - ) |
Déplace le curseur de texte à la position.
En mode LITTLE
, (n1, n2)
est spécifié en pixels.
En mode BIG
, (n1, n2)
est spécifié en nombre de caractères et prend en compte le facteur d'échelle SCALE
.
CLS
Groupe | Signature |
---|---|
Affichage | ( - ) |
Efface l'intégralité de la surface affichable avec la couleur spécifiée par PAPER
. Ne modifie pas les coordonnées de la fenêtre texte actuelle définie par WINDOW
.
D.
Groupe | Signature |
---|---|
Affichage | ( d - ) |
Affiche d
le nombre sur la pile en double précision.
0 1 D. \ affiche 65536
1 0 D. \ affiche 1
D.R
Groupe | Signature |
---|---|
Affichage | ( d1 n2 - ) |
Affiche d1
ajusté à droite pour un champ de n2
caractères.
CR 5. 10 D.R \ affiche " 5"
EMIT
Groupe | Signature |
---|---|
Affichage | ( n - ) |
Affiche le caractère ascii n
.
65 EMIT \ affiche `A`
HOME
Groupe | Signature |
---|---|
Affichage | ( - ) |
Déplace le curseur en haut à gauche de l'écran, annule la fenêtre de texte définie par WINDOW
et remet le facteur d'échelle (SCALE
) à (1, 1)
. L'écran n'est pas effacé. c'est l'équivalent de 15 EMIT
.
L/SCR
Groupe | Signature |
---|---|
Systême | ( - n ) |
Met sur la pile le nombre de lignes de l'écran.
PAGE
Groupe | Signature |
---|---|
Affichage | ( - ) |
Efface la fenêtre de texte courante avec la couleur définie par PAPER
et place le curseur en haut à gauche de cette fenêtre. au démarrage, la fenêtre texte prend presque toute la surface affichable. Il est possible de la redéfinir avec WINDOW
.
PAPER
Groupe | Signature |
---|---|
Affichage | ( n - ) |
Choisi l'index n
dans la palette de couleur pour la couleur de fond du texte.
PEN
Groupe | Signature |
---|---|
Affichage | ( n - ) |
Choisi l'index n
dans la palette de couleur pour la couleur d'écriture du texte.
SCALE
Groupe | Signature |
---|---|
Affichage | ( n1 n2 - ) |
Change l'échelle de l'affichage des caractères en mode standard
par un facteur de grossissement sur les deux axes de (n1, n2)
.
SPECIAL
Groupe | Signature |
---|---|
Affichage | ( - ) |
Passe en mode d'affichage texte SPECIAL
, qui utilise le mode d'accès BIG
pour un affichage rapide.
Voir STANDARD
.
STANDARD
Groupe | Signature |
---|---|
Affichage | ( - ) |
Passe en mode d'affichage texte STANDARD
, qui utilise le mode d'accès LITTLE
pour un affichage avec plus de caractères à l'écran, mais plus lent que SPECIAL
.
U.
Groupe | Signature |
---|---|
Affichage | ( u - ) |
Affiche u
à l'écran en non signé dans la base de conversion courante.
65535 . \ affiche -1
65535 U. \ affiche 65535
WINDOW
Groupe | Signature |
---|---|
Affichage | ( n1 n2 n3 n4 - ) |
Définie la fenêtre d'affichage pour l'affichage du texte. Il y a deux fenêtres définies
en même temps : l'une pour le mode STANDARD
et l'autre pour le mode SPECIAL
.
La fenêtre active est celle défini pour le mode correspondant.
La fenêtre commence aux coordonnées (n1, n2)
et de largeur et hauteur (n3, n4)
.
En mode SPECIAL
, la position est exprimée en octets pour n1
(donc par « unité » de 4 pixels de large) et en ligne pour n2
, à partir du coin haut
gauche de l'écran. La largeur est exprimée en nombre de caractères (et prend en compte le facteur
d'échelle SCALE
). La hauteur n'a pas d'influence, la fenêtre sera
toujours de la hauteur de l'écran.
En mode STANDARD
, les coordonnées sont précisées en pixels à partir du coin bas gauche de l'écran.
Les abscisses (coordonnées en X) réelles de la fenêtre sont ajustées pour être des multiples de 4 pixels.
Le mode BIG
ou LITTLE
n'a pas d'influence sur les coordonnées spécifiées.
Arithmétique
-
Groupe | Signature |
---|---|
Arithmétique | ( n1 n2 - n3 ) |
Met sur la pile la différence de n1 et n2.
3 2 - . \ affiche `1`.
+
Groupe | Signature |
---|---|
Arithmétique | ( n1 n2 - n3 ) |
Met sur la pile la somme n3
de n1
et n2
.
Voir D+
pour les valeurs sur 32 bits.
2 3 + . \ affiche `5`.
+-
Groupe | Signature |
---|---|
Arithmétique | ( n1 n2 - n3 ) |
Si n2
est négatif, n3
est l'opposé de n2
. Sinon, n1
est laissé sur la pile.
Voir D+-
pour les valeurs sur 32 bits.
*
Groupe | Signature |
---|---|
Arithmétique | ( n1 n2 - n3 ) |
Met sur la pile le produit n3
de n1
et n2
.
2 3 * . \ affiche `6`
*/
Groupe | Signature |
---|---|
Arithmétique | ( n1 n2 n3 - n4 ) |
Met sur la pile le quotient n4
de n1
multiplié par n2
divisé par n3
.
L'opération est fait en 32 bits, ce qui permet d'éviter un débordement en cas de multiplication des deux nombres de 16 bits.
10 2 3 */ . \ affiche `6`
*/MOD
Groupe | Signature |
---|---|
Arithmétique | ( n1 n2 n3 - n4 n5 ) |
Met sur la pile le produit n5
de n1
et n2
divisé par n3
, ainsi que le reste n4
de cette division.
L'opération est faite en 32 bits, ce qui permet d'éviter un débordement en cas de multiplication des deux nombres de 16 bits.
10 2 3 */MOD . . \ affiche `6 2`
/
Groupe | Signature |
---|---|
Arithmétique | ( n1 n2 - n3 ) |
Met sur la pile le quotient n3
de la division entière de n1
par n2
.
5 2 / . \ affiche `2`
/MOD
Groupe | Signature |
---|---|
Arithmétique | ( n1 n2 - n3 n4 ) |
Met sur la pile le quotient n4
et le reste n3
de la division de n1
par n2
.
5 2 /MOD . . \ affiche `2 1`
0
Groupe | Signature |
---|---|
Arithmétique | ( - n ) |
Met sur la pile la valeur 0.
0
, 1
, 2
et 3
sont des mots qui sont définis comme des constantes mettant respectivement les valeurs numériques 0, 1, 2 et 3 sur la pile.
La plupart des Forth définissent des mots pour des nombres fréquents, ce qui permet d'éviter le parcours complet du dictionnaire ainsi que la conversion de la chaîne en nombre.
Ces constantes ayant une valeur numérique, elles sont insensibles à la BASE
courante, ce qui peut se révèler perturbant.
1
Groupe | Signature |
---|---|
Arithmétique | ( - n ) |
Met sur la pile la valeur 1.
2
Groupe | Signature |
---|---|
Arithmétique | ( - n ) |
Met sur la pile la valeur 2.
256RND
Groupe | Signature |
---|---|
Arithmétique | ( - n ) |
Met sur la pile un nombre aléatoire entre 0 et 255 inclus.
3
Groupe | Signature |
---|---|
Arithmétique | ( - n ) |
Met sur la pile la valeur 3.
1+
Groupe | Signature |
---|---|
Arithmétique | ( n1 - n2 ) |
Ajoute 1
à n1
et met le résultat n2
sur la pile.
1 1+ . \ affiche `2`
1-
Groupe | Signature |
---|---|
Arithmétique | ( n1 - n2 ) |
Retire 1
à n1
et met le résultat n2
sur la pile.
1 1- . \ affiche `0`
2+
Groupe | Signature |
---|---|
Arithmétique | ( n1 - n2 ) |
Ajoute 2
à n1
et met le résultat n2
sur la pile.
1 2+ . \ affiche `3`
2-
Groupe | Signature |
---|---|
Arithmétique | ( n1 - n2 ) |
Retire 2 à n1
et met le résultat n2
sur la pile.
1 2- . \ affiche `-1`
2*
Groupe | Signature |
---|---|
Arithmétique | ( n1 - n2 ) |
Multiplie n1
par 2 et met le résultat n2
sur la pile.
2 2* . \ affiche `4`
2/
Groupe | Signature |
---|---|
Arithmétique | ( n1 - n2 ) |
Divise n1
par 2 et met le résultat n2
sur la pile.
4 2/ . \ affiche `2`
ABS
Groupe | Signature |
---|---|
Arithmétique | ( n1 - n2 ) |
Met sur la pile la valeur absolue de n
.
Voir DABS
pour les valeurs sur 32 bits.
-2 ABS . \ affiche `2`
AND
Groupe | Signature |
---|---|
Arithmétique | ( n1 n2 - n3 ) |
Met sur la pile le résultat du ET
bit à bit de n1
et n2
.
HEX
0F 03 AND . \ affiche `3`
C*
Groupe | Signature |
---|---|
Arithmétique | ( c1 c2 - n1 ) |
Place sur la pile la multiplication de c1
par c2
. Les valeurs en entrée sont non signées et seuls les 8 bits de poids faibles sont pris en compte
-1 2 C* . \ affiche 510
D+-
Groupe | Signature |
---|---|
Arithmétique | ( d1 d2 - d3 ) |
Si d2
est négatif, d3
est l'opposé de d2
. Sinon, d1
est laissé sur la pile.
Voir +-
pour les valeurs sur 16 bits.
DABS
Groupe | Signature |
---|---|
Arithmétique | ( d1 - d2 ) |
Met sur la pile la valeur absolue d2
de d1
(en 32 bits).
Voir ABS
pour les valeurs sur 16 bits.
-2 0 DABS D. \ affiche `65534`
-2. DABS D. \ affiche `2`.
DECIMAL
Groupe | Signature |
---|---|
Arithmétique | ( - ) |
Met la base numérique à 10. Équivaut à A BASE !
si on se trouve en base 16.
DIGIT
Groupe | Signature |
---|---|
Arithmétique | ( n1 n2 - b n3 ) |
Le mot DIGIT
convertit le caractère n1
(en ASCII) en un nombre n3
selon la base n2
. Si le caractère n'est pas un chiffre dans cette base, b
est faux (0
), sinon b
est vrai (1
).
DMINUS
Groupe | Signature |
---|---|
Arithmétique | ( d1 - d2 ) |
Met sur la pile d2
, l'opposé de d1
(valeur sur 32 bits).
Voir MINUS
pour les valeurs sur 16 bits.
1. DMINUS D. \ affiche `-1`
D+
Groupe | Signature |
---|---|
Arithmétique | ( d1 d2 - d3 ) |
Met sur la pile la somme d3
de d1
et d2
(valeurs sur 32 bits).
Voir +
pour les valeurs sur 16 bits.
1. 2. D+ D. \ affiche `3`
D-
Groupe | Signature |
---|---|
Arithmétique | ( d1 d2 - d3 ) |
Met sur la pile la différence d3
de d1
et d2
(valeurs sur 32 bits).
1. 2. D- D. \ affiche `-1`
HEX
Groupe | Signature |
---|---|
Arithmétique | ( - ) |
Met la base numérique à 16. Équivaut à 16 BASE !
si on se trouve en base 10.
M*
Groupe | Signature |
---|---|
Arithmétique | ( n1 n2 - d1 ) |
Met sur la pile le produit d1
de n1
et n2
, en double précision.
2000 526 M* D. \ affiche `1052000`
M/
Groupe | Signature |
---|---|
Arithmétique | ( d n1 - n2 n3 ) |
Met sur la pile le quotient n3
et le reste n2
de la division de d
(en double précision) par n1
(simple précision).
1052000. 526 M/ . . \ affiche `2000 0`
M/MOD
Groupe | Signature |
---|---|
Arithmétique | ( d1 u1 - u2 d2 ) |
Met sur la pile le quotient d2
et le reste de la division u2
de d1
par u1
.
1052000. 526 M/MOD D. U. \ affiche `2000 0`
MAX
Groupe | Signature |
---|---|
Arithmétique | ( n1 n2 - n3 ) |
Met sur la pile le maximum de n1
et n2
.
2 3 MAX . \ affiche `3`
MIN
Groupe | Signature |
---|---|
Arithmétique | ( n1 n2 - n3 ) |
Met sur la pile le minimum de n1
et n2
.
2 3 MIN . \ affiche `2`
MINUS
Groupe | Signature |
---|---|
Arithmétique | ( n1 - n2 ) |
Met sur la pile n2
, l'opposé de n1
.
Voir DMINUS
pour les valeurs sur 32 bits.
2 MINUS . \ affiche `-2`.
MOD
Groupe | Signature |
---|---|
Arithmétique | ( n1 n2 - n3 ) |
Met sur la pile le reste de la division entière de n1
par n2
.
5 2 MOD . \ affiche `1`
6 2 MOD . \ affiche `0`
NOT
Groupe | Signature |
---|---|
Arithmétique | ( b1 - b2 ) |
Met sur la pile l'opposé booléen du premier élément de la pile.
Équivalent de 0=
.
0 NOT . \ affiche `1`
1 NOT . \ affiche `0`.
3 NOT . \ affiche `0`.
OR
Groupe | Signature |
---|---|
Arithmétique | ( n1 n2 - n3 ) |
Met sur la pile le résultat du OU
bit à bit de n1
et n2
.
HEX
0F 03 OR . \ affiche `F`
0F F0 OR . \ affiche `FF`
RANDOM
Groupe | Signature |
---|---|
Arithmétique | ( - ) |
Initialise le générateur de nombres aléatoires.
RND
Groupe | Signature |
---|---|
Arithmétique | ( n1 - n2 ) |
Met sur la pile un nombre aléatoire n2
entre 0
et n1
(n1
exclu).
: TIRE 10 0 DO
10 RND .
LOOP ;
TIRE \ affiche 10 nombres aléatoires entre 0 et 9
S->D
Groupe | Signature |
---|---|
Arithmétique | ( n - d ) |
Transforme la valeur n
simple précision de la pile en double précision d
.
5 S->D D. \ affiche `5`
-1 S->D DABS D. \ affiche `1`
U*
Groupe | Signature |
---|---|
Arithmétique | ( u1 u2 - d3 ) |
Met sur la pile le produit de u1
et u2
. Les valeurs sont non signées. Le résultat mis sur la pile est sur 32 bits signé.
65535 2 U* D. \ affiche `131070`
U/
Groupe | Signature |
---|---|
Arithmétique | ( d u1 - u2 u3 ) |
Met sur la pile le quotient u3
et le reste u2
de d
(sur 32 bits) par u1
(sur 16 bits). Les valeurs sont non signées.
65536. 2 U/ U. U. \ affiche `32768 0`
XOR
Groupe | Signature |
---|---|
Arithmétique | ( n1 n2 - n3 ) |
Met sur la pile le résultat du OU EXCLUSIF
bit à bit de n1
et n2
.
HEX
0F 0F XOR . \ affiche `0`
1F 3F XOR . \ affiche `20`
Audio
HUSH
Groupe | Signature |
---|---|
Audio | ( - ) |
Arrête la génération de tous les bruits créés par [SOUND
(#sound)].
SOUND
Groupe | Signature |
---|---|
Audio | ( n1 n2 - ) |
Génère un son bouclant à partir d'un numéro de registre n1
entre 0
et 7
, ainsi qu'une valeur n2
entre 0
et 32767
. un nouveau SOUND
remplacera le son précédent. HUSH
arrête le son.
TONE
Groupe | Signature |
---|---|
Audio | ( n1 n2 - ) |
Joue une note de hauteur n1
et de durée n2
. plus n1
est grand, plus la note est grave. La durée réelle dépend du rapport de n2
sur n1
(pour une même durée donnée, une note plus aiguë sera plus courte).
: PIOU 250 50 DO I 1 TONE 5 +LOOP ;
PIOU PIOU PIOU
Boucles
AGAIN
Groupe | Signature | Mot Immédiat |
---|---|---|
Boucles | ( - ) ? | Oui |
Retourne au BEGIN
précédent.
BEGIN
Groupe | Signature | Mot Immédiat |
---|---|---|
Boucles | ( - ) | Oui |
Marque le début d'une boucle. voir AGAIN
, UNTIL
, WHILE
, REPEAT
.
: INFINI
BEGIN
CR ." TEST"
AGAIN ;
TEST \ Affiche `TEST` à l'infini à l'écran.
DO
Groupe | Signature | Mot Immédiat |
---|---|---|
Boucles | ( n1 n2 - ) | Oui |
Initialise une boucle débutant à n2
à s'arrêtant à n1
. Voir LOOP
, I
, ainsi que +LOOP
.
: TEST 10 0 DO
I .
LOOP ;
TEST \ affiche les nombres de 0 à 9
END
Groupe | Signature | Mot Immédiat |
---|---|---|
Boucles | ( - ) | Oui |
Équivalent à UNTIL
.
I
Groupe | Signature |
---|---|
Boucles | ( - n ) |
Met sur la pile la valeur de l'index de la boucle en cours. Cette valeur est la valeur en haut de la pile des appels, la valeur reste sur la pile des appels. Voir DO
.
: BOUCLE 10 0 DO I . LOOP ;
BOUCLE \ affiche les valeurs de 0 à 9
I'
Groupe | Signature |
---|---|
Boucles | ( - n ) |
Met sur la pile la valeur limite de la boucle en cours. celle-ci est à la deuxième position de la pile des appels.
: BOUCLE
4 0 DO
I I' . .
LOOP ;
BOUCLE \ affiche `4 0 4 1 4 2 4 3`
J
Groupe | Signature |
---|---|
Boucles | ( - n ) |
Met sur la pile la valeur de l'index de la boucle extérieur, lorsque deux boucles DO
/LOOP
sont imbriquées. Cette valeur est à la troisième position de la pile des appels.
: BOUCLES
4 0 DO
5 0 DO
I J . .
LOOP
CR
LOOP
BOUCLES \ affiche `0 0 0 1 0 2 0 3 0 4`
\ `1 0 1 1 1 2 1 3 1 4`
\ `2 0 2 1 2 2 2 3 2 4`
\ `3 0 3 1 3 2 3 3 3 4`
LEAVE
Groupe | Signature |
---|---|
Boucles | ( - ) |
Fixe l'indice de la boucle en cours à la valeur limite, ce qui provoquera la sortie de la boucle au prochain LOOP
.
À noter : LEAVE
ne sort pas de la boucle immédiatement, les mots suivants jusqu'au prochain LOOP
sont exécutés.
: BOUCLE
4 0 DO
I 2 = IF
LEAVE
THEN
I .
LOOP
BOUCLE \ affiche `0 1 2`
LOOP
Groupe | Signature |
---|---|
Boucles | ( - ) |
Incrémente l'index de la boucle et retourne au DO
précédent si l'index n'est pas égal à la borne de fin. Sinon, continue l'exécution du mot.
: TEST 10 0 DO
I .
LOOP ;
TEST \ affiche les nombres de 0 à 9
+LOOP
Groupe | Signature |
---|---|
Boucles | ( n - ) |
Incrémente l'index de la boucle de n
. retourne au DO
si l'index n'est pas égal à la borne de fin. Sinon, continue l'exécution du mot.
L'incrément peut-être un nombre négatif.
: TEST 10 0 DO
I .
2 +LOOP ;
TEST \ affiche les nombres de 0 à 9 par pas de 2
REPEAT
Groupe | Signature | Mot Immédiat |
---|---|---|
Boucles | ( - ) | Oui |
Retourne au BEGIN
précédent dans une structure BEGIN
WHILE
REPEAT
.
UNTIL
Groupe | Signature | Mot Immédiat |
---|---|---|
Boucles | ( b - ) | Oui |
Si b
est faux, retourne au précédent BEGIN
, sinon, continue.
: TEST 10 BEGIN
1 -
DUP .
DUP 0= UNTIL ;
TEST \ Affiche les nombres de 9 à 0.
WHILE
Groupe | Signature | Mot Immédiat |
---|---|---|
Boucles | ( b - ) | Oui |
Si b
est vrai, continue la boucle débuté par BEGIN
, sinon, continue après le REPEAT
qui suit.
: TEST 10 BEGIN
1 -
DUP 0> WHILE
DUP .
REPEAT ;
Affiche les nombres de 9 à 1. 0 n'est pas affiché car la boucle s'arrête avant.
Caractères
."
Groupe | Signature |
---|---|
Caractères | ( - ) |
Affiche la chaîne qui suit le mot et se termine par le caractère "
. Attention, ."
est un mot, il doit donc être suivi d'un espace. Ce premier espace ne sera pas affiché.
CR ." HELLO WORLD" \ affiche `Hello World` en début de la ligne.
CR ." HELLO WORLD" \ Affiche `Hello World` après un caractère d'espacement.
.R
Groupe | Signature |
---|---|
Affichage | ( n1 n2 - ) |
Affiche n1
ajusté à droite pour un champ de n2
caractères.
CR 10 10 .R \ affiche " 10"
(.")
Groupe | Signature |
---|---|
Caractères | ( - ) |
Utilisé par le mot ."
pour sa compilation.
(TEXT)
Groupe | Signature |
---|---|
Caractères | ( addr n1 n2 - ) |
Acquiert depuis le flot d'entrée un texte de n2
caractères maximum terminé par le caractère n1
. place le résultat à l'adresse addr
. se sert de HERE
pour stocker le texte en acquisition.
Voir aussi RECTIFY
.
0 VARIABLE MONTEXTE 20 ALLOT \ alloue 22 octets pour un texte
MONTEXTE 22 ERASE \ place des 0 dans le texte
MONTEXTE 34 22 (TEXT) MON TEXTE" \ enregistre le texte "MON TEXTE"
MONTEXTE 22 TYPE \ affiche "MON TEXTE"
<
Groupe | Signature |
---|---|
Caractères | ( ud - ) |
Débute la conversion d'un nombre en double précision non signé en chaîne de caractères. ce mot doit être suivi par des mots de formatage et terminé par #>
. Attention : le formatage sur fait à partir de la partie droite du nombre.
123. <# # # # # #>
CR TYPE CR \ affiche "0123"
#>
Groupe | Signature |
---|---|
Caractères | ( - addr count ) |
Termine la conversion d'un nombre en chaîne de caractères débuté par le mot <#
. Laisse sur la pile l'adresse de la chaîne et le nombre de caractères, ce qui permet de l'afficher avec type
.
123. <# # # # # #>
CR TYPE CR \ affiche "0123"
Groupe | Signature |
---|---|
Caractères | ( - ) |
Lors d'un formatage de nombre, affiche le chiffre de la position courante, ou 0
s'il n'y a plus de nombre à afficher.
123. <# # #> TYPE 3
#S
Groupe | Signature |
---|---|
Caractères | ( - ) |
Lors d'un formatage de nombre, affiche tous les chiffres restant à partir de la position courante, ou 0
s'il n'y a plus de nombre à afficher. #s
affiche au moins un chiffre.
123. <# # # # #S #> TYPE \ affiche 0123
-TRAILING
Groupe | Signature |
---|---|
Caractères | ( addr count1 - addr count2 ) |
Ajuste count1
de manière à ce que les caractères espaces (ASCII 32) à la fin de la chaîne soient exclus. Remets sur la pile l'adresse ainsi que le nouveau nombre de caractères count2
.
PAD 10 BL FILL \ remplit PAD de 10 espaces
65 PAD C! \ met 'A' comme premier caractère
PAD 10 -TRAILING
TYPE \ affiche `A` sans les espaces qui suivent
BL
Groupe | Signature |
---|---|
Caractères | ( - n ) |
Met sur la pile la valeur 32 (espace).
BL EMIT \ affiche un caractère d'espacement
CAPITAL
Groupe | Signature |
---|---|
Caractères | ( addr n - ) |
Transforme la chaîne de caractères pointée par addr
en majuscules. n
est la longueur de la chaîne.
COUNT
Groupe | Signature |
---|---|
Caractères | ( addr1 - addr2 count ) |
addr1
pointe vers une chaîne précédé de sa longueur sur un octet. Met en retour sur la pile l'adresse addr2
du preier caractère de la chaîne et count
le nombre de caractères de la chaîne.
La pile est prête pour utiliser TYPE
par exemple.
CR
Groupe | Signature |
---|---|
Caractères | ( - ) |
Affiche un retour chariot (et donc passe à la ligne). Équivalent de 13 emit
.
CR ." BONJOUR" \ affiche `BONJOUR` à la ligne.
CURSOR
Groupe | Signature |
---|---|
Caractères | ( n1 - n2 ) |
Affiche le caractère ascii n
à la position courante du curseur et le fait clignoter en attendant l'appui d'une touche. en retour, met sur la pile le code ascii de la touche appuyée.
63 CURSOR \ affiche un point d'interrogation clignotant et attend une touche.
EMIT \ affiche la touche appuyée.
HLD
Groupe | Signature |
---|---|
Caractères | ( - addr ) |
Met sur la pile l'adresse de la variable contenant le pointeur sur le tampon de formatage de chaîne. Cette valeur est initialisée à PAD
par le mot <#
et utilisée par les mots de formatage.
HOLD
Groupe | Signature |
---|---|
Caractères | ( n - ) |
Lors d'un formatage de nombre, met le caractère ASCII de la valeur sur la pile dans le tampon de formatage.
Voir <#
.
123. <# # 44 HOLD #S #> TYPE \ affiche 12,3
À noter que les mots de formatages sont des mots comme les autres, et qu'il est possile de les utiliser dans des définitions dans des boucles par exemple :
: GROUP <# 3 0 DO # # # 32 HOLD LOOP #S #> ;
123456. GROUP TYPE \ affiche 000 123 456
NUMBER
Groupe | Signature |
---|---|
Caractères | ( addr - d ) |
Transforme une chaîne de caractères présente à l'adresse addr
en un nombre en double précision. L'adresse doit pointer sur la taille précédent le premier caractère de la chaîne. La conversion se fait en respectant la base actuelle.
: TONUM
32 WORD \ lit un mot se terminant
\ par le caractère d'espacement depuis l'entrée
\ et le place à l'adresse HERE
HERE NUMBER \ convertit le mot en nombre
;
DECIMAL TONUM 1234 D. \ affiche `1234`
HEX TONUM FFFF DECIMAL D. \ affiche `65535`
(NUMBER)
Groupe | Signature |
---|---|
Caractères | ( addr1 - ud addr2 ) |
Utilisé par la compilation de NUMBER
. En entrée, addr1
pointe vers une chaîne de caractères (sur la taille précédent le premier caractère). En sortie, ud
est le nombre converti (non signé et double précision) et addr2
est l'adresse du premier caractère après le nombre.
RECTIFY
Groupe | Signature |
---|---|
Caractères | ( addr n1 n2 n3 - ) |
Se met en mode édition interactive avec le texte à l'adresse addr
, d'une longueur maximale de n1
, limitée à n2
caractères affichés et avec un curseur à la position n3
.
SIGN
Groupe | Signature |
---|---|
Caractères | ( n - ) |
Lors d'un formatage de nombre, affiche le signe -
si le nombre avant le nombre formaté est négatif. Comme le nombre à formatté doit être en double précision non signé, le traitement du signe est fait à part.
-1 123. <# #S SIGN #> TYPE \ affiche -123
1 123. <# #S SIGN #> TYPE \ affiche 123
SPACES
Groupe | Signature |
---|---|
Caractères | ( n - ) |
Affiche n
caractères d'espaccement à l'écran.
TYPE
Groupe | Signature |
---|---|
Caractères | ( addr count - ) |
Affiche une chaîne de caractères de count
caractères à partir de l'adresse addr
.
65 PAD C! \ met `A` dans PAD
PAD 1 TYPE \ affiche `A`
QUERY
Groupe | Signature |
---|---|
Caractères | ( - ) |
Attend une chaîne de caractères de l'utilisateur et la met dans le TIB
. Équivalent de TIB 80 EXPECT
. c'est le mot qui est utilisé par l'interpréteur pour récupérer les commandes de l'utilisateur.
QUERY \ n'affiche pas "OUI" et attend une chaîne, puis
\ l’interprète, puisqu'elle est dans le TIB
Cassette
MOTOR
Groupe | Signature |
---|---|
Cassette | ( b - ) |
Met le moteur de la cassette en marche (b
différent de 0) ou à l'arrêt (b
0).
REWIND
Groupe | Signature |
---|---|
Cassette | ( - ) |
Rembobine la cassette. (?TODO?) vérifier
Cœur
'
Groupe | Signature | Mot Immédiat |
---|---|---|
Cœur | ( - addr <nom> ) | Oui |
Met sur la pile l'adresse du PFA du mot nom
qui suit.
HEX ' LIT . \ affiche `201D`, l'adresse du PFA de `LIT`
(
Groupe | Signature | Mot Immédiat |
---|---|---|
Cœur | ( - ) | Oui |
Ignore tous les caractères du flot d'entrée jusqu'au caractère )
. Permet d'ajouter des commentaires.
[
Groupe | Signature | Mot Immédiat |
---|---|---|
Cœur | ( - ) | Oui |
Met STATE
à faux. S'utilise en mode compilation pour passer temporairement en exécution. Se termine avec ]
.
: TEST [ ." BONJOUR" ] 10 ; \ affiche `BONJOUR` lors de la validation de la ligne après `;`.
TEST . \ affiche `10`
]
Groupe | Signature |
---|---|
Cœur | ( - ) |
Met STATE
à vrai. Revient en mode compilation après un [
.
?COMP
Groupe | Signature |
---|---|
Cœur | ( - ) |
Affiche un message d'erreur si le mot est n'est pas exécuté en mode compilation.
?CSP
Groupe | Signature |
---|---|
Cœur | ( - ) |
Affiche un message d'erreur si CSP
est égal au pointeur courant de la pile.
(?TODO?) Approfondir.
?ERROR
Groupe | Signature |
---|---|
Cœur | ( n1 n2 - ) |
Affiche le message d'erreur n2
si n1
est non nul.
Voir MESSAGE
pour les messages affichés.
?EXEC
Groupe | Signature |
---|---|
Cœur | ( - ) |
Affiche un message d'erreur si le mot est éxécuté en mode compilation.
?PAIR
Groupe | Signature |
---|---|
Cœur | ( n n - ) |
Affiche un message d'erreur si les deux valeurs ne sont pas égales.
Sert dans les mots associés à d'autres comme par exemple IF
et THEN
, ou bien DO
et LOOP
. Lors de la compilation, le premier mot immédiats laisse une « signature » qui est vérifiée par le mot associé. Si les valeurs ne correspondent pas, une erreur est affichée.
ABORT
Groupe | Signature |
---|---|
Cœur | ( - ) |
Affiche un message d'erreur et remet la machine virtuelle du Forth dans son état initial.
BACK
Groupe | Signature |
---|---|
Cœur | ( addr - ) |
Calcul la différence entre addr
et HERE
et compile le résultat. Utilisé avec BRANCH
et OBRANCH
.
BASE
Groupe | Signature |
---|---|
Cœur | ( - addr ) |
Met sur la pile l'adresse de la base de conversion. Tous les traitements numériques sont fait par rapport à la BASE
courante.
DECIMAL \ s'assure d'être en base 10
2 BASE ! \ se met en base 2. Les traitements numériques se feront donc en binaire
1 1 + . \ affiche `10` (2 en binaire)
Note amusante : du fait de l'existence des constantes 1
, 2
et 3
, il est possible d'écrire ces nombres même en base 2. Cependant, il n'est pas possible d'utiliser les autres chiffres, qui ne seront pas compris par l'interpréteur dans cette base.
DECIMAL 2 BASE ! \ se met en base 2
2 . \ affiche `10`
3 . \ affiche `11`
4 . \ affiche `4? n'existe pas`
BLK
Groupe | Signature |
---|---|
Cœur | ( - addr ) |
Met sur la pile l'adresse de la variable du numéro du buffer
servant à la compilation courante. Contient 0
si la compilation se fait depuis le TIB
.
BRANCH
Groupe | Signature |
---|---|
Cœur | ( - ) |
Effectue un branchement inconditionnel en utilisant la valeur suivante du PFA comme décalage par rapport à l'adresse d'exécution actuelle.
BRANCH
est utilisé pour des mots tels que ELSE
ou REPEAT
.
: ELSE \ définition de `ELSE`
2 ?PAIRS \ vérifie la présence d'un `IF`
COMPILE BRANCH HERE 0, \ compile un branchement inconditionnel
\ avec une adresse à remplir (par `THEN`)
SWAP \ ramène en haut de la pile l'adresse
\ à remplir pour le branchement de `IF`
2 [COMPILE] ENDIF \ ferme cette branche conditionnel
2 \ laisse un 2 pour `THEN`
; IMMEDIATE
COMPILE
Groupe | Signature |
---|---|
Cœur | ( - <nom>) |
Compile l'adresse du CFA du mot qui suit COMPILE
lors de l'exécution. Le but est de pouvoir compiler un mot pendant l'exécution d'un mot immédiat.
À ne pas confondre avec [COMPILE]
qui compile le code d'un mot immédiat.
: IF \ définition du mot `IF`
COMPILE OBRANCH \ compile un branchement conditionnel
HERE 0 , \ et compile une adresse à remplir
2 ; IMMEDIATE
[COMPILE]
Groupe | Signature | Mot Immédiat |
---|---|---|
Cœur | ( - <nom> ) | Oui |
Compile le mot dont le nom
suit [COMPILE]
.
Cela permet de compiler des mots immédiats, qui sont normalement exécuté directement au moment de la compilation.
À ne pas confondre avec COMPILE
.
CFA
Groupe | Signature |
---|---|
Cœur | ( addr1 - addr2 ) |
Met sur la pile l'adresse du CFA addr2
du mot dont le PFA est donné par addr1
.
HEX ' AND CFA . \ affiche l'adresse du CFA du mot `AND`
COLD
Groupe | Signature |
---|---|
Cœur | ( - ) |
Remet toutes les variables internes à leur valeurs initiales puis appel ABORT
.
CSP
Groupe | Signature |
---|---|
Cœur | ( - addr ) |
Met sur la pile une adresse qui sert lors de la compilation de CASE
.
(?TODO?) Approfondir.
!CSP
Groupe | Signature |
---|---|
Cœur | ( - ) |
Met l'adresse courante de la pile dans le pointeur utilisé par la CASE
.
(?TODO?) Approfondir.
DLITERAL
Groupe | Signature | Mot Immédiat |
---|---|---|
Cœur | ( d - ) | Oui |
En compilation, compile la valeur d
donnée (32 bits). Sinon, ne fait rien (la valeur restera donc sur la pile).
DP
Groupe | Signature |
---|---|
Cœur | ( - addr ) |
Met sur la pile l'adresse de la variable contenant l'adresse du premier octet disponible dans la zone du dictionnaire (obtenue directement par HERE
).
HEX
DP @ U. \ affiche une adresse
HERE U. \ affiche la même adresse
DPL
Groupe | Signature |
---|---|
Cœur | ( - addr ) |
Met sur la pile une constante utilisée par (NUMBER)
et INTERPRET
.
(?TODO?) Approfondir.
EXECUTE
Groupe | Signature |
---|---|
Cœur | ( addr - ) |
Exécute le mot dont le CFA est sur la pile.
64 ' EMIT CFA EXECUTE \ une manière bien compliquée d'afficher `@`
EXIT
Groupe | Signature |
---|---|
Cœur | ( - ) |
Sort du mot en cours d'exécution. c'est l'équivalent d'un ;
mais utilisé à l'intérieur d'une définition.
Attention à ne pas faire de EXIT
à l'intérieur d'une boucle, les informations de la boucle seraient laissées sur la pile des appels.
: TEST
." TEST"
EXIT
." PAS TEST"
;
TEST \ N'affiche que `TEST`.
FENCE
Groupe | Signature |
---|---|
Cœur | ( - addr ) |
Met sur la pile l'adresse de la fin de la zone de dictionnaire (3FFFh). Cette limite est protégée contre FORGET
.
-FIND
Groupe | Signature |
---|---|
Caractères | ( - addr n1 b <nom> ) |
Cherche le mot dont le nom
est spécifié, d'abord dans le dictionnaire de CONTEXT
, puis, s'il n'y est pas trouvé, à partir du dernier mot défini du dictionnaire (LATEST
).
Renvoie dans b
faux
(0
) si le mot n'est pas trouvé ou vrai
(1
) s'il l'est.
Si le mot est trouvé, n1
est le premier octet du NFA, qui contient donc la longueur du nom du mot et les drapeaux.
Enfin, si le mot est trouvé, addr
est l'adresse du PFA du mot.
(FIND)
Groupe | Signature |
---|---|
Cœur | ( addr1 addr2 - addr3 n1 b ) |
addr1
pointe sur une chaîne de caractères qui commence par sa taille. C'est le mot à trouver.
addr2
point sur le NFA d'un mot, généralement le dernier défini d'un vocabulaire.
Les valeurs de retour sont celles décrient pour -FIND
.
FORGET
Groupe | Signature |
---|---|
Cœur | ( - <nom> ) |
Oublie le vocabulaire depuis le mot nom
indiqué à la suite de FORGET
.
Du fait de la structure de la mémoire, il n'est pas possible de supprimer un seul mot si celui-ci n'est pas le dernier du vocabulaire. FORGET
supprime donc aussi tous les mots après le mot indiqué.
HERE
Groupe | Signature |
---|---|
Cœur | ( - addr ) |
Met sur la pile l'adresse du premier octet de libre dans la zone du dictionnaire.
Cette valeur est conservée à l'adresse fournie par DP
.
IMMEDIATE
Groupe | Signature |
---|---|
Cœur | ( - ) |
Inverse le drapeau 'IMMEDIATE' du dernier mot du dictionnaire courant.
IN
Groupe | Signature |
---|---|
Système | ( - addr ) |
Met sur la pile l'index pointant dans le bloc
(BLK
) le caractère suivant de l'exécution/compilation. Le bloc
peut-être le TIB
s'il a la valeur 0
.
IN @ . \ affiche 5
CR IN @ . \ affiche 8 (à la ligne)
IN @ CR . \ affiche 5 (à la ligne). L'index est lu au moment de `@`
INTERPRET
Groupe | Signature |
---|---|
Cœur | ( - |
Interprète le mot suivant dans le flot d'entrée. Si c'est un mot, l'exécute. Sinon, essaie de le transformer en nombre et le met sur la pile.
LATEST
Groupe | Signature |
---|---|
Cœur | ( - addr ) |
Met sur la pile l'adresse du dernier mot défini dans le dictionnaire, plus exactement de son NFA.
LATEST PFA . \ affiche l'adresse du PFA du dernier mot défini
LATEST PFA CFA . \ affiche l'adresse du CFA du dernier mot défini
LFA
Groupe | Signature |
---|---|
Cœur | ( addr1 - addr2 ) |
Met sur la pile l'adresse du LFA addr2
du mot dont le PFA est donné par addr1
.
HEX ' AND LFA . \ affiche l'adresse du LFA du mot `AND`
LIT
Groupe | Signature |
---|---|
Cœur | ( - n ) |
Met sur la pile l'octet qui suit dans la définition du mot qui contient LIT
.
Autrement dit si un mot défini par :
contient LIT
, alors l'octet suivant dans le PFA est mis sur la pile lors de l'exécution du mot.
LITERAL
Groupe | Signature | Mot Immédiat |
---|---|---|
Cœur | ( n - ) | Oui |
En compilation, compile la valeur n
. Sinon, ne fait rien (la valeur restera donc sur la pile).
Utilise LIT
.
NFA
Groupe | Signature |
---|---|
Cœur | ( addr1 - addr2 ) |
Met sur la pile l'adresse du NFA addr2
du mot dont le PFA est donné par addr1
.
HEX ' AND NFA . \ affiche l'adresse du NFA du mot `AND`
NULL
Groupe | Signature | Mot Immédiat |
---|---|---|
Cœur | ( - ) | Oui |
Ce mot n'est pas adressable directement (son nom est le caractère nul
).
Le mot dépile la valeur sur la pile de retour et l'oublie.
OBRANCH
Groupe | Signature |
---|---|
Cœur | ( n - ) |
Si la valeur n
est nulle, prend la valeur suivante du PFA et l'utilise en tant que décalage par rapport à l'adresse d'exécution actuelle pour effectuer un branchement. Sinon, passe à l'instruction suivante.
OBRANCH
est utilisé pour les branchements conditionnels, comme dans UNTIL
ou IF
.
: IF COMPILE OBRANCH HERE 0 , 2 ; IMMEDIATE \ définition du mot `IF`
\ le `0` compilé sera remplacé par l'adresse de
\ branchement par `THEN`
\ le `2` laissé sur la pile sera vérifié par
\ `ELSE` et `THEN` pour le traitement d'erreur.
PAD
Groupe | Signature |
---|---|
Cœur | ( - addr ) |
Donne l'adresse d'une adresse mémoire temporaire de travail. Sur cette implémentation, elle est 68 octets après HERE
.
Attention : toute opération qui modifie HERE
, tel une compilation de mot, décale PAD
et donc invalide le contenu de PAD
.
PAD HERE - . \ affiche 68
PFA
Groupe | Signature |
---|---|
Cœur | ( addr1 - addr2 ) |
Met sur la pile l'adresse du PFA addr2
du mot dont le NFA est donné par addr1
.
HEX ' AND NFA PFA . \ affiche l'adresse du PFA du mot `AND` (de manière bien compliquée)
LATEST PFA . \ affiche l'adresse du PFA du dernier mot défini
QUIT
Groupe | Signature |
---|---|
Cœur | ( - ) |
Boucle principale de l'interpréteur Forth. Le mot remet le flot d'entrée au TIB
, puis attend une ligne de commande, l'analyse et l'exécute.
SMUDGE
Groupe | Signature |
---|---|
Cœur | ( - ) |
Inverse la valeur du bit SMUDGE
du dernier mot défini. Il est ainsi possible de rendre valide un mot avant qu'il soit terminé d'être compilé.
: DECOMPTE
-DUP IF
DUP . 1-
SMUDGE DECOMPTE SMUDGE \ `DECOMPTE` est valide le temps de l'appeler
THEN ; \ attention `;` fait lui-même un SMUDGE
10 DECOMPTE \ affiche `10 9 8 7 6 5 4 3 2 1`
Attention, Forth, ou en tout cas cette implémentation, n'a pas de mécanisme de détection de récusivité terminale. Chaque appel laisse une adresse de retour sur la pile des appels, ce qui potentiellement peut la faire déborder.
STATE
Groupe | Signature |
---|---|
Cœur | ( - b ) |
Met sur la pile vrai (1
) si Forth est en mode compilation, faux (0
) sinon.
TIB
Groupe | Signature |
---|---|
Cœur | ( - addr ) |
Met sur la pile l'adresse de début du tampon d'entrée (Terminal Input Buffer).
HEX TIB @ . \ affiche FE00
TRAVERSE
Groupe | Signature |
---|---|
Cœur | ( addr1 count - addr2 ) |
Met sur la pile l'adresse addr2
qui est le premier octet avec le bit de poids fort à 1
à partir de addr1
et en avançant par étapes de count octets.
VOC-LINK
Groupe | Signature |
---|---|
Cœur | ( - addr ) |
Met sur la pile l'adresse pointant vers le dernier mot du vocabulaire courant.
WORD
Groupe | Signature |
---|---|
Cœur | ( n - <nom> ) |
Lit un nom se terminant par le caractère ASCII n
depuis le bloc
courant (ou le TIB
) et le met à l'adresse HERE
. HERE
n'est pas modifié.
: "WORD 34 WORD COUNT TYPE ;
"WORD HELLO" \ affiche "HELLO"
?TODO? comprendre pourquoi cela ne fonctionne pas depuis l'interpréteur en direct. 34 WORD HELLO" HERE COUNT TYPE affiche "TYPE".
Conditions
=
Groupe | Signature |
---|---|
Conditions | ( n1 n2 - b ) |
Met sur la pile vrai
(1
) si n1
est égal à n2
, faux
(0
) sinon.
3 3 = . \ affiche `1`
<
Groupe | Signature |
---|---|
Conditions | ( n1 n2 - b ) |
Met sur la pile vrai
(1
) si n1
est inférieur à n2
, faux
(0
) sinon.
2 3 < . \ affiche `1`
3 2 < . \ affiche `0`.
>
Groupe | Signature |
---|---|
Conditions | ( n1 n2 - b ) |
Met sur la pile vrai
(1
) si n1
est supérieur à n2
, faux
(0
) sinon.
2 3 > . \ affiche `0`
3 2 > . \ affiche `1`.
0=
Groupe | Signature |
---|---|
Conditions | ( n - b ) |
Met sur la pile vrai
(1
) si n
est nul, faux
(0
) sinon.
0 0= . \ affiche `1`
1 0= . \ affiche `0`.
0<
Groupe | Signature |
---|---|
Conditions | ( n - b ) |
Met sur la pile vrai
(1
) si n est négatif, faux
(0
) sinon.
-1 0< . \ affiche `1`
0 0< . \ affiche `0`.
0>
Groupe | Signature |
---|---|
Conditions | ( n - b ) |
Met sur la pile vrai
(1
) si n est positif, faux
(0
) sinon.
-1 0> . \ affiche `0`
1 0> . \ affiche `1`.
U<
Groupe | Signature |
---|---|
Conditions | ( u1 u2 - b ) |
Met sur la pile vrai
(1
) si n1
est inférieur à n2
, faux
(0
) sinon. Les valeurs sont non signées.
Voir <
pour les valeurs signées.
2 -1 U< . \ affiche `1`, car -1 en non signé est 65535.
CASE
Groupe | Signature | Mot Immédiat |
---|---|---|
Conditions | ( n - ) | Oui |
Débute une structure CASE
qui se terminera pas ENDCASE
. Chaque cas est introduit par OF
et terminé par ENDOF
.
Chaque OF
est précédé d'une valeur qui sera comparée à n
. Si la valeur est égale à n
, alors le code entre OF
et ENDOF
sera exécuté. sinon, le traitement continue àprès le ENDOF
qui suit. cela peut éviter une série de IF
.
: TESTNUM
CASE
0 OF ." C'EST UN 0" ENDOF
1 OF ." C'EST UN 1" ENDOF
2 OF ." C'EST UN 2" ENDOF
ENDCASE ;
0 TESTNUM \ affiche "C'EST UN 0"
1 TESTNUM \ affiche "C'EST UN 1"
2 TESTNUM \ affiche "C'EST UN 2"
3 TESTNUM \ n'affiche rien
ELSE
Groupe | Signature | Mot Immédiat |
---|---|---|
Conditions | ( - ) | Oui |
Si la condition IF
précédente est fausse, exécute le code jusqu'au THEN
qui suit.
ENDCASE
Groupe | Signature |
---|---|
Conditions | ( - ) |
Fin de la structure conditionnelle débutée par CASE
.
ENDIF
Groupe | Signature | Mot Immédiat |
---|---|---|
Conditions | ( - ) | Oui |
Termine la construction conditionnelle initiée par IF
. Équivaut à THEN
.
ENDOF
Groupe | Signature |
---|---|
Conditions | ( - ) |
Fin d'un cas OF
dans une structure conditionnelle débutée par CASE
.
IF
Groupe | Signature | Mot Immédiat |
---|---|---|
Conditions | ( b - ) | Oui |
Si b
est faux, saute au ELSE
qui suit dans le mot compilé ou au THEN
s'il n'y a pas de ELSE
.
: TEST 1 2 = IF
." 1 = 2"
ELSE
." 1 != 2"
THEN ;
TEST \ affiche `1 != 2`
OF
Groupe | Signature |
---|---|
Conditions | ( n - ) |
Début d'un cas dans une structure conditionnelle débutée par CASE
. OF
compare n
avec le nombre mis sur la pile avant CASE
. Si les deux valeurs sont égales, alors le code entre OF
et ENDOF
sera exécuté. Sinon, le traitement continue après ENDOF
.
(OF)
Groupe | Signature |
---|---|
Conditions | ( n - ) |
Mot interne que compile OF
dans un CASE
.
THEN
Groupe | Signature | Mot Immédiat |
---|---|---|
Conditions | ( - ) | Oui |
Termine la construction conditionnelle initiée par IF
. Équivaut à ENDIF
.
Définitions
:
Groupe | Signature |
---|---|
Définitions | ( - <nom> ) |
Débute la compilation d'un mot portant le mot nom
. Le vocabulaire courant est fixé au vocabulaire de contexte au début de la compilation. La compilation se termine par le mot ;
. Le mot est ajouté au vocabulaire courant.
;
Groupe | Signature | Mot Immédiat |
---|---|---|
Définitions | ( - ) | Oui |
Termine la définition d'un mot débuté par :
.
Attention, un mot n'est pas utilisable tant que sa compilation n'a pas été terminé avec succès par ;
.
;CODE
Groupe | Signature | Mot Immédiat |
---|---|---|
Définitions | ( - ) | Oui |
(?TODO?) Comment l'utiliser ?
(;CODE)
Groupe | Signature |
---|---|
Définitions | ( - ) |
Dépile l'adresse de retour depuis la pile des appels et la place dans le CFA du dernier mot créé.
Utilisé par les mots de définitions afin que le CFA du mot nouvellement créé pointe sur le code assembleur qui suit (;CODE)
dans le PFA du mot de définition.
Compilé par ;CODE
.
<BUILDS
Groupe | Signature |
---|---|
Définitions | ( - ) |
Créé une constante dont le nom suit <BUILDS
et de valeur 0. s'utilise dans la construction <BUILDS
... DOES>
.
CONSTANT
Groupe | Signature |
---|---|
Définitions | ( n - <nom>) |
Crée un mot avec le nom
spécifié qui met sur la pile la valeur n lorsqu'il est exécuté.
5 CONSTANT CINQ
CINQ . \ affiche `5`
CREATE
Groupe | Signature |
---|---|
Définitions | ( - |
Débute la création d'un mot :
- récupère le
nom
du mot à créer enHERE
, - protège le nom avec
ALLOT
, - met le bit 7 et le bit
SMUDGE
du mot à 1, - met le bit 7 du dernier caractère du nom à 1,
- place le LFA du mot à
LATEST
, - met à jour le pointeur de
CURRENT
. - met le PFA dans le CFA, ce qui en fait un mot prêt à être défini en assembleur.
DEFINITIONS
Groupe | Signature |
---|---|
Définitions | ( - ) |
Met l'adresse du vocabulaire de context dans le pointeur du vocabulaire courant. Ainsi, les nouveaux mots compilés seront ajouté au vocabulaire de contexte.
DOES>
Groupe | Signature |
---|---|
Définitions | ( - ) |
Indique que le code qui suit DOES>
est le code à exécuter lors de l'appel du mot créé par <BUILDS
... DOES>
.
VARIABLE
Groupe | Signature |
---|---|
Définitions | ( n - <nom>) |
Crée un mot avec le nom
spécifié qui met sur la pile l'adresse de la variable lors de son exécution.
10 VARIABLE X
X ? \ affiche `10`
11 X !
X ? \ affiche `11`
Disquette
Note : ces mots sont ajoutés lorsque la version disquette de PAMPUK Forth est ajouté.
(DISK)
Groupe | Signature |
---|---|
Disquette | ( ? ) |
(SYSGEN)
Groupe | Signature |
---|---|
Disquette | ( ? ) |
>CDSK
Groupe | Signature |
---|---|
Disquette | ( ? ) |
>DSK
Groupe | Signature |
---|---|
Disquette | ( ? ) |
CDSK>
Groupe | Signature |
---|---|
Disquette | ( ? ) |
CHARGE
Groupe | Signature |
---|---|
Disquette | ( ? ) |
DERROR
Groupe | Signature |
---|---|
Disquette | ( ? ) |
DGET
Groupe | Signature |
---|---|
Disquette | ( ? ) |
DISK
Groupe | Signature |
---|---|
Disquette | ( ? ) |
DPUT
Groupe | Signature |
---|---|
Disquette | ( ? ) |
FORMAT
Groupe | Signature |
---|---|
Disquette | ( ? ) |
R/W
Groupe | Signature |
---|---|
Disquette | ( ? ) |
RR/W
Groupe | Signature |
---|---|
Disquette | ( ? ) |
SR/W
Groupe | Signature |
---|---|
Disquette | ( ? ) |
SYSGEN
Groupe | Signature |
---|---|
Disquette | ( ? ) |
VERIFY
Groupe | Signature |
---|---|
Disquette | ( ? ) |
Éditeur
-->
Groupe | Signature |
---|---|
Éditeur | ( - ) |
Permet l'enchaînement de screen
lors de la compilation de ceux-ci. Met IN
à 0
et incrémente BLK
. L'exécution de ce mot fait donc continuer l'interpréteur au début du bloc
suivant.
.NAME
Groupe | Signature |
---|---|
Éditeur | ( - ) |
Affiche le nom de l'écran pointé par PREV
. Un nom est donné avec NAME"
.
+BUF
Groupe | Signature |
---|---|
Éditeur | ( addr1 - addr2 n ) |
Prend l'adresse addr1
d'un buffer
et met sur la pile la ;l'adresse calculée du prochain buffer
ainsi que la différence entre cette nouvelle adresse et PREV
.
Si la nouvelle adresse calculée atteint LIMIT
, la prochaine adresse de buffer possible est déterminée par FIRST
.
(LINE)
Vocabulaire: EDITOR
Groupe | Signature |
---|---|
Éditeur | ( n - addr ) |
Retourne l'adresse en mémoire de la ligne n
du buffer d'édition en cours (donné par SCR
).
Si le numéro de ligne est négatif ou supérieur au nombre de ligne par screen
, un message d'erreur est affiché.
B/BUF
Groupe | Signature |
---|---|
Éditeur | ( - n ) |
Met sur la pile le nombre d'octets utilisé pour un buffer
(dans cette implémentation, 768).
B/BUF . \ affiche 768
BUFFER
Groupe | Signature |
---|---|
Éditeur | ( n - addr ) |
Alloue un nouveau buffer
en mémoire avec le numéro n
spécifié.
Si cela nécessite de remplacer un buffer existant, le buffer remplacé est sauvegardé en mémoire de masse s'il avait été modifié.
Place sur la pile l'adresse addr
du début du texte du buffer
, c'est-à-dire l'adresse de la première cellule de texte, après l'emplacement pour le nom.
BLOCK
Groupe | Signature |
---|---|
Éditeur | ( n - addr ) |
Cherche en mémoire le buffer
ayant le numéro n
spécifié.
Si le buffer
n'est pas en mémoire, il est chargé depuis la mémoire de masse. (?TODO? à vérifier)
C/L
Groupe | Signature |
---|---|
Éditeur | ( - n ) |
Met sur la pile le nombre de caractères par ligne de l'éditeur.
C/NAME
Groupe | Signature |
---|---|
Éditeur | ( - n ) |
Met sur la pile le nombre de caractères disponibles pour un nom de screen
(dans cette implémentation, 24).
C/NAME . \ affiche 24
EDITOR
Groupe | Signature |
---|---|
Éditeur | ( - ) |
Sélectionne le vocabulaire de l'éditeur. active les mots I
, N
, B
, U
, Y
, V
, K
, M
, P
, L
, L+
, H
et (LINE)
.
Attention de bien ouvrir un buffer avant de commencer à éditer. Dans le cas contraire, le résultat est indéfini (et amènera très probablement à un plantage en cas de LIST
ou de LOAD
).
EMPTY-BUFFERS
Groupe | Signature |
---|---|
Éditeur | ( - ) |
Vide tous les buffers.
FIRST
Groupe | Signature |
---|---|
Éditeur | ( - addr ) |
Met sur la pile l'adresse du début des buffers (DDBCh
).
FLUSH
Groupe | Signature |
---|---|
Save | ( - ) |
Enregistre les buffers modifiés depuis le dernier FLUSH
sur la cassette ou la disquette.
Un buffer est considéré comme modifié si le bit de poids fort de son numéro est à 1
. Voir le format des buffers.
LIMIT
Groupe | Signature |
---|---|
Éditeur | ( - addr ) |
Met sur la pile l'adresse de fin permise pour les buffers. Dans cette implémentation, l'adresse est initialisée à FE00
.
Lors de l'utilisation de PBUF
, si l'adresse de fin est atteinte, l'adresse de début [FIRST
] est utilisée.
LIST
Groupe | Signature |
---|---|
Éditeur | ( n - ) |
Liste le contenu du buffer n
à l'écran. Si le buffer n'est pas ouvert, le système va tenter de le charger depuis la cassette ou la disquette. Le mode d'affichage texte est placé en mode STANDARD
et l'écran est effacé afin d'afficher le listing en pleine page.
LOAD
Groupe | Signature |
---|---|
Éditeur | ( n - ) |
Lance la compilation du buffer n
. Si aucun buffer avec le numéro indiqué n'existe, le système va tenter de le charger depuis la cassette ou la disquette.
NAME"
Groupe | Signature |
---|---|
Éditeur | ( - <nom> ) |
Donne au buffer pointé par [PREV
])#prev) le nom
spécifé.
1 OPEN
NAME" MON ECRAN"
.NAME \ affiche "ECRAN NO 1 MON ECRAN"
OPEN
Groupe | Signature |
---|---|
Éditeur | ( n - ) |
Ouvre un nouveau buffer n
pour l'édition, qui devient le buffer courant.
La documentation indique que le numéro doit être entre 1
et 10
, cependant le code à l'air d'indiquer que le nombre peut-être entre 1
et 32767
.
Le mot initialise en mémoire un nouvel buffer
avec le numéro n
.
OPEN
n'effectue pas de vérification sur le numéro à la création du buffer
.
Si deux buffer
sont ouverts avec le même numéro, ils seront tous les deux présents en mémoire.
SCR ? \ Affiche 0, aucun buffer n'est ouvert
1 OPEN \ Ouvre le buffer 1 qui devient le buffer courant
SCR ? \ Affiche 1, le buffer courant est le buffer 1
PASS
Groupe | Signature |
---|---|
Éditeur | ( - ) |
Lit le prochain buffer de la cassette vers la mémoire temporaire (PAD
)
puis affiche le nom de ce buffer, qui n'est donc pas chargé dans un buffer
utilisable.
Est-ce que ce mot a vraiment un sens avec une disquette (?TODO?).
PREV
Groupe | Signature |
---|---|
Éditeur | ( - addr ) |
Met sur la pile l'adresse du précédent block manipulé.
Modifé par BUFFER
et donc BLOCK
, LIST
, OPEN
et FLUSH
.
R/W
Groupe | Signature |
---|---|
Éditeur | ( addr n b - ) |
Mot qui sert lors du chargement et de la sauvegarde des buffers.
Si b
est vrai (1
), alors R/W
lit des données de la mémoire de masse courante vers l'adresse addr
.
Si b
est faux (0
), alors R/W
écrit des données de l'adresse addr
vers la mémoire de masse courante.
n
pour une lecture cassette ne semble pas être utilisé.
R/W
utilise un vecteur d'indirection afin d'exécuter la routine réelle. Le mot TAPE
défini ce vecteur sur la routine traitant la cassette.
R/W?
Groupe | Signature |
---|---|
Éditeur | ( b - ? ) |
Mot qui sert lors du chargement et de la sauvegarde des buffers.
Si b
est vrai (1
), alors R/W?
lit des données de la mémoire de masse courante. (?TODO?) vers où ?
Si b
est faux (0
), alors R/W?
écrit des données vers la mémoire de masse courante. (?TODO?) depuis où ?
R/W?
utilise un vecteur d'indirection afin d'exécuter la routine réelle. Le
mot TAPE
défini ce vecteur sur la routine traitant la cassette.
SCR
Groupe | Signature |
---|---|
Éditeur | ( n - addr ) |
Met sur la pile l'adresse de la variable du screen
courant.
Le contenu de cette variable est modifié par OPEN
et LIST
. Il est utilisé par (LINE)
(#edit_line) et L
,.
1 OPEN
1 LIST \ affiche le listing du buffer 1
L \ affiche le listing du buffer 1
TAPE
Groupe | Signature |
---|---|
Éditeur | ( - ) |
Selectionne la cassette pour les opérations de chargement et sauvegarde. Voire LOAD
, LIST
et FLUSH
.
UPDATE
Groupe | Signature |
---|---|
Éditeur | ( - ) |
Force le buffer précédemment utilisé (PREV
) comme ayant été modifié, et donc devant être enregistré lors du prochain FLUSH
.
USE
Groupe | Signature |
---|---|
Éditeur | ( - addr ) |
Met sur la pile l'adresse de la variable use
, qui contient l'adresse utilisable pour le prochain buffer créé.
HEX USE @ U. \ affiche l'adresse qui sera utilisée par le prochain OPEN.
WIPE
Groupe | Signature |
---|---|
Éditeur | ( - ) |
Efface le contenu du buffer
pointé par PREV
. Le numéro du buffer et son état (modifié ou non) est conservé, le reste est remplacé par des espaces.
1 OPEN
0 P DU TEXTE
WIPE
0 L+ \ affiche un listing vide
Éditeur, commandes
B
Groupe | Signature |
---|---|
Éditeur | ( n - ) |
Efface la ligne n
, toutes les lignes suivantes sont remontées sur la ligne précédante.
1 OPEN
0 P HELLO
0 I BONJOUR
0 B
L \ affiche "HELLO" sur la première ligne
H
Groupe | Signature |
---|---|
Éditeur | ( n - ) |
Affiche la ligne n
du screen
courant.
1 OPEN
0 P BONJOUR
0 H \ affiche "BONJOUR"
I
Groupe | Signature |
---|---|
Éditeur | ( n - |
Insère le texte
en tant que nouvelle ligne n
, les lignes suivantes sont décalées chacune vers leur numéro d'après. le contenu de la ligne 20 disparait.
1 OPEN
0 P HELLO
0 I BONJOUR
L \ affiche "BONJOUR" sur la première ligne et "HELLO"
\ sur la seconde.
K
Groupe | Signature |
---|---|
Éditeur | ( n - ) |
Remplace la ligne n
par des caractères d'espacement. autrement dit, efface le contenu de la ligne.
1 OPEN
0 P BONJOUR
1 P HELLO
0 K
L \ affiche une ligne vide suivi de "HELLO"
L
Groupe | Signature |
---|---|
Éditeur | ( - ) |
Affiche le listing list
du screen
courant (obtenu avec scr
)
L+
Groupe | Signature |
---|---|
Éditeur | ( n - ) |
Affiche le listing contenu dans le screen
courant à partir de la ligne n
. contrairement aux mots list
et l
, l+
conserve le mode d'affiche actuel et affiche le listing à la suite, sans effacement de l'écran.
1 OPEN
20 P FIN
20 L+ \ affiche "FIN"
M
Groupe | Signature |
---|---|
Systême | ( n - ) |
Modifie la ligne n
du screen
courant. la ligne précédemment sur cette ligne est répétée à l'écran et le curseur placée sur son premier caractère afin de pouvoir la modifier. une fois validée, le nouveau contenu remplace la ligne désignée.
1 OPEN
0 P HELLO
0 M \ affiche "HELLO" et place le curseur d'édition dessus
N
Groupe | Signature |
---|---|
Éditeur | ( n - ) |
Insère une nouvelle ligne n
et y copie le contenu de pad
, usuellement préalablement rempli par y
. les lignes suivantes sont décalées chacune vers leur numéro d'après. le contenu de la ligne 20 disparait.
1 OPEN
0 P HELLO
0 Y
1 N
L \ affiche deux lignes contenant "HELLO"
P
Groupe | Signature |
---|---|
Éditeur | ( n - |
Remplace la ligne n
du screen
courant en y plaçant le texte
. si le texte
est supérieur au nombre de colonnes d'un écran, la partie en trop est ignorée.
1 OPEN
1 P TEST
1 LIST \ affiche "TEST" sur la seconde ligne du listing
U
Groupe | Signature |
---|---|
Éditeur | ( n - ) |
Copie le contenu de pad
, usuellement préalablement rempli par y
dans le contenu de la ligne n
.
1 OPEN
0 P HELLO
1 P BONJOUR
1 Y
0 U
L \ affiche deux lignes contenant "BONJOUR"
V
Groupe | Signature |
---|---|
Éditeur | ( n - ) |
Insère une ligne vide à la position n
. les lignes suivantes sont décalées chacune vers leur numéro d'après. le contenu de la ligne 20 disparait.
1 OPEN
0 P BONJOUR
0 V
L \ affiche une ligne vide suivi de "BONJOUR"
Y
Groupe | Signature |
---|---|
Éditeur | ( n - ) |
Copie le contenu de la ligne n
dans l'espace temporaire pointé par pad
. permer, avec u
et n
, de faire des opérations de copier/coller dans l'éditeur.
1 OPEN
0 P HELLO
0 Y
PAD 5 TYPE \ affiche "HELLO"
Graphismes
BAR
Groupe | Signature |
---|---|
Graphismes | ( n1 n2 n3 - ) |
Trace une ligne horizontale à la ligne n3
entre les abscisses n1
et n2
.
En mode LITTLE
, la ligne est composée de pixels unitaires. Les coordonnées sont exprimées en pixels.
En mode BIG
, la ligne impact tous les groupes de 4 pixels complets que le ligne traverse. Les abscisses sont exprimées en octets (groupe de 4 pixels). L'ordonnée est exprimée en pixels (numéro de ligne).
: HLINES 50 0 DO
256RND 4 MOD INK
0 200 256RND BAR
LOOP ;
HLINES ; dessine 50 lignes horizontales de positions et couleurs aléatoires
BIG
Groupe | Signature |
---|---|
Graphismes | ( - ) |
Passe en mode d'affichage big
.
BOX
Groupe | Signature |
---|---|
Graphismes | ( n1 n2 n3 n4 - ) |
Affiche un rectangle rempli avec la couleur spécifiée par ink
.
Le rectangle est affiché depuis les coordonnées (n1, n2)
pour l'un de ses coins, jusqu'aux coordonnées (n3, n4)
pour le coin en face par sa diagonale.
En mode LITTLE
, le rectangle est affiché entièrement avec la couleur spécifiée. Les coordonnées sont exprimées en pixels.
En mode BIG
, le remplissage se fait à partir des 4 index de couleurs choisis avec INK
. Chaque ligne, une rotation de 1 pixel vers la droite est opérée sur la valeur spécifiée par INK
. Cela permet de faire des tramages. Les abscisses sont exprimées en octets (groupe de 4 pixels). Les ordonnées sont exprimées en pixels (numéro de ligne).
BIG
4 BASE ! 0202 INK DECIMAL
2 200 20 220 BOX \ affiche un rectangle tramé
BRIGHT
Groupe | Signature |
---|---|
Graphismes | ( b - ) |
Passe en mode pleine luminosité si b
est vrai, en mode demi-teinte sinon. Ce mode agit sur la couleur d'index 2 de la palette, et uniquement celle-ci.
COLOR
Groupe | Signature |
---|---|
Graphismes | ( n1 n2 n3 n4 - ) |
Change la palette de couleurs. les valeurs n1
à n4
sont les codes couleurs. Les index de la palette vont de 0 pour n1
à 3 pour n4
.
0 4 5 7 COLOR
FROM
Groupe | Signature |
---|---|
Graphismes | ( n1 n2 - ) |
Définie le point de départ pour les lignes aux coordonnées (n1, n2)
.
Voir : TO
.
INK
Groupe | Signature |
---|---|
Graphismes | ( n - ) |
Change l'index de couleur de l'encre pour les primitives graphiques comme box
ou line
.
En mode LITTLE
, le couleur sélectionné est pris en compte pour chaque pixel individuellement.
En mode BIG
, la « couleur » est un octet complet qui représente 4 pixels. Un « point » affiché par PLOT
ou même LINE
est donc toujours un ensemble indisoluble de 4 pixels.
Astuce : grâce à la gestion des nombres en base quelconque de Forth, il est possible d'entrer les 4 index de manière naturelle en utilisant la base 4 (puisqu'il y a 4 index).
4 BASE ! \ passage en base 4
2031 INK \ définition des 4 index de couleur formant l'encre
DECIMAL \ retour en base décimale
Il est aussi possible de définir une encre en mode BIG
puis l'utiliser en mode LITTLE
afin de dessiner des motifs.
BIG 4 BASE ! 0202 INK DECIMAL \ définie une encre en mode BIG
LITTLE 220 220 10 10 LINE \ affiche une ligne en pointillés
À l'inverse, définir une encre en mode LITTLE
puis l'utiliser en mode BIG
revient à définir une couleur uniforme pour les 4 pixels.
Exemple
LITTLE 3 INK
BIG 5 5 20 200 LINE \ affiche une ligne avec l'index de couleur 2
LINE
Groupe | Signature |
---|---|
Graphismes | ( n1 n2 n3 n4 - ) |
Affiche une ligne entre les coordonnées (n1, n2)
et (n3, n4)
.
En mode LITTLE
, la ligne est composée de pixels unitaires. Les coordonnées sont exprimées en pixels.
En mode BIG
, la ligne impact tous les groupes de 4 pixels complets que le ligne traverse. Les abscisses sont exprimées en octets (groupe de 4 pixels). Les ordonnées sont exprimées en pixels (numéro de ligne).
LITTLE
Groupe | Signature |
---|---|
Graphismes | ( - ) |
Passe en mode d'affichage little
.
PAINT
Groupe | Signature |
---|---|
Graphismes | ( n1 n2 - ) |
Remplit une zone avec la couleur actuelle fixée par ink
à partir des coordonnées (n1, n2)
. L'index de couleur doit être différent de 0 et le remplissage s'arrête aux limites tracées dans un autre index de couleur que 0
(ainsi qu'aux bords de l'écran).
En mode LITTLE
, le remplissage se fait pixel par pixel. Les coordonnées sont exprimées en pixels.
En mode BIG
, le remplissage se fait par octet. L'abscisse est exprimée en octets (groupe de 4 pixels). L'ordonnée est exprimée en pixels (numéro de ligne).
LITTLE
50 50 FROM
1 INK 100 50 TO
2 INK 100 100 TO
3 INK 50 100 TO
1 INK 50 50 TO
2 INK 75 75 PAINT
BIG
4 BASE ! 0231 INK DECIMAL
10 10 FROM
20 10 TO
20 40 TO
10 40 TO
10 10 TO
12 12 paint
POINT
Groupe | Signature |
---|---|
Graphismes | ( n1 n2 - n3 ) |
Met sur la pile l'index de couleur dans la palette du point aux coordonnées (n1, n2)
.
En mode LITTLE
, le point représente un pixel unitaire. Les coordonnées sont exprimées en pixels.
En mode BIG
, le « point » est l'ensemble des 4 points décrits par un octet. L'abscisse est exprimée en octets (groupe de 4 pixels). L'ordonnée est exprimée en pixels (numéro de ligne).
PLOT
Groupe | Signature |
---|---|
Graphismes | ( n1 n2 - ) |
Affiche un « point » aux coordonnées (n1, n2)
.
En mode LITTLE
, le point est un pixel, et les coordonnées sont exprimées en pixels.
En mode BIG
le « point » est un ensemble de 4 pixels (voir INK
) et l'abscisse est exprimée en octets (groupe de 4 pixels). L'ordonnée est exprimée en pixels (numéro de ligne).
TO
Groupe | Signature |
---|---|
Graphismes | ( n1 n2 - ) |
Définie le point d'arrivée pour les lignes aux coordonnées (n1, n2)
. voir : FROM
.
En mode LITTLE
, la ligne est composée de pixels unitaires. Les coordonnées sont exprimées en pixels.
En mode BIG
, la ligne impact tous les groupes de 4 pixels complets que le ligne traverse. L'abscisse est exprimée en octets (groupe de 4 pixels). L'ordonnée est exprimée en pixels (numéro de ligne).
: LINES 100 0 DO 256RND 256RND TO LOOP ;
LINES \ dessine une ligne brisée de 100 segments aléatoires
Images
BCLEAR
Groupe | Signature |
---|---|
Images | ( - ) |
Dépile toutes les images de la pile d'images. Équivalent d'une série de BPOP
jusqu'à vider la pile.
BDROP
Groupe | Signature |
---|---|
Images | ( - ) |
Dépile la première image de la pile d'images sans l'afficher à l'écran. équivalent de BPOP
sans affichage.
BINIT
Groupe | Signature |
---|---|
Images | ( - ) |
Initialise la pile d'images.
BPOP
Groupe | Signature |
---|---|
Images | ( - ) |
Dépile la première image de la pile d'images et l'affiche à l'écran.
BPUSH
Groupe | Signature |
---|---|
Images | ( n1 n2 n3 n4 - ) |
Empile une image sur la pile d'images. L'image est définie par les coordonnées (n1, n2)
, n1
est en nombre d'octets et n2
en nombre de lignes. La largeur et la hauteur de l'image sont définies par (n3, n4)
, n3
est en octets et n4
en nombre de lignes.
BSTACK
Groupe | Signature |
---|---|
Images | ( - n1 n2 addr ) |
Met sur la pile les coordonnées de la dernière dernière image empilée ainsi que l'adresse de l'image dans la pile. n1
est exprimée en octets, n2
en lignes. L'image est dépilée, cependant, les données sont conservées tant qu'elles ne sont pas écrasées. Voir DRAW
.
DRAW
Groupe | Signature |
---|---|
Images | ( n1 n2 addr n3 - ) |
Affiche une image située à l'adresse addr
aux coordonnées (n1, n2)
, avec le mode d'affichage n3
.
LITTLE
1 INK 0 0 200 200 BOX
10 10 5 20 BPUSH
CLS
BSTACK 0 DRAW
IMAGE
Groupe | Signature |
---|---|
Images | ( n ... n1 n2 - <nom> ) |
Créé une image à partir des valeurs n
en tant que description et de taille n1
par n2
. n1
est la largeur en octets, n2
est la hauteur en lignes. L'image est stockée dans un nouveau mot nom
ayant la capacité de s'afficher.
La description est une suite d'entier représentant les octets de l'image. Chaque octet représente 4 pixels, tout comme dans le mode BIG
.
L'affichage de l'image se fait par l'appel du mot ainsi créé qui a pour signature (n1 n2 n3 - ).
Les coordonnées (n1, n2)
sont celles du coin inférieur gauche de l'image. En mode LITTLE
, elles sont spécifiées en pixels. En mode BIG
, l'abscisse est exprimée en octets (groupe de 4 pixels). L'ordonnée est exprimée en pixels (numéro de ligne).
Le paramètre n3
est le mode d'affichage, entre 0 et 7.
MASK
Groupe | Signature |
---|---|
Images | ( n ... n1 n2 - ) |
Permet de définir un masque d'affichage pour le mode 1
d'affichage des images. La définition de MASK
doit suivre la définition de l'image associée et créée avec IMAGE
.
Imprimante
LEMIT
Groupe | Signature |
---|---|
Imprimante | ( n - ) |
Envoie le caractère ascii n
à l'imprimante. Équivalent de EMIT
pour l'imprimante.
LINIT
Groupe | Signature |
---|---|
Imprimante | ( - ) |
Initialise l'imprimante.
MODE
Groupe | Signature |
---|---|
Imprimante | ( n - ) |
Sélectionne le mode d'affichage. 0
, aucune sortie, 1
sortie sur écran, 2
sortie sur imprimante, 3
sortie sur l'écran et l'imprimante.
Joysticks
FIRE
Groupe | Signature |
---|---|
Joysticks | ( n - b ) |
Lit l'état du bouton de tir du joystick n
(0
pour le joystick de gauche, sinon joystick de droit). Met sur la pile vrai (1
) si le bouton est appuyé, faux (0
) sinon.
JOY
Groupe | Signature |
---|---|
Joysticks | ( n1 - n2 n3 ) |
Lit la position du joystick n
(0
pour le joystick de gauche, sinon joystick de droit). n2
et n3
représentent les valeurs de déplacement en x et y, qui peuvent prendre les valeurs -1
, 0
ou 1
.
POT
Groupe | Signature |
---|---|
Joysticks | ( n1 - n2 ) |
Lit la position d'une manette de type potentiomètre n1
(0
pour la manette de gauche, sinon manette de droite). Met sur la pile la valeur de la position. La valeur dépend du type de manette mais est généralement comprise entre 5
et 128
.
Mémoire
+!
Groupe | Signature |
---|---|
Mémoire | ( n addr - ) |
Ajoute n à la valeur pointée par addr. Exemple:
10 VARIABLE X ( Crée une variable X initialisée à 10 )
5 X +! ( Ajoute 5 à X )
X ? ( Affiche 15 )
@
Groupe | Signature |
---|---|
Mémoire | ( addr - n ) |
Met sur la pile la valeur 16 bits pointée par addr
.
Voir C@
pour les valeurs sur 8 bits et [2@
](#twoat} pour les valeurs sur 32 bits.
0 @ . \ affiche les deux premiers octets de la ROM sous forme de nombre signé (normalement, -61 sur HRX)
!
Groupe | Signature |
---|---|
Mémoire | ( n addr - ) |
Met la valeur 16 bits n à l'adresse addr, donc sur 2 octets.
Voir C!
pour les valeurs sur 8 bits.
HEX 5 9000 ! 9000 ? \ affiche `5`.
\ Attention, cette mémoire est peut-être utilisée,
\ c'est à titre d'exemple
,
Groupe | Signature |
---|---|
Mémoire | ( n - ) |
Met la valeur n
à l'adresse pointée par DP
et incrémente DP
de 2 octets.
Voir C,
pour la version 8 bits.
: , HERE ! 2 ALLOT ;
2@
Groupe | Signature |
---|---|
Mémoire | ( addr - d ) |
Met sur la pile la valeur double précision (32 bits) pointée par addr.
Voir @
pour les valeurs sur 16 bits.
2!
Groupe | Signature |
---|---|
Mémoire | ( d addr - ) |
Met la valeur d
double précision (32 bits) à l'adresse addr
.
ALLOT
Groupe | Signature |
---|---|
Mémoire | ( n - ) |
Ajoute n
octets à la zone de dictionnaire. Se combine avec généralement avec VARIABLE
pour créer un espace mémoire nommé, pour un tableau par exemple.
0 VARIABLE TABLEAU 10 ALLOT
Ajoute 10 octets à la suite des 2 octets réservés pour la variable TABLEAU
.
BLANKS
Groupe | Signature |
---|---|
Mémoire | ( addr count - ) |
Remplie l'espace mémoire à l'adresse addr
, sur count
octets, avec la valeur 32 (ascii pour caractère d'espacement).
Spécialisation de FILL
avec la valeur 32.
C@
Groupe | Signature |
---|---|
Mémoire | ( addr - n ) |
Met sur la pile la valeur de l'octet pointé par addr
.
Attention, la valeur récupérée est un octet, mais la valeur de la pile est bien sur 16 bits.
Voir @
pour les valeurs sur 16 bits.
0 C@ . \ affiche le premier octet de la ROM sous forme de nombre signé (normalement, 195)
C!
Groupe | Signature |
---|---|
Mémoire | ( n addr - ) |
Met les 8 bits de poids faibles de la valeur n
à l'adresse addr
, sur un octet.
Voir !
pour les valeurs sur 16 bits.
HEX 5 7000 C! 7000 C@ . \ affiche `5`
\ Attention, cette mémoire est peut-être utilisée,
\ c'est à titre d'exemple
C,
Code: : C, HERE C! 1 ALLOT ;
Groupe | Signature |
---|---|
Mémoire | ( n - ) |
Met la valeur n
à l'adresse pointée par DP
et incrémente DP
de 1 octet.
Voir ,
pour les valeurs sur 16 bits.
CMOVE
Groupe | Signature |
---|---|
Mémoire | ( addr1 addr2 count - ) |
Copie count
octets de addr1
vers addr2
.
Voir aussi <CMOVE
.
<CMOVE
Groupe | Signature |
---|---|
Mémoire | ( addr1 addr2 count - ) |
Copie count
octets de addr1
vers addr2
en commençant par la fin de la zone. C'est essentiel si les deux zones se chevauchent et que addr1
est inférieur addr2
.
Voir aussi CMOVE
.
ERASE
Groupe | Signature |
---|---|
Mémoire | ( addr count - ) |
Remplie l'espace mémoire à l'adresse addr
, sur count
octets, avec la valeur 0
. Équivalent de FILL
avec la valeur 0
.
0 VARIABLE TABLEAU 10 ALLOT
TABLEAU 12 ERASE
FILL
Groupe | Signature |
---|---|
Mémoire | ( addr count c - ) |
Remplie l'espace mémoire à l'adresse addr
, sur count
octets, avec la valeur c
.
Voir aussi ERASE
si la c
est 0
et BLANKS
si la c
est 32
.
0 VARIABLE TABLEAU 10 ALLOT
TABLEAU 12 0 FILL \ initialise le tableau avec des zéros
TOGGLE
Groupe | Signature |
---|---|
Mémoire | ( n addr - ) |
Opère un XOR
sur la valeur pointée par addr
avec les 8 bits de poids faible de n
.
V@
Groupe | Signature |
---|---|
Mémoire | ( addr - n ) |
Met sur la pile la valeur pointée par addr
en mémoire vidéo. c'est l'équivalent de @
pour la mémoire vidéo.
V!
Groupe | Signature |
---|---|
Mémoire | ( n addr - ) |
Met la valeur n
à l'adresse vidéo addr
en mémoire vidéo. C'est l'équivalent de !
pour la mémoire vidéo.
VC@
Groupe | Signature |
---|---|
Mémoire | ( addr - c ) |
Met sur la pile la valeur 8 bits pointée par addr
en mémoire vidéo. c'est l'équivalent de C@
pour la mémoire vidéo.
VC!
Groupe | Signature |
---|---|
Mémoire | ( n addr - ) |
Met les 8 bits faibles de la valeur n
à l'adresse vidéo addr
. C'est l'équivalent de C!
pour la mémoire vidéo.
VCMOVE
Groupe | Signature |
---|---|
Mémoire | ( addr1 addr2 count - ) |
Copie count
octets de addr1
vers addr2
en mémoire vidéo. C'est l'équivalent de CMOVE
pour la mémoire vidéo.
V<CMOVE
Groupe | Signature |
---|---|
Mémoire | ( addr1 addr2 count - ) |
Copie count
octets de addr1
vers addr2
en mémoire vidéo en commençant par la fin de la zone. c'est essentiel si les deux zones se chevauchent et que addr1
est inférieur addr2
. C'est l'équivalent de <CMOVE
pour la mémoire vidéo.
VFILL
Groupe | Signature |
---|---|
Mémoire | ( addr count c - ) |
Remplie l'espace mémoire vidéo à l'adresse addr
, sur count
octets, avec la valeur c
. C'est l'équivalent de FILL
pour la mémoire vidéo.
Piles
-DUP
Groupe | Signature |
---|---|
Piles | ( n - n n ) |
Duplique le premier élément de la pile si celui-ci est non nul.
2DROP
Groupe | Signature |
---|---|
Piles | ( d1 - ) |
Retire le premier élément double précisiosn de la pile. équivalent de 'DROP' pour les mots de 32 bits.
1. 2. 2DROP D. \ affiche `1`
2DUP
Groupe | Signature |
---|---|
Piles | ( d - d d ) |
Duplique le premier élément 32 bits de la pile.
Voir DUP
pour les valeurs sur 16 bits.
1. 2DUP D. D. \ affiche `1 1`
2OVER
Groupe | Signature |
---|---|
Piles | ( d1 d2 - d1 d2 d1 ) |
Équivalent de 'OVER' pour les mots de 32 bits.
1. 2. 2OVER
D. D. D. \ affiche `1 2 1`.
2ROT
Groupe | Signature |
---|---|
Piles | ( d1 d2 d3 - d2 d3 d1 ) |
Équivalent de 'ROT' pour les mots de 32 bits.
1. 2. 3. 2ROT
D. D. D. \ affiche `1 3 2`.
2SWAP
Groupe | Signature |
---|---|
Piles | ( d1 d2 - d2 d1 ) |
Échange les deux premiers éléments 32 bits de la pile avec les deux suivants. equivalent de SWAP
pour les mots de 32 bits.
1. 2. 2SWAP
D. D. \ affiche `1 2`
DROP
Groupe | Signature |
---|---|
Piles | ( n - ) |
Retire le premier élément de la pile.
2 3 DROP . \ affiche `2`
DUP
Groupe | Signature |
---|---|
Piles | ( n - n n ) |
Duplique le premier élément de la pile.
Voir 2DUP
pour les valeurs sur 32 bits.
2 DUP . . \ affiche `2 2`
OVER
Groupe | Signature |
---|---|
Piles | ( n1 n2 - n1 n2 n1 ) |
Duplique le deuxième élément de la pile.
2 3 OVER . . . \ affiche `2 3 2`
PICK
Groupe | Signature |
---|---|
Piles | ( n ... n1 - n ... n ) |
Duplique sur la pile la valeur présente en n1
-ième position.
1 2 3 4 4 PICK . . . . . \ affiche `1 4 3 2 1`
R
Groupe | Signature |
---|---|
Piles | ( - n ) |
Met sur la pile des paramètres la première valeur de la pile des appels. Équivaut à I
.
La pile des appels n'est pas modifiée.
ROLL
Groupe | Signature |
---|---|
Piles | ( n ... n1 - ... n) |
Retire le n1
-ième élément de la pile et le met au sommet de la pile.
1 2 3 4 4 ROLL . . . . \ affiche `1 4 3 2`
ROT
Groupe | Signature |
---|---|
Piles | ( n1 n2 n3 - n2 n3 n1 ) |
Effectue une rotation des trois premiers éléments de la pile, c'est-à-dire que le troisième élément devient le premier, le premier devient le deuxième, et le deuxième devient le troisième. Exemple:
1 2 3 ROT . . . \ affiche `1 3 2`
Attention, pour bien comprendre l'effet, pensez que l'affichage de la pile avec le mot .
se dans le sens inverse de la mise sur la pile.
R0
Groupe | Signature |
---|---|
Piles | ( - addr ) |
Met sur la pile l'adresse de début de la pile des appels.
>R
Groupe | Signature |
---|---|
Piles | ( n - ) |
Transfert la valeur au sommet de la pile des paramètres vers la pile des appels.
Attention à remettre la pile des appels dans l'état initial avant la fin du mot.
R>
Groupe | Signature |
---|---|
Piles | ( - n ) |
Transfert la valeur au sommet de la pile des appels vers la pile des paramètres.
Attention à remettre la pile des appels dans l'état initial avant la fin du mot.
RP@
Groupe | Signature |
---|---|
Piles | ( - addr ) |
Met sur la pile l'adresse courante du sommet de la pile des appels.
RP!
Groupe | Signature |
---|---|
Piles | ( - ) |
Remet l'adresse courante du sommet de la pile des appels à sa valeur initiale, stockée à R0
.
S0
Groupe | Signature |
---|---|
Piles | ( - addr ) |
Met sur la pile l'adresse de début de la pile des paramètres.
SDROP
Groupe | Signature |
---|---|
Piles | ( n2 n1 - n1 ) |
Retire le deuxième élément (n2
) de la pile.
SP@
Groupe | Signature |
---|---|
Piles | ( - addr ) |
Met sur la pile l'adresse courante du sommet de la pile des paramètres.
SP!
Groupe | Signature |
---|---|
Piles | ( - ) |
Remet l'adresse courante du sommet de la pile des paramètres à sa valeur initiale, stockée à S0
.
SWAP
Groupe | Signature |
---|---|
Piles | ( n1 n2 - n2 n1 ) |
Échange les deux premiers éléments de la pile.
2 3 SWAP . . \ affiche `3 2`
Système
?STACK
Groupe | Signature |
---|---|
Systême | ( - ) |
Vérifie l'état de la pile. lance une erreur en cas de problème (par exemple: si la pile est vide).
?TERMINAL
Groupe | Signature |
---|---|
Systême | ( - b ) |
Renvoie vrai (1
) si la touche appuyée est la touche entrée. faux (0
) sinon.
: WAIT-CR BEGIN ?TERMINAL UNTIL ; \ attend l'appui de la touche `ENTER`.
(MSG)
Groupe | Signature |
---|---|
Systême | ( addr1 n1 - addr2 ) |
Mot interne utilisé par MESSAGE
. Cherche dans la liste des messages pointé par addr1
celui qui correspond à n
et met sur la pile l'adresse addr2
du message, prêt à être affiché par un COUNT
TYPE
.
Si le message n'est pas trouvé, add2
est égal à 0
.
DELAY
Groupe | Signature |
---|---|
Systême | ( n - ) |
Attend n
50ième de secondes.
50 DELAY \ attend 1 seconde
ERROR
Groupe | Signature |
---|---|
Systême | ( n - ) |
Affiche le message d'erreur n
puis appel QUIT
.
EXPECT
Groupe | Signature |
---|---|
Systême | ( addr count - ) |
Attend une entrée de l'utilisateur et la met à l'adresse addr
. l'entrée est limitée à count
caractères. L'entrée est validée par la touche enter
.
Voir aussi RECTIFY
.
PAD 10 EXPECT \ attend une entrée de 10 caractères et la met dans `PAD`.
PAD 10 TYPE \ affiche l'entrée.
FAST
Groupe | Signature |
---|---|
Systême | ( - ) |
Désactive les appels à ?STACK
. cela rend l'exécution plus rapide, mais sans vérifications. L'interruption d'exécution par CTRL + ENTER
est désactivée.
FORTH
Group | Signature |
---|---|
Systême | ( - ) |
Sélectionne le vocabulaire de base en tant que vocabulaire de contexte.
GET
Groupe | Signature |
---|---|
Systême | ( - n ) |
Met sur la pile la touche appuyée ou 0
.
Pour un mot qui attend l'appui de la touche, voir KEY
.
: WAIT-KEY BEGIN GET 0> UNTIL ;
WAIT-KEY \ attend l'appui d'une touche.
ID.
Groupe | Signature |
---|---|
Systême | ( addr - ) |
Affiche le nom (identifiant) du mot à l'adresse spécifiée par addr
. L'adresse pointe sur le NFA du mot.
KEY
Groupe | Signature |
---|---|
Systême | ( - n ) |
Met sur la pile la touche appuyée. attend l'appuie de la touche.
Pour un mot qui n'attend pas l'appui de la touche, voir GET
.
KEY . \ affiche le code ASCII de la touche appuyée.
MESSAGE
Groupe | Signature |
---|---|
Systême | ( n - ) |
Affiche le message système n
.
7 MESSAGE \ affiche `LA PILE EST PLEINE`
MSG"
Groupe | Signature |
---|---|
Systême | ( n - |
Remplace le texte affiché par le message système n
. le message
doit se terminer par le caractère "
. voir message
.
13 MSG" BIEN" \ remplace le `OUI` de l'interpréteur par `BIEN`
OFFSET
Groupe | Signature |
---|---|
Système | ( - addr ) |
Met sur la pile l'adresse d'un tampon utilisé par la disquette.
(?TODO?) Approfondir. Cela semble être un décalage de numéro de buffer.
SLOW
Groupe | Signature |
---|---|
Systême | ( - ) |
Active les appels à ?STACK
. cela rend l'exécution plus lente, mais les erreurs de piles seront signalées. De plus, l'appuie sur CTRL + ENTER
est vérifié et provoque l'interruption de l'exécution.
SPACE
Groupe | Signature |
---|---|
Systême | ( - ) |
Affiche un caractère d'espacement. équivelent de bl emit
.
." HELLO" SPACE ." WORLD" \ affiche `HELLO WORLD`
: SPACES 0 DO SPACE LOOP ; \ définition d'un mot pour afficher
\plusieurs espaces (qui existe déjà
\ avec une définition légèrement
\ différente)
15 SPACES \ affiche 15 espaces
WIDTH
Groupe | Signature |
---|---|
Systême | ( - n ) |
Met sur la pile le nombre de caractères significatifs pour les mots (1fh = 31d).
Vocabulaire
CURRENT
Groupe | Signature |
---|---|
Vocabulaire | ( - addr ) |
Met sur la pile l'adresse de la variable contenant le dernier mot défini dans le vocabulaire courant. Cette valeur pointe vers le NFA du mot.
La valeur de vocabulaire courant est modifiée par l'utilisation du mot definitions
.
HEX CURRENT U. \ affiche FF70, l'adresse en RAM
\ contenant le pointeur vers le dernier
\ mot défini.
CURRENT @ U. \ affiche FF9C au démarrage de Forth. Qui est
\ l'adresse à laquelle est stockée l'adresse
\ du NFA du dernier mot défini.
CURRENT @ @ U. \ affiche FF8E au démarrage de Forth. Qui est
\ donc l'adresse du NFA du dernier mot défini.
\ C'est le mot `FORTH` lui-même, ce que l'on
\ peut constater en tapant `VLIST`.
Note : comme le mot FORTH
contient une partie variable, ce mot du vocabulaire de base est défini en RAM plutôt qu'en ROM. Il y est copié au démarrage du système.
CONTEXT
Groupe | Signature |
---|---|
Vocabulaire | ( - addr ) |
Met sur la pile l'adresse de la variable contenant le dernier mot du vocabulaire de contexte. la valeur de vocabulaire de contexte est modifiée lors de l'appel d'un mot défini par VOCABULARY
.
HEX CONTEXT @ U. \ affiche FF6E, l'adresse en RAM
\ contenant le pointeur vers le dernier
\ mot du vocabulaire de contexte.
CONTEXT @ U. \ affiche FF9C au démarrage de Forth. Qui est
\ l'adresse à laquelle est stockée l'adresse
\ du NFA du dernier mot défini.
CONTEXT @ @ U. \ affiche FF8E au démarrage de Forth. Qui est
\ donc l'adresse du NFA du dernier mot défini.
\ C'est le mot `FORTH` lui-même, ce que l'on
\ peut constater en tapant `VLIST`.
VLIST
Groupe | Signature |
---|---|
Vocabulaire | ( - ) |
Affiche la liste des mots du vocabulaire courant. La liste est affichée en deux colonnes, la première indique le nom du mot, la seconde l'adresse de sa définition.
Le premier mot affiché est le dernier ajouté au vocabulaire, puis les suivants dans l'ordre inverse de leur ajout.
Appuyer sur une touche permet de suspendre le défilement puis de le reprendre. Appuyer sur RETURN
permet d'interrompre l'affichage de la liste.
VOCABULARY
Groupe | Signature | Mot Immédiat |
---|---|---|
Vocabulaire | ( - <nom>) | Oui |
Créé un nouveau vocabulaire portant le nom
qui suit. les contextes courant et de contexte ne sont pas changés.
VOCABULARY NVOC
NNOV \ le vocabulaire de contexte est maintenant `NVOC`
Note : VOCABULARY
est un mot de construction. Le mot construit porte dans ses paramètres l'adresse du dernier mot compilé pour ce vocabulaire.
(?TODO?) détailler comment
À trier
RINK
Groupe | Signature |
---|---|
Graphismes | ( n - ) |
( ? )
(LOOP)
(+LOOP)
(DO)
ENCLOSE
;S
Groupe | Signature |
---|---|
? | ( - ) |
Équivalent d'un ; compilable ?
R
Groupe | Signature |
---|---|
Cœur | ( - addr ) |
Met sur la pile une adresse qui ne semble pas utilisée par le reste de Forth.