Obligement - L'Amiga au maximum

Samedi 18 novembre 2017 - 05:39  

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

 


Programmation : Assembleur - la copie du Blitter
(Article écrit par Roméo Rapido et extrait d'Amiga News - octobre 1990)


Après les fort probantes démonstrations des capacités du Blitter des mois précédents (article 1, article 2), nous allons mettre à profit ce numéro d'octobre pour lever le capot d'Agnus et voir comment tout fonctionne à l'intérieur du dedans. Si je vais trop vite, lisez plus lentement.

Avant de commencer toute opération faisant intervenir le Blitter, il est nécessaire de s'assurer que celui-ci est bien libre. Ceci se fait simplement en testant le bit 14 du registre DMACONR : s'il n'est pas à zéro, le Blitter est en train d'exécuter une opération et il faut attendre que celle-ci soit achevée pour commencer à charger ses registres.

Voici une façon d'attendre que le Blitter soit libre :

WaitForBlitter:
btst #14,DMACONR(a5) ; test du bit busy
bne.s WaitForBlitter

Voilà, la bête est à nous. Que pouvons-nous en faire ? Ce qu'il faut savoir avant tout c'est que le Blitter n'est capable d'effectuer que deux types d'opérations : le tracé de droite et la copie de données (les remplissages étant apparentés a la copie de données).

Les principaux registres du Blitter sont :
  • Les registres sources BLTAPT, BLTBPT et BLTCPT qui sont des pointeurs sur les bitplanes "sources".
  • Le registre cible BLTDPT.
  • Les registres modulo pour chacun des registres précédents BLTAMOD, BLTBMOD, BLTCMOD et BLTDMOD.
  • Les registres de masque pour le premier et le dernier mot de la source ABLTAFWM et BLTALWM.
  • Les registres de données source qui sont utilisés pour sélectionner des modes particuliers de fonctionnement BLTADAT, BLTBDAT et BLTCDAT. Par exemple, en mode "tracé de droites", BLTADAT doit être initialisé avec $8000 et BLTBDAT doit contenir le masque de tracé de droite : $FFFF pour une droite pleine et par exemple $F0F0 pour des pointillés larges.
  • Le registre de données cible BLTDDAT qui est utilisé par le Blitter pour transférer les données et donc est inaccessible par le 68000 (seulement Agnus).
  • Les registres de contrôle BLTCON0 et BLTCON1.
  • Le registre qui contient la taille des opérations à effectuer BLTSIZE.
Les registres BLTxPT sont des registres sur 32 bits qui contiennent chacun, du moins pour ceux qui sont utilisés, l'adresse des bitplanes mis en cause par l'opération Blitter. Tous les autres registres sont sur 16 bits.

Les registres BLTxMOD sont les registres modulo. Ils contiennent le nombre d'octets qu'il faut ajouter à la fin de chaque ligne pour passer au début de la ligne suivante de chacun des bitplanes.

Exemple : soit un bitplane A de 10 octets de large dans lequel on désire transférer un bitplane B de 4 octets de large à partir du troisième octet du bitplane A. Si le début de la ligne est le 3e octet dans notre bitplane A et donc la fin le 7e, le modulo pour le bitplane A est donc 6 puisque 7 + 6 = 13 = 3 modulo 10. Le modulo pour le bitplane B est 0 puisque dès que l'on a fini une ligne on passe à la suivante en ajoutant la valeur 0.

BLTAFWM et BLTALWM sont deux registres contenant les masques du premier et du dernier mot de chaque ligne pour le registre source A, très utiles pour cacher les bords par exemple.

Le registre BLTSIZE contient la taille de la zone à transférer calculée comme suit : nombre de lignes x 64 + largeur en MOTS.

Et enfin, les deux registres de contrôle dont voici la signification des différents bits.

Bit
BLTCON0
BLTCON1
15 ASH3 BSH3
14 ASH2 BSH2
13 ASH1 BSH1
12 ASH0 BSH0
11 USEA
10 USEB
9 USEC
8 USED
7 LF7
6 LF6
5 LF5
4 LF4 EFE
3 LF3 IFE
2 LF2 FCI
1 LF1 DESC = 1*
0 LF0 LINE = 0

(*) En général sauf pour tracé de droites.
ASHx : valeur de décalage pour la source A (0-8).
BSHx : valeur de décalage pour la source B.

Ces deux séries de bits permettent de décaler les données des deux registres A et B vers la droite du nombre de bits spécifié.

USEA, B, C, D indique quels sont les registres données et cible utilisés. LINE indique le mode de travail, tracé de droites 1, copie de blocs 0. DESC indique si le Blitter procède par incrémentation ou décrémentation d'adresse. Les trois bits EFE, IFE et FIC sont liés au remplissage de surface avec le Blitter. Les huit bits LFx contiennent les équations Blitter.

Il est possible de combiner les trois sources pour obtenir des résultats différents dans la cible. Ces équations obéissent à l'algèbre de Boole. Pour ceux qui ne connaissent pas, ces explications vont sembler plus que touffues et dans ce cas il vaudra mieux consulter un bouquin de math sur l'algèbre de Boole avant de continuer. On les calcule en combinant les sources entre elles avec les opérateurs "ou", "non" et "et". Une copie simple de A vers D donnera D = A.

Les zones transférées sont toujours rectangulaires. Pour transférer une Boing Ball ou tout autre objet irrégulier, il faut auparavant fabriquer un masque (un bitplane contenant la "silhouette" de l'objet). Soit B notre masque et C notre destination, nous voyons que D = (A "et" B) "ou" (C "et" "non" B). Traduction : A "et" B s'il y a un bit à 1 dans B (intérieur de la forme) le bit de D est = au bit de A. Dans le cas contraire le bit de D est = au bit de C (on est en dehors de la forme donc le bit de B vaut 0 donc "non" B vaut 1 et le résultat est vrai).

A partir de maintenant, A désignera A et a désignera "non" A. "et" sera représente par * et "ou" par +.

L'équation précédente peut donc s'écrire : D = AB + bC

Pour chacun des membres de droite, il faut faire intervenir la ou les sources manquantes de la façon suivante : D = AB*(C+c) + bC*(A+a)

...puis développer le tout, ce qui nous donne : D = ABC + ABc + AbC + abC

Il ne reste plus qu'à positionner les bits de l'équation sachant que :

LF7 = ABC
LF6 = ABc
LF5 = AbC
LF4 = Abc
LF3 = aBC
LF2 = aBc
LF1 = abC
LF0 = abc

La valeur de l'octet est donc 11100010 soit $E2, les bits restants étant à 0. Comme vous pouvez le constater, ce n'est pas simple mais je vous avais prévenu.

Pour recopier un bitplane à l'intérieur d'un autre il faut donc :

1. Déterminer les sources mise en jeu puis calculer l'équation Blitter.

2. Charger les registres BLTPTx avec les adresses de début des bitplanes et charger les valeurs des modulos correspondants.

3. Nettoyer (clear) les registres BLTxDAT, BLTAFWM et BLTALWM.

4. Charger les registres BLTCON0 et BLTCON1 avec les bonnes valeurs. Le DMA est lancé automatiquement dès que l'on écrit la valeur adéquate dans le registre BLTSIZE.

Et Agnus dit au petit Blitter "vas chez ta mère grand et portes lui ce petit pot de bitplanes et cette belle équation booléenne mais fais attention car les articles de Roméo Rapido rôdent dans la forêt, te fais pas eu...".

Oh, il est temps que j'arrête. Vous avez un mois d'automne pour vous remettre.


[Retour en haut] / [Retour aux articles] [Article précédent] / [Article suivant]