dimanche 1 décembre 2013

La PB-2000C, une évolution de la PB-1000 ?

À la fin des années 80, avant mon Bac, j'avais fait l'acquisition de ma Casio PB-1000 avec son extension mémoire, et son boîtier d'interfaces. J'étais très satisfait de ce matériel lorsque, deux ou trois ans plus tard, je tombe sur la PB-2000C dans la vitrine de Gibert Joseph à Montpellier. Même si j'ai pu être tenté sur l'instant, je n'ai finalement pas acheté cette nouvelle calculatrice à l'époque. Concrètement, les améliorations qu'elle apportait par rapport à la PB-1000 me paraissaient insuffisantes.

Mais tout de même, voici les principaux avantages de la PB-2000C, sortie en 1989 :
  • meilleur contraste de son écran : d'une résolution de 192x32, identique à la PB-1000, il est dorénavant non tactile. Il faut savoir que sur PB-1000, avec des piles faibles, l'écran pouvait vite devenir illisible.
  • sa mémoire est de 32 Ko d'origine, extensible à 64 Ko via un module RP-33 comme la FX-850P ; légèrement différent du RP-32 dédié à la PB-1000.
  • son format mono-bloc : elle est plus compacte et plus légère que la PB-1000. Elle n'a besoin que de trois piles CR2032 et d'une CR1120, au lieu de trois "grosses" LR6. De plus, ce format est probablement plus fiable. La charnière de ma PB-1000 est passée une fois au SAV (nappe endommagée).
  • elle supporte plusieurs langages sur cartes ROM séparées : un interpréteur C, un Basic, un DL-Pascal (le plus rapide, pas développé par Casio), un Prolog, et un pseudo assembleur CASL pour les étudiants japonais.

La PB-2000C : le noir lui va si bien.

Mais, la PB-2000C a aussi des inconvénients :
  • son clavier n'est pas aussi bien disposé que celui de la PB-1000 : disparition de la large touche espace, disparition des deux touches shift et de la touche F. Et la sérigraphie de base n'est pas complète : pas de langage par défaut, pas d'accès direct aux fonctions mathématiques. De plus, les overlays clavier ne tiennent pas très bien en place.
  • elle ne contient pas d'assembleur intégré
  • les programmes, en ramdisk pourtant non volatile, sont perdus à chaque changement de carte ROM. Seuls les fichiers texte sont préservés.
  • pas d'horloge-calendrier intégrée, pas de fonction alarme. En réalité, l'horloge est physiquement présente ; mais elle a été désactivée quand la PB-2000C est arrêtée, pour éviter les conflits avec les cartes ROM ! Xerxes a découvert qu'il est toujours possible d'y accéder en assembleur. Démonstration : http://www.silicium.org/forum/viewtopic.php?f=46&t=34198

Pour comparer ses performances, j'ai recopié à l'identique mon programme 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

Le test sur le nombre 524 287 s'exécute ici en 10 secondes environ. C'est équivalent à la PB-1000 (et non deux fois plus rapide, comme je le croyais au début). Et ce résultat est bien normal : le CPU HD61700, ainsi que l'architecture matérielle, sont très proches entre ces deux machines.

Pour tester l'interpréteur C, j'ai recopié mon programme développé initialement pour le Casio Z-1 :

main() {
 double n,q;
 long i,j,intq;
 printf("n?");
 scanf("%lf",&n);
 j=(long)(sqrt(n));
 q=n/2;
 intq=(long)q;
 if ((q-intq)==0) {
  printf("2");
 } else {
  i=3;
  while (i<=j) {
   q=n/i;
   intq=(long)q;
   if ((q-intq)==0) {
    j=0;
   } else {
    i+=2;
   }
  }
  if (j==0) {
   printf("%ld",i);
  } else {
   printf("1");
  }
 }
}

Et là, les performances sur le test avec 524 287 sont plutôt catastrophiques ! En effet, il faut environ 1 minute et 19 secondes pour afficher le résultat. On peut considérer que le C sur ce type de machine est adapté pour l'apprentissage de la programmation ; mais, de toute évidence, cet interpréteur Casio ne permet pas une exploitation optimale du hardware.

Dernière chose, il y a quelques mois, j'avais ré-écrit un autre programme C pour PB-2000C : le jeu d'inversion. Rien de très compliqué, sauf peut-être le générateur de nombres aléatoires ; car cette machine ne possède pas l'instruction idoine en C (en Basic, il y a l'instruction RND). Sans accès à l'horloge interne pour générer la "graine" de l'agorithme aléatoire, j'ai utilisé l'écriture dans un fichier "seed.dat" :

