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

Forum Casio - Projets de programmation


Index du Forum » Projets de programmation » gint : un noyau pour développer des add-ins
Lephenixnoir Hors ligne Administrateur Points: 22118 Défis: 149 Message

gint : un noyau pour développer des add-ins

Posté le 20/02/2015 17:30

Ce topic fait partie de la série de topics du fxSDK.

En plus des options de programmation intégrée comme le Basic Casio ou Python, la plupart des calculatrices Casio supportent des add-ins, des programmes natifs très polyvalents avec d'excellentes performances. Les add-ins sont généralement programmés en C/C++ avec l'aide d'un ensemble d'outils appelé SDK.

Plusieurs SDK ont été utilisés par la communauté avec le temps. D'abord le fx-9860G SDK de Casio avec fxlib pour Graph monochromes (plus maintenu depuis longtemps). Puis le PrizmSDK avec libfxcg pour Prizm et Graph 90+E (encore un peu actif sur Cemetech). Et plus récemment celui que je maintiens, le fxSDK, dont gint est le composant principal.

gint est un unikernel, ce qui veut dire qu'il embarque essentiellement un OS indépendant dans les add-ins au lieu d'utiliser les fonctions de l'OS de Casio. Ça lui permet beaucoup de finesse sur le contrôle du matériel, notamment la mémoire, le clavier, l'écran et les horloges ; mais aussi de meilleures performances sur le dessin, les drivers et la gestion des interruptions, plus des choses entièrement nouvelles comme le moteur de gris sur Graph monochromes.

Les sources de gint sont sur la forge de Planète Casio : dépôt Gitea Lephenixnoir/gint

Aperçu des fonctionnalités

