Mode 13h
Le mode 13h (ou VGA) est le mode graphique le plus adapté pour apprendre la programmation graphique sous Dos. Le mode 13h supporte une résolution de 320*200 pixels avec 256 couleurs. Chaque pixel est stocké dans un octet dont la valeur donne la couleur du point, l'écran est donc stocké dans un bloc de mémoire de 64 Ko (320*200 = 64 000). Le début de la mémoire vidéo se trouve à l'adresse 0A000 :0000h.

Initialiser le mode 13h

Pour passer en mode 13h, c'est très simple il suffit d'exécuter l'interruption 10 avec les paramètres ah = 00h et al = 13h.

void Mode13h()
{
  asm
  {
    mov ah, 00h
    mov al, 13h
    int 10h
  }
}


Afficher un pixel

L'affichage d'un pixel est assez simple, il faut d'abord convertir les coordonnées du pixel en 2 dimensions (x,y) en une adresse dans la mémoire vidéo (tableau à 1 seule dimension). Ensuite on modifie la valeur de l'octet correspondant à cette adresse selon la couleur souhaitée.

Le calcul se fait de la façon suivante :

position = 320 * y + x

Note : Le point 0,0 se trouve en haut à gauche.

Exemple :

Le point x = 100 et y = 20 : 320 * 20 + 100 = 6500, ce point est le 6 500e octet depuis le début de la mémoire vidéo.

Voici une fonction en C qui affiche un pixel a l'écran :

void putpixel( int x , int y , char color )
{
  asm
  {
    mov ax,0a000h      /* On se place au début de la mémoire vidéo */
    mov es,ax
    mov ax,320      /* On commence le calcul de la position */
    mul y
    add ax,x
    mov di,ax      /* On place le resultat dans le registre d'offset DI */
    mov al,byte ptr color
    mov es:[di],al      /* On donne la couleur voulue au pixel */
  }
}


Modifier la palette de couleur

On peut modifier la palette de couleur grâce à la fonction assembleur out qui utilise les registres DX et AL comme paramètres. Les valeurs des couleurs rouge, vert et bleu doivent être compris entre 0 et 63, le numéro de couleur doit être compris entre 0 et 255.

Voici une fonction en C pour modifier la palette :

void change_couleur( char Rouge , char Vert , char Bleu , char Numero )
{
  asm
  {
    mov DX, 3C8h
    mov AL, Numero
    out DX, AL
    mov DX, 3C9h
    mov AL, Rouge
    out DX, AL
    mov AL, Vert
    out DX, AL
    mov AL, Bleu
    out DX, AL
  }
}


Un petit programme d'exemple

Un exemple qui utilise les 3 fonctions vues au-dessus. Il commence par activer le mode 13h puis affiche un point de couleur 1 (bleu dans la palette par défaut) et change la couleur du pixel en changeant la palette.

#include <stdio.h>

main()
{
  void Mode13h() ;
  void Mode_Text() ;
  void putpixel( int x , int y , char color ) ;
  void change_couleur( char Rouge , char Vert , char Bleu , char Numero ) ;

  Mode13h() ;
  putpixel( 150 , 100 , 1 ) ;
  getch() ;
  change_couleur( 50 , 50 , 50 , 1 ) ;
  getch() ;
  Mode_Text() ;
}

void Mode13h()
{
  asm
  {
    mov ah, 00h
    mov al, 13h
    int 10h
  }
}

void Mode_Text()
{
  asm
  {
    mov ah, 00h
    mov al, 03h
    int 10h
  }
}

void putpixel( int x , int y , char color )
{
  asm
  {
    mov ax,0a000h /* On se place au début de la mémoire vidéo */
    mov es,ax
    mov ax,320 /* On commence le calcul de la position */
    mul y
    add ax,x
    mov di,ax /* On place le resultat dans le registre d'offset DI */
    mov al,byte ptr color
    mov es:[di],al /* On donne la couleur voulue au pixel */
  }
}

void change_couleur( char Rouge , char Vert , char Bleu , char Numero )
{
  asm
  {
    mov DX, 3C8h
    mov AL, Numero
    out DX, AL
    mov DX, 3C9h
    mov AL, Rouge
    out DX, AL
    mov AL, Vert
    out DX, AL
    mov AL, Bleu
    out DX, AL
  }
}


Voila pour la base du mode 13h, maintenant place aux fonctions graphiques (afficher une ligne, un texte, etc).


Tutoriaux - Mode 13h - Photographies, projects informatiques et tutoriaux de programmation.
Chandelier Japonais - Annonce immobilière maison - Sellette occasion - Logiciel de rendez-vous - Velo route occasion - Chat sans inscription - Masque - Pic petrolier