Comment ecrire en C un installeur de TSR (pas d'utilisation de Sample TSR)???
cf post 12
21: // On ajoute le TSR à installer en mémoire 22: #include "kbdhook.h"
3: // Pour pouvoir empécher le lancement sur 89
4: #define USE_TI89
[...]
30: // On empeche tout lancement sur une TI89
31: if (TI89)
32: {
33: ST_helpMsg("Uniquement pour 92+ et V200")
34: return; 35: }
41: if (!h220xTSR())
42: {
43: ST_helpMsg("RAM insuffisante")
44: return; 45: }
48: // Taille du TSR+12 bits pour la signature et 4 bits pour enregistrer l'emplacement de l'ancien hook
49: if (!(place=HeapAllocHigh(sizeof(kbdhook)+16)))
50: {
51: ST_helpMsg("RAM insuffisante")
52: return;
53: }
54: debuga("point 2") 55:
56: // L'adresse ou l'on peux stocker le TSR
57: ptsr=HeapDeref(place);
58: ptsr+=0x40010; 59: debuga("point 3")
63: // On copie la signature
64: memcpy(ptsr, signature, 12);
65: ptsr+=12;
66: debuga("point 4")
67:
68: // On copie l'adresse du vieux hook
69: *((unsigned long*)ptsr)=(unsigned long)EV_hook;
70: ptsr+=4; 71: debuga("point 5")
73: // On copie le tableau de char contenant le hook
74: memcpy(ptsr, kbdhook, sizeof(kbdhook));
75: ptsr+=sizeof(kbdhook); 76: debuga("point 6")
78: // On bouge le TSR dans une zone particuliére de la mémoire
79: EX_patch(ptsr+2, ptsr+sizeof(kbdhook)-2); 80: debuga("point 7")
82: // On met sur le stack l'ancien hook (le TSR le récupérera) 83: push_longlongint((long long)EV_hook);
2) À la fin
* vérifier si "vieux hook d'évènements" est non nul
* s'il est non nul:
- copier la structure d'évènements vers a2, parce que TeOS l'attend là
- passer la structure d'évènements comme un argument (sur la pile en (a7)) - l'appeler
IV) Remarques sur l'usage en C Utilisez toujours l'option "-ffixed-a2" (sous "Compiler Options" si vous utilisez TI-GCC IDE) pour être sûr que a2 n'est pas modifié (sinon vous devriez le restaurer manuellement avec de l'assembleur inline).
85: // On appelle notre hook (enfin!!!)
86: ASM_call(ptsr+2); 87: debuga("point 8")
89: // On sauvegarde la nouvelle valeur du EV_hook
90: EV_hook=ptsr;
91: debuga("point 9")
92: 93: ST_helpMsg("KbdFunc €1.00 installé")




slubman a écrit :
Essai de comprendre grosso modo le code de celui ci![]()
Ou elle vont ces deux lignes???
extern void **program_start asm("tigcc_compiled.")
volatile void *OldHook=program_start[-1];

