Forums Casio - Projets de programmation

Index du Forum > Projets de programmation > gint : un environnement de développement d'add-ins
Lephenixnoir
Hors ligne
Administrateur
Points: 13150
Défis: 136
Message
Posté le 20/02/2015 17:30

gint : un environnement de développement d'add-ins :

En général, quand on veut écrire un add-in, on dégaine le fx-9860G SDK de Casio et sa bibliothèque fxlib, ou bien le PrizmSDK si la calculatrice visée est en couleurs.

gint est une alternative à tout ça. C'est un environnement de développement qui fonctionne sous Linux (et avec un peu de travail sous Windows) et vous permet de créer des add-ins avec gcc et sa suite. Il marche bien sur Graph monochromes, et je suis en train de le porter sur Graph 90. Un joli programme !

Comparé aux SDKs habituels, gint est plus proche du matériel et contrôle donc le clavier, l'écran ou l'horloge avec plus de finesse. Concrètement, ça veut dire que vous pouvez appuyer sur plusieurs touches à la fois, faire exécuter une fonction toutes les 5 ms, ou ne rafraîchir que la moitié de l'écran.

gint sur Graph monochrome



gint existe sur Graph monochrome depuis un moment et le cœur de la bibliothèque arrivera bientôt à sa version finale.

Comparé à fxlib, vous pouvez faire ce genre de joyeusetés...
– Des graphismes en 4 couleurs avec le moteur de gris
– Un contrôle détaillé du clavier pour les jeux, parfait pour les combos !
– Des timers avec une précision de 30 µs, d'autres à 60 ns
– Des fonctions de dessin de texte et d'image fulgurantes
– La conversion automatique des images grâce à fxconv (du fxSDK)
– La compatibilité SH3 et SH4 sans avoir à modifier les sources.

L'inconvénient principal est que gint est un gros morceau qui se baladera dans votre g1a. Ça représenté environ 30 ko, que vous pouvez comparer au 18 ko de sprintf() quand vous utilisez le SDK !

gint sur Graph 90



