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 En ligne Administrateur Points: 22452 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 ··· 7, 8, 9, 10, 11, 12, 13 ··· 20 ··· 30 ··· 40 ··· 50 ··· 60 ··· 67, 68, 69 Suivante
Lephenixnoir En ligne Administrateur Points: 22452 Défis: 149 Message

Citer : Posté le 30/04/2018 20:22 | #


Merci de ton aide !

Le problème de disparation des add-ins est connu même s'il n'y a pas de solution claire. Je m'y suis frotté à plusieurs occasions, notamment quand j'ai utilisé une mauvaise zone de RAM sur les premières versions SH4 de gint [#133735]. J'ai déjà réussi à le résoudre en optimisant la mémoire de stockage. Il y a peut-être d'autres solutions ; le reset complet est définitivement la plus brutale.
Zezombye En ligne Rédacteur Points: 1756 Défis: 13 Message

Citer : Posté le 30/04/2018 20:24 | #


Normalement il faudrait juste dire à l'OS de re-scanner la mémoire principale pour les addins, il y a un syscall qui fait ça donc il suffirait de transférer un addin qui exécute ce syscall. L'optimisation appelle ce syscall car les adresses des addins dans le tableau des addins doivent être updatées, donc ça aurait pu régler ton problème.
Divers jeux : Puissance 4 - Chariot Wars - Sokoban
Ecrivez vos programmes basic sur PC avec BIDE
Yatis Hors ligne Membre Points: 575 Défis: 0 Message

Citer : Posté le 29/05/2018 19:10 | #


Zezombye a écrit :
Normalement il faudrait juste dire à l'OS de re-scanner la mémoire principale pour les addins, il y a un syscall qui fait ça donc il suffirait de transférer un addin qui exécute ce syscall.

Je n'ai pas réussi à obtenir un résultat avec le syscall, par contre, j'ai réussi à trouver le problème...figurez-vous qu'il venait de...........FA-124
Tout mais add-in était corrompue, j'ai réinstallé FA-124 et c’était bon x)
Et le problème était bizarre: impossible de recevoir de add in via USB et 3-pins.
Quand je transférais un truc (basic, g1a, etc.) via 3-pins le transfert avait bien lieu, le programme était bien dans la mémoire de l'autre calot...mais impossible d'y accéder x)
Même après des changements d'OS, optimisation, formatage complet...bref c'était très bizarre



A part ça, gint a du nouveaux depuis 1 mois ?
Lephenixnoir En ligne Administrateur Points: 22452 Défis: 149 Message

Citer : Posté le 29/05/2018 19:14 | #


Eh bien, actuellement, j'ai bientôt fini de documenter les 1 (SH3) / 6 (SH4) timers supplémentaires à 32 kHz ajoutés par Casio. Je vais écrire les gestionnaires d'interruption et je pourrai finaliser le timer !

Ensuite, je ferai du graphique - à la fois sur la G85 et sur la G90. Je vous ferai une démo sympa sur la G90 !

Pour l'instant je suis en examens et après je serai en stage, alors ça ne pourra pas aller très vite... mais je vais faire de mon mieux pour vous donner des nouvelles régulières.
Natnat Hors ligne Membre Points: 73 Défis: 0 Message

Citer : Posté le 12/06/2018 19:53 | #


Salut, c'est encore moi avec un problème avec la toolchain GCC!

