Obligement - L'Amiga au maximum

Lundi 25 septembre 2017 - 17:19  

Translate

En De Nl Nl
Es Pt It Nl


Rubriques

 · Accueil
 · A Propos
 · Articles
 · Galeries
 · Glossaire
 · Hit Parade
 · 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 in other languages


Twitter

Suivez-nous sur Twitter




Liens

 · Sites de téléchargements
 · Associations
 · Pages Personnelles
 · Moteurs de recherche
 · Pages de liens
 · Constructeurs matériels
 · Matériel
 · Autres sites de matériel
 · Réparateurs
 · Revendeurs
 · Presse et médias
 · Programmation
 · Développeurs logiciels
 · Logiciels
 · Développeurs de jeux
 · Jeux
 · Autres sites de jeux
 · Scène démo
 · Divers
 · Informatique générale


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 : 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 bitplane 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 bitplanes.

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é :

Assembleur

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).


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