Forums Casio - Projets de programmation

Index du Forum > Projets de programmation > MicroPython sur Graph 35/75+E
Zezombye
Hors ligne
Rédacteur
Points: 1531
Défis: 12
Message
Posté le 09/05/2018 17:27

MicroPython sur Graph 35/75+E :

Page du programme : https://www.planet-casio.com/Fr/programmes/voir_un_programme_casio.php?showid=3603

Todo list :

- Corriger le bug de sauvegarde lors de la sauvegarde d'un fichier vide
- Faire les menus en image
- Module graphique
- Plus de mémoire pour les SH4

Ancien message
Cliquer pour enrouler
Parce que le python est très conseillé pour l'année prochaine, il serait bien de faire un port de MicroPython pour les graph monochromes.

Niveau faisabilité, c'est faisable :
- MicroPython demande 256k d'espace (la limite est de 512k donc on a de la chance) et 16 ko de ram (même pas besoin de taper dans les 256 ko des SH4)
- L'éditeur de texte serait tout simplement une version modifiée d'Edit, avec l'interface adaptée au Python (catalogue intégré, fonctions disponibles avec les F-keys, comme l'appli pour graph 90).

Du coup j'aimerais bien faire le port moi même, mais j'aurai sûrement besoin de votre aide :
- MicroPython ne compile que sous linux (ou en tout cas sûrement pas avec le SDK casio), du coup pour moi ça va être chiant voire impossible de le compiler
- J'ai regardé le port minimal (https://github.com/micropython/micropython/tree/master/ports/minimal) et je comprends que dalle à ce qu'il faudrait modifier sûrement les trucs GPIO, mais quoi d'autre ?

Si vous êtes partant pour ce projet, votre aide est la bienvenue




Zezombye
Hors ligne
Rédacteur
Points: 1531
Défis: 12
Message
Dernier message de la page précédente :Posté le 29/07/2018 22:59 |
En effet, le makefile ajoutait des trucs -o à la fin, j'ai ajouté le -lgcc à la fin de la commande de build :
$(BUILD)/firmware.elf: $(OBJ)
    $(ECHO) "LINK $@"
    $(Q)$(LD) $(LDFLAGS) -o $@ $^ $(LIBS) -lgcc
    $(Q)$(SIZE) $@


J'ai ajouté le setjmp.s de gint, et maintenant ça compile merci lephé !
----------------------------------
Divers jeux : Puissance 4 - Chariot Wars - Sokoban
Ecrivez vos programmes basic sur PC avec BIDE



Pages: Précédente | 1, 2, 3, 4, 5, 6, 7, 8 | Suivante

Lephenixnoir
Hors ligne
Administrateur
Points: 13150
Défis: 136
Message
Citer : Posté le 29/07/2018 23:00 | #
Dommage que tu n'aies pas réalisé que c'est $(LIBS) qui compte et pas -o... d'ailleurs ça compilait déjà, c'est l'édition des liens qui foirait ; mais on te pardonne ce vocabulaire approximatif.
----------------------------------
Rise.
Zezombye
Hors ligne
Rédacteur
Points: 1531
Défis: 12
Message
Citer : Posté le 03/08/2018 00:08 | #
Du coup pour le python je suis bloqué au niveau de l'implémentation des floats, la libfx ne contient pas les fonctions nanf(), copysignf() et nearbyintf() (car c'est du c99).

Pour nanf(), j'ai fait 0.0/0.0 qui retourne normalement un qNaN.
Pour nearbyintf() : j'ai implémenté l'implémentation de la glibc, mais en implémentant les dépendances je suis bloqué sur feholdexcept(), je ne trouve aucun code C pour ça... du coup je peux pas avancer tant que j'ai pas ce code C.
Pour copysignf() : j'ai pas encore implémenté (je fais déjà nearbyintf).

