What Fun !, du BASICODE sur un vinyle

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.

Une page de résumé est en ligne, mais certains disques des années 80 et 90 contiennent des données pour d’anciens ordinateurs. Pas de vraies pistes de données, mais des informations encodées directement dans la partie audio. Je vous mets des liens vers les précédents sujets.

Camouflage (ZX81)
Camouflage (mais en mieux) (ZX81)
Över Tid Och Rum (Atari 8 bits)
Everybody Loves Urusei Yatsura (ZX Spectrum)
Peace and love, inc. (texte caché)
Inner City Unit (ZX Spectrum)
Plastic Raygun (ZX Spectrum)
Aural Quest (ZX Spectrum)
Kissing The Pink (BBC Micro B)
The Bermuda Triangle (Tarbell)
Brainfuel 2 (ZX Spectrum)
So Long America (NEC PC-8001)
Tu Dammi La Metà (MSX)
XL·1 (ZX Spectrum)
Talk To Me (ZX81, ZX Spectrum, BBC Micro, Apple II)
David El Gnomo (ZX Spectrum)
Glamour Screen$ (ZX Spectrum)
Bál Az Operában (ZX Spectrum)
Newtown Parkway / Astrablast (BBC Micro B)
Zero Day (Commodore 64)
Black Mirror: Bandersnatch (ZX Spectrum)
Don’t Be Afraid (texte caché)

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.

La pochette annonce la couleur (en bas)

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 IFI28 THENI0=1
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