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: