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 01/02/2025 16:14 | #
Edité pour réussir à compiler, avec plein de fonctions fantomes.
Voilà mon fichier actuel, qui bien sur ne marchera qu'avec la version 2 de l'OS, j'espère qu'il n'y a pas d'erreurs, il y a 3 références qui me sont inconnues, MMPrintRef, UpdateBatteryState et INTERNAL_USBPopup
https://www-fourier.univ-grenoble-alpes.fr/~parisse/casio/mpm/syscalls.c
Citer : Posté le 01/02/2025 16:45 | #
En linkant, j'obtiens une première liste complète de réf. non définies recopiée ci-dessous, mais il y en a pas mal qui proviennent de la libc et pas de mon code, qui peuvent donc être ignorées, et d'autres que je peux réimplémenter. Donc la liste qui m'intéresserait en priorité, c'est _GetSetupSetting, _SetSetupSetting, _OS_InnerWait_ms, _RTC_GetTicks, _RTC_SetDateTime, _Timer_Deinstall, _Timer_Install, _Timer_Start
Et vous avez imaginé un moyen qui permettrait d'émuler _SetQuitHandler?
_Bdisp_EnableColor
_Bfile_FindFirst_NON_SMEM
_Bfile_FindNext_NON_SMEM
_Bfile_GetMediaFree_OS
_Bfile_Name_MatchMask
_Bkey_SetAllFlags
_Cursor_SetFlashOff
_DefineStatusAreaFlags
_DefineStatusMessage
_DisplayStatusArea
_EnableStatusArea
_FKey_Display
_GetFKeyPtr
_GetSetupSetting
_HourGlass
_Keyboard_PutKeycode
_LocalizeMessage1
_MB_ElementCount
_MCSDelVar2
_MCSGetDlen2
_MCSPutVar2
_MCS_CreateDirectory
_OS_InnerWait_ms
_PRGM_GetKey_OS
_PrintCXY
_PrintXY
_RTC_GetTicks
_RTC_SetDateTime
_SMEM_MapIconToExt
_Scrollbar
_Serial_IsOpen
_Serial_Open
_Serial_PollTX
_Serial_Read
_Serial_Write
_SetQuitHandler
_SetSetupSetting
_Timer_Deinstall
_Timer_Install
_Timer_Start
_Timer_Stop
_itoa
Citer : Posté le 01/02/2025 18:20 | #
J'ai édité le fichier de syscalls 2 messages plus haut, KhiCAS linke maintenant. Il ne reste plus qu'à tester avec l'installeur quand il sera disponible dans quelques jours. Evidemment il y a certains trucs qui ne pourront pas marcher, mais j'ai l'impression que ça ne devrait pas déjà pas trop mal marcher...
Citer : Posté le 01/02/2025 21:26 | #
_GetSetupSetting, _SetSetupSetting : Pas de réponse immédiate
_OS_InnerWait_ms : 0x80216f4c (v1), 0x8030a2dc (v2)
_RTC_GetTicks : 0x8004babc (v1), 0x8007cc0c (v2)
_RTC_SetDateTime : 0x80175418 (v1), 0x80230d94 (v2)
_Timer_Deinstall : 0x800b13d4 (v1), 0x8010def0 (v2)
_Timer_Install : 0x800b130c (v1), 0x8010de28 (v2)
_Timer_Start : 0x800b1456 (v1), 0x8010df72 (v2)
Citer : Posté le 01/02/2025 22:09 | #
Super, j'ai mis à jour chez moi ainsi que ci-dessus. Timer_Stop est probablement proche de Timer_Start, sinon peut-être que la désinstallation le désactive?
Citer : Posté le 01/02/2025 22:12 | #
Timer_Stop: 0x800b14b2 (v1), 0x8010dfce (v2)
Je l'avais mais j'ai regardé que la liste principale pas la liste complète parce que j'ai été trop vite lol. Je regarde les autres un peu plus tard...
Citer : Posté le 02/02/2025 09:05 | #
Merci, je l'ai inclus.
Il reste un syscall manquant qu'il serait difficile de refaire, c'est SetQuitHandler.
Citer : Posté le 02/02/2025 09:23 | #
Pour l'instant il n'y aura pas de retour au menu parce que GetKey() pense qu'on est déjà dans le menu, donc appuyer sur MENU ne fait rien. Il est peu probable que ça s'améliore significativement. Auquel cas SetQuitHandler() revient juste à appeler la fonction à la fin de main().
Citer : Posté le 02/02/2025 10:09 | #
Du coup, pour fermer un addin, il faut exécuter dans le code source un return "standard" et pas une boucle d'attente indéfinie qui teste le clavier, c'est ça?
Citer : Posté le 02/02/2025 10:12 | #
C'est ça. Tu peux aussi appeler exit() si c'est fourni par la libc du PrizmSDK. Mais fondamentalement quand tu t'en vas tu peux pas revenir. (Ou alors faut avoir un mécanisme de sauvegarde/restauration de session, que tu as peut-être d'ailleurs.)
Citer : Posté le 02/02/2025 11:41 | #
Oui, c'est précisément à ça que sert SetQuitHandler (sauvegarder la session courante), mais du coup si l'appui sur HOME ne fait rien, je n'ai plus besoin du SetQuitHandler, puisque l'utilisateur devra explicitement sélectionner un item Quitter dans un menu.
Citer : Posté le 03/02/2025 21:53 | #
Je viens de tester le lancement de micropy depuis l'emulateur de Heath après avoir modifié le source pour afficher les syscalls utilisés, afin de traquer des problèmes potentiels à l'exécution sur la math+ avec le remplacement des syscalls.
Ils sont quasiment tous dans la liste que j'avais donné, à l'exception de deux syscalls d'indice:
0x0029
0x01e6
Le syscall 0x0029 est appelé en premier de manière implicite, par crt0.S (GlibAddinAplExecutionCheck), a-t-il un équivalent sur la math+? Ou faut-il modifier crt0.S?
Le syscall 0x01e6 est appelé plus tard, pendant l'affichage de la console de micropy, ça m'aiderait de savoir à quoi il correspond si quelqu'un sait.
Merci!
Citer : Posté le 03/02/2025 22:00 | #
Bon, j'ai posté trop vite, 0x1e6 c'est GetVRAMAddress, et il est appelé par la libgcc dans le prizm-sdk.
Il reste donc la question de crt0.S
Citer : Posté le 03/02/2025 22:10 | #
%29 sera collé sur un nop dans MPM et tu peux le sauter sur la Math+.
Ça n'a aucune importance mais note que c'est certainement pas libgcc qui appelle GetVRAMAddress().
Citer : Posté le 03/02/2025 22:18 | #
oui, oui, c'est juste parce que j'ai mis le fichier syscalls.c dans le même répertoire que crt0.S :-)
Citer : Posté le 03/02/2025 22:22 | #
Du coup, je dois mettre quoi dans crt0.S à la place de
! By Tari and calc84maniac, based on Kristaba's reverse-engineered crt0.
.extern _main
.global initialize
.section ".pretext"
.align 2
initialize:
! Preserve things on the stack
mov.l r14, @-r15 ! Frame pointer
sts.l pr, @-r15 ! Return address
mov.l r4, @-r15 ! Parameter 1
! Copy .data section into RAM
mov.l v_datald, r0 ! From
mov.l v_sdata, r2 ! To
mov.l v_edata, r3 ! Limit
dataLoop:
cmp/hs r3, r2
bt dataDone ! Stop when r2 >= r3
mov.l @r0+, r1
mov.l r1, @r2
bra dataLoop
add #4, r2 ! Delay slot
dataDone:
! Zero out .bss
mov.l v_ram_ebss, r2 ! To
mov.l v_ram_bbss, r3 ! Limit
mov #0, r1 ! Constant
bssLoop:
cmp/hi r3, r2
bf bssDone ! Stop when r2 <= r3
nop
bra bssLoop
mov.b r1, @-r2 ! Delay slot
bssDone:
! RAM is now initialized
mov r5, r14 ! Save parameter 2
mov #1, r6
mov #0, r4
bsr _GlibAddinAplExecutionCheck
mov r6, r5
! main(r4, r5) with same state as input (returns to our caller)
mov.l main, r7
extu.w r14, r5
mov.l @r15+, r5
lds.l @r15+, pr
jmp @r7
mov.l @r15+, r14 ! Delay slot
_GlibAddinAplExecutionCheck:
mov.l v_syscall, r2
jmp @r2 ! _GlibAddinAplExecutionCheck
mov #0x29, r0 ! Delay slot
! Constants
.align 4
main:
.long _main
v_syscall:
.long 0x80020070
v_datald:
.long _datald
v_edata:
.long _edata
v_sdata:
.long _sdata
v_ram_bbss:
.long _bbss
v_ram_ebss:
.long _ebss
Merci!
Citer : Posté le 03/02/2025 22:26 | #
Le plus chirurgical est juste de commenter la ligne bsr _GlibAddinAplExecutionCheck.
Citer : Posté le 04/02/2025 10:28 | #
Un syscall que j'ai oublié: Bdisp_EnableColor, on a la nouvelle adresse?
Merci!