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ésulat 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.