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 03/01/2013 13:39 | #
Ah tout bon sa !
Citer : Posté le 03/01/2013 13:50 | #
Génial, mais où met tu le premier code dans ton projet ?
Citer : Posté le 03/01/2013 13:51 | #
En haut puisque t'as les define. Tu peux le casser en morceaux pour que ça passe bien dans ton projet.
Citer : Posté le 03/01/2013 13:55 | #
J'ai un illegal token "0x02020000" à la compilation en mettant le code au tout début du fichier principal...
Citer : Posté le 03/01/2013 13:58 | #
Just add this on top of your code and your game is compitable to the new calculators !
Citer : Posté le 03/01/2013 13:59 | #
et bien c'est ce que j'ai fait, mais j'ai quand même l'erreur
Citer : Posté le 03/01/2013 14:00 | #
en tout cas c'est une vraiment bonne nouvelle
Jouez à 6 sur une seule calto : Curve Fever
Un die and retry qui vous fera bieeeen rager Test Andropov
un très bon sokoban
le seul vrai jeu de foot en basic : FIFA 12
Ca c'est ce que j'appelle un jeu de reflexion jewel master
Qui vaincra l'intelligence artificielle de cet othello
Le célèbre pacman
Et tant d'autres BTL's games
Le jeu du mois de Novembre et award du jeu le plus dur de l'année 2013 MultiTask, testez-le
Citer : Posté le 03/01/2013 14:01 | #
2 sec je regarde avec mon angry birds...
Ajouté le 03/01/2013 à 14:09 :
Je galère ce n\'est pas bon chez moi non plus...
Ajouté le 03/01/2013 à 14:10 :
Je vais essayer avec un prog C comme starwars plutôt qu\'un C++
Ajouté le 03/01/2013 à 14:14 :
Pour le coup j\'ai le même problème que toi Dark storm...
Citer : Posté le 03/01/2013 14:14 | #
Très bonne nouvelle tout ça !
Citer : Posté le 03/01/2013 14:18 | #
Bonne nouvelle tout ça, il faut que je test tout de même en espérant ne pas avoir l’erreur de Louloux et Dark Storm.
Citer : Posté le 03/01/2013 14:21 | #
J'ai posé la question sur le forum de l'UCF
Citer : Posté le 03/01/2013 14:27 | #
Merci d'avoir posé l question. on doit avoir loupé un truc...
Citer : Posté le 03/01/2013 14:32 | #
Principalement, sa veut dire que nous avons une modification de l'appel des syscall et des codes correspondant aux touches?
Les syscalls précédemment trouvés pourront-ils être adaptés?
const unsigned int sc0135[] = { 0xD201D002, 0x422B0009, 0x80010070, 0x0135 };
#define ML_vram_adress (*(sc_cpv)sc0135)
il suffirait donc seulement de taper notre code de syscall dans la dernière partie de la variable "const unsigned int" (remplacer 0x0135), et de sélectionner le type de format de sortie (un int pour les ticks par exemple)?
Si oui, alors mon minecraft ceras sans doute compatible avec les SH4!
(pas dit que ce que j'ai dit ait été clair, j’espère que ceux qui connaissent les syscall auront compris de quoi je parle)
-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
-Portal2D de JavierXD
-CalCraft de Wime
-GeekBros du groupe GeekBrothers (Eiyeron,Siapran,KevKevVTT,Adbook,LIMachi)
Citer : Posté le 03/01/2013 14:34 | #
c'est pas con tout ça... Y'a plus qu'a faire des tests
Citer : Posté le 03/01/2013 14:41 | #
Il me semble que ce que j'ai dit n'est pas trop faux, car 0x0135 = 309 (le syscall semble être le même pour ces deux versions, on peut donc espérer qu'il en soit de même pour les autres syscalls connus).
-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
-Portal2D de JavierXD
-CalCraft de Wime
-GeekBros du groupe GeekBrothers (Eiyeron,Siapran,KevKevVTT,Adbook,LIMachi)
Citer : Posté le 03/01/2013 14:54 | #
Les syscalls sont bons il me semble, d'après ce que j'ai entendu
Citer : Posté le 03/01/2013 15:06 | #
Génial, j'utilisais plusieurs syscall dans mon minecraft, et sa veut dire que si je le sors, il ne seras pas déjà obsolète
-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
-Portal2D de JavierXD
-CalCraft de Wime
-GeekBros du groupe GeekBrothers (Eiyeron,Siapran,KevKevVTT,Adbook,LIMachi)
Citer : Posté le 03/01/2013 22:57 | #
C'est une très bonne nouvelle, il va falloir que je mette à jour MonochromeLib.
Citer : Posté le 04/01/2013 10:05 | #
Bonjour, je suis le programmeur de ces functions. La probleme avec 0x02020000 devrait etre resoudre.
Le nouveau code:
#include "fxlib.h"
#define KEY_CHAR_0 OS2(0x30,71)
#define KEY_CHAR_1 OS2(0x31,72)
#define KEY_CHAR_2 OS2(0x32,62)
#define KEY_CHAR_3 OS2(0x33,52)
#define KEY_CHAR_4 OS2(0x34,73)
#define KEY_CHAR_5 OS2(0x35,63)
#define KEY_CHAR_6 OS2(0x36,53)
#define KEY_CHAR_7 OS2(0x37,74)
#define KEY_CHAR_8 OS2(0x38,64)
#define KEY_CHAR_9 OS2(0x39,54)
#define KEY_CHAR_DP OS2(0x2e,61)
#define KEY_CHAR_EXP OS2(0x0f,51)
#define KEY_CHAR_PMINUS OS2(0x87,41)
#define KEY_CHAR_PLUS OS2(0x89,42)
#define KEY_CHAR_MINUS OS2(0x99,32)
#define KEY_CHAR_MULT OS2(0xa9,43)
#define KEY_CHAR_DIV OS2(0xb9,33)
#define KEY_CHAR_FRAC OS2(0xbb,75)
#define KEY_CHAR_LPAR OS2(0x28,55)
#define KEY_CHAR_RPAR OS2(0x29,45)
#define KEY_CHAR_COMMA OS2(0x2c,35)
#define KEY_CHAR_STORE OS2(0x0e,25)
#define KEY_CHAR_LOG OS2(0x95,66)
#define KEY_CHAR_LN OS2(0x85,56)
#define KEY_CHAR_SIN OS2(0x81,46)
#define KEY_CHAR_COS OS2(0x82,36)
#define KEY_CHAR_TAN OS2(0x83,26)
#define KEY_CHAR_SQUARE OS2(0x8b,67)
#define KEY_CHAR_POW OS2(0xa8,57)
#define KEY_CTRL_EXE OS2(30004,31)
#define KEY_CTRL_DEL OS2(30025,44)
#define KEY_CTRL_AC OS2(30015,32)
#define KEY_CTRL_FD OS2(30046,65)
#define KEY_CTRL_EXIT OS2(30002,47)
#define KEY_CTRL_SHIFT OS2(30006,78)
#define KEY_CTRL_ALPHA OS2(30007,77)
#define KEY_CTRL_OPTN OS2(30008,68)
#define KEY_CTRL_VARS OS2(30016,58)
#define KEY_CTRL_UP OS2(30018,28)
#define KEY_CTRL_DOWN OS2(30023,37)
#define KEY_CTRL_LEFT OS2(30020,38)
#define KEY_CTRL_RIGHT OS2(30021,27)
#define KEY_CTRL_F1 OS2(30009,79)
#define KEY_CTRL_F2 OS2(30010,69)
#define KEY_CTRL_F3 OS2(30011,59)
#define KEY_CTRL_F4 OS2(30012,49)
#define KEY_CTRL_F5 OS2(30013,39)
#define KEY_CTRL_F6 OS2(30014,29)
#define KEY_CTRL_MENU OS2(30003,48)
#ifndef isOS2// This is new
typedef int(*sc_i2cp2sip)(char*, char*, short int*, short int*);
const unsigned int sc0015[] = { 0xD201D002, 0x422B0009, 0x80010070, 0x0015 };
#define GlibGetOSVersionInfo (*(sc_i2cp2sip)sc0015)
int OSVersionAsInt(void)
{
unsigned char mainversion;
unsigned char minorversion;
unsigned short release;
unsigned short build;
GlibGetOSVersionInfo( &mainversion, &minorversion, &release, &build );
return ( ( mainversion << 24 ) & 0xFF000000 ) | ( ( minorversion << 16 ) & 0x00FF0000 ) | ( release & 0x0000FFFF );
}
#define isOS2 (OSVersionAsInt() >= 0x02020000)
#define OS2(x,y) ((OSVersionAsInt() >= 0x02020000)?y:x)
#endif
const unsigned short* keyboardregister = (unsigned short*)0xA44B0000;
unsigned short key[8] = {0};
int KeyDown(int keycode)
{
if(isOS2)
{
int row, col, word, bit;
row = keycode%10;
col = keycode/10-1;
word = row>>1;
bit = col + 8*(row&1);
memcpy(key, keyboardregister, sizeof(unsigned short) << 3);
Sleep(1); //slow down, this function is faster than IsKeyDown() :-P
return (0 != (key[word] & 1<<bit));
}
else
{
return IsKeyDown(keycode);
}
}
#define IsKeyDown(x) KeyDown(x)
#define IsKeyUp(x) !KeyDown(x)
Citer : Posté le 04/01/2013 10:15 | #
Thanks a lot Casimo !
And we're happy to see you here ! 1st point
Ajouté le 04/01/2013 à 10:29 :
Zut i\'ve the same error with this code...