Le VIDEL

Le Videl, le désormais mythique processeur vidéo du Falcon, est sûrement l'un des plus gros atouts de notre belle machine, mais n'est utilisé qu'à la moitié de sa puissance dans la plupart des utilisations courantes: les modes graphiques standard sont comparables avec ceux des cartes vidéo des compatibles PC lorsqu'on utilise un moniteur VGA ou multisynchro, ce qui devient un minimum de nos jours, et avec une légère amélioration en résolution sur moniteur RGB ou téléviseur, au prix d'un scintillement proche de l'insupportable. Nous allons dans cet article découvrir comment tirer parti du maximum de la puissance de ce coprocesseur, en tenant compte également de celle de votre moniteur. Si vous êtes curieux(se) de savoir pourquoi le Videl est le plus puissant processeur vidéo du monde (quoique cela reste à vérifier), je vous invite à vous plonger sans plus tarder dans la lecture de cet article.

Avant de commencer

Avant d'attaquer les registres hardware, une petite mise au point s'impose, en effet il serait préférable, afin de mieux comprendre à quoi sert un processeur vidéo, de revoir comment fonctionne un moniteur. L'image affichée sur l'écran n'est pas réellement une juxtaposition de points lumineux, mais un seul point, un faisceau d'électrons appelé 'spot', se déplaçant sur toute la surface de votre écran. Ce déplacement se produit en permanence, et s'effectue si vite, que l'on a l'impression de voir une image fixe sur l'écran. Le spot parcourt l'écran de haut en bas, en décrivant des lignes horizontales de gauche à droite. Ce séquencement est contrôlé par un processeur vidéo. Celui-ci émet deux signaux de contrôle au moniteur, appelés HBL (Horizontal BLank) et VBL (Vertical BLank). A chaque fin d'affichage d'une ligne, il envoie un signal HBL, ce qui a pour effet de replacer le spot sur le côté gauche de l'écran, et légèrement en dessous de la position verticale précédente, afin d'afficher la ligne suivante. Quand l'image complète est affichée, le processeur vidéo délivre un signal VBL afin de réinitialiser la position verticale du spot en haut de l'écran, de manière à pouvoir recommencer l'affichage d'une nouvelle image, et ce processus se répète indéfiniment. Le processeur vidéo est également chargé de fournir au moniteur les signaux analogiques RVB (Rouge, Vert et Bleu) caractéristiques de chaque pixel que notre faisceau d'électrons affiche, à vitesse constante, au fur et à mesure du déplacement du spot.

A priori, on ne voit pas vraiment l'intérêt de connaître tout cela, et pourtant la clé des résolutions étendues réside justement ici! Le Videl nous donne la possibilité de contrôler très précisément les fréquences d'affichage horizontale et verticale, c'est-à-dire le nombre de HBLs et de VBLs par seconde. Cela lui permet, de plus, de s'adapter aux caractéristiques de la plupart des moniteurs existants.

Il est également important de savoir que, contrairement à nos bons vieux ST (qui ont un peu tendance à devenir poussiéreux dans leurs placards), le Falcon est une machine 32 bits, ce qui veut dire que son bus de données interne peut véhiculer un mot long de 4 octets en un seul cycle de bus. Le Videl, contrairement au 68030, tire pleinement parti de cette nouvelle architecture. De plus, sur un Falcon "normal", il est cadencé à 32 MHz, ce qui lui permet de gérer, en comptant la largeur de bus de 32 bits, huit fois plus de données que le shifter du ST, pour une même période de temps (le shifter étant cadencé à 8 MHz pour une largeur de bus de 16 bits).

Tout ceci nous permet donc de répondre à la question que beaucoup de Falconistes se posent: "si l'on pousse le Videl à fond de ses possibilités, pourquoi n'est-il pas possible d'obtenir un mode 80 colonnes True Color sur moniteur VGA?" Prenons le mode basse résolution standard du ST: en une ligne écran, le shifter affichait 320 pixels, à raison de 4 bits par pixel. Le mode 80 colonnes True color des moniteurs RGB, lui, affiche 640 pixels de 16 bits, ce qui représente bien huit fois plus de données à traiter. Vous me suivez? Alors on continue: La fréquence horizontale des moniteurs RGB est exactement le double de celle des moniteurs VGA: le Videl affiche donc deux lignes en VGA pendant le temps qu'il occuperait à n'en afficher qu'une en RGB. Les 640 pixels du mode 80 colonnes RGB sont donc répartis en deux lignes, ce qui fait 320 pixels maximum par ligne en VGA! CQFD.

Maintenant que tout cela est éclairci, on va pouvoir attaquer les choses sérieuses.

Les registres du videl

Certains registres Videl sont les mêmes que ceux du Shifter des STE, et le fonctionnement d'une partie de ceux-ci a été modifié. D'autres nouveaux registres font leur apparition, afin de pouvoir paramétrer précisément les résolutions, et de fixer "manuellement" les fréquences d'affichage, centrages, etc., horizontaux et verticaux. Il faut savoir que pour ces nouveaux registres je n'ai disposé que d'une documentation très pauvre (à savoir le fichier HARDWARE.TXT, de Dan Hollis, qui se contente d'énumérer les adresses de ces registres), et je ne dois ce que je sais qu'aux multiples tests que j'ai pu effectuer sur différents moniteurs. Vous m'excuserez donc si ma description du fonctionnement de certains de ces registres est (partiellement) mal interprétée, en particulier pour RCO, qui m'a posé le plus de problèmes. Voici donc la liste des adresse des registres vidéo du Falcon:

Adresse écran:

C'est l'adresse du début de la mémoire vidéo.

Compteur écran:

Le pointeur vidéo est l'adresse instantanée du prochain long mot de 32 bits que le Videl va lire en mémoire, afin d'afficher les pixels qui correspondent directement sur l'écran.

Modes video

Un mode vidéo est l'ensemble des valeurs des registres vidéo qui définissent des fréquences, résolutions, définitions d'affichage horizontales et verticales, et un nombre de couleurs donnés. Vous trouverez sur la disquette accompagnant ce numéro de ST-Magazine le listing d'une routine assembleur qui installe un mode vidéo sans utiliser le système. A cet instant précis, une question cruciale devrait surgir de votre subconscient (ce qui n'a aucun rapport avec un quelconque devoir de philo de bac): "d'accord, on a la routine qui permet d'installer un mode vidéo, mais comment calculer les valeurs à assigner aux registres du Videl ?" Voici donc quelques explications qui devraient vous permettre de créer vous même vos propres modes vidéo. Commençons par les registres de contrôle horizontaux. HHT détermine un multiple du nombre de cycles Videl par intervalle entre deux synchros HBL, moins 1. Sa valeur ne doit pas être prise au hasard, car cela pourrait s'avérer fâcheux pour le moniteur: vu que HHT agit directement sur la fréquence horizontale, on doit absolument prendre en compte la gamme de fréquences horizontales supportées par son moniteur, ce qui devrait figurer dans les caractéristiques techniques du manuel du dit moniteur. A titre d'information, la fréquence standard du'un moniteur RGB ou d'un téléviseur est de 15625 Hz, alors que celle d'un moniteur VGA de base est de 31250 Hz. On obtient la valeur de HHT selon la formule suivante:

HHT = (F.Vid / F.Hor)/n -1

Ici, F.Vid est la fréquence interne du Videl, c'est-à-dire 25 ou 32 MHz, selon la valeur du bit 2 de RCO, F.Hor est la fréquence horizontale souhaitée, et n prend la valeur 8 si l'on a sélectionné le mode simple pixel horizontal, et 4 sinon. Pour la valeur de HSS, elle doit être strictement inférieure à celle de HHT, mais doit quand même s'en rapprocher. Les valeurs justes de HBB, HBE, HDB et HDE se trouvent le plus efficacement par tâtonnements, je vous conseille pour cela d'utiliser comme point de départ un mode vidéo déjà existant, comme pourquoi pas l'un des modes standard, et de modifier la valeur des registres à l'aide de l'utilitaire VIDEO.PRG fourni avec Falcon Screen, le gestionnaire de résolutions étendues qui était sur la disquette du numéro 76 de ST-Magazine. Si vous voulez caler les bordures de l'écran à la juste largeur de l'image, de manière à supprimer le contour de couleur 0 de l'image, vous fixerez comme bon vous semble la valeur de HBE (cadrage horizontal), puis vous appliquerez la formule suivante:

HBB = HBE - HHT + <résolution horizontale en pixels>/n - 2

Si vous êtes en mode quadruple pixels, n est égal à 2, et est égal à 1 sinon.

