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 ou 2 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.

Voir aussi RND et RANDOM.

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).

Voir aussi 256RND et RANDOM.

: 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.

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 en HERE,
  • 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 buffersont 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.