Le mode 13h est choisi ici car à mon sens, c'est le mode graphique
le plus sympatique pour commencer. Chaque point peut prendre 256 couleurs.
C'est peu mais suffisant avec un modification des couleurs ou 'rotation
de palette'. Or 256=28 ce qui signifie qu'un point nécessite
juste un seul octet et par conséquent: Une page écran ne
prendra que 320x200=64000 Octets, moins de 64Ko (1Ko=1024 octets) taille
d'un segment mémoire. La page utilisée dans ce mode s'étend
en mémoire, de l'adresse A000:0000 à l'adresse A000:F9FF
Les interruptions BIOS contre les accès mémoire
Pour sa part, le BIOS fourni quelques fonctions graphiques, accessibles
par interruption. Cependant, une interruption devient rapidement un processus
trop lent pour de fréquents rafraichissement d'écran. En
effet, l'affichage d'une seule page nécessiterait 64000 appels d'interruption.
La solution se trouve en fait dans un adressage mémoire direct.
Cettte formulation un peu barbare, signifie que nous allons directement
changer la couleur des points dans la mémoire. Puisque nous savons
que la couleur prend un octet, et que chaque octet et placé l'un
aprés l'autre dans la zone mémoire décrite précédement,
il suffit de changer la valeur d'un octet pour que la couleur du point
correspondant change. Exemple, si nous voulons un écran entierement
bleu (code couleur 1), il suffit de mettre les 64000 premiers octets du
segment A000h à 1. Rappeller vous qu'un accès mémoire
se compte en milliardièmes de seconde ce qui explique la vitesse
obtenue par rapport aux processus des 64000 interruptions.
Affichage d'un point par adressage directe
Mettant en pratique ces quelques renseignements voici une fonction
capable d'afficher un point en mode 13h par adressage directe.
public PutPixel ;In BL couleur
;
CX colonne
;
DX ligne
PutPixel:
push es
push di
push ax
push dx
mov ax,0a000h
mov es,ax
mov ax,320
xor dx,dx
mul dx
add ax,cx
mov di,ax
mov es:[di],bl
pop dx
pop ax
pop di
pop es
ret