J'ai un problème assez étrange pour compiler et installer gint...
make me donne:

  mkdir build
    gcc src/ctype/ctype_classes.c
    gcc src/ctype/ctype_functions.c
    gcc src/math/math_qdiv.c
     as src/setjmp/setjmp.s
    gcc src/stdio/sprintf.c
    gcc src/stdio/snprintf.c
    gcc src/stdio/stdio_format.c
    gcc src/stdio/vsprintf.c
    gcc src/stdio/vsnprintf.c
    gcc src/stdlib/realloc.c
    gcc src/stdlib/free.c
    gcc src/stdlib/stdlib_abs.c
    gcc src/stdlib/stdlib_rand.c
    gcc src/stdlib/malloc.c
    gcc src/stdlib/stdlib_div.c
    gcc src/stdlib/calloc.c
    gcc src/string/memchr.c
    gcc src/string/strlen.c
    gcc src/string/strcmp.c
    gcc src/string/memcmp.c
    gcc src/string/strcpy.c
    gcc src/string/memcpy.c
    gcc src/string/strnlen.c
    gcc src/string/strncpy.c
    gcc src/string/memset.c
    gcc src/string/strchr.c
    gcc src/time/time.c
    gcc src/time/time_misc.c
    gcc src/time/asctime.c
    gcc src/time/time_util.c
    gcc src/time/gmtime.c
    gcc src/time/mktime.c
    gcc src/time/ctime.c
     ar ar libc.a

» Succesfully built libc (30624 bytes)

    gcc src/bopti/bopti_internals.c
    gcc src/bopti/dimage.c
    gcc src/bopti/gimage.c
    gcc src/clock/clock.c
    gcc src/core/modules.c
    gcc src/core/interrupt_maps_7305.c
    gcc src/core/vbr_space.c
    gcc src/core/interrupts.c
    gcc src/core/gint_sh7705.c
    gcc src/core/init_quit.c
    gcc src/core/exceptions.c
    gcc src/core/mpu.c
    gcc src/core/interrupt_maps_7705.c
    gcc src/core/gint.c
    gcc src/core/gint_sh7305.c
     as src/core/syscalls.s
     as src/core/gint_vbr.s
    gcc src/display/getMasks.c
    gcc src/display/drect.c
    gcc src/display/display_vram.c
    gcc src/display/adjustRectangle.c
    gcc src/display/dclear.c
    gcc src/display/dpixel.c
    gcc src/display/dupdate.c
    gcc src/display/dline.c
    gcc src/events/event_get.c
    gcc src/events/event_push.c
    gcc src/gray/gray_engine.c
    gcc src/gray/gclear.c
    gcc src/gray/gpixel.c
    gcc src/gray/gline.c
    gcc src/gray/grect.c
    gcc src/init/crt0.c
    gcc src/init/util.c
    gcc src/keyboard/key_char.c
    gcc src/keyboard/keyboard_sh7305.c
    gcc src/keyboard/getkey.c
    gcc src/keyboard/keyboard_sh7705.c
    gcc src/keyboard/key_id.c
    gcc src/keyboard/key_type.c
    gcc src/keyboard/getPressedKeys.c
    gcc src/keyboard/keyboard_core.c
    gcc src/mmu/pseudoTLBInit.c
    gcc src/rtc/rtc_callback.c
    gcc src/rtc/rtc_getTime.c
    gcc src/rtc/rtc_setTime.c
    gcc src/rtc/rtc_interrupt.c
    gcc src/screen/screen_display.c
    gcc src/screen/screen_backlight.c
    gcc src/tales/tales_gray.c
    gcc src/tales/gprint.c
    gcc src/tales/dprint.c
    gcc src/tales/gtext.c
    gcc src/tales/tales_internals.c
    gcc src/tales/text_length.c
    gcc src/tales/dtext.c
    gcc src/tales/tales_configuration.c
    gcc src/timer/common_api.c
    gcc src/timer/virtual_timers.c
    gcc src/timer/hardware_timers.c
fxconv -font src/display/font_system.bmp
     ld build/version.o
sh3eb-elf-objcopy: error: the input file 'build/version.o' has no sections
Makefile:203 : la recette pour la cible « build/version.o » a échouée
make: *** [build/version.o] Erreur 1

Ce qui est assez étrange, étant donné que c'est pas sensé être une erreur...
Par contre, un make gintdemo.g1a fonctionne parfaitement.
Et si je make install quand même, il ne retourne pas d'erreur (mais quand je compile après il me donne une erreur).

