J'ai crée dans une librairie une variable qui prend une adresse d'une fonction et je voudrais savoir comment faire pour crée une fonction qui renvoie une adresse comme le fait GetPlane(?) en C?
J'ai essayé ça:
lea.l interrupt_handler,a0 dans ma librairie
Dans mon protoype en C:
#define int5 polysnd2__0014
extern unsigned char *int5 (void);
Si ça c'est bo alors comment faire pour modifier son contenu?
C'est bon.
Pour modifier son contenu, ben:
*(int5())=toto;
A oui en effet mais ça ne serait pas mieux de faire une fonction qui demande en paramètre une adresse pour être plus précis une fonction du genre:
void fonction (void);
int5 (fonction);
Mais dans ce cas ma librairie devient:
move.l 4(a7),interrupt_handler
Et le prototype:
#define int5 polysnd2__0014
extern void int5 (void *function);
Mais lorsque j'essaye ça, ça ne marche pas je fait:
void test (void)
{
...
}
int5 (test);
Comment dois-je faire?
Ça ne marche pas parce qu'il faut utiliser DEFINE_INT_HANDLER. Une interruption n'est pas une fonction normale.
Tiens, une suggestion (probablement assez stupide car ça n'est pas très utile et risque de poser de gros problèmes...): faire aussi une version de DEFINE_INT_HANDLER qui ne sauve/restaure aucun registre (responsabilité à l'utilisateur de le faire).
En effet ma librairie gére l'interruption 5 et je veux permettre au programmeur utilisant cette librairie d'avoir accèss à l'interruption 5 c'est pour quoi dans ma librairie à la fin de l'interruption 5 je fait un saut sur la fonction de l'utilisateur ici test. Dans cette fonction le programmeur doit restaurer a0.
Donc la fonction int5 demande un paramètre ici une fonction qui sera enregistrer dans une variable contenu dans la librairie et donc à la fin de l'interruption sautera à la fonction entrée dans int5.
Donc je n'ai pas besoin de DEFINE_INT_HANDLER.
Voilà en gros ce qui est dans ma libairie
interrupt_handler5:
....
....
....
move.l a0,-(a7)
move.l addr_interrupt,a0
jmp (a0)
rte
addr_interrupt contient l'adresse de la fonction du programmeur
int5:
move.l 4(a7),addr_interrupt
rts
Dans int5 je passe un argument sur la pile
En ASM cela donne:
MaFonction:
move.l (a7)+,a0
....
rte
Donc pour la fonction
move.l MaFonction,-(a7)
jsr int5
lea 4(a7),a7
En quelque sorte je voudrais faire ça en C.

Lionel Debroux Le 20/04/2003 à 16:05Edité par Boo le 20/04/2003 à 16:11 > C'est une très mauvaise idée.
Je m'en doutais vraiment... Mais j'ai posté quand même.
> Il n'y a pas de manière propre (c'est-à-dire sûre à 100% ) de sauvegarder/restaurer les registres à l'intérieur d'une fonction C.
Même avec un bout d'ASM inline déclaré comme volatile si nécessaire ?
Dois-je revoir carrément mon algorithme pour l'interruption 5? Et dans ce cas quelle seraot la meilleur façon (la plus propre) de permettre au programmeur d'avoir acces a cette interruption avec ma librairie?
Lionel Debroux Le 20/04/2003 à 16:07Edité par Boo le 20/04/2003 à 16:10 C'est quoi le smiley qui s'est ajouté ? C'est parce que j'ai mis "pourcent" ? Ah non, c'est le % ) qui fait ça... Evidemment...
>Pas très propre ça, parce que les registres ont peut-être déjà été traffiqués quand on les sauvegarde, ou le seront peut-être après la restauration.
OK.