1

Salut !
Je voudrais savoir comment fiare pr exécuter du code externe à mon programme... sans que ça plante smile
(pour le moment, j'obtient en gros le bon résultat, mais, à la fin de l'exécution du programme, preOS me lance un Crash Intercepted)

En gros : j'ai du code dans un zone mémoire alouée dynamiquement...
Et je voudrai trouver moyen de brancher dessus...





Je me suis fait un petit programme de test...
Voila la fonction que je voudrai exécuter à partir de celle que je posterai plus loin :
#define USE_TI92PLUS

//#define OPTIMIZE_ROM_CALLS  // On ne le met pas : permet de libérer le registre a5, qui pourra être utilisé pour des calculs => peut permettre d'accélérer le moteur (on n'utilise pas ou peu de ROM_CALL dans le moteur)
//#define SAVE_SCREEN  // On sauvegarde et restaure l'écran par nous même : permet d'afficher un message ds la ST en quittant.
#define NO_AMS_CHECK  // On ne vérifie pas sous quelle ROM on tourne. => il faut tester sur toutes les ROM si ça marche... si ça marche passur certaines, il faudra restreindre.
#define NO_EXIT_SUPPORT  // On ne veut pas d'exit ou d'atexit. => allége la taille du programme.
//#define NO_CALC_DETECT  // ne pas le  mettre permet d'optimiser des pseudo constantes (compat.h), vu que les deux calculatrices sont utilisées.
//#define USE_FLINE_ROM_CALLS  // Ne pas le mettre fait que les ROM_CALL fonctionneront sur toutes les ROM (pas que 2.04 et supérieures)... et seront + rapide que par le 1111 emulator.
//#define STRICT_POINTERS  // Question de sécurité...

#include <tigcclib.h>

void ma_fonction(void)
{
	ST_showHelp("Salut toi !")
	ngetchx();
}

Je compile ça ainsi :
tigcc -Os -outputbin list.c






Puis, je lance tbin2hex dessus, de la façon suivante :
ttbin2hex -a list list.bin list.h
Ce qui me donne en résultat, dans list.h, la liste suivante :
static unsigned char list[57] = { 
0x00,0x37,0x53,0x61,0x6c,0x75,0x74,0x20,0x74,0x6f,
0x69,0x20,0x21,0x00,0x4e,0x56,0x00,0x00,0x2f,0x0a,
0x34,0x7c,0x00,0xc8,0x20,0x52,0x48,0x7a,0xff,0xe6,
0x20,0x68,0x03,0x98,0x4e,0x90,0x20,0x52,0x20,0x68,
0x01,0x44,0x4e,0x90,0x24,0x6e,0xff,0xfc,0x4e,0x5e,
0x4e,0x75,0x00,0x00,0x00,0x00,0xf3};

(le static, c'est moi qui l'ai rajouté à la main)







A présent, dans mon programme, je voudrai faire appel à cette fonction...
Voila le source de mon programme :
#define USE_TI89
#define USE_TI92PLUS
#define USE_V200
#define EXECUTE_IN_GHOST_SPACE
#define OPTIMIZE_ROM_CALLS
#define MIN_AMS 100
#define SAVE_SCREEN
#include <tigcclib.h>

static unsigned char list[57] = { 
0x00,0x37,0x53,0x61,0x6c,0x75,0x74,0x20,0x74,0x6f,
0x69,0x20,0x21,0x00,0x4e,0x56,0x00,0x00,0x2f,0x0a,
0x34,0x7c,0x00,0xc8,0x20,0x52,0x48,0x7a,0xff,0xe6,
0x20,0x68,0x03,0x98,0x4e,0x90,0x20,0x52,0x20,0x68,
0x01,0x44,0x4e,0x90,0x24,0x6e,0xff,0xfc,0x4e,0x5e,
0x4e,0x75,0x00,0x00,0x00,0x00,0xf3};


#define ma_fonction __ma_fonction__
void (*__ma_fonction__)(void) = NULL;

