La mémoire vidéo en mode 320x200x256c est constituée de 320
octets par 200 lignes soit un total de 320*200 octets ou 64000
octets (~64Ko). La couleur est codée sur un octet qui correspond
à un point. Cet octet représente un index de couleur (0-255)
qui stipule le registre où sont codées les informations de
couleurs. L'adresse en mode réel de cet écran se trouve en
0xA000:0000.
Comme nous ne connaîtrons pas l'adresse réelle de l'écran et
que nous utilisons des zones de mémoire pour cela, le terme
offset désigne le décalage existant entre l'adresse de début (ex: 0xA000:0000 ou un pointeur) et l'endroit de la mémoire où
l'on désire accéder.
En exemple, si ÉCRAN est un pointeur et que l'on veuille modifier
le 3ème élément, il suffit d'effectuer la commande:
// unsigned char *ÉCRAN;
*(ECRAN+3)=<valeur>;
Accès aux points de l'écran:
Pour accéder à un point quelconque de l'écran il suffit d'appliquer la formule:
(y*320)+x
Pour exemple:
L'adresse du point 0,0 se trouve en
(0*320)+0=0 donc offset 0x0000 soit 0xa000:0000
L'adresse du point 4,4 se trouve en (4*320)+4=1284 donc offset
0x0504 soit 0xa000:0504
L'adresse du point 319,199 se trouve en (199*320)+319=63999 donc
offset 0xF9FF soit 0xa000:f9ff
0xFA00 correspondant bien à 64000, le dernier point de l'écran
se trouve bien en offset 0xF9FF (0000 à F9FF)...
Modification d'un point de l'écran en assembleur:
Pour modifier un point à l'écran il suffit de charger l'offset (adresse) de ce dernier et d'y placer le numéro d'index couleur qui est codé sur un octet (0-255), ce qui équivaut bien à 256 couleurs.
movw $0xa000,%%ax
movw %%ax,%%ds
movw $0504,%%si
movb $10,(%%si)
Cet exemple concerne le mode réel et ne
peut être utilisé sous DJGPP. On charge tout d'abord le segment
0xa000 dans AX puis dans DS (impossible de charger directement
dans le registre DS), puis on charge dans SI l'offset du point
que l'on veut changer (x=4,y=4), et ensuite on place l'index de
couleur que l'on désire (10).
La différence entre cette routine en mode réel et la même en
mode protégé se situe au niveau de l'offset et du segment. En
fait ce n'est plus un segment mais un sélecteur. Il suffit de
convertir le segment en sélecteur (voir Accès à la mémoire vidéo
320x200x256c.). Dans
tous les prochains exemples, nous ne parlerons plus de 0xA000
pour la mémoire écran mais de video (type short) qui
indiquera le sélecteur pour y accéder.
Le même exemple en DJGPP donne:
pushw %%ds
movw video,%%ax
movw %%ax,%%ds
movl $0x504,%%esi
movb $10,(%%esi)
popw %%ds
Les différences sont: