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 05/07/2013 21:18 | #
c'est genial, maintenant, il n'y a plus qu'à récuperer les sources et à tout recompiler.
Citer : Posté le 05/07/2013 21:42 | #
bon, je sens que Mario Land CE va avoir droit a une nouvelle vie
(je ne fais qu'une suggestion )
-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 05/07/2013 22:06 | #
c'est genial, maintenant, il n'y a plus qu'à récuperer les sources et à tout recompiler.
Heu, par contre il n'ajoute pas automatiquement le code dès l'import d'un projet. Il ne le fait que lors de sa création...
Citer : Posté le 05/07/2013 22:59 | #
Si on avait les sources on pourrait le faire facilement de toute façon.
Citer : Posté le 05/07/2013 23:06 | #
oui, c'est sur.
Je réfléchissais, en trouvant les codes assembleur du Getkey et des IsKey****, on pourrait le remplacer par ceux compatibles SH4.
Le plus chaud, c'est que vu que c'est une fonction avec pointeur (pour Getkey), faudra voir comment gérer le truc.
Citer : Posté le 09/07/2013 14:23 | # | Fichier joint
Je suis peut-être sur une piste pour pouvoir convertir des addin déjà compilés. Le gros problème c'est que je n'ai pas d'SH4 donc pour tester c'est chiant.
Donc je voudrais savoir si quelqu'un pourrait passer régulièrement ici et tester les addin que je lui donne. En voilà déjà une fournée. Ceux la ne sont pas corrigés, ils vont juste me permettre de bien situer le problème.
Donc tous les addins se trouvent en pièce jointe dans le zip, y'en a certain qui sont censé bugger et d'autre non. (ils fonctionnent tous sur SH3).
Quand le bug se produit, vous notez les deux valeurs qui sont affichés à l'écran (Target et PC) et vous les écrivez ici.
Merci beaucoup à celui qui fera ça
Ajouté le 09/07/2013 à 14:36 :
Je viens d'en rajouter un que j'avais oublié, il y en a maintenant 9 à tester
Citer : Posté le 09/07/2013 15:43 | #
Alors donc
GET6C4-2 : c'est bon (touche pour quitter ?)
GETKEY247 : c'est bon aussi (pareil ?)
GET6C4 : Target E6FF2136
Pc 08100014
GETKEY : c'est ok
KEYDOWN : l'écran s'éteint ; tenter de rallumer ne fait rien sauf si j'enlève les piles auparavant
KEYUP : pas de bug, mais il se passe rien [juste affiché test : up] ( de même, touche pour quitter ?)
SC135 : comme keyup, écran gelé sur test : 080085c1
SC135-2 : Target E6FF2136
Pc : 08100014 (les mêmes que GET6C4 en passant)
SC135-3 : Exactement comme SC135 (gelé sur test : 080085c1)
Avec la semelle de nos chaussures, on en fait autant
ziqumu-- Invité
Citer : Posté le 09/07/2013 16:03 | #
Arf j'ai oublie de te dire certaines instructions. En principe pour quitter c'est menu. Mais c'est possible que ça ne fonctionne pas sur certains. Donc soit t'enleve les piles doit bouton restât derriere c'est pareil
GETKEY247 : tu peux me dire ce que ca fait quand tu appuis sur exe
GETKEY : idem
KEYDOWN : rien ne se passe même si tu appuis sur exe
KEYUP : normalement si tu appuis sur exe ça devrait marquer down
SC135 : appuis sur exe
SC135-3 : idem
En tout cas merci beaucoup, ça va beaucoup m'aider, notamment si keyup fonctionne, alors que keydown non
Citer : Posté le 09/07/2013 17:03 | #
Pas de quoi
GETKEY247 :
test :
00000003
00000002
GETKEY :
test :
00007534
KEYDOWN : ça change rien
KEYUP : idem, up reste
SC135 : ça fait rien
SC135-3 : et là non plus
:/
tu m'as pas demandé mais dans le doute je mets quand même
:arrow:GET6C4-2 : test : 0000001f
Avec la semelle de nos chaussures, on en fait autant
Citer : Posté le 09/07/2013 17:44 | #
Merci Maliafo. Je récapitule pour tous les devs pour que ce soit bien claire :
Fonction d'input :
GetKey de la FxLib :
Fonctionne parfaitement avec les mêmes codes de touches (fonction d'input bloquante)
le GetKeyWait du syscall 0x6C4 :
Fonctionne parfaitement avec les mêmes codes de touches (fonction d'input non bloquante)
le GetKeyWait du syscall 0x247 :
Fonctionne parfaitement avec les mêmes codes de touches (fonction d'input bloquante et non bloquante)
IsKeyDown de la FxLib :
Ne fonctionne pas : l'écran s'éteint et tenter de rallumer ne fait rien (sauf si on appuis sur le bouton restart évidement) => Freeze
IsKeyUp de la FxLib :
Ne fonctionne pas : l'information comme quoi la touche n'est plus "Up" n'est pas envoyé, cependant il ne semble pas y avoir de freeze de la calculatrice.
Voilà c'est tout pour les fonction d'input, il ne me semblait pas en avoir vu d'autres. Enfin si il y a la getKeyWait de la fxlib, mais celle-ci n'a jamais fonctionné.
Appel des syscall : Ce petit test m'a permis de vérifier ce que je pensais déjà, il y a une forme d'appel de syscall qui ne fonctionne plus. Celle qui est utilisé dans monochromelib.
Ici l'appel du syscall 0x135, dans le format qui ne fonctionne pas :
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));
}
Le même syscall avec le format donné par Casimo, celui-ci fonctionne :
const unsigned int sc0135[] = { 0xD201D002, 0x422B0009, 0x80010070, 0x0135 };
#define ML_vram_adress (*(sc_cpv)sc0135)
Je rappel tout de même que le meilleur format est celui utilisant un fichier externe et celui-ci est compatible :
#include "syscall.h"
int AddIn_main(int isAppli, unsigned short OptionNum)
{
Disp_GetVRAMPtr();
}
[red][b]--syscall.h--[/b][/red]
#ifndef _SYSCALL
#define _SYSCALL
char* Disp_GetVRAMPtr();
#endif
[red][b]--syscall.src--[/b][/red]
.SECTION P,CODE,ALIGN=4
.MACRO SYSCALL FUNO, SYSCALLNAME, TAIL=nop
.export \SYSCALLNAME'
\SYSCALLNAME'
mov.l #h'\FUNO, r0
mov.l #H'80010070, r2
jmp @r2
\TAIL'
.ENDM
SYSCALL 0135, _Disp_GetVRAMPtr
.end
Et dans le SDK vous indiquez au gestionnaire de fichier : main.c et syscall.src
Bon maintenant je vais essayer de comprendre pourquoi le format de MonochromeLib ne fonctionne pas, et comment le résoudre directement en assembleur (et si possible résoudre le problème en C, pour garder ce format que je trouve plus logique que celui de Casimo). Puis j’essaierais de résoudre le problème d'input. Je vous tient au courant, j'aurais sans doute encore des fichiers à tester, et encore merci à Maliafo
Citer : Posté le 09/07/2013 18:43 | #
De rien, c'était gratuit
Avec la semelle de nos chaussures, on en fait autant
Citer : Posté le 09/07/2013 20:32 | # | Fichier joint
Sans grande conviction, pourrait tu tester ce fichier stp ?
(enfin Maliafo ou quelqu'un d'autre qui a une SH4, peu importe )
En principe si ça fonctionne tu devrait voir afficher
test : 080085c1
Mais il y a peu de chance que ça fonctionne
Citer : Posté le 11/07/2013 15:31 | # | Fichier joint
Un nouveau petit test : si je ne me suis pas trompé, lorsque vous appuirez sur une touche les 4 lignes affichés sur l'écran devraient changer.
J'aimerais avoir les valeurs de ces 4 lignes pour :
- Quand vous appuyez sur aucune touche
- Quand vous appuyez sur F1
- Sur F2
- Sur EXE
- Sur AC/ON
- SUR "ln"
- SUR EXE et F2 en même temps.
ça risque de faire pas mal de lignes, dsl. Et y'a toujours le fichier précédent à tester
Merci à celui qui le fera !
Citer : Posté le 11/07/2013 15:35 | #
Dsl, je peut pas tester, je suis pas chez moi et j'ai pas ma calto
Avec la semelle de nos chaussures, on en fait autant
Citer : Posté le 11/07/2013 17:07 | #
Pour le fichier METHODML.g1a:
System ERROR:
TARGET=E6FF2136
PC =08100014
On peut voir à gauche "Te...", le reste est masqué par l'écran d'erreur
Pour le deuxième fichier:
-aucune touches:
00000000
00000000
00000000
00008042
-F1: idem, aucun changement
-F2: aucun changement non plus
-EXE: la première ligne devient: 04000000, le reste ne change pas
-AC/ON: la première ligne devient: 00010000, le reste ne change pas
-In: la deuxième ligne devient: 00000010, le reste ne change pas
-EXE et F2: même comportement qu'avec EXE
→les touches "F1~3", "/", "F<- >D", "(", "0", ".", et "*10^x" n'ont aucun effet
→appuyer sur plusieurs touches fait apparaître les chiffres correspondant aux touches pressées.
Citer : Posté le 11/07/2013 18:01 | #
Hmm ça marche pas si bien que ça Faut que je vois ce qui cloche.
Merci beaucoup quand même Alpha'
Citer : Posté le 12/07/2013 23:02 | #
Bon une amie m'a prêté sa calculatrice SH4, je vais pouvoir aller beaucoup plus vite
Explication de là ou j'en suis et d'autres truc qui pourraient servir à d'autres gens peut-être :
Bon alors actuellement, je bosse sur la fonction IsKeyUp, j'ai normalement trouvé la partie que je doit remplacer dans le code assembleur de la fonction.
De base la fonction IsKeyDown (comme la fonction KeyDown de Pierrotll) utilisent les ports du processeurs pour savoir l'état des touches et a partir de ces information on arrive à en déduire la position de la touche. Sauf que sur SH4 on a un nouveau processeur, sans doute une nouvelle disposition, ce qui explique que les ports ne sont plus du tout les mêmes qu'avant (pour faire simple ils ont pas du brancher les fils du clavier sur la même prise du processeurs ). Ce qui explique l'incompatibilité avec ces fonctions.
(De plus, si ça se trouve les adresses pour accéder à ces ports ne sont plus les mêmes, et si c'est le cas, je ne sais pas comment les retrouver)
Mais notre ami Casimo a trouvé (je ne sais comment) une solution. En effet les calculatrices SH4 disposent d'un "registre clavier" qui répertorie l'appui sur les touches du clavier.
La ligne du clavier détermine l'octet à lire et je rappel que la ligne F1-6 est la ligne 9 et la 0-EXE est la 1
L'adresse de l'octet vaut 0xA44B0000+Ligne+1-(Ligne%2)
Ensuite, si la colonne de gauche est appuyé alors ça sera le bit 0100 0000 puis pour la deuxième 0010 0000, je vous laisse continuer
Je ne sais pas s'il existe un registre similaire sur SH3, mais je n'en suis pas sûr. Je pense que c'est nouveaux et que les mecs de chez casio ont fait ça pour qu'il n'y ai plus de problèmes similaire dans les futurs changements matériels. Donc selon moi cette adresse est définitive et on peut donc réaliser des fonctions optimisés dessus sans risque, m'enfin je peux me tromper.
Donc maintenant il me reste à réaliser un code assembleur qui vérifiera si la touche est appuyé a partir des infos ci-dessus. Et on prie pour qu'il soit assez petit pour pouvoir remplacer l'actuel sans déborder, sinon ça sera plus chiant
Citer : Posté le 13/07/2013 12:36 | #
J'ai modifié cette function: http://prizm.cemetech.net/index.php/Debouncing_Multiple-Keypress_PRGM_GetKey
Ces SH4s sont des prizms avec un display monochrome
L'adresse de l'octet vaut 0xA44B0000+Ligne+1-(Ligne%2)
Ensuite, si la colonne de gauche est appuyé alors ça sera le bit 0100 0000 puis pour la deuxième 0010 0000, je vous laisse continuer
Oui, c'est vrai.
Non, pas du registre Les deux sont tout different
Bonne chance.
Citer : Posté le 13/07/2013 15:01 | #
Merci pour tes précision Casimo
Et j'ai réussi à rendre la fonction IsKeyDown compatible manuellement !
Je vais maintenant réaliser un programme pour faire ça de façon automatique.
Si ça intéresse voilà le code asm que j'utilise
;before 1->r5 ; 8->r7 ; 1->r12 ; 0->r10 ; 0->r11 ; row->r0 ; col->r3
;verify the row value : 0 <= row < 7
cmp/gt r0,r10
bt target_Error ; if row<0
mov #h'a,r7
cmp/ge r7,r0
bt target_Error ; if row>=10
;verify the col value : 0 <= row < 7
cmp/gt r3,r10
bt target_Error ; if col<0
mov #7,r7
cmp/ge r7,r3
bt target_Error ; if col>=7
;get the main keyboard regsiter address+1
mov.l #H'A44B0001,r9
tst #1,r0 ;if row is even T=1 else T=0
add r0,r9
bt target_even ; Jump if T=1
add #-2,r9
target_even:
mov.b @r9,r0 ; The byte that contain the row data is now in R0
mov #1,r9
shld r3,r9 ; R9 now contain 1<<col
tst r9,r0 ; if key is pressed T=0
mov #0,r0
bt target_keyPressed
mov #1,r0
target_keyPressed:
bra target_endFunc
nop
target_Error:
mov #0,r0
bra target_endFunc
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
target_endFunc:
Bon ça va il me restait encore beaucoup de place. (les NOP correspondent à des lignes que je peux remplacer)
EDIT : @Casimo, Do you know why the call method of syscall used in Monochromelib doesn't work ? I know how they works, but I don't know where is the problem. I will search after, but maybe you have an idea ?
Ajouté le 01/08/2013 à 15:01 :
Si quelqu'un tombe ici et veux voir la suite (et l’aboutissement) de mes recherches -> SH4 compatibility tool
Citer : Posté le 02/09/2013 14:43 | #
alors, ça avance la compatibilité SH4
édit by totoyo : smiley supprimés
Citer : Posté le 02/09/2013 16:19 | #
Pas besoin de tous ces smileys pour s'exprimer... Et renseigne-toi un peu avant de demander, Ziqumu a justement publié son outil pour rendre compatible les add-ins en SH4 juste au-dessus...
Calculatrices : Graph 35+ USB tweakée et Classpad 330
Suivez moi et mon humour dévastateur ici focliquéla