Obligement - L'Amiga au maximum

Mercredi 22 novembre 2017 - 23:11  

Translate

En De Nl Nl
Es Pt It Nl


Rubriques

 · Accueil
 · A Propos
 · Articles
 · Galeries
 · Glossaire
 · Hit Parade
 · Liens
 · Liste jeux Amiga
 · Quizz
 · Téléchargements
 · Trucs et astuces


Articles

 · Actualité (récente)
 · Actualité (archive)
 · Comparatifs
 · Dossiers
 · Entrevues
 · Matériel (tests)
 · Matériel (bidouilles)
 · Points de vue
 · En pratique
 · Programmation
 · Reportages
 · Tests de jeux
 · Tests de logiciels
 · Tests de compilations
 · Articles divers

 · Articles in english
 · Articles in other languages


Twitter

Suivez-nous sur Twitter




Liens

 · Sites de téléchargements
 · Associations
 · Pages Personnelles
 · Moteurs de recherche
 · Pages de liens
 · Constructeurs matériels
 · Matériel
 · Autres sites de matériel
 · Réparateurs
 · Revendeurs
 · Presse et médias
 · Programmation
 · Développeurs logiciels
 · Logiciels
 · Développeurs de jeux
 · Jeux
 · Autres sites de jeux
 · Scène démo
 · Divers
 · Informatique générale


Jeux Amiga

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Trucs et astuces

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Glossaire

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Partenaires

Annuaire Amiga

Amedia Computer

Relec

Hit Parade


Contact

David Brunet

Courriel

 


Dossier : Les modes graphiques Amiga
(Article écrit par Gilles Pelletier - décembre 2013)


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.

$dff180 COLOR00
$dff182 COLOR01
...
$dff1be COLOR31

En basse résolution, on peut gérer 6 plans (bitplanes). 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 :
  • 00xxxx => registre COLOR00 à COLOR15.
  • 01BBBB => les composantes rouges et vertes sont conservées, la composante bleue est sur 4 bits 0x0 à 0xf.
  • 10RRRR => les composantes bleues et vertes sont conservées, la composante rouge est sur 4 bits 0x0 à 0xf.
  • 11GGGG => les composantes bleues et rouges sont conservées, la composante verte est sur 4 bits 0x0 à 0xf.
Une ligne de l'image doit obligatoirement commencer par une couleur de la palette.

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" :
  • Le Sliced HiRes (Dynamic HiRes), 16 couleurs par ligne.
  • Le Sliced EHB (Dynamic LoRes EHB), 64 couleurs par ligne.
  • Le Sliced HAM (Dynamic LoRes HAM, ou SHAM), 16 couleurs + HAM par ligne.
Ces modes ont été introduits sur Amiga par la société américaine NewTek en 1989.

Pour illustrer, voici des images créées avec MacroPaint 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).

modes graphiques Amiga
"astronaut.mp" en 237 couleurs

modes graphiques Amiga
"fb111.mp" en 104 couleurs

Digi-View 4 est un module électronique permettant de numériser une trame vidéo avec un logiciel qui offre la possibilité d'enregistrer 7 bits par composante dans des fichiers IFF 21 bits. Un Amiga sans carte graphique ne peut pas afficher de telles images. Digi-View permet de convertir ces données en HAM, en EHB, et en Dynamic HiRes, directement ou en utilisant diverses techniques de dispersion de pixels.

modes graphiques Amiga
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


modes graphiques Amiga
Une image en HAM, obtenue à partir d'un poster
par le même procédé que la boîte


Un peu plus ardu, la conversion d'une image 24 bits en image 21 bits :

modes graphiques Amiga
Image 24 bits de référence

modes graphiques Amiga
Image convertie en Dynamic HAM, 634 couleurs alors qu'en réalité il y en a plus de 57536

modes graphiques Amiga
Image convertie en Dynamic HiRes, 185 couleurs alors qu'en réalité il y en a plus de 57536

AGA

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 :

$dff180 COLOR00
$dff182 COLOR01
...
$dff1be COLOR31

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é :
  • 00xxxxxx => couleur 0 à 63 dans la palette logique.
  • 01BBBBBB => les composantes rouges et vertes sont conservées, la composante bleue est sur 6 bits 0x0 à 0x3f.
  • 10RRRRRR => les composantes bleues et vertes sont conservées, la composante rouge est sur 6 bits 0x0 à 0x3f.
  • 11GGGGGG => les composantes bleues et rouges sont conservées, la composante verte est sur 6 bits 0x0 à 0x3f.
L'AGA propose 262 144 couleurs simultanées en théorie, sauf que l'on est en haute résolution ou super haute résolution.

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.
  • Ouvrir un écran avec le bon type avec OpenScreen() ou OpenScreenTags() => s
  • Ouvrir une fenêtre... mais c'est optionnel car on peut écrire directement dans l'écran... OpenWindow() ou OpenWindowTags() => w
  • Pour fermer une fenêtre, CloseWindow(w), et pour fermer un écran, CloseScreen(s)
Accès aux couleurs

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 ;

SetRGB4(vp, entry, R, G, B); /* Toutes les versions, 12 bits */
SetRGB32(vp, entry, R, G, B); /* V39 et plus, 32 bits par composantes (on voit large...) */

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 :

rp = w->RPort ;

Pour récupérer le RastPort de l'écran :

rp = &s->RastPort ;

Les pinceaux A (primaire) et B (secondaire) permettent de peindre dans le RastPort.

SetAPen(w->RPort, fg) ;
SetBPen(w->RPort, bg) ;

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 :

SetDrMd(w->RPort, mode) ;

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 :

SetABPenDrMd(w->RPort, fg, bg, m) ;

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 :

Move(rp, x, y) ;
Draw(rp, x, y) ;

RectFill(rp, le, te, re, be) ;
Text(rp, text, len) ;
DrawEllipse(rp, x, y, rx, ry) ; /* V33 et plus */

Les primitives graphiques nécessitant d'allouer un RastPort temporaire (remplissage) sont :

AreaEllipse(rp, x, y, rx, ry) ;
AreaMove(rp, x, y) ;
AreaDraw(rp, x, y) ;
AreaEnd(rp) ;
Flood(rp, mode, x, y) ;

Accès aux pixels

WritePixel(w->RPort, x, y) ;
WritePixelLine8(rp, xstart, ystart, width, pens, tempRP) ; /* V36 et plus */

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.

LONG V33_WritePixelLine8
( struct RastPort *rp, ULONG xstart, ULONG ystart, ULONG width,
  UBYTE *array, struct RastPort *tempRP
)
{ 
  register ULONG i;
  
  for ( i=width; i; i-- )
  { 
    SetAPen(rp, *array++);
    WritePixel(rp, xstart++, ystart);
  }
  
  return (LONG)width;
} /* V33_WritePixelLine8 */

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).

SetRGB32(&w->WScreen->ViewPort,
         249,
         0xffffffff,
         0xa2a2a2a2,
         0x87878787) ;

SetAPen(w->RPort, 249) ;

...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.


[Retour en haut] / [Retour aux articles]