Accueilretour
précédentsuivant

Notions de programmation RPN

La genèse

Les ancêtres

Séries Classic - Woodstock

Série Spice

Série Coconut

Série Voyager

Série Pioneer

Modèles divers

Perspectives

Les manuels

La notation RPN

La programmation

  Codage
    Fusionnement
  Édition
    Parcours
    Ajout/suppression
  Branchements
    Adressages
    Sous-programmes
  Tests
  Boucles
  Exemple

Liens

Pour profiter de cette page, vous aurez intérêt à installer ces deux polices (Libres, bien sûr...) :

Quelques principes généraux simples permettent de programmer pratiquement toutes les machines HP. Nous détaillons ici divers points de programmation évoqués au fil des pages de présentation des machines.

Faites le test ! Si vous êtes (fort) dépourvu(e) de calculateur RPN HP, les simulateurs proposés sur la page de liens vous permettent effectivement d'écrire vos propres programmes RPN...

Codage des instructions

Le codage des instructions est apparu avec le 1er calculateur programmable HP, le HP-65 de 1974. Il était nécessairement numérique, les écrans de LEDs à 7 segments ne pouvant pas afficher de lettres.

Une touche est donc alors repérée par un nombre à deux chiffres [1], le 1er étant son numéro de ligne et le second celui de sa colonne. P. ex. la touche RTN (ReTurN, fin du (sous-)programme) se situe sur la 2ème ligne, 4ème colonne. Lorsque le calculateur est en mode programme, cette instruction apparaît donc :

42


... et c'est tout ! Le HP-65 ne numérote pas ses lignes de programme. C'est une caractéristique qui n'apparaîtra qu'avec le HP-25 (série Woodstock). Dans le cas du HP-65, cette lacune reste peu gênante, car il utilise l'adressage symbolique [2].

Mais certaines instructions se composent de plusieurs touches. P. ex la touche LN est (toujours sur le HP-65) la fonction secondaire de la touche 7 (ligne 5, colonne 2). Elle s'obtient avec la touche préfixe f (ligne 3, colonne 1). Programmer la fonction LN exige donc deux instructions : f LN soit :

31


52

Instructions fusionnées

Mais il y a des exceptions. Certaines [3] instructions "doubles" sont fusionnées. Elles n'utilisent donc qu'une seule ligne de programme. L'instruction LASTx p. ex., est la fonction tertiaire (!) -- touche préfixe g [4], ligne 3, col. 5 -- de la touche 0 (ligne 8, colonne 2). Elle se code donc g LASTx et apparaît :

35 82 


