CONCEPT DE BASE SUR LA PALETTE EN VGA MODE 0X13
FIXER UNE COULEUR
FIXER LES COULEURS DE 0 A 95
FIXER LES COULEURS DE 96 A 255
FIXER LES 256 COULEURS DE LA PALETTE


CONCEPT DE BASE SUR LA PALETTE EN VGA MODE 0X13:

Dans ce mode, il existe deux registres pour modifier les valeurs (r, v ,b) de chaque index de la palette
Le registre
0x3c8 qui indique quel index de couleur modifié.
Le registre
0x3c9 qui va prendre en suivant les trois composantes rouge, vert et bleu (valeurs de 0 à 63).

Si vous observez les fonctions suivantes, vous remarquerez qu'il y a juste à spécifier l'index de couleur puis de charger à suivre tous les composantes voulues. C'est une particularité du registre 0x3c8 qui s'auto-incrémente dés que les trois composantes sont données. Il en est de même pour le registre 0x3c9 qui en fait va incrémenté le registre de couleur (0x3c8) quand la composante bleue sera fixée.

Chacune des couleurs, soit le rouge, le vert et le bleu sont encodées sur 1 octet correspondant à une valeur d'intensité variant de 0 à 63. La valeur 0 étant la plus sombre jusqu'à 63 qui est la plus claire. (Bien qu'un octet puisse prendre une valeur de 0 à 255, ce mode code ses intensités de 0 à 63, ceci vient de la conception de ce mode qui est assez ancien).
Si l'index de couleur 0 contient les valeurs rouge, vert, bleu 0,0,0 alors on se retrouve avec du noir et avec les valeurs 63,63,63 avec du blanc. C'est l'index de registre couleur qui est placé dans la mémoire vidéo et non pas les composantes (réf::
Constitution de la mémoire vidéo).

La modification des valeurs des composantes modifient directement les couleurs à l'écran. C'est pour cette raison que je vous donne deux autres fonctions qui permettent de modifier les registres de 0 à 95 ( Fixer les couleurs de 0 à 95) et les registres de 96 à 255 ( Fixer les couleurs de 96 à 255).
J'utilise aussi ces fonctions dans Totalwar de façon à ne prendre que les couleurs d'une image de décor. J'utilise les couleurs 0 à 95 pour les sprites et celles de 96 à 255 pour les décors, exception faite de l'index 0 qui est considéré comme transparent et l'index 254 qui est un noir non transparent.


FIXER UNE COULEUR:

void fixe_couleur(unsigned char c,unsigned char r,unsigned char v,unsigned char b)
{
outportb(0x3c8,c);
outportb(0x3c9,r);
outportb(0x3c9,v);
outportb(0x3c9,b);
}

C pour l'index de couleur (0 à 255).
R pour la composante rouge (0 à 63).
V pour la composante verte (0 à 63).
B pour la composante bleue (0 à 63).


FIXER LES COULEURS DE 0 A 95:

void fixe_palette_sprite(unsigned char *pal)
{
outportb(0x3c8,0);
for (unsigned char i=0;i<96;i++)
{
outportb(0x3c9,*(pal+(i*3)));
outportb(0x3c9,*(pal+(i*3)+1));
outportb(0x3c9,*(pal+(i*3)+2));
};
}

PAL : pointeur sur un buffer contenant 768 octets soit 256*3 composantes (ex: pal[768]).
Ref:
Chargement PCX.


FIXER LES COULEURS DE 96 A 255:

void fixe_palette_decor(unsigned char *pal)
{
outportb(0x3c8,96);
for (unsigned char i=96;i<255;i++)
{
outportb(0x3c9,*(pal+(i*3)));
outportb(0x3c9,*(pal+(i*3)+1));
outportb(0x3c9,*(pal+(i*3)+2));
};
}

PAL : pointeur sur un buffer contenant 768 octets soit 256*3 composantes (ex: pal[768]).
Ref:
Chargement PCX.


FIXER LES 256 COULEURS DE LA PALETTE

void fixe_palette_pcx(unsigned char *pal)
{
outportb(0x3c8,0);
for (unsigned short i=0;i<256;i++)
{
outportb(0x3c9,*(pal+(i*3)));
outportb(0x3c9,*(pal+(i*3)+1));
outportb(0x3c9,*(pal+(i*3)+2));
};
}

PAL : pointeur sur un buffer contenant 768 octets soit 256*3 composantes (ex: pal[768]).
Ref:
Chargement PCX.