http://www.silicium.org/forum/viewtopic.php?f=46&t=34989&start=15#p425526

En conclusion, c'est quand même une très belle machine, du plus bel effet dans ma collection ! On lui pardonne volontier ses défauts, et je la recommande sans hésiter.

samedi 20 avril 2013

Des courbes sur une PB-700

Dans l'article précédent, j'indique que la PB-700 permet de tracer des courbes sur son écran graphique. L'écriture d'un tel programme, sans être excessivement complexe, n'en est pas pour autant triviale. De plus, les exemples du manuel Casio ne sont pas vraiment utlisables pour "tous les jours" ; par exemple pour étudier graphiquement une fonction mathématique. J'ai donc porté sur PB-700 mon vieux programme pour PB-1000. Et quand je dis vieux, c'est vieux : je ne l'avais pas retouché depuis 1991 !

Le Basic un peu limité de la PB-700 réclame quelques aménagements :
  • pas de sous-programmes nommés (fichiers)
  • je n'ai pas ré-écrit le tracé des fonctions polaires et paramétriques
  • disparition de la possibilité de superposer deux courbes (nécessitait BSAVE)
  • pas de fonction "ON ERROR GOTO". Ceci oblige à gérer proprement les limites.
À cause de cette dernière limitation, il faut faire attention si on veut tracer une fonction qui contient une division par zéro. Par exemple, la fonction f(x)=1/x devra être définie de la façon suivante :

20 IF X=0 THEN Y=1E99 ELSE Y=1/X

Voici  mon programme complet pour PB-700 :

10 ANGLE 1:GOTO 35
20 Y=SINX
30 RETURN
35 XI=-6:XM=6:SX=1:YI=-1:YM=1:SY=1:SP=3
40 CLS :L=150:H=31:PRINT "Range"
50 PRINT "X min :";XI:PRINT "  max :";XM:PRINT "  scl :";SX;
60 LOCATE 7,1:INPUT "",R$:IF R$<>"" THEN XI=VAL(R$)
70 LOCATE 7,2:INPUT "",R$:IF R$<>"" THEN XM=VAL(R$)
75 DX=XM-XI:IF DX<=0 THEN 60
80 LOCATE 7,3:INPUT "",R$:IF R$<>"" THEN SX=VAL(R$)
85 IF SX<=0 THEN SX=1
90 CLS:PRINT "Y min :";:PRINT USING "####.####";YI
95 PRINT "  max :";YM:PRINT "  scl :";SY:PRINT "speed :";SP;
100 LOCATE 7,0:INPUT "",Q$:IF Q$<>"" THEN YI=VAL(Q$)
110 LOCATE 7,1:INPUT "",R$:IF R$<>"" THEN YM=VAL(R$)
120 DY=YM-YI:IF Q$<>"A" THEN IF DY<=0 THEN 100
130 LOCATE 7,2:INPUT "",R$:IF R$<>"" THEN SY=VAL(R$):IF SY<=0 THEN SY=1
140 LOCATE 7,3:INPUT "",R$:IF R$<>"" THEN SP=VAL(R$):IF SP<=0 THEN SP=3
150 REM Repere
160 CLS :U=L/DX:IF Q$="A" THEN YI=YM-SY*H/SX/U:DY=YM-YI
170 V=H/DY:I=-XI*U:J=YM*V
180 IF J<=0 THEN 230
190 IF J>H THEN 230
200 DRAW(0,J)-(L,J)
210 FOR X=INT(XI+SX) TO XM STEP SX
220 A=X*U+I:DRAW(A,J-1):NEXT X
230 IF I<=0 THEN 290
240 IF I>=L THEN 290
250 DRAW(I,0)-(I,H)
260 FOR Y=INT(YI+SY-DY) TO YM STEP SY
270 B=-Y*V+J:DRAW(I+1,B):NEXT Y
280 REM Graph
290 X=XI:GOSUB 20:C=X*U+I:D=-Y*V+J:E=SP/U
300 FOR X=XI+E TO XM STEP E
310 GOSUB 20:A=X*U+I:B=-Y*V+J
320 IF D<0 THEN 370
330 IF D>H THEN 370
340 IF B<0 THEN 370
350 IF B>H THEN 370
360 DRAW(C,D)-(A,B)
370 C=A:D=B:NEXT X
380 LOCATE 18,0:INPUT R$:GOTO 40


Notez bien que pour saisir les minuscules contenues dans ce programme, sur PB-700, contrairement à l'usage, il faut maintenir la touche [CAPS] appuyée.

Le mode d'emploi est assez simple :

1. saisir la fonction sous la forme Y=f(X) à la ligne 20

2. lancer le programme par RUN

3. saisir les bornes de calcul :
   - touche [Entrée] pour conserver la valeur précédente
   - ou bien, saisie de la nouvelle valeur, sans se préoccuper de l'affichage de la valeur précédente. Par exemple, sur la vidéo, quand je tape [6][Entrée] pour la valeur max de X, c'est bien 6 qui est pris en compte, et non 610.

4. "scl" signifie "scale". C'est l'échelle des graduations. Sinon, c'est une graduation toutes les unités par défaut.

5. au niveau de "Y min", on peut saisir [A] pour "automatique". Ceci permet d'obtenir automatiquement un repère orthonormé.

6. le paramètre "speed" permet de contrôler la précision du tracé. Le tracé est lent avec des valeurs basses. Par exemple, la valeur de 1 demande un calcul de la fonction sur chaque pixel horizontal.

Une petite démonstration en vidéo vaut mieux qu'un long discours :


Si vous ne faîtes pas de CLEAR avant un RUN, la ligne 35 du programme peut être mise en commentaire. Ces variables doivent néanmoins être initialisées correctement. Le REM permet d'éviter l'écrasement systématique des bornes de calcul. Par contre, il est bien entendu que sur PB-700, la tentative de PRINT sur une variable non initialisée entraînera une erreur.

35 REM XI=-6:XM=6:SX=1:YI=-1:YM=1:SY=1:SP=3

N'hésitez pas à utiliser la zone des commentaires ci-dessous pour soumettre un bug, ou pour publier vos optimisations ! 

dimanche 14 avril 2013

"Ce nombre est-il premier ?"... avec une Casio PB-700

Dans l'histoire Casio, il y avait quoi avant ma PB-1000 favorite ? C'est la question que je me suis posée il y a quelques temps. Et donc, je me suis naturellement intéressé à la PB-700, jusqu'à en acheter une. L'air de famille est évident entre ces deux modèles de la série PB. Et ça se sent dès le premier contact avec le clavier et avec l'écran graphique. Celui-ci est d'une résolution de 160x32 pixels sur la PB-700. Du coup, même si la FX-7000G reste la première calculatrice graphique au monde de format vertical, elle perd un peu de sa superbe face à cette PB-700, de deux ans son ainée. En effet, dès 1983, la PB-700 permettait de tracer des courbes sur son écran ou sur table traçante, à condition bien sûr de saisir au préalable le programme idoine. Pour aider l'utilisateur dans cette tâche, plusieurs exemples graphiques étaient présentés dans le manuel en français au nom évocateur : "Randonnée au pays du Basic".

Alors, par rapport à une Casio FX, on pourra toujours arguer du fait que la PB-700 n'est pas idéale pour le calcul. Cependant, les principales fonctions scientifiques sont bien présentes en ROM. Et il est facile de les taper en trois lettres, grâce à la bonne disposition du clavier. Par rapport à mes habitudes sur PB-1000, il manque néanmoins un certain nombre de choses, comme par exemple la touche BS (backspace). Et, globalement, il est clair que le mode d'édition sur la PB-700 est un peu rudimentaire. On dirait que les ingénieurs Casio ont chassé les octets partout dans le système. Autre détail de ce Basic, que je n'avais encore jamais vu ailleurs : on peut manipuler des tableaux en simple précision avec le caractère '!' dans le nom de la variable. Ceci permet de grapiller quelques octets ; car les variables en simple précision sont codées en BCD sur 5 chiffres significatifs, au lieu de 12 habituellemment. Autre économie de bout de chandelle : les chaînes de caractères sont limitées à 7 caractères de base. Ce n'est pas beaucoup !

Parmi les fonctions presque essentielles, on constate que les opérateurs booléens manquent à l'appel (AND, OR, NOT, XOR). De plus, contrairement à la PB-770, il n'y a pas d'instruction PEEK, ni de POKE. De ce fait, comme il est impossible de dumper la mémoire, il n'existera probablement jamais de vrai émulateur. On pense par exemple à l'excellent PockEmul, qui permet d'émuler différents modèles avec une copie originale de leur ROM. Et donc, malheureusement,  lorsque tous les PB-700 seront tombés en panne, l'espèce disparaîtra. Il restera la simulation éventuellement, mais ce n'est pas pareil.

