A modular, preservation-focused Python extractor for rebuilding verified Neo Geo ROM ZIPs from supported legally owned PC releases.
This project is designed to help users extract ROM data from game releases they already own, then rebuild emulator-ready Neo Geo ROM ZIPs using per-game extraction modules.
This repository is distributed as source code. The extractor is written in Python, with readable JSON data/configuration where required. No compiled binaries are required to inspect, modify, or run the main project.
The extractor is cross-platform and can be run on Windows, macOS, and Linux using Python 3.10 or newer.
This project is in active development.
Supported games are added through individual game modules in project_files/game_modules/. Each module defines the source layout, expected file slices, output names, hashes, and any game-specific extraction behaviour required for that title.
The following games are supported (30 in total so far):
- 3 Count Bout
- Alpha Mission II
- Art of Fighting 3
- Crossed Swords
- Ghost Pilots
- King of the Monsters 2
- Kizuna Encounter - Super Tag Battle
- Last Resort
- Magician Lord
- Metal Slug
- Metal Slug 2
- Metal Slug 3 (Now Available thanks to terminatorhex direct contribution, thnxs 😊)
- Metal Slug 4 (see Caution)
- Metal Slug X
- Mutation Nation
- Ninja Commando
- Ninja Master's
- Over Top
- Robo Army
- Samurai Shodown IV
- Sengoku
- Sengoku 2
- Soccer Brawl
- Super Sidekicks
- The King of Fighters 2003 (see Caution)
- The Last Blade
- The Last Blade 2
- The Super Spy
- Top Hunter
- Twinkle Star Sprites
Some listed titles are marked as work in progress or caution where support is incomplete, unusual, or not fully parent-set compatible.
Metal Slug 4 and The King of Fighters 2003 are not full parent-set extractions. They are rebuilt using a mixture of parent files and clone or set-specific files.
They should work in MAME and FBNeo, possibly with some emulator or ROM-set settings adjusted, but they are best left in the ZIP files produced by this extractor.
Be careful when processing them through a ROM manager such as RomVault. A ROM manager may try to delete, rename, move, rebuild, or merge them into a different set structure.
- Modular per-game extraction system
- General-purpose extraction core
- Game-specific logic kept inside game modules
- Easy-to-use interactive terminal menu for normal use
- Recursive source-folder detection for supported game releases
- Source-file processing using module-defined operations
- Existing source ZIP collection from top-level game folders where
neogeo.zipis detected - Hash-based file verification
- Output ZIP creation for supported Neo Geo titles
- Designed for preservation and personal-use extraction workflows
- No ROMs, BIOS files, or copyrighted game assets included
This extractor is intended for supported PC releases of Neo Geo games, such as legally purchased storefront releases where the required source data is available locally.
Support varies per game. Each supported title requires a matching game module.
When run, the extractor scans the nearby supported game folders for recognised releases.
Game detection is controlled by each game module. A module can define expected folder names, source subfolders, required source files, and minimum source-file sizes.
Once a supported game source is detected, the extractor builds the required ROM files from the detected source files using the operations declared in that game module. Depending on the game, this may include slicing source files, joining slices, choosing slices conditionally, searching for a slice by CRC32, applying byte patches, re-encoding DotEmu SFIX or tile data, decoding Neo Geo 4bpp tile data, assembling chunks, or running a custom converter.
The normal extraction process creates new output ZIPs from the processed and verified files. These generated ZIPs are written to the extracted_neogeo/ folder.
The extractor also has an existing ZIP collection feature. During batch extraction, or when using --collect-existing-zips, it scans the top-level game folders. If a neogeo.zip file is found anywhere under a top-level folder, the extractor copies all .zip files from that folder into the matching extracted_neogeo/ output folder.
Copied existing ZIPs are source or vendor ZIPs. They are not generated by the extractor and are not validated as rebuilt emulator output. This feature is intended to preserve existing ZIP files found alongside the supported game data, not to verify or rebuild them.
This feature is local-only. It does not verify ownership, legality, or redistribution rights for copied ZIP files. Users should not upload, commit, share, or redistribute copied ZIP files unless they have the legal right to do so.
Example folder layout:
Amazon Games/
├── 3 Count Bout/
├── Metal Slug 4/
├── The King of Fighters 2003/
├── other supported game folders...
└── NeoGeo ROM Extractor/
├── neogeo_extractor.py
├── project_files/
│ ├── game_modules/
│ │ ├── __init__.py
│ │ ├── alpha_mission_ii.py
│ │ ├── art_of_fighting_3.py
│ │ ├── crossed_swords.py
│ │ └── ...
│ ├── bios/
│ │ ├── __init__.py
│ │ └── neogeo_bios.py
│ └── neogeo/
│ ├── __init__.py
│ ├── cmc.py
│ ├── pcm2.py
│ └── pvc.py
├── README.md
└── LICENSE
The top-level folder does not need to be named Amazon Games. It could also be a Steam, GOG, or custom game folder. The important part is that the NeoGeo ROM Extractor folder sits alongside the supported game folders.
The extractor may create working/output folders such as temp/, extracted_neogeo/, backups/, failed/, and batch_logs/ when it runs. These are generated locally and are not part of the source release.
- Python 3.10 or newer recommended
- A legally obtained supported game release
- Local access to the required source files for that game
Python 3.10 or newer is recommended for this project.
Check whether Python is already installed:
python3 --versionOn Windows, use:
python --versionor:
py --versionIf the version shown is Python 3.10 or newer, Python is ready for this extractor.
Install Python from the official Python website:
During installation, enable Add python.exe to PATH if the installer offers that option.
After installation, open PowerShell and check:
python --versionIf that does not work, try:
py --versionTo run the extractor on Windows:
python neogeo_extractor.pyIf your system uses the Python Launcher, this may also work:
py neogeo_extractor.pyInstall Python from the official Python website:
After installation, open Terminal and check:
python3 --versionTo run the extractor on macOS:
python3 neogeo_extractor.pyMany Linux distributions already include Python 3. Check first:
python3 --versionIf Python 3 is not installed, install it using your distribution package manager.
On Ubuntu, Debian, Linux Mint, or similar:
sudo apt update
sudo apt install python3On Fedora:
sudo dnf install python3On Arch Linux or Manjaro:
sudo pacman -S pythonTo run the extractor on Linux:
python3 neogeo_extractor.pyThis project currently uses Python's standard library and does not require installing extra Python packages with pip.
If both python and python3 are available on your system, prefer python3 on macOS and Linux.
Place the NeoGeo ROM Extractor folder inside the same folder that contains your supported game folders, such as an Amazon Games, Steam, GOG, or custom game folder.
Run the extractor from the command line:
python3 neogeo_extractor.pyOn Windows, use:
python neogeo_extractor.pyBy default, the script opens an interactive terminal menu. This is the recommended way to use the extractor.
From the menu, you can choose:
[1] Extract one game
[2] Extract all detected games
[3] Dry run / detect available games only
[4] List installed game modules
[5] Show paths
[6] Collect existing ZIPs from all folders
[Q] Quit
The menu is intended for normal use. The command-line options below are mainly useful for testing, automation, troubleshooting, or batch workflows.
Useful command-line options:
python3 neogeo_extractor.py --dry-run
python3 neogeo_extractor.py --list-modules
python3 neogeo_extractor.py --show-paths
python3 neogeo_extractor.py --all
python3 neogeo_extractor.py --game GAME_ID
python3 neogeo_extractor.py --collect-existing-zipsOn Windows, use python instead of python3 if that is how Python is installed:
python neogeo_extractor.py --dry-run
python neogeo_extractor.py --list-modules
python neogeo_extractor.py --show-paths
python neogeo_extractor.py --all
python neogeo_extractor.py --game GAME_ID
python neogeo_extractor.py --collect-existing-zipsGame modules are stored in:
project_files/game_modules/
Game-specific information belongs in the relevant module, not in the core extractor.
Examples of game-specific data include:
- source filenames
- ROM slice offsets
- expected CRC32 values
- expected SHA1 values
- output ROM names
- patch rules
- game-specific quirks
- notes about unusual source layouts
The main extractor should remain as generic as possible.
The extractor creates rebuilt ROM ZIPs for supported games when the source files match the expected data.
Output files are generated locally and are not included in this repository.
Generated output may contain copyrighted ROM or BIOS data extracted from the user's local source files. Generated files are for the user's own lawful local use and must not be committed to this repository or redistributed unless the user has the legal right to do so.
This project is verification-focused.
Where possible, extracted files are checked against expected hashes before final ZIP creation. If source files do not match the expected data, the extractor should fail rather than silently creating incorrect output.
This repository does not include:
- Neo Geo ROMs
- Neo Geo BIOS files
- MAME ROM sets
- game executables
- Steam, GOG, or Amazon game data
- copyrighted assets
- decryption keys
- tools for downloading games
- instructions for piracy
Some modules may support or reference external tools for specialised Neo Geo processing.
This repository does not include third-party binaries unless their licence clearly permits redistribution. Users are responsible for obtaining or building any optional external tools from lawful sources.
Do not submit third-party binaries unless their redistribution licence is clear and compatible with this project.
This project was informed by, adapted from, or cross-checked against earlier Neo Geo extraction, conversion, preservation, and emulation work.
Some sources were used as direct implementation references. Others were used for research, comparison, testing, or validation only. Inclusion here does not necessarily mean that code or data from that source is included in this repository, except where direct reuse is specifically stated below.
The following projects were useful while developing this extractor:
- NGPrimeClaim by Lx32
- mslug-rom-extractor by terminatorhex
- goNCommand by Lionel Cordesses — important reference for several extraction workflows, including Kizuna Encounter, Metal Slug 4, and The King of Fighters 2003.
Where code, logic, offsets, extraction layouts, patch behaviour, conversion behaviour, or command-line workflows have been adapted from these projects, credit should also remain in the relevant source files or game modules.
The following public notes, blog posts, scripts, and discussions were also used for research, comparison, or cross-checking:
- goNCommand issue #13
- alhumbra’s notes: https://milkchoco.info/archives/8695
- scrap-a’s notes: http://blog.livedoor.jp/scrap_a/archives/37910430.html
- Tomasz Bednarz’s related work and notes, 2023
- Lionel Cordesses’ KOF 2003 extraction/build script work, 2025
These references were especially useful for understanding The King of Fighters 2003, CMC-related processing, encrypted Neo Geo content, and ROM-set reconstruction.
Special thanks to terminatorhex for the mslug-rom-extractor project, for your help understanding your code a little better, for working on Metal Slug 3 with me, and for the Metal Slug X JSON patch data reused in this project.
The Metal Slug X JSON patch data in this repository is directly reused from mslug-rom-extractor, with the file renamed for this project and credited here.
If it wasn't for your work this project wouldn't exist
- mslug-rom-extractor: https://github.com/terminatorhex/mslug-rom-extractor
Some extraction steps were researched, compared against, directly reused, adapted from, or independently reimplemented after studying earlier tools, scripts, data files, or commercial release workflows.
This does not necessarily mean that every referenced file, tool, script, or data file is included in this repository, used directly, or copied as-is. Where external code, data, logic, offsets, patch rules, or workflows have been directly reused or adapted, credit is given in this README.
- The Kizuna Encounter, Metal Slug 4, and The King of Fighters 2003 extraction modules were informed by
goNCommandby Lionel Cordesses. neo-cmcwas used as a reference point for CMC-related Neo Geo processing.tileswaplogic was used as a reference point for graphics/tile data rearrangement where required.tiles2cromlogic was used as a reference point for converting tile data into Neo Geo C-ROM-compatible output where required.unswizzlebehaviour was studied from NGPrimeClaim and independently adapted for this project.- For Metal Slug 3, parts of the Python implementation were developed by studying the observable behaviour of the original
prog.exeworkflow from the legally obtained release, then replacing that workflow with independently written Python code.
Where behaviour has been independently reimplemented in this repository, the relevant source files should also include local credit comments explaining which external project, tool, script, data file, or workflow informed that implementation.
This project does not redistribute neo-cmc, prog.exe, commercial game executables, third-party scripts, ROMs, BIOS files, encryption keys, or copyrighted game assets.
Extracted files are checked against known emulator-compatible ROM layouts, names, sizes, and hashes where possible. Thanks are due to the contributors and maintainers of:
Their ROM definitions, naming conventions, hash records, and long-term hardware documentation work are important validation references for this project.
This repository is not affiliated with, endorsed by, or maintained by SNK, Amazon, GOG, Steam, DotEmu, Code Mystics, MAME, FBNeo, Lx32, terminatorhex, Lionel Cordesses, Shigeshigeru, alhumbra, scrap-a, Tomasz Bednarz, or any other referenced project, contributor, publisher, distributor, or rights holder.
Use of a source as a reference does not necessarily mean this repository contains code from that source. Some sources were used only for comparison, verification, or background research.
Any mistakes, omissions, or project-specific implementation choices in this repository are my own.
This project is provided for lawful personal preservation, backup, research, and interoperability purposes.
The author is not responsible for how users obtain, use, distribute, or handle copyrighted material. Users are responsible for complying with all applicable laws in their own country or region.
Contributions may be considered once the project structure has stabilised.
Useful contributions include:
- new game modules
- hash verification improvements
- clearer error messages
- documentation improvements
- testing against legally owned releases
Do not submit ROMs, BIOS files, copyrighted game data, or proprietary assets.
This project does not include, distribute, download, or provide access to ROMs, BIOS files, game executables, game data, or any other copyrighted assets.
You must provide your own legally obtained source files.
This tool is intended for users who own the relevant games and want to extract their own local copies for personal use, preservation, backup, or emulator compatibility.
Do not use this project to obtain, distribute, or share copyrighted game data that you do not have the legal right to use.
The author does not endorse piracy or copyright infringement.
This project is released under the GNU General Public License v3.0 or later.
See the LICENSE file for the full license text.
The source files use the SPDX identifier:
GPL-3.0-or-later
You may use, modify, and redistribute this extractor under the terms of the GPLv3 or any later version of the GPL.
If you redistribute this project or modified versions of it, you must preserve the license terms and provide the corresponding source code.