La génération des couleurs par le Gate Array sur Amstrad CPC

Une bizarrerie de l'Amstrad CPC est sa palette de 27 couleurs. Bizarre pour un ordinateur qui ne comporte aucun circuit analogique, on aurait pu s'attendre à 16 ou à 32...

Longtemps l'explication proposée à été que le gate array générait un signal carré très rapide alternant entre une couleur en pleine intensité (5 volts) et du noir (0 volts) pour créer une demi teinte, le flou de l'écran faisant le reste.

Si on réfléchit 2 minutes, ceci n'est pas possible. En effet en mode 2, on doit afficher à chaque seconde 15625 lignes de 1024 pixels mode 2 (en comptant le border et la HBL). Cela fait donc environ 16 millions de pixels par seconde, soit une fréquence de 16MHz. Or c'est justement la fréquence maximale du Gate Array ! Impossible donc de générer des demi-teintes par des alternances à 32MHz. Or les pixels sont eux parfaitement visibles.

ce n'est que bien des années plus tard que Grimmy s'est occupé de schématiser proprement les circuits de l'Amstrad sur son excellent site Grimware. On y trouve notamment un schéma montrant clairement la sortie vidéo de la machine, et il n'y a que des résistances entre le Gate Array et le connecteur vidéo.

L'astuce utilisée par les ingénieurs d'Amstrad fait appel à une possibilité utilisée très souvent en électronique : la haute impédance.

L'utilisation habituelle de la haute impédance est de faire cohabiter plusieurs circuits sur un bus en les laissant tous écrire.

On vous a souvent fait croire que l'électronique ne comporte que des 0 et des 1. C'est faux. quand on relie ensembple plusieurs composants un peu complexes, comme par exemple dans un ordinateur, ils doivent tous s'échanger des informations. Pour cela, on utilise un bus. C'est un ensemble de pistes sur la carte mère (ou de petits straps bleus) qui relient tous les composants ensemble. À un instant donné, un seul des composants a le droit d'écrire une information sur le bus, tous les autres peuvent alors soit la lire, soit l'ignorer. On dit que les pattes des composants reliées au bus sont des entrées-sorties.

Le problème est simple : quand une de ces pattes n'est pas utilisée pour écrire une donnée, il ne faut pas qu'elle envoie du 5 volt ou du 0 volt sur le bus, sans quoi la puce qui essaie d'écrire aura bien du mal à se faire entendre. Les électroniciens ont donc implanté un système dans chaque puce qui permet de la déconnecter totalement du bus. La patte de la puce ne force alors rien du tout et laisse une autre puce utiliser le bus comme elle veut.

Quand une autre puce utilise le bus, tout va bien, on voit toujours passer sagement des 1 et des 0. Mais que se passe-t-il si tous les composants reliés au bus décident de se mettre en haute impédance ? C'est simple : le bus ne sera plus alors piloté par personne et pourra flotter librement quelque part entre 0 et 5 volts. En pratique, plusieurs résistances sont également reliées au bus pour évacuer les électrons de la piste (cela évite à ces derniers de traverser les puces pour sortir, ce qui provoquerait une surchauffe des puces en questions). Les résistances vont donc remettre le bus à sa valeur de repos, 0 ou bien 5 volts, selon le cas.

L'astuce utilisée chez Amstrad consiste à équiper les sorties vidéo du Gate Array d'un système de haute impédance. A priori, c'est inutile, puisque le Gate Array sera le seul à envoyer des messages à l'écran. Mais un assemblage habile de résistances vient compléter le tout. Chacune des sorties rouge, verte et bleue du Gate Array est reliée à deux résistances, l'une d'entre elle connectée au +5v, l'autre au 0. Lorsque le Gate Array envoie du noir, les trois lignes sont forcées à 0.

Image volée sur Grimware.org

Les électrons sont alors évacués en traversant les résistances vers le +5, pas de problème. Lorsqu'il génère du blanc, les trois lignes sont forcées à +5v, et pas de problème non plus. Le cas le plus intéressant est celui ou on veut générer du gris. Dans ce cas, le Gate Array entre en état de haute impédance, et laisse les trois lignes flottantes. Il n'y a plus personne pour les controler, elles vont donc se stabiliser à une valeur définie par les 2 résistances. Les électrons arrivent par la masse, remontent une résistance, font un bref passage dans la ligne, et s'échappent par le +5v en traversant la 2ème résistance. La tension dans la ligne dépend donc de la valeur des deux résistances.

On considére que l'écran n'a aucun effet, en pratique ce n'est pas tout à fait exact.

En pratique, il y a une petite subtilité supplémentaire. La ligne marquée GND sur ce schéma est en fait la ligne Sync de la sortie vidéo. La conséquence est que la tension évacué par cette ligne peut remonter à contre courant les autres résistances et perturber les autres couleurs.

Conséquences utiles

En plus des résistances mentionnées, d'autres sont présentes pour générer la sortie en niveaux de verts. Elles introduisent des interférences entre les couleurs qui provoquent des niveaux de luminosité variables. La demi teinte n'est donc non seulement pas à 50%, mais en plus, elle varie selon la couleur.

Par exemple un vert foncé (numéro 9) est à 47.1154% de la pleine intensité, alors que dans du gris (13), il est à 49.0385% (selon les mesures de grimware). Cela influe également sur les deux autres niveaux et on trouve des bleus à 5.2885% dans le jaune 24, par exemple.

Les résistances sont différentes entre le 464 et les autres machines. La haute impédence du Gate Array n'est pas parfaite, il y a un courant de fuite (certains électrons s'en vont par le Gate Array). Elle est probablement meilleure sur la révision 40010 et les résistances sont adaptées pour compenser ça.

Une petite remarque : sur 664 et 6128, les sorties comportent des condensateurs. Ces ordinateurs ont donc une image plus floue que le 464. La fréquence de coupure est de 2.67MHz (si nos calculs sont bons), ce qui n'est pas du tout négligeable... Cela dit, c'est peut-être volontaire pour compenser un Gate Array capable de générer des signaux plus nets. Pour information il s'agit des condensateurs C133, 134 et 135, placés entre les 3 sorties RGB et la masse.

Conséquences amusantes

Il est donc possible de modifier la palette de couleur de l'amstrad en remplaçant ces résistances. On pourrait même utiliser des convertisseurs numériques analogiques de façon à pouvoir changer la palette de façon logicielle.

Il est également important de se souvenir que lorsque le gate array affiche du gris, le bus est en haute impédance, il est alors possible, sans risquer d'abimer quoi que ce soit, d'en prendre le controle pour effectuer par exemple, une incrustation vidéo. Cela serait assez limité: pour ne pas avoir d'interférences, la deuxième puce vidéo ne devrait générer une image que lorsque le Gate Array affiche du gris. Et il n'y a aucun moyen sur de savoir quand c'est le cas.