Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.
La shoutbox n'est pas chargée par défaut pour des raisons de performances. Cliquez pour charger.

Forum Casio - Autres questions


Index du Forum » Autres questions » Add-in : Réexécution immédiate impossible
Chris79 Hors ligne Membre Points: 46 Défis: 0 Message

Add-in : Réexécution immédiate impossible

Posté le 31/12/2012 23:10

Bonsoir,
J'ai constaté qu'il n'était pas possible de relancer l'add-in après une première exécution. Pourriez-vous m'indiquer l'origine de ce problème et la manière de le résoudre ...
En vous remerciant d'avance pour votre aide.



1, 2 Suivante
Dark storm Hors ligne Labélisateur Points: 11634 Défis: 176 Message

Citer : Posté le 31/12/2012 23:13 | #


Regarde les sources de Gravity Guy de Nitrosax, il utilise une fonction évitant ce problème. Toutefois, je ne sais pas d'où vient ce bug, si bug il y a.
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Limachi Hors ligne Youtuber Points: 2798 Défis: 67 Message

Citer : Posté le 01/01/2013 00:39 | #


Ce n'est pas un bug, parfois, en fonction de la méthode de fermeture de l'add-in, on demande a la boucle principale de l'add-in de ce finir (un while(x) où x est mis a 0), dans ce cas la, l'add-in enregistre dans la mémoire vive que la variable x est a zero, et donc que si on reclique sur l'icone, la mémoire vive n'étant pas "free" (propre, libre, mise a zero, etc), l'add-in va ignorer la boucle principale et immédiatement arriver a la fonction "return 1" ce qui ferme l'add-in (on remarque parfois un freze a ce moment la). En lançant un autre add-in, la calculatrice efface toutes les info du précédent add-in, du coup on peut le relancer.

Il nous faut trouver un moyen de quitter l'add-in tout en supprimant une partie de la mémoire vive pour éviter ce genre de choses, ou utiliser la fonction GetKey, ou utiliser une fonction spéciale pour "mettre en pause l'add-in".

Je ne connais pas vraiment de technique efficace, mais si les sources de gravity guy ou d'un autre jeu peuvent t'aider, ne t'en prive pas.
Mes Programmes
Cliquer pour enrouler
-en basic: un programme nommé PICFMLIM convertissant une picture en code basic.
-en C:
-Un pong.
-Un projet en pause. Je compte le reprendre de temps en temps: Summer Cursed


-mon tuto sur les Str


Mes calto: G25+, G75
Mon minecraft en dévelopement


Projets et Programmes que je soutiens (sur une idée de Marmotti)
Cliquer pour enrouler
-Pokemon Jade de Dodormeur
-Portal2D de JavierXD
-CalCraft de Wime
-GeekBros du groupe GeekBrothers (Eiyeron,Siapran,KevKevVTT,Adbook,LIMachi)
Purobaz Hors ligne Membre d'honneur Points: 2690 Défis: 110 Message

Citer : Posté le 01/01/2013 14:12 | #


Dark Storm a écrit :
Regarde les sources de Gravity Guy de Nitrosax

Il les a donnée ?

Il a utilisé un reset de la calculatrice, la fonction se trouve dans la lib Revolution-fx
I'll be back !
pour plus de fun
mes programmes fun
de technique
mes projets
et de Swag
les projets que je soutiens
Chris79 Hors ligne Membre Points: 46 Défis: 0 Message

Citer : Posté le 01/01/2013 15:19 | #


J'ai bien trouvé la fonction mais elle se trouve dans un ficher qui se nomme revolution_asm.scr écrit en asembleur. Comment indiqué dans le main.c du sdk que l'on souhaite utiliser un fichier en asm.
Le SDK est-t-il capable de lire et comprendre un fichier écrit en asm.
En vous remerciant pour votre aide ...

Dark storm Hors ligne Labélisateur Points: 11634 Défis: 176 Message

Citer : Posté le 01/01/2013 15:25 | #


non non, il ne reset pas la calto...
Sinon, ça doit être PLL qui a donné un syscall, mais je ne sais plus où...
En tout cas, je suis sur d'avoir déjà vu le code de la fonction
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Pierrotll Hors ligne Ancien administrateur Points: 5488 Défis: 41 Message

Citer : Posté le 01/01/2013 16:03 | #


Ça n'a absolument rien à voir avec les données présentes en mémoire Limachi, c'est simplement un problème de l'OS Casio. Si on quitte l'addin par le return du main, on ne peut pas le relancer juste après. Ce n'est pas vraiment un problème, et je trouve dommage de reset la calculatrice à la fin du prog juste à cause de ça.

On peut très bien utiliser GetKey à un moment du programme pour retourner au menu en évitant ce problème.
Par exemple, je veux qu'en appuyant sur EXIT en plein jeu ça fasse un retour menu ? Facile :
if (key_down(K_EXIT)) {
    int key;
    KDB_PutKey(KEY_CTRL_MENU, 0); [green]// Fonction aussi appelée key_inject dans Gravity Duck[/green]
    GetKey(&key);
}
On simule un appui sur MENU et on appelle GetKey qui fait son boulot.
Limachi Hors ligne Youtuber Points: 2798 Défis: 67 Message

