Couleurs et adresses.

Pour le moment tout ce que nous faisons est bien monochrome.
Et si nous ajoutions un peu de couleurs !

Sur ZX spectrum, les couleurs fonctionnent par caractère.
Un caractère correspond à un carré de 8*8 pixels, soit 1 octet de large sur 8 de haut.

Nous avons donc 32*24 caractères à l'écran.

Chaque caractère peut avoir deux composantes:
- Le PAPER: encre de "fond" correspondant aux bits à 0 de l'octet.
- L'ENCRE (ou INK) correspondant aux bits à 1 de l'octet.

Pour chaque composante, nous avons le choix d'une palette de 8 couleurs.
8 couleurs mais qui en fait peuvent avoir une variante de luminosité ou "brightness".

palette

Afin de mieux comprendre comment cela se passe, regardons comment sont codées les composantes d'un caractère.

Pour chaque caractère à l'écran nous allons avoir un octet qui définira:
- La couleur du PAPER.
- La couleur de l'ENCRE.
- La LUMINOSITÉ.
- Le clignotement.

Le clignotement est codé sur 1 bit. Si ce bit est à 0, il n'y a pas de clignotement. S'il est à 1, il y aura clignotement.
Le clignotement correspond en l'inversion des couleurs du paper et de l'encre.
Si votre encre est rouge et votre paper et noir, alors le clignotement fera alterner ces couleurs avec: encre noire et paper rouge.
La vitesse du clignotement n'est pas réglable.

La luminosité est elle aussi sur 1 bit.
Si le bit est à 0 alors vous utilisez les couleurs foncées.
Si le bit est à 1 alors vous utilisez les couleurs vives.
Comme il n'y a qu'un seul bit pour la luminosité, ET le PAPER ET l'ENCRE subissent le choix.
Ainsi, si vous choisissez les couleurs sombres, ce sera pour les deux composantes du caractère.
Il n'est donc pas possible d'utiliser un paper sombre avec une encre vide malheureusement.

Notez aussi que la couleur noire reste noire quelque soit la luminosité choisie.
La palette du spectrum est donc de 15 couleurs.

Chaque composante est codée sur 3 bits ce qui donne bien 8 possibilitées (0 à 7)

Voici le codage de l'octet de couleur d'un caractère, que l'on appelle aussi "attribut"

Attribut de couleur

La table d'attribut se trouve à partir de #5800 jusqu'en #5AFF, soit 768 octets ce qui correspond bien à nos 32*24 caractères.

A partir de cette adresse chaque octet correspond donc à un caractère de l'écran.
Le premier octet correspond au premier caractère, puis les suivants sont attribués de façon linéaire en avançant de la gauche vers la droite et en descandant à chaque fin de ligne comme nous lisons.

Nous pouvons faire une petit essai en basic afin de vérifier cela.
J'écris un caractère "A" à l'écran sur le premier caractère afin d'en changer la couleur.
L'adresse #5800 en décimal correspond à 22528.

                5 PRINT AT 0,0;"A"
                10 poke 22528,bin 11001111

Maintenant que nous savons changer les couleurs, il serait utile de pouvoir choisir en fonction de l'endroit ou on affiche quelque chose la couleur à cet endroit.

Imaginons que l'on affiche un octet par exemple en #4394 (au hasard). Comment pouvons nous changer les couleurs du caractère ou se trouve cet octet ?

Pour determiner l'adresse de l'octet d'attribut de couleur, nous allons de nouveau procéder à des calculs.
Je vous mets directement un schéma issu de mes recherches pour ce problème.

conversion adr attribut

Le problème est pour nous assez simple maintenant.
Comme nous l'avons vu précédement, les bits 0;1 et 2 du poids fort de l'adresse de notre octet correspond à la ligne dans le bloc ligne.
Hors comme l'attribut de couleur fonctionne au caractère, peut importe le numéro de la ligne dans le bloc ligne puisqu'elles auront toutes la même couleur.
Nous pouvons donc facilement recréer l'adresse de notre attribut de couleur dans la table en supprimant ces trois bits du poids fort de l'adresse.
On forcera par la même occasion le poids fort à #58 afin de pointer sur le début de la table d'attributs de couleurs.

Si notre adresse de l'octet vaut #4394, la conversion nous donnera donc:

conversion adr vers attribut

Nous pouvons à nouveau tester sous basic:

                10 POKE 17300,255
                20 POKE 22676,BIN 00001111

C'est parfait, tout fonctionne !
Je vous laisse faire la routine assembleur, elle sera un bon exercice pour appliquer les instructions et principes vus dans le cour précédent.

X

CONNEXION




Inscription