home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 9 / CD_ASCQ_09_1193.iso / news / 557 / animate / animage.txt < prev    next >
Text File  |  1993-09-03  |  27KB  |  443 lines

  1. ┌───────────────────────────────────────────────────────────────────────────┐
  2. │ ANIMAGE: Unité pour Turbo Pascal permettant d'animer des sprites, de faire│
  3. │          des scrolls, zooms, cyclages, splits, en VGA 256 couleurs.       │
  4. │                                                                           │
  5. │ Info...: Ce package est un produit shareware qui ne doit pas être modifié.│
  6. │          Si vous en obtenez  entière satisfaction  ou si vous  l'utilisez │
  7. │          souvent, effectuez donc votre contrat moral en envoyant un chèque│
  8. │          de 50FF (vous recevrez une licence d'utilisation) à l'adresse:   │
  9. │                                                                           │
  10. │          Patrick RUELLE                                                   │
  11. │          163 rue de Charonne                                              │
  12. │          75011 Paris                                                      │
  13. │          (France)                                                         │
  14. │                                                                           │
  15. │ CE FICHIER CONTIENT DES INFOS GENERALES SUR LES TECHNIQUES D'ANIMATION ET │
  16. │ EGALEMENT LES INFOS DETAILLEES SUR LES CONSTITUANTS DE L'UNITE "ANIMAGE". │
  17. └───────────────────────────────────────────────────────────────────────────┘
  18.  
  19.  
  20.  
  21. 1 INTRODUCTION
  22.  
  23.         Voici un domaine qui demeure encore quelque peu fermé, aussi bien
  24.   parce que l'information n'est pas toujours facile à trouver soi-même que 
  25.   par le fait que de nombreux programmeurs pratiquant ce type de technique
  26.   préfèrent conserver leurs découvertes à l'abri des nombreux intéressés. Cet 
  27.   article est très loin d'être exhaustif et n'a pour unique prétention que 
  28.   d'expliquer le plus simplement du monde (du moins je l'espère!) certaines
  29.   techniques fondamentales d'animation graphique.
  30.  
  31.  
  32.  
  33. 2 PRINCIPES
  34.  
  35.   a) LA CARTE VGA      
  36.  
  37.         Tout d'abord, il faut savoir qu'une carte VGA est constituée de  
  38.   plusieurs éléments: des registres généraux, le contrôleur CRT (Cathode Ray
  39.   Tube), le séquenceur, le contrôleur d'attributs et le DAC (Digital/
  40.   Analogic Converter). Parmi les registres généraux on peut d'ailleurs 
  41.   trouver le registre 3DAh contenant des informations sur la VBL ou la HBL. 
  42.   Le contrôleur CRT (25 registres) a par contre la difficile tâche de 
  43.   configurer convenablement l'écran selon les modes graphiques utilisés. Le 
  44.   séquenceur (5 registres) permet de convertir les accès à la RAM vidéo en 
  45.   les dirigeant vers les bons plans de bits; le rafraîssement de la RAM vidéo 
  46.   fait également partie de son travail. Puis, finalement le DAC qui convertit 
  47.   les codes couleur digitaux en signaux analogiques. Que peut-on trouver 
  48.   d'autre? Et bien, de la RAM vidéo, et ce de 256Ko jusqu'à généralement 1 ou 
  49.   2Mo, voire plus.
  50.  
  51.  
  52.   b) LES ANIMATIONS : GENERALITES
  53.  
  54.         Le PC a souvent été l'enfant pauvre en matière d'animation  
  55.   (surtout face à des concurrents comme l'Amiga ou l'Atari). Cependant, ce
  56.   handicap tend un petit peu moins à se remarquer grâce à l'avènement de
  57.   cartes graphiques assez performantes et de PC puissants (malgré certains
  58.   goulots d'étranglement...). Imaginons par exemple le déplacement d'un
  59.   petit bonhomme sur un écran. Qu'est-ce qui crée l'illusion de l'animation?
  60.   Et bien, exactement le même phénomène que l'on retrouve lors de la 
  61.   projection d'un film cinématographique. Différentes étapes d'animation du 
  62.   petit bonhomme sont en fait affichées successivement (et suffisamment 
  63.   rapidement) afin de créer l'illusion du mouvement.
  64.  
  65.         En informatique, chaque étape d'animation d'un objet est définie dans
  66.   une zone rectangulaire que l'on appelle un Sprite. Généralement cette zone
  67.   est donc un peu plus grande que le dessin de l'objet (puisque les contours 
  68.   des dessins sont rarement rectangulaires!). Néanmoins, il existe un cas de
  69.   figure où des dessins remplissent complètement une zone rectangulaire; dans
  70.   ce cas on les appelle plus communément des Tiles, c-à-d des entités de base 
  71.   permettant par exemple de construire un décor entier en réduisant par la 
  72.   même occasion son encombrement mémoire à ces quelques Tiles servant à 
  73.   décrire le décor (comme dans Mario Bros...).
  74.  
  75.         Mais revenons plutôt à nos sprites. Supposons que nous ayons à notre 
  76.   disposition en mémoire centrale un ensemble de données constituant un      
  77.   sprite. Pour l'afficher à l'écran il faut alors transférer cette zone 
  78.   rectangulaire complète vers la mémoire vidéo. Mais que se passe t-il si 
  79.   un décor quelconque se trouvait déjà à cet emplacement? Et oui! on aura bel
  80.   et bien un recouvrement rectangulaire du sprite sur le décor. Si la couleur  
  81.   de fond du sprite est le noir, alors toute la partie noire du sprite qui  
  82.   est inoccupée par le dessin apparaîtra à l'écran en créant un effet
  83.   indésirable! Pour pallier à cet inconvénient il faut pouvoir tranférer les
  84.   pixels décrivant uniquement le dessin et non ceux qui décrivent le fond.
  85.   Dans ce cas on transfèrera tous les pixels du sprite qui ne sont pas de 
  86.   couleur noire (donc en masquant le fond).
  87.  
  88.   
  89.   c) LES ANIMATIONS : TECHNIQUES
  90.  
  91.         La plupart des programmes qui effectuent de nombreuses animations
  92.   (démos, jeux) utilisent généralement des modes vidéo permettant de 
  93.   disposer de plusieurs pages graphiques au sein de la mémoire vidéo.
  94.   Dans l'univers des PC il existe un mode non documenté appelé mode X qui 
  95.   permet de configurer les cartes VGA standards (à condition de disposer 
  96.   d'au moins 256Ko) de manière à obtenir en quelque sorte des variantes bien 
  97.   plus performantes que le mode 13h classique. Il est ainsi possible de 
  98.   disposer de 4 pages en 320 X 200, 2 pages en 320 X 400, 3 pages en 
  99.   360 X 240, 1 page en 360 X 480, etc... Bien évidemment on y perd quelque
  100.   part puisque du coup l'adressage ne sera plus linéaire; mais l'intérêt de 
  101.   pouvoir disposer de plusieurs pages rattrappe vite ce soit disant 
  102.   inconvénient.
  103.  
  104.         Quel intérêt a t-on de disposer de plusieurs pages en mémoire vidéo?
  105.   C'est très simple; Tout d'abord il s'agira d'autant de place en mémoire
  106.   centrale qui sera économisée puisqu'avec 4 pages on pourra allègrement en
  107.   attribuer une première pour les sprites et une deuxième pour les décors par 
  108.   exemple. Supposons que les 4 pages soient numérotées de 0 à 3; les sprites 
  109.   et les décors seront respectivement attribués aux pages 2 et 3; Les deux 
  110.   premières pages vont donc pouvoir nous servir à effectuer le travail 
  111.   d'animation proprement dite selon une technique bien connue du "Two Pages
  112.   Buffering". 
  113.   
  114.         En fait, comme une seule page sur les quatre ne peut être qu'activée à 
  115.   la fois à l'écran (par exemple la page 0), on effectuera la construction 
  116.   du décor et les positions des sprites sur la page cachée (la page 1).
  117.   Ensuite, on bascule cette page à la place de l'autre pour la rendre visible
  118.   à l'écran (en ayant soin d'attendre la VBL pour éviter tout problème de 
  119.   parasitage tel que le flicking). Maintenant, on construit le décor et les 
  120.   étapes d'animation suivantes sur la page 0, etc... On construit donc 
  121.   alternativement une page pendant que l'autre est active à l'écran, puis on
  122.   bascule. Il s'agit de loin la technique la plus usitée! De plus les  
  123.   transferts de RAM vidéo vers la RAM vidéo sont assez rapides. Par contre
  124.   dans un mode ne comportant par exemple que de 2 pages il faudra se résoudre 
  125.   à mémoriser les décors et les sprites en mémoire centrale.
  126.  
  127.         Il est souvent plus rapide de reconstruire entièrement ou 
  128.   partiellement l'écran suivant que de sauvegarder les portions de décors qui
  129.   seront masqués par des sprites. En effet, puisque l'on peut supposer 
  130.   pouvoir conserver par exemple un décor entier dans une autre page, il 
  131.   suffira d'écraser les sprites de la page devenue inactive par les zones 
  132.   rectangulaires du décor à ces endroits précis (il n'est donc pas nécessaire
  133.   dans ce cas de sauvegarder les zones rectangulaires des endroits où seront
  134.   affichés les sprites!). Evidemment, pour un décor qui se déplace cela se
  135.   complique, mais en réfléchissant un peu on arrive assez vite à trouver des
  136.   astuces permettant de s'en sortir assez facilement. Imaginez devoir 
  137.   sauvegarder des tas de Tiles dynamiquement à l'aide des routines
  138.   d'allocation du DOS... Le temps perdu est énorme et le but est toujours de
  139.   privilégier une méthode efficace et rapide même au détriment de 
  140.   l'encombrement mémoire (ce qui n'est plus réellement un problème car
  141.   actuellement on peut facilement disposer de 600Ko sous DOS).
  142.  
  143.         Une dernière petite chose à ajouter. Il est également possible de
  144.   créer des effets d'animation en faisant cycler des sous-ensembles de 
  145.   couleurs de la palette. Pour ce faire il suffit de décaler chaque couleur
  146.   (donc les 3 composantes) à la place de la couleur suivante (ou précédente 
  147.   selon le sens du cyclage), et la dernière du sous-ensemble prenant alors
  148.   évidemment la place de la première (ou inversement selon le sens).
  149.  
  150.  
  151.  
  152. 3 CHOIX TECHNIQUES
  153.  
  154.         Dans le cadre de cet article et par souçi de simplicité il a été
  155.   convenu d'utiliser le mode 13h du BIOS vidéo. Ce mode est en fait un
  156.   sous-système du mode VGA appelé MCGA (Memory Controller Gate Array). Il
  157.   a été porté sur les petits modèles PS/2 d'IBM ne se contentant que de
  158.   64Ko de RAM vidéo. Les cartes graphiques dotées d'une mémoire de capacité
  159.   supérieure sont évidemment compatibles avec ce mode. Donc si vous disposez
  160.   d'une capacité de 256Ko ou plus, l'activation de ce mode via le BIOS ne
  161.   vous permettra pas d'utiliser plus de 64Ko de RAM vidéo. Pourquoi? Et bien
  162.   vraisemblablement pour garantir la compatibilité avec les anciens modèles
  163.   dotés uniquement de 64Ko (quel lourd boulet que cette sempiternelle
  164.   compatibilité!). Cela dit, comme nous l'avons évoqué précédemment il est
  165.   entièrement possible de disposer de plusieurs pages de 64000 octets ou plus
  166.   à condition de programmer certains registres soi-même, c-à-d sans passer
  167.   par le BIOS (c'est le fameux mode X), mais ceci dépasse le cadre de cet
  168.   article.
  169.  
  170.         Mais revenons alors à ce mode MCGA. Que possède t-il d'intéressant?
  171.   Outre une assez faible résolution de 320 * 200 pixels il permet néanmoins
  172.   d'afficher 256 couleurs simultanément à l'écran! Comme 256 éléments sont 
  173.   codifiables sur 1 octet et que 320 * 200 font 64000 points, un écran 
  174.   représente donc 64000 octets adressables depuis le segment A000h. La grande 
  175.   quantité de couleurs compensera en quelque sorte la faible résolution de ce 
  176.   mode. Chacune des 256 couleurs est codifiée par des proportions de 
  177.   composantes de Rouge, de Vert et de Bleu (RVB), et chaque composante 
  178.   couleur accepte une codification sur 6 bits (de 0 à 63). Il est donc 
  179.   possible de choisir 256 parmi 2^6 * 2^6 * 2^6 c-à-d 256 parmi 262144 
  180.   couleurs possibles (suffisant n'est-ce pas?). Mais il y a encore plus 
  181.   intéressant! Les 64000 octets de l'écran sont de plus adressables de manière 
  182.   complètement linéaire (en fait il s'agit d'un leurre dû à l'activation du 
  183.   mode Chain4 et Odd/Even du registre 4 du séquenceur par le BIOS, de même que
  184.   chaque ligne de l'écran est en fait dédoublée comme un faux mode 320 * 400,
  185.   mais ce serait trop long à expliquer...).
  186.  
  187.         Finalement, quels sont les avantages que l'on peut tirer de ce mode?
  188.   En fait, une extrême simplicité de l'adressage (écrire un pixel aux
  189.   coordonnées x et y avec une couleur correspondant aux composantes RVB n°26 
  190.   sur les 256 actives sera traduit en PASCAL par : Mem[$A000:320*y+x]:=26;).
  191.   Attention!, lors de l'activation du mode MCGA, une palette système de 256
  192.   couleurs est utilisée par défaut. En plus, comme dans ce mode on ne dispose  
  193.   que d'une page graphique (donc toujours active à l'écran!) il faudra 
  194.   donc prendre garde à toujours attendre la VBL avant d'actualiser les parties
  195.   de l'écran qui le nécessitent! Cependant on aura tout le loisir de
  196.   travailler parallèlement avec des écrans virtuels de 64000 octets (pour
  197.   palier à la présence d'une page graphique unique) pour effectuer toutes
  198.   sortes de mémorisations (sprites et décors) et de traitements cachés. 
  199.   Rappellons aussi que selon le moniteur il peut y avoir en général entre
  200.   50 et 70 VBL par seconde; Ainsi le couple constitué du moniteur et de la
  201.   carte graphique est-il déterminant pour la vitesse des animations (un
  202.   moniteur avec un rafraîchissement de 70hz et une carte vidéo assez lente
  203.   donneront d'assez mauvais résultats).
  204.  
  205.  
  206.  
  207. 4 LE PROGRAMME
  208.   
  209.   a) L'UNITE ANIMAGE 
  210.   
  211.         Afin d'être certain de pouvoir faire fonctionner le programme sur les 
  212.   IBM PC comportant un adaptateur muni uniquement de 64Ko on utilise 
  213.   la fonction 0 (et sous-fonction 13h pour activer le mode MCGA) du BIOS 
  214.   video (10h). Le seul inconvénient réside dans le fait que si ce mode n'est 
  215.   pas disponible il n'y a aucune information en sortie permettant de s'en 
  216.   rendre compte. Il faut alors utiliser la fonction Fh (toujours avec la 
  217.   sous-fonction 13h) pour lire si le mode 13h a effectivement été activé.
  218.   C'est cette solution qui a été utilisée pour la fonction Activation_MCGA.
  219.   Pour la procédure Activation_Texte (qui permet de revenir au mode texte) 
  220.   seul le principe de la première étape est suffisant puisque l'on dispose
  221.   forcément au minimum du mode texte!
  222.  
  223.         La procedure Attente_Synchro consiste à examiner le registre général
  224.   3DAh. Si le bit 0 est à 1 alors une HBL (Horizontal BLanking) est en cours.
  225.   Et si le bit 3 est à 1 alors une VBL (Vertical BLanking) est en cours. Il
  226.   suffit donc d'attendre qu'il n'y ait plus de HBL après la VBL, ce que fait
  227.   donc la procedure Attente_Synchro.
  228.  
  229.         La procédure Ecriture_Palette permet d'activer une palette de 256
  230.   couleurs ou partie de palette personnelle. Pour cela on considère que
  231.   chaque composante Rouge, Vert et Bleu doit être codée sur un octet. Comme
  232.   256 X 3 octets font 768 octets alors le tableau passé en paramètre devra
  233.   obligatoirement faire 768 octets de telle sorte à ce que les triplets de
  234.   composantes couleur se suivent linéairement (RVBRVB...RVB). Le premier 
  235.   triplet correspond à la couleur 0 et le dernier à la couleur 255. Pour 
  236.   modifier 32 couleurs à partir de la couleur 128 (les 768 octets étant 
  237.   mémorisés dans le tableau PALET de 0 à 767) on écrira :
  238.  
  239.         Ecrire_Palette(PALET[128*3],128,32);  
  240.   
  241.         Pour ce faire on utilise les registres du DAC 3C8h et 3C9h. Sur le 
  242.   port 3C8h on indique le code couleur à modifier et sur le port 3C9h on 
  243.   écrit successivement chaque proportion de Rouge, Vert et Bleu (de 0 à 63). 
  244.   La procédure Ecriture_Couleur effectue le même type de travail mais en ne 
  245.   modifiant qu'une couleur à la fois, et ce de manière directe (pas de 
  246.   tableau). Il est également possible de connaître les composantes d'une 
  247.   couleur donnée en inscrivant sur le port 3C7h le numéro de couleur puis en 
  248.   lisant successivement sur le port 3C9h chaque proportion de Rouge, Vert et 
  249.   Bleu (non implémenté dans l'unité). Cette méthode est extrêment plus rapide
  250.   que d'utiliser les fonctions adéquates du BIOS (essayez donc de faire un
  251.   fading propre d'une image de 256 couleurs via le BIOS!).
  252.  
  253.         La routine Ecriture_Pixel ne fait rien d'autre que de calculer 
  254.   l'offset équivalent à 320 * y + x afin d'afficher le pixel avec la couleur
  255.   souhaitée. Pour tout ce qui est animation la rapidité est un facteur
  256.   absolument indispensable. Ainsi quand on sait combien certaines 
  257.   instructions assembleur sont coûteuses en temps machine (un MUL équivaut
  258.   environ à 80 cycles machines!) il faut autant que possible les éviter.
  259.   Comme 320 = 256 + 64 on peut alors éviter l'opération de multiplication
  260.   en faisant un XCHG de y (ce qui revient à le décaler de 8 bits à gauche et 
  261.   donc de le multiplier par 256 : 256 * y), en lui ajoutant ensuite ce 
  262.   résultat mais décalé de 2 bits à droite (256 * y + 64 * y), puis en 
  263.   ajoutant finalement x et le tour est joué!. On gagne apparamment quelques 
  264.   dizaines de cycles... Sur le même principe il sera très facile de 
  265.   concevoir une routine Lecture_Pixel qui donnera le code couleur d'un pixel
  266.   donné (non implémenté dans l'unité).
  267.  
  268.         Dans le contrôleur CRT on dispose du registre Dh lequel
  269.   permet de définir l'adresse d'offset qui servira d'adresse d'origine sur
  270.   l'écran physique. Par défaut, dans ce mode on ne pourra effectuer un 
  271.   scrolling horizontal que par 4 points à la fois. Les données s'énoncent 
  272.   donc par 1/80ème d'unité à la fois (on remarquera qu'à raison de 80/80ème 
  273.   d'unité à la fois on transforme le scrolling horizontal en scrolling 
  274.   vertical puisque l'offset est alors décalé de 320 pixels à la fois et 
  275.   l'image semblera ainsi se déplacer vers le haut!). Il ne faut surtout pas 
  276.   oublier que l'adressage est linéaire, donc que le point qui suit 
  277.   immédiatement le dernier d'une ligne est en fait le premier de la ligne 
  278.   suivante; et quant à celui se trouvant juste après le dernier point de la 
  279.   dernière ligne de l'écran il s'agit du premier point de la première ligne
  280.   de l'écran... Gare au phénomène de wrapping (enroulement). Quoiqu'il en soit
  281.   la routine est extrêmement simple et est effectuée par la procédure
  282.   Défilement_Octet.
  283.  
  284.         Pour entreprendre un dédoublement de l'écran il faut programmer
  285.   plusieurs registres du contrôleur CRT. Il faut programmer le registre 18h
  286.   (line compare) afin de préciser le numéro de ligne à partir duquel
  287.   l'écran sera dédoublé. Mais le contrôleur considère ici la résolution dans 
  288.   son mode natif c-à-d en 320 X 400 (puisque chaque ligne est en fait
  289.   dédoublée). Si par exemple on désire dupliquer les 100 premières lignes 
  290.   de 0 à 99 en 100 à 199, il ne faudra pas préciser la valeur 100 mais le
  291.   double (200). De plus en faisant varier les valeurs de 399 à 0 on aura   
  292.   l'impression qu'une deuxième page (identique à la première) vient recouvrir 
  293.   la première de bas en haut! Donc pour superposer exactement les deux images 
  294.   il suffit de préciser la valeur 0. Mais le registre 18h n'a que 8 bits et 
  295.   pour représenter un nombre de 0 à 399 il faut utiliser le bit 4 du registre 
  296.   7 (le registre overflow = cuisine pour assurer les lignes supérieures à 
  297.   256!). De même un 10ème bit peut servir pour des résolutions supérieures, 
  298.   le bit 6 du registre 9 (Max scan Line = on bouche les trous comme on peut!).  
  299.   
  300.         En ce qui concerne la routine Zoom_Vertical l'astuce consiste à 
  301.   changer la résolution verticale toujours à l'aide du registre 9. Seuls les 
  302.   bits 0 à 4 sont attribués à cette fonctionnalité.
  303.  
  304.         Viennent maintenant les deux procédures proprement dites concernant
  305.   l'animation de sprites. La première (Copie_Bloc_Normal) effectue une copie
  306.   d'une zone mémoire (centrale ou vidéo) vers une zone mémoire (centrale ou 
  307.   vidéo) en conservant le fond du sprite. La deuxième effectue le même
  308.   travail mais sans copier le fond (c-à-d la couleur 0 par convention puisque
  309.   par défaut elle est de couleur noire). Ces routines ne travaillent en fait
  310.   qu'avec des pointeurs (une toute petite contrainte si l'on peut dire...).
  311.   Il est vivement conseillé de travailler avec des pointeurs sur des zones de 
  312.   64000 octets linéaires (et non pas 320 X 200!) pour respecter une certaine 
  313.   cohérence avec la taille de l'écran physique (et donc pouvoir 
  314.   travailler sur des écrans virtuels). On part ainsi du principe que dans 
  315.   un ou plusieurs écrans virtuels se trouvent les différents sprites et/ou 
  316.   éléments du décor. Ces sprites sont donc mémorisés de la même façon qu'ils 
  317.   ont été conçus à l'aide d'un logiciel de dessin du type Deluxe Paint. Ainsi 
  318.   pour transférer un sprite de 20 pixels de large et de 40 pixels de haut qui 
  319.   se trouve aux coordonnées x1=0 et y1=32 de l'écran virtuel virt^ vers 
  320.   l'écran physique aux coordonées x2=100 et y=90 (sans masquage) il faudra 
  321.   écrire :
  322.  
  323.      Copie_Bloc_Normal(0,32,20,40,100,90,Seg(virt^)+Ofs(virt^),$A000);
  324.  
  325.         De même pour effectuer un traitement caché de mémoire centrale à 
  326.   mémoire centrale entre deux écrans virtuels appelés virt1^ et virt2^ on
  327.   écrira (on a omis volontairement les 6 premières valeurs) : 
  328.  
  329.      Copie_Bloc_Normal(,,,,,,Seg(virt1^)+Ofs(virt1^),Seg(virt2^)+Ofs(virt2^));
  330.  
  331.         Une dernière chose reste à préciser: La routine de copie avec masquage
  332.   effectue un transfert octet par octet mais celle de copie normale 
  333.   effectue ce transfert mot par mot (toujours dans un souçi d'optimisation).
  334.   Il faut dans ce cas toujours veiller à transférer une zone rectangulaire 
  335.   dont la largeur soit divisible par deux (paire).
  336.  
  337.   
  338.   b) LE PROGRAMME ANIMDEMO
  339.  
  340.         Voici enfin la description du programme de démonstration utilisant
  341.   l'unité ANIMAGE!!! (et pourtant je suis sûr d'avoir oublié de dire des tas
  342.   de choses...).
  343.  
  344.         Que fait donc le programme ANIMDEMO? 
  345.         
  346.      1) Apparition d'un titre (avec une police interne) en fading.
  347.      2) Scrolling horizontal du titre en aller-retour.
  348.      3) L'animation globale : 
  349.         - Quatre barres horizontales colorées se déplaçant verticalement et
  350.           de manière sinusoïdale derrière le titre.
  351.         - Trois balles colorées et rebondissantes passant sur les barres et 
  352.           le titre.
  353.         - Un défilement continu de texte (chenillard) en haut de l'écran.
  354.         - La même chose en bas de l'écran mais en zigzag.
  355.       4) Un zoom momentané du texte situé en haut de l'écran.
  356.       5) Disparition de celui-ci en fading.
  357.  
  358.  
  359.         BAR_COULS contient les composantes couleur des quatre barres et
  360.   PAL_COULS celles de la police et des trois balles. FONTE contient donc
  361.   les codes couleur des caractères de A à Z, des 3 balles et du caractère
  362.   Espace. Il est constitué de 1680 octets (240 points sur 7) c-à-d 30 petits 
  363.   sprites de 8 points sur 7. Cette police est d'ailleurs transférée ensuite 
  364.   dans image1^ (on a préféré utiliser une police personnelle plutôt que
  365.   l'horrible police système!).
  366.   
  367.         A chaque commencement de caractère correspond une abscisse (dans ce 
  368.   cas les ordonnées sont inutiles puisque tous les sprites sont représentés      
  369.   à partir de la même ordonnée 0; de même pour la taille qui est de 8 X 7).
  370.   TEXTE contient donc toutes les abscisses correspondant aux caractères du 
  371.   texte à faire défiler. La même chose est valable pour la première ligne du 
  372.   titre (TITRE1) et pour la deuxième (TITRE2).
  373.  
  374.         Dans ce programme le travail s'effectue avec deux écrans virtuels :
  375.   image1^ et image2^ (ce qui est amplement suffisant). Le calcul des ordonnées
  376.   des barres est précalculé dans TRACE_BARRE. Au début l'écran est rempli de
  377.   160 lignes toutes de numéros de couleurs différents (en fonction de l'ordre 
  378.   dans la palette mais toutes de couleur noire!). Les barres sont en fait 
  379.   créées en changeant les 9 lignes consécutives correspondant à chaque 
  380.   nouvelle position de barre (Il ne s'agit pas d'animation mais de 
  381.   changements de couleurs!). Le titre qui apparaît au début est en fait
  382.   masqué sur ces lignes d'où l'impression que les barres se déplacent en
  383.   arrière plan.
  384.  
  385.         En ce qui concerne l'apparition en fading le principe est très 
  386.   simple : il suffit de créer une table de 768 éléments mis à zéro (les 256 
  387.   couleurs sont alors noires) et d'activer cette palette. Par la suite on 
  388.   affiche l'image (qui n'est donc pas visible) et on augmente incrémentalement 
  389.   l'intensité des 256 couleurs de cette table noire (en l'activant à chaque 
  390.   étape) tant qu'il existe une composante couleur qui ne soit pas parvenue à 
  391.   l'intensité réelle de la vraie palette de l'image. Le processus inverse 
  392.   s'applique pour la disparition en fading.
  393.  
  394.         Les composantes couleur de la police et des balles (PAL_COULS) sont 
  395.   mémorisées dans PALETTE à partir de la couleur 209 (Celles d'avant servent
  396.   pour la pseudo-animation des barres). Mais pourquoi transfère t-on la
  397.   police dans l'écran virtuel image1^? Tout simplement parce que FONTE n'est
  398.   pas un pointeur et qu'il nous faut avoir les sprites dans une zone pointant
  399.   sur 64000 octets! Ceci est dû au fait que normalement les images 
  400.   (compressées ou non) sont plutôt stockées dans des fichiers externes sur
  401.   disque et lues alors directement dans les zones pointées. On a plutôt
  402.   privilégié ici l'organisation d'un programme comportant toutes ses données
  403.   en interne sous forme de tables (Il va de soit que les fichiers externes
  404.   constituent une solution plus enviable!)...
  405.  
  406.         Pour effectuer un défilement de texte le plus simple est de décaler
  407.   le bloc de manière soft de 2 pixels vers la gauche et d'ajouter le bon 
  408.   segment de deux pixels de large du caractère apparaîssant (dans un écran 
  409.   virtuel). Le bloc complet est ensuite transféré en RAM vidéo.
  410.  
  411.         Pour les balles on a d'abord effectué une copie de l'écran physique
  412.   comprenant les lignes noires avec le titre vers image2^. Les balles font
  413.   8 points sur 7; pour chaque nouvelle position de balle on transfère les
  414.   zones rectangulaires de 12 sur 11 (entourant de deux pixels la taille
  415.   d'une balle puisque les balles se déplacent par deux pixels à la fois)
  416.   correspondantes de image2^ vers image1^. Ensuite on transfère les sprites
  417.   des balles (qui sont situés en haut de l'écran virtuel image1^ et à 
  418.   droite de la police) vers image1^. On transfère finalement les zones de 12
  419.   sur 11 où sont situées les balles de image1^ vers l'écran physique. Voilà!, 
  420.   le reste est suffisamment clair pour ne pas être détaillé.
  421.  
  422.  
  423.  
  424. 5 AMELIORATIONS
  425.  
  426.         Peut-être est-il encore possible d'effectuer certaines optimisations?
  427.   Il est également possible d'étendre les fonctionnalités de l'unité ANIMAGE
  428.   en incorporant par exemple : zoom horizontal soft, copie de bloc en faisant  
  429.   l'addition des couleurs du sprite avec le décor de telle sorte à donner un 
  430.   effet de transparence (il faudra donc organiser les couleurs de la palette 
  431.   de façon appropriée), etc... Ou bien tout simplement se lancer dans la mise
  432.   en oeuvre du mode X et pouvoir ainsi disposer selon les modes de une ou 
  433.   plusieurs pages graphiques.
  434.  
  435.  
  436.  
  437. 6 CONCLUSION
  438.  
  439.         Dans cet article, on a présenté sommairement les constituant 
  440.   essentiels d'une carte graphique, les différentes techniques d'animation 
  441.   ainsi qu'une unité et un programme d'exemple permettant de s'initier à ce
  442.   type de programmation assez particulier à travers le mode 13h.
  443.