Rendre un add-in compatible SH4
Posté le 03/01/2013 13:37
Bonjour à tous, Casiofans. Après quelques mois de stress face aux incompatibilités entre les add-ins destinés aux anciennes calculatrices et les nouveaux modèles SH4, nous avons la joie de vous annoncer une excellente nouvelle... des anglophones ont trouvé le moyen de rendre compatibles les programmes C/C++ grâce à un morceau de code à ajouter.
La fonction qui permet l'accès au clavier de la calculatrice était en effet incompatible parce que le changement de processeur entraînait un changement d'adresses en mémoire. Le morceau de code suivant y remède :
http://pastebin.com/ApF7Z2bW
Quant à MonochromeLib, la librairie de Pierrotll, il faut remplacer :
ça
ça
static int SysCallCode[] = {0xD201422B,0x60F20000,0x80010070};
static int (*SysCall)( int R4, int R5, int R6, int R7, int FNo ) = (void*)&SysCallCode;
char* ML_vram_adress()
{
return (char*)((*SysCall)(0, 0, 0, 0, 309));
}
par ça
par ça
typedef char*(*sc_cpv)(void);
const unsigned int sc0135[] = { 0xD201D002, 0x422B0009, 0x80010070, 0x0135 };
#define ML_vram_adress (*(sc_cpv)sc0135)
En espérant que les développeurs adaptent vite leurs jeux.
Source :
Universal Casio Forum
Citer : Posté le 22/04/2013 19:11 | #
de plus en plus bizarre leur interpréteur...
Citer : Posté le 22/04/2013 19:43 | #
oui a mon avis la version de l'OS y est pour beaucoup.
Il y a peut-être une pré-analyse lors de la première boucle ?
Peut-être qu'en constatant qu'il n'y a que des entiers il utilise le mode de calcul sur les entiers qui est beaucoup plus rapide ?
Citer : Posté le 22/04/2013 20:04 | #
Je ne pense pas que Casio c soit amusé à faire un interpréteur aussi complexe...
Citer : Posté le 22/04/2013 20:21 | #
Je suis en train de tester IsKeyDown() pour voir son fonctionnement sur l’émulateur mais on dirait que les affichages ne sont pas synchro avec l’exécution du programme.
Quelle est la fonction pour mettre à jour l'affichage ?
{
unsigned int key;
Bdisp_AllClr_DDVRAM();
locate(1,1);
Print((unsigned char*)"Test IsKeyDown");
locate(1,2);
Print((unsigned char*)"Appuyer sur 0");
while (1){
if (IsKeyDown(KEY_CHAR_0)) break;
}
locate(1,3);
Print((unsigned char*)"Merci");
while(1){
GetKey(&key);
}
return 1;
}
Lors de l’exécution de ce code j'ai un écran vide et il n'y a que lorsque j’appuie sur 0 que tout s'affiche d'un coup. Alors que selon l’exécution il devrait y avoir des messages intermédiaires.
Citer : Posté le 22/04/2013 21:28 | #
Certaines fonctions dessinent en VRAM et il faut utiliser Bdisp_PutDisp_DD pour transférer cette VRAM à l'écran. Mais je ne sais plus si Print utilise ce fonctionnement
Citer : Posté le 22/04/2013 21:50 | #
Merci Ziqumu.
Je viens de trouver un tuto en anglais sur l'UCF.
(pfffiuuu, heureusement que i speak english fluently)
Je vais me former avec.
Après je testerai la solution de remplacement de Casio pour voir dans quelle mesure ça remplace bien IsKeyDown.
(j'ai hate de pouvoir utiliser la Monochromelib de Pierrotll.)
Ajouté le 23/04/2013 à 11:14 :
Je viens de tester le remplacement de la fonction IsKeyDown() proposé par Casio et ça marche très bien.(Ref : fx-9860G_SDK_Announcement.pdf)
En revanche, est-ce qu\'il y a une option pour la sauvegarde automatique du source (sans incrémentation ?)
Ajouté le 23/04/2013 à 11:57 :
Oups... pour le moment je ne récupère pas le coté \"Multi-touches\" de IsKeyDown()...
Citer : Posté le 26/04/2013 17:11 | #
Pour récupérer les différentes touches, il faut enchaîner plusieurs conditions:
if(i < TL_GET_TOUCH_ROUND && IsKeyDown(KEY_CHAR_DP)) { coordonnesX[ i] = 5; coordonnesY[ i] = 20; i++; }
if(i < TL_GET_TOUCH_ROUND && IsKeyDown(KEY_CHAR_EXP)) { coordonnesX[ i] = 10; coordonnesY[ i] = 20; i++; }
if(i < TL_GET_TOUCH_ROUND && IsKeyDown(KEY_CHAR_PMINUS)) { coordonnesX[ i] = 15; coordonnesY[ i] = 20; i++; }
if(i < TL_GET_TOUCH_ROUND && IsKeyDown(KEY_CTRL_EXE)) { coordonnesX[ i] = 20; coordonnesY[ i] = 20; i++; }
C'est peut être pas clair, mais ce code permet d'enregistrer quelles touches sont pressées (en partie: c'est un extrait de la fonction). Si tu fait le tout dans une boucle très rapide, tu peux avoir un "multi-GetKey"
D'ailleurs je vais sortir une release de TouchLib, pour les intéressés.
Citer : Posté le 27/04/2013 10:07 | #
@Dark storm
La fonctions IsKeyDown() est deprecatée par le SH4.
J'essaye de la remplacer par une utilisation de "GetKey" ou "Bkey_GetKeyWait" mais j'ai du mal à retrouver le coté "multi-touche" de IsKeyDown().
Citer : Posté le 27/04/2013 18:32 | #
Si tu utilise le bout de code fourni dans le topic "rendre un add-in compatible SH4", la fonction IsKeyDown fonctionne parfaitement.
Le problème, c'est que GetKey stoppe le programme tant qu'une touche n'a pas été pressée, donc deux choses: c'est pas très pratique pour un jeu d'action par exemple, et dès qu'une touche est pressée, le programme passe à la suite, ce qui fait que les autres touches enfoncées ne sont pas prises en compte...
Citer : Posté le 28/04/2013 14:51 | #
Tu as raison Dark storm.
J'essayai de me casser la tête pour transformer automatiquement les fichiers ".G1A" sans les sources et réorienter les appels d'IsKeyDown() à un IsKeyDown() compatible SH4 que j'aurai collé en bout de fichier.
L'idée c'etait de rendre compatibles tous les anciens fichiers de jeux .G1A pour le SH4 sans avoir besoin des sources mais finalement je laisse tomber.
Citer : Posté le 28/04/2013 14:53 | #
Ah dommage :/ C'est pas un projet simple aussi, donc ça se comprend.
Citer : Posté le 28/04/2013 15:50 | #
si tu veux, j'ai une fonction IsKeyDown compatible SH4
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
merci a tout le monde pour son soutien
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 !Citer : Posté le 28/04/2013 20:49 | #
On pourrait la mettre dans les Snippets, ça vous évitera de la chercher.
Vitesse des fonctions en Basic Casio | 7 days CPC | Casio Universal Wiki | Tutoriel Basic Casio
>>> Give me a click Brother <<< >>> Teste mon générateur de mots nouveaux <<<
>>> Random Youtube Video <<<
Citer : Posté le 29/04/2013 22:10 | #
J'ai commencé des essais et ça se passe bien.
Pour l'instant je travaille sur un petit source C avec deux fonctions.
La première fonction joue le rôle de la fonction IsKeyDown() de base, celle qui fonctionne avec les SH3. La seconde joue le rôle de la fonction de remplacement, un IsKeyDown() compatible SH4.
Entre l'idée de Ziqumu de mettre le code de remplacement en fin de fichier et la fonction IsKeyDown() compatible SH4 de Dodormeur j'ai déjà plus de la moitié du travail fait... Ca a du bon le travail collectif de ce forum.
Demain je devrais être en mesure de pondre une première version capable de transformer mon fichier TEST.G1A (avec une pseudo fonction "IsKeyDown SH3") en un fichier TEST_SH4.G1A "compatible" SH4 (cad ayant remplace la fonction par une pseudo fonction "IsKeyDown SH4").
Une autre grosse étape sera de pouvoir remplacer l'appel à IsKeyDown() du SH3
par un appel à une autre fonction IsKeyDown() compatible SH4 située en fin de programme...
Est-ce que le nombre d'octets sera le même ?
Suspens...
Citer : Posté le 29/04/2013 22:14 | #
Espérons
Citer : Posté le 29/04/2013 22:19 | #
Il y a de bonnes chances si c'est un CALL XXXX.
Est-ce qu'il y a un desassembleur du SUPERH 3 quelque part ?
Citer : Posté le 29/04/2013 22:33 | #
Sur les communautés casio, je ne crois pas :/
Regarde ce logiciel je crois il a l'aire de gérer les Hitachi SH3 (ancien nom des renesas SH3 si je ne me trompe pas ?)
téléchargement ici
Citer : Posté le 29/04/2013 22:36 | #
il y en a peut-être un dans le sdk...
Gagné il y en a un...
Il faut faire un click droit (avec le dos bien droit) sur une ligne, mettre un breakpoint, builder et demander Show memory, cela montre le code desassemblé.
Citer : Posté le 30/04/2013 16:39 | #
Ou tu achêtes IDA Pro.
http://www.hex-rays.com/products/ida/index.shtml
Citer : Posté le 30/04/2013 18:16 | #
Tu veux parler du produit ou de la société ?
Je vais reprendre mes comparaisons en binaire car l'exploration du code désassemblé ne donne pas ce que j'attends.
Ajouté le 03/05/2013 à 08:53 :
Le problème est beaucoup plus ardu que je ne pensais...
Même en prenant un cas très facile, cad avec juste une fonction à réorienter, la comparaison en binaire montre une différence sur 9 octets.
Assurément, ma solution au problème de compatibilité du SH4 n\'est pas la bonne.
Citer : Posté le 03/05/2013 20:11 | #
Au fait, c'est mieux de Faure ++i que i++. C'est plus rapide.