lundi 26 novembre 2012

"Ce nombre est-il premier ?"... avec une HP-28S

La HP-28S fut la première calculatrice graphique Hewlett-Packard. C'est celle que j'ai failli avoir pendant mes années lycée, à la place de la CASIO PB-1000. Les deux machines étaient positionnées à des prix comparables en haut de gamme, et elles étaient donc en concurence frontale sur ce marché d'avant 1990. En réalité, je pense qu'elles s'adressaient à un public sensiblement différent : la ROM très riche de la HP la rendait immédiatement attrayante pour un étudiant ou un ingénieur généraliste ; alors que la CASIO, selon moi, était plutôt conçue pour un informaticien. Peut-être que ma vie aurait été différente si j'avais fait le choix de la HP-28S ?

Il serait difficile de parler de la HP-28S sans citer Paul Courbis et Sébastien Lalande (http://www.courbis.fr/Voyage-au-centre-de-la-HP28-c-s.html) : leur boulot de rétro-ingénierie sur cette calculette très "fermée" est énorme. À partir de la documentation technique du HP-71, entre autres, ils ont réussi le miracle de repousser les limites logicielles et matérielles de la HP-28S. La publication de leur bouquin, en 1989, lui ouvrait les mêmes possibilités que la PB-1000 : l'accès au langage machine et les interfaces d'entrées/sorties (port RS-232 bricolé).

Si vous avez lu mon article précédent, vous connaissez une partie des raisons de mon choix en faveur de la PB-1000. Vingt-cinq ans plus tard, après avoir longuement testé la HP-28S, c'est sans hésitation que je maintiens la PB-1000 sur la plus haute marche du podium des meilleures calculatrices des années 80 ! Si vous n'êtes pas d'accord, vous pouvez donner vos arguments dans la zone des commentaires ci-dessous :-)

Une des principales difficultés de la HP-28S, c'est son ergonomie. J'ai eu beaucoup de mal à m'y faire. Le simple fait que la ROM soit très chargée, avec des programmes pas toujours indispensables, rend les fonctions essentielles plus difficiles d'accès. Par exemple, il faut passer par un menu pour accéder aux fonctions trigonométriques et logarithmiques. Pour la programmation, à moins de connaître par coeur les commandes et de les taper en toutes lettres, la navigation dans ces menus hiérarchiques devient vite lourdingue.

Le langage RPL a été inspiré, de loin, par LISP et surtout par FORTH. Du coup, c'est structuré, et la fameuse instruction GOTO n'est pas implémentée. Cela dit, à mon faible niveau d'expérience avec le RPL, j'estime qu'il n'est pas spécialement plus lisible que le BASIC. Pire, les séances de debugging sur HP-28S sont affreusement laborieuses. Du coup, il vaut mieux éviter les gros programmes. Par voie de conséquence, on aurait tendance à multiplier les petits sous-programmes qui s'appellent entre eux (notion similaire à des fichiers indépendants). Mais attention, ça peut vite devenir le bordel dans le nommage et l'organisation hiérarchique utilisateur !

La HP-28S et son clavier alphabétique

Voici une implémentation "naïve" de mon programme en RPL :

<< -> N
  << N \/ IP 'J' STO
     IF N 2 / FP 0 ==
     THEN 2
     ELSE 3 'I' STO
       WHILE I J <=
       REPEAT
         IF N I / FP 0 ==
         THEN 0 'J' STO
         ELSE I 2 + 'I' STO
         END
       END
       IF 0 J ==
       THEN I
       ELSE 1
       END
     END 'I' PURGE 'J' PURGE 440 0.5 BEEP
  >>
>>

- '->' correspond à l'affectation d'une variable locale (touche rouge et 'U')
- les symboles '<<'et '>>' sont les délimiteurs de programme
- '\/' correspond à la racine carrée (touche rouge et '-')
- '<=' est le symbole inférieur ou égal (touche rouge et 'S')

Le test sur le nombre 524 287 s'execute en 33 secondes environ, avec cette version non optimisée de mon programme, sur le CPU Saturn 4 bits cadencé à 1 MHz de la HP-28S. C'est plus lent que les dernières CASIO 8 bits que j'ai testées ! Cela dit, comme l'avaient découvert Courbis et Lalande, la HP-28S d'origine est "underclockée", probablement pour économiser les piles. Par ailleurs, on m'a fait remarquer dans les commentaires ci-dessous que le fait d'utiliser la commande STO dans une boucle est une mauvaise idée (décalages mémoire). Il est donc préférable d'exploiter la pile dans les programmes RPL.

samedi 10 novembre 2012

Ma calculatrice préférée : la CASIO PB-1000

En 1986 en Europe, environ un an après la première calculatrice scientifique graphique, CASIO innove à nouveau en dévoilant la PB-1000. Son écran, un peu plus grand que celui de la PB-700 (1983), est tactile. C'est inédit dans cette catégorie.

Pour casser tout de suite le mythe, il faut savoir que la précision de ce fameux écran est limitée à 16 zones sensibles. C'est commode pour naviguer dans les menus, mais il ne faut pas s'imaginer pouvoir dessiner avec son doigt ! Avec le recul, il est triste de constater que cet avantage, très concurrentiel sur le papier, devient presque un inconvénient à l'usage. En effet, la technologie tactile de l'époque fait perdre un peu de contraste au LCD ; et cela, même lorsque l'écran est propre. Du coup, CASIO n'insistera pas : les modèles suivants, la FX-850P et la PB-2000C, sortiront avec un écran classique, non-tactile.

Cela dit, les grosses qualités de cette PB-1000 fabriquée au Japon dépassent largement les limites de son écran graphique de 192x32 pixels. Ses trois principaux points forts sont, selon moi, les suivants : 

1) ergonomie excellente : clavier qwerty bien espacé, agréable au toucher. Il permet une frappe rapide, avec accès direct aux fonctions. Celles-ci peuvent également être tapées en toutes lettres.

