Site logo

Triceraprog
La programmation depuis le Crétacé

VG5000µ, Arrangement de la mémoire vidéo ()

Cet article est la version française de cet autre que j'ai écrit suite à une demande d'aide dans le forum System.cfg forum. Je me suis dit que c'était le moment de mettre à plat mes notes, même si du coup cela cassait un peu la progression des articles en français sur l'affichage.

Cela donne un article un peu plus austère que d'habitude, et un peu plus dense.

Pour commencer, le processeur vidéo du VG5000µ est un EF9345. On peut y accéder de deux façons, soit en discutant directement, soit à travers la RAM lorsqu'on utilise le BASIC embarqué dans la machine. La manière directe est plus puissante, la seconde est plus simple.

Le signal de début d'affichage (Blank Start) du processeur vidéo est connecté à la broche d'interruption du Z80. Cela provoque une interruption IRQ qui, dans le mode dans lequel le BASIC initialise le Z80, fait un appel à l'adresse 0x0038 en tant qu'interruption.

La routine IRQ utilises des drapeaux (flags) pour décider si le contenu de la RAM doit être envoyé au EF9345. Pour cela, le moniteur regarde les valeurs en 0x47FA (compteur décrémenté jusqu'à 0), 0x47FB (force un rafraîchissement si différent de 0) et 0x47FC (valeur de référence pour le compteur en 0x47FA). En BASIC, cela correspond à la commande DISPLAY.

Si le rafraîchissement est enclenché, la mémoire vidéo est décodée et transférée au EF9345. Pour avoir une idée de comment est effectué cette opération, sur une version 1.1 du BASIC, cela commence à l'adresse 0x0056, puis un peu plus loin en 0x00bc et se termine en 0x018b. Le registre ix est toujours à la valeur 0x47fa lorsque le BASIC est en route. Il se sert de ce registre d'index pour repérer les variables d'affichage (ne touchez pas à ix si vous laissez le système BASIC gérer la vidéo, ou alors en masquant les interruptions).

La mémoire vidéo est de la mémoire RAM standard. Elle n'est pas branchée d'une manière spécifique et si vous voulez contrôler l'affichage vous même, vous pouvez utiliser n'importe quel endroit disponible et le format qui vous chante. L'arrangement utilisé par le BASIC en ROM, lui, commence en 0x4000. L'arrangement ligne/colonne est comme suit :

Offset (decimal) Colonne 0 Colonne 1 Colonne 2 ... Colonne 38 Colonne 39
Ligne 0 +0/+1 +2/+3 +4/+5 ... +76/+77 +78/+79
Ligne 1 +80/+81 +82/+83 +84/+85 ... +156/+157 +158/+159
Ligne 2 +160/+161 +162/+163 +164/+165 ... +236/+237 +238/+239
...
Ligne 24 +1840/+1841 +1842/+1843 +1844/+1845 ... +1916/+1917 +1918/+1919
Ligne 25 +1920/+1921 +1922/+1923 +1924/+1925 ... +1996/+1997 +1998/+1999

Chaque unité affichable est codée sur une paire d'octets. Le premier octet contient principalement le numéro du caractère. Le second octet contient principalement ses attributs. La page de caractères est sélectionnée avec 1 bit dans chaque octet.

Le premier octet de la paire se présente comme suit :

Bit 7 6 / 5 / 4 / 3 / 2 / 1 / 0
Contenu N (0)/E (1) numéro du caractère

Le second octet de la paire se présente comme suit :

Bit 7 6 5 4 3 2 / 1 / 0
Contenu TX (0) Inverse vidéo Largeur x2 Hauteur x2 Clignotement Couleur
Contenu GR (1) Couleur ... ... de ... ... fond Clignotement Couleur

Grâce à N/E (Normal/Étendu) et TX/GR, la page de caractères est choisie. Cela correspond aux diverses sélection de caractères en BASIC. TX/Normal est TX, TX/Étendu est ET, GR/Normal est GR, GR/Étendu est EG. Le mode étendu permet de redéfinir les caractères. Le texte normal est ASCII, et le graphique normal contient les caractères semi-graphiques.

Comme vous pouvez le voir, il n'y a pas de moyen pour spécifier une couleur de fond en mode texte. La couleur de fond utilisée est la couleur de fond fixée par le dernier caractère graphique précédent sur la même ligne. C'est pour cela que lorsqu'on utilise la commande INIT du BASIC pour effacer l'écran, la colonne 0 est remplie avec un caractère graphique invisible ayant pour couleur de fond la couleur spécifiée. Et c'est aussi pour ça que le BASIC n'utilise pas la première colonne.

Un dernier mot: le EF9345 est beaucoup plus puissant que ce qui est induit par son utilisation par le VG5000µ. Vous pouvez trouver sur Internet des ressources pour l'utiliser en 80 colonnes, ou bien avec plus de 7 couleurs. Cela nécessite plus de travail car il faut alors communiquer directement avec le EF9345 à travers les ports I/O 0x8F et 0xCF du Z80.