Suite aux résultats des sondages, mon rédac'chef (Benoît) m'a demandé d'entrer plus directement dans le vif du sujet, sachant que la plupart de ceux qui s'intéressent à ma rubrique ne sont pas des lopettes de la programmation en assembleur (il est vrai que j'avais visé bien bas... mille excuses, mais c'était un passage presque obligatoire : pensez aux novices !!!). Je vais essayer de me rattraper un peu en vous proposant des bidouilles sympathiques, et d'autres petites choses pour vous aider à progresser dans vos réalisations. Qu'en dites-vous???

     Avant toute chose, l'assembleur que j'utilise est ASMFLASH (moi je l'appelle ASM48GX) de J.-Y. Avenard. Je préfère cet assembleur plutôt qu'un autre (Jazz pour ne pas le citer !!!) parce qu'il est très simple d'utilisation, il ne prend que 9Ko (je pense bien évidemment ici aux nombreux possesseurs de HP48G et la syntaxe est beaucoup plus simple que celle de Jazz. Je n'utilise pas les mnémoniques employés par HP, mais mon but est d'attirer un maximum de lecteurs y compris les heureux possesseurs de 48G (que celui qui n'est pas content lève le doigt...). Pour de plus amples informations, vous pouvez consulter le mode d'emploi d'ASMFLASH (et dans la foulée télécharger le programme) en cliquant sur le petit bouton juste en dessous.

la Doc d'ASM48GX

SWAP interne

     Certains ont sûrement déjà désassemblé la ROM de leur HP48, mais beaucoup ignorent comment certaines instructions sont programmées. Aujoud'hui, nous allons nous pencher sur l'instruction interne SWAP telle qu'elle se trouve en ROM, puis nous essaierons de voir ce que l'on peut en faire pour la bidouiller, puis avoir des dérivés de cette instruction.

     Pour commencer, lorsqu'on va rechercher la fonction SWAP, et qu'on regarde comment elle est composée, nous avons deux EXTERNAL que voici :

{ # 18A80h # 3223h }

Le premier sert à contrôler la présence de deux objets sur la pile. Si ce n'est pas la cas, nous avons irrémédiablement une erreur ("Too Few Arguments" pour ceux qui ne savent pas...). Le deuxième fait appel directement à un morceau de Code que nous voyons tout de suite :


Le fonctionnement de ce morceau de source est très simple : on prend l'adresse de l'objet placé sur le niveau 1 de la pile (C=DAT1 A), on se place sur le niveau 2 de la pile (D1=D1+ 5), on prend l'adresse de l'objet placé sur le niveau 2 de la pile (A=DAT1 A), on écrit l'adresse de l'objet du niveau 1 sur le niveau 2 de la pile (DAT1=C A), on revient sur le niveau 1 de la pile (D1=D1- 5), on écrit l'adresse de l'objet du niveau 2 sur le niveau 1 de la pile (DAT1=A A), et pour finir on revient au RPL avec les trois derniers mnémoniques. Le but est donc très simple : on intervertit les deux adresses des objets placés au niveaux 1 et 2 de la pile.
Un petit rappel pour ceux qui ont oublié : en fonctionnement normal, le pointeur D1 pointe toujours sur la pile et en particulier sur le niveau 1. Comme la pile est en fait une suite d'adresses (5 quartets) pointant sur des objets, il faut obligatoirement déplacer le pointeur de 5 quartets en avant ou en arrière pour aller pointer l'adresse de l'objet suivant ou précédent.

SWAP modifié (qu'on appellera SW12)

     Nous avons vu qu'il fallait deux EXTERNAL pour assurer la fonction SWAP interne. Nous allons modifier un peu la source originale pour que nous n'ayons qu'un seul programme 100% en assembleur qui assure les deux fonctions (détection des deux objets présents + le SWAP). Le plus simple est de tester si le niveau 2 de la pile contient bien une adresse, c'est à dire un objet. Si ce n'est pas le cas, la valeur des 5 quartets du niveau 2 de la pile seront égales à zéro. C'est pourquoi nous allons tester la valeur du niveau 2 de la pile pour effectuer le SWAP dans des conditions normales. Cette version ne gère pas les erreurs (elle ne les affiche pas s'il y en a une...) :


Vous pouvez remarquer que le test est très simple et qu'il ne modifie pas de façon conséquente l'original.
Pour ceux qui veulent utiliser GASS (petit programme pioché dans "Voyage au Centre..."), voici la source à saisir dans une chaîne de caractères sans espace ni saut, puis le programme GASS (86,5 octets - CRC #1DB3h).

     A propos, pour ceux qui sont intéressés, je vous propose tout de suite de télécharger une librairie (du nom de ASMTOOLS) que j'ai faite spécialement pour l'occasion et qui contient un certain nombre d'utilitaires tel que GASS (qui s'appelle ->ASG dans ma librairie, mais programmé en assembleur...). D'ailleurs, par la suite, on utilisera certaines instructions de cette librairie.

Téléchargez ASMTOOLS

Maintenant qu'on a fait un SWAP totalement autonome, pourquoi ne pas le modifier pour créer des SWAPs un peu plus tordus... comme par exemple réaliser un SWAP entre les niveaux 1 et 3, ou bien 2 et 3 (on dira que les programmes s'appellent respectivement SW13 et SW23). En voici les sources, et pour les détails : je vous laisse vous débrouiller tout seul (mon p'tit doigt me dit que vous êtes assez grand(e)!!!).

          

Vous pouvez télécharger tous les programmes SWAPs en cliquant ci-dessous. Il y aura d'un côté les programmes et de l'autre les sources.

Téléchargez SWAPs

Boîte OUI-NON

     Qu'est ce que c'est que cette bête là ??? Il vous arrive parfois (moi, ça m'est déjà arrivé...) de vouloir mettre une boite de dialogue qui s'affiche à l'écran et qui demande de confirmer oui ou non. On pourrait par exemple utiliser ce genre de programme au sein d'un test dans lequel on ferait : IF OUINON THEN ... ELSE ... END. Pour cela, il faut d'abord dessiner cette petite boîte, y coller un curseur, puis de faire fonctionner le tout. Pensez-vous que c'est dur ??? Allons-y pas à pas...
Commençons par dessiner cette jolie boîte :


Et celle là, elle vous plait ???

Ne reste plus qu'à confectionner la source et le petit programme qui va bien. Voyons la source tout de suite, et on fera quelques commentaires ensuite. D'accord ? (Même si vous z'êtes pas d'accord, c'est pareil...). Alors allons-y.

Donnons deux ou trois commentaires pour que vous ne planiez pas totalement... Dans un premier temps, on fait quelques initialisations (on récupère entre autre l'adresse de début d'écran courant avec la routine en #1C31h), on sauve le morceau de graphique dans un coin (en #800F5h) qui va être ensuite écrasé par notre petite boite, et on affiche la boite en plein milieu de l'écran. Ensuite, on entre véritablement dans la boucle du programme qui va : tester les touches HAUT et BAS pour les déplacements du curseur, et tester la touche ENTER pour valider la sortie du programme. Enfin, avant de sortir, on récupère le morceau de graphique qu'on avait sauvé (dans un coin) et on le réaffiche à la place de la boite. Et pour sortir, on récupère la valeur du test (placée dans le registre de sauvegarde R0) qui dit si c'est OUI ou NON (1 ou 0). Le résultat est un system binary, c'est à dire qu'il faudra tranformer ce SB en réel grâce à un External (#18DBFh). Voilà, grosso modo comment ça marche... Si vous désirez de plus amples renseignements sur la source, cliquez ici pour me mailer.
Une fois la source correctement saisie, on l'assemble avec ->ASM qui dépose un splendide objet Code sur le niveau 1 de la pile (eh oui...). Il ne reste plus qu'à poser l'Entier Binaire #18DBFh sur la pile et de faire : 2 ->LIST ->EXT. Et le tour est joué.
Aujourd'hui je vais être sympa, vous allez pouvoir télécharger la source du programme, et le programme lui-même.

Téléchargez OUI NON

Maintenant, que peut-on faire d'un tel programme ??? Eh bien, on peut l'inclure dans un programme RPL qui peut faire partie d'un test comme on peut le voir dans cet exemple totalement bidon (sachant que le programme OUINON fournit soit 1, soit 0) :

    Et c'est ainsi que se termine notre petite rubrique Assembleur. Comment qu'c'est qu'ça vous a-t-il bien plu ??? En tous cas, le but était de passer à une étape de l'assembleur un peu plus pratique et ludique.