CODINGLA BIBLE DU CPC 6128

La bible du CPC 6128 : 3.01.00 L'interpréteur Basic du CPC

3 LE BASIC

3.1 L'interpréteur Basic du CPC

Le CPC dispose d'un interpréteur Basic rapide et puissant qui est logé dans une ROM de 16 K. Il occupe la zone d'adresses &C000 à &FFFF, parallèlement à la Ram écran. Pour le programme Basic et pour les variables Basic, la zone de &0170 à &A67B est disponible, ce qui représente 42249 octets.

L'interpréteur soutient presque toutes les possibilités offertes par l'électronique et le système d'exploitation de l'ordinateur. Cela comprend notamment la sortie sur écran avec jusqu'à 8 fenêtres, le graphisme haute résolution, le son ainsi que le traitement d'event. Il est ainsi pour la première fois possible de faire exécuter en Basic plusieurs tâches parallèlement. L'interpréteur Basic offre en outre une arithmétique avec des nombres entiers de 16 bits (zone de valeurs de -32768 à 32767) et une arithmétique avec virgule flottante avec un exposant-puissance de deux sur 8 bits et une mantisse de 32 bits qui garantit une précision de 9 décimales pour une zone de valeurs de +- 1E-39 à +-1E+38.
L'arithmétique entière ou l'arithmétique à virgule flottante ne font cependant pas partie de l'interpréteur Basic mais de la ROM du système d'exploitation (adresses &2F73 à &37FF). Elles sont appelées comme les autres fonctions du système d'exploitation à travers la table de saut qui se trouve dans le haut de la Ram (&BB00 à &BDF4) et qui peut être modifiée en cas de besoin.

L'interpréteur Basic permet également la création, l'édition (examen/modification) et l'exécution aisées de programmes. La création de programmes est en effet facilitée par l'instruction AUTO, l'édition par l'instruction EDIT qui, grâce à la puissance du système d'exploitation, est à peine moins maniable que l'éditeur plein écran, ainsi que par les instructions RENUM, MERGE et DELETE. L'exécution des programmes est également facilitée par des instructions puissantes. Par exemple l'instruction ON ERROR GOTO permet le traitement des erreurs.

L'instruction DEFtype permet de définir le type d'une variable, l'instruction ERASE permet une suppression sélective de tableaux. Il est encore possible d'entrer et de faire sortir les nombres comme des nombres décimaux, binaires ou hexadécimaux ainsi que d'utiliser des fonctions qu'on a soi-même définies, fonctions qui peuvent comporter plusieurs arguments.

Enfin les structures de programme telles que IF ... THEN ... ELSE, FOR ... NEXT et WHILE ... WEND sont un autre aspect très important de la puissance du Basic du CPC. Il est également possible en Basic de réaffecter les touches du clavier, de définir les fonctions des touches de fonction ou de définir des caractères qui apparaîtront à l'écran. Il ne manque ni l'instruction TRACE ni une très complète instruction PRINT USING.
Après ce bref aperçu, nous allons nous pencher de plus près sur l'entrée et le stockage des lignes de Basic, ainsi que sur l'exécution des programmes par l'interpréteur Basic. Ces informations vous permettront non seulement de pouvoir tirer le maximum de votre interpréteur Basic mais également d'écrire vos propres extensions du Basic. Nous vous donnerons plus loin quelques exemples d'extensions du Basic.
L'entrée de lignes Basic

Lorsque vous entrez une ligne Basic, elle est d'abord placée dans un buffer de 256 octets qui se trouve aux adresses &ACA8 à &ADA7. L'entrée y figure en clair, non codée. Si la ligne commence par un numéro, celui-ci est converti en un nombre binaire de 16 bits et placé dans un second buffer destiné à recevoir la ligne traitée. Ce buffer comprend 300 caractères et il se trouve avant le programme Basic, aux adresses &40 à &16F. La ligne entrée est alors examinée pour voir si elle comporte des mots-clé Basic. Ces mots-clés sont remplacés par un octet appelé token. Par exemple 'AFTER' devient le token &80. Les tokens de tous les mots d'instruction et des opérateurs Basic tels que '=' ou 'AND' ont des valeurs supérieures à 127, c'est-à-dire que leur bit 7 est mis. Les fonctions Basic comme EXP ou ROUND ont des tokens compris entre 0 et &7F.

