GRAY7LIB Fonction Introduction
Fonction Index des fonctions
Fonction Exemple d'affichage

Page précédente Fonction prochaine bibliothèque
Fonction bibliothèque précédente



 

Monter Descendre Retour Introduction
puce GRAY7LIB est (je pense) la contraction de GRAYscale LIBrary in 7 colours.
puce Cette bibliothèque nous offre la possibilité d'afficher à l'écran des graphismes en 8 couleurs différentes !
C'est encore plus beau qu'avec la bibliothèque gray4lib, mais les concessions à faire sont aussi un peu plus lourdes :
    puce pas question de couper les interruptions quand gray7lib est activée car l'auto-int 1 doit être activée (voir gray7lib.asm)
    puce les fonctions de communication sont inaccessibles pendant que gray7lib est activée
    puce il faut impérativement 7680 octets de libres pour pouvoir créer l'handle des nouvels écrans
puce Au lieu d'un seul buffer écran, nous allons en utiliser trois, voilà pourquoi il faut 2*(240*128)=7680 octets libres pour utiliser cette bibliothèque.

puce Avec un seul buffer écran nous avons 2^1 soit 2 possibilités de couleurs : noir et blanc.

puce Avec la bibliothèque gray4lib donc deux buffers écran nous avons 2^2 soit 4 possibilités de couleurs : noir, 2 tons de gris et blanc.

puce Maintenant nous avons 2^3 soit 8 possibilités de 'couleurs' : noir, 6 tons de gris, et blanc.
puce Chaque écran sera appelé bitplane.
puce L'adresse pour accéder au départ du premier buffer écran créé (appelé bitplane 0) est connue par gray7lib::plane0 .
puce L'adresse pour accéder au départ du premier buffer écran créé (appelé bitplane 1) est connue par gray7lib::plane1 .
puce L'adresse pour accéder au départ de l'écran habituel (appelé ici bitplane 2) reste inchangée et est connue soit par gray7lib::plane2 soit par la variable LCD_MEM de la bibliothèque TIOS.

