On a vu dans
les paragraphes précédents comment calculer l’adresse vidéo,
de base d’un point. On a vu aussi comment étaient codés 2
pixels dans un octet. Maintenant nous allons voir comment afficher un pixel.
Avant d’afficher
quoi que ce soit il faut d’abord savoir ce que l’on veut faire … On veut
afficher un point à l’écran avec une couleur bien spécifique.
Le problème c’est que l’on ne peut pas directement mettre la valeur
de la couleur du point dans l’octet associé à ce point ;
vu que deux pixels sont codés dans un octet et que ces pixels sont
entrelacés, si l’on modifie directement l’octet en question l’information
sur la couleur des deux pixels existants sera modifiée et il va
s’afficher n’importe quoi.
Pour afficher correctement un pixel
à l’écran réfléchissons aux différents
problèmes que l’on va rencontrer :
1 - Savoir quels
sont les bits du pixel à modifier en fonction de sa coordonnée.
2 - Lors de l’affichage
d’un pixel, ne pas modifier la couleur du pixel voisin.
3 - Encoder le
numéro de la couleur du pixel à afficher pour contourner
le
problème de l’entrelacement.
1 – En effet, sachant que sont codés
deux pixels dans un octet il faut savoir quel pixel correspond à
telle série de bits ? Pour cela il suffit de regarder si sa coordonnées
X un pair ou impair. Imaginons que X soit égal à 12, en binaire
on a %1100, le bit 0 étant égal à zéro il s’agit
d’un nombre pair. Réciproquement pour codé la valeur 13,
en binaire on a %1101 le bit 0 égal 1 donc le chiffre à codé
est impair. Exemple dans notre cas :
Si X = 0 :
Bit 0 de X = 0
(pair), correspondra donc au premier pixel à afficher
Si X = 1 :
Bit 0 de X = 1
(impair), correspondra donc au second pixel à afficher
2 - Pour ne pas modifier la couleur
du pixel voisin on va utiliser un masque binaire ; ce masque va nous permettre
préserver sa couleur et supprimer celle du pixel à modifier.
Un second masque sera appliqué pour modifier la couleur du nouveau
pixel.
Rappel sur le masque AND (en
binaire):
%1100 AND %1010 = %1000
Et oui le résultat
d’un ET logique entre une valeur source1 et une valeur source2,
ne préserve que les bits égaux à 1:
| A |
B |
AND |
| 1 |
0 |
0 |
| 0 |
1 |
0 |
| 1 |
1 |
1 | Vous verrez rapidement
l’intérêt d’une telle opération ...
3 – Pour contourner le problème
de l’entrelacement des pixels, nous allons passer par une table de correspondance
entre la couleur à afficher et la valeur réelle à
stocker en mémoire. Sachant que les couleurs de nos deux pixels
sont entrelacées, passons d’abord en revu les différentes
valeurs possibles pour les couleurs du 1er pixel.
| Masques
liés au 1er pixel |
| couleur |
valeur
après entrelacement |
| 0 |
%00000000 |
0 |
| 1 |
%00000010 |
2 |
| 2 |
%00001000 |
8 |
| 3 |
%00001010 |
10 |
| 4 |
%00100000 |
32 |
| 5 |
%00100010 |
34 |
| 6 |
%00101000 |
40 |
| 7 |
%00101010 |
42 |
| 8 |
%10000000 |
128 |
| 9 |
%10000010 |
130 |
| 10 |
%10001000 |
136 |
| 11 |
%10001010 |
138 |
| 12 |
%10100000 |
160 |
| 13 |
%10100010 |
162 |
| 14 |
%10101000 |
168 |
| 15 |
%10101010 |
170 | Cette table va nous servir pour trouver
la correspondance de chaque couleur à afficher. En effet, lorsque
l’on voudra afficher un pixel avec la couleur15, on prendra la valeur associée
170 (%10101010) ; cette dernière étant près entrelacée
il nous restera plus qu’à l’afficher.
Avec toutes ces informations regardons
maintenant toutes les étapes pour afficher un pixel :
1 – Calculer l’adresse
du pixel en fonction des coordonnées (X, Y).
2 – Regarder
quel pixel doit être allumé (pair ou impaire).
3 – Récupérer
la valeur de l’octet se trouvant à l’adresse du pixel.
4 – Appliquer
les filtres logiques.
5 – Stockage
de la nouvelle valeur de l’octet à l’adresse du pixel.
Exemple 1 – Codage d’un pixel
pair:
Affichage d’un
pixel aux coordonnées (X = 0, Y = 0) avec la couleur 6. Les couleurs
initiales des deux pixels de l’octet aux coordonnées (X, Y) avant
modification sont 1 pour le premier pixel et 15 pour le second ; ce qui
donnes en binaire, une fois les valeurs entrelacées : %01010111
(87)

