Posté le 31/08/2020 17:28
Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 227 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements
Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd
Citer : Posté le 31/08/2020 17:33 | #
La table des syscalls est ici : https://bible.planet-casio.com/simlo/chm/v20/fx_legacy_syscalls.htm
Pour les fx-CG20 c'est ici : https://bible.planet-casio.com/simlo/chm/v20/fx_fxCG20_syscalls.htm
Ajouté le 31/08/2020 à 17:34 :
Donc à priori le 0x3F4 sur les Graph 75 et 0x1839 sur CG20.
Par contre je laisse @Lephenixnoir en dire plus sur les incompatibilités entre modèles (en particulier G75/G35+E III et CG20/G90+E)
Citer : Posté le 31/08/2020 17:34 | #
Je regarde...
Merci et à bientôt !
Super !
Ajouté le 31/08/2020 à 17:41 :
@Lephenixnoir : Sur Graph 35+E tweakée avec " OS_205_SH4_E" (selon la formule de fxUpgrade), le 0x3F4 a-til des chances de fonctionner ?
Citer : Posté le 31/08/2020 18:48 | #
Ça devrait marcher sur tous les modèles sans trop de problèmes à condition de coder avec le fx-9860G SDK. gint ne comprend pas les effets de bord de l'extinction, les add-ins crashent au redémarrage (c'est pour ça que Shift-AC/ON ne fait rien).
Citer : Posté le 31/08/2020 18:54 | #
D'accord, merci !
Au passage, j'ai cherché une méthode pour appeler un syscall, mais je n'ai pu obtenir que quelque chose de très flou...
En bref, je ne comprends pas du tout la méthode...
Citer : Posté le 31/08/2020 19:10 | #
Un appel de syscall c'est une sorte d'appel de fonction privilégiée. Ça a été inventé comme une façon pour un programme de faire une requête au noyau, la seule partie de l'ordinateur autorisée à toucher aux fichiers/matériel/etc. (Chaque fois que tu ouvres un fichier, exécutes une requête réseau, ou affiche quelque chose à l'écran, à un moment le noyau est impliqué pour communiquer avec le matériel.) Cette séparation des pouvoirs est contrôlée par le processeur lui-même, il faut donc appeler à la fonction en utilisant un mécanisme spécifique au processeur pour "entrer" dans le noyau, ce qui débloque toutes les opérations privilégiées. Donc généralement, c'est en assembleur.
Sur la calculatrice, il n'y a pas trop de problèmes de privilèges (les add-ins s'exécutent avec le même niveau de privilège que le noyau), mais durant l'appel il faut spécifier le numéro du syscall d'une façon qu'on ne peut pas faire en C. Donc c'est aussi en assembleur.
La méthode "propre" pour appeler un syscall tu peux la trouver en haut de la liste de SimLo (ici pour fx).
mov.l do_syscall, r2
jmp @r2
nop
do_syscall: .long 0x80010070
Ce code appelle la fonction située à l'adresse 0x80010070 avec le numéro de syscall dans le registre r0 (le registre c'est une variable interne du processeur en quelque sorte). Si tu remplaces syscall_number par une référence à 0x3F4, ça appelle le syscall PowerOff(). (Compte tenu de la façon dont marchent les registres, si tu appelles ce code avec des arguments genre syscall_poweroff(1) ça transmet les arguments au syscall.)
La "bonne" façon d'appeler un syscall est donc d'avoir du code comme ça dans un fichier assembleur. Dans le fx-9860G SDK, il faut créer un fichier .src qui ressemblera à ça.
_PowerOff:
mov.l 0x3F4, r0
mov.l 0x80010070, r2
jmp @r2
nop
.pool
.end
Maintenant il y a des gens qui avaient la flemme et qui se sont dit "oh great on va mettre dans un fichier C pour éviter d'utiliser de l'assembleur". Le résultat fait quelques lignes :
D'abord ce tableau bizarre qui contient en fait à peu près le code assembleur ci-dessus (sous sa forme compilée). On reconnaît le 0x80010070. Contrairement à mon exemple, il y a exactement 5 arguments : les 4 premiers sont envoyés au syscall (si le syscall en prend moins il les ignorera) et le 5ème sert de numéro. Si le syscall prend plus de 4 arguments ça ne marchera pas.
Ça c'est un petit trick C, ça déclare une fonction SysCall dont le code est les octets du tableau SysCallCode. C'est un peu une façon cheatée d'appeler du code déjà compilé.
{
// On donne le numéro du syscall (0x3b) et on transmet les arguments
// (ici il n'y en a pas donc on met des 0, ça n'a aucune importance)
return (*SysCall)(0, 0, 0, 0, 0x3b);
}
Et ça ça appelle SysCall(), le 5ème argument est le numéro du syscall et les 4 autres sont des fillers vu que RTC_GetTicks() n'en prend pas.
Comme tu peux le voir c'est moche et je préfère largement l'alternative. Surtout que quand on code avec GCC et un peu de préprocesseur c'est encore moins long en assembleur.
Citer : Posté le 31/08/2020 19:13 | #
Merci !
Etude en cours...
Ajouté le 31/08/2020 à 19:43 :
(presque) Tout compris !
J'ai testé sur ma calto... Super !!!!!!!! Ca marche !
Merci beaucouuuuuuuuuuuuup Lephé (et Darkie)
Citer : Posté le 31/08/2020 20:07 | #
Wow, réussi du premier coup ? Bien joué !
Citer : Posté le 01/09/2020 13:17 | #
En fait, je me suis aidé du .src de "serial"