58 touches sur la Casio PB-700

Malgré quelques inconvénients, la PB-700 reste une machine agréable à manipuler. Je l'ai faite participer à deux MPO du forum Silicium (MPO 38 et MPO 41).

En guise de conclusion, mon programme de test de primalité habituel est identique à la version PB-1000, aux espaces près, que la PB-700 ajoute d'elle même :

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

Le test sur le nombre 524287 s'éxécute en 28 secondes ; soit finalement à peine plus lentement que sur la PB-1000.

samedi 9 mars 2013

Retour vers le passé avec la Sharp PC-E500

Mes articles ne sont pas tout à fait dans l'ordre chronologique. C'est un peu involontaire, car ma collection d'antiquités se complète régulièrement. Cette Sharp PC-E500 date de 1989 ; elle est donc un peu plus ancienne que la Casio Z-1. Mais la PC-E500 n'est pas si rare : elle a même connu un certain succès en Allemagne. Ce succès est justifié par ses qualités techniques (un mode double précision à 20 chiffres, par exemple), et il s'est prolongé avec la PC-E500S jusqu'à la fin des années 90.

Cité universitaire Boutonnet

En réalité, même si je ne l'avais jamais possédée jusqu'à récemment, je connais cette machine depuis 1991. Un ami qui logeait à la cité universitaire Boutonnet (Montpellier) m'avait demandé de lui écrire un programme d'édition de texte un peu spécial pour sa PC-E500, avec fonction de recherche. J'ai donc parfois "travaillé" dans ces petites chambres de 9 m2, même si je n'y ai pas été locataire. Ce fut un très agréable retour de plus de vingt ans en arrière, lorsque début 2013 j'ai enfin appuyé sur la touche ON de cette "relativement vieille" calculette, avec son petit bruit mystérieux de relai mécanique à l'allumage (est-ce un buzzer ?).

Sharp PC-E500 : ergonomie et efficacité.

J'aime beaucoup ce format de pocket horizontal, avec clavier qwerty. Les touches caoutchoutées, et bien espacées, de cette PC-E500 permettent une frappe confortable. Son écran LCD de 40 caractères de large est très bien pour la programmation. Après quelques instants de re-découverte, j'ai saisi mon petit programme de test sur les nombres premiers, en Basic, facilement, rapidement, et sans erreur.

Sur les Sharp, il y a néanmoins quelques spécificités qui peuvent troubler lorsque l'on vient du monde Casio. Par exemple, on fait parfois la confusion entre la touche [Enter] et la touche [=] ; ou encore, entre le mode RUN et le mode PRO. Le message d'erreur est assez clair dans ce dernier cas : "Mode error". Autre particularité, la touche [INS] reste "enfoncée". Ce fonctionnement me parait finalement plus efficace que chez Casio, où l'on appuie autant de fois que nécessaire sur [INS], en calculant le nombre d'espaces nécessaires.

Une petite contrainte de cette Sharp en Basic : on ne peut éditer qu'un seul programme à la fois en mode PRO. Ensuite, il faut jouer avec les fichiers, et avec les commandes SAVE, LOAD, et FILES. Néanmoins, il est possible d'intégrer ses programmes personnels aux menus du mode "ingénieur" grâce à une règle de nommage sur l'extension du fichier.

Au final, on s'habitue assez vite à tous ces petits trucs d'usage. La PC-E500 est donc une calculette vraiment efficace au quotidien. Cela dit, bien que son Basic soit très complet, elle ne possède pas la fonction "FRAC" (partie après la virgule) ni la fonction modulo. Du coup, j'ai utilisé la formule suivante :

A MOD B = A–B*INT(A/B)

Mon programme en version Sharp devient celui-ci :

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

Sur le PC-E500, mon test de primalité naïf sur 524 287 s'éxécute en à peine plus de 6 secondes ! C'est un excellent résultat pour l'époque, avec un processeur dérivé du Z80 (8 bits) en version CMOS, et cadencé à 2,3 MHz environ ; beau travail des ingénieurs Sharp.

mercredi 13 février 2013

Mon premier Motorola 68k, l'Atari ST

