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 : Registres pour réaliser des animations (Agnus/Denise)
(Article écrit par François Fleuret et extrait de Génération 4 - mars 1989)
|
|
Afin de mieux comprendre les listings pour créer des animations sur Amiga, il est nécessaire de
posséder une liste des registres des coprocesseurs vidéo de cet ordinateur. Je vous donne donc
aujourd'hui une synthèse des registres les plus intéressants pour réaliser des animations graphiques.
Deux puces
Les deux puces qui nous intéressent sont Agnus et Denise. Le rôle de la première est de générer les
adresses mémoire, générer les adresses registre et de contrôler la mémoire dite "Chip". Elle
regroupe le Copper et le Blitter. Denise, quant à elle, est responsable de la plupart des tâches
liées au graphisme comme la génération des couleurs et l'affichage des différentes résolutions.
La liste des registres fournit le nom, la taille et l'adresse de chacun d'entre eux ainsi qu'une
explication de son rôle. L'adresse est donnée à partir de $dff000, la taille, elle, est
donnée avec un ".W" pour un mot (16 bits) et un ".L" pour un mot long (32 bits).
Certains registres possèdent deux adresses, l'une pour les lire et l'autre pour les modifier.
Dans ce cas-là, les deux adresses sont indiquées avec un "r" pour l'adresse où l'on lit
(R pour Read) et un "w" pour l'adresse où l'on écrit (W pour Write).
Le Copper
Voici quelques petits rappels à propos du Copper. Cet étrange animal peut se synchroniser
parfaitement avec le balayage de l'écran, et il possède son propre langage qui comporte
trois instructions : MOVE, WAIT et SKIP.
Les registres du Copper sont les suivants :
- COP1LC.1 ($80) : pointeur sur la liste Copper.
- COP2LC.1 ($84) : pointeur sur une seconde liste Copper (rarement utilisée).
- COPJMP1.w ($88) : un appel à cette adresse provoque un saut du Copper au début de la liste
Copper pointée par COP1LC.
- COPJMP2.w ($8A) : idem mais pour COP2LC.
- COPCON.w ($2E) : si le bit 1 est à 1, le Copper a accès aux registres 16 à 31
(à partir de $dff000).
- DMACON.w ($96w $02r) : contrôle des accès DMA, pour que le Copper puisse écrire dans
les registres, le bit 7 doit être à 1.
- INTREQ.w ($9Cw $1Er) : "Interrupts Request", permet de déclencher une IT avec le
Copper en mettant le bit 4 à 1. Il faut le remettre à 0 après avoir traité l'IT.
- INTENA.w ($9Aw $1Cr) : "Interrupts Enable", permet d'autoriser l'IT Copper, pour
cela il, faut mettre le bit 4 à 1.
L'interruption Copper est une IRQ comme une autre, et l'on peut très bien déclencher une
IRQ en changeant n'importe quel bit de INTREQ. La programmation du Copper se fait dans cet
ordre :
- DMACON : pour autoriser le DMA.
- COP1LC : pour indiquer la nouvelle liste Copper.
- COPJMP1 : pour valider cette nouvelle adresse.
Il faut, de plus, avoir écrit une liste Copper avec des DC.
La syntaxe des instructions du Copper est :
MOVE [0000000r][rrrrrrr0][dddddddd][dddddddd]
|
Cette instruction permet de modifier la valeur d'un registre.
- r=Registre : toujours pair donc bit 0 à 0.
- d=Donnée : mot donc deux accès pour les mots longs.
WAIT [yyyyyyyy][xxxxxxx1][bvvvvvvv][hhhhhhh0]
|
Cette instruction attend une position du faisceau d'électron.
- y=Position verticale attendue.
- x=Position horizontale (précision de 4 pixels en basse résolution et 8 en haute résolution).
- b=Le Copper doit-il attendre le Blitter (0=Oui 1=Non).
- v=Masque binaire vertical.
- h=Masque binaire horizontal.
SKIP [yyyyyyyy][xxxxxxx1][bvvvvvvv][hhhhhhh1]
|
Cette instruction passe l'instruction suivante dans la liste Copper si une certaine position
a été dépassée par le faisceau d'électrons du moniteur.
- y=Position verticale attendue.
- x=Position horizontale (précision de 4 pixels en basse résolution et 8 en haute résolution).
- b=Le Copper doit-il attendre le Blitter (0=Oui 1=Non).
- v=Masque binaire vertical.
- h=Masque binaire horizontal.
Le Blitter
La deuxième bête que nous allons étudier est le Blitter. Son rôle dans un système tel que
l'Amiga est de transférer des blocs de bits afin d'accélérer les animations graphiques.
Le Blitter est le responsable des défilements, BOB et autres excentricités propres à l'Amiga.
Sa programmation est beaucoup plus complexe que celle du Copper. De plus, il peut aussi
tracer des lignes, mais nous ne verrons aujourd'hui que la fonction de transfert de blocs.
Ses registres sont les suivants :
- BLTAPT.1 ($50), BLTBPT.1($4C) et BLTCPT.1 ($48) : ces quatre registres sont les
pointeurs sur les trois sources (A, B et C) et la destination du BLTCPT.1 ($54) transfert (D).
- BLTAMOD.w ($64), BLTBMOD.w ($62), BLTCMOD.w ($60) et BLTDMOD.w ($66) :
ces registres contiennent les modulos du transfert, cette valeur est ajoutée à la fin de
chaque ligne.
- BLTALWM.w ($44) : masque des 16 pixels à droite pour la source A.
- BLTAFWM.w ($46) : masque à gauche.
- BLTCON0.w ($40) :
- Bits 0-7 : sélection des fonctions logiques.
- Bit 8 : USED - validation de la destination D.
- Bit 9 : USEC - validation de la source C.
- Bit 10 : USER - validation de la source B.
- Bit 11 : USEA - validation de la source A.
- Bits 12-15 : ASH0-ASH3 - décalage en pixels de la source A.
- BLTCON0.w ($42) :
- Bit 0 : LINE - tracé de ligne (0=Non (mode blocs) 1=Oui).
- Bit 1 : DESC - balayage des données (0=croissant 1=décroissant).
- Bit 2 : FCI - mode de remplissage (0=intérieur 1=extérieur).
- Bit 3 : IFE - mode de remplissage inclusif.
- Bit 4 : EFE - mode de remplissage exclusif.
- Bits 5-11 : inutilisés.
- Bit 12-15 : BSH0-BSH3 - décalage en pixels de la source B.
- BLTSIZE.w ($58) : taille du bloc et démarrage du Blitter.
Écrire dans ce registre déclenche le transfert du bloc.
- Bits 0-5 : largeur du bloc en mots (64 mots=1024 pixels).
- Bits 6-15 : hauteur en pixels (1024).
- DMACON.w ($96w $02r) : contrôle du DMA.
- Bit 6 : accès Blitter au DMA (0=Non 1=Oui).
- Bit 10 : priorité du Blitter sur le 68000 pour le DMA.
- Bit 13 : détection de bloc vide (0=Pas vide 1=Vide).
- Bit 14 : Blitter occupé (0=Non 1=Oui).
Le Blitter et le 68000 partagent les mêmes cycles et donc ne peuvent travailler simultanément
(sur la mémoire Chip, les 512 premiers ko).
Sa programmation se fait dans cet ordre :
- DMACON (bit 6 et 10 la plupart du temps).
- Pointeurs d'adresses BLTxPT source et destination.
- Modulos BLTxMOD (souvent à 0).
- Masques BLTAxWM (souvent à $ffff) pour la source A.
- Contrôle du Blitter BLTCON0.
- Idem avec BLTCON1 (pour des transferts de blocs, les bits 0, 2, 3 et 4 sont à 0).
- Démarrage en indiquant la taille du bloc dans BLTSIZE.
- On peut attendre la fin du transfert en testant le bit 14 de DMACON.
Registres vidéo
Il reste enfin à étudier les registres vidéo sans lesquels il est hors de question de faire des démos :
- COLORx.w ($180+2x) : registre de la couleur x.
- Bits 0-3 : Bleu.
- Bits 4-7 : Vert.
- Bits 8-11 : Rouge.
- DIWSTRT.w ($8E) : coordonnées du coin haut gauche de la fenêtre d'affichage.
- Bits 0-7 : coordonnée horizontale (précision de 4 pixels en basse résolution et 8 en haute résolution).
- Bits 8-15 : coordonnée verticale (précision 1 pixel).
- DIWSTOP.w ($90) : coordonnées du coin bas droit.
- BPLCON0.w ($100) : contrôle de l'affichage.
- Bit 0 : inutilisé.
- Bit 1 : ERSY - genlock vidéo.
- Bit 2 : LASE - mode entrelacé (0=Non 1=Oui).
- Bit 3 : LPEN - stylo optique (0=Non 1=Oui).
- Bit 4-7 : inutilisés.
- Bit 8 : GAUD - genlock audio.
- Bit 9 : COLOR ON - mode couleur (0=Non 1=Oui).
- Bit 10 : DBLPF - mode "dual-playfields" (0=Non 1=Oui).
- Bit 11 : HOMOD - mode HAM (0=Non 1=Oui).
- Bit 12-14 : BPUO-PBU2 - nombre de plans (0-5 + mode Half-Brite).
- Bit 15 : HIRES - mode haute résolution (640 pixels, 0=Non 1=Oui).
- BPLCON1.w ($102)
- Bits 0-3 : décalage horizontal des plans impairs.
- Bits 4-7 : décalage des plans pairs.
- Bits 8-15 : inutilisés.
- BPLxPT.1 ($E0+4x) x=0-5 : pointeurs vidéo dynamiques.
- BPL1MOD.w ($108) : modulo du plan 1 (playfield) en mots. Cette valeur est rajoutée
au pointeur du plan de bits en fin de ligne et permet donc de définir un plan de bits
plus large que la partie visible. Par exemple, s'il apparaît à l'écran 320 pixels dans la
largeur (40 octets par ligne) et que l'on veuille définir un plan de bits de 480 pixels,
il suffit d'indiquer un modulo de 20 octets, ou 10 mots. En fin de ligne, le pointeur vidéo
sautera 160 points.
- EPL2MOD.w ($10A) : modulo du plan 2 en mots.
- DDFSTRT.w ($92) : délai avant le "video data fetching" (=$0038).
- DDFSTOP.w ($94) : fin du "video data fetching" (=$00d0).
De plus, il faut savoir que sur Amiga, les pointeurs vidéo sont dynamiques. Cela signifie qu'ils
s'incrémentent sans cesse et obligent donc le système à les remettre à leur valeur de départ au
début de chaque balayage. Pour cela, la plupart du temps, la liste Copper débute par la remise
en place de ces pointeurs.
Les effets utilisés dans les démos sont souvent dus à une judicieuse utilisation du Copper et des
registres vidéo. Par exemple, lorsque l'on voit une image onduler horizontalement avec une amplitude
inférieure à 16 pixels, il est probable qu'elle est animée simplement en indiquant une valeur différente
à BPLCON1 à chaque ligne (grâce au Copper). Ce type d'animation ne prend que quelque dizaines de
cycles et est bien plus propre et performante que la même chose faite à coups de Blitter.
Dans certains défilements, une combinaison des deux coprocesseurs permet, d'une part, une déformation
(registres vidéo + Copper) et, d'autre part, un mouvement (avec le Blitter). En règle générale, les
déformations sont faites avec le Copper et les registres vidéo, alors que les mouvements généraux
sont réalisés avec le Blitter (on peut néanmoins réaliser des défilements en modifiant les pointeurs
des plans de bits, mais c'est une autre histoire).
Un dernier détail : pour faire une animation "propre", il est primordial de se synchroniser avec le
balayage. La méthode couramment choisie consiste à réaliser toute l'animation dans l'IRQ déclenchée
par le Copper (qui est synchronisé avec le balayage).
Un peu de vocabulaire pour se cultiver
Bitplan : "plan de bits". Zone mémoire représentant un plan de bits.
Il faut autant de plans de bits que de bits dans la couleur (2 pour 4 couleurs, 3 pour 8,
4 pour 16...).
Playfields : "Terrain de jeu" ou "plan". Le plan regroupe des plans de bits
pour former une "image" parfois plus grande que la partie visible à l'écran. En mode "dual-playfield"
(double plan), l'Amiga considère deux plans, l'un regroupant les plans pairs et l'autre les plans
impairs.
Fenêtre d'affichage : elle n'a rien à voir avec les fenêtres d'Intuition, c'est simplement la
zone où va s'afficher la portion de mémoire vidéo délimitée par le programmeur.
VBL : interruption déclenchée à chaque passage du faisceau d'électron en haut de l'écran.
Voilà, c'est tout pour ce numéro. Vous pouvez trouver des indications plus complètes sur le
matériel de l'Amiga dans le fameux ouvrage Hardware Manual, livre de chevet (en anglais) de
tout programmeur en assembleur, ou bien dans La Bible De L'Amiga" de Micro Application qui
détaille également les routines des ROM.
|