Programmation du BLITTER par ses registres

Les bases du gfa

Programmation du BLITTER par ses registres

Messagede tomchi » Jeu 17 Nov 2011 07:48

La promesse d'un ST plus puissant, pas loin de rivaliser avec l'Amiga 500 m'a fait acheter un 520 STE à sa sortie. Mouais ... A part quelques démos pas si révolutionnaires que ça et pas trop de grésillements avec Audiosculpture, mon STE n'a jamais été qu'un ST qui n'a pas eu besoin de soudure pour avoir une extension de RAM.

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.
Avatar de l’utilisateur
tomchi
Administrateur du site
 
Messages: 342
Inscription: Mer 15 Oct 2008 20:51

Re: Programmation du BLITTER par ses registres

Messagede lafleche » Jeu 17 Nov 2011 10:23

Y a de la demande ! ;) Merci pour le début déjà
Avatar de l’utilisateur
lafleche
 
Messages: 136
Inscription: Lun 25 Jan 2010 14:41
Localisation: Lille

Re: Programmation du BLITTER par ses registres

Messagede ManuM » Lun 21 Nov 2011 09:31

Merci pour ces explications,

vite, vite, un exemple!!! :D
ManuM
 
Messages: 69
Inscription: Lun 15 Juin 2009 12:57

Re: Programmation du BLITTER par ses registres

Messagede leglod » Mar 22 Nov 2011 09:07

Je pense qu'il faudrai faire des bench sur le Blitter car j'ai toujours eu l'impression qu'il nous cacher des choses , on ne nous dit pas tout !
Par contre le Blitter a t'il besoin de mask de sprite j'en ai toujours utiliser mais ya t'il moyen de ne pas sans servir tout en etant plus rapide je n'ai pas toujours compris les operateur logique :D
On dit que le Blitter des mega ST est plus rapide que celui de certain STE car integrer, mais est-ce vrais , je n'ai jamais eu l'impression que le Blitter gener le DMA son mais la aussi je me trompe surement!
Je n'ai jamais utiliser le Halftone pour des sprite j'ai jamais rien compris, mais si ca peut griser un sprite ca peut etre pas mal pour les jeux !
Source X increment est indispensable si on fait un scrolling horizontal sur STE, qu'elle casse tete quand j'ai fait Pouifouf ;)
Avatar de l’utilisateur
leglod
 
Messages: 182
Inscription: Jeu 6 Nov 2008 22:33
Localisation: Montpellier (34) sud France

Re: Programmation du BLITTER par ses registres

Messagede tomchi » Lun 7 Mai 2012 08:54

Bon, on ne va pas se casser la nenette à retenir toutes ces adresses, retenir des noms de variables sera déjà largement suffisant:

Code: Tout sélectionner
'
> PROCEDURE init
  super%=GEMDOS(&H20,L:0)        ! PASSE EN MODE SUPERVISEUR
  oldpal%=MALLOC(32)             ! CREE UN BUFFER POUR
  BMOVE &HFFFF8240,oldpal%,32    ! SAUVER LA PALETTE COURANTE
  keyclic|=PEEK(&H484)           ! LE CLAVIER BIP T IL ?
  SPOKE &H484,keyclic| AND NOT 1 ! Y BIP PLUS C EST SUR
  phy%=XBIOS(2)                  ! SAUVE ADRESSE ECRAN PHYSIQUE
  log%=XBIOS(3)                  ! SAUVE ADRESSE ECRAN LOGIQUE
  ' DETERMINE LE CHEMIN COURANT POUR LE PROG APRES COMPILE
  chemin$=CHR$(GEMDOS(25)+65)+":"+DIR$(0)+"\"
  '
  rez%=XBIOS(4)                  ! SAUVE RESOLUTION COURANTE
  '
  CLS                            ! ^^
  '  BMOVE XBIOS(2),ecran%,32000    ! EFFACE CE QUI POURRAIT Y A VOIR DEDANS
  '  BMOVE XBIOS(2),ecranl%,32000
  '
  ' MET BASSE RESOLUTION
  ~XBIOS(5,L:XBIOS(2),L:XBIOS(3),0)
  '
  '
  '
