INTRODUCTION

 

La programmation graphique en assembleur ouvre un vaste champ de possibilités pour créer des effets visuels directement en manipulant la mémoire vidéo.

 

Dans ce chapitre, nous allons :

  • Comprendre la mémoire vidéo (VRAM)

  • Découvrir les modes vidéos du BIOS

  • Apprendre à afficher des pixels et à effacer l’écran

 

 Nous nous limiterons au mode graphique 320x200x256 couleurs (mode 13h) pour rester simples et pédagogiques. Les autres modes (SVGA, Mode-X, TrueColor, etc.) nécessitent des techniques plus avancées.

 

La mémoire vidéo

 

La mémoire vidéo, ou VRAM (Video RAM), est un bloc réservé à l’affichage à l’écran :

  • Taille : 64 Ko en mode réel

  • Adresse de base : 0A000h:0000

Pour utiliser la VRAM, il faut initialiser le mode vidéo via l’interruption BIOS INT 10h.

 

Le mode 13h

 

  • Résolution : 320 x 200 pixels

  • Couleurs : 256

  • Accès simple : chaque pixel correspond à 1 byte (index de couleur)

 

Calcul de l’offset d’un pixel

 

En assembleur, la VRAM est linéaire. L’adresse d’un pixel (X,Y) est donnée par :

offset=(Y∗320)+X\text{offset} = (Y * 320) + X

 

Exemple : pixel en (12,79)

 

offset=(79∗320)+12=25292\text{offset} = (79 * 320) + 12 = 25292

 

Exemple : afficher un pixel jaune

 
MOV AX, 013h ; mode 13h : 320x200x256 couleurs
INT 10h ; interruption vidéo
MOV AX, 0A000h ; segment de la VRAM
MOV ES, AX ; transférer dans ES
MOV AL, 14 ; couleur jaune (index 14)
MOV ES:[25292], AL ; placer le pixel à l’offset calculé

Attendre l’appui d’une touche

 

Pour ne pas revenir immédiatement au mode texte :

 

 
XOR AX, AX ; mettre AX à 0
INT 16h ; attendre appui d’une touche
MOV AX, 03h ; retour au mode texte 80x25
INT 10h
RET
  • XOR AX, AX : plus court que MOV AX,0

  • INT 16h : interruption clavier pour pause

  • INT 10h avec AX=03h : réinitialise le mode texte

 

Effacer l’écran

 

Méthode avec MOV

 

Pour effacer 64000 bytes (320×200 pixels), on peut utiliser une boucle :

 

 
MOV AX, 013h
INT 10h
MOV AX, 0A000h
MOV ES, AX
XOR DI, DI ; premier pixel
MOV AX, 0 ; couleur noire

Debut:
MOV ES:[DI], AX ; écrire le word (2 bytes) dans la VRAM
ADD DI, 2 ; passer au word suivant
CMP DI, 64000
JNAE Debut ; répéter tant que DI < 64000

MOV AX, 03h ; retour mode texte
INT 10h
RET

  • ADD DI,2 : on écrit 2 bytes à la fois pour accélérer

  • La boucle parcourt tous les pixels de l’écran

 

Méthode optimisée avec STOSB et REP

 

Pour gagner en taille et en vitesse :

 

 
MOV AX, 013h
INT 10h
PUSH 0A000h
POP ES ; segment VRAM
XOR DI, DI ; premier pixel
XOR AX, AX ; valeur noire

MOV CX, 32000 ; 32000 words = 64000 bytes
REP STOSB ; remplir ES:DI avec AL (0)

MOV AL, 03h
INT 10h ; retour au mode texte
RET

  • STOSB combiné à REP permet d’éviter les instructions MOV/ADD répétitives

  • Cette technique réduit considérablement la taille du code

  • Utile pour optimisation mémoire ou pour intro 4k

 

Points clés

 

  1. La VRAM est linéaire, chaque pixel occupe 1 byte dans le mode 13h

  2. La position d’un pixel se calcule avec (Y*320)+X

  3. MOV ES:[offset], AL permet de dessiner un pixel

  4. STOSB/REP accélère le remplissage de blocs mémoire (ex. effacer l’écran)

  5. Toujours restaurer le mode texte avant de quitter le programme