sh3eb-elf-gcc `fxsdk --clfags` -c main.c -o main.o -I include -I `fxsdk --folder`/gint -I `fxsdk --folder` -Wall
In file included from /home/Nathan/share/fxsdk/gint/display.h:14,
                 from main.c:1:
/home/Nathan/opt/sh3eb-elf/lib/gcc/sh3eb-elf/8.1.0/include/stdint.h:9:16: fatal error: stdint.h: No such file or directory
# include_next <stdint.h>
                ^~~~~~~~~~
compilation terminated.
Makefile:29 : la recette pour la cible « main.o » a échouée
make: *** [main.o] Erreur 1
Lephenixnoir En ligne Administrateur Points: 22452 Défis: 149 Message

Citer : Posté le 12/06/2018 20:01 | #


Prenons les choses dans l'ordre. Peux-tu effectuer make VERBOSE=1 dans le dépôt de gint pour m'afficher la commande qui a planté ? Je crois que je sais de quoi il s'agit, finalement.

L'erreur que tu rencontres à la compilation, c'est autre chose. Il faut passer -ffreestanding à gcc pour qu'il expose stdint.h sur ce système.
Natnat Hors ligne Membre Points: 73 Défis: 0 Message

Citer : Posté le 12/06/2018 20:08 | #


Lephenixnoir a écrit :
Prenons les choses dans l'ordre. Peux-tu effectuer make VERBOSE=1 dans le dépôt de gint pour m'afficher la commande qui a planté ? Je crois que je sais de quoi il s'agit, finalement.

L'erreur que tu rencontres à la compilation, c'est autre chose. Il faut passer -ffreestanding à gcc pour qu'il expose stdint.h sur ce système.

J'arrive pas à croire que j'ai oublié le -ffreestanding
Maintenant, ld ne trouve pas -lc, mais c'est déjà plus un problème de GCC j'imagine.

Pour l'erreur de compilation de gint, make VERBOSE=1 me retourne ça:

mkdir -p build
sh3eb-elf-gcc -c src/ctype/ctype_classes.c -o build/ctype_ctype_classes.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/ctype/ctype_functions.c -o build/ctype_ctype_functions.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/math/math_qdiv.c -o build/math_math_qdiv.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-as  -c src/setjmp/setjmp.s -o build/setjmp_setjmp.s.o
sh3eb-elf-gcc -c src/stdio/sprintf.c -o build/stdio_sprintf.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/stdio/snprintf.c -o build/stdio_snprintf.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/stdio/stdio_format.c -o build/stdio_stdio_format.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/stdio/vsprintf.c -o build/stdio_vsprintf.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/stdio/vsnprintf.c -o build/stdio_vsnprintf.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/stdlib/realloc.c -o build/stdlib_realloc.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/stdlib/free.c -o build/stdlib_free.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/stdlib/stdlib_abs.c -o build/stdlib_stdlib_abs.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/stdlib/stdlib_rand.c -o build/stdlib_stdlib_rand.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/stdlib/malloc.c -o build/stdlib_malloc.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/stdlib/stdlib_div.c -o build/stdlib_stdlib_div.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/stdlib/calloc.c -o build/stdlib_calloc.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/string/memchr.c -o build/string_memchr.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/string/strlen.c -o build/string_strlen.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/string/strcmp.c -o build/string_strcmp.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/string/memcmp.c -o build/string_memcmp.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/string/strcpy.c -o build/string_strcpy.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/string/memcpy.c -o build/string_memcpy.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/string/strnlen.c -o build/string_strnlen.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/string/strncpy.c -o build/string_strncpy.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/string/memset.c -o build/string_memset.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/string/strchr.c -o build/string_strchr.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/time/time.c -o build/time_time.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/time/time_misc.c -o build/time_time_misc.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/time/asctime.c -o build/time_asctime.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/time/time_util.c -o build/time_time_util.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/time/gmtime.c -o build/time_gmtime.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/time/mktime.c -o build/time_mktime.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/time/ctime.c -o build/time_ctime.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-ar rcs libc.a build/ctype_ctype_classes.c.o build/ctype_ctype_functions.c.o  build/math_math_qdiv.c.o  build/setjmp_setjmp.s.o  build/stdio_sprintf.c.o build/stdio_snprintf.c.o build/stdio_stdio_format.c.o build/stdio_vsprintf.c.o build/stdio_vsnprintf.c.o  build/stdlib_realloc.c.o build/stdlib_free.c.o build/stdlib_stdlib_abs.c.o build/stdlib_stdlib_rand.c.o build/stdlib_malloc.c.o build/stdlib_stdlib_div.c.o build/stdlib_calloc.c.o  build/string_memchr.c.o build/string_strlen.c.o build/string_strcmp.c.o build/string_memcmp.c.o build/string_strcpy.c.o build/string_memcpy.c.o build/string_strnlen.c.o build/string_strncpy.c.o build/string_memset.c.o build/string_strchr.c.o  build/time_time.c.o build/time_time_misc.c.o build/time_asctime.c.o build/time_time_util.c.o build/time_gmtime.c.o build/time_mktime.c.o build/time_ctime.c.o  

