An offline, dependency-light portable recompilation and runtime framework for Hummer Team's Somari (NES, mapper 4).
Features support for 33 platforms, universal input emulation (Gamepad, Keyboard, and Touchscreen), native console HALs, standalone retro ports, asset extraction from legitimate ROMs, and in-memory modding support.
ROM Notice : No copyrighted ROM or binary assets are bundled. The project requires your own legitimate
Somari.nesfile to extractprg.bin,chr.bin, and metadata..gitignorestrictly ignores all*.nesand*.sfcfiles.
- Modern PC & OS: Win10 x86, Win11 x64, Linux, BSD, macOS, HaikuOS, ArcaOS (OS/2)
- Mobile: iOS, Android, Windows Phone (8.1 / 10 Mobile), Symbian OS (S60), J2ME (Java Micro Edition)
- Nintendo Consoles & Handhelds: Switch, Wii, Wii U, N64, 3DS, NDSi, GBA, SNES (Super Nintendo)
- Sony PlayStation: PS1, PS2, PSP, PS3, PS Vita, PS4, PS5
- Microsoft Xbox: Xbox OG, Xbox 360
- Sega Consoles: Sega Genesis / Mega Drive, Sega CD, Sega 32X, Sega Saturn, Sega Dreamcast
See docs/PLATFORMS.md for full compilation steps and toolchain documentation.
# 1. Build launcher and runtime
cmake -B build && cmake --build build
# 2. First run: extracts assets and runs
./build/somari --rom Somari.nes
# 3. Subsequent runs launch instantly from somari-data/assets
./build/somaripython3 tools/somari_tool.py info Somari.nes # Inspect ROM
python3 tools/somari_tool.py extract Somari.nes somari-data/assets # Extract assets
python3 tools/somari_tool.py header Somari.nes somari_rom.h # Export C header
python3 tools/somari_tool.py snes Somari.nes snes_assets/ # Convert to SNES format
python3 tools/somari_tool.py genesis Somari.nes md_assets/ # Convert to Genesis format
python3 tools/somari_tool.py gba Somari.nes gba_assets/ # Convert to GBA formatThe input subsystem (src/hal/input_map.c) bridges all controller formats into NES inputs:
- Gamepads & Controllers: Left analog stick to D-Pad with configurable deadzones; support for Xbox, PlayStation DualShock/DualSense, Nintendo Switch Joy-Con/Pro, Wii Classic/Wiimote, 3DS Circle Pad, PSP nub, and Dreamcast stick.
- Keyboard: Fully remappable keys via
somari-data/input.ini(Default: Arrow keys + X/Z, Enter=Start, RShift=Select; Player 2: WASD + K/J). - Touchscreen: Responsive on-screen virtual D-Pad and action buttons for iOS, Android, Windows Phone, 3DS bottom screen, PS Vita OLED front touch, Switch handheld mode, and J2ME touch devices.
- SOCD Sanitation: Cleans simultaneous opposite cardinal direction presses.
Mods are loaded without modifying the original game ROM:
- Place mod files in
somari-data/mods/<mod_name>/. - Add the mod name to
somari-data/mods/mods.txt. - Configure
mod.inito apply IPS patches or asset replacements:name=My Somari Mod patch_prg=gameplay_hack.ips patch_chr=sprites_palette.ips
- Create patches using
tools/somari_tool.py ips original.bin modified.bin patch.ips. Made With SI.