Du coup si quelqu'un a une idée ça m'arrangerait beaucoup (parce que les floats dans python c'est quand même utile )
En attendant, je fais le côté éditeur en forkant Edit.
----------------------------------
Divers jeux : Puissance 4 - Chariot Wars - Sokoban
Ecrivez vos programmes basic sur PC avec BIDE
Lephenixnoir
Hors ligne
Administrateur
Points: 13150
Défis: 136
Message
Citer : Posté le 03/08/2018 07:46 | #
Zezombye a écrit :
Pour nanf(), j'ai fait 0.0/0.0 qui retourne normalement un qNaN.

Dans un FPU ça retourne sNaN. Pour obtenir un qNaN avec le FPU de la calto il faut faire un calcul avec un sNaN. Pourquoi ne renvoies-tu juste pas 0x7f800000 réinterprété en float ?

union { int x; float f; } e;
e.x = 0x7f800000;
return e.f;


Pour nearbyintf() : j'ai implémenté l'implémentation de la glibc, mais en implémentant les dépendances je suis bloqué sur feholdexcept(), je ne trouve aucun code C pour ça... du coup je peux pas avancer tant que j'ai pas ce code C.

As-tu compris ce que feholdexcept() est ?

Pour copysignf() : j'ai pas encore implémenté (je fais déjà nearbyintf).

C'est le plus facile !

Ajouté le 03/08/2018 à 07:47 :
Du coup si quelqu'un a une idée ça m'arrangerait beaucoup (parce que les floats dans python c'est quand même utile )

Les float de Python sont des double en général, je rappelle.
----------------------------------
Rise.
Zezombye
Hors ligne
Rédacteur
Points: 1531
Défis: 12
Message
Citer : Posté le 03/08/2018 13:32 | #
Pourquoi ne renvoies-tu juste pas 0x7f800000 réinterprété en float ?

Parce que sur google j'ai trouvé nulle part de représentation d'un qNaN
Ton code il marche comment, tout ce qui est mis dans x est mis aussi dans f ?

As-tu compris ce que feholdexcept() est ?


Nope, aucune idée de son utilité, je connais juste son prototype. (et de toute façon j'ai pas trop envie d'implémenter la fonction moi même à partir d'une description de ce qu'elle fait, parce que s'il y a un bug je vais galérer à le trouver )

Les float de Python sont des double en général, je rappelle.


Ha ben oui je suis con j'avais défini MICROPY_FLOAT_IMPL_FLOAT au lieu de MICROPY_FLOAT_IMPL_DOUBLE ._.

Bon par contre ça m'arrange pas (et c'est pour ça que j'ai testé le float au lieu du double), j'ai toujours les mêmes fonctions qui manquent :


Ajouté le 03/08/2018 à 14:04 :
D'ailleurs, selon Wikipédia, 0x7F800000 c'est l'infini, pas le qNaN, les qNaN commencent à 0x7FC00000.
Du coup pour le qNaN en double ce serait 0x7FF8000000000000 si j'ai bien compté.
----------------------------------
Divers jeux : Puissance 4 - Chariot Wars - Sokoban
Ecrivez vos programmes basic sur PC avec BIDE
Lephenixnoir
Hors ligne
Administrateur
Points: 13150
Défis: 136
Message
Citer : Posté le 03/08/2018 19:52 | # | Fichier joint
Ton code il marche comment, tout ce qui est mis dans x est mis aussi dans f ?

x et f partagent la même zone mémoire donc modifier x modifie aussi f, mais au niveau des bits.

Ha ben oui je suis con j'avais défini MICROPY_FLOAT_IMPL_FLOAT au lieu de MICROPY_FLOAT_IMPL_DOUBLE ._.

Aaarh >_<

D'ailleurs, selon Wikipédia, 0x7F800000 c'est l'infini, pas le qNaN, les qNaN commencent à 0x7FC00000.
Du coup pour le qNaN en double ce serait 0x7FF8000000000000 si j'ai bien compté.


J'ai pu me tromper sur le passage en hexa toutefois.
----------------------------------
Rise.
Zezombye
Hors ligne
Rédacteur
Points: 1531
Défis: 12
Message
Citer : Posté le 03/08/2018 20:08 | #
Je sais pas où t'as trouvé ça, mais stackoverflow (et wikipédia) disent le contraire :
Wikipédia a écrit :
As with IEEE 754-1985, the biased-exponent field is filled with all 1 bits to indicate either infinity (trailing significand field = 0) or a NaN (trailing significand field ≠ 0).
[...]the standard recommends 0 for signaling NaNs, 1 for quiet NaNs




https://stackoverflow.com/a/21345453 : 0x7FF8000000000000 (soit tous les bits de la mantisse à 1, et le 1er bit du significand à 1) est un qNaN.

(bref, ça résout pas mes problèmes de copysign et nearbyint )
----------------------------------
Divers jeux : Puissance 4 - Chariot Wars - Sokoban
Ecrivez vos programmes basic sur PC avec BIDE
Lephenixnoir
Hors ligne
Administrateur
Points: 13150
Défis: 136
Message
Citer : Posté le 03/08/2018 20:24 | #
Mais c'est épuisant de discuter dans le vide. Teste donc, en l'occurrence tu as raison, le FPU sur SH3 n'est pas standard. Ce n'est pourtant pas compliqué de le démontrer par l'exemple x)

† cat a.c
#define _GNU_SOURCE
#include <stdio.h>
#include <math.h>

int main(void)
{
    union { int x; float f; } u;

    u.f = NAN;
    printf("%#08x\n", u.x);

    u.x = 0x7f800000;
    printf("%lf\n", u.f);

    return 0;
}
† ./a
0x7fc00000
inf
----------------------------------
Rise.
Zezombye
Hors ligne
Rédacteur
Points: 1531
Défis: 12
Message
Citer : Posté le 06/08/2018 15:01 | #
Quand je tape un calcul avec des doubles (même juste taper "1.1") dans l'interpréteur ça fait ça (toujours la même erreur) :


J'ai foutu des getkey bloquants sur les fonctions que j'ai implémentées et ça fait rien du coup ça doit pas être ça, mais d'autres fonctions.

J'ai cherché pour la constante 0x7FF00000 (qui est l'infini) mais je la trouve que dans pow.c, sin.c et log.c.

Là j'ai franchement aucune idée de comment faire
----------------------------------
Divers jeux : Puissance 4 - Chariot Wars - Sokoban
Ecrivez vos programmes basic sur PC avec BIDE
Lephenixnoir
Hors ligne
Administrateur
Points: 13150
Défis: 136
Message
Citer : Posté le 06/08/2018 18:02 | #
Il s'agit d'un déréférencement de pointeur nul, selon toute apparence. Y a-t-il une de tes fonctions qui risque de faire ça ?

La valeur affichée pour PC est inutilisable. En théorie c'est supposé être l'endroit du code où l'erreur a eu lieu. Mais là elle ne ressemble à rien. Je doute que ce soit un infini puisque tu es passé en double nan ?

Comme tu ne peux pas produire de call trace, je t'invite à parcourir dans le code de Python ce qui se passe quand tu évalues une telle constante. [Et si ça marchait quand tu étais en float, alors cherche en particulier, ce qui peut changer quand tu passes au double.]

Ajouté le 06/08/2018 à 18:04 :
Ah oui, je réponds aussi à ta question sur le chat pour savoir si cette implémentation était valide :



Je serais tenté de dire que tu n'as même pas besoin de renvoyer 1 dans les conditions exceptionnelles que tu as notées. J'aurais directement renvoyé 0 tout le temps, sinon Python risque de croire qu'il y a une erreur, alors que la situation que l'on souhaite est plutôt « pas d'erreur, mais les exceptions ne marchent pas ».
----------------------------------
Rise.
Zezombye
Hors ligne
Rédacteur
Points: 1531
Défis: 12
Message
Citer : Posté le 06/08/2018 19:22 | #
Ca m'étonnerait que ce soit mes fonctions : au début de chaque fonction que j'ai implémentée, j'ai foutu un print suivi d'un getkey, et vu que l'erreur a lieu immédiatement c'est pas ces fonctions là.

Le PC correspond à quoi exactement, pourquoi l'adresse ressemble à rien ici ?

Aucune idée de si ça marche quand j'étais en float, vu que j'avais pas réussi à implémenter les fonctions.
----------------------------------
Divers jeux : Puissance 4 - Chariot Wars - Sokoban
Ecrivez vos programmes basic sur PC avec BIDE
Lephenixnoir
Hors ligne
Administrateur
Points: 13150
Défis: 136
Message
Citer : Posté le 06/08/2018 19:59 | #
PC signifie Program Counter, c'est un registre du processeur (qui porte ce nom-là dans 90% des architectures d'ailleurs) qui contient l'adresse de l'instruction en cours d'exécution (grosso modo).

Lorsqu'une exception se produit, PC est sauvegardé dans un coin pour que la procédure qui gère l'exception (ici celle qui affiche System ERROR!!) puisse savoir où le problème a eu lieu. C'est ça la valeur qui est affichée.

Ici elle ne ressemble à rien parce que le code de l'add-in occupe des adresses qui sont toujours entre 00300000 et 00380000 sur Graph 85. La RAM est elle dans une plage d'adresses qui commence à 88000000. L'OS serait entre 80000000 et 80400000 ou entre a0000000 et a0400000. Vue comme addresse, 7ff00000 c'est une bizarrerie située à la fin de la zone P0 et où jamais rien n'a été placé sur la calculatrice.

Ce n'est pas la première fois que je vois des trucs absurdes dans ce champ, il n'est pas impossible que dans certaines situations l'OS affiche autre chose que la valeur de PC, ou alors il y a une maladresse.

Pour ta gouverne, ce qui est écrit après TARGET, quand l'erreur est une TLB ERROR, est l'adresse à laquelle le programme a tenté d'accéder, mais qui n'existe pas (n'est pas mappée). Tu as de la chance, sur SH4 ce bug serait passé inaperçu et tu aurais été encore plus dans la merde...

Je fais une remarque auxiliaire : quand je travaille sur gint, la moitié des bugs sont indétectables à coups de GetKey() et de Print(). Dans des applications complexes (typiquement avec interruptions...) le flot d'exécution est beaucoup plus compliqué qu'il n'y paraît. J'ai eu plusieurs situations où modifier du code qui ne se faisait jamais exécuter créait des crashs à d'autres endroits. Souviens-toi que cette méthode de debuggage est souvent fiable, mais loin d'être parfaite.
----------------------------------
Rise.
Zezombye
Hors ligne
Rédacteur
Points: 1531
Défis: 12
Message
Citer : Posté le 23/08/2018 15:00 | #
J'essaie d'utiliser le syscall GetKeyWait (0x247), mais il bloque totalement : il ne semble pas reconnaître mes appuis de touches, et seul le retour au menu marche.

    int column, row;
    int type_of_waiting = 0;
    int timeout_period = 0;
    unsigned short key;
    int menu = 0;
    locate(1,1); Print("azer");
    ML_display_vram();
    getkey(&column, &row, type_of_waiting, timeout_period, menu, &key);
    //ce code n'est jamais atteint
    locate(1,1); Print("reza");
    ML_display_vram();


Apparemment le syscall GetKeyWait marche (ce qui n'est pas le cas de la fonction du SDK), du coup c'est une erreur de mon côté ou non ?
----------------------------------
Divers jeux : Puissance 4 - Chariot Wars - Sokoban
Ecrivez vos programmes basic sur PC avec BIDE
Lephenixnoir
Hors ligne
Administrateur
Points: 13150
Défis: 136
Message
Citer : Posté le 23/08/2018 15:04 | #
Je n'ai pas le temps de regarder tout de suite (orage en approche), mais il a 5 paramètres donc il est possible que tu sois obligé d'utiliser la procédure assembleur pour l'appeler. Dans mon tuto sur l'utilisation du clavier il y a un appel à GetKeyWait, il me semble, tu peux regarder de ce côté-là :

https://www.planet-casio.com/Fr/forums/topic14175-1-[Tutoriel]_La_gestion_du_clavier_en_C.html
----------------------------------
Rise.
Zezombye
Hors ligne
Rédacteur
Points: 1531
Défis: 12
Message
Citer : Posté le 23/08/2018 15:12 | #
J'ai tenté de remplacer les .export par .global et .data.l par .long, mais il y a toujours des erreurs de syntaxe, il faudrait le convertir au format gcc stp
----------------------------------
Divers jeux : Puissance 4 - Chariot Wars - Sokoban
Ecrivez vos programmes basic sur PC avec BIDE
Dark storm
Hors ligne
Membre d'honneur
Points: 10691
Défis: 174
Message
Citer : Posté le 23/08/2018 15:24 | #
Tu veux pas apprendre la syntaxe plutôt ? Ça te sera bien plus utile par la suite
----------------------------------
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Páranÿe quetë Quendya
Zezombye
Hors ligne
Rédacteur
Points: 1531
Défis: 12
Message
Citer : Posté le 23/08/2018 15:28 | #
Je connais aucun des 2 donc ça va être chaud

(après, si c'est de simples substitutions, autant faire un topic qui les recense)
----------------------------------
Divers jeux : Puissance 4 - Chariot Wars - Sokoban
Ecrivez vos programmes basic sur PC avec BIDE
Lephenixnoir
Hors ligne
Administrateur
Points: 13150
Défis: 136
Message
Citer : Posté le 23/08/2018 16:46 | #
Pour le coup tu n'as qu'à utiliser la procédure d'appel normale avec le numéro de syscall de GetKeyWait(), ça devrait marcher si tu penses à compiler avec -mrenesas.
----------------------------------
Rise.
Zezombye
Hors ligne
Rédacteur
Points: 1531
Défis: 12
Message
Citer : Posté le 23/08/2018 17:23 | #
La procédure d'appel normale, c'est à dire ?
----------------------------------
Divers jeux : Puissance 4 - Chariot Wars - Sokoban
Ecrivez vos programmes basic sur PC avec BIDE
Lephenixnoir
Hors ligne
Administrateur
Points: 13150
Défis: 136
Message
Citer : Posté le 23/08/2018 19:59 | #
Un copier/coller du code assembleur que tu m'as demandé de traduire tout à l'heure en changeant le numéro. Le fait ici est qu'il y a plus de 4 arguments donc la pile intervient, et elle gêne.
----------------------------------
Rise.
Zezombye
Hors ligne
Rédacteur
Points: 1531
Défis: 12
Message
Citer : Posté le 24/08/2018 03:19 | #
Ah, mais justement ça marche pas
----------------------------------
Divers jeux : Puissance 4 - Chariot Wars - Sokoban
Ecrivez vos programmes basic sur PC avec BIDE

Pages: Précédente | 1, 2, 3, 4, 5, 6, 7, 8 | Suivante

Index du Forum > Projets de programmation > MicroPython sur Graph 35/75+E

Planète Casio v42 © créé par Neuronix et Muelsaco 2004 - 2018 | Il y a 25 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire indépendant, géré bénévolement et n'est donc pas affilié à Casio | Toute reproduction de Planète Casio, même partielle, est interdite
Les fichiers, programmes et autres publications présents sur Planète Casio restent la propriété de leurs auteurs respectifs et peuvent être soumis à des licences ou des copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd