|
HPGrâal Numero 1
Comment ça marche l'external ?
- 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...
- 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.
- 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 )
- 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).
- 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...).
- 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.
- 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
- 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.
- 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...
- 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 !
- 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...
- Appuyez sur ON (plusieurs fois) et attendez que l'affichage redevienne normal.
- Effectuez la séquence de touches ON-C (Cela consiste à appuyer sur ON, appuyer sur C, relâcher ON, relâcher C).
- 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.
- 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 !
- 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.
- 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.
- 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 !).
- 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 !
- 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
|