Page 1 of 1

CircleIT pour TI-83 Premium CE, version corrigée TI-Planet

Unread postPosted: 23 Feb 2016, 17:33
by critor
Signalons aujourd'hui un nouveau jeu de KingInfinity pour ta TI-83 Premium CE, CircleIT.

Dans ce jeu de réflexes digne d'une application smartphone, tu dois arrêter le cercle sur la bordure du disque grâce à la touche :f105:. :)



L'actualité ayant été un peu chargée dernièrement, nous n'avions pas encore parlé de ce jeu pourtant hébergé sur TI-Planet depuis le 17 février dernier.
Mais en réalité le jeu est sorti il y a plus longtemps le 6 février dernier, et tu as le droit de savoir pourquoi nous n'en avions pas parlé entre temps.
Peut-être avais-tu déjà récupéré le jeu via d'autres sources avant le 17 février, et en gardes tu alors sûrement un très mauvais souvenir ...



Même si des choses peuvent bien sûr nous échapper, nous prenons toujours le temps sur TI-Planet de tester chaque programme que nous mettons à la une.
CircleIT est un programme assembleur, et en assembleur toute erreur peut être fatale à la machine. :#non#:
La version initiale de CircleIT du 6 février dernier jusqu'à aujourd'hui jamais mise à jour par son auteur était gravement bugguée, conduisant systématiquement à la perte des données pour tout nouveau joueur. :mj:
C'est pour cela que nous n'avions toujours pas mis en avant ce jeu - pour te protéger.



6600L'auteur ne semblant hélas pas s'en sortir malgré notre signalement des problèmes, nous avons pris le temps d'analyser la chose.
Il y avait visiblement un bug dans le code de création de la variable destinée à conserver le meilleur score. Après avoir joué pour la toute première fois, la sortie du programme déclenchait donc la création de cette variable, qui donnait en apparence un blocage total de la calculatrice (retour à l'écran de calculs sans le curseur clignotant) conduisant l'utilisateur résigné à appuyer sur le bouton reset.
En réalité la calculatrice n'était pas tout-à-fait bloquée avec la touche :f105: qui réagissait encore, mais ce n'est pas cela qui te sauvera, l'état de la machine étant clairement corrompu comme visible avec l'affichage alors quadruplé du programme ci-contre.



Le programme étant publié sous licence MIT autorisant non seulement la rediffusion mais également la modification, nous avons pris quelques heures pour corriger ce bug.
Le code source assembleur non fourni n'a pas arrangé les choses, nous forçant à travailler directement en langage machine.
En réalité, nous avons plus contourné que corrigé le bug. Nous avons :
  • rajouté en fin du programme du code propre de création de la variable pour le meilleur score
  • écrasé le tout premier appel CALL du programme par l'appel de ce nouveau code
  • rajouté à la fin de notre code l'appel CALL écrasé ainsi qu'une instruction de retour à l'appelant RET
Désormais, la création de la variable pour le meilleur score est faite systématiquement par notre code directement au lancement du programme, le code initial de l'auteur ne s'occupant plus que de sa mise à jour, chose apparemment non problématique. :)

6599Plus aucun problème donc désormais, si tu télécharges le jeu sur TI-Planet comme tu peux le voir ci-contre. :bj:
Sauras-tu battre notre record ? ;)



Nous ne pouvons que féliciter l'auteur pour son choix d'une licence ouverte, permettant de mutualiser la diffusion et le développement dans l'intérêt de tous, et l'encourager à nous montrer ses progrès dans ses prochains jeux ! :bj:



Téléchargement : archives_voir.php?id=436568

Re: CircleIT pour TI-83 Premium CE, version corrigée TI-Plan

Unread postPosted: 01 Mar 2016, 21:49
by mdr1
critor wrote:
  • rajouté à la fin de notre code l'appel CALL écrasé ainsi qu'une instruction de retour à l'appelant RET

Sinon, plutôt que de faire un appel suivi d’un retour, on peut directement faire un saut.

Re: CircleIT pour TI-83 Premium CE, version corrigée TI-Plan

Unread postPosted: 01 Mar 2016, 21:52
by critor
Les sauts relatifs sont il me semble limités en longueur.
Hors de question de sauter à la fin d'un programme aussi long, sauf erreur de ma part.

Re: CircleIT pour TI-83 Premium CE, version corrigée TI-Plan

Unread postPosted: 01 Mar 2016, 21:53
by mdr1
Il existe également les sauts absolus.

Re: CircleIT pour TI-83 Premium CE, version corrigée TI-Plan

Unread postPosted: 01 Mar 2016, 21:56
by critor
Dans tous les cas, il faut revenir pour reprendre l'exécution du code initial, si l'on parle bien d'un correctif ajouté en fin de programme comme ici.
Donc je ne vois vraiment pas comment tu penses économiser un retour, sous une forme ou sous une autre.

Re: CircleIT pour TI-83 Premium CE, version corrigée TI-Plan

Unread postPosted: 01 Mar 2016, 22:02
by mdr1
On saute vers la procédure secondaire dont le « call » a été effacé et son « ret » nous ramène à la position initiale, au début du programme.

Re: CircleIT pour TI-83 Premium CE, version corrigée TI-Plan

Unread postPosted: 01 Mar 2016, 22:07
by Lionel Debroux
mdr1 suggère apparemment que tu fasses l'optimisation call + ret -> jump, connue sous le nom de "tail call (optimization)".
C'est un tail call qui m'a permis de passer de 129 à 127 octets pour http://www.ticalc.org/archives/files/fi ... 43329.html .

Re: CircleIT pour TI-83 Premium CE, version corrigée TI-Plan

Unread postPosted: 01 Mar 2016, 22:10
by Adriweb
Ouai - un exemple direct de ça ici : https://en.wikipedia.org/wiki/Tail_call#In_assembly

Re: CircleIT pour TI-83 Premium CE, version corrigée TI-Plan

Unread postPosted: 01 Mar 2016, 22:18
by critor
Ok, merci.

Si vous voulez donc vous amuser à économiser un octet supplémentaire, allez-y. :)