1

bonjour,

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 wink ). Je programme donc en _nostub et j'ai le probleme suivant (source en fin de message):

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);
}
}
Je commence a reussir a faire bouger un sprite. Ou bah je suis content !

2

Le problème vient de _rowread. Si tu veux utiliser cette fonction il faut masquer l'auto-interruption 1 du TI-OS qui interfere. cf la doc de TI-GCC smile
So much code to write, so little time.

3

Et aussi la 5 tant que tu y es. (AMS 2 l'utilise pour le clavier sur HW2.)
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

4

si tu commences tout juste la prog en C, vas pas trop vite...
Mon tuto : www.multimania.com/squale92
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

5

Merci pour vos reponses.
La doc de tigcc est tres clair (seulement je ne savais pas ou chercher)

Squale92> je sais deja programmer dans quelques langages, donc ca ira j'ai deja trouvé mon bonheur.

En fait je croyais que la fonction delay empechait le bug, elle le retarde simplement (la calc quitte le programme au bout de 5 a 10 minutes, c'est pour ca que j'etais dans l'erreur).

Merci a tous.
Je commence a reussir a faire bouger un sprite. Ou bah je suis content !

6

LOL !!
pour vous faire plaisir je suis allé sur le site de squale.
Quand j'avais dit que j'avais trouvé mon bonheur, c'est parce que j'avais trouvé et imprimé un super tutorial... celui de TCI ;-) (je n'avais pas tilté sur l'url)

voila ce que c'est de vouloir aller trop vite, en relisant j'ai compris que les lignes que je ne comprenais pas servaient a "devier" l'auto int 1.
Par contre il faut que je m'occupe du 5 egalement et la je ne trouve pas la solution (c'est la sujet d'un autre post)...
Je commence a reussir a faire bouger un sprite. Ou bah je suis content !