La Carte VGA Et Sa Programmation

 
III- Les rotations de palettes pour de plus belles couleurs
 
 
Description des couleurs
 
Nous venons de voir que notre mode 13h disposai de 256 couleurs mais à quoi correspond la couleur d'indice 128 ? En fait la carte VGA est capable d'afficher 262 144 couleurs, seulement si chaque point devait directement avoir une valeur de 0 à 262 143 , la mémoire vidéo devrai être largement plus grande. La solution trouvée est un système d'indirection. La carte ne peut en fait afficher que 256 couleurs à la fois parmi les 262 144 possibles. La carte VGA contient une palette de 256 éléments et chacun d'entre eux contient 3 valeurs d'1 octet.  Ces 3 octets vont de 0 à 63 et représentent  les composantes Rouge Vert Bleu.

Exemple: Si un point à la couleur 175, la carte va chercher dans la palette les trois valeurs du 175ième élément. Admettons qu'il y trouve les valeurs 0,63,0, il affichera alors un point de couleur verte.
 
 

Comment changer les valeurs de palette
 
Nous avons besoin de 4 ports d'E/S pour modifier une entrée de palette.
3C6h: Le registre de masque de palette. S'il vaut 00h, vous aurez le registre 0 quelque soit celui demandé, donc nous le mettrons à FFh.
3C7h: Le registre de lecture de palette pour sélectionner l'entrée que vous voulez lire.
3C8h: Le registre d'écriture de palette pour sélectionner l'entrée dans laquelle vous voulez écrire.
3C9h: Le port de donnée de palette ou vous lirez/écrirez les composantes Rouges, Vert, Bleu.
 
Attention, Le port de donnée ne peut transmettre qu'un octet ou couleur à la fois. Les données sont regroupées par triplet RVB. Si vous lisez se port 3 fois de suite vous obtiendrez 3 octets différents. Ce sont les composantes Rouge Vert Bleu.Voici une procédure permettant de remplacer la palette originale par la votre.
 
 
public SetPalette
 ;In        DS Adresse de segment de votre palette 
 ;            DI Adresse d'offset de votre palette 
 SetPalette: 
pusha 
mov dx,03c6h 
mov al,0FFh 
out dx,al 
xor cx,cx 
Pb0:
push di 
mov dx,03c8h 
mov al,cl 
out dx,al 
mov bx,cx 
shl bx,1 
add bx,cx 
add di,bx 

mov al,ds:[di] 
mov dx,3c9h 
out dx,al 
mov al,ds:[di+1] 
mov dx,3c9h 
out dx,al 
mov al,ds:[di+2] 
mov dx,3c9h 
out dx,al 
pop di 

inc cx 
cmp cx,255 
jne SPb0

 EndSetPalette: 
popa 
ret
 
Programme d'exemple:
 
Le programme d'exemple ChpPal.exe vous montre les couleurs originales puis un changement de palette pour obtenir un dégradé complet du vert. En partant du noir (0,0,0), la méthode employée est d'augmenter uniquement le vert jusque 63 tout en laissant les autres à 0 (0,63,0), puis on augmente les deux autres composantes simultanement pour obtenir du blanc (63,63,63)