puce Mais comment cette librairie arrive t'elle à émuler du gris à l'écran ?
C'est simple, elle redifige (donne une nouvelle valeur au vecteur de) l'interruption automatique n°1 (auto-int 1, à l'adresse $64) vers une nouvelle routine, celle-ci affiche trois écrans d'une manière successive.
Elle reste 4/7 du temps sur le premier écran (plane2), reste 2/7 du temps sur le premier nouvel écran (plane1) et reste 1/7 du temps sur le deuxième nouvel écran (plane0). Pour avoir du noir il suffit d'allumer le pixel sur les trois écran car 4/7 + 2/7 + 1/7 = 7/7 = 1.

puce Pour l'utiliser dans un programme, il faut d'abord y faire référence grace à :

    include "gray7lib.h"
    xdef _main
    xdef _comment
Puis appeler une fonction par JSR gray7lib::? ou JSR gray7lib@????.




 
Monter Retour Index des fonctions
@0000on
active le gris
@0002plane0
adresse du nouvel écran
@0001off
désactive le gris
@0003plane1
adresse de l'écran principal




 

Retour on @0000
active le gris
Monter Descendre

DESCRIPTION
puce Active la graduation de gris.


INFORMATIONS FOURNIES
puce Aucune.


INFORMATIONS RETOURNEES
puce Résultat de la procédure, le seul élément pouvant stopper celle-ci serait un manque de mémoire pour créer l'handle du nouvel écran.

Taille : double mot
0graduation de gris activée avec succès
autremémoire insuffisante
Paramètre : registre de donnée D0


PROGRAMMATION
JSR gray7lib::on; on appelle la fonction





 

Retour off @0001
desactive le gris
Monter Descendre

DESCRIPTION
puce Désactive la graduation de gris.


INFORMATIONS FOURNIES
puce Aucune.


INFORMATIONS RETOURNEES
puce Aucune.


PROGRAMMATION
JSR gray7lib::off; on appelle la fonction





 

Retour plane0 @0002
adresse du premier nouvel écran
Monter Descendre

DESCRIPTION
puce Cette fonction est en faites une variable contenant le pointeur vers le nouvel écran créé par la fonction on.
Taille : double mot


INFORMATIONS FOURNIES
puce Aucune.


INFORMATIONS RETOURNEES
puce Voir la description.


PROGRAMMATION
MOVE.l gray7lib::plane0,A0; on charge dans A0 l'adresse du premier nouvel écran





 

Retour plane1 @0003
adresse du deuxième nouvel écran
Monter Descendre

DESCRIPTION
puce Cette fonction est en faites une variable contenant le pointeur vers le nouvel écran créé par la fonction on.
Taille : double mot


INFORMATIONS FOURNIES
puce Aucune.


INFORMATIONS RETOURNEES
puce Voir la description.


PROGRAMMATION
MOVE.l gray7lib::plane1,A1; on charge dans A1 l'adresse du deuxième nouvel écran





 

Retour plane2 @0004
adresse de l'écran principal
Monter Descendre

DESCRIPTION
puce Cette fonction est en faites une variable contenant le pointeur de l'écran habituel.
Taille : double mot


INFORMATIONS FOURNIES
puce Aucune.


INFORMATIONS RETOURNEES
puce Voir la description.


PROGRAMMATION
MOVE.l gray7lib::plane2,A2; on charge dans A2 l'adresse de l'écran habituel





 

Monter Retour Exemple d'affichage
puce Cette partie a pour but de vous faire totalement comprendre comment marche cette bibliothèque car il n'est pas toujours facile de se faire une idée du fonctionnement, j'ai pris ici la photo d'un chalet en 240*128 et huit tons de gris :

puce Et voici ce que nous sauvegardons dans le buffer écran habituel, là aussi j'ai volontairement grisé les pixels armés :

puce Voici ce que nous sauvegardons dans le premier buffer écran créé par la fonction on, attention j'ai volontairement grisé les pixels armés :

puce Voici ce que nous sauvegardons dans le deuxième buffer mémoire écran créé par la fonction on, attention j'ai volontairement grisé les pixels armés :

puce Pour obtenir l'image finale, imaginez tout d'abord que la valeur des pixels du premier écran sont les bits 2 d'octets fictifs donc ont comme valeur 0 ou 4, imaginez ensuite que la valeur des pixels du deuxième écran sont les bits 1 des mêmes octets donc ont comme valeur 0 ou 2, puis imaginez que la valeur des pixels du troisième écran sont les bits 2 des mêmes octets fictifs donc ont comme valeur 0 ou 1.

Pour savoir quelle est la valeur d'un pixel de l'écran final, il faut ajouter la valeur des trois pixels des trois écrans.
Pour vous en convaincre définitivement, utilisez Paint Shop Pro et additionnez les trois écran précédents avec la commande
Image/Arithmetic/Function:Darkest

Enfin en sachant que la couleur blanche vaut 0, le gris très clair vaut 1, le gris clair vaut 2, le gris vaut 3, le gris peu foncé vaut 4, le gris foncé vaut 5, le gris très foncé vaut 6 et que le noir vaut 7, nous pouvons exprimer toute notre explication par le mot fictif d'on nous avons parlé :

Pour avoir la couleur blanche
76543210
000

Pour avoir la couleur grise très claire
76543210
001

Pour avoir la couleur grise clair
76543210
010

Pour avoir la couleur grise
7654321
011

Pour avoir la couleur grise peu foncée
76543210
100

Pour avoir la couleur grise foncée
76543210
101

Pour avoir la couleur grise très foncée
76543210
110

Pour avoir la couleur noire
76543210
111

puce Pour terminer, additionnons trois mots qui seraient au même endroit respectivement dans la mémoire vidéo et des écrans créés par la fonction on et cherchons les couleurs finales :

Octet au hasard de l'écran principal
76 54 32 10
1*2^2=4 1*2^2=4 0*2^2=0 0*2^2=0 1*2^2=4 1*2^2=4 0*2^2=0 0*2^2=0

Octet équivalent du premier écran créé
76543210
1*2^1=2 0*2^1=0 1*2^1=2 1*2^1=2 1*2^1=2 0*2^1=00*2^1=0 0*2^1=0

Octet équivalent du deuxième écran créé
76543210
0*2^0=00*2^0=01*2^0=10*2^0=0 1*2^0=11*2^0=10*2^0=00*2^0=0

Couleurs de l'image final / addition
76543210
4+2+0=6 4+0+0=4 0+2+1=3 0+2+0=2 4+2+1=7 4+1+0=5 0+0+0=0 0+0+0=0




 

 

Lisez la section sur les droits d'auteur et la license d'utilisation avant de distribuer Zguide.

Zguide © 1998, Florian DREVET. Tous droits réservés à l'échelle mondiale