2) logiciel système : mode de calcul en notation algébrique directe intuitif et efficace. Il est possible d'éditer l'historique simplement et d'enregistrer des formules sans programmation (mode in/out/calc). Un vrai éditeur de texte est également présent, ainsi qu'un gestionnaire de fichiers.

3) deux puissants langages : un Basic enrichi en fonctions arithmétiques, et un assembleur intégré.

Alors, avec toutes ces qualités, pourquoi la PB1000 s'est-elle moins bien vendue que la série des FX-7000G et suivantes ? Pour essayer de le comprendre, on peut reprendre les trois points forts de la PB-1000, mais appliqués au commun des mortels :

1) l'ergonomie est certes confortable, mais une fois dépliée, avec ses 18,5 x 17,5 cm, cette calculette est plutôt imposante sur le bureau. En cours de math, il faut assumer. Mais, fort heureusement pour l'examen du BAC 1990, ce n'est que la dimension fermée qui comptait (autorisée si inférieure à 21 x 15 cm). À la maison, lorsqu'on l'insère sur son boitier d'extension, on se croirait presque à la NASA : interface cassette, série et parallèle via le CASIO FA-7 (que j'ai utilisé intensivement), ou bien disquette 3"1/2 via le rarissime CASIO MD-100.

2) le logiciel de base n'inclut pas le tracé de fonctions mathématiques. Il faut créer son propre programme pour obtenir des courbes, et ça prend un peu de temps la première fois.

3) dans le Basic intégré, il manque la fonction VALF pour évaluer une expression mathématique. Cet oubli des ingénieurs CASIO sera corrigé à partir de la FX-850P. Mais, en fait, cela n'a rien d'indispensable sur PB-1000. De plus, certains ont trouvé le moyen d'ajouter un VALF avec des POKE (voir http://airbug.one.pagesperso-orange.fr/French/PB-1000/pb-proglist.htm). Par contre, il y a plus grave : l'assembleur HD61700 intégré à la machine, ainsi que les appels système vers la ROM, sont mal documentés... voire pas documentés du tout pour certaines parties ! C'est dommage, car tout le potentiel de la machine ne peut pas être libéré.

Malgré tout, pour moi, avec son indispensable RAM étendue à 40 Ko, la PB-1000 restera la meilleure calculatrice des années 80. Elle m'a suivi pendant toute ma scolarité : dès les années lycée, jusqu'en école d'ingénieur, et à tous les examens où la calculatrice était autorisée. J'ai passé des heures sur cette machine à écrire des programmes de calcul numérique, ou autres, dont certains n'ont un intérêt que pour moi-même.

L'excellent clavier qwerty de la CASIO PB-1000

Alors, pour reprendre le fil de ce blog, que vaut vraiment la PB-1000 en performance pure ? Son CPU 8 bits Hitachi HD61700 cadencé à 910 kHz (voir http://www.pisi.com.pl/piotr433/index.htm#pb1000) est-il aussi rapide que le μPD1007 de la FX-7000G, cadencé lui aussi à 910 kHz ? Le Basic interprété est-il un langage efficace ?

Pour le savoir, j'ai écrit une nouvelle version de mon programme de test sur les nombres premiers :

10 INPUT"N?",N
20 J=INT(SQR(N)):I=2
30 IF FRAC(N/2)=0 THEN80
40 FOR I=3 TO J STEP 2
50 IF FRAC(N/I)=0 THEN80
60 NEXT I
70 BEEP:PRINT"1":GOTO10
80 PRINT I:GOTO10

Par rapport à la version initiale, rien n'a été optimisé. Le code source en Basic me parait plus clair, et plus rapide à débugguer que tout ce que nous avons vu précédemment. Cependant, à la première tentative, le test sur le nombre 524 287 s'est exécuté en pas moins de 23 secondes sur ma machine fétiche ; soit 9 secondes de plus que la FX-7000. Mais après un CLEAR des variables, ce même test s'exécute à chaque fois en moins de 11 secondes sur la PB-1000. Son Basic, qui n'a pas de garbage collector automatique, peut donc être moins véloce lorsque la mémoire est chargée en variables.