Obligement - L'Amiga au maximum

Jeudi 18 octobre 2018 - 19:35  

Translate

En De Nl Nl
Es Pt It Nl


Rubriques

 · Accueil
 · A Propos
 · Articles
 · Galeries
 · Glossaire
 · 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 en d'autres langues


Twitter

Suivez-nous sur Twitter




Liens

 · Sites de téléchargements
 · Associations
 · Pages Personnelles
 · Matériel
 · Réparateurs
 · Revendeurs
 · Presse et médias
 · Programmation
 · Logiciels
 · Jeux
 · Scène démo
 · Divers


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 - Le remplissage de surfaces par le Blitter
(Article écrit par Frédéric Mazué et extrait d'Amiga News Tech - juin 1990)


Aujourd'hui, nous nous intéressons au remplissage de surfaces par le Blitter. Pas de difficultés particulières, c'est même très simple pour une fois.

Petit préliminaire

Avant de rentrer dans le vif du sujet, il est peut-être nécessaire de rappeler le détail des bits du registre BLTCON1 pour ceux qui auraient manqué les épisodes précédents.

BLTCON1, Offset $42, registre 16 bits

Bit numéro Nom Fonction
15 BSH3 Expliqué dans cet article
14 BSH2 Expliqué dans cet article
13 BSH2 Expliqué dans cet article
12 BSH1 Expliqué dans cet article
11-5 --- Ces sept bits ne sont pas utilisés
4 EFE Exclusive Fill Enable
3 IFE Inclusive Fill Enable
2 FCI Fill Carry In
1 DESC Mode décrémentation (descending)
0 LINE Mode tracé de ligne

Le vif du sujet

Nous avons vu précédemment que le Blitter travaille avec des fenêtres "rectangulaires". Sachant cela, il sera possible de remplir n'importe quelle surface, à condition que celle-ci soit inscrite dans la fenêtre qui sera définie dans le registre BLTSIZE.

Comment le Blitter procède-t-il pour remplir une surface ? Comme d'habitude, il travaille ligne par ligne, mais cette fois il commencera par la ligne la plus en bas de la fenêtre et traitera cette ligne de droite à gauche, et ainsi de suite jusqu'à la ligne la plus haute.

Du point de vue de la programmation, cela signifie que, dans ce cas, le Blitter travaille par décrémentation d'adresses. Cela implique que pour un remplissage de surface, il est obligatoire d'activer le bit DESC. De même, les registres BLTxPTH devront pointer sur les derniers mots des zones source et cible.

Voyons maintenant comment le Blitter rempli une ligne. Hypothèse de départ, le bit FCI n'est pas mis. Soit l'exemple de ligne à remplir :

.....1.....1.....1........

Un point correspond à un point écran éteint et un 1 correspond à un point écran allumé et ceci dans une fenêtre de deux mots de large.

Le Blitter examine le point le plus à droite : ce point est éteint, le Blitter passe au point immédiatement à gauche qui lui aussi est éteint et ainsi de suite jusqu'à ce qu'il rencontre le premier point allumé. A ce moment, le Blitter inverse le bit FCI. Dans ce cas précis le Blitter met donc le bit FCI à 1. Le Blitter continue son examen sur la gauche et, à ce moment, de deux choses l'une :
  • Le point examiné est éteint : dans ce cas le Blitter écrit le bit FCI à l'emplacement correspondant au point. Le point s'allume.
  • Le point examiné est allumé : dans ce cas, comme précédemment, le Blitter inverse le bit FCI, puis continue son examen à gauche.
Après travail du Blitter, la ligne de l'exemple devient donc :

.....1111111.....1111111........

Maintenant que vous avez tout compris, il est possible de résumer très simplement : le Blitter examine chaque point de droite à gauche. Chaque point éteint est "rempli" par le bit FCI. A chaque point allumé rencontré le bit FCI est inversé.

L'hypothèse de départ était FCI = 0. Mais il est parfaitement possible d'initialiser ce bit à 1 dès le départ. Observons ce qu'il se passe à partir du même exemple : le premier point est éteint, donc le Blitter y place le bit FCI. Celui-ci étant initialisé à 1, le point s'allume, et ainsi de suite jusqu'à ce que le Blitter rencontre un point allumé. A ce moment le bit FCI sera inversé (et donc dans ce cas annulé) et ainsi de suite. Le résultat sera donc :

111111.....111111..... 111111111

Autrement dit, nous avons colorié l'image en "négatif".

Attention au piège !

Tout ceci c'est bien joli, mais il y a quand même un traquenard. Pour que tout se passe bien, il faut que chaque ligne de l'image à colorier contienne un nombre pair de points allumés. Sinon "........11.....", par exemple, ne sera pas rempli comme ceci : "........11111111" mais comme cela : "1111111111111111". En clair (si j'ose dire) cela s'appelle une grosse tache !

Nous en avons presque fini. Il nous reste à savoir qu'il existe en fait deux modes de remplissage.
  • Le mode IFE, ce qui signifie Inclusive Fill Enable ou mode de remplissage inclusif. Ce mode vous le connaissez déjà car les exemples précédents sous-entendaient qu'il était utilisé. Vous savez tout, n'en parlons plus.
  • Le mode EFE, ce qui signifie Exclusive Fill Enable ou mode de remplissage exclusif. Que se passe-t-il avec ce mode ? Très simple : nous avons vu que lorsque le Blitter rencontre un point allumé, il inverse le bit FCI. Si cette inversion met le bit à 1, rien ne change. Par contre, si l'inversion met le bit à 0, alors le point responsable de l'inversion sera éteint. Pour être plus clair, le premier exemple sera rempli en mode EFE comme suit : ......111111......111111........ soit deux points de moins qu'en mode IFE.
Et maintenant le programme

Remarquez qu'au label "data" les données de notre image (Cf. articles précédents) ont été modifiées. Presque tous les bits sont nuls et il ne subsiste plus qu'un "squelette" qui sera notre motif à remplir. Comme d'habitude, le programme ouvre les bibliothèques nécessaires puis un écran Intuition à un bitplane.

Premièrement, le programme copie on ne peut plus simplement le squelette dans le bitplane de l'écran puis il en effectue le remplissage.

Deuxièmement, on ruse : le squelette est installé en mode décrémentation et en même temps on active un mode de remplissage dans BLTCON1 (dans ce cas le mode IFE). Oh miracle, notre motif est rempli en même temps qu'il est installé et le Blitter a travaillé aussi vite que pour une copie de données simple. Décidément ce Blitter est génial !

Troisièmement, on reprend la ruse du deuxièmement mais avec le mode EFE et on constate comme prévu que le Blitter a supprimé une colonne de points à gauche du motif et une colonne de points à droite dans le trou du motif.

Quatrièmement, toujours avec ruse, en mode IFE, mais au départ le bit FCI est initialisé à 1 : on a un remplissage en négatif.

Enfin, après un clic de la souris, le programme ferme écran et bibliothèques et rend la main.

Tout est dit à propos des remplissages de surfaces et je vous donne rendez-vous le mois prochain pour un gros morceau, le tracé de droites.

Remplissage de surface avec le Blitter

assembleur

Mise en place du "squelette"

assembleur
assembleur

Remplissage du "squelette"

assembleur

Mise en place du "squelette" et remplissage en même temps

assembleur

Mise en place en remplissage exclusif

assembleur
assembleur

Mise en place et remplissage en "négatif"

assembleur
assembleur


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