|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Je vous propose de découvrir, ou de redécouvrir les différents modes graphiques de l'Amiga, des premières puces OCS à l'AGA et au delà, le RTG Picasso96. On ne va pas entrer dans les détails des registres, mais regarder comment on peut utiliser les routines de l'intuition.library et la graphics.library. OCS et ECS L'OCS (Old Chip Set) est le nom donné après coup aux puces originales de l'Amiga 1000, l'Amiga 500 et des modèles d'A2000 avant 1990. L'ECS (Enhanced Chip Set) est apparu en 1990 avec l'Amiga 3000 et ces puces ont pu être adaptées à l'A500 et l'A2000 moyennant quelques adaptations : ajout de la puce Super Agnus (ligne 19 (existante) et 20 (fil à souder) pour l'adressage de 2 Mo de mémoire Chip), Super Denise pour pouvoir adapter les signaux vidéo, et le circuit Amber pour désentrelacer les signaux vidéo. La puce utilisée pour la génération des pixels, Denise (Display Encoder) utilise l'horloge de base de 7 MHz (7,16 MHz en NTSC et 7,09 MHz en PAL). Par cycle, elle émet un pixel basse résolution (LoRes) ou deux pixels haute résolution (Hires) toute les 140 nanosecondes environ : 1/7,16 MHz = 139,66 ns ; 1/7,09 MHz = 141,04 ns. Le temps mis pour afficher un pixel s'exprime en nanosecondes. Dans les circuits OCS il y a deux résolutions horizontales pour les pixels : 140 ns pour la base résolution (LoRes, 320 pixels en horizontal) et 70 ns pour la haute résolution (HiRes, 640 pixels en horizontal). Dans la puce Denise, il y a 32 registres couleurs.
En basse résolution, on peut gérer 6 plans (plans de bits). De 1 à 5 plans, on affichera 2 à 32 couleurs à choisir parmi 4096 couleurs. Mais alors à quoi peut servir le sixième plan vu que la puce n'a que 32 registres ? Le mode EHB (Extra Half Bright) gère le sixième plan en utilisant les intensités divisées par deux des 32 registres couleurs. Il s'agit donc des mêmes couleurs que les 32 premières mais avec une intensité moindre. Le mode EHB propose ainsi 64 couleurs. Le mode HAM (Hold And Modify), lui, permet d'afficher 4096 couleurs avec des contraintes de proximité. Le mode HAM des Amiga en OCS ou ECS est appelé HAM6, car il travaille sur 6 bits. Le mode HAM6 utilise 6 bits, dont 2 sont des bits particuliers de contrôle. Les 4 autres bits indiquent soit un index dans la palette graphique, soit la nouvelle valeur d'une des composantes RVB du pixel par rapport au pixel affiché juste avant. Le mode HAM6 permet l'affichage de 4096 couleurs simultanément avec quelques contraintes de proximité parce qu'au total 12 bits indiquaient la couleur avec 4 bits par composante. D'où le nom "Hold And Modify" car on conserve le pixel précédent tout en le modifiant. Le codage général d'un pixel du HAM6 est le suivant :
En haute résolution, on ne peut gérer que 4 plans (16 couleurs). Dans les circuits ECS, il y a une résolution supplémentaire : 35 ns pour la super haute résolution (Super HiRes, 1280 pixels en horizontal). Il y a aussi plein d'autres résolutions, les fréquences horizontales et verticales sont entièrement programmables, au risque de faire exploser son écran multisynchro... En super haute résolution, on n'a que 2 plans (4 couleurs à choisir parmi 64 couleurs...). Les modes "Sliced" Le coprocesseur Copper (inclus dans la puce Agnus) dispose de trois instructions : MOVE, WAIT et SKIP. Un programme pour le Copper s'appelle une liste Copper ("copperlist"). Dans la plupart des cas, le système utilise ces listes Copper en chargeant la palette dans les registres COLOR00 à COLOR31 une bonne fois pour toute en haut de l'écran visible. Mais on peut ruser en coupant le DMA audio, disque et sprite, on a assez de temps pour changer la valeur des registres à chaque ligne : une ribambelle de MOVE COLORcc,$0rvb suivi d'un WAIT 0,n+1, d'où les modes "Sliced" ou "Dynamic" :
Pour illustrer, voici des images créées avec Macro Paint en Dynamic HiRes (Sliced HiRes). Ces images accompagnent Shazam, un utilitaire capable d'afficher ce genre d'images (il y a même le code source en C pour les curieux : c'est une grosse liste Copper). ![]() "astronaut.mp" en 237 couleurs ![]() "fb111.mp" en 104 couleurs ![]() Test de capture de la boîte du logiciel avec une caméra noir et blanc et les filtre rouge/vert/bleu de Digi-View ![]() Une image en HAM, obtenue à partir d'une affiche par le même procédé que la boîte ![]() Image 24 bits de référence ![]() Image convertie en Dynamic HAM, 634 couleurs alors qu'en réalité il y en a plus de 57536 ![]() Image convertie en Dynamic HiRes, 185 couleurs alors qu'en réalité il y en a plus de 57536 L'AGA (Advanced Graphics Architecture) est arrivé avec l'Amiga 4000 en 1992. Il conserve les modes graphiques ECS et ajoute d'autres modes : basse résolution, haute résolution et super haute résolution de 1 à 8 plans, soit de 2 à 256 couleurs. Les registres couleurs sont toujours sur 16 bits :
La palette de 256 couleurs est décomposée en 8 palettes de 32 couleurs. Le registre BPLCON3 $dff106 permet de sélectionner la composante basse (bit 9 à 0) ou haute (bit 9 à 1). Pour écrire RrGgBb dans COLOR00, il faudra commencer par mettre le bit 9 de BPLCON3 à 0, écrire rgb dans COLOR00 puis mettre le bit 9 de BPLCON3 à 1 pour écrire RGB dans COLOR00. Les listes Copper deviennent énormes. En outre, l'EHB est conservé. Du côté du HAM, le HAM6 correspond au HAM OCS, avec 6 plans. Un autre mode HAM, le HAM8 utilisant 8 plans, a été ajouté :
Picasso96 Vu la complexité de l'AGA, de nombreuses sociétés ont développé des cartes graphiques, reprenant des caractéristiques communes avec les PC et les Macintosh. Le RTG (ReTargetable Graphics) permet d'ouvrir la bibliothèque graphique de l'Amiga à d'autres technologies. Fini les registres, les listes Copper et les limitations, maintenant un pixel a 3 composantes sur 8 bits, qu'importe le sens ou comment il se situe en mémoire... Mise en oeuvre Nous allons nous servir des bibliothèques Intuition et Graphics.
Accès aux couleurs, par le ViewPort du Screen. Pour changer les couleurs à partir de la fenêtre : vp = &w->WScreen->ViewPort ; Pour changer les couleurs à partir d'un écran : vp = &s->ViewPort ;
LoadRGB4 et LoadRGB32 chargent des palettes entières en un seul appel, bien plus rapidement que leurs équivalents en SetRGB4 et SetRGB32. Accès aux plans, par le RastPort. Pour récupérer le RastPort de la fenêtre :
Pour récupérer le RastPort de l'écran :
Les pinceaux A (primaire) et B (secondaire) permettent de peindre dans le RastPort.
Les modes de rendu JAM1 0 (une couleur, pinceau primaire A), JAM2 1 (deux couleurs, pinceau A et pinceau B), COMPLEMENT 2 (ou exclusif avec les couleurs déjà présentes), INVERSVID 4 (vidéo inverse avec les couleurs déjà présentes), sont sélectionnés par :
A partir de la version 39 du système (AmigaOS 3.0), il existe une fonction qui effectue les trois opérations en un seul appel :
Les primitives graphiques "Move" déplace le pinceau, sans tracé, "Draw" relie le dernier point (w->RPort->cp_x, w->RPort->cp_y) au point précisé. w->RPort->LinePtrn contient la texture de la ligne, par défaut 0xffff, prendre 0xaaaa pour faire un pointillé alterné entre pinceau A et pinceau B. "RectFill" remplit le rectangle dont les coordonnées sont précisées. "Text" affiche le texte en précisant la longueur. "DrawEllipse" dessine une ellipse :
Les primitives graphiques nécessitant d'allouer un RastPort temporaire (remplissage) sont :
Accès aux pixels
Le "WritePixelLine8" s'écrit naïvement comme suit sans devoir allouer un RastPort temporaire. Il est évident que WritePixel est très lent, vu qu'il faut accéder à chaque plan.
A quoi "WritePixelLine8" peut-il bien servir ? On peut s'en servir pour convertir des pixels RVB en HAM... ou en HAM8 ou pour recalculer une image avec les couleurs disponibles. C'est bien gentil tout ça mais comment peut-on écrire des couleurs en 24 bits dans un écran Picasso96 ? Tout simplement en sacrifiant une entrée arbitrairement dans le ViewPort de l'écran, ou en verrouillant une couleur (avec ObtainPen).
...permettra de peindre les droites/boîtes/textes à l'aide des primitives graphiques avec la couleur (255,162,135). Ce qui est valable pour le pinceau A l'est aussi pour le pinceau B, mais il faudra prendre une autre entrée, la 248 par exemple. Conclusion De 2 couleurs à 16,7 millions, on peut beaucoup s'amuser avec un Amiga.
|