
Le 11 octobre, un compte japonais que je suis de près poste : « FPSの大名作『Wolfenstein 3D』が、NEOGEOに勝手移植!! ». Le grand classique du FPS, porté sur Neo Geo. 勝手移植, « portage sauvage », est un terme affectueux là-bas : celui des portages que personne n'a commandés. Je connais ce compte parce qu'il avait présenté notre studio quelques semaines plus tôt, et cette mise en avant-là, je l'avais sollicitée. Son post sur le portage est arrivé tout seul.
Le lien pointe vers wolfmvs.com. On y apporte les fichiers de la version shareware de 1992, et on en repart avec une ROM qui démarre sur une borne d'arcade de 1990. Dix niveaux, des ennemis qui patrouillent et ouvrent les portes, l'arsenal, le score, la musique.
Ce que le tweet ne dit pas, et que ce blog raconte à chaque fois : ce portage a été écrit par des agents IA, en deux mois. Voici comment.
Ce qui est sorti
wolfmvs est un portage de l'épisode shareware de Wolfenstein 3-D pour la Neo Geo MVS, la borne d'arcade que SNK a sortie en 1990. Un portage complet, pas une démo technique qui tourne en rond dans un couloir : les dix niveaux, les gardes qui patrouillent, vous repèrent et ouvrent les portes pour vous poursuivre, les quatre armes, le score, les bruitages, les musiques. Le jeu de 1992, celui qu'on finit.
La particularité est dans la façon de l'obtenir. Le site ne distribue aucune donnée du jeu, aucune. Vous apportez les fichiers de la version shareware (elle se trouve légalement en deux clics), et la ROM se construit dans votre onglet, chez vous. C'est une friction réelle, on y reviendra ; c'est aussi exactement ce qui rend ce site publiable.
La ROM qui en sort démarre dans l'émulateur de la page, celui du studio Sprixe. Elle démarre aussi ailleurs. La page l'annonce en toutes lettres : runs on real hardware, confirmé sur une MV2F consolisée sous UniBIOS, depuis une cartouche flash BackBit Platinum et une NeoSD Pro. Le 12 octobre, un testeur l'a fait tourner sur son propre NeoSD.
Pourquoi personne n'avait fini
Le sujet n'est pas sorti de nulle part. Au printemps 2026, Ars Technica publie « Why a Neo Geo port of Doom is functionally impossible » : la machine n'a pas de framebuffer, rien pour dessiner un monde en 3D, affaire classée. Six semaines plus tard, Hackaday titre « The Neo Geo Does Run DOOM After All », et le même jour Time Extension publie la rétractation de MVG, « I Was Wrong ». Cinq articles en six semaines, sur exactement ce sujet. Quand nos premiers commits arrivent le 7 août, le terrain est ouvert depuis deux mois, et l'article de Hackaday a trois semaines.
Pourquoi personne n'était allé au bout, alors ? Parce que les projets publics sont des prototypes de recherche. Un niveau construit à la main pour l'un, deux cartes sans musique pour l'autre. Sortir une image 3D d'une machine conçue pour afficher des sprites est déjà un exploit ; aucun de ces projets ne prétend être un jeu qu'on finit, le premier se présente lui-même comme un « research prototype ». La marche entre « ça affiche » et « ça se joue », c'est celle qui sépare un POC d'un produit. On l'avait déjà racontée ici sur un autre chantier.
La question d'août n'était donc pas « est-ce possible ». D'autres l'avaient montré avant nous. C'était : est-ce qu'une équipe d'agents, tenue par la bonne boucle de validation, peut le finir. Dix niveaux, des ennemis, du son, et une cartouche qui démarre ailleurs que dans une capture d'écran.
Deux mois, un banc de mesure et des agents
Les premiers commits datent du 7 août. Je voulais une réponse à une question simple avant d'investir quoi que ce soit : est-ce que ça peut être fluide sur une Neo Geo de série ? Un prototype a suffi. Le rapport écrit le même jour conclut GO, et le chantier est parti de là.
On a commencé par construire un juge, avant de toucher au moteur. Un script pilote la manette dans l'émulateur, refait toujours le même parcours et compte les images rendues. Tout le reste du chantier s'est joué contre ce script. Une optimisation qui ne fait pas monter le compteur est abandonnée, même quand l'agent qui la propose argumente bien.
Les agents Claude ont écrit le moteur, la chaîne qui fabrique la cartouche depuis les fichiers du jeu et le rendu du son. Au moment le plus dense, un agent travaillait sur les murs, un autre sur le sol, un troisième sur la vitesse. Chaque chantier passait au banc de son côté. On a ensuite fusionné les trois et rejoué le banc sur le résultat, qui a rendu ma phrase préférée du rapport : « zéro frame ratée sur tout le banc scripté ».
De mon côté j'ai décidé du pivot. Le projet visait DOOM au début, il vise Wolfenstein depuis la mi-août, parce que Wolfenstein se finit. Quand le mode DOOM a été retiré du code un mois plus tard, la vérification montrait des ROM identiques au bit près, donc le retrait n'avait rien cassé. J'ai aussi rejeté deux versions du rendu que les mesures trouvaient correctes. L'image était conforme aux chiffres et moche à regarder, et le banc ne voit pas ça. Sur le volet juridique enfin, j'ai tenu une règle simple pendant deux mois : rien ne se redistribue, et chaque phrase publiée sur le projet repasse par ce filtre.
Le doute le plus long a porté sur l'image à mi-distance. Les correctifs successifs revenaient avec de bonnes mesures et une image toujours fausse. Pendant un moment, personne n'a su nommer le problème, moi compris. Le diagnostic qui a fini par débloquer le chantier dit beaucoup de cette machine, et j'y viens.
Une machine qui ne sait que rétrécir
La Neo Geo affiche des sprites, des images préparées à l'avance qu'elle pose à l'écran, et elle sait les rétrécir à la volée, en plein affichage. SNK l'a conçue pour ça en 1990 : des personnages énormes qui s'approchent ou s'éloignent sans saccade. Dessiner un point à une position quelconque de l'écran, ce qu'un moteur 3D demande en permanence, n'est simplement pas prévu par la machine.
Le portage détourne ce seul talent. Le moteur découpe l'écran en tranches verticales, calcule pour chacune la distance du mur qu'elle regarde, et affiche dans la tranche une colonne de mur sous forme de sprite, rétrécie en proportion de la distance. Un mur proche donne une colonne haute, un mur lointain une colonne réduite, et la perspective sort de là. L'impression de 3D est une illusion d'échelle, fabriquée avec le geste que cette machine répète depuis 1990.
Le processeur impose le reste. Une division coûte trop cher pour tourner à chaque image, alors le cœur du rendu n'en fait aucune : tout ce qui en demanderait une est préparé à l'avance, dans des tables construites au moment où la ROM se fabrique, sur votre machine. La borne se contente de lire des tables et de multiplier, et ça, elle sait le faire vite.
Le défaut de mi-distance s'est dénoué là aussi. On l'avait d'abord traité comme un problème de flou, et deux versions de lissage ont fini à la poubelle : l'image devenait plus douce sans devenir plus juste. Le bon diagnostic a fini par tomber : chaque colonne de l'écran n'allait chercher qu'un seul point de la texture, alors que la zone qu'elle représentait en couvrait plusieurs. Une fois les colonnes nourries avec les points qui manquaient, chaque ligne de l'écran est passée d'environ 76 à environ 300 échantillons utiles, et le défaut a disparu sans qu'on ajoute le moindre flou.
Ce qu'on ne revendique pas
Ce portage n'est pas une première, et personne ici ne le prétend. L'article de Hackaday avait trois semaines quand nos premiers commits sont partis, et d'autres avaient montré avant nous qu'une image 3D pouvait sortir de cette machine. Ce qu'on revendique est ailleurs : parmi les projets publics qu'on a vus, aucun ne montrait à la fois un jeu complet et une image qui tient le rythme ; celui-ci tient les deux. Dix niveaux, des ennemis, du son, un score, une cartouche qui démarre chez un testeur, et un banc qui répond « zéro frame ratée ».
L'image a ses limites, et elles se voient. Les contours des murs avancent par crans de quelques pixels, parce que la machine impose sa grille. Sur les scènes les plus chargées, le moteur choisit la fluidité et baisse la finesse du rendu le temps que ça passe. Le Wolfenstein d'un PC de 1992 reste plus fin que celui-ci.
Il reste la friction promise en début d'article. Apporter ses propres fichiers demande un détour que des visiteurs ne feront pas, et on le sait. On l'a gardée quand même, parce que l'alternative consiste à distribuer des données qui ne nous appartiennent pas. Le shareware de 1992 se trouve librement, et le projet reste propre.
Ce que ça dit de l'agent coding
Ce blog a déjà raconté un émulateur sorti en treize jours, un décodeur vidéo en huit et un produit complet en dix semaines. La méthode était la même et le terrain plus confortable : du code moderne, des specs à lire, des exemples publics partout. Un moteur en C pour un processeur de 1990 n'offre rien de tout ça, et les exemples publics s'arrêtaient là où on voulait commencer.
Ce qui a tenu, c'est la boucle installée le premier jour. Une hypothèse, un correctif, et le banc qui compte les images. Un agent sur-affirme volontiers quand rien ne le mesure ; devant un banc, chaque proposition arrive avec son verdict, et les débats d'opinion ont à peu près disparu du chantier. Le diagnostic d'échantillonnage de tout à l'heure est sorti de cette boucle.
Je retiens la même chose qu'en août, avec un argument de plus. L'orchestration tient sur du code que personne ne sait recopier, à condition de construire d'abord le juge : un critère de succès exécutable, rejouable, qui ne dépend ni de l'avis de l'agent ni du mien. Tout ce que cette borne de 1990 affiche aujourd'hui est passé par là.
wolfmvs.com est en ligne. Apportez les fichiers de la version shareware et la ROM se construit dans l'onglet, chez vous.
La méthode en est à quatre projets publics : un décodeur H.265 en huit jours, un émulateur CPS1 en treize, un produit complet en dix semaines, et maintenant un portage qui tourne sur une borne de 1990. Si un terrain de votre roadmap vous semble hors de portée des agents, on peut en parler.
P.S. — L'article d'août se fermait sur « la prochaine chose à prouver, côté Sprixe : une .neo qui boote sur une vraie AES ». C'est chose faite : les jeux Sprixe démarrent aujourd'hui sur AES comme sur MVS, et wolfmvs fait pareil.