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 - Projets de programmation


Index du Forum » Projets de programmation » MicroPython sur Graph 35/75+E
Zezombye Hors ligne Rédacteur Points: 1756 Défis: 13 Message

MicroPython sur Graph 35/75+E

Posté le 09/05/2018 17:27

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



Précédente 1, 2, 3, 4, 5, 6, 7, 8, 9 Suivante
Zezombye Hors ligne Rédacteur Points: 1756 Défis: 13 Message

Citer : 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
Lephenixnoir En ligne Administrateur Points: 24145 Défis: 170 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)
Mon graphe (24 Mars): (gint#27 ; (Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; ...) || (shoutbox v5 ; v5)
Zezombye Hors ligne Rédacteur Points: 1756 Défis: 13 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: 24145 Défis: 170 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))()

Mon graphe (24 Mars): (gint#27 ; (Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; ...) || (shoutbox v5 ; v5)
Zezombye Hors ligne Rédacteur Points: 1756 Défis: 13 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: 24145 Défis: 170 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)".
Mon graphe (24 Mars): (gint#27 ; (Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; ...) || (shoutbox v5 ; v5)
Zezombye Hors ligne Rédacteur Points: 1756 Défis: 13 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: 24145 Défis: 170 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...
Mon graphe (24 Mars): (gint#27 ; (Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; ...) || (shoutbox v5 ; v5)
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 Hors ligne Rédacteur Points: 1756 Défis: 13 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: 1242 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.
Lephenixnoir En ligne Administrateur Points: 24145 Défis: 170 Message

Citer : Posté le 03/09/2018 15:46 | #


Je rappelle que la zone en question est 0x88040000:256k.
Mon graphe (24 Mars): (gint#27 ; (Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; ...) || (shoutbox v5 ; v5)
Shadow15510 Hors ligne Administrateur Points: 5498 Défis: 18 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

Zezombye Hors ligne Rédacteur Points: 1756 Défis: 13 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 Administrateur Points: 2571 Défis: 18 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 Administrateur Points: 5498 Défis: 18 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

Critor En ligne Administrateur Points: 2571 Défis: 18 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 Hors ligne Rédacteur Points: 1756 Défis: 13 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: 20 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
Zezombye Hors ligne Rédacteur Points: 1756 Défis: 13 Message

Citer : Posté le 13/11/2018 07:28 | #


J'en étais sûr que c'était une limite hardcodée è_é

static char heap[2048];


On change ça en 4096, et hop on a 4032 octets de dispo

Une petite recherche binaire et la limite semble être dans les 5000 octets, du coup j'ai laissé 5000 pour l'instant.

Par contre, c'est dans la ram statique ça non ? Du coup j'ai tenté de faire :

char* heap = malloc(5000);


mais ça me fait une erreur chelou :
main.c:40:20: error: initializer element is not constant
const char* heap = malloc(5000);
                    ^~~~~~

Divers jeux : Puissance 4 - Chariot Wars - Sokoban
Ecrivez vos programmes basic sur PC avec BIDE
Lephenixnoir En ligne Administrateur Points: 24145 Défis: 170 Message

Citer : Posté le 13/11/2018 10:38 | #


Zezombye a écrit :
Par contre, c'est dans la ram statique ça non ? Du coup j'ai tenté de faire :

char* heap = malloc(5000);


mais ça me fait une erreur chelou :

Tu as tout à fait raison, et la RAM statique fait 8 ko, donc c'est pas terrible. Pour ton problème, il te suffit d'écrire const char *heap; au début du fichier et ensuite heap = malloc(20000) tout au début de main(). S'il y a des constructeurs, fais-en un constructeur de plus haute priorité.
Mon graphe (24 Mars): (gint#27 ; (Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; ...) || (shoutbox v5 ; v5)
Précédente 1, 2, 3, 4, 5, 6, 7, 8, 9 Suivante

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