RETURN
> PROCEDURE ste
  ' BLITTER ADDRESSES
  '
  sxinc%=&HFF8A20    ! SOURCE X INCREMENT
  syinc%=&HFF8A22    ! SOURCE Y INCREMENT
  slow%=&HFF8A26     ! SOURCE ADDRESS LOW WORD
  shighw%=&HFF8A24   ! SOURCE ADDRESS HIGH WORD   (??????)
  end1%=&HFF8A28     ! ENDMASK 1
  end2%=&HFF8A2A     ! ENDMASK 2
  end3%=&HFF8A2C     ! ENDMASK 3
  dxinc%=&HFF8A2E    ! DESTINATION X INCREMENT
  dyinc%=&HFF8A30    ! DESTINATION Y INCREMENT
  dlow%=&HFF8A34     ! DESTINATION ADDRESS LOW WORD
  dhighw%=&HFF8A32   ! DESTINATION ADDRESS HIGH WORD     (?????)
  xcount%=&HFF8A36   ! X COUNTER
  ycount%=&HFF8A38   ! Y COUNTER
  hop%=&HFF8A3A      ! HOP
  op%=&HFF8A3B       ! OPERATION
  skew%=&HFF8A3D     ! CONFIGURATION
  blit%=&HFF8A3C     ! CONFIGURATION
  '
  '
  '
  '
  '
  '
  '
  ' HARDSCROLL REGISTERS
  '
  linewid%=&HFF820F
  BYTE{linewid%}=84    ! LARGEUR ECRAN EN MOTS-NBE DE PLANS SAUF POUR DECALAGE=0
  adr_ecr%=&HFF820D
  CARD{&HFF820E}=0
  scr_skew%=&HFF8265
  VSYNC
  CLS
  VSYNC
RETURN


voila ce que j'intègre systématiquement dans tous mes progs en gfa.
Si mon fils dort encore un peu, utilisons ça pour faire un truc au blitter ;)
Avatar de l’utilisateur
tomchi
Administrateur du site
 
Messages: 342
Inscription: Mer 15 Oct 2008 20:51

Re: Programmation du BLITTER par ses registres

Messagede tomchi » Lun 7 Mai 2012 09:24

le mieux au début, c'est de rentrer les valeurs pour tous les registres à chaque fois que l'on veut se servir du blitter, par la suite pour un gain de temps, on pourra réduire les entrées en fonction de notre code, en sachant que de toutes façons, le minimum pour lancer le blitter c'est de parametrer ycount et blit.

( sauver ce bout de code en lst et le merger à chaque fois que vous parametrez le blitter)

Code: Tout sélectionner
' endmasks
CARD{end1%}=&hffff
CARD{end2%}=&hffff
card{end3%}=&hffff
' source et destination pour copie
LONG{shighw%}=source%              ! ce qu'on va copier = source high word
LONG{dhighw%}=dest%                 ! ou on va copier     = dest high word
' parametres de copie
CARD{xcount%}=0                        ! le nbe de mots a copier par ligne
CARD{sxinc%}=0                          ! saut en mots entre chaque copie sur la source = source x increment
CARD{dxinc%}=0                          ! saut en mot entre chaque copie sur la destination = destination x increment
CARD{syinc%}=0                           ! saut en mot entre chaque ligne de copie sur la source = source y increment
CARD{dyinc%}=0                           ! saut en mot entre chaque ligne de copie sur la destination = destination y increment
' operations
BYTE{hop%}=2                              ! halftone operation
BYTE{op%}=3                                ! operation = maniere de combiner source et destination
BYTE{skew%}=0                             ! decalage de bit dans la copie
' lancement blitter
CARD{ycount%}=0                           ! nombre de lignes pour la copie
BYTE{blit%}=192                             ! lancement de la copie
Avatar de l’utilisateur
tomchi
Administrateur du site
 
Messages: 342
Inscription: Mer 15 Oct 2008 20:51


Retourner vers Tutos

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité

cron