SOMMAIRE EDITO COURRIER L'EQUIPE ACTUALITE NEWS CONCOURS EXTERNAL ASM-INIT ASM-PRATIK INTERRUPTION HARD DUNE EDEN HPMARRIO INTERVIEW BOOK HP92
HPGrâal Numero 1

Comment ça marche l'external ?

  1. Introduction

    Vous aimez le RPL? Mais vous le trouvez "un peu restreint"?
    Vous vous demandez ce que peu bien signifier ces mots sur votre machine: "EXTERNAL" ?
    Vous voulez programmer plus rapidement qu'en RPL sans apprendre l'assembleur? (P.S.: Alors vous avez bien tort car c'est instructif l'assembleur...)

    Alors cet article est fait pour vous!

    Comme vous le savez peut-être (bah sinon vous allez l'apprendre), les Externals ne sont qu'une extension du langage RPL.
    Le langage RPL usuel est appelé RPL-utilisateur et les Externals correspondent au RPL-système. Néanmoins j'utilise personnellement l'appellation RPL pour le RPL-utilisateur et Externals pour le RPL-système.

    Un programme est constitué, en mémoire, d'un prologue (D9D20 soit #02D9Dh), du corps du programme et d'un épilogue (B2130 soit #0312Bh). Le corps du programme est quant à lui constitué d'objets et d'instructions, les instructions pouvant être considérées elles même comme des objets.

    Exemple :

    
             <<       5.2                 DUP    >>
    
      D9D20 E1632 33920 0000000000000250 78BF1 93632 B2130
    
      
    Sur cet exemple, on constate que "l'objet instruction" DUP est codé sur 5 quartets par 78BF1. Cela signifie que, lorsque le programme sera exécuté, il devra évaluer les instructions situées à l'adresse #1FB87h (Vous aurez remarqué les deux façons de noter les Externals: Sous forme de 5 quartets ou sous forme d'adresse, la transformation à effectuer pour passer de l'un à l'autre étant une inversion de l'ordre d'écriture des quartets. Pour ma part je noterais toujours les adresses sous la forme #12345h). En fait, tout se passe comme si, lors de l'exécution d'un programme, le processeur analysait les 5 quartets d'un objet à exécuter, si ces 5 quartets correspondent au prologue d'un objet connu, il agit en conséquence sur l'objet, sinon il va exécuter le programme à l'adresse indiquée par ces 5 quartets (en retournant les quartets).
    La HP48 contient environ 400 fonctions [ndHpFool : j'aurrais dit beaucoup plus...]. Mais, bien sûr, sa ROM contient beaucoup plus de 400 programmes. Rien n'empêche donc d'appeler l'un de ces programmes en lui rentrant directement l'adresse dans le programme :

    
      D9D20 E1632 33920 0000000000000250 54321 93632 B2130
    
      
    Mais ATTENTION ce source exécutera, à la place de DUP, le programme situé à l'adresse #12345h ce qui NE CORRESPOND A RIEN !!!! Donc ne l'exécutez pas !!!!!

    Sur cet exemple se posent quatre problèmes :
      • Mais à quoi ça sert d'exécuter des programmes en ROM si on ne sait pas où se trouvent les choses intéressantes ??!!!
      • C'est bien beau de voir les quartets mais comment on fait pour rentrer ces programmes dans la HP ???
      • Quand est ce qu'on mange ?
      • Comme HPFool est intelligent !!!!
    Pour les 2 derniers problèmes, je ne peux plus rien pour vous, désolé... Pour le second, c'est le rôle des programmes comme GASS/SSAG (Voyage), H->, ->H (librairie DEV). Ces programmes (GASS ou H->) prennent une chaîne du style :

    "D9D20E163233920000000000000025078BF193632B2130"

    et la transforment en un programme du style :

    
      << 5.2 DUP >>
    
      
    Les programmes SSAG et ->H effectuant la transformation inverse...
    En ce qui concerne le premier problème, c'est plus ou moins l'un des buts de cet article que de donner quelques adresses et d'indiquer comment en trouver d'autres...

  2. Qu'est exactement l'external ?

    Intéressons nous maintenant à la structure du "programme" situé en ROM qui est appelé par une instruction. Il y a deux styles "d'instructions " ROM :
      • Les programmes (style DUP)
      • Les instructions primitives (appelées EXTERNALs)
    Pour comprendre, examinons l'instruction DUP :

    
      1FB87     D9D20              Prologue de programme
    
      1FB8C       5AA81              Programme à l'adresse #18AA5h
    
      1FB91       88130              Programme à l'adresse #03188h
    
      1FB96     B2130              Epilogue de programme
    
      
    Le programme à l'adresse #18AA5h sert à vérifier qu'il y ait au moins un objet sur la pile, le cas échéant ce programme envoie l'erreur TOO FEW ARGUMENTS.
    Le programme à l'adresse #03188h est le programme qui effectue la duplication. Ce programme ne gère aucun test et si on le lance sans rien sur la pile, les conséquences peuvent être désastreuses. Cette version primitive de "DUP" sera appelée "dup". C'est un External...

    Examinons maintenant l'autre structure : celle de dup

    
      03188     D8130              Le source est situé à #0318D
    
      0318D     CF                   D=D-1  A
    
      0318F     41F                  GOC    03181
    
      03192     143                  A=DAT1 A
    
      03195     1C4                  D1=D1- 5
    
      03198     141                  DAT1=A A
    
      0319B     142                  A=DAT0 A
    
      0319E     164                  D0=D0+ 5
    
      031A1     808C                 PC=(A)
    
      
    Bien que les Externals soient associés à des sources assembleur, il n'est bien sûr pas du tout nécessaire de connaître l'assembleur pour pouvoir les utiliser.

  3. Comment appeler un External spécifique ?

    Pour appeler un External, il y à deux façons :
      • construire un programme appelant cet External grâce à GASS/RASS/H->
      • mettre son adresse sur la pile et appeler la commande SYSEVAL (Exemple : #03188 SYSEVAL effectuera un dup)
  4. Où trouver des Externals ?

    Quelques externals se trouvent dans Voyage (Voyage au centre de la HP48 G/GX ed. ANGKOR [ndHPFool: Ce livre n'est malheureusement plus édité (cf.: article BOOK)]) quelques-uns se trouvent aussi dans certains livres relatifs à la HP48, mais le plus complet de tous est sans aucun doute Les Secrets (LES SECRETS DE LA HP48 G/GX Tome1- 6000 bonnes adresses écrit par J.-M. FERRARD, aux éditions 3DI). C'est à mon avis le livre contenant la plus grande banque de données concernant les Externals et surtout les mnémoniques associées aux externals sont très claires et très intuitives. C'est d'ailleurs ces mnémoniques que j'utiliserais dans cet article (Il existe des mnémonique "officielles" HP48, mais elles sont très peu intuitives).

  5. Quelques Externals utiles :

    Pour une liste non exhaustive des Externals de la HP: Consultez le site web.
    Ces Extrernals sont donnés ici en adresse. Pour trouver leurs équivalents en code machine, il suffit de "retourner" l'adresse. Ex: #12345h correspond à "54321 ".
    Entre parenthèses se trouvent, dans les mnémoniques ci dessous, les divers arguments que l'external requière. Ex :
    #54500h : >(2b) : teste la supériorité de 2 binary

    Ci dessous la liste des types et leurs numéros de type (voir plus loin)

    
      Abv  Type                Type interne  Type usuel
    
      r  : réel                     1             0
    
      c  : complexe                 2             1
    
      nb : number(réel ou complexe) -             -
    
      st : string                   3             2
    
      ra : réel array               4             3
    
      ca : complexe array           4             4
    
      ar : array                    4             -
    
      li : list                     5             5
    
      lr : liste ou réel            5             5
    
      al : array ou liste           5             5
    
      gn : global name              6             6
    
      ln : local name               7             7
    
      nm : name                     -             -
    
      pr : program                  8             ?
    
      ex : expression               9             9
    
      b  : binary                   B            10
    
      go : graphic object           C            11
    
      to : tagged object            D            12
    
      uo : unit object              E            13
    
      xn : xlib name                F            14
    
      di : directory               2F            15
    
      lb : librairie               8F            16
    
      bk : backup                  9F            17
    
      bf : built-in-function        8            18
    
      bc : built-in-command         8            19
    
      s  : system binary           1F            20
    
      rr : long réel               3F            21
    
      cc : long complexe           4F            22
    
      lk : linked array            5F            23
    
      ch : character               6F            24
    
      cd : code                    7F            25
    
      ?  : boolean                  -            27
    
      ld : librairie data          AF            26
    
      ap : acces pointer            -            27
    
      
    Les mnémoniques sont assez intuitives et je n'ai ni la place ni le temps de les expliciter toutes. Néanmoins je recommande fortement l'acquisition du livre "Les secrets" cité plus haut donnant une description assez complète de toutes ces mnémoniques et bien d'autres encore...
    (P.S. : toutes ces mnémoniques sont compatibles HP48S-HP48SX-HP48G-HP48GX)

    ATTENTION !!! Il y a deux sortes de types. Ne pas les confondre. Le premier sert à la programmation en External, le second est le résultat de la fonction TYPE (le premier est un system binary et le second est un réel...).

  6. Les structures de tests

    Le RPL-système possède des structures particulières pour les tests tout comme le RPL-utilisateur possède les structures IF THEN ELSE END, DO UNTIL, WHILE REPEAT, etc.

    1. Les tests de types

      Pour les tests de type, une structure particulière du programme est requise mais cela permet une très grande souplesse dans la programmation.

      Examinons cela sur un exemple :
      
        D9D20              PRG
      
          D9F81              CheckArg!
      
          11920 11000        Þ 00011
      
          ...                program 1
      
          11920 12000        Þ 00021
      
          ...                program 2
      
          11920 21000        Þ 00012
      
          ...                program 3
      
          11920 22000        Þ 00022
      
          ...                program 4
      
          11920 00000        Þ 00000
      
          ...                program default
      
        B2130              END
      
        
      Sur cet exemple le programme 1 ne sera exécuté que si il y a 2 réels sur la pile (type interne 1 et 1) et si c'est le cas, après exécution du programme 1, il y a sortie du programme (branchement sur l'instruction END de la dernière ligne...). Si la pile contient un complexe au niveau 2 et un réel au niveau 1, c'est le programme 2 qui sera exécuté (car 2 est le type interne pour complexe et 1 est le type interne pour réel...). Si vous avez compris que le programme 4 est exécuté seulement s'il y a deux complexes sur la pile, c'est que vous avez tout compris. Si aucun cas ne convient alors le programme "program default" est exécuté...(option facultative...)

      Dans le même style, on a les instructions LibNeed&Chk1,LibNeed&Chk2,etc...
      L'instruction LibNeed&Chkn vérifie qu'il y ait n arguments sur la pile et exécute la séquence de CheckArg.

      Exemple :
      
        PRG
      
          LibNeed&Chk2
      
          Þ00012
      
          program(reel, complexe)
      
          Þ00058
      
          program(list, program)
      
        END
      
        
    2. Les tests Primitifs IF THEN ELSE

      Ces tests se caractérisent par une plus grande simplicité, à mon goût qu'en RPL-utilisateur.
      Exemple :
      
        PRG
      
          ...
      
          pifte
      
          instruction1
      
          instruction2
      
          ...
      
        END
      
        
      l'instruction pifte (#61AD8h) prend comme argument TRUE ou FALSE et en fonction exécute l'instruction 1 ou 2.
      De même l'exemple :
      
        PRG
      
          ...
      
          pift
      
          instruction
      
          ...
      
        END
      
        
      l'instruction pift (#619BCh) prend comme argument TRUE ou FALSE et en fonction exécute l'instruction ou non.

    3. Les instructions q ,dq ,skip ,sk

      Ces instructions signifient :

      q : quit
      dq : do & quit
      skip : saute l'instruction suivante
      sk : pareil que skip mais en abrégé (Skip micro quoi...)
      quit : quitte le bloc BEGIN END en cours.
      skip : Saute l'instruction suivante
      do quit : Exécute l'instruction suivante puis quitte le bloc en cours.

      Ces instructions se rencontrent dans de nombreuses fonctions composées telles que :

      ?#:dq/sk (#619ADh) (lire : Si le boolean sur la pile est faux alors doquit sinon skip)
      ?:dq/sk (#61993h) (lire : Si le boolean sur la pile est vrai alors doquit sinon skip)
      etc...

      Exemple :
      
        PRG
      
          CheckArg!
      
          Þ 00011
      
          PRG
      
            same?
      
            ?:dq/sk
      
            "pareil réel"
      
            "différent réel"
      
          END
      
          Þ 00055
      
          PRG
      
            same?
      
            ?#:dq/sk
      
            "différent liste"
      
            "pareil liste"
      
          END
      
        END
      
        
      Ce programme reconnaît si 2 réels ou 2 listes sont pareils sinon il ne fait rien...

  7. Conclusion

    Pour conclure je dirais que l'External est très puissant mais que le démineur interne à la HP48GX à été programmé en External alors que BABAL, HPWDEBUG, ou encore SNAKE DIAMONDS n'ont pas été programmé en External mais en assembleur...

Gisséhel

Que faire si la HP se bloque ?
Testez ceci et arrêtez vous dès que la HP est débloquée !
  1. Testez les touches ON, DROP (<--), DEL et ENTER, il s'agit peut être simplement d'un programme qui attend l'une de ces touches avant de continuer...

  2. Appuyez sur ON (plusieurs fois) et attendez que l'affichage redevienne normal.

  3. Effectuez la séquence de touches ON-C (Cela consiste à appuyer sur ON, appuyer sur C, relâcher ON, relâcher C).

  4. Retournez votre HP et retirez le petit patin en haut à gauche. Vous y trouverez un petit trou ou vous y enfoncerez un trombone préalablement tordu (sinon vous aurez du mal à le faire rentrer).
    Ceci n'efface pas le contenu de la mémoire contrairement aux CASIOs, cette action est équivalente au ON-C et sert juste à débloquer la HP.

  5. Ici, vous ne devriez plus être beaucoup à lire ceci...
    Maintenant il faut savoir que vos chances de sauver vos données sont assez faibles et que les procédures décrites ci-après sont DESTRUCTIVES
    Effectuez un ON-A-F (appuyez sur ON puis sur A et F en même temps, relâchez A et F puis relâchez ON). Si un menu apparaît avec marqué "TRY TO RECOVER MEMORY ?" appuyez sur la barre de menu YES si vous voulez réellement retrouver vos données... Attention ceci peut être très long... Si vos données ne vous importent peu, vous pouvez appuyer sur NO, vous obtiendrez un écran avec la pile et l'erreur "MEMORY CLEAR" se produira...
    La procédure de tentative de RECOVER MEMORY n'est pas fiable, et rien ne dit que vous retrouverez totalement vos données !

  6. Le TRY TO RECOVER MEMORY ne marche pas, ou c'est encore pire après : Retirez les piles et remettez les tout de suite dans la HP.

  7. Retirez les piles quelques minutes ou mieux reliez les poles + et - dans l'emplacement des piles après avoir retirer celles ci (faites le de préférence avec un objet métallique). Puis remettez-les.

  8. Retirez les piles et inversez le sens de polarisation des piles (retournez les piles quoi !) (Essayez bien le 7 avant de faire le 8, certaines personnes ayant effectué le 8 se sont retrouvés avec une consommation de la HP ayant augmentée dans des proportions assez importantes !).

  9. Votre HP est sûrement envoûtée ! Tentez de vous en débarrasser ou contactez un magnétiseur ! Celui ci sera sûrement apte pour ce genre de travail !

  10. Le magnétiseur est mort durant le désenvoûtement de votre HP et vous n'arrivez pas à vous en débarrasser :
    Prenez de la poussière de lune et broyez la gaiement à la nuit tombée le premier Jeudi de Novembre par une nuit de lune rousse en poussant de joyeux cris de Hyènes folles ! Avalez en la moitié et déposez l'autre moitié sur le clavier de votre HP, le sort devrait alors se dissiper avec une période de demie-vie de 150 ans.[ndHpFool: C'est vraiment du remplissage !]


Des questions:hpgraal@hotmail.com
Un mot au WEBMASTER?:gissehel@mygale.org
Passez donc sur pulsar:Le site pulsar