MPM : Mod add-ins Math+
Posté le 02/12/2024 12:36
Comme annoncé pour le
Puzzle de l'Avent, un mod Math+ non-officiel est en cours de développement pour permettre d'écrire des add-ins sur la Math+.
Le mod n'est pas encore public du fait qu'il n'y a pas encore les sécurités nécessaires pour bien empêcher qu'on en abuse. Mais les questions techniques sont partiellement résolues et on commence à avoir une vue raisonnable de ce qu'on va pouvoir, ou pas, faire sur la Math+.
La préoccupation principale est
si les .g3a existants vont marcher tels quels, ou
compatibilité binaire. Ce serait le pied, mais c'est pas encore clair si on peut parce que la table des syscalls n'existe plus.
Par ce topic je souhaiterais savoir ce que la communauté voudrait voir dans un tel mod et discuter de la faisabilité technique. Y a-t-il des choses qui posaient problèmes sur la 90 que vous voudriez améliorer ? Des soucis attendus avec la Math+ que vous voulez voir adressés ? J'ai déjà quelques idées en tête, mais je vous laisse vous exprimer.
—
Liste de préoccupations :
- Compatibilité binaire :
Pas encore clair
Si on peut l'avoir, c'est super. Sinon, y'a un casse-tête à attendre pour traquer quels add-ins sont compatibles. L'absence de table de syscalls est le principal souci ici, ce qui peut peut-être se contourner avec un coup d'UBC pour intercepter les appels.
- Compatibilité de la disposition clavier :
Pire cas, en recompilant
Syscalls + GetKey() : les codes sont adaptés, certaines touches disparaissent, d'autres sont nouvelles.
gint sans recompiler : j'ai un trick en tête mais il vaut mieux imaginer que ça va donner des mauvais résultats.
gint en recompilant : la compatibilité sera assurée.
- Reste du matériel :
Quasiment garanti identique
Il faudrait qu'un truc très gros m'ait échappé.
- RAM étendue :
Probablement OK
Il y a de la mémoire après les 2 premiers Mo, pas sûr cependant de si l'utiliser interférera avec l'opération normale de l'OS.
- Récupérer 16 Mo de mémoire de stockage :
Pas clair
Il faut que ça marche en pratique et c'est dur d'écarter tous risques de brick. Et je sais pas comment faire techniquement parlant.
Citer : Posté le 06/02/2025 12:45 | #
Voici un programme permettant de détecter les syscalls, et qui génère une table de syscalls similaire à celle utilisée par la 90 en 0x80020070. Il faut avoir une rom de 90 (rom90.bin) et une autre rom dont on cherche les adresses des syscalls (rommp.bin)
#include <iostream>
#include <stdio.h>
#include <string.h>
// bigendian int at
unsigned intat(const unsigned char * s){
unsigned res=s[0];
++s; res *= 0x100; res += *s;
++s; res *= 0x100; res += *s;
++s; res *= 0x100; res += *s;
return res;
}
unsigned short revert(unsigned short u){
return ((u&0xff)<<8) | (u>>8);
}
unsigned findsyscall(const unsigned short * buf90,const unsigned short * bufmp,int s,unsigned offset,int calln,int nwords){
offset += 4*calln;
offset &= 0xffffff;
printf("offset %x\n",offset);
offset=intat(((const unsigned char *) buf90)+offset);
printf("syscall 90 address= %x\n",offset);
if (offset<=0x80000000 || offset>=0x80800000)
return 0;
offset &= 0xffffff;
const unsigned short * ptr90=buf90+offset/2;
printf("bigendian values %4x %4x %4x %4x %4x %4x %4x %4x\n",revert(ptr90[0]),revert(ptr90[1]),revert(ptr90[2]),revert(ptr90[3]),revert(ptr90[4]),revert(ptr90[5]),revert(ptr90[6]),revert(ptr90[7]));
unsigned short p0=*ptr90,p1=ptr90[1];
int found=0;
for (unsigned u=0;u<s/2;++u){
if (bufmp[u]!=p0 || bufmp[u+1]!=p1)
continue;
if (memcmp(ptr90,bufmp+u,2*nwords)==0){
offset=0x80000000+2*u;
printf("same start on math+ at %x %x\n",offset,2*u);
printf("bigendian values %4x %4x %4x %4x %4x %4x %4x %4x\n",revert(bufmp[u+0]),revert(bufmp[u+1]),revert(bufmp[u+2]),revert(bufmp[u+3]),revert(bufmp[u+4]),revert(bufmp[u+5]),revert(bufmp[u+6]),revert(bufmp[u+7]));
++found;
}
}
if (found){
printf("Found %i same start\n",found);
return found==1?offset:0;
}
// similar means that at 4-aligned address, if starts with rom/ram value
// 0x80, 0x8c or 0xfd, then skip address
// also skip relative PC offsets
p0 &= 0xff;
p1 &= 0xff;
for (unsigned u=0;u<s/2;++u){
if ((bufmp[u]&0xff)!=p0 || (bufmp[u+1]&0xff)!=p1)
continue;
int i=2;
for (;i<nwords;++i){
unsigned short p=ptr90[i];
p=p&0xff;
if ((bufmp[u+i]&0xff)==p){
if (i%2==0){ // skip whole address in rom/ram
if (p==0x80 || p==0xa0 || p==0x8c || p==0xfd){
++i;
}
}
continue;
}
break;
}
if (i>=nwords){
++found;
offset=0x80000000+2*u;
printf("similar start on math+ at %x %x\n",offset,2*u);
printf("bigendian values %4x %4x %4x %4x %4x %4x %4x %4x\n",revert(bufmp[u+0]),revert(bufmp[u+1]),revert(bufmp[u+2]),revert(bufmp[u+3]),revert(bufmp[u+4]),revert(bufmp[u+5]),revert(bufmp[u+6]),revert(bufmp[u+7]));
}
}
if (!found)
printf("Nothing found\n");
else
printf("Found %i similar start\n",found);
return found==1?offset:0;
}
int main(int argc,const char ** argv){
int nwords=16;
if (argc>1)
nwords=atoi(argv[1]);
printf("Starting mksyscall with nwords=%i\n",nwords);
FILE * f90=fopen("rom90.bin","rb");
if (!f90){
printf("File rom90.bin (Graph90/FXCG50) not found\n");
return 2;
}
int s=8*1024*1024;
unsigned short * buf90=(unsigned short*) malloc(s);
fread(buf90,1,s,f90);
fclose(f90);
FILE * fmp=fopen("rommp.bin","rb");
if (!f90){
printf("File rommp.bin (Math+/FXCG100) not found\n");
return 2;
}
unsigned short * bufmp=(unsigned short *) malloc(s);
fread(bufmp,1,s,fmp);
fclose(fmp);
unsigned offset=0x2007c;
offset=intat(((const unsigned char *) buf90)+offset);
printf("syscall 90 table at %x\n",offset); // 0x66f2d8
unsigned nsyscalls=0x1ff0;
FILE * f=fopen("syscalls","wb");
fprintf(f,"{\n ");
for (int calln=0;calln<nsyscalls;++calln){
unsigned addr=findsyscall(buf90,bufmp,s,offset,calln,nwords);
printf("syscall %x addr %x\n",calln,addr);
fprintf(f,"0x%x,",addr);
if (calln%8==7)
fprintf(f,"// %x\n ",calln);
}
fprintf(f,"};\n");
fclose(f);
}
Citer : Posté le 09/02/2025 11:50 | # |
Fichier joint
Voici l'installeur pour Math+ version 2.00. Les instructions ne sont pas très compliquées :
L'installation est rapide. Si vous avez des erreurs de communication avant l'étape 3 (rare mais ça arrive) relancez tout. Si vous avez un message d'erreur ou une System ERROR sur la calto faites-moi signe. Dans tous les cas gardez sous la main l'updater officiel pour réinstaller l'OS en cas de problème énorme (mais ça m'étonnerait).
Je joins mpm.bin avec le détail de ce qui est supporté dans le post suivant.
Citer : Posté le 09/02/2025 12:05 | # |
Fichier joint
Voici un mpm.bin à jour. Pour l'instant :
Pour une release propre, on attend que l'installeur soit testé sans bug chez plus de gens (pas mal de tests en interne mais ça fait pas tout) et que les syscalls soient au moins un peu émulés.
Un peu chiant les zip en PJ ^^"
Citer : Posté le 09/02/2025 12:09 | #
Merci et toutes mes félicitations, c'est un jour historique dans l'histoire de la communauté Casio Graph ! 👍
Citer : Posté le 09/02/2025 12:12 | #
Je joins mes félicitations à celle de critor, je vais commencer à tester tout ça dès cet après-midi!
Citer : Posté le 09/02/2025 12:31 | #
Kudos to all MPM contributors!
I will test it once I receive my Graph Math+ from Amazon.de by 21 this month
Citer : Posté le 09/02/2025 12:48 | #
Gros GG de ma part aussi!
#LepheLeBosseur
Citer : Posté le 09/02/2025 13:09 | #
Merci de la part de "l'équipe" (principalement les initiateurs du projet pour les parties subtiles d'installation et moi pour les parties utilisateur)
Citer : Posté le 09/02/2025 15:57 | #
Je suis en train d'avancer sur le portage de micropy (pour le moment le mpm.bin ne supporte pas des addins de grande taille comme khicas, et puis mieux vaut se faire la main avec un petit addin). Version alpha actuelle si vous voulez essayer:
https://www-fourier.univ-grenoble-alpes.fr/~parisse/casio/mpm/mpmpy.g3a
Je propose un tableau de correspondance pour simuler les touches F1 à F6 qui pourrait servir pour tous les addins à syscall dont l'interface ne sera pas réécrite (ou seulement rapidement):
F1=Settings (sauf si on peut utiliser ON)
F2=Home (j'ai mis "quit" dans le menu rapide pour pouvoir quitter facilement micropy)
F3=prevtab
F4=page down
F5=nexttab
F6=page up
Je n'arrive pas à accéder à la touche ON avec GetKey, est-ce possible? Sinon, l'autre touche qui n'est pas juste en-dessous du fmenu c'est F4, on ne peut évidemment pas rediriger la touche curseur vers le haut, du coup j'ai pris pagedown puisque pageup sert à simuler F6.
J'observe que la fonte de caractères de PrintMini a changé, elle est plus compacte pour les lettres, par contre pour les chiffres elle prend plus de place et même un peu trop à mon gout.
Citer : Posté le 09/02/2025 16:00 | #
Est-ce que tu as pu installer sans souci ?
Il y a déjà un mapping pour F1...F6 dans gint qui est CATALOG + la ligne du-dessous (XOT... e^). À mon humble avis il n'y a pas de distribution convaincante et les nouvelles touches ont des sémantiques bien particulières (surtout prev/next tab et page up/down) qu'il ne vaut mieux pas toucher.
GetKey() ne permet pas de détecter la touche ON.
Citer : Posté le 09/02/2025 16:24 | #
Oui, pas de soucis d'install.
Pour F1-F6, je ne pense pas qu'il y ait de bonne solution. CATALOG+touche si tu as un addin qui affiche un menu à 6 entrées de type 90, il faut le savoir et ça nécessite 2 keystrokes. La solution que je propose utilise un seul keystroke, et est assez naturelle, tu tapes la touche juste en-dessous de l'affichage et ça marche pour 4 touches sur 6. Ca ne fait rien pour ON, du coup c'est assez naturel d'essayer la touche juste en-dessous je pense. Il n'y a que F4 pour lequel ce n'est pas naturel. Mais ça reste suffisamment logique pour qu'on s'en souvienne facilement: prevtab, pagedown, nexttab, pageup. Je remappe aussi TOOLS vers F6 (menu Fichier dans micropy ou khicas).
Dans micropy, j'ai rajouté dans l'affichage du menu de quoi s'en souvenir. Et je vais modifier les menus pour prendre en compte pageup/pagedown.
On verra à l'usage ce que les gens en pensent, ce n'est pas figé.
Citer : Posté le 09/02/2025 16:26 | #
L'usage c'est de retravailler les interfaces graphiques, ultimement... de mon côté j'ai ce qu'il faut pour gintctl et les autres outils. Je passerai à un système qui marche bien sur les deux claviers.
Citer : Posté le 09/02/2025 16:49 | #
KhiCAS fonctionne aussi sur Nspire, TI83 et Numworks, je veux avoir une interface similaire avec des menus rapides avec légendes correspondantes rappelées en bas. Ceci pour pouvoir s'adapter à différentes marques de calculatrices dans une même classe/amphi (comme ça je fais une démo avec un émulateur et je dis pour ceux qui ont une ... remplacer F1 à F6 par ...).
Au départ je pensais utiliser shift-1 à shift-6 comme sur la Numworks ou la nspire, mais je ne pense pas que ce soit une bonne idée de masquer [ ], d'où mon choix.
Citer : Posté le 09/02/2025 17:04 | #
GG
Installation sans souci.
Plus qu'à tester un addin poour voir ;D
Citer : Posté le 09/02/2025 19:15 | # |
Fichier joint
Bon en bossant un petit peu on peut faire des addins "double compatibles"
J'ai réécrit la cSDL pour supporter les deux claviers (fxCG50 et fxCG100 / Graph 90+E et Graph Math+).
Voici SDL_Tetris recompilé et modifié pour s'adapter aux deux claviers :
Gauche Droite Bas pour bouger
SHIFT pour tourner la pièce
EXIT/BACK pour sortir
Citer : Posté le 09/02/2025 21:43 | #
Et bien félicitations @Slyvtt, pour nous avoir ainsi signé dès ce soir la toute première application pleinement fonctionnelle sur les deux plateformes fx-CG50/100 ! 👍
Citer : Posté le 09/02/2025 22:24 | #
GetKey() ne permet pas de détecter la touche ON.
J'espère que c'est possible avec GetKeyWait_OS ?
Ca me permettrait d'avoir 5 touches de fonction de manière naturelle, il suffirait de ne rien afficher pour F4, et de rediriger Tools vers F4 (qui me sert de menu des commandes).
Citer : Posté le 09/02/2025 23:43 | #
Aucune idée concrète mais à l'intuition je suis pas sûr. Les paramètres n'ont pas changé AFAIK.
Citer : Posté le 10/02/2025 07:24 | #
Alors je vais tester avec khicas, qui utilise GetKeyWait_OS. Mais ça veut dire qu'il faut que je modifie mpm.bin à 2 endroits il me semble: la ram, je peux la mettre en 0x8c680000 au lieu de 0x8c580000? Il me semble aussi que je dois modifier le mapping pour 32 pages au lieu de 16 dans load_addin, autre chose que j'aurais oublié?
Citer : Posté le 10/02/2025 11:45 | #
Bonjour,
J'ai installé mpm sans problème, et j'ai pu transféré micropy.
Mais impossible de le lancer: il n'apparaît pas en icône dans le menu, et le lancer manuellement (load dans 'Memory') me dit "invalid type".
Est-ce que j'ai raté quelque chose ?
D'avance merci, cordialement
Citer : Posté le 10/02/2025 11:48 | #
Si tu as installé un g3a tu le trouveras dans le menu des add-ins qui s'ouvre avec TOOLS dans le menu principal.
Je réalise que j'ai rien écrit à ce sujet, oups. >_>
Note que la compatibilité est très limitée pour le moment, le mod est plus prévu pour les développeurs.