[Prizm] - Interpréteur Chip8
Posté le 09/05/2014 19:17
Petit projet qui sera plutôt un projet à court terme, pas trop utile mais bon...
Hier, sur le chat j'avais évoqué "l'assembleur Chip8" sur HP-48 (une ancienne calculatrice), et je me suis souvenu d'un billet sur je ne sais plus quel blog qui évoquait cet assembleur en précisant que c'était une bonne base pour commencer à programmer quelque chose qui ressemblait à de l'émulation (techniquement, je me dis que c'est pas vraiment de l'émulation au sens premier du terme car c'est un langage interprété sur plusieurs types de machines, mais bon...
). J'ai donc commencé hier à programmer quelque chose qui serait capable de charger des programmes Chip8 et les exécuter sur la Prizm; c'était plus un défis personnel (je doute que beaucoup de gens ne s'amusent comme des fous avec un pong, quoique c'est plus intéressant qu'un plus ou moins de mon point de vue
) pour voir si j'étais capable de programmer efficacement uniquement à partir de doc plus ou moins technique (en fait, je n'ai utilisé que
ce site).
Finalement, c'était plutôt rapide car j'ai quasiment fait que du debug aujourd'hui, le gros a été écrit hier, et ça commence à être jouable. En fait, certains jeux ont des comportement non-prévus de temps en temps (du style score qui s'incrémente à moitié par exemple), mais je continue de debug (c'est pas la chose la plus simple/rapide car je désassemble la ROM et suit le déroulement du programme instruction par instruction pour localiser les instructions qui posent problème et dans quelle(s) condition(s)).
Je met ici un build absolument pas définitif, mais utilisable. L'interface est
austère inexistante (vous avez juste une sorte de console au début où vous devez écrire le nom de la ROM (e.g. pong.ch8) que vous aurez placé à la racine de la calto (sinon, vous pouvez taper le chemin folder\\pong.ch8 , mais la saisie n'est pas des plus pratique (et je viens de me rendre compte que l'antislash n'est pas accessible
... faut vraiment que je finisse mon fork de prizmio) ); pour quitter vous devez tapper "exit" puis appuyer sur [Menu](ou reset la calto
) et si jamais "help" vous redira en gros ce que je viens de dire). Une fois le nom tapé, le programme charge pendant quelques secondes et puis le jeu se lance. Les touches sont mal mappées (de 1 à 9 cela correspond au clavier normal 1->9, puis de A à F, c'est les touches F1 à F6), mais ça reste une version non définitive. Vous pouvez quitter en appuyant sur la touche [EXIT] puis [Menu]
L'interprétation n'est pas des plus rapide (mais égale la version Prizm déjà existante sur Cemetech), mais c'est un premier jet et j'ai plusieurs piste d'optimisation (notamment sur la gestion de l'affichage) ;).
Accessoirement, vous pouvez appuyer sur Shift ce qui fera passer le programme en mode debug, c'est à dire que cela ralentit le programme et affiche le "program-counter" (l'adresse de lecture actuelle des instructions) pour suivre l'évolution pas à pas de l'interprétation.
Enfin voila, je fais un premier commit sur un dépot git et je met le code online dans la soirée, ainsi qu'un ou deux screens (même si un pong c'est pas passionnant à voir) ;), en tout cas, c'est assez intéressant à faire, pas bien compliqué, mais ça me plaît bien, pourquoi pas envisager une fois que cela est fini (i.e. pas de suite), l'émulation de plateformes un peu plus intéressantes !
EDIT : Pitit(s) Screenshot(s)
Fichier joint
Citer : Posté le 09/05/2014 21:22 | #
Bravo je te soutient , beau projet
Zelda de Smashmaster
Super Geek Brothers de Siapran
Pac-Man
Pac-Man Color
Meta Ball
Add-ins Jetpack Joyride et Pac-Man sur PRIZM (les 2 non commencés mais en réflexion)
A la recherche des sprites jetpack Joride si quelqu'un les a en couleur
Citer : Posté le 09/05/2014 21:29 | #
Voila, le dépot git mis sur GitHub pour ceux que ça intéresse.
Le code est pas très propre, mais je vais entamer une petite phase de nettoyage que ce soit plus clair.
Sinon, il me semble assez compréhensible, juste pour ceux qui voudraient le compiler, les types uint8_t et uint16_t sont définis dans un stdint.h fait rapidement car je trouve que ça clarifie mieux le rôle des variables (quand je demande un unsigned char, je veux un nombre/caractère, mais quand je demande un uint8_t, je veux plutôt une variable de 8 bits, c'est la même chose, ma logique est peut être foireuse mais il me semble que c'est plus clair, et puis au pire, dites vous que c'est plus court :p...)
Si vous avez des idées/remarques pour améliorer/optimiser, vous gênez surtout pas .
Citer : Posté le 09/05/2014 21:37 | # | Fichier joint
Je me souviens, j'avais commencé un interpréteur chip8 en add-in il y a longtemps
Si tu veux, tu peux regarder un peut les sources, je te les mets en PJ
(par contre il n’était pas entièrement fonctionnel, la gestion des collisions ne marchait pas)
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
merci a tout le monde pour son soutien
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 !Citer : Posté le 09/05/2014 23:13 | #
La gestion des collisions ? Je vois pas trop de quoi tu parles ^^' ...
Sinon, je regarde ton code, peut être trouverai-je des idées pour optimiser un peu tout ça !
Citer : Posté le 11/05/2014 00:53 | # | Fichier joint
Donc, j'ai finalement localisé quelques bugs (le commit de fix se résume à deux variables inter-changées et à passer deux "<" en "<=" , rien de bien méchant, mais je suis pas très rapide au débugage ). Le code est toujours dispo et mis à jour sur le dépôt Github.
Donc, pour l'instant, je n'ai pas trouvé de jeux ne se lançant pas/ne fonctionnant pas sur l'interpréteur (faîtes attention à prendre des roms pour Chip8 et pas SuperChip8 (ou SChip8), le support viendra peut être plus tard), donc de ce point de vue là, il m'a l'air plutôt fonctionnel.
Maintenant, il faut optimiser
un peubeaucoup tout ça, et assouplir un peu la gestion de l'affichage et des timers pour les rendre plus fonctionnels.Je vous remets donc un build en pièce jointe et édite rapidement le post principal pour mettre un ou deux screens.
EDIT : J'vous en ai même mis trois dans le premier post bande de veinards : une de pong, une de blinky (une sorte de pacman) et la troisième... je sais pas trop (c'est quand on perd à blinky) , mais je trouvais sympa ^^" .
Citer : Posté le 11/05/2014 10:41 | #
Super !
Zelda de Smashmaster
Super Geek Brothers de Siapran
Pac-Man
Pac-Man Color
Meta Ball
Add-ins Jetpack Joyride et Pac-Man sur PRIZM (les 2 non commencés mais en réflexion)
A la recherche des sprites jetpack Joride si quelqu'un les a en couleur
Citer : Posté le 11/05/2014 18:01 | #
Om om, it's looking really nice ! Louloux soutient le projet et attend de pouvoir exécuter des vieux jeux chip8 sur sa Prizm.
deeph Invité
Citer : Posté le 11/05/2014 18:24 | #
Cool du chip-8
J'ai programmé il y a longtemps quelques trucs avec ce langage (que j'aime assez, notamment parce qu'il est très limité et donc que ça force à devoir optimiser pas mal).
J'ai un petit jeu d'esquive que j'aimerai voir tourner sur d'autres plateformes (j'ai déjà vérifié et apparemment il tourne assez bien sur l'ému TI 83+), la source est inclue : Avalanche.zip.
Pour ceux que ça intéresse, le seul compilo utilisable sous windows que j'ai trouvé c'est C8Asm, j'aurai bien utilisé chasm mais j'ai la flemme de le compiler.
Citer : Posté le 11/05/2014 20:53 | #
Merci à vous !
Deeph, j'ai testé ton jeu, il est sympa et soigné, malheureusement, il est développé en prenant en compte l'extension SuperChip8 (ou Chip48), et n'est donc pas pour l'instant exécutable sur mon interpréteur... Ca me fait donc une bonne raison de m'intéresser au support de l’extension (c'est pas bien sorcier, une dizaine d'instructions à rajouter tout au plus ).
D'un autre côté, j'ai fait des tests pour avoir une idée des performances actuelles, et surtout pour avoir une idée de la fréquence émulée. Je suis parti du principe que les "add", ainsi que les "jmp" et "ld" s'étalent normalement sur un seul cycle processeur si exécutés en natif. J'ai donc fait tourner ce programme sans affichage (les valeurs sont des valeurs bidons juste pour tester) :
ld V1,#25
add V1, #2F
jmp Entry
On obtient les résultats suivants : environ 173kHz non OC et 280kHz OC. Je ne sais pas trop si il faut être content, car ça me semble assez peu (0.3% de la fréquence de fonctionnement de la Prizm non overclockée...).
Donc, je vais devoir revoir mon système . Je vais essayer de compacter un peu pour limiter les call/ret (j'en ai 5 par cycle, donc ça doit déjà pas mal pêcher par là), après, peut être voir à optimiser les instructions, quitte à en réécrire quelques unes en asm, mais je pense que GCC doit déjà s'en occuper pas trop mal. Enfin, voila, j'espère que ça va quand même évoluer vers le haut :p.
Citer : Posté le 11/05/2014 20:56 | #
Déjà tu compiles avec gcc, c'est la base.
Bon courage pour la suite.
call et ret sont deux instructions assez lourdes de tout manière.
deeph Invité
Citer : Posté le 11/05/2014 21:47 | #
Enfaite je n'utilise que l'instruction "high" pour mettre l'écran en 128*64 (comme sur hp48), parce que 64*32 c'est assez petit (encore plus que sur TI 83+ !), donc le reste ça doit être bon.
Je suis en train de programmer un autre petit jeu juste pour le fun
Citer : Posté le 14/05/2014 13:57 | #
@Nemhardy : excellent projet en lequel nous pourrions voir une bonne raison de ressortir nos PRIZM du placard ! Bon courage.
@Deeph : inscrits-toi, nous serions honorés d'avoir un programmeur qui fait du chip8 parmi nous.
La Planète Casio est accueillante : n'hésite pas à t'inscrire pour laisser un message ou partager tes créations !
Citer : Posté le 14/05/2014 21:25 | #
Merci Ne0 pour ton soutien :). Et Deeph, je te promet que je me penche sur le support du Chip48 rapidement, et comme l'a dit Ne0tux, n'hésite pas à t'inscrire et nous partager tes jeux :).
Sinon, au niveau de l'avancement, j'en suis toujours à réfléchir à l'optimisation, inliner quelques fonctions pour réduire les calls/ret s'est avéré un peu bénéfique (pas très surprenant en soi). En plus de ça, j'ai regardé un peu pour réécrire des instructions en ASM, et il s'est avéré que certaines capacités de GCC concernant l'interfaçage entre du code C et du code ASM sont vraiment puissantes (je ne m'y étais jamais trop intéressé ), et du coup permettent vraiment de travailler comme je veux. Pour ceux qui voudraient voir, la fonction add_byte dans instructions.c sur le dépôt est réécrite, et est plus efficace que la compilation qu'en fait GCC (bon ok, ça vient peut-être de la manière dont je l'ai écrite en C ), donc creuser cette piste là peut-être bien aussi :).
Toujours est-il que je vais essayer de sortir rapidement une version utilisable (en soi, le moteur de l'interpréteur est bien fonctionnel, mais pas très pratique, l'interface est à revoir, ou encore par exemple, une répartition des touches plus pratique et à envisager).
Enfin voila, j'avance, certes pas très rapidement, mais j'essaye de faire un truc propre et de ne pas me perdre dans mon projet (vive git et sa gestion des branches et de tout le reste d'ailleurs ) !
Citer : Posté le 17/01/2015 21:58 | # | Fichier joint
Finalement après en avoir parlé un peu ce soir je me suis rappelé que j'avais avancé entre temps en rajoutant notamment un explorateur de fichiers (accessible en tapant "fb"), et un affichage de quelques infos après avoir quitté le jeu, les sources sont à jour sur le git, et voila :p...
Voilà, le binaire est en fichier joint (à noter qu'il y a une version spéciale émulateur car la bibliothèque qui gère la console ne fonctionne pas bien sur émulateur...). Pour importer un .ch8 sur l'émulateur il faut ruser un peu en le renommant en un .g3a, puis via un add in comme Utilities de gbl08ma le renommer en .ch8 ;).
Même si je doute que ça intéresse grand monde, le projet est déjà un peu plus utilisable maintenant.
Citer : Posté le 18/01/2015 10:12 | #
C'est bête que si peu de gens aient une Prizm (moi le premier à ne pas en faire partie), c'est un projet d'un grand intérêt...
Citer : Posté le 18/01/2015 12:08 | #
Cool mais on s'en sert pour quoi exactement ?
Citer : Posté le 18/01/2015 12:13 | #
C'est bête que si peu de gens aient une Prizm (moi le premier à ne pas en faire partie), c'est un projet d'un grand intérêt...
T'as qu'a participer aux concours (bon laisse quand même un peu de chance aux autres )
Citer : Posté le 18/01/2015 12:17 | #
Comment on programme sur cet emulateur ?
C'est de l'hexa omg
Citer : Posté le 18/01/2015 13:10 | #
C'est pas hyper compliqué, t'as juste une série d'opcode qu'il faut interprété, t'as même un tutoriel sur le SDZ
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
merci a tout le monde pour son soutien
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 !Citer : Posté le 18/01/2015 14:47 | #
C'est bête que si peu de gens aient une Prizm (moi le premier à ne pas en faire partie), c'est un projet d'un grand intérêt...
T'as qu'a participer aux concours (bon laisse quand même un peu de chance aux autres )
Désolé, je peux pas arriver deuxième au concours
Sinon c'est « juste » un interpréteur de code Asm.
Mais au fait, il est compilé ou pas ?