On continue notre série des défis avec aujourd'hui celui de Miami Sound Machine Maker (MSMM pour les intimes) concocté par QTIPS et Captain Crack.
Ici point d'image (ou de texte) à signer mais juste une musique à extraire. Qu'entend-on par extraire ? Et bien en faire un fichier exécutable autonome afin de pouvoir avec un simple BRUN lancer (et écouter) la zic ! Il faut se rappeler qu'extraire des musiques de jeux était un sport national à l'époque. Et la série des Miami Sound Machine était directement issue de cette activité le plus souvent nocturne. MSMM était un peu l'équivalent des Déplombages Mode d'Emploi dans son domaine. Un recueil de textes expliquant comment la musique de tel ou tel jeu. Il était donc logique que son défi soit une application directe de son contenu ! J'ai sûrement dû lire (avec grand plaisir) les textes à l'époque mais j'avoue que je n'ai pas (encore) renouvelé l'expérience, ne voulant pas être influencé pour la résolution du défi. On va voir que finalement, nul besoin de connaissances ésotériques particulières pour le relever !
Comme toujours quand on aborde un défi, on observe et on surveille, notamment tout ce qui se passe depuis le boot du disque jusqu'au défi en lui-même (et donc entendre la musique ici) :
- petit affichage au boot signé QTIPS et Captain Crack.
- bon c'est long à charger... À priori ce n'est pas un fast boot quelconque donc...
- une petite animation sympatoche apparaît. On peut la zapper avec ESC d'ailleurs.
- écran de présentation (comme toujours propre et net à la QTIPS quoi !).
- prompt (]) du DOS qui apparaît ! <-- ohoh !
- et enfin lancement de la musique...
- une oreille attentive reconnaît immédiatement de l'Electric Duet, le fameux logiciel qui permettait de faire de la musique "facilement" sur Apple II à l'époque. Bon évidemment il fallait quand même un peu de patience (et beaucoup de talent).
Vu que la musique est chargée et lancée juste après le DOS (qui est lui-même chargé après l'animation d'intro), on va tout simplement essayer le CTRL+C afin de stopper tout programme BASIC qui serait exécuté à ce moment là. On ne sait jamais hein... !
On relance donc le Disk, on zappe l'intro, on passe l'écran de présentation, on attend dans les starting blocks que le ] apparaisse et là on mitraille le clavier à coup de CTRL+C pour être sûr de ne pas rater le bon moment (j'aurais dû prévenir qu'il allait falloir faire preuve de dextérité, à défaut de technicité...) ! Et boom !
] BREAK
On n'y croyait pas vraiment mais comme quoi, tout arrive... On hésite presque à faire un LIST en se disant que non, ce n'est pas possible. On n'oublie pas de faire avant un petit RETURN pour vider le buffer d'un éventuel CTRL+C restant qui générerait un ?SYNTAX ERROR malvenu car en fait LIST marche parfaitement !
Et on se retrouve face à tout le programme de lecture des fichiers TEXTE du disque etc.
On va particulièrement s'intéresser au tout début du programme (normal puisque le défi se situe à priori avant) donc on fait un LIST 0-5 pour limiter l'affichage.
On remarque immédiatement (ligne 1) le BLOAD PLAYER et le BLOAD M.MIAMI (M comme Musique peut-être...) puis l'affichage (ligne 2) du texte du défi. Et enfin quelques POKE et autres CALL pour faire bonne mesure (et accessoirement pour pouvoir lancer le player sans doute).
Et encore après, on aperçoit le début de la partie principale du programme, et ce, dès la ligne 5.
C'est à dire que tout le défi est probablement là sous nos yeux entre les lignes 0 et 4 !
Allez, puisqu'on a la main, on tape un CATALOG histoire de voir si on a bien PLAYER et M.MIAMI en stock et c'est réglé...
Ah tiens, CATALOG ne marche pas (?SYNTAX ERROR)... La commande a sans doute été désactivée par nos deux amis. Les malins ! Pas grave, on va booter un bon vieux DOS 3.3 classique et on verra enfin ce qu'ils essaient de nous cacher.
Sauf que quand on fait ça, et bien il ne va apparaître que la longue liste des fichiers textes ainsi que la liste des utilitaires mais aucune trace de nos fichiers PLAYER et M.MIAMI ! On a bien un MODULE ELECTRIC DUET dans la liste mais c'est tout.
Pourtant, que ça soit la musique ou le player, on sait qu'ils sont BLOADés par le DOS donc qu'ils apparaissent forcément en CATALOG. Ce n'est pas de l'accès direct, donc les fichiers sont nécessairement référencés sur le DISK et le DOS (même trafiqué) de MSMM doit les trouver.
Deux solutions ici : ou le programme BASIC est un leurre (peu probable) ou le CATALOG renvoyé n'est pas le bon.
Pour se débarrasser de la première hypothèse, on relance MSMM, on re-matraque le CTRL+C et au lieu d'un LIST, on balance un bon gros RUN.
Résultat : le défi (et le reste) s'exécute bien.
Conclusion : le programme BASIC charge bien les fichiers et lance le défi.
Conclusion bis : il y a bien un autre CATALOG quelque part sur la disquette !
Allez, on lance Diskfixer (perso j'utilise la version du Ze Enfoiré Copy Disk) et on met MSMM dans le grille pain. Qu'allons-nous chercher exactement ? Et bien quelque chose qui ressemble à ce qui se trouve TRACK $11 / SECTOR $0F c'est à dire un CATALOG DOS. Car oui en T$11/S$0F, place standard il y en a bien un (celui qui nous est renvoyé quand on fait CATALOG depuis un DOS 3.3 classique) mais ce n'est pas le bon. Celui là c'est juste pour amuser la galerie. Nous on cherche le vrai, celui qui est utilisé par les commandes du DOS (comme BLOAD) de MSMM. On peut s'amuser à se taper tout le DISK depuis le début ou alors on essaie d'être un peu malin et on matte directement autour de la piste $11. Tout le monde sait que si la piste $11 est utilisée dans un DOS 3.3 pour stocker VTOC et CATALOG, ce n'est pas par hasard. C'est simplement la piste centrale d'une disquette. Comme chaque commande DOS, faisant référence à un fichier (c'est à dire quasiment toutes), doit d'abord aller checker dans le CATALOG si le fichier existe, et ensuite seulement l'utiliser (on passe sur les détails), les concepteurs du DOS ont donc placé ce CATALOG en position centrale afin de limiter au maximum les déplacements de la tête de lecture (qui coûte cher en temps). On se dit donc que puisque QTIPS et CaptainCrack sont eux aussi, des malins, ils n'auront sûrement pas pourri leur disk en foutant le (vrai) CATALOG piste $22 par exemple. On va donc directement chercher en piste $10 ou $12 et si on ne trouve rien, on élargira le périmètre. Oui c'est une méthode empirique certes mais efficace !
Fin du suspens : tout est T$10/S$0F. Le vrai CATALOG a donc été déplacé d'une piste. On y découvre répertoriés les fichiers txt déjà vus sur le faux CATALOG (bah oui, ils sont réellement sur le disk et chargés par le programme basic, il faut donc bien qu'ils soient aussi référencés). Et on y découvre d'autres petits trucs qu'on voulait nous cacher... Comme les fichiers d'animation et les images de l'intro. Et bien entendu, on y trouve également (T$10/S$0A) PLAYER et (T$10/S$0B) M.MIAMI ! N'oubliez pas qu'on était surtout là pour eux...
- Et si on s'était tapé tout le disque à la pogne sous Disfixer, secteur par secteur, aurait-on découvert d'autres choses intéressantes ?
- Et bien oui !
- Par exemple TRACK $00 / SECTOR $0D / BYTE $DF : un joli Copyright BAUDVILLE. En effet, pour ceux qui n'auraient pas encore percuté, l'intro avec "Super QTIPS" c'est du TAKE 1, LE fameux programme pour faire des chouettes animations sur Apple II. En fait visiblement, on a affaire ici à un disque d'animation généré par TAKE One et trafiqué ensuite par nos amis pour lui faire charger après l'intro, un DOS et le programme BASIC qui va avec. Joli...
- Autre chose ?
- RE-Oui !
- TRACK $05 / SECTOR $01 / BYTE $D3 : en plein dans la liste ASCII des commandes du DOS chargée par MSMM, on repère ce qui a été (dans une autre vie) la commande CATALOG...Renommée ici en @@U@FGG. Essayez donc après avoir rechargé MSMM, et (re)fait le CTRL+C, CATALOG ne marche évidemment toujours pas mais @@U@FGG oui ! Et cette commande nous affiche bien entendu le vrai CATALOG ! Avec les vrais fichiers...
Bon OK c'est bien beau tout ça, on a regardé sous les jupes de la disquette, mais quid du défi ? Et bien il est quasiment fini... On a tout ce qu'il nous faut pour le faire maintenant !
Démonstration :
- on charge un DOS 3.3 (tout ce qu'il y a de plus classique)
- on insère dans le mange-disque MSMM
- Première étape : récupérer les deux fichiers PLAYER et M.MIAMI
On ne peut pas les BLOADER directement (car notre DOS les cherchera dans le CATALOG piste $11 et ne les trouvera pas).
Solution : indiquer à notre DOS que le CATALOG est en piste $10 !
Précision : en fait jusqu'à présent j'avais simplifié les choses en parlant du CATALOG, mais c'est plus exactement la VTOC (table d'allocation des secteurs) qui est référencée dans un DOS 3.3 standard piste $11/ secteur $00. Et c'est cette VTOC qui contient ensuite les informations avec la piste et le secteur du début de catalog ($11/$0F en standard). Vous aurez compris que sur MSMM la vraie VTOC est piste $10/secteur $00 et indique un début de catalog en $10/$0F.
Un DOS 3.3 classique stocke en $AC01 la piste de la VTOC (donc normalement $11) et en $B00D son secteur (normalement $00). Ces informations sont récupérées à chaque exécution des commandes CATALOG, BLOAD et BSAVE (entre autres). On va donc changer la valeur en $AC01 par un $10 quand on voudra lire le fichier sur le disk MSMM. Et remettre un $11 à la même adresse juste avant de le sauver sur notre disk "normal" (pas besoin ici de s'occuper du secteur qui est $00 dans les deux cas). On aura également besoin du contenu des adresses $AA72/$AA73 et $AA60/$AA61 pour récupérer les infos des fichiers après un BLOAD (on aurait aussi pu utiliser DiskFixer pour aller directement lire l'adresse de chargement et la longueur du fichier sur son premier secteur).
C'est parti :
- CALL -151 (on passe sous Monitor)
- $AC01 : 10 (on déclare la VTOC en piste $10 pour MSMM)
- CTRL+C pour sortir du Monitor et retour au DOS
- BLOAD PLAYER (on charge le programme PLAYER depuis MSMM)
- CALL -151 (on repasse sous Monitor)
- on checke ce qu'il y a en $AA72 (=$00)
- et en $AA73 (=$1E)
- on a ainsi récupéré l'adresse de chargement du programme PLAYER (soit $1E00)
- on checke ce qu'il y a en $AA60 (=$EB)
- et en $AA61 (=$00)
- on récupère ainsi la longueur du fichier chargé (soit $00EB octets)
On a donc chargé le programme PLAYER en $1E00 et sa longueur est $00EB.
On a donc maintenant toute les infos pour le sauver sur notre disquette DOS 3.3 standard :
- $AC01 : 11 (on remet la valeur Piste VTOC par défaut)
- CTRL+C (sortie de Monitor)
- BSAVE PLAYER,A$1E00,L$EB (avec notre disk DOS 3.3 de travail inserré)
On refait exactement la même chose pour M.MIAMI :
- CALL -151
- $AC01 : 10
- CTRL+C
- BLOAD M.MIAMI (Disk MSMM inserré évidemment)
- CALL -151
- $AA72 (=$00)
- $AA73 (=$28)
- donc adresse de chargement de M.MIAMI = $2800
- $AA60 (=$A6)
- $AA61 (=$02)
- donc longueur du fichier = $2A6
On peut donc sauver cette fois M.MIAMI :
- On remet $11 en $AC01 depuis le Monitor
- On n'oublie pas de remettre notre disk de travail dans le lecteur
- BSAVE M.MIAMI,A$2800,L$2A6
Arrivé à cette étape, on a donc nos deux fichiers sur la disquette de travail. L'objectif étant de faire un fichier unique et BRUNABLE, on va donc recoller le tout. En fait, on aurait pu le faire directement sans sauvegarde préalable (et fastidieuse) mais afin d'avoir un disque de travail complet exprès pour vous, j'ai préféré ne pas shunter cette étape facultative (je suis trop bon...).
Le fichier M.MIAMI ne contient que les data brutes (format Electric Duet) de la musique. On peut les mettre où l'on veut. Le PLAYER quant à lui se charge en $1E00. Par contre il va falloir lui indiquer où trouver les data. Quelqu'un se souvient des POKE effectués avant les CALL dans le programme BASIC ? Et oui c'était notamment le passage des paramètres. Le Player utilise en fait les adresses $1E/$1F en Page Zéro pour stocker l'adresse (LO/Hi) de l'endroit où se trouve les data qu'il va utiliser. Il faudra donc ne pas oublier de lui indiquer.
Allez on recolle tout ça, on fixe les adresses et on sauve le tout :
- BLOAD PLAYER (on charge le player en $1E00)
- BLOAD M.MIAMI (on charge la musique en $2800)
- CALL -151 (on passe sous Monitor pour notre bricolage)
- 1F00<2800.2B00M (déplacement des data "musique" en $1F00 juste après le PLAYER... oui on a compté large)
On ajoute juste avant le player un petit code qui va fixer les adresses et lancer la routine :
1DF0 : A9 00 ; LDA #$00 1DF2 : 85 1E ; STA $1E 1DF4 : A9 1F ; LDA #$1F 1DF6 : 85 1F ; STA $1F ; $1F00 = adresse pour les DATA 1DF8 : 20 00 1E ; JSR $1E00 (exécution de la routine du PLAYER) 1DFB : 60 ; à la fin on sort...
Il ne reste plus qu'à sauver le tout à partir de $1DF0 (évidemment) :
- BSAVE STANDALONE,A$1DF0,L$3B7
- avec L = (1F00+2A6)-1DF0+1 = 3B7
Et voilà, on a un joli programme STANDALONE qui se BRUN et qui joue la musique de Miami Sound Machine Maker ! Merci à QTIPS et à Captain Crack pour ce défi original !
Vous pouvez télécharger directement la disquette de travail et retrouver les deux fichiers PLAYER et M.MIAMI ainsi que le programme STANDALONE, solution du défi.
Et puisqu'on ne se refuse rien au nom de l'Internet Multimédia 2.0 voici en exclu pour vous ZE musique :
Clip audio : Le lecteur Adobe Flash (version 9 ou plus) est nécessaire pour la lecture de ce clip audio. Téléchargez la dernière version ici. Vous devez aussi avoir JavaScript activé dans votre navigateur.