|
HPGrâal Numero 1
ASM-PRATIK
Cette rubrique est dédiée à ceux qui savent déjà programmer en assembleur, mais qui sont encore débutants : Tous ceux qui connaissent les instructions du Saturn mais ne sont pas encore initiés à toutes les subtilités de la HP . Cette fois-ci, on va s'attaquer aux niveaux de gris sur HP .
- Principe.
- L'écran de la
HP n'étant pas conçu pour pouvoir afficher des niveaux de gris directement, comme le ferait une Game-boy, il va falloir ruser... En fait, on fait clignoter plusieurs images assez vite pour que l'effet de clignotement ne soit pas visible. Et là on utilise ce qu'on appelle la rémanence de l'écran: Les pixels mettent un certain temps pour s'éteindre, c'est ce qui provoque les "bavures" lorsqu'on déplace le curseur dans l'éditeur de grobs.
- Donc, lorsqu'on fait clignoter un pixel très rapidement, il n'a pas le temps de s'éteindre complètement ni de s'allumer complètement. Il se trouve dans un état intermédiaire, ce qui donne l'impression que son contraste est plus faible.
- Ainsi, en faisant clignoter deux images, on obtient 3 couleurs : Blanc dans le cas où les pixels sont éteints sur les deux images, noir dans le cas où les pixels sont allumés sur les deux images, et gris dans le cas ou 1 seul pixel est allumé.
- Maintenant en rusant encore plus, avec 2 images, on peut afficher 4 couleurs. Pour cela il suffit d'afficher la deuxième image deux fois plus longtemps que la première : Si un pixel est allumé sur la première image et pas sur la seconde, il est affiché le tiers du temps, alors que si c'était l'inverse (allumé sur la deuxième image mais pas sur la première), il serrait allumé les deux tiers du temps. Plus un pixel est allumé longtemps, plus il parait foncé, donc dans le premier cas on obtiendrait un gris clair et dans le second un gris foncé... Ca fait donc 4 "couleurs" : blanc, gris clair, gris foncé, noir.
- D'une manière générale, avec n images on peut obtenir 2n couleurs. Sur
HP , à partir de 3 images, on ne peut pas obtenir un résultat correct : ça clignote trop.
- On va maintenant faire un programme pour afficher 4 couleurs à partir de deux images...
- Ce qu'il faut savoir.
- Tout d'abord, le temps mis par la
HP pour afficher un écran : 1/64ème de seconde, et la persistance rétinienne de l'oeil : 1/10ème de seconde (ça signifie que si on affiche moins de 10 images par seconde, l'oeil les voit séparément, et on a une impression de clignotement).C'est ce qui explique qu'on ne puisse utiliser plus de 3 images, car avec 3 images, on affiche une fois la première, 2 fois la seconde et 3 fois la troisième, ce qui fait 6 affichages. Et 6/64 ce n'est pas loin de 1/10.
- Ensuite, la méthode pour afficher les images : On pourrait recopier les images dans le grob utilisé pour afficher la pile, mais la construction de l'image serait alors visible et ça ne serait pas beau (encore des clignotements). C'est pourtant ce qu'on faisait avant qu'Elendril découvre qu'on peut contrôler le balayage de l'écran grâce à la
RAM I/O : A l'adresse #00120h , on trouve l'adresse du début de la bitmap écran, c'est à dire l'adresse en mémoire du pixel en haut à gauche de l'écran. Attention, en #00120h on ne peut qu'écrire cette adresse, pas la lire, on doit donc la sauver quelque part (ex : Pour le grob de la pile, cette image est stockée en mémoire réservée à l'adresse #8068Dh ). Pour afficher les images, on se contente donc d'écrire leur adresse en #00120h .
- Dernier détail : Pour améliorer la qualité, certains programmeurs s'embêtent à changer le contraste entre chaque affichage (plus clair pour la première image et plus foncé pour la seconde). Pour des images en quatre couleurs, ça ne vaut pas le coups, la différence ne se voit pas. Par contre ça peut devenir intéressant pour des images en 8 couleurs.
- Pour des raisons de facilité de programmation, on réunit les deux grobs qui composent notre image en un seul de longueur double (ex : Pour une image de 131*64 on aurait un grob de 131*128).
- En
RAM I/O , on trouve également, à l'adresse #00128h , la VBL (ou VSYNC) : le numéro de la ligne de l'écran actuellement balayé (en lecture seulement : écrire à cette adresse change la hauteur de la barre des menus). Ca nous sert pour avoir une meilleure qualité d'affichage : on change d'image lorsque la dernière ligne vient d'être affichée.
- Le programme (pour une image 131 x 64).
GOSBVL 0679B % sauvegarde des registres
GOSBVL 01115 % interdit les interruptions
C=DAT1 A % C.A contient l'adresse du grob
D1=C % D1 pointe sur le grob
LC 02B1E % Prologue d'objet grob
A=DAT1.A % récupère le prologue de l'objet au niv 1
?A=C A
GOYES GROB.OK
GOSBVL 067D2 % si pas un grob
LC 00202
GOVLNG 10F80 % exécute l'erreur "Bad argument type"
*GROB.OK
D1=D1+5 % D1 pointe sur la taille du grob
LC 0110F % taille d'un grob 131*128
A=DAT1 A % on récupère la taille du grob
?A=C A % si c'est la bonne taille
GOYES SIZEOK % on continue
GOSBVL 067D2 % récupère les registres
LC 00501
GOVLNG 10F80 % exécute l'erreur "Invalid dimension"
*SIZEOK
D1=D1+15 % D1 pointe sur le contenu du grob
AD1EX % A contient l'adresse du contenu du grob
B=A A % B aussi
LC 00880 % taille d'un écran 131*64
A=A+C A % A.A contient l'adresse du deuxième écran
D0=00128
LC 3F
DAT0=C B % supprime la barre des menus
D0=(2) 00 % D0 pointe sur la marge à gauche
C=DAT1 1
RO=C % sauvegarde la marge à gauche
?ABIT=0 0 % Si le grob est en adresse paire
GOYES A % on continue
LC C
DAT0=C 1 % on change la marge à gauche (on
% est obligé quand le grob est en adresse impaire)
D0=(2)25 % D0 pointe sur la marge à droite
LC FFF
DATO=C X % On est encore obligé.
*A
D0=(2)20 % D0=00120h
D1=(5) 00129 % quartet de poids fort de la VBL
*B
DAT0=A A % affiche le deuxième écran
GOSUB VBL % attend un balayage d'écran
ABEX A
DAT0=A A % affiche le premier écran
GOSUB VBL
GOSUB VBL % attend deux balayages écran
ABEX A
GOSBVL 01EEC % test touche
?CBIT=0 15 % si la touche on n'est pas appuyée
GOYES B % on recommence
D1=(2)00
C=R0
DAT1=C 1 % restaure la marge à gauche
D0=(5) 8068D % D0 pointe sur la sauvegarde de l'affichage de la pile
C=DAT0 8 % C=adresse de l'affichage de la pile et marge à droite
D1=(2) 20
DAT1=C 8 % réaffiche la pile et restaure la marge à droite
GOSBVL 010E5 % réautorise les interruptions
GOVLNG 138B9 % fin : restaure les registres et retourne au RPL
*VBL
C=DAT1 1 % C=quartet de poids fort de la VBL
?CBIT=1 1 % si on est en haut de l'écran
GOYES VBL % le moment n'est pas encore venu
*VBL2
C=DAT1 1
?CBIT=0 1 % si on est encore dans la partie basse de l'écran
GOYES VBL2 % c'est que l'affichage est pas fini : on attend encore
RTN % fin de la routine d'attente de la VBL
@ % fin du programme
Voilà... En guise d'exo pour la prochaine fois, essayez de modifier le prog pour qu'il accepte n'importe quel format de grob, ou pour avoir plus de niveaux de gris...
HpFool
Des questions:hpgraal@hotmail.com
Un mot au WEBMASTER?:gissehel@mygale.org
Passez donc sur pulsar:Le site pulsar
|