Un Canon EOS 550D de 2010 peut désormais passer sa retraite à faire tourner Doom. Le reflex utilise son écran arrière, ses boutons et même son haut-parleur pour jouer ; tout le matériel était déjà là, évidemment, mais il avait été assemblé pour prendre des photos, pas pour ouvrir des portes en pressant PLAY.14

Le projet Doom550D réussit à y faire tourner une version jouable de Doom comme module Magic Lantern. Les flèches déplacent le joueur, SET tire, le bouton de lecture ouvre les portes, la roue arrière change d'arme et MENU ouvre le menu du jeu. Le son sort aussi du haut-parleur du boîtier.1

Sur un forum, tout ça tient dans un titre : « Doom sur un reflex ». C'est après que le chantier devient intéressant, quand il faut faire cohabiter le jeu avec une machine qui continue obstinément de se comporter comme un appareil photo.

Mauvais écran

Doom classique travaille autour d'une image 320 × 200. Doom550D propose notamment un mode de jeu en 360 × 240, affiché en blocs 2 × 2 sur le tampon 720 × 480 utilisé par le Canon.1

Ce n'est pas un simple changement de résolution. Le module doit écrire dans le framebuffer de l'appareil, manipuler sa palette, puis restaurer correctement cet état quand le jeu se ferme. Le README du projet prévient d'ailleurs qu'un port vers un autre appareil Magic Lantern doit revérifier la mémoire vidéo, le pas des lignes, la palette et les appels Canon utilisés pour l'affichage.1

Autrement dit, « il y a un écran » ne veut pas encore dire « on sait dessiner dessus sans casser le reste ».

Une partie de Doom affichée sur l’écran arrière du Canon EOS 550D
Le port réutilise l’écran du reflex comme surface de jeu. La difficulté n’est pas d’afficher une image une fois, mais de gérer proprement framebuffer, palette et retour à l’interface Canon.Bas Lichtjaar / doom550d

Boutons volés

Même problème avec les commandes. Les touches existent déjà, mais elles appartiennent d'abord au Canon.

Le code de Doom550D définit les événements bruts de pression et de relâchement propres au 550D. Certaines commandes sont volontairement laissées tranquilles : ISO, profondeur de champ et déclencheur ne servent pas au jeu parce que le firmware Canon peut les intercepter sous le module, afficher ses propres overlays, lancer l'autofocus ou reprendre la main sur l'entrée.1

Ce détail change le sens du portage. Il ne s'agit pas seulement d'associer « bouton haut » à « avancer ». Il faut comprendre qui reçoit l'événement, à quel niveau, et ce que l'appareil continue de faire en parallèle.

Pendant la partie, le Canon garde donc ses réflexes de Canon, jusque dans les boutons qu'il refuse de céder au jeu. C'est précisément ce frottement avec la machine d'origine qui rend le portage plus instructif qu'un simple émulateur posé sur du matériel générique.

Le son aussi

La partie audio va encore plus loin.

Le projet ne se contente pas des bruitages. Il lit les données musicales MUS du WAD, les rend avec un synthétiseur entier à faible coût CPU, puis mélange cette musique avec les effets 8 bits de Doom dans un flux mono à 48 kHz envoyé vers la sortie audio du Canon.1

Le dépôt documente huit symboles audio Canon dont dépend cette couche, avec des noms comme StartASIFDMADAC et SetNextASIFDACBuffer. Ils doivent être exportés par la bonne build de Magic Lantern et son fichier de symboles correspondant.1

À ce stade, le vieux reflex ressemble beaucoup moins à une boîte fermée. Canon n'avait aucune raison de prévoir un synthétiseur logiciel sur ce boîtier ; Magic Lantern avait simplement déjà cartographié assez de fonctions internes pour qu'un module tiers puisse s'accrocher à la sortie audio.

3 780 lignes

IRZ a cloné le dépôt courant et compté 76 540 lignes de C et de headers dans le dossier du module. La majeure partie vient évidemment de Doom et de ses ports antérieurs. Plus intéressant : cinq fichiers clairement consacrés à l'adaptation Magic Lantern, au Canon et au synthétiseur totalisent 3 780 lignes dans l'état audité le 21 août.