Dans mon article sur la CASIO Z-1, j'évoquais les bonnes performances de son CPU Intel 16 bits. Cette fois, pour la comparer avec un Motorola 16/32 bits à 8 MHz, j'ai ressorti mon vieil Atari 520 STF (F pour Floppy disk). J'entends déjà des objections : le ST n'est pas une calculatrice ! Oui, et décidément mon pseudo benchmark est toujours aussi biaisé ; mais ce n'est pas grave. Cette série d'articles est un prétexte pour déballer ma collection, et donc, ce test m'intéresse. Je garde en réserve de vraies calculettes à base de M68000 : une TI-92 et une TI-89, pour mes prochains tests.

À la fin des année 80, l'Atari ST s'est parfois rapproché de mes cours de math. En effet, à une époque où je ne disposais que d'une TI-66 et d'une PB-1000, l'étude graphique de certains problèmes était évidemment bien plus confortable sur l'écran 12 pouces de 640x400 pixels de mon Atari ST (à la maison, donc).

Pour reparler brièvement de la PB-1000, j'avais envoyé mon programme de tracé de courbes (repère orthogonal, coordonnées polaires, et paramétriques), déjà bien rodé après quelques années d'utilisation, à la revue "Poche Computer". Il a été publié dans le numéro 2 en janvier 1994 : http://www.abandonware-magazines.org/affiche_mag.php?mag=12&page=1

Mon 520STF (1987) est un peu jauni par les années et par la crasse, mais il fonctionne toujours très bien. C'est un peu miraculeux, car je ne m'étais pas privé de le bricoler au fer à souder, comme de nombreux fans de la marque. Par exemple, pour éviter de changer de disquette trop souvent pendant les jeux, j'avais upgradé sa RAM à 1 Mo. Cette opération l'avait donc transformé, pour ainsi dire, en 1040STF. Il contient un TOS 1.4d (1989) en ROM, à la place du TOS 1.2 d'origine, et une carte d'émulation PC Speed. Pour être très précis, "émulation" est un abus de langage ici, car cette carte dispose d'un processeur NEC V30 (clone de 8086). On éxécute donc du code x86 nativement sur un processeur x86, le reste du ST ne gère que les entrées/sorties (et la ST RAM). Cette configuration est suffisante pour faire tourner à vitesse normale le système MS-DOS, Turbo Pascal, Derive, et d'autres bricoles dont j'avais besoin à l'époque. Enfin, tous mes logiciels fétiches (plus ST que DOS) étaient installés sur un disque dur Quantum LP52S (Trinology Informatique), de 52 Mo, avec son adaptateur ICD intégré au boitier externe que l'on voit ci-dessous, sous l'écran.

Atari 520 STF en 2013, avec son moniteur SM124 (image non-entrelacée à 70 Hz)

L'idée de cette deuxième photo n'est pas de faire un gros plan sur la crasse, mais de montrer mes étiquettes, pour certaines touches du clavier en mode PC. Peut-être que ça pourrait servir à quelqu'un qui a perdu son manuel de PC Speed :


Personnellement, j'ai toujours préféré la disposition du clavier de l'Atari ST à celle du PC. Mais l'évolution de l'informatique en a décidé autrement !

Pour réaliser mon test sur les nombres premiers, j'ai donc pris une disquette HD de 1,44Mo que j'avais sous la main, pour y copier mon code source ; identique à celui que j'avais développé pour la Casio Z-1, à quelques détails près.

Il faut savoir que pour utiliser les disquettes HD "modernes" (déjà en voie de disparition) sur un lecteur Atari ST d'origine, il est nécessaire de boucher le trou de la disquette HD avec du scotch. On peut ensuite la formater en double densité 720 Ko, ou éventuellement un peu plus, jusqu'à 900 Ko (de préférence sur le lecteur ST). La plupart des disquettes Atari sont parfaitement compatibles avec la lecture/écriture sur PC. Sous Gentoo Linux par exemple, j'aime bien les sys-fs/mtools : cela évite d'avoir à "monter" les disquettes DOS. Les utilaires dos2unix et unix2dos (que tout le monde connait ?!) sont également pratiques pour traiter les retours chariots dans les fichiers texte. On peut aussi obtenir un bon résultat avec une commande du style :

cat PREMIER.C | sed -s 's/\r/\r\n/g'

Mon code en version Atari, prêt à compiler avec Pure C (ou Turbo C), donne donc ceci :

