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 : Assembleur - copier un BOB avec le Blitter
(Article écrit par Roméo Rapido et extrait d'Amiga News - décembre 1990)
|
|
Aujourd'hui au menu : Blit de BOB. Nous allons donc décortiquer l'ensemble des opérations à effectuer
sur les registres de Blitter pour lui faire exécuter cette basse besogne. Enfin bon, quand c'est bien
cuit et que la sauce est réussie, on regrette rarement le temps passé. A table.
BOB et Blitter
Le but du jeu est de "blitter" un BOB dans une image. Il ne s'agit pas ici d'un bête transfert de
zone rectangulaire puisque l'objet à transférer peut avoir n'importe quelle forme.
Notez que, vu la complexité du Blitter, ce n'est certainement pas la seule solution pour arriver
au même résultat : avec trois sources combinées par des équations booléennes, il y a
pas mal de possibilités. Je m'efforce simplement de vous aider à comprendre les mécanismes mis en
jeu dans notre cher Blitter. Voyons de plus près comment procéder.
Pour obtenir le résultat escompté, nous avons besoin des trois sources A, B et C, et d'une cible D.
La source A sera le masque du BOB, la B le BOB lui-même et la C l'image dans laquelle nous
voulons transférer ce dernier. Bien sûr, la cible D sera aussi l'image dans laquelle nous
voulons transférer notre pseudo-lutin (sprite).
Je rappelle brièvement que le masque est en fait un plan de bits ou la silhouette du BOB est définie par
des "1". On peut l'obtenir simplement en faisant un "ou" logique sur les différents plans de l'objet
et en sauvant le résultat dans un seul plan. Comme il s'agit d'une opération logique,
le Blitter répond présent lorsque nous demandons des volontaires pour exécuter cette mission.
Nous verrons à la fin de l'article comment procéder, mais revenons à nos moutons, le transfert du BOB.
Nous désirons donc mettre un pixel (un "1") dans le plan cible lorsque, à la même position, il y a :
- Un pixel dans l'image et que ce pixel est situé à l'extérieur du masque.
- Un pixel dans le BOB et que ce pixel est situé à l'intérieur du masque.
Dans tous les autres cas, il faut mettre un D.
Ceci se traduit facilement dans l'algèbre de Boole par l'équation suivante :
D = (A et B) ou (a et C) soit D = AB + aC
Une fois développé, nous obtenons :
D = ABC + ABc + aBC + abC
Cette équation correspond en fait aux bits 1, 3, 6 et 7 du registre BLTCON0 et par conséquent à la valeur
$CA pour l'octet de poids faible (celui de droite).
Les quatre bits de poids faible de l'octet supérieur (bit 8 à 11) doivent être forcés à 1
puisque les trois sources et la destination sont utilisées.
Les quatre bits de poids fort (bit 12 à 15) de BLTCON0 correspondent au décalage (valeur de 0 à 15)
que l'on doit effectuer sur la source A (masque). En fait, ce décalage de la source A correspond au
reste de la division par 16 de la position à laquelle on désire afficher le BOB dans l'image.
Ce reste est différent de 0 lorsque l'on désire transférer une image à une position non multiple
de 16 (pas alignée sur un octet pair).
Pour obtenir la valeur du décalage, il suffit de masquer la valeur de la position "X" à laquelle doit être
effectué le transfert avec $000F puisque 16 est un multiple de 2 (2 puissance 4), puis il ne reste
plus qu'à décaler le tout de 12 bits vers la gauche, ou, plus rusé, décaler de 4 bits vers la droite
avec un ROR qui a la propriété de faire réentrer les bits sortis à droite par le bit 15.
Cette valeur doit également être stockée dans BLTCON1 pour indiquer la valeur de décalage à utiliser
pour la source B.
Il ne reste plus qu'à faire un "ou" avec $0FCA pour obtenir la valeur du registre BLTCON0.
Les quatre registres modulo BLTAMOD, BLTBMOD, BLTCMOD et BLTDMOD doivent recevoir les valeurs
correspondants aux différents plans de bits.
Le registre BLTAFWM doit être initialisé avec $FFFF0. Pour le registre BLTALWM, la valeur doit être
la même que celle du décalage de la source A en entrée, soit le contenu de d0 juste avant le chargement
de BLTCON1.
Les quatre registres pointeurs de plans BLTAPTH, BLTBPTH, BLTCPTH et BLTDPTH doivent, bien sûr,
être initialisés avec l'adresse du début des plans correspondants.
Il ne reste plus qu'à charger BLTSIZE pour lancer le Blitter.
En résumé :
Il faudra bien sûr boucler pour transférer tous les plans du BOB un par un.
Le masque
Voyons maintenant la création du masque.
L'opération nécessite deux sources A et B et bien sûr une cible D. Il faut mettre un "1" dans D lorsqu'il
y a un "1" dans A ou un "1" dans B.
Si A est toujours le masque et B la source, ceci se traduit par : D = A + B, soit D = (ABC + ABc + AbC + Abc) + (ABC +
ABc + aBC + aBc).
En simplifiant, nous obtenons : D = ABC + ABc + AbC + Abc + aBC + aBc.
Il convient donc de "setter" les bits 2, 3, 4, 5, 6 et 7 de BLTCON0. Comme il faut aussi valider
les sources A et B ainsi que la cible D, la valeur à mettre dans ce registre est $0DFC (pas de décalages
puisque source et destination ont la même taille).
|