Obligement - L'Amiga au maximum

Vendredi 06 juin 2025 - 12:16  

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 - 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...).


[Retour en haut] / [Retour aux articles]