#include <stdio.h>
#include <math.h>
main() {
 double n,q;
 long i,j,intq;
 char c=' ';

 printf("n?");
 scanf("%lf",&n);
 j=(long)(sqrt(n));
 q=n/2;
 intq=(long)q;
 if ((q-intq)==0) {
  printf("2\n");
 } else {
  i=3;
  while (i<=j) {
   q=n/i;
   intq=(long)q;
   if ((q-intq)==0) {
    j=0;
   } else {
    i+=2;
   }
  }
  if (j==0) {
   printf("%ld\n",i);
  } else {
   printf("1\n");
  }
 }
 printf("Q et [Enter] pour quitter\n");
 while (c != 'Q') {
  scanf("%c",&c);
 }
 return 0;
}

Sans grande surprise, après avoir lancé le programme binaire PREMIER.PRG et saisi le nombre 524 287, le résultat s'affiche instantanément.

Pour aller un peu plus loin, et analyser les performances d'un langage interprété sur Atari, j'ai choisi de convertir mon programme en Basic 1000D, en utilisant la fonction modulo. Je ne l'avais pas utilisée jusqu'ici, parce qu'elle n'était pas présente sur toutes mes calculatrices, mais cela ne change finalement que peu de choses.

Bizarrement, dans un code source en Basic 1000D, les lignes se terminent par le caractère null (et non CR/LF). Il faut donc taper ceci (par exemple) pour l'afficher correctement sous Linux :

cat PREMIER.Z | sed -s 's/\x00/\r\n/g'

Il manquera encore les tabulations du programme, qui sont automatiquement positionnées par l'éditeur 1000D :

input "n?",n
j=intsqr(n)
clear timer
if mod(n,2)=0
  print "2"
else
  i=3
  while i<=j
    if mod(n,i)=0
      j=0
    else
      i=i+2
    endif
  wend
  if j=0
    print i
  else
    print 1
  endif
endif
print "temps d'execution :";mtimer;" ms"

Le résultat sur 524 287 s'obtient en 3,6s environ. Sur ce test simpliste, la différence de performance avec le Basic de la Casio Z-1 peut paraître négligeable. Mais si on regarde ce que fait vraiment le Basic 1000D, la précision des calculs, et la dimension des nombres qui peuvent être manipulés, il écrase, de par sa puissance, la plupart des calculettes, même récentes. Si vous voulez essayer ce langage "vintage" (oublié à tort), il est librement téléchargeable sur le site de son auteur (avec code source et manuels) : http://jean-jacques.labarthe.perso.sfr.fr/1000d/index.html. La version téléchargeable fonctionne parfaitement sous l'émulateur Hatari (http://hatari.tuxfamily.org/). J'aurais juste un mini reproche à faire à J-J Labarthe : pourquoi ne pas avoir proposé des raccourcis clavier en mode Emacs dans l'éditeur du 1000D ?

vendredi 8 février 2013

Le plaisir d'optimiser un programme

Parmi les articles les plus lus sur mon blog, celui qui relate mes essais avec la HP-28S figure en bonne position, en nombre de consultations. Les années passent, et, comme de nombreux modèles HP, cette calculatrice reste toujours aussi fascinante. Son design réussi, tout en sobriété, contribue largement à ce côté mystique, et attise la curiosité.

Deux versions très améliorées de mon programme "Ce nombre est-il premier ?" m'ont été proposées pour la 28S : la première par st33x ici (commentaire dans ce blog) ; et la deuxième par C.Ret sur le forum MySilicium. Il est clair que le langage RPL demande une bonne gymnastique d'esprit pour écrire des programmes un tant soit peu optimisés. L'exploitation fine de la pile opérationnelle est plus que conseillée. Vive les DUP DROP DUP2 PICK OVER ROLL SWAP ROLLD LIST->, et bonjour l'aspirine... Voire éventuellement un bon grog si vous tentez la récursivité :)

Pour le fun, et pour profiter un peu du clavier de ma Casio Z-1, j'ai apporté ma modeste contribution aux trois derniers défis d'optimisation du forum MySilicium. Tous les pockets et toutes les calculatrices, de toutes les générations, sont admis ! Les règles du jeu sont très libres ; cela entraîne une grande variété des programmes soumis :

Misez P'tit, Optimisez - N°32 (factorielle)
http://www.silicium.org/forum/viewtopic.php?f=46&t=34362

Misez P'tit, Optimisez - N°33 (angles & côtés d'un triangle)
http://www.silicium.org/forum/viewtopic.php?f=46&t=34368

Misez P'tit, Optimisez - N°34 (Tout à 1 Euro!)
http://www.silicium.org/forum/viewtopic.php?f=46&t=34525

