Mais depuis que je me suis mis au GfA, il s'est avéré que le "E" fait une grosse différence, notamment grace au blitter.
Ce dernier sert à effectuer des copies de blocs rapidement et plus ou moins facilement.
Dans certains cas, une très bonne routine assembleur peut rivaliser voire battre le blitter, surtout pour de petites copies, CJ de DBug a une routine d'affichage de sprites 16*16 qui prends moins de temps machine qu'en utilisant le blitter.
En GfA par contre, il n'existe rien de plus rapide que la programmation de ce chip. Il explose les GET, PUT et autres BMOVE.
Certaines commandes GfA utilisent le blitter, c'est le cas de RC_COPY la commande la plus cool du monde quand on commence à coder et que l'on veut afficher quelque chose à l'écran. BITBLT aussi, mais ceci à deja été traité par sporniket ici de manière exhaustive.
Je n'ai jamais utilisé BITBLT et RC_COPY s'est avéré rapidement trop rigide pour mes besoins, comme Tobé (Roger, Tibrute to Rainbow TOS), ggn et Leglod par exemple (pouif pouif), j'ai opté pour la programmation directe du blitter par ses registres, et aujourd'hui, même si je n'en maitrise pas tous les aspects, c'est la façon la plus intuitive, simple pour moi, sans compter que c'est la plus performante en terme de temps machine mais également de flexibilté et de diversité d'applications.
De quoi s'agit il ?
Le blitter lit des adresses en RAM qui lui servent de parametres pour copier. Plutôt que de passer des données à une commande GfA qui va les transformer en parametres pour le blitter, autant le faire soi meme à coup de SPOKE ou CARD (ce dernier nécessitant d'être en mode superviseur).
Les registres.
Halftone RAM:
&HFFFF8A00 Halftone RAM, Mot 0 (16 mots au total)
...
&HFFFF8A1E Halftone RAM, Mot 15
Le registre Halftone est une zone mémoire de 32 octets exclusivement reservée au blitter pour lui permettre de faire de rapides manipulations sur les blocs copiés avec un temps d'accès nul. Le but premier était de permettre de combiner des images monochromes avec des motifs de 16*16 pix, pour rendre l'image un peu plus sombre ou plus claire.(halftone=demi ton)
Source X Increment :
&HFFFF8A20 X X X X X X X X X X X X X X X 0
Source Y Increment :
&HFFFF8A22 X X X X X X X X X X X X X X X X
Ces registres permettent au blitter de savoir de combien d'octets il doit se déplacer aprés chaque mot copié (&HFFFF8A20) ou apres chaque ligne (&HFFFF8A22).
Source Address :
&HFFFF8A24 XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXX0
L'adresse source sur 32 bits à partir de laquelle le blitter va commencer à copier. Doit être paire.
Endmask
&HFFFF8A28 X X X X X X X X X X X X X X X X Endmask 1
&HFFFF82AA X X X X X X X X X X X X X X X X Endmask 2
&HFFFF82AC X X X X X X X X X X X X X X X X Endmask 3
Ce sont des masques appliqués aux données copiées. Endmask 1 sera appliqué au premier mot de chaque ligne copiée, Endmask 2 pour tous les autres sauf le dernier qui sera combiné avec Endmask 3. Cela permet de commencer une copie à partir de n'importe quel bit en mémoire.
Destination X Increment :
&HFFFF8A2E X X X X X X X X X X X X X X X X
Destination Y Increment :
&HFFFF8A30 X X X X X X X X X X X X X X X X
Identique à Source X/Y Increment mais pour la zone de destination.
Destination Address :
&HFFFF8A32 XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXX0
Adresse à laquelle le blitter va copier les données. Adresse sur 32 bits qui doit être paire.
X Count :
&HFFFF8A36 X X X X X X X X X X X X X X X X
Y Count :
&HFFFF8A38 X X X X X X X X X X X X X X X X
Les données à copier sont vues comme un rectangle 2D. X Count determine la largeur en mots de ce bloc, Y Count combien de lignes il y a à copier au total.
Blit HOP (Halftone OPeration) :
&HFFFF8A3A 0 0 0 0 0 0 X X
Indique comment seront combinéés les données copiées et celle du Halftone. "00" mettra tous les bits copiés à "1" (blind copy), "01" ne copiera que les donées du halftone, "10" seulement celles de la source (1:1 copy). "11" combinera la source avec les données du halftone "Halftone AND source".
Blit OP (OPeration logique) :
$FFFF8A3B 0 0 0 0 X X X X
Le blitter peut combiner source et destination à l'aide d'opérateurs logiques sans perte de performance selon le tableau suivant:
0 0 0 0 - bits de Destination mis à zéro (blind copy)
0 0 0 1 - Source AND Destination (inverse copy)
0 0 1 0 - Source AND NOT Destination (mask copy)
0 0 1 1 - Source seulement (replace copy)
0 1 0 0 - NOT Source AND Destination (mask copy)
0 1 0 1 - Destination inchangée (null copy)
0 1 1 0 - Source XOR Destination (xor copy)
0 1 1 1 - Source OR Destination (combine copy)
1 0 0 0 - NOT Source AND NOT Destination (complex mask copy)
1 0 0 1 - NOT Source XOR Destination (complex combine copy)
1 0 1 0 - NOT Destination (reverse, no copy)
1 0 1 1 - Source OR NOT Destination (mask copy)
1 1 0 0 - NOT Source (reverse direct copy)
1 1 0 1 - NOT Source OR Destination (reverse combine)
1 1 1 0 - NOT Source OR NOT Destination (complex reverse copy)
1 1 1 1 - bits de Destination mis à "1" (blind copy)
Blitter Control :
&HFFFF8A3C X X X 0 X X X X
Ce registre sert à plusieurs choses. Les 4 bits de poids faible donnent le numéro de la ligne à laquelle on va commencer de copier le Halftone. Les 3 bits de poids fort servent à parametrer les fonctions étendues du Blitter.
Bit 5 - Smudge-mode
La ligne de départ du Halftone est lue à partir du premier mot de la source quand la copie demarre
Bit 6 - Blit-Mode Register
Decide de copier soit en BLIT Mode (0) ou en HOG Mode (1). En Blit Mode (mode cooperatif), CPU et Blitter ont 64 cycles chacun leur tour,
En Hog Mode, le Blitter accapare le bus pendant le temps de la copie, CPU et DMA n'ont pas acces au bus durant la copie.
Bit 7 - Busy Bit
Active le Blitter et reste à "1" jusqu'à la fin de la copie
Blitter Skew Register:
&HFFFF8A3D X X 0 0 X X X X
Les 4 bits de poids faible indiquent le décalage entre source et destination max 15 bits vers la droite. Les 2 bits de poids fort sont:
Bit 6 - NFSR (No final source read)
Bit 7 - FXSR (Force extra Source Read).
NFSR fait que le blitter ne lit pas le dernier mot de la source. Sert seulement pour certaines valeurs d'Endmask et skew. FXSR fait le contraire cad force le blitter à lire un mot supplémentaire.
Cette liste n'est qu'un copié/collé (à peu près) traduit de l'indispensable page web de The Paranoid sur le STE.
Tous ces registres à parametrer peuvent décourager, mais avec un peu de pratique il s'avère qu'on fait souvent la même chose et au final, ce n'est pas si compliqué que ça . Si il y a de la demande, je pourrai continuer en postant quelques exemples d'utilisation de base.