» Succesfully built libc (30624 bytes)

sh3eb-elf-gcc -c src/bopti/bopti_internals.c -o build/bopti_bopti_internals.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/bopti/dimage.c -o build/bopti_dimage.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/bopti/gimage.c -o build/bopti_gimage.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/clock/clock.c -o build/clock_clock.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/core/modules.c -o build/core_modules.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/core/interrupt_maps_7305.c -o build/core_interrupt_maps_7305.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/core/vbr_space.c -o build/core_vbr_space.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/core/interrupts.c -o build/core_interrupts.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/core/gint_sh7705.c -o build/core_gint_sh7705.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/core/init_quit.c -o build/core_init_quit.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/core/exceptions.c -o build/core_exceptions.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/core/mpu.c -o build/core_mpu.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/core/interrupt_maps_7705.c -o build/core_interrupt_maps_7705.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/core/gint.c -o build/core_gint.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/core/gint_sh7305.c -o build/core_gint_sh7305.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-as  -c src/core/syscalls.s -o build/core_syscalls.s.o
sh3eb-elf-as  -c src/core/gint_vbr.s -o build/core_gint_vbr.s.o
sh3eb-elf-gcc -c src/display/getMasks.c -o build/display_getMasks.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/display/drect.c -o build/display_drect.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/display/display_vram.c -o build/display_display_vram.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/display/adjustRectangle.c -o build/display_adjustRectangle.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/display/dclear.c -o build/display_dclear.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/display/dpixel.c -o build/display_dpixel.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/display/dupdate.c -o build/display_dupdate.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/display/dline.c -o build/display_dline.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/events/event_get.c -o build/events_event_get.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/events/event_push.c -o build/events_event_push.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/gray/gray_engine.c -o build/gray_gray_engine.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/gray/gclear.c -o build/gray_gclear.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/gray/gpixel.c -o build/gray_gpixel.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/gray/gline.c -o build/gray_gline.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/gray/grect.c -o build/gray_grect.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/init/crt0.c -o build/init_crt0.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/init/util.c -o build/init_util.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/keyboard/key_char.c -o build/keyboard_key_char.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/keyboard/keyboard_sh7305.c -o build/keyboard_keyboard_sh7305.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/keyboard/getkey.c -o build/keyboard_getkey.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/keyboard/keyboard_sh7705.c -o build/keyboard_keyboard_sh7705.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/keyboard/key_id.c -o build/keyboard_key_id.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/keyboard/key_type.c -o build/keyboard_key_type.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/keyboard/getPressedKeys.c -o build/keyboard_getPressedKeys.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/keyboard/keyboard_core.c -o build/keyboard_keyboard_core.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/mmu/pseudoTLBInit.c -o build/mmu_pseudoTLBInit.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/rtc/rtc_callback.c -o build/rtc_rtc_callback.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/rtc/rtc_getTime.c -o build/rtc_rtc_getTime.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/rtc/rtc_setTime.c -o build/rtc_rtc_setTime.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/rtc/rtc_interrupt.c -o build/rtc_rtc_interrupt.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/screen/screen_display.c -o build/screen_screen_display.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/screen/screen_backlight.c -o build/screen_screen_backlight.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/tales/tales_gray.c -o build/tales_tales_gray.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/tales/gprint.c -o build/tales_gprint.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/tales/dprint.c -o build/tales_dprint.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/tales/gtext.c -o build/tales_gtext.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/tales/tales_internals.c -o build/tales_tales_internals.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/tales/text_length.c -o build/tales_text_length.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/tales/dtext.c -o build/tales_dtext.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/tales/tales_configuration.c -o build/tales_tales_configuration.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/timer/common_api.c -o build/timer_common_api.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/timer/virtual_timers.c -o build/timer_virtual_timers.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/timer/hardware_timers.c -o build/timer_hardware_timers.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
fxconv -font src/display/font_system.bmp -o build/display_font_system.bmp.o -font -n gint_font_system
sh3eb-elf-ld -r -R build/version.o.txt -o build/version.o
sh3eb-elf-objcopy -R .stack build/version.o build/version.o
sh3eb-elf-objcopy: error: the input file 'build/version.o' has no sections
Makefile:203 : la recette pour la cible « build/version.o » a échouée
make: *** [build/version.o] Erreur 1
Lephenixnoir En ligne Administrateur Points: 22452 Défis: 149 Message

