Skip to main content
Jay Jennings Jay Jennings Product Manager ยท Product Designer
Back to work

Contra Force: MMC3 to VRC6 Port

A retro reverse-engineering project to fix the slowdown in Konami's 1992 NES game.

About the Project

Contra Force title screen: the Konami logo above the red and white Contra logo with Force in green, Push Start Button, and the 1992 Konami copyright licensed by Nintendo of America.
Title screen of the VRC6 port.

Contra Force shipped in North America on Nintendo's MMC3 mapper instead of Konami's own VRC6 chip, and its infamous slowdown is largely the cost of working around that hardware. This project ports the game to the VRC6 mapper (iNES mapper 24) to remove that overhead. The work started with a bank-aware disassembly of all 16 PRG banks, every one verified to reassemble byte-for-byte against the original ROM, followed by a reorganized 256KB PRG layout that gives VRC6's single 16K switching window every bank pairing the game uses. The bank-switch, CHR and mirroring routines were rewritten in place, and the HUD raster split was redesigned around VRC6's CPU-cycle IRQ counter. Each optimization was proven equivalent with a custom 6502 emulator that runs tens of thousands of random machine states through the old and new code, then regression-tested frame by frame in FCEUX and Mesen2. The current prototype boots and plays pixel-identical to the original through the title, cutscenes, character select and level one, while cutting per-frame CPU cost by 8.3% and lag frames from 13.5% to 7.6%.

Inspiration for this project came from DisplacedGamers (opens in new tab) and their video (opens in new tab). This project is ongoing, and I welcome any feedback or contributions.

Screenshots

Captured from the VRC6 build in headless Mesen2 with scripted input. Given the same input, the port's frames match the original pixel for pixel, including the HUD below the raster split.

Player select screen with Burns highlighted for player one. The four commandos, Burns, Smith, Iron and Beans, are shown in a two by two grid with their weapons.
Player select.
Stage 1 at the harbor: Burns jumps toward a warehouse while enemy soldiers attack from the roof and ground. The HUD at the bottom shows the score and Burns with one life left.
Stage 1, the harbor.
Stage 1 at the warehouse doors: Burns fights soldiers on the ground while more enemies jump down from the upper walkway. The HUD stays fixed at the bottom of the screen.
Stage 1, the warehouse.

Download the Patch

Apply the IPS patch to an unmodified Contra Force (USA) ROM with any IPS patcher, then play it in an emulator with mapper 24 (VRC6) support such as Mesen2 or FCEUX. This is a work-in-progress prototype.

Game has been tested on real hardware in one player mode with an Everdrive N8 Pro. Two player mode has not been tested.

Download IPS Patch
Base ROM CRC32 (no header):
A94591B0
Patched ROM CRC32 (no header):
3AE97464

Game Genie Codes

Code Effect
TPNZSPZE Invincible A
OZNZXOOK Invincible B
AAVXSPYZ Invincible C
OPUYTTLE Extra Lives
KXNZLITA Pit Warp
APXZAPEI Walk on Water

Raw EverDrive cheat text

{+,TPNZSPZE,"INVINCIBLE.A..."}
{+,OZNZXOOK,"INVINCIBLE.B..."}
{+,AAVXSPYZ,"INVINCIBLE.C..."}
{+,OPUYTTLE,"EXTRA.LIVES...."}
{+,KXNZLITA,"PIT.WARP......."}
{-,APXZAPEI,"WALK.ON.WATER.."}