
lol, donc mon Arkanoid est en 15 bits.Houlà! Ce ne serait pas plutôt 16 bits?
mais j'ai regardé dans le code de Mario3 avant, et j'avoue que le code est assez indigeste donc c'est pas facile pour retrouver la routine.Malheureusement oui. Et ce n'est pas le pire de mes codes. Cependant, je ne pensais pas distribuer la source de Mario, donc je n'ai pas fait d'effort. Aujourd'hui, je pars du principe qu'il y aura toujours quelqu'un pour relire mes progs, (Open Source Pawaaa!) ne fût-ce que moi plus tard par nostalgie...
Dans la boucle principal tu incrémente une variable? Avec l'interruption tu regarde la valeur de cette variable, tu la divise par une valeur et tu fait un petit calcul pour le pourcentage?En gros, oui. Tu mets une valeur sur le timer utilisateur (6) comme 1. Ensuite, tu fais ton code. A la fin, tu vas attendre que le timer ait expiré, ainsi tu éviteras que l'animation soit plus rapide ou plus lente à certains stades du jeu. J'ai mesuré que tu pouvais faire environ 4'500 fois OSTimerExpired sur HW2 lorsque ta boucle est vide, mais je ne suis pas sûr, d'autant plus que que la vitesse du timer programmable était peut-être changée à ce moment-là. Donc se basant sur ça:
Kevin Kofler
:godzil :
Lo je sais pas mais ZWW = The Legend of Zelda : The Wind Waker
Ben, Lo = Legend of
Houlà! Ce ne serait pas plutôt 16 bits?
Malheureusement oui. Et ce n'est pas le pire de mes codes. Cependant, je ne pensais pas distribuer la source de Mario, donc je n'ai pas fait d'effort. Aujourd'hui, je pars du principe qu'il y aura toujours quelqu'un pour relire mes progs, (Open Source Pawaaa!) ne fût-ce que moi plus tard par nostalgie...
En gros, oui. Tu mets une valeur sur le timer utilisateur (6) comme 1. Ensuite, tu fais ton code. A la fin, tu vas attendre que le timer ait expiré, ainsi tu éviteras que l'animation soit plus rapide ou plus lente à certains stades du jeu. J'ai mesuré que tu pouvais faire environ 4'500 fois OSTimerExpired sur HW2 lorsque ta boucle est vide, mais je ne suis pas sûr, d'autant plus que que la vitesse du timer programmable était peut-être changée à ce moment-là. Donc se basant sur ça:
tim=0;
while (!OSTimerExpired (USER_TIMER)) tim++;
on aura tim qui contiendra le temps passé à ne rien faire (4500 == 100. Ainsi, tu peux facilement savoir l'utilisation du CPU selon cette formule: (100-tim/45). Ca n'est pas plus compliqué. Pour HW1, je n'ai pas de valeur, cependant je crois que c'est 1700 sur VTI...
Je ne peux pas utiliser la focntion OSRegisterTimer car elle doit utiliser l'auto int n°5.Tu dois faire ExecuteHandler(vieilleAutoInt5) dans ton "handler" pour AUTO_INT_5. Ainsi les timers fonctionneront sans problème. Maintenant si tu mets ton AI5 à 8kHz, alors faudra faire OSRegisterTimer(USER_TIMER,500) (dépend du framerate). Le reste ne changera pas. Et puis je ne suis pas sûr pour les 4500, faudra que tu testes toi-même...
Tu dois faire ExecuteHandler(vieilleAutoInt5) dans ton "handler" pour AUTO_INT_5. Ainsi les timers fonctionneront sans problème. Maintenant si tu mets ton AI5 à 8kHz, alors faudra faire OSRegisterTimer(USER_TIMER,500) (dépend du framerate).
Le reste ne changera pas. Et puis je ne suis pas sûr pour les 4500, faudra que tu testes toi-même...
Je n'ai pas compris ta dernière phrase... Je te corrige déjà les erreurs... (c'est pas pour t'embêter hein!)
geogeo
: je suis septique.
godzil
: un wav ayant un "bandwitdh" de 2000Hz correspondrait a un enregistrement avec un filtre passe bande de 2000Hz de bande passante
Chacun ses référencesOui
Thibaut :
Ha ? J'ai jamais entendu parler de ce théorème. Je vais faire un tour sur [google]Shannon-Nyquist[/google], on doit pouvoir apprendre des choses intéressantes
LOL, il faudra vite te désinfecter alors.
Geogeo > Bah je vais te le faire si tu n'y arrives pas.
F'y pense PolySnd ne marche toujours pas sous VTI? On sait pourquoi ?
Bas tout simplement parce que sur VTI l'auto int n°5 ne peux pas être à 8192 Hz elle est trop faible.J'ai mis "Enable sound" et je n'entends que de petits craquements qui sortent depuis la VTI quand je joue à tétrisse... Quel port faut-il utiliser pour que la VTI permette d'écouter le son?
// C Source File
// Created 08/08/2003; 22:05:40
#define USE_TI89 // Compile for TI-89
#define USE_TI92PLUS // Compile for TI-92 Plus
#define USE_V200 // Compile for V200
#define MIN_AMS 100 // Compile for AMS 1.00 or higher
#define SAVE_SCREEN // Save/Restore LCD Contents
#include <tigcclib.h> // Include All Header Files
#include "polysnd2.h"
INT_HANDLER save1;
INT_HANDLER save2;
INT_HANDLER save5;
unsigned long cpu_speed=0;
volatile unsigned long counter=0;
DEFINE_INT_HANDLER (myint5)
{
counter++;
ExecuteHandler(save5);
}
DEFINE_INT_HANDLER (myint2)
{
pokeIO (0x60001B,0);
}
void _main(void)
{
cpu_speed=0;
counter=0;
save1 = GetIntVec(AUTO_INT_1);
save2 = GetIntVec(AUTO_INT_2);
save5 = GetIntVec(AUTO_INT_3);
SetIntVec(AUTO_INT_1,DUMMY_HANDLER);
SetIntVec(AUTO_INT_2,myint2);
EnableSound ();
InstallSound ();
Interrupt5 (myint5);
OSFreeTimer (USER_TIMER);
OSRegisterTimer (USER_TIMER, 1);
while (!_keytest (RR_ESC))
{
if (OSTimerExpired (USER_TIMER)==TRUE) cpu_speed++;
if (counter>5000) {
counter=0;
printf_xy (0,0,"%lu",cpu_speed);
cpu_speed=0;}
}
OSFreeTimer (USER_TIMER);
UninstallSound ();
DisableSound ();
SetIntVec(AUTO_INT_1,save1);
SetIntVec(AUTO_INT_2,save2);
}
En bref je ne comprends pas trop car OSRegistrerTimer est une interruption, ici USER_TIMER peut aller max. à 20 Hz donc au final, j'aurais toujours 20 expirations du timer toutes les secondes?Tu auras toujours vingt expirations en une seconde, sauf si pendant ce temps tu fais autre chose. A ce moment-là, le temps ne sera plus passé à attendre que OSTimerExpired, mais à bosser. Il y a cependant une petite erreur dans ton code... Tu dois libérer le timer puis le régler à nouveau. Donc si counter>5000, tu devrais aussi faire ça:
Et quel est le problème? Je crois que geogeo sait qu'il utilise des fonctions se basant sur l'AUTO_INT_5. C'est d'ailleurs pour ça qu'il utilise ExecuteHandler dans le corps de l'AI5 redirigée...
Tu auras toujours vingt expirations en une seconde, sauf si pendant ce temps tu fais autre chose. A ce moment-là, le temps ne sera plus passé à attendre que OSTimerExpired, mais à bosser. Il y a cependant une petite erreur dans ton code... Tu dois libérer le timer puis le régler à nouveau. Donc si counter>5000, tu devrais aussi faire ça:
OSFreeTimer (USER_TIMER);
OSRegisterTimer (USER_TIMER, 1); Ca devrait marcher ainsi.
Je voudrais bien, mais je n'arrive pas à éliminer la ligne noir en haut d'erreur. Cette ligne veut bien dire que j'utilise une fonction utilisant l'auto int5.C'est bizarre... Logiquement le code devrait fonctionner ainsi. Mais je vais essayer...
// C Source File
// Created 08/08/2003; 22:05:40
#define USE_TI89 // Compile for TI-89
#define USE_TI92PLUS // Compile for TI-92 Plus
#define USE_V200 // Compile for V200
#define MIN_AMS 100 // Compile for AMS 1.00 or higher
#define SAVE_SCREEN // Save/Restore LCD Contents
#include <tigcclib.h> // Include All Header Files
INT_HANDLER save1;
INT_HANDLER save2;
INT_HANDLER save5;
DEFINE_INT_HANDLER (myint5)
{
//Pas besoin de ton compteur...
ExecuteHandler(save5);
}
DEFINE_INT_HANDLER (myint2)
{
pokeIO (0x60001B,0);
}
void _main(void)
{
unsigned long cpu_speed=0; //N'a pas besoin d'être globale...
save1 = GetIntVec(AUTO_INT_1);
save2 = GetIntVec(AUTO_INT_2);
save5 = GetIntVec(AUTO_INT_5);
//(ci-dessous) Tu verras la différence si tu ne fais pas ça (essaie d'appuyer sur une touche ensuite)
SetIntVec(AUTO_INT_1,DUMMY_HANDLER);
SetIntVec(AUTO_INT_2,myint2);
SetIntVec(AUTO_INT_5,myint5);
while (!_keytest (RR_ESC))
{
//Début de la boucle
OSFreeTimer (USER_TIMER);
OSRegisterTimer (USER_TIMER, 1);
//Fais ce que tu veux ici (qui prend du temps, pour le benchmark)
//Fin de la boucle
cpu_speed=0;
while (OSTimerExpired (USER_TIMER)==FALSE) cpu_speed++;
printf_xy (0,0,"%lu ",cpu_speed);
}
SetIntVec(AUTO_INT_1,save1);
SetIntVec(AUTO_INT_2,save2);
SetIntVec(AUTO_INT_5,save5);
}