Forums Casio - Projets de programmation

Index du Forum > Projets de programmation > MicroPython sur Graph 35/75+E
Zezombye
En ligne
Rédacteur
Points: 1416
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
- Faire la map custom de getkey
- Implémenter les floats en python

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
En ligne
Rédacteur
Points: 1416
Défis: 12
Message
Dernier message de la page précédente :Posté le 31/08/2018 11:06 |
Il utilise la méthode C :

static int SysCallCode[] = {0xD201422B,0x60F20000,0x80010070};
static int (*SysCall)( int R4, int R5, int R6, int R7, int FNo ) = (void*)&SysCallCode;
char* ML_vram_adress()
{
    return (char*)((*SysCall)(0, 0, 0, 0, 309));
}


Je devrais la remplacer par la méthode assembleur ?
----------------------------------
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

Lephenixnoir
En ligne
Administrateur
Points: 12413
Défis: 136
Message
Citer : Posté le 31/08/2018 11:10 | #
Pour autant que je me souvienne (ça fait un moment), il y avait deux méthodes C.

L'archive de Dark Storm dans le tuto de compatibilité SH4 du SDK propose cette version :

//Thanks to Simon Lothar for this function
typedef char*(*sc_cpv)(void);
const unsigned int sc0135[] = { 0xD201D002, 0x422B0009, 0x80010070, 0x0135 };
#define ML_vram_adress (*(sc_cpv)sc0135)

Tu peux la tester ; ou alors tu peux te blinder en utilisant la version assembleur.

Mais bon, je ne suis pas sûr que le bug vienne de là, ML_vram_adress() a toujours marché sur les machines SH4 dans les add-ins que j'ai écrits personnellement... x)
----------------------------------
Rise.
Zezombye
En ligne
Rédacteur
Points: 1416
Défis: 12
Message
Citer : Posté le 31/08/2018 11:17 | #
Ben, ça vient incontestablement de là : au début de mon addin j'ai mis un getkey suivi d'un ML_vram_adress() puis d'un autre getkey, si je vire le ML_vram_adress ou si je retourne au menu avant l'appel ça crashe pas, sinon ça crashe

Le code de DS ne compile pas (et je comprends rien aux pointeurs de fonctions ) :
MonochromeLib.h:95:34: error: expected ')' before 'sc0135'
#define ML_vram_adress (*(sc_cpv)sc0135)

----------------------------------
Divers jeux : Puissance 4 - Chariot Wars - Sokoban
Ecrivez vos programmes basic sur PC avec BIDE
Lephenixnoir
En ligne
Administrateur
Points: 12413
Défis: 136
Message
Citer : Posté le 31/08/2018 11:21 | #
Essaie ça, sinon passe à l'assembleur. Pas de casse-têtes inutiles.

typedef char * (*sc_cpv)(void);
const unsigned int sc0135[] = { 0xD201D002, 0x422B0009, 0x80010070, 0x0135 };
#define ML_vram_adress() (*((sc_cpv)&sc0135))()
----------------------------------
Rise.
Zezombye
En ligne
Rédacteur
Points: 1416
Défis: 12
Message
Citer : Posté le 31/08/2018 11:22 | #
Toujours pas :
MonochromeLib.h:95:37: error: expected ')' before '&' token
#define ML_vram_adress() (*((sc_cpv)&sc0135))()


Je vais essayer l'assembleur du coup.

Ajouté le 31/08/2018 à 11:44 :
Comment je fais pour que la procédure assembleur soit plus concise (enlever le truc putkey_code et mettre le numéro du syscall à la place) ?

_putKey:
    mov.l    syscall_table, r2
    mov.l    _putKey_code, r0
    jmp      @r2
    nop
_putKey_code:
    .long    0x910
----------------------------------
Divers jeux : Puissance 4 - Chariot Wars - Sokoban
Ecrivez vos programmes basic sur PC avec BIDE
Lephenixnoir
En ligne
Administrateur
Points: 12413
Défis: 136
Message
Citer : Posté le 31/08/2018 11:54 | #
Je ne sais pas trop pourquoi tu veux faire ça, mais... tu ne peux pas. Pour charger une valeur dans un registre, tu as deux choix :

1. mov #42, r0

La valeur à charger est écrite direct dans l'instruction. Mais comme les instructions font 2 octets, il n'y a la place que pour 1 octet de données. Conclusion : ce n'est possible que pour les valeurs entre -128 et 127.

