Suivez-nous sur X

|
|
|
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
|
|
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
|
|
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
|
|
A propos d'Obligement
|
|
David Brunet
|
|
|
|
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).
|