Citer : Posté le 02/01/2013 09:44 | #


a bon? j'ai toujours compris que sa venait de la
(et avouez que sa pourrait être sa 8) , moi en tout cas sa me semblait logique que ce soit sa )
Mes Programmes
Cliquer pour enrouler
-en basic: un programme nommé PICFMLIM convertissant une picture en code basic.
-en C:
-Un pong.
-Un projet en pause. Je compte le reprendre de temps en temps: Summer Cursed


-mon tuto sur les Str


Mes calto: G25+, G75
Mon minecraft en dévelopement


Projets et Programmes que je soutiens (sur une idée de Marmotti)
Cliquer pour enrouler
-Pokemon Jade de Dodormeur
-Portal2D de JavierXD
-CalCraft de Wime
-GeekBros du groupe GeekBrothers (Eiyeron,Siapran,KevKevVTT,Adbook,LIMachi)
Dodormeur Hors ligne Ancien rédacteur Points: 3965 Défis: 84 Message

Citer : Posté le 20/05/2013 17:11 | #


bon, quand j'essaye de faire cette technique, j'ai l'impression que la fonction key_inject ne marche pas....

static int SysCallCode[] = {0xD201422B,0x60F20000,0x80010070};
static int (*SysCall)( int R4, int R5, int R6, int R7, int FNo ) = (void*)&SysCallCode;

void key_inject1(int keycode)
{
    (*SysCall)(keycode, 0, 0, 0, 0x248);
}



unsigned char key_down_real(unsigned char code)
{
    unsigned short key[8];
    const unsigned short* keyboardregister = (unsigned short*)0xA44B0000;
    unsigned char row;

    if(isOS2)
        {
        memcpy(&key, keyboardregister, sizeof(unsigned short) << 3);
        row= code%10;
        return (0 != (key[row >> 1] & 1 << code / 10 - 1 + ((row & 1) << 3)));
        }
    else
        {
        return CheckKeyRow((code % 10) + ((code / 10 - 1) << 4));
        }
}






unsigned char key_down(unsigned char code)
{
    unsigned int keyT;

    if(isOS2)
        {
        if(key_down_real(K_F1))
            {
            while(key_down_real(K_F1));
            key_inject(KEY_CTRL_MENU); // une autre fonction, normalement compatible SH4
            GetKey(&keyT);
            }
        }
    else
        {
        if(key_down_real(K_F1))
            {
            while(key_down_real(K_F1));
            key_inject1(KEY_CTRL_MENU);//elle ne fait rien  :oops:
            GetKey(&keyT);
            }
        }

if(code == K_EXE)return key_down_real(K_EXE) || key_down_real(K_SHIFT);
        if(code == K_PMINUS)return key_down_real(K_PMINUS) || key_down_real(K_ALPHA);
return key_down_real(code);
}



je ne comprend pas pourquoi ca ne fonctionne pas... j'ai aussi essayé en remplacant KEY_CTRL_MENU par K_MENU (0X38) mais ca ne marche pas non plus...
Pokemon !!!!!! => pokemon stadium/battle

mes meilleurs jeux
Cliquer pour enrouler
un jeu avec des niveaux de gris mais compatible SH4 (mais en monochrome pour les SH4) => bomberman
envie de plonger dans la mer pour ramasser des tresors? => ballon sea
envie de sauver l'univers dans un jeu avec une longue durée de vie? => saviors of the future
un add-in addictif avec plein de secret et de trophées => evasion survival
un shmup bien dur et sadique => saviors 2

projets
Cliquer pour enrouler

pokemon
Cliquer pour enrouler



encodage des données de combat (sprite, attaques et nom)
   100%

systeme de combat
   100%

