|
||||||||||||||||||||||||||||||||||||||||||||||
|
Deuxième volet de notre série sur AMAL, le langage d'animation intégré à AMOS. Dans cet article, nous allons inspecter en détail l'évaluation d'expression, les registres internes et externes, les boucles et les branchements. Expressions et variables AMAL peut effectuer des calculs et garder les résultats en mémoire. Cette évaluation d'expression est cependant extrêmement simplifiée pour en accélérer l'exécution. Opérateurs et expressions Vous pouvez utiliser dans vos calculs les quatre opérateurs courants : "+", "-", "*" et "/". Les calculs sont évalués de gauche à droite, strictement, sans priorité d'opérateurs. AMAL ne reconnaît pas les parenthèses. Exemple à ne pas suivre : si l'on veut 3*2+2=8 et qu'on fait 2+3*2, on a tout faux ! AMAL calcule en premier 2+3=5 puis 5*2=10. AMAL reconnaît également les opérateurs logiques : "=", "<>", "<", ">", "&" (ET logique), "&" (OU logique). Attention, la version 1.1 d'AMOS ne reconnaît pas cet opérateur (oui je sais, bogue !). Les opérateurs de comparaison ramènent la valeur -1 ($FFFF) lorsque l'expression est vraie, et 0 dans le cas contraire. Afin d'accélérer l'exécution, AMAL se contente de deux octets pour stocker les chiffres (contre 4 pour AMOS). Les limites de calcul sont donc de -32768 à +32767. Les variables ou registre Contrairement au BASIC, AMAL ne vous permet pas de choisir le nom de vos variables. Le système utilisé se rapproche plus de celui d'une calculatrice programmable. Le compilateur reconnaît un registre par la lettre "R", suivi d'une lettre ou d'un chiffre. Les registres locaux Ils sont désignés par un "R" suivi d'un chiffre (0 à 9). Vous en avez donc 10 à votre disposition. Ces registres n'appartiennent qu'au canal d'animation, et à lui seul. Les registres globaux Ils sont désignés par un "R" suivi d'une lettre (majuscule bien sûr). Ces 26 registres sont communs à tous les canaux d'animation, et doivent être réservés au transfert d'informations d'un canal à l'autre. Par exemple, un canal gérant une balle détecte une collision avec la cible, met à 1 l'un des registres globaux pour indiquer l'explosion. Les variables réservées Sont au nombre de trois : X, Y et A.
Comme au bon vieux temps, pour affecter le résultat d'un calcul à un registre ou à une variable réservée, il faut utiliser l'instruction Let (ou L). Let R0 = 1 Let X = X+1 L X = RA/2 + 10 Branchements et boucles Sans boucle, pas de programme complexe. AMAL possède le strict nécessaire pour faire des branchements. Les étiquettes Pas de numéros de lignes en AMAL, mais comme en AMOS, des labels. Pour simplifier la tâche du compilateur, le nombre d'étiquettes est limité à 26, les 26 lettres de l'alphabet. Pour marquer un label, il suffit d'utiliser une lettre majuscule suivie d'un ":". Comme d'habitude, vous pouvez intercaler des lettres minuscules avant les deux points. Exemples : Boucle : (équivalent à B:) Ici se branche le programme : (équivalent à I:) Les labels sont locaux à chaque chaîne. Le compilateur refusera de traiter deux fois la même étiquette pour un canal. Jump AMAL possède son propre GOTO : Jump (ou J seul). Il doit être suivi d'un label défini ailleurs dans la chaîne. Pause Voici un exemple : Ce programme est le parfait exemple à ne pas suivre. Il s'agit d'une boucle sans fin qui devrait normalement bloquer l'ordinateur si je n'avais programmé une sécurité : chaque canal possède un petit compteur qui n'autorise que six sauts au maximum pour chaque 1/50e de seconde. Ainsi, tous les 1/50e de seconde, notre programme "fait" six tours, puis rend la main au système, le BOB met donc 6,64/6 soit 1,07 seconde pour traverser l'écran. Vous devez utiliser l'instruction "Pause" (ou "P") pour réguler la vitesse : lorsque AMAL rencontre cette instruction, il rend la main à AMOS. L'exécution recommence 1/50e de seconde plus tard, à l'instruction suivant immédiatement Pause. Modifiez la deuxième ligne de notre exemple pour réduire la vitesse : Les tests de conditions peuvent être réalisés au moyen des instructions "If" (ou I) et "Jump" :
Si la condition est vraie (résultat différent de zéro), le programme fera un saut au label spécifié, sinon AMAL sautera le Jump. Exemple 2 : récupérez le programme précédent, et modifiez les lignes à partir de la définition du programme AMAL. Il montre comment utiliser les registres globaux pour synchroniser parfaitement un grand nombre de BOB : Note : j'ai utilisé dans mes remarques AMAL les caractères "-" et ">". Bien qu'ils ne soient pas ignorés par le compilateur dans les expressions, celui-ci n'en tient pas compte lorsqu'il attend une instruction ! Cela permet de donner plus de variété au listing. Attention cependant, pour ne pas enduire AMAL d'erreur (!), il faut clore chaque expression par un séparateur (genre point-virgule). Si vous enlevez par exemple celui situé dans la chaîne B$, après Let X = RA ; vous aurez un message d'erreur. Les boucles Comme nous l'avons vu le mois dernier, il est possible de faire des boucles For/Next en AMAL. La syntaxe à respecter est la suivante :
ou :
Vous devez impérativement utiliser un registre (local ou global) comme variable de boucle. Il faut toujours préciser le registre après l'instruction "Next". Il est parfaitement possible d'imbriquer plusieurs boucles (autant que de registres, soit 26+10=36 boucles). Le compilateur refusera un saut à l'intérieur d'une boucle. Vous pouvez par contre en sortir sans problème. On peut remplacer la chaîne A$ dans l'exemple précédent par : Exemple 3 : positionnement automatique d'un écran.
Pour bien comprendre le programme, sachez que "=XM", "=YM" et "=K1" sont des fonctions AMAL qui retournent la position et l'état des touches de la souris. Vous remarquerez l'utilisation de registres globaux pour échanger les données entre les chaînes. Ces registres sont calculés au début de la procédure en fonction du numéro de l'écran. Par exemple, RA, RB, RC, RD et RE seront utilisés par l'écran 0, RF, RG, etc. par l'écran 1. Les chaînes de caractères permettent de jongler avec les numéros de registre ! Voici l'utilisation de ces registres :
|