je debute en C (en fait je connais pas mal la prog mais je connais le couple TiGCC/VTI depuis deux jours, ils sont mignons

J'ai fait une fonction delay basée sur USER_TIMER (qui attend donc x/20 secondes).
Je crée un sprite en 8x8.
Je lui donne un mouvement avec _rowread (TI89) pour qu'il continue sur sa lancée (style snake).
Si j'utilise delay(1) en debut (ou en fin) de boucle pas de probleme, mais c'est lent !
Par contre si je vire la ligne, ou si je la remplace par une boucle for (0->2000 par ex.) la caltos a une facheuse tendance a quitter toute seule le programme (quand j'appuie trop vite sur les touches, que je fais faire des aller-retours trop rapides, ou meme si j'appuie sur une touche par seconde: au bout de 8 elle quitte) !
J'aimerais comprendre...
merci d'avance,
naholyr
P.S: y a-t-il quelque chose de plus rapide que le USER_TIMER parce que si je dois faire avec les vingtiemes de secondes a l'avenir, ca va etre infernal...
SOURCE:
#define OPTIMIZE_ROM_CALLS
#define SAVE_SCREEN
#include <tigcclib.h>
short _ti89;
// Attend x /20 secondes
void delay(short x) {
OSFreeTimer(USER_TIMER);
OSRegisterTimer(USER_TIMER, x);
while (!OSTimerExpired(USER_TIMER));
}
// Main Function
void _main(void)
{
short fin=0;
short x=0, y=0;
signed char xx=1, yy=0;
unsigned char Curs = {0x3C,0x42,0x99,0xBD,0xBD,0x99,0x42,0x3C};
ClrScr();
Sprite8(x, y, 8, Curs_LIGHT, LCD_MEM, SPRT_OR);
ST_showHelp("Pressez une touche pour commencer")
ngetchx();
ClrScr();
Sprite8(x, y, 8, Curs_LIGHT, LCD_MEM, SPRT_OR);
while (fin!=1) {
// on attend 1/20 secondes
delay(1);
// ####### ET SI JE RETIRE CETTE LIGNE ######
// la calculatrice quitte le programme toute seule...
// serait-ce un heap overflow qu'elle previent ?
if (_rowread(0x7E)&0x2) {
// gauche
xx=-1;
yy=0;
}
if (_rowread(0x7E)&0x8) {
// droite
xx=1;
yy=0;
}
if (_rowread(0x7E)&0x1) {
// haut
xx=0;
yy=-1;
}
if (_rowread(0x7E)&0x4) {
// bas
xx=0;
yy=1;
}
if (_rowread(0x3F)&0x1) {
fin=1;
}
// on efface le sprite.
Sprite8 (x, y, 8, Curs_LIGHT, LCD_MEM, SPRT_XOR);
// on change les coordonnées.
x+=xx;
y+=yy;
// on vérifie qu'on ne sort pas de l'écran.
if (y>92) y=0;
if (x>152) x=0;
if (y<0) y=92;
if (x<0) x=152;
// on affiche le sprite aux nouvelles coordonnées.
Sprite8 (x, y, 8, Curs_LIGHT, LCD_MEM, SPRT_OR);
}
}