Obligement - L'Amiga au maximum

Mardi 16 octobre 2018 - 02:24  

Translate

En De Nl Nl
Es Pt It Nl


Rubriques

 · Accueil
 · A Propos
 · Articles
 · Galeries
 · Glossaire
 · Liens
 · Liste jeux Amiga
 · Quizz
 · Téléchargements
 · Trucs et astuces


Articles

 · Actualité (récente)
 · Actualité (archive)
 · Comparatifs
 · Dossiers
 · Entrevues
 · Matériel (tests)
 · Matériel (bidouilles)
 · Points de vue
 · En pratique
 · Programmation
 · Reportages
 · Tests de jeux
 · Tests de logiciels
 · Tests de compilations
 · Articles divers

 · Articles in english
 · Articles en d'autres langues


Twitter

Suivez-nous sur Twitter




Liens

 · Sites de téléchargements
 · Associations
 · Pages Personnelles
 · Matériel
 · Réparateurs
 · Revendeurs
 · Presse et médias
 · Programmation
 · Logiciels
 · Jeux
 · Scène démo
 · Divers


Jeux Amiga

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Trucs et astuces

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Glossaire

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Partenaires

Annuaire Amiga

Amedia Computer

Relec

Hit Parade


Contact

David Brunet

Courriel

 


Programmation : AMOS - Les principales instructions d'AMAL
(Article écrit par François Lionet et extrait d'Amiga News Tech - décembre 1990)


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.
  • X représente la coordonnée en X produite par le canal d'animation. Elle retourne la valeur actuelle produite par le canal. A l'inverse, modifier sa valeur reviendra à bouger l'objet affecté au canal.
  • Y est la coordonnée en Y.
  • A est l'image (A comme Animation).
L'instruction d'affectation

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 :

AMOS

C'est un exemple très simple. La partie initialisation charge la banque de sprites, puis modifie les couleurs en interruptions (Fade 1 To -1, "-1" signifiant de récupérer la palette de couleurs des sprites). Suit la définition de la chaîne AMAL, et le démarrage de celle-ci. A première vue, ça marche, même un peu trop bien ! Un programme AMAL est appelé tous les 1/50e de seconde. Pour traverser l'écran, le BOB devrait mettre 320/50 = 6,4 secondes. Or, il fait ce chemin en environ 1 seconde.

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 :

AMOS
AMOS

Les tests

Les tests de conditions peuvent être réalisés au moyen des instructions "If" (ou I) et "Jump" :

If condition Jump Label

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 :

AMOS
AMOS

La première chaîne (A$) va nous servir de générateur de coordonnées pour les autres chaînes. En effet, cette chaîne est affectée au canal 0, dont la sortie se fait vers le sprite matériel 0. Or, le programme n'a pas affiché de sprite, rien que des BOB. La chaîne 0 n'aura donc aucun effet visible. Elle va par contre modifier le contenu des registres globaux RA et RB. La chaîne B$ sera utilisée par les canaux de numéro impair pour les BOB situés à gauche de l'écran. La chaîne C$ garde dans un registre local la coordonnée en Y du BOB lors du lancement du programme.

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 :

For Rx=... To ...; suite d'instructions ; Next Rx

ou :

F Rx=... T ...; ...; N Rx

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 :

AMOS

Le pas de la boucle étant toujours de 1, il a fallu ruser pour la boucle descendante en utilisant une variable locale.

Exemple 3 : positionnement automatique d'un écran.

AMOS
AMOS

La procédure "SET_AUTO" initialise trois canaux d'interruptions dirigés vers l'écran courant. Ces trois canaux permettent de fixer en interruptions :
  1. La position de l'écran (SCREEN DISPLAY), en cliquant en haut et a gauche de celui-ci.
  2. La taille de l'affichage (SCREEN SIZE), en cliquant en bas et à droite.
  3. Le défilement à l'intérieur de l'écran (SCREEN OFFSET), en cliquant au milieu.
Vous pouvez utiliser cette procédure pour tout écran de numéro inférieur à 5. Aucun test n'est effectué pour vérifier la validité des valeurs envoyées à la liste Copper, l'affichage sera modifié (sans aucun danger) pour des valeurs extrêmes.

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 :
  • RA et RB : position en X et Y de l'écran, fixés par la chaîne A$.
  • RC et RD : taille en X et Y, fixés par la chaîne B$.
  • RE : drapeau empêchant plusieurs chaînes de fonctionner simultanément.
Voilà pour aujourd'hui. Ne vous en faites pas, cela va encore se compliquer le mois prochain.


[Retour en haut] / [Retour aux articles] [Article précédent]