Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.

Forum Casio - Autres questions


Index du Forum » Autres questions » Syscall OFF ??
Darkjura Hors ligne Membre Points: 389 Défis: 0 Message

Syscall OFF ??

Posté le 31/08/2020 17:28

Bonjour !
Comme le dit le titre, existe-t-il un syscall qui éteint la calculatrice ?
Merci d'avance


Dark storm Hors ligne Labélisateur Points: 11579 Défis: 176 Message

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)
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Darkjura Hors ligne Membre Points: 389 Défis: 0 Message

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 ?
Lephenixnoir Hors ligne Administrateur Points: 22874 Défis: 149 Message

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).
Darkjura Hors ligne Membre Points: 389 Défis: 0 Message

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...
Lephenixnoir Hors ligne Administrateur Points: 22874 Défis: 149 Message

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   syscall_number, r0
        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.

.export _PowerOff

_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 :

static int SysCallCode[] = { 0xD201422B, 0x60F20000, 0x80010070 };

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.

static int (*SysCall)(int R4, int R5, int R6, int R7, int FNo ) = (void *)&SysCallCode;

Ç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é.

int RTC_getTicks(void)
{
    // 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.
Darkjura Hors ligne Membre Points: 389 Défis: 0 Message

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)
Lephenixnoir Hors ligne Administrateur Points: 22874 Défis: 149 Message

Citer : Posté le 31/08/2020 20:07 | #


Wow, réussi du premier coup ? Bien joué !
Darkjura Hors ligne Membre Points: 389 Défis: 0 Message

Citer : Posté le 01/09/2020 13:17 | #


En fait, je me suis aidé du .src de "serial"

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v42 © créé par Neuronix et Muelsaco 2004 - 2023 | Il y a 38 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