C'est encore la série Woodstock (HP-25) qui aura le privilège de généraliser le fusionnement des instructions composées. Sur une telle machine (et toutes celles qui suivront), les instructions de programme sont en outre numérotées. L'instruction précédente LASTx apparaît donc ainsi sur un HP-25 (en supposant qu'elle figure à la ligne 10) :

10

14 73


en effet, sur le HP-25 :
  • la fonction LASTx est l'instruction secondaire de la touche " · ", ligne 7, colonne 3 ;
  • la touche préfixe f pour les fonctions secondaires est la 4ème de la première ligne.
Certes, l'utilisateur finit par "parler HP couramment". Mais cette habitude est remise en question lors du changement de modèle, les positions des touches n'étant pas toujours identiques [5]. Mais l'apport de l'affichage alphanumérique qui apparaît avec les HP-41C [6] est inestimable. Sur cette machine, l'instruction LASTx précédente se visualise tout simplement :

10

LASTX

Y'a pas photo...

haut de page

Édition des programmes

Il faut premièrement pouvoir s'y déplacer...

Parcours

L'instruction SST (Single STep) permet de réviser un programme :
  • Lorsque le calculateur est en mode programme, elle fait défiler les lignes une par une dans l'ordre des numéros.
  • Lorsque le calculateur est en mode d'exécution, SST permet de déboguer le programme. Un appui sur cette touche affiche l'instruction de programme courante (tant que SST est maintenue [7]) et exécute cette instruction dès qu'on la relâche. L'utilisateur peut alors inspecter la pile RPN et les registres [8] pour s'assurer que l'instruction effectuée donne bien le résultat souhaité.
L'instruction BST (BackSTep) n'était pas présente sur le HP-65 -- une sérieuse lacune ! --, elle apparaît en 1975 avec le HP-55. Elle permet
  • en mode programme, de reculer d'une instruction ;
  • en mode calcul, de se positionner sur l'instruction précédente sans rien exécuter.

Ajout et suppression d'instructions

Ajouter ou supprimer des lignes de programmes n'a pas toujours été facile... Le problème est que la touche d'effacement CLx est programmable. Donc, taper CLx en mode programme écrit une instruction CLx dans le programme. Il faut distinguer deux types de comportement :

Modèles sans insertion

Sur ces modèles, si l'on tape une instruction supplémentaire à partir de la ligne courante, cette instruction est écrasée. Pratique pour corriger une ligne erronée, ou à la rigueur pour supprimer une instruction : on remplace celle-ci par l'instruction "vide" NOP (No OPeration).

Mais pour insérer des instructions supplémentaires, on a le choix entre deux éventualités peu réjouissantes : retaper tout le programme à partir de l'insertion, ou jongler avec des branchements pour reporter les instructions supplémentaires à la fin de la mémoire. C'est fastidieux, mais néanmoins cohérent avec l'adressage numérique utilisé sur ces modèles.

Le HP-55 et les séries Woodstock (sauf le HP-29C [9]) et Spice fonctionnent ainsi, de même que les modèles Voyager HP-10C et HP-12C.

Modèles avec insertion

Sur ces modèles, une instruction introduite à l'emplacement actuel du programme décale les instructions suivantes d'une ligne. L'insertion d'instructions est ainsi rendue intuitive.

Pour effacer des instructions, une touche dédiée (pas CLx, donc) est prévue ; elle s'appelle  DEL ou ou BSP selon le modèle.

Ce fonctionnement plus rationnel est longtemps resté l'apanage du HP-65, puis des HP-67 et HP-29C. Il s'est généralisé avec le HP-41C et la série Voyager, hormis les HP-10C et HP-12C qui sont dépourvus de la fameuse touche. Tous les modèles ultérieurs en disposent.

haut de page

Branchements

Les manuels HP présentaient à l'origine la programmation comme une mémorisation séquentielle d'instructions. La possibilité de transférer "ailleurs" l'exécution (branchement) était abordée dans un deuxième temps.

Modes d'adressage

numérique (ou absolu)

Il s'agit de la méthode la plus intuitive pour les novices. L'exécution est transférée à une ligne de programme repérée par son numéro :

GTO xyz

transfère le déroulement du programme à la ligne xyz. C'est le mode d'adressage utilisé par les "modèles sans insertion".

Lorsque cette instruction est utilisée en mode calcul, elle positionne le pointeur de programme sur cette même ligne. Pour obtenir le même effet en mode programme, on tape GTO · xyz. L'instruction n'est alors pas programmée mais le pointeur est positionné sur la ligne xyz. Tous les modèles HP, même ceux qui recourent à l'adressage symbolique, offrent cette possibilité.

symbolique

Ce mode d'adressage demande d'identifier la ligne cible du branchement par une étiquette (label). Ainsi

GTO xy

fait passer l'exécution à la ligne

LBL xy

L'inconvénient est d'avoir une ligne supplémentaire à écrire. Il est largement compensé par l'insensibilité du programme à toutes les modifications ultérieures (ajout ou suppression d'instructions).

Ce mode d'adressage est présent sur les "hauts de gamme" : HP-65 et HP-67, HP-29C, HP-34C, HP-41C, HP-11C, 15C, 16C et suivants.

Il rend paradoxalement les machines plus lentes ! En effet, lorsque le branchement survient, le label doit être recherché dans la mémoire programme [10]. Selon le modèle et le type de label (numérique ou alphanumérique), cette recherche est effectuée en avant ou en arrière.

indirect

Parfois l'endroit du branchement est variable, il dépend du contenu d'un certain registre. On parle d'adressage indirect. Sur les HP-67, les Woodstock, Spice et Voyager haut de gamme, un registre particulier ("I")  est dédié à l'adressage indirect. Le stockage et rappel dans ce registre s'effectue avec le "I" majuscule (STO I / RCL I). La référence indirecte à son contenu utilise le "i" minuscule.
Ainsi

GTO i

provoque le branchement au label dont le numéro est contenu dans I.

Avec l'arrivée des modèles alphanumériques, HP-41C et les Pioneer, l'adressage indirect s'est étendu à l'ensemble des registres. On l'obtient avec

GTO IND xy

ce qui provoque le branchement au label dont le numéro est contenu dans le registre xy. Ce dernier se comporte ainsi comme le registre I précédent.

relatif