Les fonctionnalités phares de gint (avec le fxSDK) incluent :

  • Toutes vos images et polices converties automatiquement depuis le PNG, sans code à copier (via fxconv)
  • Un contrôle détaillé du clavier, avec un GetKey() personnalisable et un système d'événements à la SDL
  • Une bibliothèque standard C plus fournie que celle de Casio (voir fxlibc), même un peu de C++ (voir µSTL)
  • Plein de raccourcis pratiques, comme pour afficher la valeur d'une variable : dprint(1,1,"x=%d",x)
  • Des fonctions de dessin, d'images et de texte optimisées à la main et super rapides, surtout sur Graph 90+E
  • Des timers très précis (60 ns / 30 µs selon les cas, au lieu des 25 ms de l'OS), indispensables pour les jeux
  • Captures d'écran et capture vidéo des add-ins par USB, en temps réel (via fxlink)

Avec quelques mentions spéciales sur les Graph monochromes :
Un moteur de gris pour faire des jeux en 4 couleurs !
La compatibilité SH3, SH4 et Graph 35+E II, avec un seul fichier g1a
Une API Unix/POSIX et standard C pour accéder au système de fichiers (Graph 35+E II seulement)

Et quelques mentions spéciales sur les Graph 90+E :
Une nouvelle police de texte, plus lisible et économe en espace
Le dessin en plein écran, sans les bordures blanches et la barre de statut !
Un driver écran capable de triple-buffering
Une API Unix/POSIX et standard C pour accéder au système de fichiers

Galerie d'add-ins et de photos

Voici quelques photos et add-ins réalisés avec gint au cours des années !



Arena (2016)Plague (2021)



Rogue Life (2021)



Momento (2021)



Communication avec le PC (cliquez pour agrandir)


Utiliser gint pour développer des add-ins

Les instructions pour installer et utiliser gint sont données dans les divers tutoriels recensés dans le topic du fxSDK. Il y a différentes méthodes de la plus automatique (GiteaPC) à la plus manuelle (compilation/installation de chaque dépôt). Le fxSDK est compatible avec Linux, Mac OS, et marche aussi sous Windows avec l'aide de WSL, donc normalement tout le monde est couvert

Notez en particulier qu'il y a des tutoriels de développement qui couvrent les bases ; tout le reste est expliqué dans les en-têtes (fichiers .h) de la bibliothèque que vous pouvez consulter en ligne, ou dans les ajouts aux changelogs ci-dessous.

Changelog et informations techniques

Pour tester les fonctionnalités et la compatibilité de gint, j'utilise un add-in de test appelé gintctl (dépôt Gitea Lephenixnoir/gintctl). Il contient aussi une poignée d'utilitaires d'ordre général.

Ci-dessous se trouve la liste des posts indiquant les nouvelles versions de gint, et des liens vers des instructions/tutoriels supplémentaires qui accompagnent ces versions.

VersionDateInfos supplémentaires
gint 2.8.017 Mai 2022Effets dynamiques sur les imagesAPI de manipulations d'images
Overclock intégré
gint 2.7.119 Mars 2022Tutoriel capture des flux standards
gint 2.7.031 Décembre 2021
gint 2.6.029 Août 2021Tutoriel de capture vidéo par USB
gint 2.5.28 Juin 2021
gint 2.5.12 Juin 2021
gint 2.5.026 Mai 2021Intégration de fxlibc (dépôt) — Tutoriel de communication par USB
gint 2.4.027 Avril 2021Api GINT_CALL() pour les callbacks
gint 2.3.12 Février 2021
gint 2.3.029 Janvier 2021
gint 2.2.112 Janvier 2021
gint 2.2.011 Janvier 2021
gint 2.1.116 Septembre 2020
gint 2.1.021 Août 2020Polices UnicodeNouvelle API du moteur de gris
gint 2.0.3-beta10 Juillet 2020Modifications de l'API timer
gint 2.0.2-beta17 Juin 2020
gint 2.0.1-beta1er Juin 2020

Anecdotes et bugs pétés

Ô amateurs de bas niveau, j'espère que vous ne tomberez pas dans les mêmes pièges que moi.


TODO list pour les prochaines versions (2022-05-15)

gint 2.9
  1. Changements de contextes CPU. À reprendre du prototype de threading de Yatis pour permettre l'implémentation d'un véritable ordonnanceur. Demandé par si pour faire du threading Java. Je vais peut-être coder des effets algébriques pour m'amuser un peu.
  2. Fignoler le driver USB. Ajouter la communication PC→calto, des pipes interruption/isochrones. Ajouter le support de descripteurs de fichiers USB. Potentiellement pousser jusqu'à avoir GDB pour debugger.

Non classé

  • Support de scanf() dans la fxlibc.
  • Regarder du côté serial (plus facile que l'USB) pour la communication inter-calculatrices (multijoueur) et ultimement l'audio (libsnd de TSWilliamson).
  • Un système pour recompiler des add-ins mono sur la Graph 90+E avec une adaptation automatique.
  • Support des fichiers en RAM pour pouvoir utiliser l'API haut-niveau sur tous les modèles et éviter la lenteur de BFile à l'écriture quand on a assez de RAM.



Précédente 1, 2, 3 ··· 5, 6, 7, 8, 9, 10, 11 ··· 20 ··· 30 ··· 40 ··· 50 ··· 60 ··· 64, 65, 66 Suivante
Suruq game Hors ligne Membre de CreativeCalc Points: 621 Défis: 20 Message

Citer : Posté le 01/03/2018 14:16 | #


j'ai trouvé des paramètre sympa en niveaux de gris

light : 2243
dark :3612



ps : on ne commente pas le faite que mon écran soit dégueulasse
There is only one thing that makes a dream impossible to achieve : the fear of failure
Lephenixnoir Hors ligne Administrateur Points: 22118 Défis: 149 Message

Citer : Posté le 01/03/2018 16:51 | #


Super, merci ! Je les ai ajoutées au code de la démo. Je suis en train de tout rechanger donc je vais pas pouvoir recompiler et release très vite, mais ce sera dans le prochain exécutable



cpio Invité

Citer : Posté le 03/03/2018 15:32 | #


Bonjour,

Existe-il une liste des calculatrices Casio pour lesquelles on peut développer des add-ins avec Gint ?

Merci d'avance.
Lephenixnoir Hors ligne Administrateur Points: 22118 Défis: 149 Message

Citer : Posté le 03/03/2018 15:42 | #


Dans les modèles français, ce sont les Graph 75 et supérieures. Note que les Graph 35+ USB peuvent être transformées en Graph 75, donc elles comptent aussi.

En reprenant une liste de modèles de Cakeisalie5, je pense que les modèles exacts supportés sont les suivants :

- fx-9750GII (Graph 35+USB SH3);
- fx-9750GII-2 (Graph 35+USB SH4);
- Graph 35+E (french model);
- fx-9860G (Graph 85);
- fx-9860G SD (Graph 85 SD);
- fx-9860GII (Graph 75 SH3);
- fx-9860GII-2 (Graph 75 SH4);
- fx-9860GII SD (Graph 95 SH3);
- fx-9860GII-2 SD (Graph 95 SH4);
- Graph 75+E (french model).
Cpio Hors ligne Membre Points: 31 Défis: 0 Message

Citer : Posté le 04/03/2018 16:58 | #


Merci pour la liste.

Y a-t-il un équivalent de Gint pour la Graph 90+ E, ou à défaut une toolchain qui permette de coder en C ?
Suruq game Hors ligne Membre de CreativeCalc Points: 621 Défis: 20 Message

Citer : Posté le 04/03/2018 17:01 | #


Gint n'est pas encore dispo pour g90+E mais est en cours de développement.
en attendant tu as le PrizmSDK qui est très simple d'utilisation mais il n'existe pas de librairie officiel ou équivalent de gint pour Prizm et G90+E en général
There is only one thing that makes a dream impossible to achieve : the fear of failure
Lephenixnoir Hors ligne Administrateur Points: 22118 Défis: 149 Message

Citer : Posté le 04/03/2018 17:05 | #


Le portage sur Graph 90+ est mon prochain objectif ! Je suis actuellement (et même là, tout de suite) en train de restructurer le code pour faciliter ce portage. Si je suis chanceux il n'y a que l'écran qui change, le clavier aussi mais il est bien documenté. (Encore que le driver clavier de gint est une horreur...)

Ce topic est pas mis à jour souvent mais je m'efforce d'y mentionner tous les changements remarquables. J'y posterai sans aucun doute des messages quand je testerai le driver de l'écran de la Graph 90 !
Cpio Hors ligne Membre Points: 31 Défis: 0 Message

Citer : Posté le 04/03/2018 17:08 | #


Bonnes nouvelles :-)

Vous avez besoin d'aide pour le portage ?
Lephenixnoir Hors ligne Administrateur Points: 22118 Défis: 149 Message

Citer : Posté le 04/03/2018 17:12 | #


Surtout de temps, disons. Restructurer le code est quelque chose qui n'est pas bien difficile, et vu la vitesse à laquelle je peux le faire comparé à un contributeur externe, c'est peut-être plus rentable si je m'y colle tranquillement.

N'hésite pas à te présenter sur le topic approprié et à tutoyer tout le monde, du reste.

(Edit : Ou alors, je précise que je suis tout seul à développer ce machin. C'est selon.)
Cpio Hors ligne Membre Points: 31 Défis: 0 Message

Citer : Posté le 04/03/2018 17:19 | #


J'avais bien compris que ce projet était ton bébé

Je vais donc attendre impatiemment de pouvoir tester la version de Gint pour Graph 90+ E.

Bon courage et merci d'avance !
Nemhardy Hors ligne Grand maître des Traits d'Esprit Points: 1241 Défis: 54 Message

Citer : Posté le 04/03/2018 17:21 | #


Cependant, pour compléter ce que dit Suruq Game, il n'y a certes pas encore d'équivalent de Gint pour les Prizm/G90, mais il est déjà possible de faire tout plein de choses dessus !
À titre d'exemple on a déjà un émulateur de GameBoy qui marche, un moteur de calcul formel qui marche à peu près, des jeux qu'on peut porter sans trop de douleur, etc… Donc tu peux déjà commencer à t'amuser avec si l'envie t'en prend !
Cpio Hors ligne Membre Points: 31 Défis: 0 Message

Citer : Posté le 04/03/2018 17:24 | #


Merci pour ces pointeurs Nemhardy, je vais regarder tout ça.
Yatis Hors ligne Membre Points: 570 Défis: 0 Message

Citer : Posté le 06/03/2018 21:18 | #


J'ai trouver encore quelques bugs, comme le fait que dans certain menu la touche [menu] ne fonctionne pas et qu'il est impossible d'utiliser Screen Receiver sur sur gint (bêta 0.9 - 584) (D’ailleurs tout les add-in utilisant une fonction d'affichage différente que Bdisp_PutDisp_DD() ne sont pas compatible)
Lephenixnoir Hors ligne Administrateur Points: 22118 Défis: 149 Message

Citer : Posté le 06/03/2018 21:22 | #


Ce ne sont pas nécessairement des bugs.
- Certains menus n'utilisent pas getkey(), dans ce cas c'est normal que ça ne revienne pas au menu. Dans gint, revenir au menu est un truc compliqué qu'il faut demander à peu près explicitement.
- Screen Receiver ne marchera pas par magie ; actuellement je n'ai rien implémenté pour le supporter donc ça ne se fera pas tout seul !
- Tous les add-ins utilisant Bdisp_PutDisp_DD() ne sont pas compatibles avec le système de dessin de gint, plutôt.

Je note, toutefois, et je m'occuperai en particulier du premier point qui nécessite effectivement que je relise le code de l'application de démo.

Ajouté le 17/04/2018 à 13:26 :
Grandes nouvelles !

J'ai commencé à travailler sur la Graph 90 pour porter gint en sachant que ce sera bientôt le seul modèle à supporter nativement les add-ins. Je n'en suis qu'au début, mais j'ai déjà plusieurs résultats positifs :

- Le modèle mémoire est bien connu et peu différent de la Prizm
- J'arrive à changer la VBR et à manipuler les interruptions comme sur les Graph monochromes SH4
- Je peux probablement choper la compatibilité Prizm au passage pourvu que l'écran soit le même

Et le point technique intéressant : l'add-in de test/démo/contrôle est compilé pour Graph 85 et Graph 90 à partir des mêmes sources. Seules quelques différences d'affichage sont nécessaires, pour l'instant tout ce qui est interne au processeur fonctionne exactement pareil.
Zezombye Hors ligne Rédacteur Points: 1756 Défis: 13 Message

Citer : Posté le 17/04/2018 16:53 | #


Et le point technique intéressant : l'add-in de test/démo/contrôle est compilé pour Graph 85 et Graph 90 à partir des mêmes sources. Seules quelques différences d'affichage sont nécessaires, pour l'instant tout ce qui est interne au processeur fonctionne exactement pareil.


Mon rêve de jouer aux jeux monochromes sur graph 90 devient réalité

Niveau portage, est ce que ce serait éventuellement possible de prendre le code source d'un addin (même du SDK) puis de juste le recompiler avec gint pour qu'il soit jouable sur la graph 90 ? (avec une monochromelib+fxlib portée pour, et pas de gestion du contraste ou des syscalls chelous)

Niveau graphismes : tu gères comment le scaling, c'est en x3 centré ?
Divers jeux : Puissance 4 - Chariot Wars - Sokoban
Ecrivez vos programmes basic sur PC avec BIDE
Lephenixnoir Hors ligne Administrateur Points: 22118 Défis: 149 Message

Citer : Posté le 17/04/2018 17:03 | #


Zezombye a écrit :
Mon rêve de jouer aux jeux monochromes sur graph 90 devient réalité

Hmm, jouer aux jeux monochromes sur la G90 ? C'est pas une remarque stupide. Clairement on peut passer d'un add-in monochrome à un couleur sur peu de modifications des sources. La question serait plus de patcher les binaires. Sous gint, je sais qu'on pourrait. Les add-ins SDK, hmm...

Zezombye a écrit :
Niveau graphismes : tu gères comment le scaling, c'est en x3 centré ?

Je crois que je n'étais pas clair, alors je vais le dire un peu plus fort :

L'enjeu d'un portage de gint sur la Graph 90, c'est de faire des jeux couleur.

Du coup je gère pas le scaling, mais sache qu'il y a plein de syscalls qui font tout en x3, ce qui facilite le genre de patch dont je parlais au-dessus.
Zezombye Hors ligne Rédacteur Points: 1756 Défis: 13 Message

Citer : Posté le 17/04/2018 17:10 | #


La question serait plus de patcher les binaires. Sous gint, je sais qu'on pourrait. Les add-ins SDK, hmm...


Oublie les binaires, on assume qu'on a les sources (ce qui est le cas pour la plupart des bons addins). Le plus difficile serait surtout de porter les syscalls utilisés.

L'enjeu d'un portage de gint sur la Graph 90, c'est de faire des jeux couleur.

Du coup je gère pas le scaling


Quel intérêt de compiler en même temps pour graph 85 et graph 90 en même temps alors ? (à moins que l'addin fasse 128*64 sur graph 90, mais ça fera un peu petit)

Les syscalls, tu parles de ceux de gint ou de ceux de la calto ?
Divers jeux : Puissance 4 - Chariot Wars - Sokoban
Ecrivez vos programmes basic sur PC avec BIDE
Lephenixnoir Hors ligne Administrateur Points: 22118 Défis: 149 Message

Citer : Posté le 17/04/2018 17:13 | # | Fichier joint


Voilà quelque chose de plus explicite. C'est un vrai add-in Graph 90.



Ajouté le 17/04/2018 à 17:15 :
Si t'as les sources, pas la peine de patcher les syscalls. Suffit d'utiliser les équivalents Prizm ou réimplémenter des petits wrappers. Ce sera simple pour l'immense majorité des applications.

Zezombye a écrit :
Quel intérêt de compiler en même temps pour graph 85 et graph 90 en même temps alors ? (à moins que l'addin fasse 128*64 sur graph 90, mais ça fera un peu petit)

Ne sous-estime pas ce que le programme peut faire. Mon screenshot c'est l'appli de contrôle de gint. Il a suffit de remplacer le syscall PrintXY(). Pareil pour mes f-keys, il suffira d'en donner deux versions. L'affichage n'est pas le coeur de l'application, qui lui reste inchangé.

Zezombye a écrit :
Les syscalls, tu parles de ceux de gint ou de ceux de la calto ?

gint n'a pas de syscalls, qui sont par définition des fonctions fournies par l'OS.
Nemhardy Hors ligne Grand maître des Traits d'Esprit Points: 1241 Défis: 54 Message

Citer : Posté le 17/04/2018 17:15 | #


Chouette nouvelle que voilà ! Ça fait plaisir de voir que tu t'es sorti de tes mésaventures de l'autre jour où plus grand chose ne semblait marcher y compris chez les monchromes… Beau boulot !
Zezombye Hors ligne Rédacteur Points: 1756 Défis: 13 Message

Citer : Posté le 17/04/2018 17:16 | #


Ah, je vois. Mais du coup tu ne redéfinis pas les fonctions graphiques pour le scaling (c'est juste que le syscall utilisé pour le Locate utilise toujours 7x21 caractères et fait donc du scaling).

Du coup tu fais comment par exemple pour le test de gris (celui avec les sprites des épées) ?
Divers jeux : Puissance 4 - Chariot Wars - Sokoban
Ecrivez vos programmes basic sur PC avec BIDE
Lephenixnoir Hors ligne Administrateur Points: 22118 Défis: 149 Message

Citer : Posté le 17/04/2018 17:17 | #


À vrai dire j'ai enfin pu pointer un vrai bug, clair et fixe, dans les sources de l'autre jour. Une sombre histoire où les registres de priorité des interruptions - ceux qui me servent à désactiver les interruptions - ont un espacement interne. Je n'en tenais pas compte, et du coup il y avait encore des interruptions...

J'ai aussi rencontré des System ERROR quand je me suis rendu compte que j'arrivais à appeler memcpy() sans l'implémenter grâce à de la magie noire du compilo. Ça n'explique pas tout ceux que j'avais (surtout une fois gint en place), mais c'est déjà ça.

Ajouté le 17/04/2018 à 17:18 :
Zezombye a écrit :
Ah, je vois. Mais du coup tu ne redéfinis pas les fonctions graphiques pour le scaling (c'est juste que le syscall utilisé pour le Locate utilise toujours 7x21 caractères et fait donc du scaling).

Disons que c'est l'équivalent Prizm de Locate, donc il affiche selon les standard de la Graph 90.

Zezombye a écrit :
Du coup tu fais comment par exemple pour le test de gris (celui avec les sprites des épées) ?

J'en suis pas encore là. Mais pour le coup je mettrai d'autre images dans le test, et y'aura pas l'histoire de gris. Les seules vraies différence entre la monochrome et la Graph 90 !

Ajouté le 18/04/2018 à 18:20 :
Juste pour signaler que j'ai résolus d'autres bugs qui traînaient dans ma première tentative de portage vers la Graph 90, tentative qui avait fini par tout casser même sur les monochromes.

Il y avait de sombres subtilités d'alignement dans le linker script, en particulier :

.data ALIGN(4) : {...} # Aligne l'adresse de stockage (ROM) à 4 octets
.data : ALIGN(4) {...} # Aligne l'adresse de travail (RAM) à 4 octets
.data ALIGN(4) : ALIGN(4) {...} # Ce que je voulais

J'ai aussi réglé un truc sale lié au fait que pour le compilateur C, quand vous écrivez symbole, ça veut dire pour lui « la donnée qui est à l'adresse donnée par _symbole ». Ce qui n'est pas le cas pour les fonctions puisque quand f est une fonction, f et &f sont la même chose (il prend automatiquement l'adresse). Et donc vous n'avez pas la même chose dans les deux cas suivants :

extern void f(void);
print_hexa((uint32_t)f); # Affiche l'adresse de f
extern void (*f)(void);
print_hexa((uint32_t)f); # Affiche les deux premières instructions de f

Ces choses étant résolues, j'avance progressivement sur les drivers et les interruptions. Actuellement je n'active pas les interruptions, mais je mets en place les drivers en commençant par celui de l'écran sur la monochrome, le plus simple. Il a l'air de marcher sur les fonctionnalités de base ; je m'occupe actuellement du contraste et du rétroéclairage puis je passe à des trucs plus subtils, probablement les timers et le clavier.

Je tenterai d'écrire un driver clavier plus sérieux qu'avant, mais ce n'est pas dit que j'y arrive... il se passe beaucoup d'effets bizarres avec le clavier. Je maintiendrai ce thread à jour dans tous les cas !
Précédente 1, 2, 3 ··· 5, 6, 7, 8, 9, 10, 11 ··· 20 ··· 30 ··· 40 ··· 50 ··· 60 ··· 64, 65, 66 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 v42 © créé par Neuronix et Muelsaco 2004 - 2022 | Il y a 64 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