gint était à l'origine conçu pour Graph 85. J'avance tranquillement sur le portage avec la Graph 90, qui demande de réorganiser pas mal de code. J'arrive désormais à faire pas mal de choses :
– Installer gint et remplacer le gestionnaire d'interruptions
– Communiquer avec l'écran (méthode lente et non finale)
– Utiliser les 9 timers disponibles
– Configurer la RTC (horloge) et l'utiliser comme un timer
– Mesurer la fréquence des horloges (préparatif pour l'overclock)
– Les fondamentaux sur la manipulation du clavier

Si vous avez déjà programmé une Prizm, vous savez qu'il y a une bande blanche dans laquelle on ne peut rien afficher. Ce genre de choses se contourne bien avec gint, comme le montre la photo

Tester gint sur une Graph monochrome

Note : la procédure ci-dessous est pour la dernière version publique de gint, que j'ai publiée avant d'attaquer le portage sur Graph 90. Ça date un peu ^^'

Si vous avez un moment, je suis toujours à la recherche de tests pour vérifier que tout marche bien. Vous en avez pour 15 minutes environ !

1. Transférez l'add-in de test de gint (téléchargeable ici), sur votre machine, et lancez-le en maintenant EXE appuyé. L'écran de contrôle (image 1) apparaît.
2. Notez ses contenus quelque part pour me les envoyer. S'il n'y a pas "Boot OK" en haut à droite, faites un RESET et arrêtez là, car gint ne fonctionne pas. Sinon, appuyez sur une touche.
3. Effectuez les différents tests de l'onglet TEST. N'hésitez pas à signaler ce qui peut vous sembler bizarre !


Images 1 et 2 : L'écran de contrôle de gint, et le menu principal

Keyboard & events : vous devez pouvoir appuyer sur 3 ou 4 touches simultanément et visualiser des nom et nombre de répétition corrects, même si vous suivez des séquences exotiques. Vous pouvez voir le shadowing en constant que Left + Down + SHIFT déclenche ALPHA.
Gray engine : vérifiez que le réglage initial (DEFT) est satisfaisant pour un contraste moyen. Vous pouvez jouer avec les délais et voir comment l'illusion varie.
Image rendering : les images doivent s'afficher correctement dans tous les positions, mêmes si elles dépassent de l'écran.
Text rendering : vous devez voir les 6 lignes de 32 caractères en entier pour chaque police.
Real-time clock : l'horloge doit avancer seconde après seconde. Mettez-la à l'heure ou modifiez légèrement l'heure indiquée : le réglage doit persister.
Clocks and timers : dans l'onglet TIME, le timer et l'horloge doivent avancer sensiblement à la même vitesse.

4. Placez-vous ailleurs que dans le menu principal, appuyez sur MENU et vérifiez que vous retournez bien au menu de la calculatrice. Retournez dans l'application de test, vous devez réapparaître à l'endroit où vous l'aviez laissée.
5. Envoyez-moi vos résultats par un message sur ce topic. Et soyez remerciés !

Installer et utiliser gint sur votre système, pour développer

L'utilisation normale de gint est en l'associant avec le fxSDK, qui fournit les options de compilation/édition des liens appropriées, le linker script particulier de gint ainsi que les outils de conversion compatibles avec la bibliothèque. Si vous voulez utiliser le fxSDK tout entier (recommandé), suivez ses instructions d'installation, gint est fourni avec.

Une fois que gint est installé sur votre système, voyez les tutoriels de développement pour avoir un aperçu de son fonctionnement. La plupart des choses sont expliquées dans les en-têtes (fichiers .h) de la bibliothèque. Ils sont tous dans le sous-dossier gint du dossier d'installation du fxSDK, que vous pouvez afficher en exécutant fxsdk --folder.

Si vous voulez utiliser directement gint sans le fxSDK (soyez sûrs que vous savez ce que vous faites), vous pouvez ou télécharger l'archive, ou le compiler à la main. Notez que la compilation requiert quand même le fxSDK... pas besoin de l'installer par contre, il vous suffit de placer fxsdk/bin dans le PATH après compilation.

$ git clone "http://git.planet-casio.com/lephe/gint" && cd gint
$ ./configure --startup-log # Ce que vous voulez
$ make all-lib

Ici aussi, vous ne voudrez probablement pas l'installer, juste linker la bibliothèque. Je rappelle que l'ordre de linkage compte, et que vous devez absolument compiler avec gcc <options> <objets...> -lgint -lc -lgcc, et dans cet ordre.


Comment ça marche

gint est essentiellement organisé autour d'un gestionnaire d'interruptions, une routine qui répond aux signaux émis par les composants pour signaler des événements intéressants (décompte du temps, timer arrivé à expiration, touches du clavier pressées, données reçues sur le port série... entre 20 et 40 sources différentes sur la calculatrice). Normalement c'est le système qui fournit le sien, mais gint le change parce qu'il a besoin de le contrôler pour implémenter ses fonctionnalités et se rendre indépendant de fxlib.

Une fois qu'on contrôle les interruptions, installer un moteur de gris avec un timer à deux délais est un jeu d'enfant. Le moteur de Kucalc (Revolution-FX) ne les contrôlait pas, et devait toutes les supprimer sauf celle du timer, désactivant du même coup les autres timers, l'horloge, la fonction GetKey()... tout un dérangement qui se soldait par un redémarrage à la fin de l'exécution.


Fichier joint



Lephenixnoir
Hors ligne
Administrateur
Points: 13150
Défis: 136
Message
Dernier message de la page précédente :Posté le 26/07/2015 09:16 |
Bon, j'ai du nouveau.

Le SH4 n'est sans doute pas un SH7724 mais un SH7305, or ce dernier n'existe tout simplement pas, où que je cherche. Si vraiment ça me branche je taperai au hasard dans les docs de tous les mpus recensés par TeamFX pour trouver le bon mais je lui demanderai quand même, on ne sait jamais.

D'ici là, je suis repassé sur SH3.

La zone mémoire utilisée pour la SH4 fonctionne aussi. Donc l'appel du handler est commun. J'arrive à détecter les pressions de touches mais je ne me suis pas encore penché sur la reconnaissance de la touche.

J'arrive aussi à utiliser un timer de manière tout à fait arbitraite et comme il me plaît. Ça commence à être intéressant.

Ajouté le 26/07/2015 à 16:03 :
J'ai bossé avec l'écran ensuite. ML ne fonctionnait pas. En revanche, la fonction assembleur de kucalc dans revolution-fx, elle, fonctionnait. (Et dire qu'il disait à une époque, « it's already optimized since it's in pure assembleur », il auraît pu optimiser un peu l'assembleur quand même, un compilateur aurait fait presque aussi bien.) Du coup je l'ai réécrite à ma façon (c'est-à-dire plus linéaire et donc compréhensible) et j'arrive à manipuler l'écran.

J'ai mis mes timers, les valeurs de Kristaba sont pas géniales. Du coup je vais publier un add-in de test bientôt. Là, tout de suite, j'ai un dragon en 4 couleurs sous les yeux, c'est l'extase. (voyez le chat s'il n'est pas encore trop tard, Kirafi peut témoigner que je ne mens pas)
----------------------------------
Rise.



Pages: Précédente | 1, 2, 3, 4, 5, 6, 7, 8, ... 14 | Suivante

