Planète Casio - Projets de programmation - Flux RSS http://www.planet-casio.com Programmes Casio, Jeux, Cours pour Calculatrices Casio fr-FR https://www.planet-casio.com/images/logo.gif Planète Casio - Projets de programmation - Flux RSS http://www.planet-casio.com 55 50 Programmes Casio, Jeux, Cours pour Calculatrices Casio. Wed, 29 Nov 2023 11:33:50 GMT Wed, 29 Nov 2023 11:33:50 GMT contact@planet-casio.com (Planet Casio) contact@planet-casio.com (Planet Casio) 5 cBox2D : la librairie de physique de corps rigides Box2D enfin sur votre Casio https://www.planet-casio.com/Fr/forums/topic17545--.html Hello tout le monde, un petit message pour vous informer du portage entre de 2 avions de la librairie Box2D dans sa version 2.4.1 (la dernière à l'heure où j'écris ce texte) sur vos machines préférées. La librairie se trouve sous forme d'un dépot giteapc et est installable via un simple : giteapc install Slyvtt/cBox2D Le dépôt correspondant se trouve ici cBox2D sur le Gitea de PC. Vous trouverez aussi un petit exemple d'application qui ne fait rien de merveilleux, si ce n'est reprendre l'exemple "Hello Box2D" de la documentation de Box2D et de la faire tourner sur fxCG50. Tout ceci se trouve dans le dépôt ici cBox2D_App sur le Gitea de PC. Cet Addin fonctionne parfaitement comme le montre la capture suivante : cBox2D_App.png Cet exemple provient de la documentation de Box2D disponible ici https://box2d.org/documentation/index.html. On retrouve en particulier bien les valeurs attendues (en filtrant une valeur sur 5 sur fxCG50) : 0.00 4.00 0.00 0.00 3.99 0.00 0.00 3.98 0.00 ... 0.00 1.25 0.00 0.00 1.13 0.00 0.00 1.01 0.00 Attention tout de même, même si à première vue la librairie semble bien fonctionner, ayant ajouté ce qui était nécessaire pour que tout tourne correctement sur la fxCG50 et la fx9860G, il faut prendre néanmoins en compte 2 ou 3 petites choses : - la librairie est assez grosse, 420ko, donc il vaut peut être mieux préférer un usage sur prizm que sur monochrome - les calculs sont sur base de floats, donc attention aux performances si les calculs deviennent nombreux (*) - la librairie n'a pas été testée en long, en large et en travers, donc bug possible (**) - la librairie est en C++, donc bien mettre le support du C++ et de la librairie standard C++ dans les prérequis de vos addins (cf l'exemple d'applicaiton) (*) Si le besoin s'en fait sentir et qu'il y a de la demande, on pourrait la convertir en arithmétique point fixe, mais on perdra de la philosophie initiale consistant à utiliser la librairie originale sans trop de modification pour sur les updates facilement. (**) si bug, faire remonter ici sur via une PR sur le dépôt Gitea. Amusez-vous bien. Et @RDP, ça fait longtemps que j'ai pas écrit cela. Tue, 28 Nov 2023 02:55:18 +0100 jeux de la pastéque https://www.planet-casio.com/Fr/forums/topic17543--.html Bonjours, j'ai pour habitude de jouer sur ma calculatrice mais je suis incapable de programmer un jeux c'est pourquoi je vous demande si il est possible de crée le jeux de la pastèques qui est en se moment tendance Sun, 26 Nov 2023 01:09:21 +0100 Casio Dev Tools : Bientôt une release ? https://www.planet-casio.com/Fr/forums/topic17539--.html Bien le bonjour, Premièrement, un petit rappel : Casio Dev Tools est une extension à ajouter dans son éditeur VS code et qui permet d'automatiser un grand nombre d'actions embêtantes à faire quand on programme avec le FxSDK (je ne critique pas le FxSDK :lol: ). Pour en savoir plus, vous pouvez vous rendre sur la page du projet. J'ai merge hier la branche "emulator_and_transfert" (oui, je sais, je suis doué en nom pour les branche :lol: ) sur main, ce qui veut dire que la dernière feature de Casio Dev Tools (CDT) prévue est finie ! Je peux donc maintenant me permettre de sortir une version 1.0. Mais pour cela, il me faudrait un maximum de retours pour essayer de régler (presque) tous les bugs présents. Donc si mon extension vous intéresse, je vous invite vivement à l'essayer :D . Mais quelles sont les nouveautés pour la v 0.3.2 ? Et bien j'ai ajouté le lancement de l'émulateur de Graph 90+e de Circuit10 et le transfert de l'Add-in fraichement compilé directement sur la calculatrice branchée (Graph 90+e ou Graph 35+e II). Il y a aussi la possibilité de transférer l'add-in avec Add-in push de Circuit10 permettant de le lancer automatiquement (pour l'instant, uniquement disponible sur Linux). CDT devrait fonctionner avec des graph 90+e et des graph 35+e II et leurs équivalents internationaux (les autres calculatrices supportées par le FxSDK devraient aussi fonctionner mais je ne garantie rien). Les OS supportés sont Windows (nécessite WSL 2 d'installé) et Linux (Testé sur Ubuntu et Debian). Mais il n'y a aucunes garanties que cela fonctionne à 100 % (Soyez indulgents sur les bugs c'est super dur de supporter autant de plateformes :'( ) Si vous avez des idées de features ou que vous rencontrez des bugs, vous pouvez ouvrir une issue sur le repo github ou mettre un commentaire ci dessous ou en commentaire du programme. En espèrent que CDT vous soit utile, à bientôt ^^ @RDP Tue, 21 Nov 2023 19:32:00 +0100 fxSDK / Gint "extension" to support fx-CP400/500(+E) - Utopia or Not ? https://www.planet-casio.com/Fr/forums/topic17538--.html Hi Guys, following the upload of CPBoy on Planete Casio, a program working with the Hollyhock-II hook and considering that the base architecture of fx-CP400/500 is very similar to what we can find either on fx-CG50/Graph90+E or on Prizms (fxCG10/20), it is maybe achievable to extend the scope of the fxSDK/gint to support this machine. For sure there is a strong interest in creating links with the ClassPadNet Team to share experience and knowhow. From a technical point of view, ClassPad is running on a SH4 also (SH7305), so many stuff can be directly reused. There are some parts that are actually different (screen with touchscreen capabitlities, memory, keyboard) from the usual Graph (Mono or Color). Specific drivers would then be certainly required for these elements. Would some of you interested in checking what is available or not and what would be the amount of energy needed to put on the project to add full support of FXCP ? Today, Addins are not supported officially, so third parties programs (Homebrews) are launched through a Hook. We need to compile a bin that is loaded into memory by the hook and launched. This is close to what is currently done on fxCGs with the "Addin Push". Please let us know in the comment section if you are interested in working on this. Many additionnal information can be found here : ClassPadNet Tue, 21 Nov 2023 09:46:19 +0100 Casio Tiles https://www.planet-casio.com/Fr/forums/topic17526--.html Programmation du jeu en C pour l'instant j'ai fait le menu mais je ne sais pas comment faire clignoter une image comme sur les jeu game boy ou ds ou il y a "marqué press A to start!" Le jeu se jouera avec les touches f1 a f6 et a l'horizontale car c pas pratique a la verticale même si ce serai mieux jeu sortira d'abord sur prizm puis sur monochrome. C'est mon premier projet voici comment j'ai tente de faire clignoter l'image mais ca n'a pas marché while (key != KEY_SHIFT) { dupdate(); dimage(94,165,&PressShiftToStartImg); dupdate(); key = getkey().key; dclear(C_WHITE); dimage(125, 25, &MainMenuTitleImg); dupdate(); key = getkey().key; } Fri, 17 Nov 2023 20:36:42 +0100 Extraction automatique des instructions du CPU SH4 https://www.planet-casio.com/Fr/forums/topic17523--.html Partie 1 - Extraction Je suis actuellement en train de bosser sur la création d'un émulateur pour casio monochrome 35+/75, et je réfléchissais en parallèle à une façon d'extraire automatiquement les instructions de la doc. En effet, il y a des centaines d'instructions, et bien que j'aie implémenté les 27 premières manuellement pour comprendre leur fonctionnement, cela commençait à devenir long et redondant. Je pense avoir désormais compris la base nécessaire pour mettre en place une technique qui le fait à ma place. Je vais expliquer ici comment je m'y suis pris, sachant que tout le code javascript est disponible dans le repo du projet dans le dossier "script". La toute première étape consiste à extraire les informations de la doc officielle du CPU SH4 dans un format qui peut être lu par un algorithme. Il existe des bibliothèques qui permettent de lire des PDFs via du code, mais la toute première chose que j'ai tenté de faire est un bête copié/collé (ctrl+a, ctrl+c, ctrl+v) de tout le pdf dans un fichier texte. Les seuls critères étant que les mots devaient apparaître dans l'ordre dans lequel ils apparaissent dans le pdf, c'est-à-dire de gauche à droite puis de haut en bas (ce qui n'est pas garanti avec ce genre de copié/collé bourrin). Heureusement, le document semble bien formaté (enfin presque, on verra pourquoi après), et je peux donc me servir de cette base pour en extraire les informations, il s'agit du fichier raw_instructions.txt. Ensuite, il faut analyser le pdf et essayer de trouver un pattern qui permettrait d'extraire toutes les instructions. Il y a un gros bloc au début qui contient toutes les instructions à la suite ainsi que leur code, ça avait l'air prometteur, mais leur implémentation ne se situe que bien plus tard dans le document, et pas dans le même ordre, donc il fallait trouver autre chose : https://images2.imgbox.com/91/cc/jlhZvq3J_o.png Il y a un deuxième endroit où ces instructions apparaissent, c'est juste avant leur implémentation vers la fin du document, mais elles sont séparées en plusieurs groupes. Pour chaque groupe, il y a d'abord un tableau contenant les informations sur les instructions, toutes à la suite, et un peu plus tard leur implémentation, cette fois-ci dans le même ordre que le tableau ! Ce genre de pattern (tableau + implémentations) est répété plusieurs fois à la suite pour couvrir toutes les instructions. Ce sera le départ de mon algorithme ! https://images2.imgbox.com/db/52/2cJc18Sa_o.png Le principe va être de charger le fichier texte en tant que chaîne de caractères, et d'effectuer plein d'opérations dessus (découpage, recherche, trim) pour en isoler certaines parties et en extraire des informations. Le code de cette partie est situé dans le fichier extract_instructions.js. La première étape est donc d'isoler chacun de ces groupes d'instructions (appelés instruction set dans mon code). Il s'agit de la fonction extractNextInstructionSet() dans mon code. Pour cela, je calcule la position du mot-clé "T Bit" qui représente la fin du header du tableau et donc le début de la toute première instruction (voir image ci-dessus). De façon similaire, je calcule la position de "Format Operation" qui représente le début du prochain tableau, et donc la fin de ce groupe d'instructions Cela nous donne un tableau de plusieurs chaînes de caractères, contenant chacune un groupe d'instruction avec leur définition et leur implémentation. Pour chacune de ces chaînes, deux algorithmes sont nécessaires : - extractInstructions() : Tout d'abord, je dois déterminer le nombre d'instructions présentes dans ce groupe. Pour cela, je vais utiliser des expressions régulières (Regexp), un outil très puissant pour chercher des patterns très spécifiques dans des chaînes de caractères. Et ici, on a un pattern qui saute aux yeux, le code de chaque instruction est toujours composé de 16 caractères avec des lettres minuscules ou des 0 ou 1. Le cas de figure parfait pour du regex ! Voici le regex qui permet d'isoler ces instructions : const matches = input_str.match(/[01imnd]{16}/gm) // Match tokens like 0100nnnnmmmm1100, 1010dddddddddddd or 0000000000001011 Ici, le regex est /[01imnd]{16}/, qui signifie "cherche une chaîne de 16 caractères de long contenant uniquement des caractères dans cet ensemble : {0, 1, i, m, n, d}". gm sont deux attributs qui veulent dire (g)lobal - cherche TOUTES les occurrences, (m)ultiline - cherche sur plusieurs lignes. Cela me permet d'isoler chacune des instructions en découpant la chaîne à l'emplacement de ces codes. Puis pour extraire la famille de l'instruction, j'utilise le regex suivant : const name = str.match(/[A-Z.01268\/]{2,}/)[0] // Match tokens like JSR, LDRS, MOV.L, DIV0S, CMP/EQ Je peux aussi isoler la description de l'instruction, elle se trouve simplement entre la famille et le code. Cette fonction retourne un tableau d’éléments de la sorte: { code: '0000nnnnmmmm1110', desc: '@(R0,Rm),Rn', family: 'MOV.L' }, { code: '1110nnnniiiiiiii', desc: '#imm,Rn', family: 'MOV' }, ... - extractImplementations() : La fonction précédente retourne un tableau contenant pour chaque instruction sa famille, sa description et son code. Maintenant, il faut relier ces instructions à leur implémentations. Le nom de fonction de chaque instruction n'est indiqué nulle part autre que lors de l'implémentation, donc il n'est pas possible de faire une simple recherche pour isoler la fonction correspondante à une instruction. Heureusement, les implémentations sont toutes dans le même ordre que celui du tableau, donc il suffit juste de les lire une par une et de les associer à l'instruction correspondante, dans l'ordre. J'ai remarqué que toutes les implémentations se situent dans une section qui commence par "Operations:", donc je peux déjà couper la chaîne jusqu'à cet endroit pour simplifier les choses. Ensuite, il faut savoir que le regex permet de créer des groupes de recherche, et ainsi retourner plusieurs matchs correspondants à plusieurs groupes. Ma toute première tentative était de créer un regex qui isole ces quatre groupes : FUNCTION_NAME (OPERANDS) /* DESCRIPTION /* { IMPLEMENTATION } Cela marchait presque bien, mais j'avais des difficultés à détecter la fin du groupe "IMPLEMENTATION", car je me basais sur le caractère "}", mais dans le cas d'un bloc imbriqué (un if { } par exemple) cela coupait la fonction trop tôt. Du coup j'ai modifié un peu les choses pour seulement détecter les 3 premiers groupes. Et ensuite j'utilise un petit algorithme javascript (findLastFunctionBracket()) qui démarre de la fin du dernier groupe (donc juste avant l'implémentation) et calcule la position de l'accolade fermante de la fonction. Voici le regex, celui-ci est un peu satanique je n'expliquerai pas les détails :E const matches = input_str.matchAll(/\n {0,1}([A-Znm_012468]{2,}) {0,1}(\([^)]*\))[^\/]*(\/*.*\/)/gm) // Utilisation: for (let [_, name, operands, desc] of matches) { Cet algorithme permet donc d'extraire le nom de la fonction, ses arguments, sa description (redondante) et surtout tout le code de son implémentation ! Je peux combiner ces infos avec celles précédentes (la famille et le code de l'instruction) de façon à créer un objet complet et utile informatif sur chacune des instructions : { "code": "0011nnnnmmmm1100", "desc": "Rm,Rn", "family": "ADD", "name": "ADD", "operands": "(long m, long n)", "implementation": "ADD(long m, long n) /* ADD Rm,Rn */\r\n{\r\n R += R;\r\n PC += 2;\r\n}" }, Après avoir effectué ce processus pour toutes les instructions de tous les instruction sets, je peux sauvegarder ces informations sous un format .json (instructions.json) qui contient les memes informations que le fichier original raw.txt, mais dans un format bien plus pratique pour la suite de l'implémentation ! Il y a juste un détail à prendre en compte: Heureusement, le document semble bien formaté (enfin presque, on verra pourquoi après) En fait, ma technique ne marche que pour la moitié du document environ. La seconde moitié des instructions sont liées au DSP (de ce que j'ai compris c'est une unité pour faire des opérations avec des doubles ou fixed-point). Pour une raison quelconque, bien que le format soit exactement le même pour les instructions DSP et non DSP dans le PDF, ma technique de copier/coller tout le document ne fonctionne plus car certains tableaux relatifs aux instructions DSP apparaissent désormais par colonne et non par rangée dans le fichier texte. Le SDK Casio de base n'utilise jamais ces instructions, cependant gint le fait. Donc je me pencherai sur cette seconde partie plus tard, mon algorithme peut être légèrement réarrangé pour pouvoir gérer ce cas de figure! Sun, 12 Nov 2023 18:40:17 +0100 Steam pour les caltos https://www.planet-casio.com/Fr/forums/topic17514--.html Salut ! :D Aujourd'hui, j'ai eu une idée : interagir avec ma TI 83 Premium CE Python depuis mon PC en python ou en Batch (Windows). Mais... Ce n'est clairement pas de mon niveau. Il faut manipuler des drivers, et puis je ne sais pas du tout comment communiquer avec elle (elle n'est pas reconnue comme une clé USB comme la plupart des Casio récentes.). Du coup, je me suis tourné vers la même chose, mais sur une plateforme différente : la Graph 90+E (touche aussi aux Graphs 35, mais pour plus tard). Mon idée, c'est juste de créer une interface sympa et propre pour gérer ses jeux Graph 90+E (installer, peut être lancé les jeux, etc.). Vous n'y voyez peut-être pas l'utilité, mais c'est juste une idée que j'ai eue et je trouvai ça dommage de ne pas la partager ici. Un petit Screen Pour l'instant, je n'ai pas eu à coder grand-chose : ChatGPT a fait le plus gros. Oui, je suis un flemmard. Le code n'est donc pas terrible à l'œil, mais fait le taf. Donc voilà à quoi ça ressemble pour l'instant. https://www.planet-casio.com/storage/forums/Capture%20d'%C3%A9cran%202023-11-09%20095950-17514.png Bouton installer masqué car déjà installé dans la calculatrice Peut-être que ça mènera à quelque chose de sérieux, qui sait :D À plus ;) Thu, 09 Nov 2023 10:09:27 +0100 Emulateur fx-9860 SH4 https://www.planet-casio.com/Fr/forums/topic17509--.html Salut ! Update: L’émulateur est testable en ligne! N’hésitez pas a me signaler si vous rencontrez des problèmes ! https://sh4.vercel.app/ Je tente actuellement d'en apprendre davantage sur les étapes nécessaires à la création d'un émulateur pour les calculatrices Casio monochromes (type Graph 35+/75) SH4. Je suis tombé sur le projet d'IniKiwi qui est déjà bien avancé. Il peut émuler des add-ins écrits avec le SDK, mais ne gère pas encore les inputs: https://gitea.planet-casio.com/IniKiwi/nemu. Ce repo est très utile pour avoir un apercu de la structure d'un tel émulateur. Au vu de l'avancement du projet, je préfère repartir de zéro pour comprendre en détail le fonctionnement du code. Je n'ai que très peu de connaissances bas niveau et sur le fonctionnement interne des CPUs et le meilleur moyen de vraiment comprendre ce qu'il se passe est de tenter de l’implémenter par moi-même. C'est évidemment un projet assez gargantuesque, et je ne prévois pas de le terminer de sitôt, ni même de le terminer tout court. Mais je suis réellement intéressé par le défi! Voici ce que j'ai réussi à comprendre jusqu'à présent : Ce document décrit la structure d'un fichier G1A. On y apprend que le code d'un add-in commence à l'adresse 0x200 après un en-tête et s'étend jusqu'à la fin du fichier. C'est le point de départ de l'émulateur: extraire le code de l'add-in. Ensuite, il faut convertir ce code en instructions. Pour cela, on a besoin de la documentation superH (le CPU utilisé par les calculatrices SH4). Ce document nous indique que chaque instruction est codée sur 2 octets (16 bits) et contient la liste de 375 instructions, leur nom, leur fonction, leur encodage et leur implémentation. Super ! Il ne "reste plus qu'à" convertir chacune de ces instructions en code. Et pour cela il va falloir émuler les fonctionnalités du CPU. Je ne suis pas encore certain de tout ce qui est nécessaire en détail, mais pour mes premiers tests, j'ai isolé ces composants : - 16 registres généraux R0-R15 - PC (Program Counter), qui indique l'adresse de l'instruction à exécuter. Sauf cas spécial, cette variable augmente de 2 octets (une instruction) à la fin de chaque instruction. - Une "ROM" (read-only memory) qui sert de mémoire, dans laquelle on stocke le code initial. Voici la structure C d'un tel CPU: typedef struct { // General registers R0 - R15 int32_t r[16]; // System registers uint32_t pc; // Program counter // Memory uint8_t* rom; } cpu_t; Il manque encore un tas de choses. En lisant la doc il faudrait au moins ajouter tous ces registres: typedef struct{ // General registers int32_t r[16]; // R0 - R15 // Control registers uint32_t gbr; // Global base register uint32_t ssr; // Saved status register uint32_t spc; // Saved program counter uint32_t vbr; // Vector base register uint32_t sgr; // Saved general register 15 uint32_t dbr; // Debug base register // System registers uint32_t mach; // Multiply-accumulate high uint32_t macl; // Multiply-accumulate low uint32_t pr; // Procedure register uint32_t pc; // Program counter // + // A0, A1: 40-bit registers // A0G, A1G: Guard bits for A0, A1 // M0, M1, X0, X1, Y0, Y1: 32-bit registers // + VRAM // + inputs // + display // + timers } cpu_status_t; Mais chaque chose en son temps. Je fais mes tests à partir de l'add-in de base "Sample Add-in" du fxsdk. La toute première instruction de cet add-in est 0xD3 0x01 (1101001100000001), qui correspond selon la documentation à l'instruction MOV.L @(disp,PC), Rn. https://www.planet-casio.com/storage/forums/em4-17509.png Et là vient la première interrogation: cette instruction copie une valeur depuis la ROM vers un registre. Cependant, je ne suis pas certain de savoir comment initialiser le contenu de la ROM. Doit-on copier le code de l'add-in dans la ROM dès le début, initialiser PC à 0 et lire la première instruction ? Y a-t-il des décalages à prendre en compte ? Quelles sont les "subtilités" à savoir pour mener à bien cette première instruction? Voici l'implémentation actuelle de cette instruction: // MOV.L @(disp,PC), Rn - 1101nnnndddddddd void mov_l_disp_pc_rn(cpu_t* cpu, uint16_t instruction) { uint8_t rn = (instruction >> 8) & 0x0F; int8_t disp = instruction & 0xFF; int32_t addr = (int32_t)(disp << 2) + (cpu->pc & 0xFFFFFFFC) + 4; cpu->r = (int32_t)cpu->rom; cpu->pc += 2; } Je suis en train de créer un depot sur Gitea pour que ce soit plus simple d'accéder au code entier. Merci pour vos retours! Wed, 08 Nov 2023 01:03:07 +0100 PaintWorks un logiciel de dessin en Python sur Calculatrices Numworks https://www.planet-casio.com/Fr/forums/topic17482--.html Bonjour, La visibilité n'étant pas le fort du 'marketplace' de Numworks, je viens ici pour vous présenter mon dernier programme en Python : PaintWorks. :D Ce programme de 500 lignes a quasiment été tapé entièrement sur Calculatrice... 8-) . Il comprend un choix de 50 couleurs différentes, un outil pinceau et un outil remplissage. Il possède un système de chargement automatique des dessins et un système d'enregistrement manuel des dessins (Car on ne peut pas écrire (et techniquement lire) automatiquement dans le stockage :'( ). J'ai joins le fichier python en pièces jointes mais je vous conseille de le transférer directement depuis le site de Numworks : https://my.numworks.com/python/yannis300307/paintworks_v1_0 Dites moi ce que vous en pensez et dites moi aussi si vous avez des idées d’amélioration à faire (Mais ça va être très dur à implémenter car mon programme frôle la limite de taille des programmes... :mmm: ) Merci ! :D Sun, 29 Oct 2023 11:38:49 +0100 CAS from fx 2.0 plus to fx-9860g https://www.planet-casio.com/Fr/forums/topic17476--.html Dear all, please excuse me for not writing in French. I have recently rediscovered my casio calculators and decided to start using them again. I have both fx 2.0 plus and fx-9860g. The latter model has a better (bigger) screen (iho), which is why I like it more. Therefore, I was wondering if it is possible to transfer the CAS from fx 2.0 plus to fx-9860g. I recently used FA-124 to transfer some cool games from this forum on fx-9860g, hence the question : Has someone managed to port the CAS? I have two CAS versions on my fx-9860g, however, they are quite limited in comparison to the fx 2.0 plus. In particular, integration is a problem - either missing or limited to very simple expressions. Thank you in advance / Merci Beaucoup Alex Thu, 26 Oct 2023 12:05:59 +0200