Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.
La shoutbox n'est pas chargée par défaut pour des raisons de performances. Cliquez pour charger.

Forum Casio - Autres questions


Index du Forum » Autres questions » Syscalls : System ERROR
Cakeisalie5 En ligne Ancien administrateur Points: 1909 Défis: 11 Message

Syscalls : System ERROR

Posté le 26/12/2015 10:20

Hello,

avant de faire quoi que ce soit niveau jeux, j'essaye de comprendre la base, et c'est pour cela que je m'attaque à la première pierre des add-ins : les bibliothèques. En effet, plutôt que d'utiliser la libfx.a ou d'utiliser la MonochromeLib, j'essaye de faire ma propre version de la MonochromeLib tout en décortiquant son contenu et en adaptant la forme et l'utilisation.

J'ai donc été confronté au monde merveilleux des syscalls.
Au début, puisque je reprenais la MonochromeLib, j'ai repris sa partie syscall (pour la VRAM) et j'ai essayé d'isoler ce que j'ai pu dans une fonction auxiliaire pour en arriver à ce résultat :
caphics.h - cph_syscall.c

Seulement, quand j'essaye de mettre ça sur ma calculatrice (avec un addin qui utilise cette bibliothèque, obviously), cela me fait une belle System ERROR avec :
TARGET=00000015
PC=00000001

J'ai essayé de remettre l'ancienne version du cph_syscall (celle avant que je ne tombe sur ce topic), ça me fait un System ERROR aussi.
Du coup, je suis bloqué et je n'arrive pas à comprendre où je me suis foiré.

Le programme de test, c'est juste ça :
#include <caphics.h>

int        main(void)
{
    cph_setpixel(1, 1, black);
    return (0);
}


Si vous pouvez me dire où je me suis trompé, ou même me donner des pistes/de la doc/n'importe quoi, ce serait super sympa de votre part
('pis cette librairie sera dispo publiquement, sous licence Creative Commons BY-SA, et je tenterai d'y mettre un maximum de choses, ainsi éventuellement qu'un tutoriel pour s'en servir si ça en intéresse certains)

Merci d'avance


Dark storm En ligne Labélisateur Points: 11634 Défis: 176 Message

Citer : Posté le 26/12/2015 11:33 | #


C'est pas dit que refaire une MLib (même adaptée) soit vraiment utile : 99% des addins l'utilisent et elle est pas trop mal optimisée. Enfin, si tu veux quand même faire concurrence, je ne peux pas t'en empêcher.

Concernant ton problème de syscall, c'est bien plus propre de les appeler en assembleur depuis un fichier source (.s sous Gnunux, .src sous Windows). Attention, selon ta plateforme de compilation, les fichiers assembleurs sont différents, le SDK de Casio ne respecte pas du tout les normes.

Du coup pour Gnunux le code donne ça

[b]syscall.h[/b]#ifndef _SYSCALL_H
#define _SYSCALL_H

void getkey_wait(int* c, int* r, int type, int timeout, int menu, unsigned short* keycode);
int key_down(short key);

#endif // _SYSCALL_H

[b]syscall.s[/b]

.global _getkey_wait // Nom du syscall
_getkey_wait:
    mov.l    sc_addr, r2
    mov.l    1f, r0
    jmp    @r2
    nop
1:    .long    0x247 // Numéro du syscall

.global _key_down
_key_down:
    mov.l    sc_addr, r2
    mov.l    1f, r0
    jmp    @r2
    nop
1:    .long    0x24B

sc_addr:    .long 0x80010070


Attention, si tu veux faire une fonction de type "void execute_syscall(int syscall_id, ...)", c'est à dire avec arguments variables, faut faire gaffe parce que l'ordre des arguments est décalé de 1 à cause de syscall_id. Donc c'est un peu plus complexe à mettre en place.

Ajouté le 26/12/2015 à 11:35 :
Ah oui, au passage je te déconseille fortement de faire ça, parce que les syscalls peuvent être dangereux (faut pas exécuter le mauvais quoi x) ), donc on préfère les utiliser de manière constante.
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Cakeisalie5 En ligne Ancien administrateur Points: 1909 Défis: 11 Message

Citer : Posté le 26/12/2015 11:42 | #


Tout d'abord, je ne veux pas faire concurrence, je souhaite surtout me servir d'outils que je comprends, et pour comprendre, refaire en analysant, c'est pas trop mal o/

Et oki, je vais tenter de faire ça en asm alors (c'est chaud, ça fait un moment qu'il faut que j'apprenne à coder en asm, mais je retarde l'inévitable). Le temps d'adapter mon Makefile et d'y include tout ça. Merci o_o

Promotion ordinaire sur les inscriptions sur Planète Casio : en ce moment, c'est gratuit !