Citer : Posté le 12/06/2018 20:17 | #


Maintenant, ld ne trouve pas -lc, mais c'est déjà plus un problème de GCC j'imagine.

Passe -nostdlib. Et normalement -ffreestanding implique -nostdlib, ce qui me fait dire que tu n'as pas passé au linker tous les flags de compilation. Tu devrais dès que tu linkes avec libgcc, c'est des détails qui traînent dans la doc mais qui peuvent te jouer un mauvais tour si tu l'oublies et que tu utilises des combinaisons d'options exotiques...

sh3eb-elf-objcopy -R .stack build/version.o build/version.o

Ok, c'est ce que j'avais imaginé. Tu vois -R .stack ? C'est pour supprimer la section .stack, qui n'a aucune raison d'exister, mais que ma version du sh3eb-elf-ld me générait sans raison quand j'ai développé ce bout du code. Le ld x86 ne me le faisait pas, j'ai pensé que j'avais mal configuré le compilo et j'ai ajouté ça.

Sauf que le tien ne génère pas de section .stack, donc évidemment objcopy ne peut pas la supprimer. La vraie manière de procéder aurait été :
1. De générer le fichier sans -R .stack pour que ça marche à tous les coups
2. De jeter la section build/version.o(.stack) dans le linker script

Je viens de commit ça. N'oublie pas de nettoyer ou recompiler (make -B) parce que même si le objcopy échoue, comme le fichier de destination est le même que le fichier source, on peut continuer à compiler. D'ailleurs tu pourrais continuer comme tu es parti sans problème, mais c'est mieux de fixer le système de build.
Natnat Hors ligne Membre Points: 73 Défis: 0 Message

Citer : Posté le 12/06/2018 20:37 | #


Lephenixnoir a écrit :

Passe -nostdlib. Et normalement -ffreestanding implique -nostdlib, ce qui me fait dire que tu n'as pas passé au linker tous les flags de compilation. Tu devrais dès que tu linkes avec libgcc, c'est des détails qui traînent dans la doc mais qui peuvent te jouer un mauvais tour si tu l'oublies et que tu utilises des combinaisons d'options exotiques...

Bizzare, fxsdk --cflags --ldflags me met pourtant le -ffreestanding tout seul... Mais en ajoutant le -nostdlib ça résout les problèmes de lib, effectivement. Par contre il arrive pas à linker correctement gint, il me manque tous les symboles... Faudra que j'essaie de réinstaller le fxsdk en entier pour voir...
Mais franchement la doc elle fait des miliers de lignes et c'est super chiant de trouver le flag qu'on veut dedans... J'imagine que j'ai signé pour ça en choisissant de compiler sur Linux...

