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 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.
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:
$FF8201
(octet): Octet de poids fort de l'adresse écran$FF8203
(octet): Octet de poids moyen de l'adresse écran$FF820D
(octet): Octet de poids faible de l'adresse écranC'est l'adresse du début de la mémoire vidéo.
Compteur écran:
$FF8205
(octet): Octet de poids fort du pointeur vidéo$FF8207
(octet): Octet de poids moyen du pointeur vidéo$FF8209
(octet): Octet de poids faible du pointeur vidéoLe 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.
$FF820E
(mot): Registre d'offset de 9 bits servant à la gestion d'un écran virtuel dont la taille horizontale est
supérieure à la largeur de l'écran, méthode pouvant se révéler indispensable, par exemple, lors de la réalisation d'un
scrolling hardware horizontal. Il contient le nombre de mots à sauter par le Videl à la fin de chaque ligne lorsque celui-ci
parcourt la mémoire vidéo, afin de n'afficher que la partie visible de cet écran virtuel.$FF8210
(mot): Registre de largeur de ligne de 10 bits, qui définit la longueur en mots d'une ligne écran
effectivement affichée.$FF8240
...$FF825E
(16 mots): 16 registres de palette couleurs pour les modes compatibles ST.$FF8260
(octet): Registre de mode de couleur compatible ST. Le fonctionnement de ce registre n'est plus le même
que sur ST: En écriture il agit suivant la valeur qu l'on y écrit:
$FF8265
(octet): Ce registre de 4 bits permet de décaler l'affichage de chaque ligne de 0 à 15 pixels vers la gauche,
ce qui est indispensable pour un scrolling hardware horizontal au pixel près. Lorsque sa valeur est non nulle, le Videl est
contraint à lire un certain nombre de longs mots en plus pour compenser les pixels qui sont affichés en plus à droite de
l'écran. Il faut donc diminuer la valeur de $FF820E
, du nombre de plans du mode graphique en cours. Ce registre n'a
aucune fonction en mode True Color.
$FF8266
(mot): Registre de mode de couleur non compatible ST. C'est un champ de bits dont la valeur est la
suivante:
$FF8280
...$FF828c
: Registres de contrôle horizontaux:
$FF8280
(mot): HHC (Horizontal Hold Counter): Compteur accessible uniquement en lecture. Il est utilisé en
interne par le Videl pour synchroniser l'affichage de chaque ligne.$FF8282
(mot): HHT (Horizontal Hold Timer): c'est ce registre qui permet de définir la durée d'affichage de
chaque ligne, donc le temps séparant deux HBL successives. Sa valeur est recopiée dans HHC à chaque HBL.$FF8284
(mot): HBB (Horizontal Border Begin): Définit la position de la bordure droite de l'écran, c'est à dire
l'endroit de la ligne où le Videl va s'arrêter d'afficher.$FF8286
(mot): HBE (Horizontal Border End): Définit la position de la bordure gauche de l'écran.$FF8288
(mot): HDB (Horizontal Display Begin): Définit la position gauche de l'image affichée.$FF828A
(mot): HDE (Horizontal Display End): Définit la position droite de l'image. La différence des couples
HDB/HDE et HBB/HBE réside dans le fait que la valeur des HBB/HBE permet de créer l'espace affichable, alors que les
HDB/HDE crée l'image elle-même. Si l'on définit une largeur d'image plus grande que celle de l'espace affichable, cette
image sera tronquée et ne pourra pas être visualisée dans toute sa largeur. Si, au contraire la largeur de l'image est
inférieure à celle de l'espace affichable, il y aura apparition des fameuses bordures de couleur 0 qui faisaient la joie de nos
amis ST-istes.$FF828C
(mot): HSS (Horizontal Synchro Start): Définit à partir de quelle valeur de HHC on commence à
s'occuper de l'affichage de la ligne. Cette valeur permet de centrer horizontalement l'affichage sans modifier la valeur des
autres registres.$FF82A0
...$FF82AC
: Registres de contrôle verticaux:
$FF82A0
(mot): VFC (Vertical Frequency Counter): Registre accessible uniquement en lecture, c'est un
décompteur de 'demi-lignes'.$FF82A2
(mot): VFT (Vertical Frequency Timer): La valeur de ce registre est le nombre de demi-lignes moins
une affichées entre deux synchros VBL. Cette valeur est recopiée dans VFC à chaque VBL.$FF82A4
(mot): VBB (Vertical Border Begin): Position en demi-lignes de la bordure basse de l'écran.$FF82A6
(mot): VBE (Vertical Border End): Position en demi-lignes de la bordure haute de l'écran.$FF82A8
(mot): VDB (Vertical Display Begin): Position en demi-lignes du début de l'affichage graphique
vertical.$FF82AA
(mot): VDE (Vertical Display End): Position en demi-lignes de la fin de l'affichage graphique vertical.$FF82AC
(mot): VSS (Vertical Synchro Start): Valeur de VFC qui définit le départ de la gestion de l'affichage
vertical. En ne modifiant que sa valeur, on peut donc recentrer verticalement l'affichage.$FF82C2
(mot): VCO (Video Control): Ce champ de 4 bits permet de choisir les définitions d'affichage
horizontales et verticales. Voici la description de ces bits:
$FF82C0
(mot): RCO: Ce registre 'fourre-tout' est un champ de bits dont la signification est la suivante:
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.
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!
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...