Cet exercice du "MPO" paraît sans doute un peu futile aux non initiés ? Il doit rapeller à certains les magazines des années 80, dont les pages étaient truffées de programmes à recopier. Mais on se surprend très vite à prendre du plaisir à se faire des noeuds au cerveau ! Les astuces proposées par certains contributeurs sont d'une élégance qui force l'admiration.

samedi 26 janvier 2013

Le Graal pour un élève ingénieur en informatique : la CASIO Z-1

Je teste aujourd'hui la très surprenante CASIO Z-1. C'est une machine plutôt rare en France, qui est sortie vers 1991 au Japon (peut-être 1992 ?). On considére que c'est une déclinaison "low cost", spéciale pour l'éducation Japonaise, de la FX-890P (1991). Sur les rares articles qui concernent cette série sur le net, on peut lire que l'écran, d'une résolution identique à celui de la PB-1000, est d'un meilleur contraste sur les FX-890P et Z-1GRa.

Le CPU de cette Z-1 est un Intel 80L188EB, cadencé à la modeste fréquence de 3,68 MHz ; et non 8 MHz comme je le pensais au début (fréquence maximale supportée par ce CPU). En effet, sur la carte mère de la Z-1, un oscilateur externe à 7,37 MHz est connecté à la broche CLXIN du CPU (schéma extrait du manuel  https://app.box.com/s/pwuubkr3nkxccpbolzvp ; la résolution de l'image est moins bonne en prévisualisation que si vous la téléchargez carément). Et comme l'indique la datasheet Intel, l'oscillateur doit opérer à deux fois la cadence requise par le processeur. Cela dit, c'est déjà plus rapide que la plupart de ses contemporaines. Intel a souvent été au top sur le rapport performance/prix dans son histoire. Alors, on peut critiquer certaines mochetés des architectures x86 (gestion de la RAM, registres internes, etc.), et on peut toujours comparer avec l'élégance des architectures Motorola, ou autres. Mais si on regarde la réalité du marché des calculettes, le Motorola 68000 en version CMOS ne sera réellement exploité qu'à partir de la deuxième moitié de la décennie 90 par Texas Instrument.

En lisant d'autres articles (forum http://www.silicium.org/forum/viewtopic.php?f=64&t=31900), il semblerait bien que cette Z-1 contienne également une mystérieuse puce nommée COMET. On peut s'autoriser à penser qu'il s'agit du hardware nécessaire au fonctionnement du langage CASL, défini par le ministère de l'éducation japonais. Cela dit, comme les quatre manuels, que je possède, n'existent qu'en version japonaise, il m'est difficile d'écrire le moindre programme en CASL !

À propos de l'ergonomie générale du Z-1, on est proche de la PB1000, donc j'adore ! Physiquement, la machine est assez épaisse, plutôt massive. Du coup, elle est stable. Le clavier est vraiment sympa pour taper du code. On pourrait juste regretter la perte de l'accès direct à la touche [Memo]. Mais il nous reste quand même les essentielles fonctions de recherche et de copier/coller (basiques). Plus gênant : on a perdu le gestionnaire de fichiers qui permettait de nommer les programmes avec des noms plus parlants que P0 à P9 et F0 à F9.

La Casio Z-1 et son confortable clavier, au look "japonais".

L'usage courant est toujours fluide et très efficace. On bascule entre les diffŕents modes (calcul & programmation) avec un nombre réduit de touches. Voici un cas d'usage :

1) à partir du mode calcul direct, pour reprendre l'édition du dernier code source C, 3 touches :
  [MENU][3][S] (S pour Source)
2) pour lancer ce programme, 3 touches :
  [SHIFT][SUB MENU][R] (R pour Run)
3) pour le rééditer à la ligne de l'erreur (si erreur il y a), 3 touches :
  [SHIFT][EDIT][ENTER]

Il y a juste un petit piège en mode éditeur : si on oublie qu'on a appuyé sur la touche [S] rouge qui maintient le Shift enfoncé (contrairement à l'autre [SHIFT], que l'on doit utiliser simultanément avec une autre touche, à deux doigts), et si on ne fait pas gaffe à l'indicateur [S] allumé sur le bord gauche de l'écran ; alors il peut arriver que l'on efface toute la ligne courante (L.CAN = Line Cancel) en appuyant juste sur [BS]. Le "Undo" sur ce type d'action n'a pas été implémenté, dommage !

Pour fixer tout de suite les idées sur les performances, voyons ce que donne mon programme habituel sur le 7ème nombre premier de Mersenne (M7 = 524 287), en Basic :

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