Pour les distinguer des caractères ASCII normaux, ils sont marqués par un &FF les précédant. Le double-point servant à séparer entre elles deux instructions est représenté par le code &01, la fin d'une ligne est marquée par un &00. Si une suite de lettres n'a pu être identifiée comme étant une instruction ou une fonction, elle est traitée comme étant le nom d'une variable. Un nom de variable peut comprendre jusqu'à 40 caractères qui sont tous significatifs. Aucune différence n'est faite entre les majuscules et les minuscules. Supposons que nous ayons entré la ligne suivante :

10 start=77
Après le numéro de ligne seront placées les valeurs:
&0D &00 &00 &73 &74 &61 &72 &F4 &EF &19 &4D &00
Le &0D indique qu'il s'agit d'une variable sans marque de type. Ensuite viennent deux 0 sur lesquels nous reviendrons plus tard. Puis vient le nom de la variable, les codes ASCII pour s, t, a et r. Pour la dernière lettre, 't', &80 est ajouté au code ASCII &74 (le bit supérieur est mis) et nous obtenons &F4. Le code &EF est le token pour '='. Le code &19 qui suit indique une constante à un octet: &4D est la valeur de cette constante (=77 en décimal). Le zéro qui termine marque la fin de la ligne.

Avant le numéro de ligne, il y a encore deux octets qui indiquent la longueur de la ligne:

&12 &00 &0A &00
La ligne comporte donc &12+256*&00 = 18 octets et elle porte le numéro de ligne
&0A+256*&00, soit 10.
Vous voyez donc qu'au contraire de ce qui est le cas avec d'autres interpréteurs Basic, les constantes ne sont pas placées dans le texte du programme sous forme de textes ASCII, mais sous la forme de leur traduction binaire. Ceci présente un avantage décisif. La conversion du format ASCII au format binaire prend en effet du temps.

Avec la technique utilisée sur le CPC, cette conversion ne s'effectue qu'une seule fois, lors de l'entrée de la ligne et elle n'a donc pas à être effectuée chaque fois que la ligne est exécutée. Il en découle un gain de vitesse dans l'exécution des programmes qui n'est pas négligeable.

Le CPC connaît d'autre part toute une série de constantes numériques qui sont désignées par un token particulier. Les constantes qui ne comprennent par exemple qu'un seul chiffre, soit les nombres de 0 à 9 sont ainsi codées avec les tokens &0E à &17. Elles n'occupent ainsi qu'un octet dans le texte du programme. Nous avons déjà rencontré le token &19 qui marque les valeurs numériques d'un octet. Pour les valeurs entières sur deux octets, il y a trois tokens différents, suivant que la constante a été entrée sous la forme décimale, binaire ou hexadécimale. La valeur de la constante est toujours stockée de la même façon avec un octet faible et un octet fort.

&1A valeur sur deux octets, décimal
&1B valeur sur deux octets, binaire
&1C valeur sur deux octets, hexadécimal
S'il ne s'agit pas d'un nombre entier ou si sa valeur est supérieure à 32767, le nombre est stocké sous la forme d'une valeur à virgule flottante qui est désignée par le token &1F. Le token est suivi de la valeur à virgule flottante sur 5 octets. Nous reviendrons plus tard sur les valeurs à virgule flottante.

Dans ce contexte, les numéros de ligne ont une situation particulière lorsqu'ils suivent par exemple des instructions telles que GOTO, GOSUB ou RUN. Ils sont également stockés sous la forme binaire, mais ils sont désignés par le token &1E.

Lorsqu'un programme est exécuté et qu'il rencontre par exemple une instruction GOTO, il lit alors le numéro de ligne et il doit rechercher cette ligne dans tout le programme. Sur des programmes de taille importante, cela peut durer assez longtemps. Les instructions GOTO et GOSUB sont souvent utilisées dans des boucles qui sont parcourues des centaines ou des milliers de fois.

