A personal reverse-engineering and porting study by Pascal Peltriaux. The original game's NEC V30 code is translated, instruction by instruction, to the Neo Geo's Motorola 68000, and everything it sends to Irem's video hardware is redrawn with the Neo Geo's sprite engine. On top of that program runs a co-op mode: both players fly at once, on the original's own player code.
Both clips are straight captures of the port running in MAME's Neo Geo MVS emulation at the console's native 320×224, scaled 4× with no filtering. The sound is the Neo Geo's own YM2610 playing the port's FM driver.
80 s Two-player co-op: a 2P start from the title, the fly-in with the 1P and 2P tags, the stage 1 boss, the stage 2 snake, and the stage 3 warship. Both ships were set invulnerable for the capture so the camera stays on the action.
45 s Power-on and attract mode: the Neo Geo BIOS boot, then the original's attract sequence (title, demo play, ranking) running through the translated code.
The arcade board is an Irem M72: a NEC V30 (an x86-compatible CPU) driving two tile layers, a sprite list and a palette RAM. The Neo Geo has a Motorola 68000, no tile layers at all, and 381 hardware sprites that can be chained into columns. The port keeps the original program and replaces its hardware.
A translator (Python, built on the Capstone disassembler) walks the original's code from its interrupt handler and main loop and emits 68000 assembly for every instruction it reaches: about 21,700 x86 instructions. The x86 flags live in the 68000's condition codes, with a liveness pass that saves and restores them only where a later instruction would need them. Segment registers, far calls, string instructions, BCD arithmetic and the V30's own extra instructions are all covered.
The translated code runs against a byte-exact copy of the original's memory: its program ROM image, 16 KB of work RAM, sprite RAM and palette RAM. Every 16-bit word is stored byte-swapped so that the big-endian 68000 reads the little-endian game's words as single moves.
The original writes a 128-entry sprite list, two 64×64 tilemaps and a palette. On the Neo Geo:
Translated code reports what it wrote, so changed tile groups are queued and redrawn in the next VBlank, and only then.
As on the board, the original's start-up code runs once, its main loop then pops tasks from its own queue forever, and the Neo Geo VBlank interrupt runs the original's interrupt handler wherever the main loop happens to be. Long tasks such as screen fills and map streaming span several frames exactly as they did in the arcade. The game gets every Neo Geo frame (59.19 Hz against the original's 55 Hz), so it plays a little faster but scrolls evenly.
Translated code is slower than native code, so the few shared routines every object calls each frame were rewritten in 68000 by hand from a description of what they do: the hit tests (with a broad phase that rejects most candidates before the original's chain of tests), the sprite piece writers, the palette fader, the tilemap clears and the map block streamer. The interrupt handler's object loops are native too, with a per-slot cache of each object's handler address. Everything else is the translation.
The arcade game is single-player with alternating turns. The co-op mode here runs the original's own player code a second time each frame, with player 2's copy of the player objects (ship, Force, shots, beam) swapped in. Player 2 flies a crimson R-9; its shots hit and score for it, enemies can hit it, and the items it touches are its own.
No player logic was rewritten. Each frame the handler runs player 1's code, then the port swaps in player 2's copy of the player objects and runs the same code again. Hooks at a handful of addresses make the original's "the player" mean the right ship: hit tests check both, items go to the one that touched them, and the HUD draws two scores.
| Translated instructions | about 21,700 (everything reachable from the interrupt handler and the main loop) |
|---|---|
| Hand-written routines | 22 shared routines plus the interrupt's object loops; everything else is machine translation |
| Cartridge | 1 MB program ROM, no bank switching; the original's ROM image sits inside it |
| Frames run late | 42 of 5,160 in a profile run of attract mode and play (single player); 495 in co-op, mostly on the stage 2 snake |
| Interrupt handler | 81% of a frame in busy scenes; when four or more tasks are waiting, every other VBlank is left to the main loop so the game slows down instead of dropping tasks, as the original's 64-entry queue would |
| Frame rate | 59.19 Hz (every Neo Geo frame) against the original's 55 Hz |
| Tested on | MAME 0.289 and a Recalbox RGB JAMMA cabinet (libretro MAME 0.258) |
Native 320×224 frames from the emulated Neo Geo, shown pixel for pixel.




















A harness records 300 frames of the original in MAME (its memory at one VBlank interrupt, then every port access per frame) and replays them through the translated code on the emulated Neo Geo. Each frame, 16-bit checksums of every 256-byte block of work RAM and both tilemaps are compared with the original's. Result: all 300 frames identical.
Each native routine keeps the original's exact memory, register and flag results, and is tested against its translated counterpart. The hit-test broad phase runs both ways in a check build and counts disagreements: none in 3,900 frames of play. A sprite check rebuilds the Neo Geo's sprite memory from a write tap and compares every object sprite against a model of the sprite list after every frame: 0 mismatches in about 715,000 checks.
Automated runs play attract mode and games in MAME, checking that nothing untranslated ran, that coins and starts worked, that fewer than 10% of frames ran late, and that music and effects played. Every stage was also recorded on its own to check the tile layers against the original's maps.
The cartridge image runs under MAME's Neo Geo MVS emulation and on a JAMMA cabinet through Recalbox. It uses only documented Neo Geo features; no flash cart or custom hardware is involved.
This is a private, non-commercial technical study. It exists to show that an arcade program of this era can be translated to a different CPU and have its video hardware re-created on another console, and to explore a two-player mode on top of it. Nothing is sold, licensed or distributed.