encodage des données de pokemon (niveau d'apprentisage et evolution)
   100%


moteur de la carte
   50%

level design
   1%

finition de pokemon jade
   42%

merci a tout le monde pour son soutien


projets que je soutiens
Cliquer pour enrouler
minecraft de limachi
zelda prizm de smashmaster (en esperant qu'il puisse le finir)
les tests de marmotti
un RPG de dark storm (dont je connais le nom, mais pas vous ) Arcuz !
Xavier59 Hors ligne Membre de CreativeCalc Points: 1337 Défis: 12 Message

Citer : Posté le 21/10/2014 12:33 | #


// Fonction aussi appelée key_inject dans Gravity Duck


Après avoir parcouru l'intégralité des sources de Gravity Duck pour trouver cette fonction, elle n'y ai pas présente
Du coup, je n'arrive toujours pas a fermer mon add-in proprement, quelqu'un pourrait m'aider ?

PS : Désolé du détérrage
1337
Theprog Hors ligne Membre Points: 1447 Défis: 20 Message

Citer : Posté le 21/10/2014 12:55 | #


Au pire tu le quitte comme tout le monde, ne pas pouvoir le relancer, c'est pas tres grave
Sinon, faudrait faire avec les syscalls et t'es meme pas sur qu'ils soient encore bon sur les SH4
Lephenixnoir Hors ligne Administrateur Points: 24229 Défis: 170 Message

Citer : Posté le 21/10/2014 12:58 | #


Utilise le syscall 0x910 avec en premier paramètre le code de la touche à injecter. Pour le seconde, tu peux laisser 0.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Xavier59 Hors ligne Membre de CreativeCalc Points: 1337 Défis: 12 Message

Citer : Posté le 21/10/2014 13:31 | #


Je ne comprends pas pourquoi mon code ne marche pas :


if (Select == 3){
   KBD_PutKey(30003,0);
   GetKey(&key);
}


J'ai bien evidemment fait #include syscall.h et ajouter syscall.src dans Sources files

Une idée ?
1337
Lephenixnoir Hors ligne Administrateur Points: 24229 Défis: 170 Message

Citer : Posté le 21/10/2014 13:32 | #


T'es sûr que c'est 30003 ? T'as essayé avec KEY_CTRL_MENU ?
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Xavier59 Hors ligne Membre de CreativeCalc Points: 1337 Défis: 12 Message

Citer : Posté le 21/10/2014 13:35 | #


Oui j'ai essayé aussi. Et le code est bon :


#define KEY_CTRL_MENU       30003

1337
Lephenixnoir Hors ligne Administrateur Points: 24229 Défis: 170 Message

Citer : Posté le 21/10/2014 13:39 | #


Es-tu sûr que le code dans ta condition est exécuté ? Et as-tu bien déclaré le syscall ?
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Xavier59 Hors ligne Membre de CreativeCalc Points: 1337 Défis: 12 Message

Citer : Posté le 21/10/2014 14:55 | #


Non je ne l'ai pas déclaré, mais je ne comprends pas comment le faire
J'ai essayé en faisant :


static int SysCallCode[] = {0xD201422B,0x60F20000,0x80010070};
static int (*SysCall)(int R4, int R5, int R6, int R7, int FNo ) = (void*)&SysCallCode;

int KBD_PutKey(int key,int mode)
{
      return (*SysCall)(key,0,0,0,0x910);
}


Le problème c'est que j'ai prototype missmatch à la compilation.
Normal vous allez me dire, car il y a déjà ça dans "syscall.h".
Mais dans ce cas la, je dois faire quoi ?
1337
Darkysun Hors ligne Membre Points: 1747 Défis: 52 Message

Citer : Posté le 21/10/2014 15:00 | #


xavier a écrit :
Normal vous allez me dire, car il y a déjà ça dans "syscall.h".


bah non justement pas normal ca veut dire que tu n'as pas le prototype de la fonction int KBD_bidule...
Si je ne réponds pas à un post depuis trop longtemps : envoyez-moi un message pour me le rappeler !




Lephenixnoir Hors ligne Administrateur Points: 24229 Défis: 170 Message

Citer : Posté le 21/10/2014 18:04 | #


Normalement c'est bon. Rajoute quand même en en-tête de ton programme le prototype :
int KBD_PutKey(int, int);

Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Nitrosax Hors ligne Ancien rédacteur Points: 1061 Défis: 17 Message

Citer : Posté le 25/10/2014 00:32 | # | Fichier joint


Bonjour à tous !
J'ai enfin remis la main sur les sources de Gravity Guy et j'en profite pour partager cette fameuse fonction qui permet de réexécuter immédiatement un add-in après l'avoir quitté.
Je ne l'ai pas retestée on-calc, mais vu qu'il ne s'agit que de la récupération du code de mon jeu, je pense que cela fonctionne sans problèmes. Est-ce que quelqu'un pourrait aussi la tester sur SH4 ?

Enjoy !
Xavier59 Hors ligne Membre de CreativeCalc Points: 1337 Défis: 12 Message

Citer : Posté le 25/10/2014 01:15 | #


Wow merci, ça va m'être très utile !
Je test demain !

Ajouté le 25/10/2014 à 11:41 :
Après test, je ne contrôle pas bien la force, même sur ému
Ca me semble aléatoire, des fois ça marche, des fois ça ne marche pas, sans même que je ne touche au code ...


int AddIn_main(int isAppli, unsigned short OptionNum)
{
        unsigned int key;
        int Select = 0;
        int choix = 0;
        int theta = 0;
        Sauvegarde(0);
        Txt_Init();
        Intro();

    while(1){
        Select = xxxx();
        if (Select == 0) xxxxxx();
        if (Select == 1){
            choix = xxxxxx();
            if (choix == 0) xxxxxx();
            if (choix == 32) xxxxxxxx();
        }
        if (Select == 2) xxxxxx();

        if (Select == 3){
            APP_EnableRestart();
            break;
        }
    }
}


Quand tout se passe bien, je peux effectivement réexecuter mon add-in juste après.
Mais parfois quand je tente de relancer l'add-in, j'ai :
Execution has stopped due to an error : None existing memory by data write access at FFFFFFE8

1337
1, 2 Suivante

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 94 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd