guilc Le 21/02/2003 à 04:30 Voila, j'ai un petit probleme : pour exécuter un programme, j'utilises ça :
char execASM (char *str)
{
char *src, name[20];
unsigned short len;
HANDLE handle;
SYM_ENTRY *SymPtr;
if (utilise (str))
{
return 1;
}
name[0] = 0;
strcpy (name+1, str);
handle = DerefSym (EM_twinSymFromExtMem (name+1+strlen (str), HS_NULL))->handle;
if (HeapGetLock (handle))
{
src = HeapDeref (handle);
handle = 0;
}
else
src = HLock (handle);
len = *(unsigned short*)(src) + 2;
EX_patch (src + 0x40002, src + len + 0x3FFFF);
// Appel avec support du RETURN_VALUE
TRY
asm volatile("movem.l %d0-%d7/%a0-%a6,-(%sp)");
ASM_fastcall (src + 0x40002);// ASM_fastcall parce qu'il faut des nop's
asm volatile ("nop; nop; nop; nop;"); // il les faudra si le prog appelé a un "#define RETURN_VALUE"
asm volatile("movem.l (%sp)+,%d0-%d7/%a0-%a6");
ONERR
ST_showHelp ("Erreur");
ENDTRY
if (handle)
HeapUnlock (handle);
if ((SymPtr = SymFindPtr (name+1+strlen (str), 0))->flags.bits.twin)
SymDelTwin (SymPtr);
return 0;
}
Or, il semblerait que sur cetaines configurations, il apparaisse une "error memory". De plus, l'erreur se produit de préférence a l'écution d'un prog avec arguments, empilés sur la pile comme ça :
char execInt (char *str, char *interpr)
{
unsigned char *src, name[20], r = 0;
unsigned short len;
ESI top_estack_backup = top_estack;
SYM_ENTRY *SymPtr;
name[0] = 0;
strcpy (name+1, str);
push_END_TAG();
push_expr_quantum (name+1+strlen (str), STR_TAG);
strcpy (name+1, interpr);
SymPtr = SymFindPtr (name+1+strlen (interpr), 0);
if (!SymPtr)
return 5;
r = execASM (interpr);
top_estack = top_estack_backup;
return r;
}
Donc je voudrais savoir si cette méthode est valide...
Petite précision : j'utilise les Twins plutot qu'un HeapAllocHigh car sinon, l'éxécution d'un prog comme Tictex plante plus ou moins, et en plus c'est sensé etre la méthode de TI...
Ça m'a l'air correct. Je pense que le problème est que ton shell consomme tout simplement trop de mémoire.
guilc Le 21/02/2003 à 13:01 ce qui est bizarre, c'est que ça marchait dans la version 1.06, par contre dans la version 1.09, ça plante chez un utilisateur de 89 HW2 ROM 2.05. Par contre, chez moi (89 HW1 2.05), ça marche très bien.
Et au niveau mémoire, j'en consomme pas plus a la 1.09 qu'a la 1.06 !
En gros, pour ces routines, la seule chose que j'ai changé, c'est la version de TIGCC...
Kevin Kofler Le 21/02/2003 à 15:12Edité par Kevin Kofler le 21/02/2003 à 15:13 Nous aussi, on se soucie de la compatibilité antérieure. S'il identifie un problème concret lié à la nouvelle version de TIGCC, qu'il nous la reporte. Ici, je pense que le problème est tout simplement que son shell consomme trop de mémoire.
Guilc, même si le shell a grossi d'un seul octet, ça suffit pour expliquer qu'une erreur Memory apparaît là où il n'y en avait pas avant. Et la raison pour laquelle ça apparaît sur une calculatrice et pas sur une autre est probablement une différence dans la taille de mémoire consommée par des TSRs.
Ce genre de trucs se reporte comme un bogue. Ce n'est pas normal.
Et depuis la version 0.93, je vérifie personnellement qu'il n'y a pas de problèmes de compatibilité (en compilant TI-Chess - Thomas s'était lui aussi plaint qu'il a été obligé à chaque fois de changer 2-3 trucs dans TI-Chess quand il a changé de version de TIGCC, donc je vérifie maintenant pour que cela ne se produise plus). La 0.94 devrait accepter tout ce qui était accepté par la 0.93, à condition de ne pas utiliser -mregparm ou USE_FLINE_ROM_CALLS (si on utilise ça, un portage est nécessaire dans certains cas).
Quel était le programme exécuté? Il y a quand-même 42 KO sur les 192 KO qui sont consommés, c'est trop pour pas mal de programmes. À titre de comparaison, TICTEX consomme 7 KO seulement lors de l'exécution d'un programme.
Bon, bah, dans ce cas-là, je pense que c'est un bogue de TxtRider tout simplement. Et il n'a pas besoin de tant de mémoire normalement, mais c'est un programme spécialiste des bogues bizarres...
guilc Le 22/02/2003 à 11:16 Ouaip, c'est bien Txtrider le probleme : l'utilisateur chez qui ça plantait a mis hibtext, et ça marche...