Obligement - L'Amiga au maximum

Vendredi 23 mai 2025 - 12:10  

Translate

En De Nl Nl
Es Pt It Nl


Rubriques

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

Articles in English


Réseaux sociaux

Suivez-nous sur X




Liste des 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,
ALL


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


Galeries

Menu des galeries

BD d'Amiga Spécial
Caricatures Dudai
Caricatures Jet d'ail
Diagrammes de Jay Miner
Images insolites
Fin de jeux (de A à E)
Fin de Jeux (de F à O)
Fin de jeux (de P à Z)
Galerie de Mike Dafunk
Logos d'Obligement
Pubs pour matériels
Systèmes d'exploitation
Trombinoscope Alchimie 7
Vidéos


Téléchargement

Documents
Jeux
Logiciels
Magazines
Divers


Liens

Associations
Jeux
Logiciels
Matériel
Magazines et médias
Pages personnelles
Réparateurs
Revendeurs
Scène démo
Sites de téléchargement
Divers


Partenaires

Annuaire Amiga

Amedia Computer

Relec


A Propos

A propos d'Obligement

A Propos


Contact

David Brunet

Courriel

 


Programmation : Assembleur 68k - défilement qui ondule verticalement
(Article écrit par François Fleuret et extrait de Génération 4 - avril 1989)


Pour continuer notre découverte des défilements sur Amiga, nous allons faire ici un défilement qui ondule verticalement avec une ombre portée, comme celui de la Workbench Demo de Wild-Coppers.

L'ombre portée est facilement réalisable en utilisant deux plans de bits qui pointent sur la même mémoire vidéo avec un décalage de 320 octets, soit huit lignes verticalement, et un décalage horizontal réalisé avec le registre BPLCON1 prévu à cet effet (car si on le fait avec les adresses, on voit apparaître à gauche de l'écran l'ombre de la partie du texte la plus à droite). Le vrai problème se trouve donc au niveau du défilement lui-même.

Contrairement à ce que l'on pourrait penser, l'utilisation du Copper n'est pas la meilleure méthode pour réaliser une telle animation car la liste Copper aurait une longueur de 20 ko et il faudrait recalculer 2560 MOVE à chaque VBL avec le 68000. Donc, il faut la faire avec le Blitter, le Copper n'étant utilisé que pour des tâches secondaires telles que les dégradés de couleurs. Bien que l'utilisation du Blitter soit en général déconseillée, il faut bien reconnaître que les transferts de blocs permettent de produire certains effets irréalisables sans eux. Ici, nous devons faire un défilement ondulant, il est donc hors de question de faire un gros transfert pour décaler tout le texte, il faut gérer le bloc en plusieurs morceaux. La précision horizontale de l'ondulation (largeur des "marches d'escalier" dans les courbes) sera de quatre points. La méthode retenue consiste donc à faire le défilement en découpant le bloc en tranches de quatre points de largeur. La théorie est simple et limpide, la pratique l'est moins.

