★ CODING ★ AMSLIVE ★ AMSLIVE n°20 - CRTC BIEN DIGÉRÉ ★ |
AMSLIVE n°20 - CRTC bien Digérer | Coding Amslive |
Amis lecteurs, vous ne me voyez pas, mais nous allons apprendre aujourd'hui ou demain comment passer d'une position d'écran à une autre de façon propre.Par propre, j'entends « sans décrochage de synchro et rétablissement laborieux de l'image que cela implique ». Par la fenêtre J'entends la complainte des canards. Pour avoir une idée précise du problème incriminé, remémorez-vous Not Dead Démo d'Arkos, ou encore GPÀ 2K2 : chaque nouvel écran apparaît en défilant (ou « tournoyant », selon une terminologie obsolète) à une vitesse dépendant du réglage V-Hold du moniteur (*). HISSEZ HAUT Supposons que nous voulions élever l'écran de 6 lignes de caractères. C'est un bon chiffre. Le premier réflexe est de charger le registre 7 à 36, puisqu'il vaut 30 par défaut. « Retarder la synchro de 6 lignes revient à hisser l'écran d'autant », se dit in petto le fougueux bidouilleur (quand bien même les manuels de bienséance le déconseillent). Cela est vrai, dans la mesure où le moniteur se cale sur ladite synchro. Mais, il faut bien comprendre qu'au moment du changement, le signal de synchro est envoyé 6 lignes plus bas que d'habitude, c'est-à-dire en plein balayage écran. Ceci explique qu'on entrevoit alors la bande noire (VBL) caractéristique. Outre la contrainte que cette solution impose, cela ne résout aucun des points suivants : (*) Vous pardonnerez au passage cet anglicisme, mais parler d'écran ici aussi aurait semé la confusion, y compris chez les esprits les plus vaillants. - le repositionnement de l'écran peut s'avérer fort lent (je le répète, cela dépend du réglage V-Hold). Bref, il ne sert à rien de faire l'autruche pendant un lancer de grenade, surtout si on sort la tête avant qu'elle explose. BASE EN HAUSSE Remonter l'écran de 6 lignes, cela signifie le faire débuter 6 lignes plus tôt. Un nouvel écran ne commence que quand le précédent est terminé. Il faut donc qu'un écran fasse, le temps de la transition, 6 lignes de moins. CQFD. Au cas où vous ne l'auriez pas remarqué, je parle d'écrans du point de vue CRTC : la première ligne est celle à laquelle l'affichage commence. Le border supérieur représente la fin de l'écran précédent. NB : au cas où vous l'auriez remarqué, aussi. Variante : Dans un magasin de fringues, un vendeur s'approche de deux chouettes nénettes (ce détail ne revêtant aucune importance dans l'histoire) : — Attendre V-Sync. — Charger R4 — Attendre nouvel écran (tempo de 3 lignes -24 * 64 NOPs).
On se rend compte que le changement de R7 intervient ici comme compensation : le nouvel écran démarrant 6 lignés plus tôt, on retarde la synchro de 6 lignes, de façon à ce qu'elle se produise au bon moment. Remarque : on suppose R7=30 par défaut. Évidemment, si un grand malin modifie la configuration du CRTC avant de lancer votre programme, ça ne marchera plus. Attention ! Beware ! Nota hem et tutti quanti ! De manière générale, quand on entre dans une simple boucle d'attente V-Syne* il §0 possible que la V-Sync ait déjà commencé. Celle-ci pouvant durer jusqu'à 16 lignes, il y a une grande marge d'incertitude. Dans l'exemple présenté, ce n'est pas gênant, mais certains cas demanderont de précéder la boucle par une attente de non-Vsync. RETOUR A LA NORMALE À titre d'exercice, établissez la transition inverse (R7 = 36 à R7 = 30). Voici une solution : — Attendre V-Sync. . R4 — Attendre nouvel écran. À propos, pourquoi nous autres humains, à l'instar de la plupart des animaux, possédons-nous un et un seul plan de symétrie ? HORIZONTALEMENT Pour recentrer un écran horizontalement, il faudrait faire le même travail, en jouant avec les registres 0 et 2 cette fois, le temps d'une ligne. En effet, la re-synchronisation horizontale (base des fameux screen-waggles) se trouvera complètement masquée par la VBL.
|