Les registres de contrôle verticaux sont beaucoup plus simples à gérer, en effet on agit ici avec des lignes graphiques, ou plutôt des demi-lignes, comme nous allons le voir. La valeur de VFT est le double moins un du nombre de HBLs effectuées entre deux VBLs successives. Cette valeur sera donc du même ordre de grandeur en mode RGB 200 lignes qu'en 400 lignes entrelacées (hé oui, on n'affiche que la moitié des lignes vidéo par balayage écran en mode entrelacé). De la même façon, en mode VGA 240 double lignes, on aura la même valeur de VFT qu'en 480 lignes normales. On pourrait penser que la valeur de VFT devrait être toujours impaire, étant le double moins 1 d'un nombre entier. Or, il arrive que ce nombre soit pair, tout simplement lorsqu'on veut créer un mode entrelacé: en effet, un balayage écran sur deux, on affiche une ligne de plus ou de moins que lors du balayage précédent, ce qui donne un nombre moyen de lignes par balayage non entier: d'où l'intérêt d'utiliser des doubles lignes. C'est VFT qui détermine la fréquence verticale: celle ci se calcule de la façon suivante:

V.Freq = H.Freq / (VFT+1) * 2

Les cinq autres registres de contrôle verticaux devront avoir une valeur strictement inférieure à celle de VFT. La résolution verticale est beaucoup plus simple à gérer: On peut simplement générer une configuration verticale en fixant VSS à une valeur proche de celle de VFT, et en appliquant les formules suivantes aux autres registres de contrôle verticaux :

VBE = VDB = <cadrage vertical de l'affichage>

VDE = VBB = VBE + <résolution verticale> * n

n prendra la valeur 1 en mode entrelacé, 2 en mode normal et 4 en double ligne.

En ce qui concerne RCO, nous avons vu que les valeurs des bits 0 et 1 devaient être respectivement à 0 et 1 en mode quadruple pixels, et n'avaient aucun effet dans les autres modes. On les fixera donc une fois pour toutes aux valeurs imposées par ce mode horizontal. Les bits 2 et 3 ne devraient pas vous poser de problèmes. Pour les bits 4 à 8, on n'utilisera que la seule configuration générée par le Xbios, c'est-à-dire qu'on assignera la valeur 0 aux bits 4, 5 et 6, et 1 aux bits 7 et 8.

Un exemple vaut mieux qu'un long discours (quoique...)

Pour que tout vous paraisse plus clair, je vais vous donner un exemple concret de création de mode vidéo. Supposons qu'on veuille générer pour un moniteur RGB, un mode de résolution 416 x 296, non entrelacé, simple ligne, simple pixels, True Color, et sans bordures. Pour commencer, on met la valeur $100 en $FF8266, pour passer en mode True Color, ensuite, on va fixer la fréquence Videl à 32 MHz (fréquence standard en RGB), on met donc $182 dans RCO (voir plus haut pour les détails), 0 dans VCO (idem), sans oublier de fixer la largeur de l'écran (ici 416 mots) dans $FF8210. C'est au moment de s'occuper des registres de contrôle horizontaux que tout se complique. Déjà, on applique notre formule pour calculer HHT: La fréquence Videl est de 32 MHz, et on va employer la fréquence horizontale standard des moniteurs RGB, qui est de 15625 Hz. On a donc:

HHT = 32 x 10^6 / 15625 / 8 - 1 = 255

Ensuite, on fixera arbitrairement HSS à 255-23=232. Une bonne valeur pour HBE est 50, on a donc HBB = 50 - 255 + 416 - 2 = 209.

Ensuite, on trouvera par tâtonnements (merci VIDEO.PRG ! ) les valeurs 17 et 209 pour HDB et HDE, ce qui nous débarrasse des registres de contrôle horizontaux. On fixera la valeur 643 à VFT, ce qui correspond à l'affichage de 322 lignes entre chaque VBL, ce qui n'est pas tout-à-fait le standard (normalement c'est 313 lignes), mais qui nous permet d'afficher quelques lignes en plus. On calcule la fréquence verticale: V.Freq = 15625 / (643+1) * 2 = 48.5 Hz, ce qui est supporté par la quasi-totalité des téléviseurs, et par tous les moniteurs RGB. Le standard pour un moniteur PAL est 50 Hz. Ca y est, notre mode vidéo est prêt!

La conlusion de l'histoire

Voilà, j'espère que cet article vous aura éclairé quant au fonctionnement du Videl, et qu'il vous permettra de profiter au maximum des capacités graphiques du Falcon. Vous pourrez maintenant, grâce à vos nouvelles connaissances, programmer des zooms fractals plein écran RGB en temps réel (en définissant un mode horizontal simple pixel avec une fréquence Videl de 25 MHz, ce qui donne des pixels encore plus larges que le mode 40 colonnes standard, et en y rajoutant un mode vertical double ligne), ou faire du scrolling hardware au pixel près en True Color (en jouant sur les valeurs de VDB et VDE, le registre $FF8265 n'ayant aucun effet en True Color), ou encore d'autres applications que je n'ai même pas imaginées...