Ce nombre n'est pas une mesure parfaite du travail original. Il donne plutôt une échelle de la couche qui transforme un moteur déjà portable en logiciel capable de vivre sur cette machine précise.

Schéma montrant Doom au-dessus d'une couche d'adaptation de 3 780 lignes qui dialogue avec Magic Lantern puis le matériel Canon.Comptage IRZ sur le dépôt doom550d : 76 540 lignes C/H dans le module, dont 3 780 dans cinq fichiers centrés sur l’adaptation Canon/Magic Lantern et l’audio. Le découpage est indicatif, pas une attribution de paternité ligne par ligne. Analyse IRZ du dépôt doom550d, commit b4a99c6

Le README du port confirme cette séparation de manière plus utile que le comptage. Pour une autre caméra, l'essentiel du moteur, des WAD, des sauvegardes et du synthétiseur peut être réutilisé. Ce qu'il faut reprendre, c'est la frontière avec l'appareil : affichage, codes des boutons, chemin audio, stockage, nettoyage et tests physiques.1

La portabilité de Doom fait presque l'inverse de ce qu'on pourrait attendre : elle met en évidence tout ce qui reste spécifique au boîtier, parce que c'est cette frontière locale qu'il faut encore écrire à la main.

Pas un firmware

Magic Lantern est la pièce qui rend cette expérience possible sans remplacer entièrement le logiciel Canon.

Sur le 550D, la build disponible exige précisément le firmware Canon 1.0.9. L'installation active un drapeau de démarrage : au boot, le boîtier peut alors lancer le programme présent sur la carte mémoire. Magic Lantern reste sur cette carte ; le firmware Canon d'origine reste en place.2

Doom550D est encore plus strict : sa release est construite pour le Canon EOS 550D / Rebel T2i / Kiss X4 en 1.0.9, avec un core Magic Lantern et un fichier de symboles compatibles. Le projet avertit de ne pas charger ce binaire sur un autre appareil.1

C'est une forme de prolongation assez différente d'un ordinateur généraliste. On n'efface pas le système existant pour installer Linux. On greffe un environnement communautaire sur un firmware propriétaire, puis on dépend d'adresses, de symboles et de comportements qui ont dû être retrouvés par reverse engineering.6

Magic Lantern rappelle d'ailleurs que le logiciel n'est ni approuvé ni soutenu par Canon et qu'une erreur peut endommager l'appareil.2 L'ouverture existe ici, mais elle reste construite par-dessus une plateforme qui ne l'a pas promise.

Deuxième vie

Le 550D est sorti bien avant ce port. Son manuel décrit déjà tout le matériel qui finit par devenir utile au jeu : écran arrière, commandes physiques, lecture vidéo et haut-parleur intégré.3 Seize ans plus tard, la nouveauté ne vient donc pas d'un composant caché. Elle vient d'une nouvelle carte de la machine.

Un précédent récent le montre aussi sur un autre Canon : le projet sd1000-doom fait tourner Doom sur un PowerShot SD1000 de 2007 via CHDK, avec une couche d'adaptation différente.5 Le phénomène ne dit pas que tout appareil est secrètement une console. Il dit qu'un appareil assez documenté peut parfois redevenir une plateforme après la fin de l'usage prévu par son fabricant.

C'est là que les ports absurdes deviennent utiles. Doom apporte un moteur connu et un objectif fixe ; le reste révèle immédiatement les trous dans la documentation. Pour obtenir une vraie partie, il faut que l'affichage, les entrées, l'audio, le stockage et la sortie propre fonctionnent ensemble, ce qui demande forcément d'avoir compris bien davantage que la procédure pour lancer un binaire.

Sur ce Canon, Doom est donc presque la partie facile. Le vrai accomplissement est d'avoir appris au reflex assez de vocabulaire pour qu'un logiciel qui n'avait rien à y faire puisse s'y comporter correctement.