Lephenixnoir a écrit :

Je viens de commit ça. N'oublie pas de nettoyer ou recompiler (make -B) parce que même si le objcopy échoue, comme le fichier de destination est le même que le fichier source, on peut continuer à compiler. D'ailleurs tu pourrais continuer comme tu es parti sans problème, mais c'est mieux de fixer le système de build.

Oui, un make mrproper suivi de make puis de make install et plus aucune erreur
J'imagine que ça vient du combo GCC 8.1.0 et binutils 2.30 qui brise la rétrocompatibilité... Note pour plus tard, la dernière version n'est pas forcément la meilleure.
Lephenixnoir En ligne Administrateur Points: 22452 Défis: 149 Message

Citer : Posté le 12/06/2018 20:41 | #


Après un petit tour dans le manuel, je ne trouve pas trace de l'implication de -nostdlib par -ffreestanding. Je me suis peut-être mélangé les pinceaux...

La doc de GCC, il faut la parcourir avec la recherche, ou bien dans le manuel info, que tu peux trouver en ligne ( https://gcc.gnu.org/onlinedocs/ ).

Je ne sais pas trop d'où venait cette section .stack, mais le principal est que le problème soit résolu. Bon courage pour la suite de ton projet, et hésite pas à lâcher des détails sur le forum !
Natnat Hors ligne Membre Points: 73 Défis: 0 Message

Citer : Posté le 12/06/2018 21:33 | #


Merci beaucoup
Oui, c'était effectivement un peu con d'essayer d'utiliser man pour la doc...
J'essaierai de mettre le programme en ligne avec un topic explicatif d'ici la semaine prochaine, avec les sources (GitHub ou le GitLab ?)
Lephenixnoir En ligne Administrateur Points: 22452 Défis: 149 Message

Citer : Posté le 12/06/2018 21:34 | #


Je dis ça mais j'utilise beaucoup le manuel quand il ne s'agit que des options...

Le Gitlab ! Le Gitlab !
Yatis Hors ligne Membre Points: 575 Défis: 0 Message

Citer : Posté le 19/06/2018 12:29 | #


Je viens de tester Gint sur une sh3 la touche [menu] ne fonctionne pas (enfin le retour menu fonctionne une seule fois quand on appuie 2 fois sur le menu apres ça ne fonctionne plus du tout)
Lephenixnoir En ligne Administrateur Points: 22452 Défis: 149 Message

Citer : Posté le 19/06/2018 15:23 | #


Je vérifie dès que possible sur ma propre SH3. En attendant, il me faut une copie du bootlog (l'écran de contrôle de la figure 1). Tu peux me faire ça ?
Yatis Hors ligne Membre Points: 575 Défis: 0 Message

Citer : Posté le 20/06/2018 17:13 | #



Voila
Lephenixnoir En ligne Administrateur Points: 22452 Défis: 149 Message

Citer : Posté le 01/08/2018 14:11 | #


(Note : Je n'oublie pas le bug que tu as trouvé, Yatis.)

J'ai fait marcher les timers supplémentaires de Casio ! On a donc sur SH4 (et donc sur Graph 90) :
- 3 timers précis à ~0.1 µs
- 6 timers précis à ~30 µs

J'ai monté un test assez solide pour tester tout ça : attendre 200 tranches de 50ms en changeant de timer à chaque tranche ! Je suis sensiblement convaincu que ça marche maintenant

Maintenant que j'ai implémenté les timers je vais pouvoir faire plusieurs choses cruciales :
- Des mesures de temps d'exécution réellement précises (100ns !)
- Donc un benchmarking très violent pour les applications limites en perfs (Windmill !)
- Améliorer le moteur de gris (couleurs légèrement plus stables)
- Mesurer la puissance de mon nouveau gestionnaire d'interruptions !

Ajouté le 01/08/2018 à 16:01 :
Une bonne chose faite : j'ai fait marcher tout ça sur SH3 également ! À quelques détails sur la façon dont le driver est structuré, s'il n'y a pas d'autres bugs, j'en ai fini avec les timers.

Je signale toutefois (si quelqu'un est intéressé par programmer du hardware) que les timers supplémentaires ont des comportements subtilement différents des timers normaux ; j'ai documenté les différences et adapté le code de gint mais c'est très fourbe et c'est ce qui m'a tenu en arrêt pas loin de deux mois.

Ajouté le 04/08/2018 à 17:56 :
Après avoir implémenté les timers sur Graph 90, j'ai remarqué que la fréquence que j'avais notée était surestimée. La fréquence réelle est un poil plus faible. Or j'ai tiré cette fréquence de calculs donnés par la doc qui marchent très bien sur Graph 75 SH4, et qui sont partagés par Ptune3.

Avant de pinger Sentaro21 sur ce problème, je veux m'assurer que les fréquences données par Ptune3 sont effectivement surestimées. Donc j'avais besoin de la RTC pour avoir un timer qui tourne à une fréquence bien connue d'avance.

J'ai donc porté mon ancien driver RTC sur SH4, puis - sans modification - sur Graph 90 et SH3. gint retrouve les fonctionnalités d'avant, mais cette fois en couleurs !

Plus de détails dans la RdP !

Ajouté le 04/08/2018 à 18:26 :
J'ai une autre bonne nouvelle.

Mon ancien gestionnaire d'interruptions arrivait à traiter 180'000 interruptions de timer par seconde. Il était en C et un peu bloated...

Mon nouveau gestionnaire, avec toutes les parties en assembleur, arrive à tenir 320'000 interruptions de timer par seconde !

La réactivité du gestionnaire d'interruptions est importante pour les applications qui exécuteront des tâches en boucle (son, transferts multijoueurs...). Le nouveau gestionnaire en assembleur devait améliorer ça : c'est chose faite !
Drak Hors ligne Rédacteur Points: 1925 Défis: 40 Message

Citer : Posté le 04/08/2018 19:49 | #


Good job!
Eon the Dragon : version 1.2
Let's have a look!
Marre de ces RPGs qui t'imposent des classes, des compétences et des sorts ? Crée tes propres capacités sur Eon the Dragon ! Des monstres, des dragons et des combats aussi épiques que difficiles t'attendent !
Un RPG unique et immense t'attend ! Joue dès maintenant à Aventura, le Royaume Poudingue !
Vous aussi, soyez swag et rejoignez Planète Casio !
Ninestars Hors ligne Membre Points: 2449 Défis: 24 Message

Citer : Posté le 04/08/2018 22:08 | #


Bravo !
Je suis impressionné
Que veux-tu dire par "un benchmarking violent", en quoi ça pourrai me servir pour Windmill ?
Lephenixnoir En ligne Administrateur Points: 22452 Défis: 149 Message

Citer : Posté le 04/08/2018 22:14 | #


Merci à vous deux !

Si toutefois on arrivait à compiler Windmill sous gint... on pourrait se monter un profiler pour tracer quelles parties du code consomment le plus de temps de calcul, et avec une grande précision !
Ninestars Hors ligne Membre Points: 2449 Défis: 24 Message

Citer : Posté le 04/08/2018 23:28 | #


Très bien ! Bah il faut qu'on essaye de le faire. La dernière fois ça n'avais pas marché.
Lephenixnoir En ligne Administrateur Points: 22452 Défis: 149 Message

Citer : Posté le 04/08/2018 23:49 | #


Seulement ça se complique au fur et à mesure que tu optimises... mais oui, à essayer.

Accessoirement tu peux récupérer le driver timer et basta. En l'occurrence gint n'est dans le principe pas nécessaire. L'OS peut emmerder mais avec un peu de chance non.
Précédente 1, 2, 3 ··· 7, 8, 9, 10, 11, 12, 13 ··· 20 ··· 30 ··· 40 ··· 50 ··· 60 ··· 67, 68, 69 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 48 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