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 68k - programmer plus propre avec SAVE_ALL et RESTORE_ALL
(Article écrit par François Fleuret et extrait de Génération 4 - avril 1989)
|
|
Plus propre
La programmation proche du matériel, et en particulier l'assembleur utilisé dans les démos,
ne s'entend pas bien avec le système d'exploitation de l'Amiga, nous allons aujourd'hui essayer de
les réconcilier.
Deux méthodes
Le système d'exploitation de l'Amiga est très complexe et cela force les programmeurs à rester
relativement "propres" dans leurs méthodes, comme vous l'avez sans doute remarqué dans les
précédents
listings, le type de programmation que je vous offre dans ces colonnes n'est pas vraiment un
exemple de rigueur. Je suis personnellement un adepte de la programmation "sauvage" qui consiste à
reprogrammer directement les coprocesseurs. Cette méthode ne peut pas s'intégrer correctement dans
un système, surtout quand il est multitâche. Pour limiter la casse, je vous donne ici deux routines
qui sauvent puis restituent les principaux registres utilisés par le système.
- La première, SAVE_ALL fait une copie de DMACON, INTENA et du vecteur de l'IRQ, arrête les
lecteurs et interdit le multitâche.
- La seconde, RESTORE_ALL, restitue ces registres ainsi que le pointeur de la liste Copper
puis réactive le multitâche.
Le seul point un peu particulier de ces deux routines se trouve au niveau de la restitution des
registres. Comme les modifications des registres des coprocesseurs se font en modifiant les bits
avec le bit 15 qui sert d'interrupteur, on vide tout d'abord les registres avec un MOVE.W #$7fff,xxxx
puis on remet la valeur que l'on avait sauvée après avoir mis le bit 15 à 1 (celui qui sert d'interrupteur)
ainsi que, dans certain cas, un autre bit qui sert de commutateur général.
Utilisation
L'utilisation de ces routines est simple, il suffit de placer un BSR SAVE_ALL tout au début de votre
programme puis un BSR RESTORE_ALL à la fin, juste avant le RTS final qui ramène au CLI ou bien
au Workbench.
save_all:
move.b #%10000111,$bfd100; Arrête les lecteurs
move.l 4,a6; Base d'EXEC
jsr -132(a6); FORBID (vire le multitâche)
move.l $6c,save_vecteur_irq; Sauve le vecteur de l'IRQ
move.w $dff01c,save_intena; Sauve INTENA
or.w #$8100,save intena; On met certains bits à 1 pour pouvoir tous les
replacer avec un OR.
move.w $dff002,save_dmacon; Sauve DMACON
or.w #$c000,save_dmacon
rts
|
restore_all:
move.l save_vecteur_irq,$6c
move.w #$7fff,$dff09a; Vide INTENA
move.w save_intena,$dff09a; Place la copie
move.w #$7fff,$dff096; Vide DMACON
move.w save_dmacon,$dff096; Place la copie
move.l 4,a6. Base d'EXEC
lea name_glid,a1; Ouvre la graphics.library
moveq #0,d0; Vide D0
jsr -552(a6); OPEN_LIBRARY
move.l d0,a0; Sauve le gestionnaire
move.l 38(a0),$dff080; STARTUPCL dans COPL1C
clr.w $dff088; COPJMP1
move.l d0,a1; Adresse de la bibliothèque
jsr -414(a6); CLOSE_LIBRARY
jsr -138(a6(; PERMIT (remet le multitâche)
rts
save_intena:dc.w 0
save_dmacon:dc.w 0
save_vecteur_irq:dc.l 0
name_glib:dc.b "graphics.library",0
even
|
En général, les animations des démos se font durant l'IRQ générée par le Copper, la routine qui
tourne hors de l'IRQ est réduite à la plus simple expression et se limite souvent à un bête test
de souris du type :
Wait_mouse:
btst #6,$bfe001
bne wait_mouse
|
Cela bloque l'exécution jusqu'à ce que l'on appuie sur la touche gauche de la souris. Vous pouvez
maintenant modifier les programmes des numéros précédents pour que l'on puisse les quitter et
revenir au CLI (c'est quand même plus beau...).
|