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 - tracé de droite et remplissage avec le Blitter
(Article écrit par Roméo Rapido et extrait d'Amiga News - novembre 1990)
|
|
Dans notre série "Comprendre le Blitter", aujourd'hui, nous aborderons le tracé de droites avec une pointe
de remplissages. Nous allons heurter à grande vitesse les horribles octants. Conservez votre siège
en position haute. En cas de dépressurisation de la cabine, des vieux numéros de Picsou Magazine
tomberont automatiquement à votre portée. Ne vous énervez pas, restez courtois, attention à la fermeture
automatique des portières. Je n'aurais qu'une parole : Goldorak go !
Le mode "Line" est activé en positionnant le bit 0 de BLTCON1. Dans ce mode, le Blitter peut tracer des droites
de 1024 points de long avec différents motifs et différents modes, dont le mode 1 point par ligne utilisé
pour construire les masques de remplissage.
Une droite peut être assimilée à un vecteur, elle a donc une origine que nous nommerons "x1, y1" et une direction,
déterminée par son dernier point de "x2, y2". La première chose à faire est de déterminer dans quel secteur se
situe le vecteur, dans un disque qui comprend huit secteurs (voir figure suivante), cela permet de profiter des
symétries entre x, -x et y, -y.
A chacun de ces octants est associé une valeur binaire codée
bien sur sûr trois bits. Mais comme cela aurait été trop facile, cette valeur que l'on doit stocker dans
BLTCON1 n'a rien à voir avec le numéro du secteur, en fait voici la table de correspondance octant-code :
En fait, on peut calculer le numéro de l'octant de la manière suivante :
- Si dy = y2 - y1 <0 (bit 2 = 1 et dy = -dy) sinon bit 2 = 0.
- Si dx = x2 - x1 <0 (bit 1 = 1 et dx = -dx) sinon bit 1 = 0.
- Si dy - dx <0 (bit 0 = 1 et ech(dx, dy)) sinon bit 0 = 0.
La combinaison de ces trois bits donne le numéro de l'octant et il ne reste plus qu'à aller chercher la valeur
correspondante dans la table de correspondance. Dans notre exemple
précédent, ceci est fait par l'instruction roxl #1,d5 qui fait rentrer le bit X du CCR dans le registre
D5 après avoir effectué un décalage de 1 bit vers la gauche. Or, justement, le bit X est positionné par les
instructions sub et exg comme il convient d'où l'écriture astucieuse de cette phase. Nous avons donc maintenant
le numéro et la valeur de l'octant et les valeurs de dx et dy. Vous avez noté au passage qu'il faut prendre
la valeur absolue des deltas pour la suite des calculs et que si dy > dx il est nécessaire d'échanger ces
deux valeurs, dx devient donc le grand delta et dy le petit delta.
Maintenant que vous avez compris l'essentiel, voici l'algorithme complet de préparation des registres Blitter
pour le tracé de droites. Pour une droite allant du point (x1, y1) au point (x2, y2) :
- dx = abs(x2 - x1).
- dy = abs(y2 - y1).
- Si (dx < dy ) ech(dx, dy).
En même temps que les opérations précédentes, déduire le numéro de l'octant et sa valeur associée.
Si vous avez été attentifs aux explications précédentes, vous aurez remarqué que le bit 1
de BLTCON1 permet de sélectionner le mode 1 point par ligne. Inutile de préciser que pour
tracer des droites en temps normal, ce bit doit être à 0. En fait, le mode 1 point par ligne
est très utile pour faire des remplissages de surfaces avec le Blitter. L'algorithme de
remplissage câblé dans Agnus procède de la façon suivante :
Tout d'abord, il faut signaler que en mode remplissage, le Blitter travaille à l'envers.
Au lieu de passer au mot suivant par incrémentation d'adresse (adr = adr + 2 (on travaille sur
des mots de 16 bits donc 2 octets)), il travaille à reculons en passant à l'adresse précédente
(adr = adr - 2).
- 1. départ du dernier mot en bas à gauche du plan de bits.
- 2. scrutage de la ligne :
"si je trouve un point, je remplie jusqu'au prochain point"
"si je ne trouve pas le deuxième point je vais jusqu'au bord"
- 3. si je ne suis pas rendu au premier mot du plan de bits, passer à la ligne précédente et aller en 2.
De cet algorithme simplifié, il faut retenir deux choses :
- Pour un remplissage simple, il ne doit y avoir que deux points par lignes qui délimitent le
contour à remplir.
- Pour des remplissages complexes, il doit toujours y avoir un nombre pair de points ou sinon
il risque d'y avoir des bavures depuis la forme à remplir jusqu'au bord gauche l'écran.
Pour faire un remplissage d'une surface dans un plan de bits, il est donc nécessaire d'utiliser un
masque qui contient le "contour" de la surface à remplir comme source et le plan de bits ou doit
être effectué le remplissage comme cible. Dans le cas où la cible est composée de plusieurs plans,
il vaut mieux effectuer le remplissage directement dans le masque puis recopier ce masque dans
les différents plans du plan de bits. A noter que suivant la couleur désirée, il peut être nécessaire
de "mettre" (set) ou de "nettoyer" (clear) les bits correspondants à la zone à remplir dans
les différents plans de bits, mais rassurez-vous, Agnus à plus d'un tour dans son sac et dès
le mois prochain vous saurez tout sur la copie de plans de bits.
|