1 – L’adresse de l’octet du pixel
aux coordonnées (X = 0, Y = 0) est égal à &C000.
2 – Le pixel est un pixel pair car
X = 0 (bit 0 de X = 0)
3 – La couleur initiale de l’octet
se trouvant à l’adresse &C000 est égal à %01010111
4 – Nous allons maintenant éteindre
le premier pixel en appliquant un filtre logique :
[Couleur calculée] = [Couleur initiale] AND [Masque logique]
= 87 AND 85
= %01010111 AND %01010101
= %01010101
= 85
Ici nous n’avons
préservé que les bits de la couleur du second pixel

Il nous reste plus qu’à coder
la couleur du pixel à afficher (le premier pixel). Pour cela, nous
allons appliquer un OU logique entre la valeur calculée de l’octet
(celle précédemment calculée) et la valeur entrelacée,
associée la couleur du premier pixel.
[Nouvelle valeur de l’octet] = [Valeur modifiée] OR [Table correspondance(6)]
= 85 OR 40
= %01010101 OR %00101000
= %01111101
= 125
Infos : Cet exemple ne
permet d’encoder qu’un pixel pair. Pour les pixels impairs, les valeurs
de la table de correspondance doivent être divisées par 2
(ou décalage d’1 bit vers la droite), un exemple sera traité
après.
5 - Pour terminer, nous allons stocker
la nouvelle valeur de l’octet à l’adresse du pixel …
&C000 = 125
Exemple 2 – Codage d’un
pixel impair:
Affichage d’un
pixel aux coordonnées (X = 1 Y = 0) avec la couleur 6. Comme dans
l’exemple précédent, les couleurs initiales des deux pixels
de l’octet aux coordonnées (X, Y) avant modification sont 1 pour
le premier pixel et 15 pour le second ; ce qui donnes en binaire, une fois
les valeurs entrelacées : %01010111 (87)

1 – L’adresse de l’octet du pixel
aux coordonnées (X = 1, Y = 0) est égal à &C000.
2 – Le pixel est un pixel impair
car X = 1 (bit 0 de X = 1)
3 – La couleur initiale de l’octet
se trouvant à l’adresse &C000 est égal à %01010111
4 – Nous allons maintenant éteindre
le second pixel en appliquant un filtre logique :
[Couleur calculée] = [Couleur initiale] AND [Masque logique]
= 87 AND 170
= %01010111 AND %10101010
= %00000010
= 2
Après l’application
du masque logique, nous n’avons préservé que les bits de
la couleur du premier pixel.

Il nous reste
plus qu’à coder la couleur du pixel à afficher (le second
pixel). Pour cela, nous allons appliquer un OU logique entre la valeur
calculée de l’octet (celle précédemment calculée)
et la valeur entrelacée, associée la couleur du second pixel.
[Nouvelle valeur de l’octet] = [Valeur modifiée] OR [Table correspondance(6) \ 2]
= 2 OR (40 \ 2)
= %00000010 OR %00010100
= %00010110
= 22
5 - Pour terminer, nous allons stocker
la nouvelle valeur de l’octet à l’adresse du pixel …
&C000 = 22
Et voilà
celui-ci est allumé ! Enjoy !!!
|