Obligement - L'Amiga au maximum

Dimanche 16 décembre 2018 - 11:46  

Translate

En De Nl Nl
Es Pt It Nl


Rubriques

 · Accueil
 · A Propos
 · Articles
 · Galeries
 · Glossaire
 · 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 en d'autres langues


Twitter

Suivez-nous sur Twitter




Liens

 · Sites de téléchargements
 · Associations
 · Pages Personnelles
 · Matériel
 · Réparateurs
 · Revendeurs
 · Presse et médias
 · Programmation
 · Logiciels
 · Jeux
 · Scène démo
 · Divers


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 - Animation d'un sprite sous IRQ (2e partie)
(Article écrit par Dominique Genot et extrait d'Amiga News Tech - juillet 1990)


"Animer un sprite" signifie modifier régulièrement sa position à l'écran d'où un déplacement visible plus ou moins rapide. Une première considération s'impose. Pour animer un sprite, il est inutile d'effacer l'ancien, puisque les sprites sont redessinés à chaque balayage de l'écran par le faisceau d'électrons ("raster").

Cette propriété distingue les sprites des "bobs" animés au Blitter. Mais on peut en conclure aisément que le changement de position ne saurait se faire n'importe quand. Il est impératif de modifier la position des sprites avant le balayage de l'écran, pendant le "temps mort vertical" appelé "vertical blank". Pour réaliser cela, on peut tester la position du faisceau d'électrons (avec les registres $DFF004 et $DFF006), mais le plus astucieux est d'utiliser les routines interruptions du processeur. En effet, à chaque temps mort vertical, le Copper envoie un signal d'interruption de niveau 3 dite IRQ3 (Interruption Request niveau 3), le micro-processeur "sautera" alors la routine correspondante. Il ne s'agit pas de supprimer cette routine, mais d'y ajouter une routine bien sentie...

Pour cela, on respectera l'ordre suivant :
  1. Interdire les interruptions avec move.w #$4000,$DFF09A ; INTENA.
  2. Mettre de côté l'adresse de la routine normale, adresse stockée en $6C avec move.l $6C,oldirq.
  3. Mettre à la place l'adresse de notre routine avec move.l newirq,$6C.
  4. Rétablir les interruptions avec move.l #$C000,$DFF09A.
Ce qui précède implique deux choses :
  1. Notre routine "newirq" doit se terminer en lançant la routine normale, ce qu'on réalise en ajoutant à la fin :

    dc.w $4EF9       ; JMP...
    

  2. Dans la routine newirq, il faut préserver les registres au début et les restituer à la fin avec :

    movem.l d0-7/a0-7,-(sp)
                     .....(routine).....
                     movem.l (sp)+,d0-7/a0-7
    
...comme dans l'exemple.

Pour faire un travail propre, il faut restaurer l'interruption normale quand le programme rend la main :

move.w #$4000,$DFF09A     ; supprime interruptions
move.l oldirq,$6C         ; remet l'adresse normale
move.w #$C000,$DFF09A     ; autorise interruptions

En résumé, on peut dire que la liste Copper sert à faire les dessins (playfield ou sprites) et que l'IRQ3 sert à faire l'animation.

Une dernière précision en ce qui concerne les registres DIWSTRT et DIWSTOP qui sont fixés dans la liste Copper. La valeur de DIWSTRT conditionne celle de DDFSTRT (cycles du DMA-bitplane) et il faut que celle-ci soit supérieure à $38, sinon on risque de donner au DMA-bitplane des cycles normalement alloués au DMA-sprite, ce qui empêcherait le dessin de certains sprites. En conclusion, il est préférable de fixer DIWSTRT plus grand que $81 en abscisse.

NEWIRQ

Que va-t-on mettre dans cette routine ? Le problème est simple : changer la position des sprites. D'après l'article sur les structures de sprites, il faut pour cela changer les valeurs des mots de contrôle figurant dans les structures. Comment est déterminée la nouvelle position ?
  • Ou bien les sprites se déplacent suivant une ligne droite et il suffit d'ajouter ou de retrancher une certaine valeur aux coordonnées x et y.
  • Ou bien les sprites se déplacent en suivant une courbe dont l'équation est programmée. Dans ce dernier cas, la position des sprites peut être calculée en fonction d'un paramètre variable (angle, temps, etc.). Les calculs sont faits avec les bibliothèques mathématiques pendant l'IRQ3 : c'est le cas du programme proposé.
  • Ou bien on a préparé une table de valeurs qui contient les futures coordonnées et on va "pêcher" dans cette table.
Il est donc difficile de donner un modèle pour la routine "newirq" puisqu'elle dépend de la courbe choisie pour le déplacement des sprites. Dans tous les cas, on retrouvera l'ordre suivant :
  1. Préservation des registres.
  2. Détermination des nouvelles positions.
  3. Modification des mots de contrôle dans les structures : on peut utiliser la routine "placem_sprite" du mois précédent.
  4. Récupération des registres.
  5. Lancement de l'IRQ3 normale (comme indiqué plus haut).
Précisons tout de même certains points...

Placements des sprites

Il est nécessaire de les espacer (dans l'exemple choisi), ce qui est réalisé avec la table "index". Elle contient les valeurs 0,8,16,24,32. La première valeur est utilisée pour le premier sprite, la deuxième valeur est utilisée pour le deuxième sprite, etc.

La valeur 8 signifie que l'on va retrancher 8 fois le pas à l'angle courant pour calculer la position du deuxième sprite, ce qui le retarde ou l'éloigne davantage du premier (même principe pour les autres sprites). Du coup, si l'on veut rapprocher les sprites, on peut essayer 0,4,8,12,16 dans la table "index". Attention cependant : des valeurs impaires amèneront un Guru (adresse impaire) dans la routine "newirq" !

Pour éviter de recalculer à chaque interruption toutes les valeurs de cette table, toutes les valeurs sont décalées d'un cran dans la table, puis la première valeur de la table est calculée et l'angle est incrémenté. En toute logique, il faudrait alors tester si la courbe a été entièrement décrite, ce qui oblige à calculer sa période (ici : 2 Pi). Comme dans le cas général le pas est très faible, on peut incrémenter l'angle sans test.

Vitesse de défilement

En ce qui concerne la vitesse de déplacement des sprites : elle est réglable en modifiant le pas de l'angle (fixé à 0.025 radians dans l'exemple).

Courbe suivie par les sprites

En ce qui concerne la courbe de Lissajous utilisée dans l'exemple : on peut bien sûr programmer d'autres équations dans la routine "calcul". Signalons quelques exemples d'équations amusantes...

En coordonnées polaires :

assembleur

Rappel : la constante Pi peut être obtenue par arc_cos(-1) avec la routine SPAcos de la mathtrans.library (voir l'article sur les bibliothèques mathématiques).

En coordonnées paramétrées :

assembleur

Les couleurs

Il est possible de changer les couleurs des sprites en cours de défilement. Il suffit pour cela de modifier les couleurs fixées dans la liste Copper :

color 17 à 19 ; color 21 à 23 ; etc.

Cette modification doit, une fois de plus, être faite pendant l'IRQ3. Il faut repérer dans la liste Copper l'adresse du mot qui fixe la couleur en question et modifier le contenu de cette adresse. Exemple :

dc.w color19,$00F ; coul 19 = bleu, dans la liste Copper

...sera remplacé par :

dc.w color19 ; coul 19
repere :     ; fournit l'adresse en question
dc.w $00F    ; = bleu

...et dans la routine "newirq", on ajoute :

move.w repere,D0 ; ancienne couleur
sub.w #1,d0      ; calcule nouvelle couleur : $00E,$00D,$00C...
                 ; donc des bleus de nuances différentes
move.w D0,repere ; modifie la liste Copper

Cette sympathique option permet de faire des effets de couleurs en plus du défilement, aussi bien pour les sprites que pour le fond (color 0).

Dessins supplémentaires

En ce qui concerne enfin le bitplane qui n'est pas utilisé ici : il est possible d'ajouter un décor au dessin en transférant quelques octets dans la zone mémoire dont l'adresse figure dans "bplanel" si l'on a ajouté dans la liste Copper :

dc.wcolor1,$FFF ; move.w #$FFF,$DFF182

...pour fixer la couleur 1 en blanc par exemple. Voir à ce sujet la suite d'articles sur le Blitter et les défilement que l'on peut en tirer.

Exemple :

assembleur

Quelques explications au programme source qui suit. L'ordre des opérations se réduit à ceci :
  1. Ouverture des bibliothèques avec test de réussite.
  2. Réservation de mémoire Chip pour le bitplane avec test de réussite.
  3. Préparation de la liste Copper en mémoire Chip.
  4. Détournement de l'IRQ3 : fournit la routine d'animation.
  5. Activation de la nouvelle liste Copper.
  6. Lancement du DMA et attente du bouton gauche de la souris.
  7. Restauration du système : DMA, liste Copper, IRQ3.
  8. Libération de la mémoire.
  9. Fermeture des bibliothèques.
Voilà ! Vous pouvez maintenant définir vos propres sprites, les animer, bidouiller les couleurs pour faire des dégradés...

Attention : ce programme nécessite la présence de la mathtrans.library dans le répertoire Libs: de votre disquette système.

assembleur
assembleur
assembleur
assembleur
assembleur
assembleur
assembleur
assembleur
assembleur


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