Note qu'il n'y a pas de .b, .w ou .l : les 8 bits de données sont toujours étendus sur 32 bits (extension de signe) et toute la valeur du registre est écrasée.

2. mov.l @(12, pc), r0 et plus loin .long 0x42424242

Ici la valeur n'est pas écrite dans l'instruction mais elle est plus loin dans le programme, et l'instruction dit où : à 12 octets de PC (soit 12 octets plus loin que le mov.l, en gros). Ce mode est obligatoire pour toutes les valeurs qui ne tiennent pas sur 8 bits en signé, y compris 0x910.

Note qu'il y a ici un .b, .w ou .l pour indiquer combien d'octets sont à charger. Les autres octets de r0 ne sont pas changés ; par exemple dans un mov.b, seul l'octet de poids faible est modifié. Il faut souvent utiliser extu.b ou exts.b juste après.

On notera que c'est super chiant de calculer la distance entre le mov et l'endroit où est stockée la donnée, c'est pour ça que les gens ont inventés les labels. mov.l label, r0 suivi de label: .long 0x42424242 est un mécanisme fourni par le programme d'assemblage pour calculer automatiquement les distances. Ouf !

Pour conclure : tu n'as pas le choix, tu dois utiliser un mov différé.

En essayant d'écrire mov.l 0x910, r0, tu as reçu l'erreur pcrel too far. Comme tu n'as pas mis de # pour indiquer que 0x910 était la valeur que tu voulais charger (auquel cas il t'aurais dit que ça ne rentrait pas), il a interprété 0x910 comme l'adresse absolue de la valeur à charger. Il a ensuite calculé la distance avec PC, mais elle est énorme (PC vaut autour de 0x300000) donc elle ne tenait pas non plus dans le champ réservé de l'instruction mov.l (12 bits). D'où l'erreur "PC-relative address is too far (from PC)".
----------------------------------
Rise.
Zezombye
En ligne
Rédacteur
Points: 1416
Défis: 12
Message
Citer : Posté le 31/08/2018 12:06 | #
C'est surtout pour que je change 2 trucs au lieu de 4 quand je veux mettre un nouveau syscall (pas renommer le nomsyscall_code)
----------------------------------
Divers jeux : Puissance 4 - Chariot Wars - Sokoban
Ecrivez vos programmes basic sur PC avec BIDE
Lephenixnoir
En ligne
Administrateur
Points: 12413
Défis: 136
Message
Citer : Posté le 31/08/2018 12:13 | #
Dans ce cas, sous GCC, tu peux nomme le label 1 (n'importe quel chiffre de 1 à 9 ferait l'affaire) et ensuite tu t'y réfères sous le nom 1f (1 forward).

Ces labels existent pour permettre à l'utilisateur d'avoir des labels temporaires aux noms pas uniques. Dans ce cas, 3f représente le prochain 3 vers le bas et 7b le dernier 7 vers le haut.

Ajouté le 31/08/2018 à 12:14 :
Ça c'est si tes syscalls sont tous dans le même fichier, s'ils sont dans des fichiers différents ça n'a pas la moindre espèce d'importance, tu peux tous les appeler code si ça te chante...
----------------------------------
Rise.
Casio_maker
Hors ligne
Membre
Points: 2
Défis: 0
Message
Citer : Posté le 03/09/2018 13:27 | #
bonjour,

je ne sais pas si ce problème a déjà été rapporté mais sur ma 35+E tweakée, dans le shell, le retour en arrière (la touche DEL) ne supprime pas le dernier caractère mais rajoute un []. Après plusieurs test, j'ai réalisé qu'il mettait autant de [] que de caractères supprimables, et que si l'on retape un calcul derriere, ce dernier est bien interpreté, ce qui signifie que tout fonctionne et que ce n'est qu'un probleme d'affichage... Cordialement.

PS: j'ai un autre probleme: je ne sais pas comment faire une virgule ...la touche de la virgule au dessus de DEL a le meme effet que DEL...
----------------------------------
"Un problème créé ne peut être résolu en réfléchissant de la même manière qu'il a été créé." Albert Einstein
Zezombye
En ligne
Rédacteur
Points: 1416
Défis: 12
Message
Citer : Posté le 03/09/2018 13:30 | #
Pour le DEL qui ne marche pas (visuellement) dans le shell, c'est normal : le shell est une implémentation très basique, pas de scrollage ni même d'historique (pour ça que le backspace marche pas). On affiche à l'écran, on shifte la vram vers le haut pour scroller