Le résultat "1" est obtenu en 3 secondes environ ! 15 ans plus tard, la HP-50G programmée en RPL ne fera pas mieux.

Avec le langage C, il faut bien sûr faire attention aux types des variables : un entier de type "int" est codé ici sur 16 bits (processeur 16 bits), alors que le "long" est en 32 bits. Un autre petit truc : sur la photo de la Z-1 vous aurez peut-être remarqué qu'il manque le caractère backslash '\' sur le clavier. Backslash est utile en C pour écrire certains caractères spéciaux (\n, \r, etc.). Sur la Z-1, on peut le remplacer par le symbole ¥ (= symbole Yen, même code ASCII que backslash : CHR$(92) en Basic).

main() {
 double n,q;
 long i,j,intq;
 printf("n?");
 scanf("%lf",&n);
 j=(long)(sqrt(n));
 q=n/2;
 intq=(long)q;
 if ((q-intq)==0) {
  printf("2");
 } else {
  i=3;
  while (i<=j) {
   q=n/i;
   intq=(long)q;
   if ((q-intq)==0) {
    j=0;
   } else {
    i+=2;
   }
  }
  if (j==0) {
   printf("%ld",i);
  } else {
   printf("1");
  }
 }
}


En C, on aurait pu s'attendre à une nette amélioration des performances, mais il n'en n'est rien : mon test habituel s'éxecute en plus de 5 secondes. N'oublions pas qu'il s'agit d'un C interprété. À l'instar de toutes les autres calculettes, le Z-1 n'intègre pas de compilateur, juste un assembleur embarqué. Je sais bien que mon code C est naïf, et qu'il n'est pas non plus optimisé sur la taille. Mais si vous avez des suggestions, n'hésitez surtout pas à utiliser l'espace commentaires ci-dessous !

samedi 19 janvier 2013

La CASIO FX-7500G : un petit format et 140g seulement, avec les piles

Cette petite calculatrice m'a coûté plus de 12 € (trois piles) pour la remettre en service, mais je crois que je me suis fais un peu avoir par le commerçant du quartier. En effet, ces piles CR2025 sont moins chères sur internet. L'opération d'échange nécessite d'ouvrir la calculatrice avec un petit tournevis. Mais leur logement est bien foutu : la visserie miniature et les fixations en métal inspirent confiance. Cette conception CASIO, très compacte, est beaucoup plus rassurante que la languette de fermeture à piles mal fichue de la HP-28S, par exemple. Cette dernière est pénible à manipuler sous la pression d'un ressort, et elle vieillit assez mal. Indigne de la marque Hewlett ?

Bref, revenons à ma FX-7500G de 1988 qui fonctionne toujours parfaitement, comme toutes mes calculatrices de la même époque. Son clavier est tout plat, avec de minuscules reliefs, du style écriture braille (mais ce n'est pas du braille, dommage). Et même s'il n'est pas hyper agréable, ce clavier reste relativement fiable. Les fonctions essentielles sont bien disposées, sauf les lettres alphanumériques (normal pour ce type de calculette). En fait, il n'y a pas plus de fonctions que ce qui apparaît sur la sérigraphie. Donc, rien de très excitant : juste l'essentiel pour passer les examens, et 4 Ko de mémoire.

L'écran graphique est capable d'afficher 8 lignes de calculs (4 calculs + 4 résultats). Mais, comme sur la FX-4000P, qui est de "puissance" équivalente, il n'est pas possible de rééditer plus loin que le calcul précédent. Ce système est donc moins avancé que les 8 lignes virtuelles de la FX-850P, par exemple.

La FX-7500G extra plate

Mon petit programme de test sur les nombres premiers, est strictement identique à celui que j'avais développé pour la FX-4000P :

Lbl 0:"N":?->N:Int (\/N)->J:2->I:Frac (N/2)=0=>Goto 1:3->I:
Lbl 3:I>J=>Goto 2:Frac (N/I)=0=>Goto 1:I+2->I:Goto 3:
Lbl 1:I&Goto 0:
Lbl 2:1&Goto 0


Caractères spéciaux :

- '->' correspond à l'affectation d'une variable (au dessus de J sur le clavier)
- '\/' correspond à la racine carrée (tout en haut)
- '=>' est l'implication ([shift] [7])
- '&' est le triangle pause ([shift] [:])

 Le calcul sur le nombre premier 524 287 s'éxecute sur cette FX-7500G en 10 secondes environ. Ce qui est une excellente performance !