Mon blogBesoin d'utilitaires de transfert vers et depuis la calculatrice sous GNU/Linux ?
Dark storm En ligne Labélisateur Points: 11634 Défis: 176 Message

Citer : Posté le 26/12/2015 11:45 | #


Disons que les Casio sont pas non plus hyper rapide, et que du coup pour certains projets l'ASM s'avère indispensable. Surtout au niveau des fonctions graphiques, puisque c'est elles qui prennent le plus de temps à s'exécuter.
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
-florian66- Hors ligne Ancien rédacteur Points: 2383 Défis: 20 Message

Citer : Posté le 26/12/2015 11:58 | #


code
Cliquer pour enrouler
[b]syscall.s[/b]

.global _getkey_wait // Nom du syscall
_getkey_wait:
    mov.l    sc_addr, r2
    mov.l    1f, r0
    jmp    @r2
    nop
1:    .long    0x247 // Numéro du syscall

.global _key_down
_key_down:
    mov.l    sc_addr, r2
    mov.l    1f, r0
    jmp    @r2
    nop
1:    .long    0x24B

sc_addr:    .long 0x80010070


Quand je vois :
...
mov.l    [blue]1[/blue]f, r0
...
[blue]1[/blue]:     .long 0x247 // Numéro du syscall

puis pour la deuxième syscall :
...
mov.l    [green]1[/green]f, r0
...
[green]1[/green]:    .long    0x24B

on peut laisser le 1 avec 1f, il n'y aura pas de problèmes ?
In Arch, I trust ! And you ?
Dark storm En ligne Labélisateur Points: 11634 Défis: 176 Message

Citer : Posté le 26/12/2015 12:06 | #


Ben le f permet de dire que c'est bien un long. Donc sans je doute que ça fonctionne.
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
-florian66- Hors ligne Ancien rédacteur Points: 2383 Défis: 20 Message

Citer : Posté le 26/12/2015 12:07 | #


Ce que je veut dire c'est le chiffre devant le f avec le numéro du long ...
In Arch, I trust ! And you ?
Dark storm En ligne Labélisateur Points: 11634 Défis: 176 Message

Citer : Posté le 26/12/2015 12:08 | #


Ah, oui
Enfin, chez moi ça fonctionne. Mais c'est sur que c'est mieux de mettre des noms différents.

C'est surtout parce que j'ai la flemme de tout changer lors des copier/coller
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
-florian66- Hors ligne Ancien rédacteur Points: 2383 Défis: 20 Message

Citer : Posté le 26/12/2015 12:10 | #


Ok je demandais car j'avais vu sur EasyInput que tu mettais plusieurs numéros
In Arch, I trust ! And you ?
Cakeisalie5 En ligne Ancien administrateur Points: 1909 Défis: 11 Message

Citer : Posté le 26/12/2015 12:17 | #


Du coup, comme ça, ça devrait être bon ? o_o (j'essaye simplement de récupérer l'adresse de la VRAM pour le moment, le reste viendra quand j'aurai déjà bien fait ce début)

caphics.h - cph_getvramaddress

(comme je sais pas trop comment le compiler, j'ai également utilisé gcc, mon Makefile me donne ça :
sh3eb-elf-gcc -c -o obj/cph_getvramaddress.o src/cph_getvramaddress.s
sh3eb-elf-gcc -Wall -Wextra -Werror -c -o obj/cph_setpixel.o -I includes src/cph_setpixel.c
...

je pense que ça marche o_o)

Mais du coup, ça me fait le même plantage que pour la version en C de tout à l'heure... o_o

Ajouté le 26/12/2015 à 12:35 :
Okay, donc non. Le programme ne ragequit plus, et tout marche parfaitement. Je sais pas encore exactement pourquoi (notamment pour le display qu'il me reste à comprendre), mais ça viendra. C'est beau. Merci beaucoup

Promotion ordinaire sur les inscriptions sur Planète Casio : en ce moment, c'est gratuit !

Mon blogBesoin d'utilitaires de transfert vers et depuis la calculatrice sous GNU/Linux ?
Lephenixnoir En ligne Administrateur Points: 24223 Défis: 170 Message

Citer : Posté le 26/12/2015 15:21 | #


-florian66- a écrit :
on peut laisser le 1 avec 1f, il n'y aura pas de problèmes ?

Dark storm a écrit :
Ben le f permet de dire que c'est bien un long. Donc sans je doute que ça fonctionne.

Non, le f veut dire forward ! C'est une fonctionnalité de gcc qui permet de définir des « labels locaux », et en l'occurrence 1f pointe sur le prochain symbole 1, alors que 1b pointe sur le précédent.
Rien à voir avec les long.

Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Dark storm En ligne Labélisateur Points: 11634 Défis: 176 Message

Citer : Posté le 26/12/2015 18:08 | #


Ah, au temps pour moi
Finir est souvent bien plus difficile que commencer. — Jack Beauregard

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 v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 65 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