Suivez-nous sur X

|
|
|
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,
ALL
|
|
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
|
|
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
|
|
A propos d'Obligement
|
|
David Brunet
|
|
|
|
Programmation : AMOS - Brancher des routines sur les interruptions et améliorer le rafraîchissement des écrans
(Article écrit par François Lionet et extrait d'Amiga News Tech - avril 1991)
|
|
Bienvenue dans la rubrique AMOS de l'ANT, AMOS Technique (AMT pour les intimes). Après avoir
vu comment créer une extension à l'AMOS,
nous allons brancher des routines sur les interruptions et améliorer le processus de rafraîchissement d'écran...
Et pour commencer, nous allons voir comment brancher une routine sur les interruptions VBL.
AMOS utilise intensivement les interruptions de retour de balayage. Beaucoup de choses y sont
effectuées :
- Changement de listes de sprites.
- Gestion des écrans entrelacés (fait en interruption sous AMOS !).
- Modification des couleurs dans la liste Copper (FLASH, SHIFT, FADE).
- Appel d'AMAL.
- Appel des routines musicales.
- Gestion de la souris.
Elles sont pour le moins chargées !
Une extension peut bien sûr modifier le vecteur en S6C pour se brancher sur le serveur d'interruption.
Je ne vous le conseille pas : certaines tâches effectuées par AMOS ont absolument besoin de se produire
immédiatement après le signal de retour de balayage. Ce sont toutes les opérations modifiant la liste
Copper (changement des couleurs, écran entrelacé, sprites). Le fait de retarder l'entrée de la routine
VBL de l'AMOS provoquerait un accès simultané du Copper et du 68000 aux mêmes adresses. La réponse du
DMA serait sans appel : plantage !
C'est pourquoi j'ai ménagé un moyen très simple pour programmer une interruption VBL.
Dans la zone de données (pointée par A5), se trouve une petite liste de huit adresses. Les routines
pointées par ces adresses sont appelées par AMOS lors de l'interruption VBL.
Voici la partie de programme qui effectue l'appel :
Le programme explore la liste et appelle toute adresse différente de zéro. La boucle d'exploration se
termine à la première adresse nulle. Il ne faut pas modifier les registres A4, A5 et A6.
Insérer sa propre routine
Il faut explorer la liste depuis le début à la recherche de la première adresse nulle :
Attention : vous ne devez pas "poker" une adresse à une position fixe dans la liste : votre extension peut-être chargée
après une autre, qui utilisera la même position !
La liste peut contenir sept adresses, et doit se terminer par un zéro. La première est en général utilisée par
l'extension musicale.
Avoir sa propre routine Update
Quelques explications : le principal avantage d'AMAL est l'animation automatique des BOB,
sprites, écrans et autres "rainbows" : ils bougent en interruption pendant que le programme
BASIC continue à fonctionner... Il n'était pas possible de programmer tout le système en
interruption, pour une raison très simple : les interruptions VBL doivent absolument durer
moins de 1/50e de seconde, sous peine de planter la machine. Or, afficher plusieurs BOB,
recalculer la liste Copper, dessiner un rainbow peut prendre largement plus de ce temps :
il a fallu ruser !
AMAL fonctionne véritablement sous interruptions. Son rôle est de calculer et de modifier les coordonnées,
et seulement les coordonnées de chacun des canaux animés. Chaque fois qu'AMAL change un canal,
il positionne un drapeau du canal et un drapeau dans la zone de données de l'AMOS.
Pour éviter de planter le système, le nombre de canaux animés durant les interruptions est limité à 16 (SYNCHRO ON).
Avant chaque instruction de branchement, ou lors d'une boucle d'attente (par exemple WAIT),
AMOS teste le drapeau général. Si ce drapeau est à 1, AMOS appelle la routine de dessin de BOB,
sprite, écran, etc. On peut ainsi garder l'avantage des interruptions (stabilité des déplacements,
indépendance par rapport au BASIC), tout en autorisant le déplacement de très gros objets...
Au fait, au fait !
Quel rapport avec les extensions ? Il est possible de réaliser une extension se greffant automatiquement sur
le processus d'Update. Vous pouvez donc créer votre propre version d'AMAL en utilisant une routine VBL
positionnant les drapeaux UPDATES.
J'ai réalisé ceci en pensant à AMOS 3D (qui doit sortir très prochainement, sans blague !). Les programmeurs de
cette extension voulaient réaliser un pseudo AMAL traitant trois coordonnées : X, Y et Z,
pour gérer des objets en trois dimensions.
Comment faire
Le principe se rapproche de celui utilisé pour les interruptions : une liste de routines à appeler,
plus des drapeaux à positionner. La liste des routines d'Update se trouve à l'adresse ExtTests+4(a5),
et peut contenir sept adresses.
Quant aux drapeaux, les voilà :
Actual+1(a5) : les bits 1 à 7 signalent un routine à appeler. Au bit 1 correspond l'adresse contenue
en ExtTests+4(a5), au bit 2, l'adresse contenue dans ExtTests-F8(a5), etc.
ActuMask+1(a5) : il s'agit d'un masque appliqué au contenu de Actual, pour inhiber certaines routines Update.
Voici un extrait de la routine d'appel des extensions :
Vous pouvez voir en inspectant cette routine que la première adresse de la ligne et le bit 0 du
drapeau Actual ne sont pas accessibles. La routine doit en plus préserver les registres D6/D7, A1 et A5.
Un exemple
Voici le listing d'une extension complètement... nulle. Elle propose une merveilleuse instruction, dont le
seul objet est de "poker" dans la mémoire d'un écran tous les 1/50e de seconde, en interruption :
MOUVEMENT NUL adresse,taille
|
L'installation des routines est réalisée dans la partie initialisation de l'extension. Pour les deux routines,
on recherche une place libre dans la liste, puis on "Loke" l'adresse.
Pour la partie Update, il faut en plus garder le numéro du bit à positionner pour l'appel... Pas besoin de se
soucier de l'effacement des routines : tout est effectué par AMOS.
Pour avoir une démonstration de l'instruction, passer en mode direct, effacez l'écran (CLS 0) puis tapez :
MOUVEMENT NUL Logbase(0),8000
|
Un octet progresse sur l'écran. C'est idiot, mais c'est une bonne démonstration du processus :
- L'incrémentation de l'adresse de l'octet est réalisée pendant l'interruption VBL.
- L'affichage dudit octet est réalisé lors de la mise à jour (Update). Si vous bougez l'écran de mode direct
(avec les flèches haut et bas), certaines positions ne sont pas affichées, le calcul de la liste
Copper fait "sauter" un balayage écran.
Ciel, le compteur de mon traitement de texte indique déjà 9000 caractères, il se fait tard, je
dois vous laisser ! Le mois prochain nous nous attaquerons à la structure des banques de mémoire :
sprites, musique, etc.
|