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), et la majorité de la bibliothèque C++
- 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.
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 (2023-04-03)
gint 2.11
- 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.
- Applications USB. Ajouter le support de descripteurs de fichiers USB. Potentiellement pousser jusqu'à avoir GDB pour debugger.
- Support de scanf() dans la fxlibc. Codé par SlyVTT, plus qu'à nettoyer et fusionner.
Non classé
- 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.
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
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.
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).
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 ?
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
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 !
Citer : Posté le 04/03/2018 17:08 | #
Bonnes nouvelles :-)
Vous avez besoin d'aide pour le portage ?
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.)
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 !
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 !
Citer : Posté le 04/03/2018 17:24 | #
Merci pour ces pointeurs Nemhardy, je vais regarder tout ça.
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)
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.
Citer : Posté le 17/04/2018 16:53 | #
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é ?
Ecrivez vos programmes basic sur PC avec BIDE
Citer : Posté le 17/04/2018 17:03 | #
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...
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.
Citer : Posté le 17/04/2018 17:10 | #
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.
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 ?
Ecrivez vos programmes basic sur PC avec BIDE
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.
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é.
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.
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 !
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) ?
Ecrivez vos programmes basic sur PC avec BIDE
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 :
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.
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 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 :
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 !