À notre connaissance, seuls les HP-67 et HP-29C [11] ont présenté cette intéressante possibilité. Elle utilise la même syntaxe que l'adressage indirect, mais interprète différemment le contenu du registre I. Supposons que  celui-ci contienne un nombre négatif. Alors, sur un branchement indirect :

GTO i

le pointeur recule de I lignes. C'est très commode pour la mise en place de boucles. Mieux encore : ladite boucle peut être décalée globalement dans la mémoire programme (p. ex. par l'insertion d'instructions avant) sans rien avoir à y changer. Le manuel du HP-29C vante la rapidité de cette technique :


C'est plausible : contrairement à l'adressage symbolique, cette technique n'exige pas de rechercher une étiquette dans la mémoire programme. Les tests qu'a bien voulu réaliser pour nous un amateur passionné [b] ont permis de conclure à un gain de l'ordre de 8%.

Sous-programmes

Un sous-programme est un bloc d'instructions auquel on fait appel à plusieurs reprises (ou depuis plusieurs programmes principaux). Il est identifié par un n° de ligne (adressage numérique) ou un label (adressage symbolique) et se termine par un RTN ReTurN).

Le sous-programme xyz est appelé par

GSB xyz

(Goto SuBroutine) [12]. L'exécution est transférée au sous-programme xyz. Lorsqu'il se termine (RTN est atteint), le déroulement du programme principal reprend à la ligne suivant l'instruction GSB xyz (qui a été mémorisée).


Le sous-programme peut à son tour appeler un "sous-sous programme" et ainsi de suite. Le nombre de niveaux d'imbrication possibles est plus élevé sur les machines haut de gamme.

haut de page

Tests

Les tests possibles sur les calculateurs HP sont de deux sortes :
  • tests d'indicateurs binaires (flags, drapeaux). Ceux-ci possèdent deux états : set (armé) ou clear (désarmé). On dispose des instructions FS? x (resp. FC? x) pour tester si le drapeau x est armé (resp. désarmé) ;
  • comparaison du registre de pile X à 0 ou à Y, ce qui donne lieu aux tests x=0, x≠0, x≤0, x>0, x=y, xy, xy, x>y. Seuls les modèles haut de gamme proposent la batterie complète de tests, entre lesquels il y a bien sûr certaines redondances.
La réponse à un test provoque deux types de résultats :
  • si la condition testée est vraie, la ligne de programme suivant le test est exécutée. (Il s'agit typiquement d'un branchement [13].)
  • si la condition du test est fausse, la ligne suivant le test est sautée [14].


Boucles

Les boucles contrôlées apparaissent avec le HP-67. Elles consistent en les instructions DSZ (Decrement and Skip if Zero) et ISG (Increment and Skip if Greater).

DSZ p. ex. diminue d'une unité le contenu du registre I et le compare à 0. S'il y a égalité, l'instruction suivante est sautée, sinon elle est exécutée, un peu comme lors d'un test.

Ces instructions combinent commodément un processus qui serait réalisable à l'aide d'arithmétique et de test : elles simplifient la programmation et économisent la mémoire.

Réservé initialement au registre spécial I, le contrôle de boucle est devenu possible avec n'importe quel registre avec le HP-41C.

haut de page

Exemple

Voici un court programme de calcul de factorielle. On suppose que le registre X contient un entier n. Nous donnons deux versions : une pour chaque mode d'adressage principal.

adressage numérique (version 1)

01
ENTER copie n dans Y
02
ENTER ... et dans Z
03
1

04

soustrait 1
05
x=0?
0 atteint ?
06
GTO 10
aller en 10
07
×
multiplier par X
08
LASTx
rappel du X précédent
09
GTO 03
aller en 3
10
R
terminé (n! est dans Y)

adressage symbolique (version 2)

ENTER
ENTER
LBL 01
1

x=0?
GTO 02
×
LASTx
GTO 01
LBL 02
R

Nous vous invitons à en analyser le fonctionnement à l'aide de cette page et de celle sur la notation RPN.

