La Carte VGA Et Sa Programmation

 
II- La base graphique du mode 13h ou 320x200x256
 
 
Pourquoi ce mode ?
 
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