Obligement - L'Amiga au maximum

Jeudi 05 juin 2025 - 15:45  

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 - défilements via la graphics.library
(Article écrit par Little Zeus et extrait d'A-News (Amiga News) - décembre 1988)


Chers Amiga-users et chers Amiga-beginners : ce mois-ci, je préconise une nouvelle méthode d'apprentissage, j'ai décidé de rassembler dans un même article la rubrique débutants et la rubrique initiés. Je m'explique : comme promis le mois dernier, nous allons étudier les défilements ("scrollings" en anglais) via la graphics.library. Mais si les initiés connaissent déjà parfaitement le rôle des bibliothèques et peuvent d'ores et déjà se rendre à la deuxième partie de l'article qui concerne la routine d'application, les débutants devront lire l'article dans sa totalité.

Rappel sur les bibliothèques et le Blitter

Les Amiga 500 et 2000 possèdent des routines en ROM classées par type d'utilisation, c'est-à-dire que, par exemple, tout ce qui concernera les accès disque sera classé dans la dos.library, les traitements écrans, fenêtres et menus dans l'intuition.library. Mais, la bibliothèque qui nous intéresse réellement c'est la graphics.library qui, comme son nom l'indique, rassemble toutes les fonctions graphiques de base ainsi que toutes les routines utilisant le Blitter.

Nous venons de prononcer le mot "Blitter", mais qu'est-ce ? En gros, c'est un coprocesseur très utile pour les défilements. Et c'est justement grâce à celui-ci que nous allons pouvoir créer ci-après de très belles choses. Afin de pouvoir utiliser les routines d'une bibliothèque, il faut d'abord ouvrir celle-ci ou autrement dit la rendre fonctionnelle.

Mais alors, allons-nous devoir taper le programme qui ouvre les bibliothèques dans sa totalité ? La réponse est non. Car il existe l'exec.library qui est ouverte en permanence et en son sein existe une routine permettant d'ouvrir et de fermer telle ou telle bibliothèque (car toute bibliothèque ouverte en début de programme doit être fermée à sa fin).

Les bibliothèques commencent toutes par une table de suite de "jumps" et à chaque jump correspond une routine spécifique. Quand nous ouvrons une bibliothèque, l'ordinateur nous renvoie dans le registre d0 l'adresse de la fin de cette table ; il apparaît donc évident que si nous désirons appeler une des routines d'une bibliothèque, nous utiliserons un "jsr" suivi d'un décalage négatif... Comment, ça ne suit plus ?

Très bien, explicitons un peu : si la seule adresse de référence que nous ayions pour appeler tel ou tel jmp est la dernière adresse de la table, alors nous devrons soustraire à cette adresse le nombre d'octets correspondant au jmp désiré. Si cela paraît encore un peu vague pour certains, ils le comprendront mieux lors de l'étude de la routine.

Venons-en au fait : le décalage de la graphics.library qui nous intéresse est -396, décalage qui correspond au jmp appelant la routine "Scrollraster". Nous n'aurons plus besoin, dès lors, qu'à faire un jsr-396(a6) en ayant préalablement mis l'adresse de base de la graphics en a6.

Scrollraster permet tous les défilements : verticaux, horizontaux et en diagonales. De plus, il offre aussi bien la possibilité du défilement sur une pixel que celui sur 2, 3 ou plus. Il a cependant un défaut, il rend possible uniquement les défilements sur un rectangle, c'est-à-dire qu'il déplacera tout (et sans exception) ce qui sera dessiné dans celui-ci. Cependant, comme nous le verrons peut-être prochainement, cette tare est facilement contournable.

Autant de possibilités, autant de paramètres. Avant d'appeler Scrollraster nous devons le paramétrer comme suit :
  • Rastport -> dans a1
  • Valeur du défilement vertical -> dans d0
  • Valeur du défilement horizontal -> dans d1
  • Valeur de l'abscisse minimale du rectangle -> dans d2
  • Valeur de l'ordonnée minimale du rectangle -> dans d3
  • Valeur de l'abscisse maximale du rectangle -> dans d4
  • Valeur de l'abscisse maximale du rectangle -> dans d5
Peut-être serons-nous choqués par l'apparition du mot "rastport", nous n'expliquerons ce mois-ci ni son rôle ni la routine dans laquelle il s'inscrit par faute de place.

Une fois paramétré, Scrollraster peut être appelé sans que rien ne puisse l'empêcher de bien agir. Comme exemple d'utilisation de Scrollraster, nous créerons le défilement gauche-droite d'un BOB de taille inférieure à 100 pixels. Avant de lancer la routine, n'oublions pas d'ouvrir un écran ni d'afficher un BOB à l'intérieur du rectangle au moyen de la routine étudiée dans un article précédent.

La routine Scrollraster

Maintenant que nous avons bien mis les points sur les i, voyons la routine :

;	exec.library

openlibrary   = -408 
closelibrary  = -414
execbase      = $04
;	graphics.library

scrollraster  = -396 
initbitmap    = -390 
initrastport  = -198 
clearscreen   = -48

;	ouverture de la graphics.library
ouverturegraph:
   move.l execbase,a6 		;adresse d'execbase dans a6
   lea gfxname,a1		;nom de la library dans al
   jsr openlibrary(a6)
   move.l d0,gfxbase		;adresse de base de la graphics en gfxbase
   rts

;	fermeture de la graphics.library
fermeturegraph:
   move.l execbase,a6
   move.l gfxbase,a1
   jsr closelibrary(a6)
   rts       

;	initialise l'ecran 
initecran:
   move.l gfxbase,a6		;base de la graphics 
   move.l #bitmap,a0		;pointeur sur la bitmap 
   move.l #$05,d0		;nbre de plans de bits
   move.l #320,d1		;largeur de l'ecran
   move.l #200,12		;hauteur de l'ecran
   jsr initbitmap(a6)
   move.l b1,plane1 		;en b1 figure l'adresse de base du bit-plane1
   move.l b2,plane1+4		;en b2 figure l'adresse de base du bit-plane2
   move.l b3,plane1+8		;de meme pour le 3
   move.l b4,plane1+12		;le 4
   move.l b5,plane1+16		;et enfm le 5
   lea rastport,a1
   jsr initrastport(a6)
   move.l #bitmap,r_bitmap
   lea rastport, a1
   jsr clearscreen(a6)		;routine effacant l'ecran
   rts

;	defilement horizontal

scrollh:
   cmp.b #1,test1		;test pour savoir si defilement gauche ou droite
   beq scrollh1 		;si 1 alors defilement droite
   add.b #1,test 		;test correspondant au nombre de deplacements
   cmp.b #50,test
   bne va 			;si 50
   move.b #0,test 		;nbre de deplacements vers droite = 0 
   move.b #1,test1 		;1 pour defilement droite
va:
   move.l #1,dx 		;defilement de 1 pixel en abscisse
   move.l #0,dy 		;aucun defilement en ordonnee
   move.l #40,minx		;abscisse minimale du rectangle 
   move.l #150,miny		;ordonnee minimale du rectangle 
   move.l #280,maxx		;abscisse maximale du rectangle 
   move.l #180,maxy		;ordonnee maximale du rectangle 
   jsr scroll			;appel a la routine pour defiler
   rts
 ;	defilement droite
scrollh1:
   add.b #1,test		;nbre deplacements vers la droite
   cmp.b #50,test 		;test si 50 déplacement effectues
   bne va1 			;oui?
   move.b #0,test1		;alors defilement gauche
   move.b #0,test		;nbre de deplacements gauche = 0
   jmp scrollh			;on retourne au defilement gauche
   va1:
   move.l #-1,dx 		;defilement horizontal d'un pixel vers la droite
   jsr scroll
   rts
;	defilement 
;	routine chargeant les registres
scroll:
   move.l gfxbase,a6 
   lea rastport,a1 
   move.l dx,d0
   move.l dy,d1
   move.l minx,d2 
   move.l miny,d3 
   move.l maxx,d4 
   move.l maxy,d5 
   jsr scrollraster(a6)
   rts

;	differentes adresses 
bitmap:
  blk.w	4,0
plane1:
  dc.l 	0,0,0,0,0
rastport:
  blk.l 1,0
r_bitmap:
  blk.l	26,0
dx:
  dc.l	0 
dy:
  dc.l	0 
minx: 
  dc.l	0 
miny: 
  dc.l	0 
maxx: 
  dc.l	0 
maxy: 
  dc.l	0
 ;les valeurs contenues dans bl, b2, b3, b4 et b5 
 ;doivent etre identiques a celle de la Copperlist.
b1:
  dc.l	 $50000
b2: 
  dc.l	 $52260
b3: 
  dc.l	 $54500
b4: 
  dc.l	 $56800
b5: 
  dc.l	 $59100
test1:
  dc.b	0 			;defilement gauche pour commencer
test:
  dc.b	0 
gfxname:
  dc.b "graphics.library",0,0
gfxbase:
  dc.l	 $0

Nous venons de voir différentes routines servant à notre défilement, aussi faut-il savoir appeler chacune d'entre elles au moment propice.

En début de programme doit être exécutée la séquence suivante :

jsr ouverturegraph
jsr initécran

De plus, la partie de programme testant la souris doit être modifiée comme suit :

Wait:
  cmp.b #250,$dff006		;test si le Copper a balaye l'ecran 
  bne.s wait			;sinon attendre
  jsr scrollh			;appel de la routine de defilement
  btst #6,$bfe001
  bne.s Wait

Pour terminer, en fin de programme doit paraître un "jsr fermeturegraph".

Nous voici donc capables de faire des défilements de toutes sortes, et pourquoi pas un défilement de caractères !

Sur ce, je vous quitte et vous donne rendez-vous au mois de décembre et qui dit décembre dit Noël et qui dit Noël dit cadeau et qui dit cadeau dit surprise, donc vous ne saurez de quoi traite l'article du mois prochain qu'au moment de l'ouverture d'A-News 10 (Bruce Lepper : pour décembre, il faut lire janvier - merci les grévistes - mais la surprise sera la même).


[Retour en haut] / [Retour aux articles]