MicroLogo.jpg (3754 octets)
Revenir à la page d'acceuil
---MA LIBRAIRIE GRAPHIQUE, SUPPORT DE VOTRE COURS---

Maintenant que vous savez a peu près comment programmer en assembleur, nous allons consolider et reprendre ces connaissances en explicant la bibliothèque graphique GRAPHIC.ASM...

Cette bibliothèque graphique est très primaire mais suffit déjà a réaliser des effet assez spectaculaire et à expliquer des techniques de base comme le Buffering, l'AntiAliasing et la génération de bruit, etc...

Qu'est ce qu'une bibliothèque en assembleur? C'est un fichier .ASM tout bête qui ne contient que des fonctions assembleurs. Pour inclure celle-ci dans votre programme principale en marquant:    INCLUDE     GRAPHIC.ASM          (C'est tout?? Eh oui!)
Insérez cette ligne à la fin de votre segment de code juste après le classique

    MOV    AH,04CH
    INT       21h

qui est le retour au DOS. Logiquement, on peut mettre ces lignes n'importe où, mais comme ca , vous savez ou sont les lignes...

L'assembleur (ici Tasm) générera un fichier unique (toutes les fonctions réunit dans votre code de donnée)

---LES MODES VIDEOS---

Tous les PC munis de carte graphiques VGA contiennent 15 modes graphiques que voici:
 
 

En jaune les modes vidéos les plus important: le mode 03h est le mode texte utilisé console DOS, le mode 013h est celui que nos utiliserons la plupart du temps en mode graphique car c'est le seul a exploiter 256 couleurs .Pour 256 valeurs, on utilise.... UN OCTET! et donc une page vidéo VGA est égale à une capacitée memoire de 320*200=64000 octet soit moins d'un segment!

---INITIALISER UN MODE VIDEO---

Pour initialiser un mode graphique, on utilise l'interuption 10h (10h:Interruptions graphiques) et la fonctions 00h dont voici les deux paramètres:
    AH=00h                             :Numéro de la fonction initialiser un mode graphique
    AL=N° du mode vidéo      :Ben numéro du mode vidéo pour les polios

Et enfin:     INT 10h

Fonctions SetVgaMode et SetTextMode dans ma librairies.

---AFFICHER UN POINT SUR L'ECRAN---

L'ecran n'est en fait qu'une représentation de la mémoire vidéo: En écrivant dans la mémoire vidéo, vous affichez un point sur l'écran. Comment écrire un point dans la mémoire vidéo? Comme exemple de se problème, nous allons nous éffocer d'afficher un point vert sur la 10 ème colonne à la 20 ème rangée:

Ecran.jpg (2583 octets)

Voyez que le point (0,0) est en haut à gauche et P(320,200) en bas à droite
Voyez du même coup la compression de merde du format jpg!

Vous voyez la position du point? Ok. Vous vous souvenez qu'il faut 320*200=64000 octet pour coder une image en mémoire vidéo? Cette mémoire vidéo commence à partir du segment 0A000:0000h. En commence donc par initialiser le REGISTRE ES pour qu'il pointe sur ce segment de la mémoire vidéo:

    MOV    AX,09000h    ;On ne rempli pas directement un registre d'adresse avec une
                        ;constante, on passe par un registre général
    MOV    ES,AX        ;A y'est, le segment est initialisé

Dans la mémoire vidéo, il est rangé sequentiellement les 320 premiers point de la 1ère rangé, puis les 320 point de la 2nde rangé puis ceux de la 3 ème etc... Le point P(10,20) est donc le 320*y+x soit 320*20+10 soit le 6410 ème point représenté dans la memoire vidéo.D'ou:

    MOV    DI,6410

Maintenant, ES:[DI] pointe sur le point que l'on veut allumer pour l'allumer:

    MOV    AL,2                    ;Couleur verte dans la palette VGA (entre 256 couleur)
    MOV    Byte Ptr ES:[DI],AL     ;logiquement, le point est allumé en vert.

VOIR LA FONCTION SETPIXEL de la bibliothèque GRAPHIC.ASM

Cette fonction accepte cinq paramètres: Le segment du buffer vidéo (Ouh lala! C'est quoi ce 'buffer vidéo???' Ne vous affolez pas, cette technique de Buffering est expliqué juste à la suite), l'offset du début de ce buffer vidéo, la couleur du pixel à afficher, l'ordonné et l'abcisse du point à afficher.

La multiplication par 320 est faites d'une manière assez compliqué qui pourtant accélère le processus: MUL utilise 11 cycle, celle ci en utilise que 4:

A=320A=256A+64A donc:

SHL    AX,6          ;Multiplie par 64 (décale de 6 bits ce qui revient au même)             1 Cycle
MOV     DI,AX         ;Sauvegarde le résultat                                                 1 Cycle
SHL    AX,2          ;Remultiplie par 4 (4*64=256)et additionne le seçond résultat           1 Cycle
ADD    DI,AX         ;Réaditionne le seçond résultat, le tour est joué                       1 Cycle

---LE BUFFERING---

Le buffering est une technique d'optimisation très simple: lors de l'affichage d'une image à l'écran, la plupart du temps d'éxécution est perdu dans les accès à la memoire vidéo qui est beaucoup plus lente que la mémoire normale. Il vaut donc mieux travailler avec une image en mémoire centrale et, lorsque celle ci est terminé la transférer d'un seul coup en mémoire vidéo.Dans n'importe quel cas, cette technique sera plus rapide car, lors de la copie Buffer=>Ecran, la fonction copie 4 octet en un seul coup a la place de un par un. Utilisez donc le buffering tout le temps. Avec, le buffering, il vous faut utiliser plusieur segmentde données: pour cela, éffacez le ASSUME DS:Data16 que vous avez mis au début de votre code et rajoutez un segment rien que pour le buffer vidéo dans lequel vousq déclarerez ce buffer:

    BufferVGA    DB      64000     DUP    (?)

Et voila! Mais cependant, surveillez maintenant que vos registre de segement pointe sur les nbon segment de donné car c'est une nouvelle source de bug: Le assume DS:data16 ne le fera plus pour vous!

Autre chose: La fonction BufferEcran transfère d'un seul coup le buffer vidéo sur leque pointe ES:DI si je me souviens bien( Vérifiez, c'est en commentaire) dans la mémoire vidéo.

---EFFACER L'ECRAN---

Je vous parle du buffering sans vous raconter comment effacer l'écran !(Oooooohhh!) Quel scandale... Rien de plus simple:

MOV    AX,09000h       ;Début du segment de mémoire vidéo
MOV    ES,AX

XOR    DI,DI
MOV    EAX,00h         ;Mettez la couleur avec la quelle vous voulez éffacer l'écran dans ce registre
                       ;essayez 002020202h pour éffacer l'écran en vert par exemple
MOV    CX,16000        ;on écrit 16000 fois quattre 0 d'un seul coup: 4*16000=64000
REP    STOSD           ;code 32 bits n'oubliez pas le ".386" tout au début de votre code

Et voilà!
Et voilà!

Mailez moi: Nhj Hubert