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