Revenir au sommaire Tutoriaux

Attention il s'agit d'un source qu'il faudra aménager un peu pour Delphi. Si vous avez réalisé la transcription en Delphi merci de m'envoyer l'exemple ici: le Webmaster

Comprendre l'effet COPPER (ou Raster) Par :
Plouf
(plouf@win.be ou theplouf@yahoo.com)
: 2Ko  
     
Dans la série des grandes découvertes et des grandes victoires de l'esprit humain sur la bête machine qui n'y comprend rien, et surtout celles qu'on attendait tous avec une impatience pourtant très bien camouflée, voici :
L'effet raster (wééé) (on m'a dit qu'on disait aussi "coppers" ha bon)
J'ai comme l'impression que le "c'est quoi ça" va être plus long que l'explication en elle-même, je ne sais pas, une idée comme ça :)
.
1) C'est quoi ça?
Bon, alors avant toutes choses, vous êtes priés de lancer le chtit programme qui va avec, comme ça on part sur de bonnes bases. Vous êtes sencés être horrifiés, en vous demandant "mais comment qu'il fait?", et toutes ces sortes de choses qui me permettent de vous maintenir en haleine le plus longtemps possible.
Bon, avant toutes choses, n'allez surtout pas imaginer que j'ai trouvé ça tout seul. Enfin bon, j'avais trouvé tout seul le principe mais je n'avais jamais réussi à le mettre en application. C'est une démo, et surtout le code source d'une démo qui m'a permi d'y voir clair.
Bon, assez de blabla :
L'effet raster c'est l'art de changer la palette de couleur de l'écran à chaque ligne. Donc au lieu d'avoir 256 couleurs par image, vous en avez tout autant... par ligne (là vous rêvez un peu, mais nous y venons).
L'utilité peut parraître obscure, et vous avez parfaitement raison car cela ne sert strictement à rien, mais puisque vous êtes là, autant passer le temps, et c'est partit pour les zexplications techniques :
.
2) Notre ami l'écran
Une fois n'est pas coutume, nous allons plus parler de l'écran que de la carte graphique.
L'écran comment ça marche : c'est très simple (j'espère que je ne vais pas tomber sur un spécialiste de chez NEC parce que je vais simplifier un tantinet) :
Une belle plaque sensible aux éléctrons est placée devant vous : c'est l'écran. Derrière cette plaque se trouve un cannon à éléctron, qui envoie ces derniers sur l'écran, lequel proteste en affichant un point lumineux à l'endroit précis de l'impact (Ca marche très bien pour le noir et blanc, pour la couleur je vous laisse réfléchir un peu, ça ne vous fera pas de tort).
Ce cannon à éléctron doit pouvoir changer de point de visée, histoire de balayer tout l'écran (Le canon en lui-même ne bouge pas, bien sur, mais j'ai dit que je simplifiais). Il part donc du point situé en haut à gauche, et descend jusque en bas à droite.
Le balayage se passe horizontalement : il part donc en haut à gauche, se déplace vers la droite et affiche progressivement la première ligne. Une fois celle-ci dessinée, il retourne à gauche et descend d'une ligne. Malgré ce qu'on aurait pu croire, il ne reste pas à droite pour dessiner la seconde ligne de droite à gauche. Cela fait qu'il y a un petit délai (plutot petit, waip) entre la fin d'une ligne et le début d'une autre, délai qui est exploitable.
Une fois à la fin de l'écran, il doit recommencer à zéro et "remonter" tout l'écran, ce qui nous laisse un autre délai, plus important cette fois.
Bien sur, au moment de tracer un pixel, pour savoir ce qu'il doit envoyer, il va demander à la carte graphique, laquelle lui dit "ha ben là, c'est un pixel rouge", et pour faire cela, la carte devra regarder dans la palette des couleurs.
Evidement, si tout de suite après, cette palette des couleurs se trouve changée, ce pixel restera rouge jusqu'au prochain passage du canon à cet endroit... Moi ça me donne des idées, pas vous?
.
3) Tiens c'est gag ça :
Pas vrai? Donc si on était capable de changer la palette des couleurs à chaque pixel, on pourrait afficher une image 32bit même dans une configuration graphique monochrome! Evidement, il est impossible de changer la palette des couleurs aussi rapidement (et impossible de rester syncronisé avec l'écran).
Alors on se propose de ne faire l'opération qu'à la fin de chaque ligne, ce qui est déjà moins lourd, surtout qu'il y a moyen de savoir quand le canon se trouve effectivement à la fin d'une ligne.
Il faudra donc attendre que le canon se trouve à la fin d'une ligne, changer la palette des couleurs pendant son retour à gauche, et bingo. Bon, je vous préviens tout de suite, la carte graphique n'est pas assez rapide que pour changer les 256 couleurs du mode 13h pendant un retour de balayage horizontal. Même les 16couleurs du mode texte sont trop pour elle. Mais une, deux, voir trois ou quatre, c'est faisable...
.
4) Bon et en pratique?
Il existe un moyen de savoir si le cannon se trouve à la fin de son balayage vertical et vous le connaissez peut-être déjà : il suffit d'attendre que le bit 3 de l'octet lu sur le port 0x3da soit non nul. En fait pour être sur de ne pas aller trop vite, on attend justement qu'il soit nul (on attend que ça dessine), et puis on attend qu'il soit non nul (c'est fini).
Ce que vous ignorez peut-être, c'est que si on fait exactement la même opération, mais avec le bit 1, on ne se synchronise pas avec le retour vertical, mais bien avec le retour horizontal...
Il faudra donc :
1) Attendre la fin du vertical pour être sur qu'on commence au début de l'écran
2) Modifier la palette pour la première ligne
3) Attendre la fin du balayage horizontal
4) Modifier la palette pour cette ligne
5) Retourner à 3 jusqu'à ce qu'on ait parcouru toutes les lignes.
.
Si vous vous lancez dans la programation de cet effet en vous arrêtant ici dans ce texte, deux surprises de taille vont vous tomber dessus :
1) Si vous vous mettez en 320x200 et vous faites une boucle sur 200 lignes, uniquement la première moitié de l'écran se trouvera affecté, la seconde moitié prenant évidement la même couleur que la dernière ligne affectée.
2) Et en fait vous ne verrez qu'un tremblement peu convainquant, d'une rare instabilité.
La réponse au premier problème est rapide : En mode 320x200, l'écran possède en réalité 400lignes, avec bêtement deux lignes les mêmes à chaque ligne. Ce qui vous permet d'imaginer des trucs encore plus gags, vu que vous pourrez, vous, faire la distinction entre ces lignes qui normalement sont couplées.
La seconde illustre la raison pour laquelle on ne voit presque jamais cet effet nul part. Avec (sans doute) Windows qui tourne derrière, avec les IRQ qui interrompent constamment le processeur (il suffit de bouger la souris pour faire trembler le bidule encore plus), l'horloge interne... La syncronisation doit être tellement parfaite qu'un bête incrément de compteur dans l'int 8h de l'irq 0 suffit à tout mettre par terre. La réaction à la fin du retour horizontal ne peut subir aucun retard.
La solution est méchante mais audacieuse : Windows et les IRQ nous ennuient? Virons Windows et les IRQ. Hé wais. Il existe pour cela une instruction magique, une commande du processeur qui est CLI, "clear interrupt", ce qui désactive (presque) toutes les interuptions hardware de la machine. Même Windows n'y survit pas et se coupe totalement (essayez un peu un ctrl+alt+del pour voir...).
Ceci est très dangereux, car VOUS NE POUVEZ PLUS UTILISER LE CLAVIER, car celui-ci fonctionne... avec une IRQ... La solution proposée ici consiste à aller directement lire dans le buffer internet du clavier via le port 0x60...
Evidement, à la fin du programme, il est "conseillé" de rebrancher les interruptions avec l'instruction STI, "set interrupt"
.
5) J'ai rien compris
C'est bien domage pour vous :) Si vraiment vous n'en sortez pas, n'hésitez pas à m'envoyer un mail à theplouf@yahoo.com

Revenir au sommaire Tutoriaux

Hit-Parade