void _main(void)
{
	
	unsigned char *p_ma_fonction = malloc(sizeof(list));
	memcpy(p_ma_fonction, list, sizeof(list));
	
	EX_patch(p_ma_fonction+0x40002, p_ma_fonction+sizeof(list)+0x3FFFF);
	// je sais pas trop si ça va, le coup du EX_patch...

	__ma_fonction__ = p_ma_fonction;
	
	ST_showHelp("Avant appel")  // => ça marche
	ngetchx();
	
	ma_fonction();   // => ça marche : la fonction est appelée, et je vois qu'elle me met son message dans la ST
	
	ST_showHelp("Apres retour")  // => ça marche
	ngetchx();
	
	free(p_ma_fonction);  // je sais pas trop si ceci est correct...
}
// => En quittant le prog, ça plante  (Crash Intercepted)
// D'après GLD (un "analyseur de crash") fourni dans la suite de preOS, c'est une Adress Error...


Ici, j'ai mis la liste dans le prog , et je la recopie en RAM avec le memcpy...
=> c'est en RAM, come ça devrait l'être...
(je n'utilise ceci que pour simplifier)

J'ai testé en supprimant le free... ça foire qd même à la sortie... et gld a pas marché sad (il n'a pas su me dire ce que ct comme erreur... tout bonnement, preOS a récupéré le crash, mais sans passser par la case gld sad)







En gros, mon but final est de pouvoir utiliser comme une sorte de "librairie".
Je sais que TIGCC propose les Dll, mais je ne veux pas les utiliser ici.
En effet, je veux placer le code d'un ou deux fonctions dans mon fichier de gfx... et je ne veux pas d'une Dll...
Les Dll, il faut au moment où on charge la Dll, le mettre en entier en RAM... ce que je ne veux surtout pas ! (ça me bouferai plus de RAM que la Ti n'en a, en comptant le reste de mon programme)
=> j'utilise un fihicer externe pour gagner en mémoire... et c'est pr la même raison que je veux pouvoir mettre cette fonction de dans.

En fait, je vais aller même un peu plus loin dans mon explication...
Je penses que j'ai la place dans mon programme de laisser ça dedans...
mais si je le laisse dans mon programme, il faudra que ce soit en RAM pdt toute l'exécution du programme...
Alors que si je le met dans une variable externe (ce que je veux faire), je pourrai le laisser en mémoire d'archive pdt le jeu (là où le prog a besoin de bcp de RAM libre), et le mettre en RAM pdt les menus (là où la RAM nécessaire pdt le jeu est libre)
=> c'est pr ça que je cherche la solution...


Si quelqu'un peu m'aider...
merci !
avatar
Tutorial C (TI-89/92+/v200) - Articles Développement Web (PHP, Javascript, ...)
« What is the sound of Perl? Is it not the sound of a wall that people have stopped banging their heads against? » - Larry Wall

2

Bon, en cherchant dans la FAQ, j'ai trouvé qu'en faisant un ASM_call, ça marche...
void _main(void)
{
	
	unsigned char *p_ma_fonction = malloc(sizeof(list));
	unsigned char *save_ma_fonction = p_ma_fonction;
	memcpy(p_ma_fonction, list, sizeof(list));
	
	EX_patch(p_ma_fonction+0x40002, p_ma_fonction+sizeof(list)+0x3FFFF);
	
	__ma_fonction__ = p_ma_fonction+0x40002;
	
	
	ST_showHelp("Avant appel")
	ngetchx();
	
	//ma_fonction();
	ASM_call (p_ma_fonction + 0x40002);
	
	
	ST_showHelp("Apres retour")
	ngetchx();
	
	free(save_ma_fonction);
}

mais comment faire pr passer des arguments à une fonction en externe avec ça ?
avatar
Tutorial C (TI-89/92+/v200) - Articles Développement Web (PHP, Javascript, ...)
« What is the sound of Perl? Is it not the sound of a wall that people have stopped banging their heads against? » - Larry Wall

3

Pour le crash, le problème est tout bête : comme tu n'as pas définit d'entry point dans le premier programme qui permet de créer la liste, bah, y'a pas d'entry point tout simplement : tigcc as mis la chaîne à afficher tout au début de l'executable, et quand on essaie d'executer le bout de code, ca execute la chaîne.
Ca ne fait pas tout planter tout de suite, ce sont des instructions valables, elles corrompent seulement la mémoire.

Tu as juste à remplacer void ma_fonction(void) par void _main(void) et c'est bon smile.

4

OK ExtendeD !
merci bcp !
avatar
Tutorial C (TI-89/92+/v200) - Articles Développement Web (PHP, Javascript, ...)
« What is the sound of Perl? Is it not the sound of a wall that people have stopped banging their heads against? » - Larry Wall