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
|
|