#define USE_TI92PLUS
#define USE_V200
//#define EXECUTE_IN_GHOST_SPACE
#include <tigcclib.h>
// Pour le deboguage
#define debug
#ifdef debug
#define debuga(p) (ST_helpMsg(p))
#else
#define debuga(p)
#endif
// On ajoute le support pour les HW2 (par Kevin KOFLER)
#include "h220xtsr.h"
// On ajoute le TSR à installer en mémoire
#include "kbdhook.h"
// La signature du TSR
#define signature "evHkKbdFunc "
// La routine d'insatallation du TSR en mémoire
void _main(void)
{
// Handle du bloc alloué pour installer le hook
HANDLE place;
void *ptsr;
short msg;
msg=h220xTSR();
switch(msg)
{
case -3:
ST_helpMsg("Hw2patch installé");
break;
case -2:
ST_helpMsg("Installation sur AMS1");
break;
case -1:
ST_helpMsg("Installation sur HW1");
break;
case 0:
ST_helpMsg("RAM insuffisante");
return;
break;
default:
break;
}
debuga("point 1");
// Taille du TSR+12 bits pour la signature et 4 bits pour enregistrer l'emplacement de l'ancien hook
if (!(place=HeapAllocHigh(sizeof(kbdhook)+16-2)))
{
ST_helpMsg("RAM insuffisante");
return;
}
debuga("point 2");
// L'adresse ou l'on peux stocker le TSR
ptsr=HeapDeref(place);
ptsr+=0x40000;
debuga("point 3");
// On installe le TSR proprement dit en mémoire
// On copie la signature
memcpy(ptsr, signature, 12);
ptsr+=12;
debuga("point 4");
// On copie l'adresse du vieux hook
*((void**)ptsr)=EV_hook;
ptsr+=4;
debuga("point 5");
// On copie le tableau de char contenant le hook
memcpy(ptsr, kbdhook+2, sizeof(kbdhook)-2);
debuga("point 6");
// On bouge le TSR dans une zone particuliére de la mémoire
EX_patch(ptsr, ptsr+sizeof(kbdhook)-3);
debuga("point 7");
// On appelle notre hook (enfin!!!)
ASM_call(ptsr);
debuga("point 8");
// On sauvegarde la nouvelle valeur du EV_hook
EV_hook=ptsr;
debuga("point 9");
ST_helpMsg("KbdFunc €1.00 installé");
}
#define USE_TI92PLUS
#define USE_V200
#include <tigcclib.h>
// Prototypes des fonctions
void launch(const char*);
void apd(void);
// Variables globales
//volatile EVENT_HANDLER *oldhook=NULL;
CALLBACK void _main(EVENT *ev)
{
extern void **program_start asm("tigcc_compiled.");
void *OldHook=program_start[-1];
if(ev->Type==CM_KEYPRESS)
{
// Appui sur [<>]+[A]
if(ev->extra.Key.Code==8257)
{
apd();
ev->extra.Key.Code=0;
}
// Appui sur [<>]+[F1]
if(ev->extra.Key.Code==8460)
{
launch("kbdfunc1");
ev->extra.Key.Code=0;
}
// Appui sur [<>]+[F2]
if(ev->extra.Key.Code==8461)
{
launch("kbdfunc2");
ev->extra.Key.Code=0;
}
// Appui sur [<>]+[F3]
if(ev->extra.Key.Code==8462)
{
launch("kbdfunc3");
ev->extra.Key.Code=0;
}
// Appui sur [<>]+[F4]
if(ev->extra.Key.Code==8463)
{
launch("kbdfunc4");
ev->extra.Key.Code=0;
}
// Appui sur [<>]+[F5]
if(ev->extra.Key.Code==8464)
{
launch("kbdfunc5");
ev->extra.Key.Code=0;
}
// Appui sur [<>]+[F6]
if(ev->extra.Key.Code==8465)
{
launch("kbdfunc6");
ev->extra.Key.Code=0;
}
// Appui sur [<>]+[F7]
if(ev->extra.Key.Code==8466)
{
launch("kbdfunc7");
ev->extra.Key.Code=0;
}
// Appui sur [<>]+[F8]
if(ev->extra.Key.Code==8467)
{
launch("kbdfunc8");
ev->extra.Key.Code=0;
}
}
// On verifie l'existence d'un ancien hook
if (OldHook)
{
ASM_call(OldHook);
}
}
// Lancement d'un prog (tiré de la FAQ de TIGCC)
void launch(const char *prog)
{
char fname[25]="main";
HANDLE h;
TRY
strcat(fname, prog);
strcat(fname, "()");
push_parse_text(fname);
h=HS_popEStack();
NG_execute(h, FALSE);
HeapFree(h);
ONERR
ST_helpMsg("Lancement impossible");
ENDTRY
}
// Réglage de l'APD
void apd(void)
{
// Fonction locale (extension GNU)
void trace(short lcd_height, short lcd_width)
{
char copyright[37],info[37];
SCR_RECT ecran,cache;
WIN_RECT cadre;
//Initialisation des structures SCR_RECT
ecran.xy.x0=0;
ecran.xy.y0=0;
ecran.xy.x1=2*lcd_width;
ecran.xy.y1=2*lcd_height;
cache.xy.x0=lcd_width-67;
cache.xy.y0=lcd_height-29;
cache.xy.x1=lcd_width+67;
cache.xy.y1=lcd_height+26;
//Fin de l'initalisation des strucures SCR_RECT
//Initialisation de la structure WIN_RECT
cadre.x0=lcd_width-68;
cadre.y0=lcd_height-30;
cadre.x1=lcd_width+68;
cadre.y1=lcd_height+26;
//Fin de l'initialisation de la structure WIN_RECT
sprintf(copyright," Par DOUALOT Nicolas DNDD.INC %c2001",169); // caractère n°169=®
sprintf(info,"%c,%c=change [ESC]=CANCEL [ENTER]=OK",23,24);
FontSetSys(F_6x8); //Sélection des caractères de taille moyenne.
// Tracé du cadre.
ScrRectFill(&cache,&ecran,A_NORMAL);
cache.xy.x0=lcd_width-66;
cache.xy.y0=lcd_height-18;
cache.xy.x1=lcd_width+66;
cache.xy.y1=lcd_height+18;
ScrRectFill(&cache,&ecran,A_REVERSE);
DrawClipRect(&cadre,&ecran,A_REVERSE);
DrawStrXY(lcd_width-24, lcd_height-27, "APD_USER", A_XOR);
DrawStrXY(lcd_width-45,lcd_height-16,"Valeur de l'APD",A_REPLACE);
FontSetSys(F_4x6); //Sélection des caractères de petite taille.
DrawStrXY(lcd_width-66, lcd_height+20, copyright, A_XOR);
DrawStrXY(lcd_width-65,lcd_height+12,info,A_REPLACE);
FontSetSys(F_6x8); //Sélection des caractères de taille moyenne.
// Fin du tracé du cadre.
};
//Fin du tracé.
//Déclaration des variables locales.
char *screensave=NULL;
char b[13]={" "};
short key, init, lcd_height,lcd_width;
unsigned short apd;
//Fin de la déclaration des variables locales.
//Initialisation des variables locales.
if (!(screensave=(char*)malloc(3841*sizeof(char)))) return;
LCD_save(screensave);
init=OSInitBetweenKeyDelay(15);
apd=1+OSTimerCurVal(APD_TIMER)/20; //Récupération de la valeur de l'apd.
key=0; //Correspond à la valeur de la touche appuyée.
lcd_height=128/2; //Centre de l'écran en hauteur.
lcd_width=240/2; //Centre de l'écran en largeur.
//Fin de l'initialisation des variables locales.
trace(lcd_height,lcd_width); //Activation du tracé du cadre.
//Boucle principale du programme.
do
{
sprintf(b," %d secondes ",apd); //Formatage de la chaîne de caractères.
DrawStrXY(lcd_width-3*strlen(b),lcd_height-3,b,A_REPLACE);
key=ngetchx(); //Mémorisation de la touche appuyée
if (key==338 && apd<=998) apd++; //Si on appuis sur [HAUT].
if (key==344 && apd>=11) apd--;//Si on appui sur [BAS].
}
while (key!=264 && (key!=13)); //Si on appui sur [ESC] ou [ENTER].
//Fin de la boucle principale.
//Enregistrement de la nouvelle valeur de l'APD si on a appuyé sur [ENTER].
if (key==13)
{
OSFreeTimer(APD_TIMER); //Libération du timer corespondant àl'APD.
OSRegisterTimer(APD_TIMER, apd*20); //Enregistrement de la nouvelle valeur.
};
OSInitBetweenKeyDelay(init);
LCD_restore(screensave);
free(screensave);
//Fin de l'enregistrement de la nouvelle valeur de l'APD si on a appuyé sur [ENTER].
}
87: // On appelle notre hook (enfin!!!)
88: ASM_call(ptsr); 89: debuga("point 8")