Le problème de la virgule, je viens de le résoudre : je sais pas pourquoi mais j'avais assigné la virgule au retour arrière au lieu du caractère ',' x)

Merci de tes tests sinon
----------------------------------
Divers jeux : Puissance 4 - Chariot Wars - Sokoban
Ecrivez vos programmes basic sur PC avec BIDE
Nemhardy
Hors ligne
Grand maître des Traits d'Esprit
Points: 1222
Défis: 54
Message
Citer : Posté le 03/09/2018 15:44 | #
Je réfléchissais au problème concernant le peu de mémoire disponible que tu avais évoqué (je ne sais plus trop où, une RDP peut-être…), et je suis quand même curieux quant à la manière dont le GC arrive à déterminer les ressources qu'on lui octroie.

Ça vaudrait peut-être le coup aussi de se concentrer sur les machines SH4 (qui deviennent je pense sérieusement la norme, en particulier pour les générations qui auront à faire du Python en lycée) pour utiliser la mémoire supplémentaire qu'on peut y trouver.
----------------------------------
Ils n'osent pas s'avouer que c'est à cause de rien du tout…
Lephenixnoir
En ligne
Administrateur
Points: 12413
Défis: 136
Message
Citer : Posté le 03/09/2018 15:46 | #
Je rappelle que la zone en question est 0x88040000:256k.
----------------------------------
Rise.
Shadow15510
Hors ligne
Rédacteur
Points: 1628
Défis: 15
Message
Citer : Posté le 04/09/2018 08:45 | #
Ma prof de maths nous a dit de se mettre au Python et j'aimerais savoir si le tiens est ok pour des programmes simples ? Parceque acheter une NumWorks à 80€, bof...
----------------------------------
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Moral
   80%
Zezombye
En ligne
Rédacteur
Points: 1416
Défis: 12
Message
Citer : Posté le 04/09/2018 11:23 | #
Evidemment (sinon il servirait un peu à rien )

Par contre, il n'est pas disponible en mode examen.
----------------------------------
Divers jeux : Puissance 4 - Chariot Wars - Sokoban
Ecrivez vos programmes basic sur PC avec BIDE
Critor
En ligne
Partenaire
Points: 829
Défis: 0
Message
Citer : Posté le 04/09/2018 12:32 | #
@Shadow15510
Pour du Python en mode examen, pas d'autre choix à ce jour que d'aller dans le milieu ou haut de gamme :
- Casio Graph 90+E, facilement trouvable actuellement dans les 65-100€
- NumWorks à 80€
- HP Prime, facilement trouvable actuellement dans les 115-195€

J'ai publié un classement hier soir avec toutes les informations, conseils et astuces :
https://tiplanet.org/forum/viewtopic.php?p=234890#p234890

Personnellement, si déjà tu serais partant pour la Graph 35+E, je te conseillerais la Graph 90+E. Il y a d'excellents prix en ligne actuellement, ça ne coûtera donc pas bien davantage pour un modèle nettement supérieur et parfois même moins cher que la NumWorks !
https://tiplanet.org/forum/viewtopic.php?f=23&t=21629
Shadow15510
Hors ligne
Rédacteur
Points: 1628
Défis: 15
Message
Citer : Posté le 04/09/2018 12:50 | #
Ok merci beaucoup
----------------------------------
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Moral
   80%
Critor
En ligne
Partenaire
Points: 829
Défis: 0
Message
Citer : Posté le 08/09/2018 19:26 | #
Je viens de mettre en avant le projet, et la problématique du mode examen qui va avec :
https://tiplanet.org/forum/viewtopic.php?f=51&t=21825&p=235086#p235086
Zezombye
En ligne
Rédacteur
Points: 1416
Défis: 12
Message
Citer : Posté le 09/09/2018 09:19 | #
Merci critor

(bon ça fait que faut que je bosse plus pour corriger les bugs )
----------------------------------
Divers jeux : Puissance 4 - Chariot Wars - Sokoban
Ecrivez vos programmes basic sur PC avec BIDE
Lolo22
Hors ligne
Membre
Points: 7
Défis: 0
Message
Citer : Posté le 16/09/2018 10:52 | #
Bonjour Zezombye,
Félicitations pour ton travail! Je trouve que l'interface est bluffante.
Mais quand penses-tu que les float seront disponibles?
Bon courage et au plaisir de te lire,
Lolo

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

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 81 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