En cherchant d’autres disques avec des données informatiques, je suis tombé sur Let’s Get Digital de What Fun!, un groupe hollandais. Et j’ai bloqué un peu avant de faire fonctionner le programme.
Au lieu de vous mettre tous les articles précédents à chaque fois, je vous renvoie vers la page dédiée, elle explique ce que je fais avec les vinyles et liste toutes les pages qui contiennent les programmes, les explications, etc.
Lors de mes premiers essais, j’ai considéré que ce que disait le texte trouvé sur YouTube était vrai, c’est-à-dire qu’il s’agissait d’un programme pour ZX Spectrum. Mais après quelques essais infructueux, j’ai regardé la pochette et j’ai lu « This record contains a computer programme in N.O.S. BASICODE. ». Une recherche Wikipedia plus tard, j’ai appris que le BASICODE est une sorte de BASIC standardisé utilisé aux Pays-Bas, et qu’il permet de lancer des programmes sur différents ordinateurs. La méthode pour le décoder est même disponible sur la page et passe par Minimodem, que j’avais déjà utilisé. J’ai donc passé mes enregistrements à la moulinette pour décoder le tout.
Le résultat était remplis d’erreurs (corrigibles manuellement) lors de mes premiers essais, mais je me suis rendu compte qu’en filtrant les fréquences (filtre passe-bas à 5 000 Hz, passe-haut à 300 Hz), le résultat était pratiquement parfait (juste une ligne mal encodée). De plus, il existe des sites qui affichent le code (avec une erreur sur une ligne, d’ailleurs, et il faut corriger les "
). Je mets le code en fin d’article, au pire.
La question suivante a été « comment exécuter le code ? ». En théorie, la solution passe par l’interpréteur du BASICODE, éventuellement dans un émulateur. C’est possible, une personne l’a fait sur un Amstrad CPC. En pratique, c’est franchement compliqué. Il faut charger l’interpréteur et ensuite essayer de charger les données une fois ce dernier lancé. Je ne maîtrise pas assez les ordinosaures pour ça, mais ça reste possible et on peut trouver le code pour pas mal d’appareils de l’époque, de l’Apple II au Commodore 64 en passant par les ZX81 et ZX Spectrum (et d’autres). La seconde solution, choisie, c’est un interpréteur de BASICODE moderne. Il en existe un qui est open source et utilisable en ligne (il est en JavaScript). En pratique, le résultat est mitigé de base : il est beaucoup trop rapide et je n’ai pas réussi à le ralentir dans des paramètres permettant de voir réellement l’animation. La première partie de la vidéo montre le résultat avec les réglages par défaut. Pour la seconde, je l’ai ralenti au minimum et j’ai adapté un peu les boucles du code pour que ce soit utilisable, puis j’ai accéléré un peu le tout pour quelque chose de fluide et qui s’approche du résultat sur un véritable ordinateur de l’époque. Sans tricher un peu, il s’exécute en moins de 10 secondes dans l’interpréteur. La version modifié montre bien les animations sans être trop longue, en jouant un peu sur la vitesse de lecture.
Le code
1000 A=100:GOTO20
1010 WF$="WHAT FUN!"
1020 LG$="Let's get DIGITAL"
1030 WL$=WF$+" "+LG$+"."
1040 GOSUB100:PRINTWF$;" ";WF$
1050 OH=20:OV=13:VE=5
1060 OH=OH+1:HO=OH:GOSUB110:GOSUB120:IFHO=OH THEN1060
1070 HO=10
1080 OV=OV+1:VE=OV:GOSUB110:GOSUB120:IFVE=OV THEN1080
1090 OH=OH-1:OV=OV-1
1100 SP$=" "
1110 SP$=SP$+SP$:SP$=LEFT$(SP$,OH)
1120 GOSUB100
2000 FORC=1 TOOV-2 STEP2
2010 PRINTTAB(INT(C*OH/OV));"*"
2020 PRINTTAB(INT((OH-17)/2));LG$
2030 NEXTC
2040 FORI=1 TO5000:NEXTI
3000 GOSUB100
3010 FORP=1 TOINT(OV/7)
3020 FORQ=0 TO6
3030 TQ=1+INT((OH-19)*Q/7)
3040 IFQ=5 THENBH=TQ
3050 PRINTTAB(TQ);WF$;" ";WF$
3060 NEXTQ
3070 NEXTP
3080 NR=INT(OH/6)
4000 FORL=1 TO350
4010 GOSUB260:HO=INT(OH*RV)
4020 GOSUB260:VE=INT(OV*RV):IFVE=OV THENVE=VE-1
4030 GOSUB260:RN=1+INT(NR*RV)
4040 IFL>150 THENRN=OH
4050 IFHO+RN>OH THENRN=OH-HO
4060 IFVE<>5 THEN4080
4070 IFHO<=BH+8 ORHO+RN>=BH THEN4090
4080 GOSUB110:PRINTLEFT$(SP$,RN);
4090 NEXTL
5000 IM=2*(OH+OV)-3:I0=1
5010 FORI=0 TOIM
5020 IFI
5080 NEXTI
5090 FORI=1 TO5000:NEXTI
5100 RUN
30000 REM LET'S GET DIGITAL
30010 REM
30020 REM EEN PROGRAMMA VAN
30030 REM HAN VOET
30040 REM EN
30050 REM JACK HAUBRICH
GOSUB100 etc.
Il manque pas un bout du programme avant la ligne 1000 ?
Sur Wikipedia English – https://en.wikipedia.org/wiki/BASICODE
La mise en œuvre de base était constituée d’applications utilitaires spécifiques à l’architecture qui exécutaient des appels de sous-routines. Pour ce faire, toutes les lignes de programme inférieures à 1000 étaient réservées au Bascoder, et les programmes BASICODE ne pouvaient commencer qu’à la ligne 1000.
Je comprend mieux maintenant.
J’aurai appris plein de truc a la suite de la lecture de cette article. Pour info complémentaire :
C’est en 1979 ou 1980 que NOS (le radiodiffuseur néerlandais « Nederlandse Omroep Stichting ») a commencé à transmettre des programmes informatiques à la radio dans le cadre de l’émission populaire Hobbyscoop. En 1982, les gens de Hobbyscoop ont eu l’idée d’inventer un format de cassette standard pour transmettre des programmes BASIC par voie hertzienne. Ce format s’appelait BASICODE.
https://www.hobbyscoop.nl/the-history-of-basicode/
https://lennartb.home.xs4all.nl/basic/basicode.html
GOTO 20
Initialise le programme. La variable A doit contenir le nombre total maximum de caractères pour toutes les chaînes de caractères requises par le programme. Après l’initialisation, l’exécution du programme se poursuit à la ligne 1010.
Sous Routine
100 Effacer l’écran.
110 Placer le curseur à la position donnée par les variables HO et VE.
120 Lire la position du curseur et la retourner dans les variables HO et VE.
200 Lit la touche du clavier et la renvoie dans IN$. Retourne une chaîne vide si aucune touche n’est disponible.
210 Attendre et lire une touche du clavier et la retourner dans IN$.
250 Bip.
260 Retourne un nombre aléatoire entre 0 et 1 dans RV.
270 Retourne la quantité de mémoire libre dans FR.
300 Convertir le nombre SR en chaîne de caractères, retournée dans SR$.
310 Convertir le nombre SR en chaîne de largeur fixe, largeur=CT places après le point décimal=CN, retournée dans SR$,
350 Imprimer SR$ sur l’imprimante.
360 Nouvelle ligne sur l’imprimante.
Les noms de variables avaient une longueur maximale de 2 caractères et un grand nombre d’entre eux étaient interdits (IF, FN, GR, AT etc.) et ceux commençant par O étaient réservés à un usage interne dans la bibliothèque de sous-routines.
Un programme Basicode devait indiquer l’espace réservé aux chaînes de caractères dans la variable A sur la première ligne. Le début d’un programme se présentait comme suit :
1000 A=1000:GOTO20
1010 REM La première ligne du programme.
Il y avait une convention pour utiliser les numéros de ligne de la manière suivante :
1000-19999 Programme principal.
20000-24999 sous-routines.
25000-29999 Lignes de données.
30000-32767 Note de copyright etc.
https://github.com/robhagemans/basicode/blob/master/BASICODE.rst