Nous avons fait fonctionner ce test en guise de "benchmark" pour estimer les vitesses relatives des calculateurs programmables de notre collection. Voici les résultats du calcul de 69! (plus grande valeur accessible à l'ensemble des machines) :

machine
version
temps (s)
HP-65
2[a] 19"06
HP-67
2
33"4
HP-25
1
23"3
HP-29C
2 [b] 26"1
HP-33C
1
28"2
HP-34C
2
42"3
HP-41C
2
14"2
HP-41CV
2
14"2
HP-41CX
2
16"9
HP-71B
[c] 4"34
HP-10C 1
26"3
HP-11C
2
31"9
HP-12C
1
27"5
HP-15C
2
38"2
HP-16C
2
39"9
HP-17BII
2[d] 
HP-20S
[e] 3"25
HP-32SII 2
2"84
HP-42S
2
4"34
HP-28C
[f] 3"06
HP-12C pt.
1
5"28
HP-12C pt. II
1
12"31
HP-35S
2
5"44
HP-12C 30 yrs.
1
0"47
HP-15C LE
2
0"47
DM-15cc
2
2"03
DM-15L 2 1"94

On observe une augmentation globale (mais irrégulière) des performances. On remarque également que, dans une série donnée, les modèles haut de gamme sont souvent plus lents que les machines les plus simples.

haut de page


Notes

[1]  Sauf les touches numériques, qui apparaissent telles quelles

[2]  Elle l'est en revanche beaucoup plus sur le HP-55 qui fait appel à l'adressage numérique.

[3]  Seulement une dizaine.

[4]  Les touches-préfixes du HP-65 n'étaient pas nommées f, g et h (comme sur les HP-67 et HP-34C), mais f, f-1 et g. f-1 LN donnait ainsi la fonction exponentielle.

[5]  C'était le cas, cependant, pour les principales -- à commencer par la touche ENTER↑.

[6]  ... et qui disparaît -- temporairement -- avec la série Voyager

[7]  Le HP-65 ne bénéficiait pas de cette caractéristique, qui est apparue sur le HP-55, deuxième calculateur programmable HP.

[8]  À charge pour lui de la restaurer dans son état antérieur, afin que le programme puisse se poursuivre dans les mêmes conditions.

[9]  Cette précision nous a été apportée par un collectionneur de calculateurs HP, que nous remercions.

[10]  Les HP-41C constituent une exception. Ils compilent leurs programmes dans le sens où ils mémorisent les adresses des branchements. De cette manière, la recherche n'est effectuée qu'une fois.

[11]  ainsi, bien sûr, que le HP-19C, son alter ego avec imprimante

[12]  Sur les séries HP-41C, Pioneer et suivantes, la dénomination GSB fait place à XEQ (Execute).

[13]  Il s'agit obligatoirement d'un branchement sur le HP-55, qui combine en fait le test et l'instruction de branchement.

[14]  Sur le HP-65 (dont les instructions sont généralement non fusionnées), ce sont les deux lignes suivantes qui sont sautées.

haut de page


Notes de programmation

[a]  Le HP-65 ne possède pas le test x=0. Il a donc utilisé une version du programme très légèrement modifiée pour employer le test x=y. Nous avons vérifié (en faisant tourner ce programme modifié sur d'autres machines) que cela ne lui procurait aucun avantage (ni désavantage). Son résultat est étonnant !

[b]  Encore merci à l'amateur passionné (le même) pour avoir réalisé les tests sur le HP-29C ; non seulement le programme n°2 (adressage symbolique), mais aussi la version suivante en adressage relatif :

01
ENTER
02
ENTER
03
1
04

05
x=0?
06
GTO 01
07
×
08
LASTx
09
GTO i
10
LBL 01
11
R

On suppose que le registre I d'adressage indirect contient la valeur −6 (pour retourner à la ligne 03). Le gain de temps est d'environ 2" : 24,15" au lieu de 26,3", soit environ 8% de moins.

[c]  Le HP-71B n'étant programmable qu'en BASIC, il a passé le test avec le programme suivant :
10  INPUT N
20  F=1
30  FOR I=1 TO N
40  F=F*I
50  NEXT I
60  F
70  END

[d]  La programmation "par équations" du HP-17BII ne supportant pas les boucles, il n'a pas pu passer le test.

[e]  Le HP-20S étant un calculateur algébrique (dépourvu de pile opérationnelle), il n'était pas possible d'éviter l'usage de variables. Il a passé le test à l'aide du programme adapté suivant (adressage symbolique) :
STO 0
STO 1
LBL 0
RCL 0
  −
  1
  =
STO 0
x=0?
GTO 1
  ×
RCL 1
  =
STO 1
GTO 0
LBL 1
RCL 1
RTN

[f]  Le langage du HP-28C étant différent (RPL), il a passé le test à l'aide du programme suivant, conçu pour se rapprocher au maximum de notre exemple. Il n'utilise que la pile RPL, à l'exclusion de toute variable :
« DUP 1 − DUP
WHILE 0 > REPEAT
SWAP OVER × SWAP 1 − DUP
END DROP »

haut de page