require("../global.php"); entete(); ?>
Tout d'abord, je voudrais vous signaler que si vous n'avez pas trouvé le répertoire 'WARRANT' dans le dernier Reporter, eh bien c'est normal:
[X] Je suis désolé.
[X] C'est pas de ma faute.
[ ] Ca ne se reproduira pas.
'Z2.asm', la source du dernier numéro est donc dans le répertoire 'WARRANT' de ce numéro, avec 'Z3.asm'. Enfin normalement. Si il n'y a rien, écrivez au journal, on fera un hors-série avec toutes les sources diparues.
Assez rigolé, passons aux choses sérieuses(?): Ca vous dirait un p'tit scroll en mode texte ?
Nous allons reprendre une dernière fois 'Zdir', qui va nous donner le prétexte de la causerie de ce jour. Comme vous l'avez surement remarqué, le scrolling en mode texte se fait par blocs de caractères.
C'est moche et saccadé,mais pour voir du texte ce n'est pas gênant. Pourtant,les cartes VGA possèdent les registres nécéssaires à la réalisation des "smooth-scrolling" faciles.
La VGA a des pointeurs qui contiennent l'adresse mémoire où elle va aller chercher les informations à afficher. Donc, en modifiant la valeur contenue dans ces pointeurs, on modifie l'affichage à l'écran SANS toucher au contenu de la mémoire.
Si la VGA prenait ses informations dans une zone statique, il faudrait pour effectuer un scrolling réécrire toute la mémoire vidéo à chaque déplacement, en décalant légèrement son contenu (plus ou moins , selon la fluidité désirée).
Alors qu'avec les pointeurs, il n'y a que quelques valeurs à modifier.
Malheureusement, on ne peut pas pointer où l'on veut dans la mémoire:
Certaines zones sont dédiées à l'affichage gfx (0a000:0) et texte (0b800:0). On peut juste déplacer les pointeurs à partir de ces bases de départ (la base de départ est déterminée automatiquement par le matériel, selon que vous vous trouvez en mode texte ou graphique).
Vous ne vous êtes jamais demandé pourquoi la série des 'Ultima' ramait à ce point ? Essayez de faire un scroll multidirectionnel avec seulement 64Ko de mémoire, et des "sprites" qui se baladent en même temps! Pas évident...(en plus,c'est écrit en "Honivo ++",alors tu parles...)
Le principe est le même en mode texte: Vous pouvez pointer où vous voulez, du moment que cela reste compris dans les 32Ko dédiés à ce mode (et qui sont largement suffisant: avec 32 Ko,on à 8 pages en 80*25 (ceux qui ne suivent pas peuvent [doivent] se reporter au dernier Reporter)).
Et où trouver ces pointeurs ? Dans le CRTC de la VGA.
+-+-+-+-+-+-+-+-+ | | | | | | | | | CRTC, Reg 0Ch (Start Adress High) +-+-+-+-+-+-+-+-+ 7 0 <- Bits +-+-+-+-+-+-+-+-+ | | | | | | | | | CRTC, Reg 0Dh (Start Adress Low) +-+-+-+-+-+-+-+-+La combinaison de ces deux registres forme une adresse d'offset sur 16bits correspondant à la mémoire pointée actuellement.
La faute revient au mode de gestion du texte: dans ce mode le registre CRTC donnant la hauteur de chaque ligne (en pixels) contient la valeur correspondant à la hauteur d'un caractère (en mode graphique,ce registre est égal à 0). Hé oui, une ligne n'est pas forcément égale à un raster !
Ce registre a pour numéro 09h, et pour nom 'Maximum scan line'. Il s'occupe également de quelques autres trucs,sans importance pour l'instant. La hauteur d'une ligne (en pixels) est contenue dans les bits de 0 à 5,et doit être diminuée de 1 (c'est pour ça que le mode graphique à une valeur égale à zéro).
+-+-+-+-+-+-+-+-+ | | | | | | | | | CRTC, Reg 09h (Maximum Scan Line) +-+-+-+-+-+-+-+-+ 7 6 5 0 <- Bits | | | | | +-----Bit 9 de "Start Vertical Blanking" | +--------Bit 9 de "Line compare" +-----------Dédoublement 200 lignesLorsqu'en mode texte on effectue avec les pointeurs un déplacement d'une ligne (160 octets), le CRTC effectue un déplacement de ce qu'on lui a donné comme étant une ligne: un bloc de 8 lignes d'un coup! (à noter que le nombre 8 représente une valeur standart,mais que la hauteur d'un caractère peut être égale à 14 ou 16 points)
Et ne pensez pas qu'il suffit de mettre à zéro le registre 09h, car cela désorganise l'affichage (un beau foutoir,même!). Il doit bien y avoir une astuce, mais je ne la connais pas.
D'abord parce que vous vous en resservirez quand vous voudrez faire de beaux scrolls en mode graphique.
Ensuite, parce que la méthode que je vais exposer dans quelques instants parait idéale, mais ne être utilisée qu'en mode texte: elle est bien plus lente que la simple reprogrammation de deux pointeurs.
Pour un scroll fluide en mode texte,vous n'avez d'autres choix que de passer par le registre 'pel panning vertical'. Vous envoyez dans ce registre une valeur correspondant au nombre de lignes que vous souhaitez décaler.
Ce registre est également présent dans le CRTC:
+-+-+-+-+-+-+-+-+ |X|X|X| | | | | | CRTC, Reg 08h (Vertical Pel Panning) +-+-+-+-+-+-+-+-+ 7 5 0 <- Bits (Note: Les bits 5 à 7 sont réservés et doivent être laissés à zéro)Ce registre ne doit pas être confondu avec les registres pointant sur la mémoire. Il ne pointe sur rien du tout, et contient juste une valeur de décalage, à partir de la position actuelle.
Il faut faire une temporisation: laissons tout de suite tomber l'idée d'une boucle vide, applicable uniquement avec les ordinateurs fonctionnant tous à la même vitesse.
On peut à la rigueur reprogrammer le timer,mais c'est se donner beaucoup de peine pour pas grand chose. Cette méthode est surtout utilisée dans les démos,lorsque l'on a besoin d'appeler une routine à intervalles réguliers (ex:un player de modules).
Je vais vous exposer une méthode à mon avis bien plus simple.
Vous savez tous qu'un moniteur VGA, dans les résolutions "normales", a une fréquence de balayage de 60 ou 70 Hertz,selon le mode affiché. Dans le cas du mode texte 80*25 (monochrome et couleur),la fréquence est de 60 Hz.
Cela signifie que 60 fois par seconde, le rayon électronique parcourt l'intégralité de l'écran (en mode non-entrelacé, ce qui est le cas ici). Lorsque le rayon arrive en bas de l'écran, il est désactivé, et ramené en haut à gauche de l'écran.
L' état du rayon (activé/désactivé) peut être lu dans le bit 3 du registre VGA 3DAh "Input Status 1". Le bit 3 correspond donc à l'état du "retrace vertical".
La vitesse de balayage restant constante quelque soit le processeur, il suffit de tester si le "retrace vertical" est positionné à 1 (si c'est le cas,le rayon est désactivé). Il suffit d'attendre après chaque utilisation du "Pel Panning" un VBL (="Vertical Blank":retrace vertical), et de continuer ensuite le programme. Vous avez ainsi la garantie que le programme tournera à la même vitesse sur toutes les bécanes.
Voici le code magique:
MOV DX,3DAh @VBL1: IN AL,DX TEST AL,8 JNE @VBL1 ;on attends le retrace @VBL2: IN AL,DX TEST AL,8 JE @VBL2 ;on attends la fin du retrace
"Zdir" va maintenant effectuer un "smooth-scrolling" (scrolling au pixel près).
Nous allons procéder de la manière suivante:
* Tester si on est en bas de l'écran - Si on est en bas de l'écran: -> Mettre le prochain truc à afficher au début de la 2ème page vidéo (donc on ne voit rien pour l'instant) -> Faire un scroll avec le Pel-Panning, afin de se positionner doucement sur le texte de la 2ème page (heureusement, les pages se suivent en mémoire) -> Une fois que c'est fait ,tout recopier une ligne plus haut: +----------------+ +----------------+ +-|xxxxxxxxxxxxxxxx| |yyyyyyyyyyyyyyyy| Portion | |yyy PAGE 1 yyyyy| |yyy PAGE 1 yyyyy| visible | |yyyyyyyyyyyyyyyy| recopie |zzzzzzzzzzzzzzzz| à l'écran | +----------------+ -> 1 ligne -> +----------------+ +-|zzzzzzzzzzzzzzzz| plus haut | | | PAGE 2 | | PAGE 2 | | ¦ | | +----------------+ +----------------+ -> On peut se repositionner sur le haut de la page 1Bon... Vous avez lancé le programme, et bien que le scroll soit fluide, vous avez des "sauts" à l'écran: c'est normal ! On travaille en une seule page. Donc,la recopie de l'écran ,puis le repositionnement des pointeurs est visible à l'écran et se traduit par un "saut".
J'ai essayé de travailler sur deux pages, mais le registre "Pel Panning" pose problème dans la commutation. J'ai cherché, mais pas trouvé: ce qui est marrant, c'est que les scrolls ne posent pas de problèmes en mode gfx.
Donc: désolé. Pour la peine, on passe au mode graphique dans le prochain Rep' ! (En fait,je l'ai fait EXPRES pour laisser tomber le mode texte :-> ) La prochaine fois, je vous montrerai comment faire des effets sympas avec les registres de la VGA.
====================================================================== Amiga pas encore mort!! Allez ESCOM, fait nous une belle bécane avec un Power-PC, un DSP AT&T à accès partagés, 40 canaux DMA, un Blitter 32 bits, et des modes graphiques mixtes (bitplans/chunky). Que l'on enterre une bonne fois les dinosaures de "Jurassic ParC" ! ====================================================================== PiedDePage(); ?>