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.