← Все новости

Contra с NES переписали с ассемблера на C и собрали в WebAssembly — с сетевым кооперативомNES Contra was rewritten from assembly to C and compiled to WebAssembly — with online co-op

Разработчик epoyraz перенёс Contra 1987 года с ассемблера 6502 на C, сверил поведение с эмулятором Mesen кадр за кадром и собрал результат в WebAssembly. Игра идёт в браузере, а кооператив на двоих работает по сети.Developer epoyraz ported 1987's Contra from 6502 assembly to C, verified behaviour frame by frame against the Mesen emulator and compiled the result to WebAssembly. The game runs in a browser, and two-player co-op works over the network.

Эмулятор исполняет чужой код на смоделированной машине. Здесь сделано иначе: игру перевели на язык высокого уровня, а затем собрали под новую платформу. Contra с NES написана на ассемблере 6502, и её перенесли на C вручную, функцию за функцией, сохраняя поведение оригинала.

Как проверяли точность

Главный риск такого переноса — «почти работает». Тайминги, порядок отрисовки спрайтов и обработка прерываний в оригинале привязаны к частоте кадров, и любая мелочь меняет ощущение от игры. Автор сверял результат с высокоточным эмулятором Mesen: сравнивалось поведение кадр за кадром, а не общее впечатление.

Исходной точкой послужил аннотированный дизассемблер другого разработчика: работа шла не с бинарником, а с понятным описанием логики.

Что получилось в итоге

Компиляция C в WebAssembly дала версию, которая запускается в браузере без плагинов и без эмулятора в основе. Сверху добавили то, чего в 1987 году быть не могло: кооператив на двоих по сети. Оба игрока нажимают одни и те же клавиши на своих компьютерах, а подключение идёт через собственный сетевой слой.

Почему такие проекты важны

Это редкий пример честной модернизации: не эмуляция, не ROM в обёртке, а перевод кода с сохранением поведения. Такой подход продлевает жизнь старым играм и заодно показывает, как выглядит перенос, который можно проверить объективно — сравнением кадров, а не субъективной оценкой «похоже». Исходники открыты, так что методику можно повторить на других проектах эпохи 6502.

An emulator runs foreign code on a simulated machine. This is different: the game was translated into a high-level language and then built for a new platform. NES Contra is written in 6502 assembly, and it was ported to C by hand, function by function, preserving the original’s behaviour.

How accuracy was checked

The main risk in such a port is “almost works”. Timings, sprite draw order and interrupt handling in the original are tied to the frame rate, and any small deviation changes how the game feels. The author verified the result against the high-accuracy Mesen emulator, comparing behaviour frame by frame rather than going by overall impression.

The starting point was an annotated disassembly prepared by another developer — so the work proceeded from a readable description of the logic rather than from a binary.

What came out

Compiling the C to WebAssembly produced a version that runs in a browser with no plugins and no emulator underneath. On top of that came something impossible in 1987: two-player online co-op. Both players press the same keys on their own machines, connected through a custom networking layer.

Why such projects matter

This is a rare case of honest modernisation: not emulation, not a ROM in a wrapper, but a translation of code that preserves behaviour. It extends the life of old games and shows what a port looks like when it can be checked objectively — by comparing frames instead of judging that it “feels right”. The sources are open, so the method can be repeated for other 6502-era projects.

Источники