Dans ce cas, le temps de recherche des numéros de ligne peut représenter un part importante du temps d'exécution du programme. L'interpréteur Basic du CPC n'effectue cette recherche de ligne qu'une seule fois. En effet, une fois qu'il a trouvé la ligne recherchée, il remplace le numéro de ligne figurant à la suite de l'instruction GOTO par l'adresse de cette ligne qu'il vient de trouver. Pour qu'il puisse faire la différence entre un numéro de ligne et une adresse de ligne, il remplace le token &1E par le token &1D, qui est le token pour les adresses de ligne. Si la même instruction GOTO est exécutée une seconde fois, l'interpréteur trouve directement l'adresse a laquelle le programme doit sauter, ce qui permet bien sûr de gagner beaucoup de temps.

Cette technique crée cependant quelques difficultés pour les instructions qui utilisent le numéro de ligne en tant que tel. Lorsque l'instruction LIST doit par exemple sortir le numéro de ligne, c'est le numéro de ligne qu'elle doit indiquer et non l'adresse de la ligne. Ce problème est cependant très facilement résolu. En effet lorsque l'adresse de la ligne est connue, il est facile d'aller y rechercher le numéro de ligne puisque, comme nous l'avons vu, le numéro de ligne est stocké dans la ligne. Lorsque des lignes sont supprimées ou que d'autres lignes sont ajoutées, les adresses de ligne doivent être remplacées par les numéros de ligne car de telles opérations entraînent bien sûr une modification des adresses de ligne. Cela ne présente cependant d'inconvénient que pour l'entrée et la sortie de lignes de programmes. Ce petit inconvénient est cependant largement compensé par la vitesse nettement plus grande d'exécution des programmes.

L'exécution des programmes par l'interpréteur Basic

L'exécution d'une instruction par l'interpréteur Basic se présente, en simplifiant un peu, de la façon suivante. Chaque ligne de programme commence, comme nous l'avons dit, par la longueur de la ligne et le numéro de ligne. Ensuite vient l'instruction Basic proprement dite. L'interpréteur examine maintenant s'il s'agit d'un token d'instruction, dont la valeur est toujours comprise entre &80 et &DC.

Si c'est le cas, il utilise ce token comme pointeur d'une table qui contient les adresses de toutes les instructions Basic. L'instruction Basic est alors exécutée comme un sous-programme. On revient ensuite à ce qu'on appelle la boucle de l'interpréteur. Si l'instruction ne commençait cependant pas par un token d'instruction, on saute à l'instruction LET.

La partie la plus importante de l'interpréteur Basic est certainement le calcul des expressions. Le CPC distingue à cet égard trois types d'expressions: entières, à virgule flottante et chaînes de caractères. Lorsque par exemple une affectation de valeur à une variable est exécutée ou lorsque le paramètre d'une instruction doit être calculé, une routine est appelée qui calcule l'expression et qui fournit la valeur ainsi que le type de l'expression. Le type de variable peut avoir trois valeurs différentes:

2 entier
3 chaîne
5 virgule flottante
Ce numéro de type donne en même temps la longueur de la variable. Pour une chaîne, c'est ce qu'on appelle le Descriptor qui contient la longueur et l'adresse de la chaîne (voyez également le chapitre sur le pointeur de variable). Si cependant le type d'une expression est différent du type d'une variable à laquelle cette expression doit être affectée, une conversion de type est tentée, mais seulement entre les deux types numériques entier et à virgule flottante. Cette conversion prend bien sûr un certain temps et il est donc préférable d'employer des variables entières lorsque c'est possible. L'expérience révèle en effet que le type entier convient dans 90 % des cas. Non seulement le type entier évite les conversions de types, mais l'arithmétique entière est en outre nettement plus rapide que l'arithmétique à virgule flottante. Cette remarque vaut particulièrement pour les variables de comptage utilisées par exemple dans les boucles FOR...NEXT.

Par contre, si vous tentez d'affecter une expression du type chaîne de caractères à une variable numérique ou vice versa, le message d'erreur 'Type mismatch' sera sorti. La conversion de chaîne de caractères à numérique et vice versa n'est possible qu'avec les fonctions VAL et STR$.

★ ANNÉE: ???

Page précédente : La bible du CPC 6128 : 2.06.00 Le générateur de caractères
Je participe au site:

» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.7-desktop/c
Page créée en 211 millisecondes et consultée 2085 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.