Apprendre le
sysRPL (3)
Le 30 juillet 2001
Au départ, je voulais faire un tableau avec
tous les mnémoniques que connaît EXT49 par
défaut ... mais comme il y en plus de 2000, ça
m'aurait pris trop de temps, alors g décider de
sélectionner celles dont je me sert le plus
souvent ...
Pour les choisir, j'ai recensé tous les
mnémoniques dont je me suis servi pour programmer
PrépaZ ...
Et il n'y en a que 34 !!!
C'est assez peu, mais cela prouve que l'on peut
faire des choses compliquées avec très peu de
mnémoniques ...
L'ordre de classement des mnémoniques dans le
tableau est à peu près aléatoire ... en fait,
c'est leur ordre d'apparition dans le source de
PrépaZ ...
Dans ce tableau, tous les arguments sont notés
sous forme de mnémonique, et non sous la forme
qu'ils apparaissent effectivement sur la pile...
Ce ci est un abus de notation ...
Pourquoi ? Pour faciliter la compréhension ... en
effet, la plupart des arguments apparaissent sous
la forme External lorsqu'ils sont compilés sur la
pile ...
On ne peut donc pas savoir ce qui se cache
derrière simplement en les regardant (pour le
savoir, il suffit de faire ->mn, si EXT49 est
installé sur votre calculatrice)
Voila, j'espère que vous me pardonnerez ce manque
de rigueur ...
S'il y a un truc que vous ne comprenez pas, vous pouvez m'écrire à superbebert2000@yahoo.fr
Petits rappels:
Ces mnémoniques sont ceux de EXT49; si vous
voulez compiler des sources écrits avec ces
mnémoniques, il vous faut donc utiliser EXT49...
Si vous ne l'avez pas, vous pouvez le
télécharger sur
hp49g.multimania.com
, le site de Yoann Désir, auteur de EXT49; ou sur
www.lebebert.fr.st
, mon site entièrement consacré à la hp49g; ou
sur
www.hp-network.com
, le site le plus actif de la communauté HP, qui
propose un test d'EXT49
Les SysRPL est un langage relativement dangereux,
et, si vous vous vous trompez dans un programme,
il y a de forte chance que vous perdiez la
mémoire de Home et du port 0; c'est pourquoi je
vous conseille de faire des sauvegardes dans le
port 2, ou sur un ordinateur
Nom du mnémonique | description | exemple d'utilisation | remarques |
begin | sert à indiquer le début d'un programme ou d'un sous-programme | begin ...prog... end |
il doit toujours y avoir un end à la fin d'un programme qui commence par begin |
cllcd | efface l'écran | cllcd =>écran effacé |
|
MenuOff | "efface" le menu | MenuOff => plus de menu |
|
¤ | insère des données dans un prog lors de la compilation et les mets sur la pile lors de l'exécution du programme | ¤VARIABLE =>le contenu de VARIABLE est dans la prog, et lors de l'exécution du prog, il est placé au niveau 1 de la pile |
|
wait(r) | attend un certain temps | <1d>
wait(r) =>attend pendant une seconde |
|
RclStkGrob | Rappelle
le grob de la pile |
RclStkGrob => le grob de la pile est au niveau 1 de la pile |
|
repl(2go,2s) | Affiche un grob dans un "environnement" donné | ¤MON_GROB
(grob qu'on veut afficher) RclStkGrob (environnement de la pile) <0d> (abscisse) <0d> (ordonnée) repl(2go,2s) => MON_GROB affiché dans l'environnement de la pile |
L'environnement de la pile est celui quie st vu courramment, si on veut afficher un grob dans PICT, il faudra une instruction de plus pour "voir" ce grob |
drop | efface
l'argument au niveau 1 de la pile |
||
pdim(2s) | définit la "taille" de l'environnement PICT | <131d> <64d> pdim(2s) => la taille de PICT est 131*64 |
Il faut toujours définir la taille de PICT avant d'afficher un grob dans cet environnement |
~ | pas d'évaluation | 1:
Un programme ~ => 1: Un programme |
|
en
ascii, c le caractère 130, et c dessiné
comme un triangle isocèle avec le sommet
en lequel le triangle est isocèle
dirrigé vers le bas ... hum hum _ \/ c à peu près ça ... |
sert à rappeler le contenu d'une variable globale sur la pile, sans que ce contenu soit intégré au programme une fois compilé | _ \/Chose => le contenu de la variable chose sera rappelé sur la pile à chaque exécution du programme compilé. |
si la variable globale Chose n'est pas dans le répertoire courant au moment de l'exécution du programme; ça peut faire planter l'HP assez gravement |
eval | évalue
l'objet au niveau 1 de la pile |
||
dup2 | duplique les deux premiers arguments de la pile | 2:
"abcd" 1: <1d> dup2 => 4: "abcd" 3: <1d> 2: "abcd" 1: <1d> |
|
pick(s) | copie un argument qui est à un certain niveau de la pile | 2:
"abcd" 1: <1d> <2d> pick(s) => 3: "abcd" 2: <1d> 1: "abcd" |
|
newob | comme
en userRPL ... c'est assez compliqué à expliquer; par exemple, si vous avez un grob au niveau 1, et que vous faites dup, vous avez deux grobs identiques, si ensuite vous modifiez le grob au niveau 1, les deux grobs seront modifiés, alors que si vous faites NEWOB, le grob du niveau 1 sera considéré comme un grob différent du grob du niveau 2, et seul le grob du niveau 1 sera modifié |
||
over | copie l'objet du niveau 2 au niveau 1 | 2:
"abcd" 1: <1d> over => 3: "abcd" 2: <1d> 1: "abcd" |
C'est pareil que <2d> pick(s), mais c plus rapide, et ça prend moins de mémoire... |
roll(s) | rappelle un objet qui est à un certain niveau de la pile au niveau 1 | 3:
"efgh" 2: <1d> 1: "abcd" <3d> roll(s) => 3: <1d> 2: "abcd" 1: "efgh" |
L'objet n'est pas copié, il est déplacé; si vous voulez le copier au niveau 1, il faut utiliser l'instruction pick(s) |
beep(2r) | émet un son d'une fréquence donnée pendant un temps donné | 440.
(fréquence en Hz) 10. (temps en secondes) beep(2r) émet un LA (440 Hz) pendant 10 secondes |
|
do | ça
veut dire "fait" ... Un exemple sera plus explicite ... voir aussi à until |
do truc until machin si truc (qui est un "sous-programme" dans le programme principal) se termine par un true, alors machin sera exécuter; sinon, à la fin de l'exécution de true, on revient à ce qu'il y a après le do (ici truc) C'est une sorte de "boucle conditionnelle" ... |
|
pift | ça fait comme IF et THEN en user RPL | machin pift begin truc end chose Si machin se termine par un true, alors truc sera exécuté ainsi que chose Si machin se termine par un false, alors truc ne sera pas exécuté, et on passera directement à chose |
c
très utile Attention à ne pas oublier les begin et end au début et à la fin de chaque "sous-programme" |
ClearKeyPressed | Efface
les touches du buffer clavier... petite explication: à chaque fois que vous appuyez sur une touche, le "numéro" de la touche est stocké quelque part dans la mémoire, et, lorsque qu'il y a trop de numéro de touches stockés, ça fait un bip quand vous appuyez sur une touche, et ça ralentit le programme ... d'où l'intérêt d'effacer ces numéros régulièrement dès qu'on en a plus besoin ... |
||
<(2s)? | teste si l'argument au niveau 2 de la pile est inférieur à l'argument au niveau 1 de la pile | ||
+(2s) | additionne les deux entiers systèmes au niveau 1 et 2 de la pile | 2:
<1d> 1: <2d> +(2s) => 1: <3d> |
|
rolld(s) | envoie l'objet du niveau 2 au niveau indiqué par l'entier système au niveau 1 | 3:
<1d> 2: "abc" 1: <3d> |
pareil que pour roll(s); l'objet n'est pas copié, il est seulement déplacé |
pix?(2s)? | Teste si un pixel (dont l'abscisse est au niveau 2, et l'ordonnée au niveau 1) est allumé | 2:
<0d> 1: <0d> pix?(2s)? => 1: "true" si le pixel en haut à gauche est allumé; 1: "false" s'il est éteint |
ceci fonctionne pour les pixels de l'écran PICT uniquement |
pifte | c comme IF THEN ELSE en user RPL | machin pifte begin truc end begin bidule end chose Si machin se termine par un true, alors truc sera exécuté mais pas bidule, puis on passera à chose Si machin se termine par un false, alors truc ne sera pas exécuté, et on passera directement à bidule, puis à chose |
dans
tous les cas, chose sera exécuté, ce qui
normal ... Attention à ne pas oublier les begin et end au début et à la fin de chaque "sous-programme" |
1+(s) | ajoute 1 à l'entier système du niveau 1 de la pile | 1:
<0d> 1+(s) => 1: <1d> |
|
1-(s) | retranche 1 à l'entier système du niveau 1 de la pile | 1:
<1d> 1-(s) => 1: <0d> |
|
end | sert à indiquer la fin du programme ou d'un "sous-programme" | ||
3-(s) | retranche 3 à l'entier système du niveau 1 de la pile | 1:
<12d> 3-(s) => 1: <9d> |
|
>(2s)? | Teste si l'entier système du niveau 2 est supérieur à celui du niveau 1 | 2:
<12d> 1: <3d> >(2s)? => "true" |
|
not(?) | "inverse" le booléen au niveau 1 de la pile | 1:
"true" not(?) 1: "false" |
|
swap | "inverse" les deux premiers arguments de la pile | 2:
"abcd" 1: <1d> swap => 2: <1d> 1: "abcd" |
|
until | cela signifie jusqu'à ce que... | do truc until machin si truc (qui est un "sous-programme" dans le programme principal) se termine par un true, alors machin sera exécuter; sinon, à la fin de l'exécution de true, on revient à ce qu'il y a après le do (ici truc) C'est une sorte de "boucle conditionnelle" ... |
Bebert