Revenir au plan du site
Changer les couleurs
On vient de voir comment changer le mode graphique. C'est bien mais il serait aussi sympathique de changer les couleurs. Alors, comment fait-on? À nouveau c'est le Gate Array qui s'occupe de cette tâche.
Le port #7F00 est à nouveau de la partie, tant pour la sélection de l'encre, que pour la valeur de l'encre (sa couleur).
Le snipet pour changer la couleur d'une encre
; sélectionner l'encre courante
; encre de 0 à 15 pour l'écran et 16 pour le border
ld bc,#7F00+encre : out (c),c
; changer la couleur HARD de l'encre courante
; voir le tableau suivant pour les valeurs possibles
ld bc,#7F00+couleur : out (c),c
|
Le Gate Array décode les couleurs sur une plage d'adresse qui a une longueur multiple de 32, c'est pourquoi certaines encres Hard (celle que nous devons utiliser) sur les 27 disponibles sont dédoublées. On peut
indiféremment utiliser l'un ou l'autre des codes disponibles. J'ai classé les couleurs selon l'ordre du Basic, qui est aussi l'ordre Bleu/Rouge/Vert en base 3. La couleur ASIC est une valeur 16 bits qui tient
compte de l'inversion lors de l'écriture mémoire (Ne vous en souciez pas pour l'instant, on parlera de l'ASIC plus tard et ces valeurs de référence vous seront utiles).
n°Basic |
n°Hard |
Nom normé |
Rouge |
Vert |
Bleu |
Couleur ASIC |
Couleur |
00 | #54 | Noir | 0% | 0% | 0% | #000 | |
01 | #44 et #50 | Bleu Marine | 0% | 0% | 50% | #008 | |
02 | #55 | Bleu Vif | 0% | 0% | 100% | #00f | |
03 | #5C | Marron | 50% | 0% | 0% | #080 | |
04 | #58 | Magenta Foncé | 50% | 0% | 50% | #088 | |
05 | #5D | Bleu Violet | 50% | 0% | 100% | #08f | |
06 | #4C | Rouge Vif | 100% | 0% | 0% | #0f0 | |
07 | #45 et #48 | Violet | 100% | 0% | 50% | #0f8 | |
08 | #4D | Magenta Vif | 100% | 0% | 100% | #0ff | |
09 | #56 | Vert Foncé | 0% | 50% | 0% | #800 | |
10 | #46 | Bleu Sarcelle | 0% | 50% | 50% | #808 | |
11 | #57 | Bleu Dodger | 0% | 50% | 100% | #80f | |
12 | #5E | Jaune Olive | 50% | 50% | 0% | #880 | |
13 | #40 et #41 | Gris | 50% | 50% | 50% | #888 | |
14 | #5F | Bleu Ardoise Moyen | 50% | 50% | 100% | #88f | |
15 | #4E | Orange | 100% | 50% | 0% | #8f0 | |
16 | #47 | Rose | 100% | 50% | 50% | #8f8 | |
17 | #4F | Violet | 100% | 50% | 100% | #8ff | |
18 | #52 | Vert Vif (Citron) | 0% | 100% | 0% | #f00 | |
19 | #42 et #51 | Vert Printanier | 0% | 100% | 50% | #f08 | |
20 | #53 | Bleu Eau | 0% | 100% | 100% | #f0f | |
21 | #5A | Vert Chartreuse | 50% | 100% | 0% | #f80 | |
22 | #59 | Vert Clair Pastel | 50% | 100% | 50% | #f88 | |
23 | #5B | Bleu Ciel Clair Pastel | 50% | 100% | 100% | #f8f | |
24 | #4A | Jaune Vif | 100% | 100% | 0% | #ff0 | |
25 | #43 et #49 | Jaune Clair Pastel | 100% | 100% | 50% | #ff8 | |
26 | #4B | Blanc de Chine | 100% | 100% | 100% | #fff | |
Note: J'ai essayé de donner des noms de couleurs corrects, ce qui n'est pas toujours simple. Par exemple le "Bleu ardoise moyen" était pas loin du "Rouge pourpre moyen", qui reste pourtant une couleur avec une dominante bleue. Les autres noms de couleur se rapprochent de ce qui est utilisé en standard web. Bref, je n'ai pas utilisé les noms officiels du manuel qui sont complètement claqués au sol.
Pour la petite anecdote, Roland Perry a déclaré récemment dans une interview que le CPC avec 64 couleurs avait bien existé en prototype et qu'ils s'étaient amusés à faire des blagues en nommant les couleurs,
par exemple le pourpre profond (Deep Purple) comme le nom du groupe de rock. On aurait néanmoins aimé éviter le marron à la place du rouge et le blanc au lieu du gris. Là aussi il glisse dans
l'interview, l'air de rien, qu'
"on avait la couleur vive, la couleur normale, enfin ça dépend de ce que les gens considèrent comme normal..."
Bon, et si on affichait une image, en mode 0, avec plein de couleurs? Pour pouvoir régler la palette, on va utiliser une boucle et lire les 16 couleurs que l'on va envoyer successivement au Gate Array. Mais d'abord, je vous invite à télécharger le fichier image suivant
[ici].
BUILDSNA : BANKSET 0
ORG #100
RUN #100
ld bc,#7F80+%1100 : out (c),c ; utiliser le mode 0
ld hl,palette_image ; adresse du tableau des couleurs
ld bc,#7F00 ; on commence sur l'encre zéro
ld e,16 ; on va boucler sur 16 couleurs
setPalette
out (c),c : inc c ; sélectionner l'encre et incrémenter C pour la prochaine itération
; on pré-incrémente B car l'instruction OUTI commence par décrémenter B
; et nous on veut que B conserve sa valeur #7F car c'est le port qu'on veut!
inc b : outi ; envoyer la valeur pointée par HL sur le port
dec e : jr nz,setPalette
out (c),c ; sélectionner le border car C vaut 16 en sortie de boucle
ld a,#54 : out (c),a ; et choisir la couleur 'Noir'
jr $ ; boucle infinie, on ne fait plus rien
palette_image defb #5B,#4B,#54,#40,#46,#5C,#47,#5E,#43,#4E,#44,#57,#4C,#56,#55,#52
ORG #C000 ; mémoire vidéo
incbin 'cafeTronche.bin'
|
Voilà, votre écran est affiché dans la bonne résolution et avec les bonnes couleurs. Je vous laisse la surprise de l'image ;)