Présentation du projet
Le développeur a créé une version jouable de Contra pour la console NES directement dans le navigateur. Le jeu original, sorti en 1987, fonctionne grâce à un port natif qui repose sur le code assembleur 6502 du titre. L’interface utilisateur indique les contrôles clavier (flèches, A, S, Enter, Shift) et précise que chaque joueur utilise la même disposition sur son propre ordinateur, ce qui montre que le jeu ne dépend pas d’un serveur multijoueur mais d’une exécution locale synchronisée.
Chaîne de compilation ASM→C→WebAssembly
Le processus décrit commence par la traduction du code assembleur 6502 en langage C. Cette étape implique la réécriture de routines d’accès mémoire, de gestion du PPU (Picture Processing Unit) et du APU (Audio Processing Unit) afin de les rendre compatibles avec le modèle de programmation C. Une fois le code C obtenu, il est compilé en WebAssembly à l’aide d’un compilateur tel qu’Emscripten, qui génère un module .wasm exécutable dans le moteur JavaScript du navigateur. La chaîne de compilation conserve la logique temporelle du jeu (interruptions, synchronisation du VBlank) grâce à des appels d’importation JavaScript qui reproduisent les timers du matériel NES.
Architecture d’exécution dans le navigateur
Le module WebAssembly est chargé via WebAssembly.instantiateStreaming et exécuté dans un environnement sandboxé. Les entrées clavier sont capturées par des écouteurs d’événements JavaScript qui transmettent les états de touches au module via une mémoire partagée. Le rendu graphique repose sur le Canvas HTML5 : le code WebAssembly écrit les pixels dans un tableau de couleur qui est ensuite copié dans le contexte 2D du canvas à chaque rafraîchissement. Le son est produit par l’API Web Audio, où les valeurs de registre APU sont converties en flux audio. Cette architecture minimise la latence, car le calcul du gameplay, le rendu et le son restent dans le même thread WebAssembly, évitant les allers‑retours fréquents entre JavaScript et le module.
Limitations et perspectives
Le port repose sur une émulation logicielle du matériel NES, ce qui implique des contraintes de précision. Sans accès direct au hardware, certaines subtilités du timing du processeur 6502 peuvent différer légèrement, entraînant des variations de comportement dans les niveaux les plus sensibles. De plus, le jeu ne supporte que le clavier; aucune prise en charge native de manettes de jeu n’est fournie, ce qui limite l’expérience pour les joueurs habitués aux contrôles d’origine. Enfin, l’absence de synchronisation réseau signifie que le mode « deux joueurs » fonctionne uniquement en parallèle sur deux machines distinctes, sans interaction en temps réel. Une évolution possible serait d’ajouter un serveur WebSocket pour partager l’état du jeu, ou d’intégrer la prise en charge des API Gamepad afin d’élargir la compatibilité matériel.