Le programme se déroule ainsi : dans une table nommée "TABLE_ONDE" se trouvent les adresses correspondant aux "altitudes" où doivent se trouver chacune de ces tranches. Cette table est calculée avec un programme BASIC (voir fin d'article) à l'aide d'une fonction sinus. Dans une seconde table qui se trouve au label "TABLE_HAUTEURS" se trouvent les hauteurs actuelles de chacune de ces tranches. On sait donc où aller chercher la tranche et où la recopier. Dans trois autres tables (TABLE_SRC, TABLE_DST et TABLE_MSK) se trouvent les adresses de départ et d'arrivée des transferts théorique (sans le mouvement vertical) ainsi que l'adresse où se trouve le masque.

On fait le défilement ainsi : on gère les tranches une par une de la gauche vers la droite ; pour chacune d'entre elles, on doit calculer l'adresse de départ et d'arrivée avec les tables citées ci-dessus. On commence par prendre la somme de l'adresse de base du plan de bits et de l'adresse où doit se faire le défilement. On ajoute ensuite à cette adresse l'adresse de départ du transfert (TABLE_SRC) et l'adresse où se trouve la tranche actuelle (TABLE_HAUTEURS) et on obtient ainsi l'adresse du pointeur pour la source A. On fait de même avec la table TABLE_DST, mais on ajoute ensuite l'adresse prise dans TABLE_ONDE. On obtient ainsi les adresses pour la destination ; on sauve ensuite dans TABLE_HAUTEURS la nouvelle hauteur prise dans TABLE_ONDE. On a donc l'adresse de départ et celle d'arrivée, il reste le problème des masques car on gère des blocs des quatre points de large au milieu de mots de 16 points, il faut donc utiliser un masque pour recopier la tranche que l'on est en train de traiter sans écraser les mots où elle doit être recopiée, on utilise donc les sources B et C, B pointant sur l'adresse où l'on va recopier la tranche et C sur le masque. Avec cette opération, on garde tout le mot destination sauf les quatre points où l'on place la tranche. L'opération logique sera donc (les lettres en minuscules représentent le "NOT") :

D=(A.c),(B*C)

...que l'on peut transformer en :

D=(A*c)*(B+b),(B.C)*(A+a)
D=A*B*c+A*b*c+A*b*c+a*b*c
D=ABc+Abc+Abc+abc

Donc les bits 6, 4, 7 et 3 de BLTCON0.

Les déplacements de quatre points vers la gauche se font avec un décalage de 12 pts vers la droite car comme les rotations fonctionnent avec un barillet, ce qui sort à droite revient à gauche ; malheureusement, lorsque l'on fait cela, le bloc descend d'une ligne c'est pourquoi les adresses de TABLE_DST sont parfois négatives, elles remontent le bloc pour corriger ce défaut.

Pour faire entrer les lettres à droite de l'écran, on utilise un tampon où se trouve la lettre en cours d'apparition, ce tampon fait 64x32 points. A chaque VBL, on le décale de quatre points vers la gauche après avoir recopié la colonne de gauche dans le plan de bits.

Il faut noter également que pour éviter que les tranches laissent des traces en haut et en bas, on rajoute quatre lignes vides au-dessus et en dessous en déplaçant des blocs de 40 lignes (au lieu de 32) et en faisant commencer le défilement quatre lignes plus haut que normalement ; ainsi, ces huit lignes noires effacent ce qui restait de la tranche. Si vous voulez utiliser une table qui fait des déplacements verticaux de plus de quatre points, il faudra modifier ce nombre de lignes noires pour qu'il corresponde au déplacement vertical maximum.

Pour que l'ondulation soit dynamique, il faut que la TABLE_ONDE varie, c'est pourquoi on utilise un pointeur (POINTEUR_TABLE) plutôt qu'une adresse fixe pour pouvoir donner l'impression que l'onde se déplace sur le texte. La vitesse de déplacement du pointeur est contenue dans VITESSE, et on peut la modifier en plaçant des codes négatifs dans le texte. Lorqu'il rencontre un tel code, le programme le rend positif puis le multiplie par 4 pour obtenir une vitesse de déplacement en nombre d'octets par VBL (on multiplie par 4 car la table est faite d'adresses chacune sur un mot long).

Comme ce défilement est réalisé avec le Blitter, il prend beaucoup de temps dans la VBL, il faut donc éviter que le balayage passe sur le texte pendant que l'on déplace les tranches (il y aurait dans ce cas un "décrochage" très laid) pour cela, il faut placer le texte en bas de l'écran ou bien attendre un peu après l'IRQ du Copper avant d'appeler la routine SCROLL.

Pour ce qui est du jeu de caractères, l'image qu'il faut utiliser est la même que celle du défilement qui s'enroule (320x256 monochrome non compactée) ainsi que la table des adresses (que vous pouvez donc réutiliser). Les lettres doivent faire au maximum 30 points de haut, évitez d'utiliser la première et la dernière ligne car elles laisseraient des traces pendant les déplacements rapides.

Le listing est prévu pour le KSeka mais il est facilement adaptable à d'autres assembleurs.

Assembleur 68k
Assembleur 68k
Assembleur 68k
Assembleur 68k
Assembleur 68k
Assembleur 68k
Assembleur 68k
Assembleur 68k
Assembleur 68k

Voici le petit programme BASIC qui vous fait un fichier ".s" qui contient la table de la trajectoire. En changeant la formule qui calcule la forme de l'onde, vous pouvez faire varier les effets ; par exemple, on peut faire une partie de la table avec une fréquence et l'autre avec une autre, on crée ainsi l'effet d'une "vague" qui se déplace sur le texte.

BASIC

Et voilà, un défilement de plus pour vos démos. Le gros défaut de ce défilement est le temps qu'il prend dans la VBL (presque le tiers), ce qui est gênant, surtout si vous le faites sur deux plans de bits. Néanmoins, il était intéressant de voir ce que le Blitter peut faire de plus complexe que de simples transferts rectangulaires.


[Retour en haut] / [Retour aux articles]