Kirafi
Hors ligne
Membre
Points: 2002
Défis: 10
Message
Citer : Posté le 26/07/2015 16:08 | #
C'est trop ça, notre Phénix pète des câbles depuis une heure avec son histoire de timer !
----------------------------------
iPod
Pour des parties rapides
Jusqu'où pourras-tu aller dans ce jeu "partie rapide" qu'est Dextris (élu Jeu Du Mois)
Pourras-tu survivre plus de 20 secondes dans ce fameux tunnel appelé Graviton
Rebondis entre les murs en évitant les piques dans SpikeBird
Pourras-tu éviter de te faire écraser dans FallBlocs (élu Jeu Du Mois)
Autres
Franchement ils valent le coups
Deviens l'amiral de la marine dans SeaRush (jeu concours) (élu Jeu Du Mois)
La version 2048 tactile amélioré au plus haut point : 2048 Delux !
Pars à la recherche des morceaux d'étoile dans Lumyce (élu Jeu Du Mois)
Lephenixnoir
Hors ligne
Administrateur
Points: 13150
Défis: 136
Message
Citer : Posté le 26/07/2015 16:13 | #
Kirafi a écrit :
C'est trop ça, notre Phénix pète des câbles depuis une heure avec son histoire de timer !

Hey, j'ai le droit d'accord ? Ça fait des mois que j'attends ça !

Ajouté le 27/07/2015 à 13:41 :
Hmph, j'ai un problème conséquent.

