HP-71C27estFacilePARLONSFRANCAIS
=PARLONS FRANÇAIS=
Joe Horn, l'auteur de ce livre, est très compétent sur le HP-71. Si son livre est resté simple, c'est pour vous aider à comprendre le HP-71 sans vous noyer. Joe écrit en ce moment (Octobre 85) une rubrique de programmation avancée du HP-71 dans CHHU Chronicle, la revue d'un des clubs américains, qui sera peut-être un jour traduite en français (ceci n'est pas une promesse).
Si, après la lecture de ce livre, vous voulez vous perfectionner, vous avez tout intérêt à vous inscrire à un des clubs d'utilisateurs français (adresses à la fin de ce livre).
Un des avantages de ces clubs, c'est qu'ils contiennent d'excellents programmeurs, qui écrivent des programmes pour vous. En particulier il y a en France un petit groupe d'experts en programmation qui valent largement les américains. Vous trouverez ci-après des fichiers LEX Made in France que vous apprécierez sûrement.
Vous trouverez également ci-après 2 programmes BASIC : SSMFAIT et IMPLEX. Voici le commentaire ligne par ligne de ces programmes, mais aussi du programme FAITLEX vu précédemment. J'ai été amené à réécrire ces programmes à cause d'erreurs dans les programmes originaux, comme je l'ai dit dans le précédent chapitre. Ces "erreurs" étaient un peu inévitables les auteurs n'ayant pas eu en main tous les éléments dont j'ai disposé, ne leur en veuillez-pas. Il est possible qu'il y ait aussi des erreurs dans mon programme, si vous en trouvez une tenez-moi au courant !
Disons d'abord qu'un fichier LEX est habituellement créé à l'aide du module FORTH/ASSEMBLEUR. Il se compose d'un en-tête et d'un corps.
L'en-tête se compose de 37 quartets :
<DL compact> <dt><b></b></dt>
<dd> [contenu (quartets)]position
<dt><b></b></dt>
<dd> [Nom de fichier (16)]première ligne
<dt><b></b></dt>
<dd> [Type de fichier (4)]à gauche 2e ligne
<dt><b></b></dt>
<dd> [Drapeaux (protec) (1)]en suivant
<dt><b></b></dt>
<dd> [Code de copie (4)]en suivant
<dt><b></b></dt>
<dd> [Heure de création (4)]en suivant
<dt><b></b></dt>
<dd> [Date de création (6)]fin 2e ligne
<dt><b></b></dt>
<dd> [Longueur fichier (5)]début 3e ligne
</DL>
(référence : IDS Vol 1, page 11.3)
La longueur du fichier : La taille (longueur) du fichier peut être trouvée de trois façons :
- La plus simple, en regardant le catalogue. Mais la taille est donnée en
octets, et c'est celle du corps du programme seulement. Il faut donc y ajouter la taille de l'en-tête (37 quartets ou 18,5 octets pour un fichier LEX) pour avoir la taille réelle. Ensuite cette taille est affichée en octets (8 bits), alors que le HP-71 travaille en quartets (4 bits) et qu'il peut y avoir dans le corps un nombre impair de quartets. Un fichier LEX peut faire 109 quartets, et donc 54,5 octets (sans l'en-tête). Le HP-71 ne voulant pas afficher de décimale affichera 55 (pour un fichier TEXT, il insiste même pour afficher un nombre pair d'octets et affichera 56). De la même façon, quand vous créez un fichier (par CREATE) il fera un nombre entier d'octets (fichier DATA, pair pour les fichiers TEXT). Si on y ajoute la taille de l'en-tête (37 quartets pour un LEX), deux fois le nombre d'octets + 37 donnera toujours un nombre impair de quartets.
- En regardant dans l'en-tête du fichier. Il faut alors lire les quartets
de droite à gauche et en hexadécimal (!). Une fois traduit en décimal il faut y ajouter 32 (la longueur des deux premières lignes) et vous avez la taille réelle du fichier en quartets.
- Si vous avez le listage en hexadécimal (comme dans ce livre ou dans un journal
de club), il suffit de compter le nombre de lignes de le multiplier par le nombre de caractères par ligne (en général 16) et d'y ajouter le nombre de caractères de la dernière ligne si elle est incomplète. Vous aurez sans doute un jour à faire ce travail. Ce n'est pas trop dur.
Le principal défaut des programmes de copie de LEX précédemment publiés est de demander la taille du fichier en octets. Il n'est pas possible à partir de cette valeur de calculer la longueur exacte du fichier si par malheur celui-ci a un nombre impair de quartets pour le corps (et donc un nombre total de quartets pair). Or ceci peut se produire (et c'est le cas de certains des LEX publiés dans la version américaine du présent livre) si le fichier LEX que vous utilisez a été créé en assembleur.
Donc mon programme IMPLEX vous donne le nombre de quartets (première apparition de cette méthode dans le journal danois USER, numéro 3 de Septembre 85) pour usage avec FAITLEX mais aussi le nombre d'octets pour information.
Le principe des programmes comme FAITLEX est de créer un fichier (TEXT ou DATA) et de remplacer son contenu par le vôtre. On ne touche pas à la longueur du fichier original pour ne pas détruire la liaison au catalogue et donc le fichier créé aura parfois une longueur trop grande d'un quartet (sans que cela gêne son fonctionnement).
En conclusion, tous les fichiers LEX créés par un programme FAITLEX ou équivalent ont, au total, un nombre impair de quartets. Si vous avez une liste hexadécimale sur papier faite avec IMPLEX ou un programme équivalent et qui possède un nombre pair de quartets, le LEX a été produit par un assembleur. Vous pouvez le copier avec FAITLEX ou SSMFAIT, simplement la copie fera un quartet de plus que l'original (mais c'est le nombre de quartets de l'original qu'il faut indiquer au programme).
L'impression en hexadécimal d'un fichier LEX est pour l'instant standard (elle est faite pareil pour tous les clubs), ce qui change c'est l'entourage. Je donne à gauche le numéro de ligne. Il commence à zéro, ce qui n'est pas commode, mais je n'ai pas voulu changer sans nécessité ce qui est courant dans les clubs (certains donnent une adresse en mémoire au lieu du numéro de ligne). Il ne faut pas taper cette valeur.
Je donne aussi la liste du code, par 16 quartets séparés par groupes de 2. Les espaces ne doivent pas être tapés, ils ne sont là que pour faciliter la lecture.
A droite se situe une somme de contrôle qui permet de vérifier qu'il n'y a pas eu de faute de frappe (qui serait grave ici). Cette somme de contrôle est calculée différemment pas chaque club. J'ai choisi la méthode française (cocorico) qui calcule la somme des codes ASCII des caractères entrés depuis le début du fichier, sur 3 quartets. Les 3 caractères ne doivent être entrés qu'à la demande "xxx sm :-".
Pour que vous puissiez utiliser des listes de tous horizons, je vous donne SSMFAIT (Sans SoMme FAIT lex) qui peut être utilisé avec des programmes de toutes origines, mais sans taper de somme de contrôle, et donc à vos risques et périls ! Soyez prudent !
Commentaire ligne à ligne des trois programmes :
==FAITLEX ==
<DL compact> <dt><b></b></dt>
<dd> [Ligne]commentaire
<dt><b></b></dt>
<dd> [10]Nom du programme, de l'auteur et date
<dt><b></b></dt>
<dd> [20]et 30 Déclaration des variables. Les entiers font gagner plein de place
<dt><b></b></dt>
<dd> [31]Initialisation des variables
<dt><b></b></dt>
<dd> [40 à 70]Fonction. Calcul du nombre de quartets de la ligne (B, ligne 50), ce
qui permet de renvoyer le nombre voulu de tirets dans FNP$. Le flag(1) indique une erreur de somme et renvoie à l'affichage l'ancienne valeur tapée (attention, l'erreur était peut-être dans la somme) <dt><b></b></dt>
<dd> [80]Le flag(-1) supprime les avertissements (WRN...). C'est nécessaire d'une
part dans le cas où le fichier temporaire AH aurait déjà été purgé, ensuite, et c'est plus subtil, quand vous entrez les codes le HP-71 essaie de les interpréter (voir l'étude de la fonction VAL ailleurs dans ce livre) comme un nombre ou une expression et pourrait afficher "WRN: OVERFLOW" si vous entrez, par exemple : 807E832654874780, cette entrée étant interprétée comme un nombre (807) suivi d'un exposant (E) trop grand (832654874780) <dt><b></b></dt>
<dd> [90]Entrée du nombre de quartets lus sur le papier ou comptés, comme indiqué
ci-dessus <dt><b></b></dt>
<dd> [100]Création du fichier provisoire nommé AH (ne laissez rien traîner d'important
dans un fichier de ce nom !). <dt><b></b></dt>
<dd> [CEIL...]calcule la taille du fichier en fonction du nombre de quartets le -4
est dû au fait qu'un fichier DATA a un en-tête qui fait 4 quartets de plus qu'un LEX (cf. votre manuel de référence, page 331 et 332). , A recueille l'adresse du fichier en décimal. <dt><b></b></dt>
<dd> [110]Nous entrons dans la boucle de création de LEX
<dt><b></b></dt>
<dd> [120]Les deux premières lignes (l'en-tête) sont stockées pour usage ultérieur
(ligne 160) on peut alors passer directement aux boucles suivantes <dt><b></b></dt>
<dd> [140]La troisième ligne contient la longueur du fichier. Il ne faut surtout
pas modifier celle du fichier temporaire, donc on "POKE" après les quartets de longueur une chaîne raccourcie d'autant. Remarquez que la taille du fichier écrite sur le papier (en hexa) n'est pas utilisée. Toutes les autres lignes sont écrites en tenant compte de leur longueur (B) <dt><b></b></dt>
<dd> [155]La saisie est finie, on peut baisser le drapeau -1
<dt><b></b></dt>
<dd> [160]et écrire l'en-tête du fichier, ce qui lui donne un nom et le transforme
en LEX <dt><b></b></dt>
<dd> [170]Astuce ! Réveille-toi une seconde
<dt><b></b></dt>
<dd> [180]après t'être endormi ! ceci permet de chaîner le nouveau fichier LEX avec
le reste de la mémoire <dt><b></b></dt>
<dd> [190]Fin du programme
<dt><b></b></dt>
<dd> [200]Début du sous-programme de saisie et de contrôle. Ces lignes auraient pu
être placées à la place du GOSUB 200 (qui n'est utilisé qu'une fois) mais elles sont plus faciles à modifier à cet endroit, si vous voulez les adapter au calcul de somme de contrôle des autres clubs <dt><b></b></dt>
<dd> [200]Baisse le drapeau d'erreur de somme
<dt><b></b></dt>
<dd> [210]Affiche la chaîne de demande (tirets, ou ancienne réponse, en cas d'erreur)
à l'aide de la fonction FNP$ (cf. lignes 40 à 70) qui calcule en même temps la longueur de la ligne (c'est nécessaire pour la dernière ligne si elle est incomplète) <dt><b></b></dt>
<dd> [220]Entrée de la somme de contrôle
<dt><b></b></dt>
<dd> [230]On va calculer une somme de contrôle provisoire, en effet, s'il y a eu
erreur, il ne faut pas que cette erreur se répercute sur les résultats précédents <dt><b></b></dt>
<dd> [240]Addition des codes des caractères entrés
<dt><b></b></dt>
<dd> [250]Test d'exactitude. En cas d'erreur reprise, sinon la somme est bonne et
on la note pour utilisation à la prochaine boucle (ce principe de calcul est dû à l'équipe française dont les LEX figurent dans ce livre) enfin retour, avec une entrée correcte et en B la longueur de la ligne. </DL>
==SSMFAIT ==
C'est pareil, mais sans contrôle de somme, il y a donc quelques lignes de moins. Attention aux dégâts en cas d'erreur ! (mais les LEX américains publiés ici ont été obtenus avec ce programme).
==IMPLEX ==
<DL compact> <dt><b></b></dt>
<dd> [10 à 40]Initialisation
<dt><b></b></dt>
<dd> [45 à 70]Ici la fonction sert à calculer la somme de contrôle (même méthode
que dans FAITLEX) <dt><b></b></dt>
<dd> [80]Entrée du nom du fichier à imprimer, recherche de son adresse 90 On lit
sa taille <dt><b></b></dt>
<dd> [100]Si vous avez REV$, vous pouvez simplifier ! Taille du fichier en quartets
<dt><b></b></dt>
<dd> [102-105]Impression de l'en-tête. Notez le calcul du nombre d'octets
<dt><b></b></dt>
<dd> [110]La boucle d'impression
<dt><b></b></dt>
<dd> [120]Longueur de la ligne en quartets
<dt><b></b></dt>
<dd> [130]Saisie ligne par ligne et impression du numéro de ligne
<dt><b></b></dt>
<dd> [150]Impression de la ligne
<dt><b></b></dt>
<dd> [170]Impression de la somme de contrôle
<dt><b></b></dt>
<dd> [180]C'est tout !
</DL>
J-D Dodin
==APPT1 ==
par Janick Taillandier
Ce lex est tout simple à utiliser. APPT1 (pour APoinTmenT 1, rendez-vous) fournit une fonction nommée SETALARM qui s'utilise comme :
SETALARM date,time
date et time étant sous le format habituel au HP-71, exemple :
SETALARM '85/12/23','23:59:59'
A l'heure dite, la machine sonne pendant une minute. On peu l'arréter par [ATTN] et utiliser le mode date YYDDD à la place de celui de l'exemple. N'essayez pas de programmer cette fonction, danger !
==REPLEX==
par Michel Martinet
Ce lex contient la fonction REPLACE$ (XFN225006).
Syntaxe : REPLACE$(<ch1>,<ch2>,<ch3>[,<ch4>])
But : REPLACE$ retourne une chaîne alphanumérique extraite de ch1, où toutes les occurrences de ch2 sont remplacées par ch3, avec éventuellement le caractère ch4 comme "caractère joker".
Exemples :
REPLACE$("HP-71",HP","hp")
donne "hp71"
REPLACE$("Hewlett-Packard",".e","*e" ,".")
donne "*e*ett-Packard"
==ENDUPLEX==
par Jean-Jacques Moreau
Ce LEX contient trois instructions :
ENDUP$ (XFN225016)
Syntaxe : ENDUP$
but : Rappeler la ligne de commande mémorisée par l'exécution de ENDUP (voir plus bas).
Exemple :
DISP ENDUP$
ENDUP (XWORD225017)
Syntaxe ENDUP <chaîne de commande>
but : ENDUP est analogue à STARTUP, à la seule différence près que la ligne de commande est exécutée à l'extinction du HP-71.
Exemple : ENDUP "BEEP@'Au revoir...'@WAIT.5"
==STARTUP$ (XFN225018) ==
Syntaxe : STARTUP$
But : Rappeler la ligne de commande mémorisée par l'exécution de l'ordre STARTUP
Exemple : STARTUP STATUP$&"@BEEP"
(à utiliser après avoir exécuté l'exemple précédent)
==COMBARR ==
par Laurent Istria
Ce LEX contient deux fonctions :
ARR (XFN225020)
Syntaxe : ARR(<n>,<p>)
But : ARR(n,p) renvoie le nombre d'arrangements de p éléments pris parmi n. La formule utilisée est : ARR(n,p)=FACT(n)/FACT(n-p)
Exemple : ARR(4,3) donne 24
COMB (XFN225021)
Syntaxe : COMB(<n>,<p>)
But : COMB(n,p) renvoie le nombre de combinaisons de p éléments pris parmi n. La formule utilisée est :
COMB(n,p)=FACT(n)/(FACT(p)*FACT(n-p))
Exemple : COMB(4,3) donne 4
==STKLEX ==
par Michel Martinet
Ce LEX fait le même travail que le programme en BASIC vu précédemment, mais combien plus facilement !
STACK (XWORD225027)
Syntaxe : STACK<nombre de niveaux de pile>
But : STACK n initialise la pile de commande à n niveaux. Pendant cette opération, tout le contenu de la pile est perdu. Une fois la pile initialisée, le fichier LEX n'a plus besoin d'être en mémoire. La taille maximum est de 16 niveaux, le minimum 1.
Exemple : STACK 16
FORMALEX par Michel Martinet et Pierre David
Ce fichier LEX contient 5 fonctions qui peuvent servir de base à la conception d'un programme de traitement de texte.
==CENTER$ (XFN225034) ==
par Michel Martinet
Syntaxe : CENTER$(<chaîne>,<nbre caractères>)
But : Renvoie une chaîne avec un nombre suffisant d'espaces pour la centrer.
Exemple : CENTER$("HP71",8) donne
| HP71 |
==CÉSURE ==
(XFN225035) par Michel Martinet
Syntaxe : CESURE(<chaîne>,<No colonne>)
But : CESURE renvoie la position du premier caractère avant <No colonne> où la césure (coupure) de <chaîne> soit possible. CESURE est conçu de manière à respecter les règles typographiques usuelles.
Exemple : A$="Le HP71B. De Hewlett-Packard ."
CESURE(A$,30) donne 10
==FORMAT$ (XFN225036) ==
par Pierre David
Syntaxe : Format$(<chaîne>,<colonnes>)
But : FORMAT$(A$,N) renvoie la chaîne A$, complétée à N caractères par introduction d'espaces régulièrement répartis. L'utilisation judicieuse de FORMAT(CESURE(A$,N),N) permet de justifier les lignes d'un texte.
Exemple : FORMAT$("HP71B: Le nouvel ordinateur", 40) donne :
|HP71B: Le nouvel ordinateur|
==REDUCE$ (XFN225037) ==
par Pierre David
Syntaxe : REDUCE$(<chaîne>)
But : Cette fonction renvoie la chaîne spécifiée, délestée de tous espaces inutiles. Lorsqu'ils sont au début ou à la fin, ils sont enlevés. Au milieu, ils sont enlevés de manière à ce qu'il n'en reste qu'un seul entre deux caractères.
Exemple REDUCE$(" Le HP71B ") donne
|Le HP71B|
==SPACE$ (XFN225038) ==
par Pierre David
Syntaxe : SPACE$(<nombre d'espaces>)
But SPACE$(n) renvoie une chaîne alphanumérique composée de n espaces.
Exemple : SPACE$(5) donne | |
But SPACE$(n) renvoie une chaîne alphanumérique comp