Je n'arrive pas à détecter quelle touche est pressée, quand j'ai une interruption. La procédure de SimLo pour détecter quelles touches sont pressées sur une ligne fonctionne bien mais elle a deux inconvénients : elle ne détecte pas deux touches sur la même colonne (elles s'annulent) et surtout, une fois que j'ai fait une analyse, je ne peux plus récupérer d'interruptions que sur la dernière ligne analysée.

J'ai donc opté temporairement au moins pour le syscall 0x24a qui fait ce boulot. Oui, mais il le fait lentement. En tous cas, suffisament pour déranger les timers de façon significative et altérer le gris avec une belle ligne de rafraîchissement à cause du grand nombre d'interruptions générées.

Je suis donc en train de chercher une autre manière de gérer les évènements. Je ne sais pas si on pourra utiliser des fonctions bloquantes, enfin... on verra bien.

Ajouté le 27/07/2015 à 16:37 :
Bon, alors voici les faits au niveau de la gestion du clavier :
→ L'utilisation de fonctions bloquantes et la gestion par interruptions nécessite une routine de détection de la touche
→ La routine de détection de la touche est assez longue pour perturber le gris
→ La fréquence gris est déjà au minimum, plus bas on voir les alternances

Conséquence : utiliser des fonctions bloquantes est en fait... bien mal parti. Kucalc n'a évidemment pas eu ce problème puisque comme il n'avait plus d'interruptions du tout il utilisait des appels de type IsKeyDown().

J'ai pensé à une autre manière de faire qui pourrait être plus légere, en utilisant une sorte de démon avec un timer.
----------------------------------
Rise.
Dodormeur
Hors ligne
Ancien rédacteur
Points: 3928
Défis: 82
Message
Citer : Posté le 27/07/2015 20:55 | #
Fait gaffe avec les utilisations de démons, déjà que trouver une vierge à sacrifier c'est pas simple, après faut réussir a le renvoyer dans son plan au bout d'un moment

Mais sinon, qu'est ce que t'entend par fonction bloquantes exactement? n'importe quelle fonction, uniquement les fonctions de type getKey, ou autre chose?
----------------------------------
Pokemon !!!!!! => pokemon stadium/battle

mes meilleurs jeux
Cliquer pour enrouler
un jeu avec des niveaux de gris mais compatible SH4 (mais en monochrome pour les SH4) => bomberman
envie de plonger dans la mer pour ramasser des tresors? => ballon sea
envie de sauver l'univers dans un jeu avec une longue durée de vie? => saviors of the future
un add-in addictif avec plein de secret et de trophées => evasion survival
un shmup bien dur et sadique => saviors 2

projets
Cliquer pour enrouler

pokemon
Cliquer pour enrouler



encodage des données de combat (sprite, attaques et nom)
   100%

systeme de combat
   100%

encodage des données de pokemon (niveau d'apprentisage et evolution)
   100%


moteur de la carte
   50%

level design
   1%

finition de pokemon jade
   42%

merci a tout le monde pour son soutien


projets que je soutiens
Cliquer pour enrouler
minecraft de limachi
zelda prizm de smashmaster (en esperant qu'il puisse le finir)
les tests de marmotti
un RPG de dark storm (dont je connais le nom, mais pas vous ) Arcuz !
Lephenixnoir
Hors ligne
Administrateur
Points: 13150
Défis: 136
Message
Citer : Posté le 27/07/2015 21:25 | #
Dodormeur a écrit :
Fait gaffe avec les utilisations de démons, déjà que trouver une vierge à sacrifier c'est pas simple, après faut réussir a le renvoyer dans son plan au bout d'un moment

Oui, ça résume bien le problème... je n'ai trouvé que ça pour l'instant

Dodormeur a écrit :
Mais sinon, qu'est ce que t'entend par fonction bloquantes exactement? n'importe quelle fonction, uniquement les fonctions de type getKey, ou autre chose?

Quand je vois cette question ou les autres que vous me posez des fois, je me rends compte que je dois être incompréhensible la plupart du temps sur ce topic.
Non que les questions ne soient pas pertinentes, mais c'est sûr que pour bosser dessus il faut que ce soit évident pour moi.

Pour lire le clavier, il faut passer par les ports A, B et M du microprocesseur. On envoie un signal sur le port B ou M, qui représentent les lignes (port B pour les lignes 1 à 7, port M pour les lignes 8 et 9) et on récupère les touches pressées pour la ligne en lisant le contenu du port A (le fonctionnement classique pour la gestion des claviers quoi).

Maintenant il y a deux « moments » pour le faire : le premier, c'est quand le programme utilisateur le décide : pour IsKeyDown() ou avec le démon, par exemple. Le seconde, c'est lorsque l'utilisateur appuie sur une touche : cela génère une interruption et on sait alors que l'on peut analyser les ports pour trouver laquelle.

La famille de fonction qui lit les ports au premier des deux moments évoqués est de type IsKeyDown()-0x24a. Elles sont instanées et renvoient leur résultat en lisant les ports. La famille de fonction qui utilise les interruptions est celle de GetKey(). Ces fonctions mettent le microprocesseur en veille avec l'instruction « sleep », et leur exécution s'arrête donc jusqu'à ce qu'une interruption réveille le processeur -sous certains critères. Une fois l'interruption traitée, la fonction continue et si l'interruption était bien du clavier (pas la RTC par exemple) elle s'arrête et renvoie la touche pressée après analyse des ports.

La deuxième famille de fonctions est préférable dans bien des cas parce qu'elle économise de la batterie. Cependant, la procédure d'analyse des ports est encore trop lente et perturbe le gris, parce que les interruptions lorsqu'on appuie sur une touche arrivent continuellement et en grande quantité.

Pour les traiter plus vite, je suis en train d'essayer de faire des optimisations, en particulier tester si on n'est pas sur une répétition de la dernière touche pressée. Pour l'instant, je n'arrive pas à mettre en oeuvre ce test mais j'y travaille. À noter qu'à la base, l'interruption clavier était de même niveau que le timer et prioritaire par défaut, donc quand on appuyait sur une touche le traitement du timer était mis en attente. Les interruptions arrivaient alors assez vite pour figer complètement l'écran sur une des deux images. Après réglage de la priorité, le gris continue mais est ralenti et ce phénomène suffit pour faire apparaître sur mon écran une ligne de rafraîchissement de 10 pixels de large très peu esthétique.

Donc l'idée était d'utiliser un démon tout en sachant que les fréquences du timer gris s'accorderait sur la perte de vitesse générée, mais c'est assez instable : en outre, ça dépend de la vitesse des machines.

Ah et, le contraste joue énormément sur l'aspect du gris. Donc je pense que le moteur le paramètrera lui-même, sans empêcher pour autant le programme utilisateur d'écraser cette configuration plus tard, mais histoire d'assurer un gris correct.

Ajouté le 28/07/2015 à 09:30 :
Lephenixnoir a écrit :
Pour les traiter plus vite, je suis en train d'essayer de faire des optimisations, en particulier tester si on n'est pas sur une répétition de la dernière touche pressée.

J'ai réussi à faire ça. Pour sûr ça perturbe moins le gris !

Par contre je suis formel, les interruptions du clavier sont générées en continu. Ce phénomène est généralement dû à un oubli dans l'interrupt handler : en effet, il y a souvent un bit dans un registre qui est mis à 1 lorsqu'une interruption est générée et qu'il faut remettre à 0 lorsqu'on traite l'interruption, sans quoi une nouvelle interruption est générée tout de suite, empêchant la reprise de l'exécution du programme utilisateur.

Cependant, là on ne travaille pas avec un module périphérique mais des pins spécifiques appelés PINT0 à PINT7 (il y en a 16 jusqu'à PINT15 au total) qui sont faits pour générer des interruptions (quand on envoie un signal ça génère une interruption, en l'occurrence si PINT0-PINT7 est différent de 0xff ; on retrouve ces valeurs dans le port A donc si vous avez bien suivi l'interruption est envoyée quand une des colonnes a une touche pressée). Et comme ce n'est pas un module périphérique, je ne vois aucun registre ou autre dans lequel un bit serait à effacer. De plus, les interruptions PINT ne sont documentées que sur une dizaine de lignes dans le documentation donc je n'ai pas plus d'informations.

Ajouté le 28/07/2015 à 12:03 :
Bon, c'est bizarre mais je n'arrive à utiliser que le timer 0... quoi que je fasse, les 1 et 2 provoquent des erreurs... c'est bizarre mais toute la configuration que je peux y faire ne change rien...

Ajouté le 28/07/2015 à 12:11 :
Ah, voilà, problème corrigé. C'était bête, je ne comprenais pas pourquoi j'avais une System ERROR de type INTERRUPT quand j'appuyais sur une touche, mais c'était simplement parce que je quittais le programme (quand j'avais une touche je quittais) sans arrêter les timers.
Pour le 0 ça fonctionnait, je sais pas trop pourquoi.

Ajouté le 31/07/2015 à 22:34 :
Ma gestion du clavier est maintenant complète !
C'est pour SH3, j'invite tout ceux qui le peuvent à prendre un quart d'heure pour me confirmer que ça marche bien sur leurs machines : Int. testing

J'ai plein de bonne nouvelles !
→ Le clavier fonctionne (c'est déjà ça !).
→ La gestion des répétitions est parfaite et full-featured : moyennant quelques modifications, on pourra paramétrer la répétition plus rapide de n'importe quelle touche.
→ Rester appuyé sur une touche ne bloque plus le programme utilisateur (important xD ).
→ Le portage sur SH4 ne nécessitera que la gestion des timers (y'a un syscall derrière ) !
→ Le gris n'est plus du tout altéré par le clavier.

Avec ça, le projet avance vite, très vite !

Ajouté le 02/08/2015 à 22:55 :
Quelques nouvelles rapides, je passe en coup de vent : j'ai pas mal avancé le moteur, documenté et nettoyé le code, je passe progressivement d'une API expérimentale à un truc fonctionnel. Dans quelque réglages je m'attaques aux libs de dessin et à leurs trésors d'optimisation.

J'ai mis à jour tout le topic pour plus d'explications, n'hésitez pas à le relire si vous ne comprenez pas forcément le principe du projet et que avez un peu de temps.

Voilà voilà, le clavier se gère bien (avec des define etc.), je vais pouvoir gérer SHIFT facilement, ALPHA non mais on verra en temps voulu.

Le gris aussi est bien, le clavier ne le perturbe pas du tout donc le rendu est très sympa ! Je peux déjà commencer à coder simplement des applications fonctionnelles avec gestion du clavier et de l'écran.
----------------------------------
Rise.
Ninestars
Hors ligne
Membre
Points: 2129
Défis: 22
Message
Citer : Posté le 03/08/2015 01:36 | #
D'accord ! En fait tu refais totalement le gestionnaire d'interruption !
Et il est où "physiquement" ce gestionnaire ? Il est dans la ROM, et toi tu vas écrire par dessus comme tu connais son adresse c'est ça ? Comment ça se fait que ce gestionnaire ne soit pas écrit dans l'OS ? (C'est peut être le cas je n'en sais rien )
----------------------------------
Lephenixnoir
Hors ligne
Administrateur
Points: 13150
Défis: 136
Message
Citer : Posté le 03/08/2015 09:48 | #
Ninestars a écrit :
D'accord ! En fait tu refais totalement le gestionnaire d'interruption !

Yep

Ninestars a écrit :
Et il est où "physiquement" ce gestionnaire ? Il est dans la ROM, et toi tu vas écrire par dessus comme tu connais son adresse c'est ça ? Comment ça se fait que ce gestionnaire ne soit pas écrit dans l'OS ? (C'est peut être le cas je n'en sais rien )

À vbr + 0x600, donc il suffit de changer l'adresse dans le registre vbr : c'est pratique
----------------------------------
Rise.
Silaxe
Hors ligne
Membre
Points: 809
Défis: 12
Message
Citer : Posté le 03/08/2015 18:39 | #
Si le projet vous intéresse, vous pouvez télécharger l'add-in de test et me dire s'il fonctionne bien sur votre machine, ou chercher des nouvelles valeurs pour le moteur de gris.
C'est juste pour SH3 j'imagine ?
Les explications du projet sont très claires, j'ai pratiquement tout compris alors qu'avant c'était un peu flou .
Je me rend compte de la complexité du projet. Tu dois être un "as" de l'assembleur maintenant.
Encore une question : La ROM n'est pas protégée ?


Ajouté le 03/08/2015 à 18:40 :
Dommage de ne pas détenir une SH3 pour les tests .
----------------------------------
Dark storm
Hors ligne
Membre d'honneur
Points: 10691
Défis: 174
Message
Citer : Posté le 05/08/2015 22:57 | #
Sans trop me mouiller, je dirais que la ROM est protégée : on ne peut pas écrire sur l'OS (et heureusement d'ailleurs), mais étant donné que ce dernier est presque entièrement chargé en RAM, on peut modifier cette dernière sans altérer le système. C'est d'ailleurs comme ça que fonctionne FiXos (changement d'OS directement dans la RAM, rien n'est touché dans la ROM).

Sinon, excellent boulot Lephe, tu redonnes une seconde vie aux caltos monochrome.
----------------------------------
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Páranÿe quetë Quendya
-florian66-
Hors ligne
Ancien rédacteur
Points: 2296
Défis: 19
Message
Citer : Posté le 06/08/2015 08:31 | #
Tu est entrain de dire que FiXos ne change pas l'OS présent dans la ROM mais change seulement ce qui est dans la RAM ? Pourquoi ne pas ne pas avoir les deux en même temps

@lephé : super boulot je voudrais quand tu auras fini avec ces interruptions que tu me passe ce code et si tu peux, me le commenter
----------------------------------
In Arch, I trust ! And you ?
Dark storm
Hors ligne
Membre d'honneur
Points: 10691
Défis: 174
Message
Citer : Posté le 06/08/2015 14:38 | #
-florian66- a écrit :
Tu est entrain de dire que FiXos ne change pas l'OS présent dans la ROM mais change seulement ce qui est dans la RAM ? Pourquoi ne pas ne pas avoir les deux en même temps

Parce que FiXos n'est pas forcément stable et nécessite un restart pour redémarrer la calto. Et puis le bootloader ne s'exécute pas au lancement de la machine. Donc bon, on évite de trop toucher à l'OS de Casio si on veut garder sa caltoche
----------------------------------
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Páranÿe quetë Quendya
Lephenixnoir
Hors ligne
Administrateur
Points: 13150
Défis: 136
Message
Citer : Posté le 18/08/2015 21:17 | #
Silaxe a écrit :
Si le projet vous intéresse, vous pouvez télécharger l'add-in de test et me dire s'il fonctionne bien sur votre machine, ou chercher des nouvelles valeurs pour le moteur de gris.
C'est juste pour SH3 j'imagine ?
Les explications du projet sont très claires, j'ai pratiquement tout compris alors qu'avant c'était un peu flou .
Je me rend compte de la complexité du projet. Tu dois être un "as" de l'assembleur maintenant.

Oui, c'est que pour SH3, mais le port sur SH4 ne nécessite que le timer, que j'aurai avec la doc... pour l'instant je ne sais pas quel est le MPU : les sites casio donnent le sh7305 mais il n'existe pas (?) et aucun de ceux cités dans la bible de teamfx n'est le bon.
En asm, je commence à m'y connaître, ouais...

Silaxe a écrit :
Encore une question : La ROM n'est pas protégée ?

Si. Déjà, il faut que l'adresse pointe dans la mémoire physique, et l'accès n'est pas évident. Basiquement, on peut lire dans la rom de la même manière que dans la ram. Pour l'écriture, ça varie en fonction des espaces (user P0 ou protected P1-P4) et de ce que le système autorise. De plus, je pense que l'écriture directe dans le système de fichier est réglementée par le système (enfin... je me comprends).
Si ça t'intéresse, lis la section 3 (MMU) de la doc du sh7705, tu y trouveras des infos sur les espaces et l'adressage en mémoire physique.

Silaxe a écrit :
Dommage de ne pas détenir une SH3 pour les tests .

Je fais de mon mieux pour le porter sur SH4 au plus vite !

Dark storm a écrit :
Sinon, excellent boulot Lephe, tu redonnes une seconde vie aux caltos monochrome.

J'irai pas jusque-là mais ça fait plaisir de voir que ça fonctionne.

Photo en prime (désolé Darks, rien de nouveau pour toi) ! (le tileset est home made)


-florian66- a écrit :
@lephé : super boulot je voudrais quand tu auras fini avec ces interruptions que tu me passe ce code et si tu peux, me le commenter

Il est commenté, mais bon faut connaître un peu aussi hein

Ajouté le 18/08/2015 à 21:18 :
Infos intéressantes sur l'avancement du projet :
Ce que j'ai fait d'intéressant pendant cette quinzaine :

- Character maps. Elles vont avec la fonction keyboard_char() qui renvoie le caractère associé à l'id de touche passé en paramètre en utilisant une character map, soit CHARMAP_FLAT (pression basique) soit CHARMAP_ALPHA (alpha activé). Par exemple, keyboard_char(KEY_7, CHARMAP_FLAT) = '7' et keyboard_char(KEY_7, CHARMAP_ALPHA) = 'M'. Cette implémentation est rapide et à vitesse (presque) constante donc n'hésitez pas à en abuser pour limiter les cascades de tests quand vous faites du user input !

- Une bonne valeur de gris. Enfin... ça dépend. Il s'agit 3200, 3700. Elle est assez propre (je ne trouve pas le léger clignotement gênant) et d'une très grande stabilité, sans le moindre clignotement ponctuel ni ligne de rafraîchissement ! Avec une palette assez large pour distinguer le gris foncé du noir er le gris clair du blanc, c'est à mon goût la meilleure que j'aie essayée. Cependant, l'effet quand on lance le moteur varie d'un coup sur l'autre et est souvent bien moche. En fait, ça ne fonctionne quasiment que quand je règle manuellement le moteur à 3200, 4300 avant de le redescendre à 3200, 3700. C'est très curieux... d'ici à ce que je comprenne le phénomène, le couple 3200, 4100 a un rendu très correct, qui, utilisé sur des petites images (tilesets) a un rendu très propre qui suffit à mon avis pour la plupart des applications !

- Une fonction de gestion plus poussée du clavier : getkey_opt(). Elle étend getkey() et vous pouvez la considérer comme l'équivalent de GetKeyWait(). Bon, juste que pour l'instant on ne peut pas mettre de délai. Voilà la liste des options disponibles, au moins il y en a des nouvelles qu'on ne pouvait pas réaliser avec fxlib !
- Getkey_NoOption : il faut bien que je cite toutes les valeurs de l'enum...
- Getkey_ReturnOnRelease : la fonction s'arrête aussi lorsqu'aucune touche n'est pressée (utile pour détecter les relâchements). La gestion des répétitions est conservée.
- Getkey_RepeatAllKeys : une fonctionnalité qui permet de répéter toutes les touches (je verrai plus tard pour les répéter individuellement).
- Getkey_AllowAllRepeats : ordinairement, seule une répétition sur quatre est autorisée (les répétitions sont trop rapides sinon), et parmi celles-ci les deux premières sont encores ignorées pour laisser un délai plus important la première fois. Cette option permet d'autoriser toutes les répétitions, et renvoie donc des évènements quatre fois plus vite que d'habitude, si vraiment vous avez besoin d'une sensibilité temporelle élevée.
Au passage, getkey() est un pur getkey_opt(0) bien tassé.
----------------------------------
Rise.
Dark storm
Hors ligne
Membre d'honneur
Points: 10691
Défis: 174
Message
Citer : Posté le 18/08/2015 21:56 | #
Ayant vu le gris IRL, je peux vous dire que c'est encore mieux que sur la photo — qui présente deux gris quasi identique — pour un rendu vraiment sympa

Sinon, au niveau du clavier, je pense qu'il faudra un exemple, je te suis de moins en moins x)
----------------------------------
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Páranÿe quetë Quendya
Lephenixnoir
Hors ligne
Administrateur
Points: 13150
Défis: 136
Message
Citer : Posté le 18/08/2015 22:02 | #
Dark storm a écrit :
Sinon, au niveau du clavier, je pense qu'il faudra un exemple, je te suis de moins en moins x)

→ Le timer vérifie régulièrement si une touche est pressée
→ Chaque fois qu'une touche est pressée, ça génère une répétition de fréquence f0 = fréquence du timer.
f0 est trop rapide pour un programme. Donc le moteur répète getkey() tous les f1 = f0 / 4.
→ Getkey() est répété tous les f1.
→ Additionnellement, les deux premiers f1 sont ignorés (le délai avant la première répétition de la touche est plus grand normalement).

GetKey_RepeatAllKeys permet de répéter toutes les touches, plus seulement les directionnelles, quelle que soit la fréquence de répétition de GetKey().
GetKey_AllowAllRepeats permet de répéter GetKey() tous les f0, au lieu de f1, quelles que soient les touches répétées.

Ajouté le 18/08/2015 à 22:03 :
Ah oui, j'ai ajouté un paragraphe « en bref » au début, parce que ça fait beaucoup à lire sinon. x)
----------------------------------
Rise.
Dark storm
Hors ligne
Membre d'honneur
Points: 10691
Défis: 174
Message
Citer : Posté le 18/08/2015 22:10 | #
Je vois un peu mieux. Je ferai quand même des exemples d'applications propres

Ajouté le 18/08/2015 à 22:16 :
Je viens de relire la description, c'est vachement bien vulgarisé
----------------------------------
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Páranÿe quetë Quendya
Lephenixnoir
Hors ligne
Administrateur
Points: 13150
Défis: 136
Message
Citer : Posté le 18/08/2015 22:16 | #
Dark storm a écrit :
Je viens de relire la description, c'est vachement bien vulgarisé

Ah, merci ! Ça fait plaisir à entendre.
----------------------------------
Rise.
Theernest570
Hors ligne
Membre
Points: 64
Défis: 5
Message
Citer : Posté le 21/08/2015 12:55 | #
Raah ! J'ai tellement d'idées de jeux en ce moment mais je ne veut pas les commencer car j'arrête pas de me dire que ça serait 10 fois mieux avec les niveaux de gris
-> Pense tu qu'un programme normal avec des graphismes réalisés avec la fxlib (ou MonochromeLib) pourra facilement être modifié pour ajouter les niveaux de gris et la gestion des controls ?

En tous cas, Bravo ta photo postée plus haut me fait rêver !
----------------------------------
Calto : Graph 35+(tweaké)
Projets
Fermer

- Un pong multijoueur avec le cable 3pin
- Communication IR entre caltos (Arduino)
Lephenixnoir
Hors ligne
Administrateur
Points: 13150
Défis: 136
Message
Citer : Posté le 21/08/2015 14:27 | #
Theernest570 a écrit :
Raah ! J'ai tellement d'idées de jeux en ce moment mais je ne veut pas les commencer car j'arrête pas de me dire que ça serait 10 fois mieux avec les niveaux de gris

N'hésite pas, le monochrome a aussi un certain charme

Theernest570 a écrit :
-> Pense tu qu'un programme normal avec des graphismes réalisés avec la fxlib (ou MonochromeLib) pourra facilement être modifié pour ajouter les niveaux de gris et la gestion des controls ?

Tout est différent avec cette lib (qui servira de base au fxSDK).
Pour le contrôles, il « suffira » de remplacer entre autres « GetKey(&key); » par « key = getkey(); » et les identifiants de touches, comme « KEY_CTRL_EXIT » par « KEY_EXIT ». Les touches plus complexes ne sont pas encore gérées, notamment avec SHIFT et ALPHA. Je pourrai implémenter les deux plus tard.

Pour le dessin, c'est plus difficile. De nombreuses fonctions existeront avec des paramètres similaires, que ce soit ML_line(), Bdisp_DrawLineVRAM() ou dline(), mais je ne pense pas que ma gestion des couleurs sera aussi poussée que celle de PLL -- enfin, pas pour tout de suite en tous cas. Les bitmaps seront un peu différents, il faudra s'adapter sur ce plan-là -- enfin, surtout les images en gris en fait.

Pour le reste, pas de trucs extraordinaires, c'est surtout l'API qui change et pas trop le principe. Ah, si : plus de Print() et autres de la famille de fxlib, mais la libfont que j'ai implémentée. J'ai quelques fonctions qui rendent exactement le même résultat donc pas de quoi s'en faire plus que ça -- juste 700-900 octets en plus dans le programme, et les caractères spéciaux malheureusement.

Theernest570 a écrit :
En tous cas, Bravo ta photo postée plus haut me fait rêver !

Je pense pouvoir faire mieux, tant au niveau de la stabilité du gris que des graphismes en eux-mêmes (là, j'essaie des tests sur un tileset 16x16 qui exploite complètement les quatres couleurs pour faire des textures : cependant, le gris manque à mon goût de stabilité pour permettre de l'exploiter tel quel).
----------------------------------
Rise.
Dark storm
Hors ligne
Membre d'honneur
Points: 10691
Défis: 174
Message
Citer : Posté le 21/08/2015 17:34 | #
Au niveau des bitmaps, tu comptes les stocker directement en 2-bits c'est ça ? Ce qui laisse quand même une seule déclaration par bitmap. (Ce qui n'est pas le cas actuellement avec le moteur de Kucalc)
Ou alors (vu que le moteur sera presque une exclusivité du fxSDK ) tu comptes utiliser les fichiers liés ?
----------------------------------
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Páranÿe quetë Quendya
Ninestars
Hors ligne
Membre
Points: 2129
Défis: 22
Message
Citer : Posté le 21/08/2015 17:43 | #
C'est vrai tu gères comment les bitmaps ?
Tu fais 4 vram classiques, une pour chaque couleur, ou tu fais une vram où un pixel c'est codé sur deux bits ?
----------------------------------
-florian66-
Hors ligne
Ancien rédacteur
Points: 2296
Défis: 19
Message
Citer : Posté le 21/08/2015 18:01 | #
Pour du 4 niveau de gris il faut que 2 images
----------------------------------
In Arch, I trust ! And you ?

Pages: Précédente | 1, 2, 3, 4, 5, 6, 7, 8, ... 14 | Suivante

Index du Forum > Projets de programmation > gint : un environnement de développement d'add-ins

Planète Casio v42 © créé par Neuronix et Muelsaco 2004 - 2018 | Il y a 17 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire indépendant, géré bénévolement et n'est donc pas affilié à Casio | Toute reproduction de Planète Casio, même partielle, est interdite
Les fichiers, programmes et autres publications présents sur Planète Casio restent la propriété de leurs auteurs respectifs et peuvent être soumis à des licences ou des copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd