NEO.emu - RetroBIOS¶
Technical notes
Member of the EX Emulator series by Robert Broglia, which targets Android and Linux (README.md:3,12-13) and keeps iOS and Pandora build shortcuts in the tree (NEO.emu/ios.mk, NEO.emu/pandora.mk). Published as com.explusalpha.NeoEmu (NEO.emu/metadata/conf.mk:2-7) and reached by ES-DE through its NEO-EMU find rule. Gngeo 0.8 by Mathieu Peponas is vendored under NEO.emu/src/gngeo (NEO.emu/src/gngeo-config.h:143, NEO.emu/src/main/AppMeta.cc:26) and driven by the app's own video, audio, input and archive layers (NEO.emu/src/CMakeLists.txt:9-37). The 68000 is Cyclone on arm and Musashi elsewhere, and the Z80 comes from MD.emu's Genesis Plus GX tree (NEO.emu/src/CMakeLists.txt:1,22,39-52).
Cartridge hardware only: no path in the tree opens a disc image or a Neo Geo CD system ROM. Content is an archive named after its MAME set, tried as .zip, .7z then .rar (NEO.emu/src/main/unzip.cc:113-132), the set name being the content file name without its dot extension (EmuFramework/src/EmuSystem.cc:81,90). The app carries 240 romset definitions and the game list offers 239 of them, neogeo being the one left out (NEO.emu/src/main/EmuMenuViews.cc:204-445,516-550).
The BIOS archive is the one thing the user supplies. It is opened as neogeo.zip in the directory holding the content, not in a system directory (NEO.emu/src/gngeo/roms.c:1202-1211, NEO.emu/src/main/Main.cc:465-471, EmuFramework/src/EmuSystem.cc:83). Members are matched on name or on CRC32, so an image carrying the expected CRC is taken whatever it is called; turning on Strict ROM Checking, off by default, drops the name test and leaves CRC32 alone (NEO.emu/src/main/unzip.cc:49-50, NEO.emu/src/main/Main.cc:316-319, NEO.emu/src/main/system.ccm:87). The archive itself is never hashed.
Two members are read for every game. 000-lo.lo, the zoom table, ends the load with "000-lo.lo missing or invalid" when absent (NEO.emu/src/gngeo/roms.c: 1213-1218). The board fix layer is read as sfix.sfx then sfix.sfix and 0x20000 bytes of it are converted on the spot (NEO.emu/src/gngeo/roms.c:1220-1235). The guard in front of it tests HAS_CUSTOM_SFIX_BIOS, which nothing sets: the only site that would raise it is commented out and definition entries in that region are skipped at load (NEO.emu/src/gngeo/roms.c:1419-1423,1432-1436).
One 68K BIOS is read alongside them, chosen by BIOS Type and MVS Region. BIOS Type defaults to Unibios 2.3 and MVS Region to USA (NEO.emu/src/main/system.ccm:74-81, NEO.emu/src/main/options.cc:45-46). The menu offers the six Universe BIOS versions and MVS (NEO.emu/src/main/EmuMenuViews.cc:127-136); under MVS the region picks vs-bios.rom for Japan, usa_2slt.bin for USA, asia-s3.rom for Asia and sp-s2.sp1 for Europe and any other value (NEO.emu/src/gngeo/roms.c:1269-1300, NEO.emu/src/main/EmuMenuViews.cc:103-116). aes-bios.bin sits on the SYS_HOME branch, which the menu never selects but which a stored BIOS Type of 1 reaches, the validity test accepting every value below SYS_MAX (NEO.emu/src/gngeo/roms.c:1271-1272, NEO.emu/src/gngeo/emu.h:34-43, NEO.emu/src/main/system.ccm:58,74-77). While a Universe BIOS is selected, its own switches are exposed and write the console/arcade bit and the region bits into the memory card (NEO.emu/src/main/EmuMenuViews.cc:559-610,656-658, NEO.emu/src/main/Main.cc:254-256).
Five sets bring their own 68K BIOS in the region the definitions call MAIN_CPU_BIOS and skip that read from the archive: irrmaze with 236-bios.bin, kf2k3pcb with 271-bios.bin, and ms5pcb, svcpcb and svcpcba with sp-4x.sp1 (NEO.emu/res/romsets/*.drv, NEO.emu/src/gngeo/roms.c:1237,1408-1412). Six sets name sm1.sm1 in the audio BIOS region, which is read into a buffer the emulation never uses (NEO.emu/src/gngeo/roms.c:1034-1039,1413-1418, roms.h:63). Both regions, and the fix layer region, are exempt from the fatal path, so a miss there does not end the load (NEO.emu/src/gngeo/roms.c:1440-1461).
Every definition names a parent set whose archive is opened next to the game's own, and a parent that cannot be opened is fatal. Four definitions carry the no-parent sentinel 0 in that field, so neogeo, ms5pcb, svcpcb and kf2k3pcb end their load asking for 0.zip (NEO.emu/src/gngeo/roms.c:1364-1371, NEO.emu/src/main/unzip.cc:113-132). Upstream ends the same load the same way (src/roms.c:1372-1376).
The romset definitions and the CMC42/CMC50 key tables ship with the app. On Android they are assets read through the asset manager; elsewhere they are read from gngeo_data.zip beside the executable (NEO.emu/src/main/Main.cc:64-67, 198-206,321-369, imagine/src/base/linux/ApplicationContext.cc:44-47). Upstream ships the same archive with 237 definitions plus a skin/ set for its own SDL menu; the app carries 240, adds bbbuster, ironclad, ironclado and totcarib, drops mslug3n, changes 31 others and keeps no skin, its resource loader being replaced wholesale (NEO.emu/src/main/Main.cc:321-369, src/resfile.c:71-115, gngeo.dat/gngeo_data.zip). The two key tables are byte identical to upstream's.
Divergences from gngeo 0.8 in what is read: upstream passes 0 for every member CRC, so it verifies nothing and matches on name alone; it knows one Universe BIOS under the name uni-bios.rom and falls back to a loose uni-bios.rom beside the archive when the archive lacks it; and it opens the BIOS archive only as .zip, under a configured rompath (src/roms.c:1217-1320,1078-1087).
Nothing else is read from outside. The per-game gngeo configuration path is built and handed to cf_open_file, which is an empty stub, as is cf_reset_to_default (NEO.emu/src/gngeo/fileio.c:111-139, NEO.emu/src/gngeoTypes.h:44-45). Transparency pack support is unfinished and its conf item answers with an empty string (NEO.emu/src/gngeo/roms.c:1097, NEO.emu/src/gngeo/fileio.c:149-150, NEO.emu/src/main/Main.cc:448-451). The .gno decoded-ROM cache, the .nv and .memcard backup memory, save states and NeoEmu.config are written by the app (NEO.emu/src/main/Main.cc:163-184,224-247, NEO.emu/src/main/AppMeta.cc:27).
18 files | 7 required, 11 optional | 16 in repo, 2 missing Categories: 15 BIOS, 3 game data
neogeo.zip required in repo
Neo Geo system ROMs
- System: snk-neogeo-mvs
- Aliases:
neogeo.7z,neogeo.rar - Source:
NEO.emu/src/gngeo/roms.c:1202-1211,NEO.emu/src/main/unzip.cc:113-132,NEO.emu/src/main/Main.cc:465-471 - Platforms: batocera, emudeck, lakka, recalbox, retroarch, retrobat, retrodeck, retropie, romm
- Opened from the directory holding the content, as .zip then .7z then .rar. A failure to open it ends the load with "Can't open BIOS archive (neogeo.zip)" before any content runs. The container is never hashed.
000-lo.lo required in repo in neogeo.zip
Zoom lookup table
sfix.sfx required missing in neogeo.zip
Board fix layer tiles
- System: snk-neogeo-mvs
- Size: 128.0 KB
- CRC32:
c2ea0cfd - Aliases:
sfix.sfix - Source:
NEO.emu/src/gngeo/roms.c:1220-1235,NEO.emu/src/gngeo/roms.c:1419-1423,NEO.emu/src/gngeo/roms.c:1432-1436 - Read as sfix.sfx then retried as sfix.sfix under the same CRC. Read for every game, the guard that would skip it never being raised, and 0x20000 bytes are converted from the buffer.
uni-bios_2_3.rom required in repo in neogeo.zip
Universe BIOS 2.3
- System: snk-neogeo-mvs
- CRC32:
27664eb5 - Source:
NEO.emu/src/gngeo/roms.c:1239-1243,NEO.emu/src/main/system.ccm:74-77,NEO.emu/src/main/EmuMenuViews.cc:129 - Default BIOS Type, so the 68K image an untouched install asks for.
uni-bios_3_0.rom optional in repo in neogeo.zip
Universe BIOS 3.0
- System: snk-neogeo-mvs
- CRC32:
a97c89a9 - Source:
NEO.emu/src/gngeo/roms.c:1244-1248,NEO.emu/src/main/EmuMenuViews.cc:130
uni-bios_3_1.rom optional in repo in neogeo.zip
Universe BIOS 3.1
- System: snk-neogeo-mvs
- CRC32:
0c58093f - Source:
NEO.emu/src/gngeo/roms.c:1249-1253,NEO.emu/src/main/EmuMenuViews.cc:131
uni-bios_3_2.rom optional in repo in neogeo.zip
Universe BIOS 3.2
- System: snk-neogeo-mvs
- CRC32:
a4e8b9b3 - Source:
NEO.emu/src/gngeo/roms.c:1254-1258,NEO.emu/src/main/EmuMenuViews.cc:132
uni-bios_3_3.rom optional in repo in neogeo.zip
Universe BIOS 3.3
- System: snk-neogeo-mvs
- CRC32:
24858466 - Source:
NEO.emu/src/gngeo/roms.c:1259-1263,NEO.emu/src/main/EmuMenuViews.cc:133
uni-bios_4_0.rom optional in repo in neogeo.zip
Universe BIOS 4.0
- System: snk-neogeo-mvs
- CRC32:
a7aab458 - Source:
NEO.emu/src/gngeo/roms.c:1264-1268,NEO.emu/src/main/EmuMenuViews.cc:134
usa_2slt.bin optional in repo in neogeo.zip
MVS 68K BIOS, USA
- System: snk-neogeo-mvs
- CRC32:
e72943de - Aliases:
sp-u2.sp1 - Source:
NEO.emu/src/gngeo/roms.c:1279-1282,NEO.emu/src/main/unzip.cc:49-50,NEO.emu/src/main/EmuMenuViews.cc:107 - Read when BIOS Type is MVS and MVS Region is USA, the default region. The CRC branch also finds it under the name sp-u2.sp1.
vs-bios.rom optional in repo in neogeo.zip
MVS 68K BIOS, Japan
- System: snk-neogeo-mvs
- CRC32:
f0e8f27d - Source:
NEO.emu/src/gngeo/roms.c:1275-1278,NEO.emu/src/main/EmuMenuViews.cc:105 - Read when BIOS Type is MVS and MVS Region is Japan.
asia-s3.rom optional missing in neogeo.zip
MVS 68K BIOS, Asia
- System: snk-neogeo-mvs
- CRC32:
91b64be3 - Aliases:
sp-s3.sp1 - Source:
NEO.emu/src/gngeo/roms.c:1283-1286,NEO.emu/src/main/unzip.cc:49-50,NEO.emu/src/main/EmuMenuViews.cc:108 - Read when BIOS Type is MVS and MVS Region is Asia. The CRC branch also finds it under the name sp-s3.sp1.
sp-s2.sp1 optional in repo in neogeo.zip
MVS 68K BIOS, Europe
- System: snk-neogeo-mvs
- CRC32:
9036d879 - Source:
NEO.emu/src/gngeo/roms.c:1287-1291,NEO.emu/src/main/EmuMenuViews.cc:106 - Platforms: misterfpga
- Read when BIOS Type is MVS and MVS Region is Europe or any other value.
aes-bios.bin optional in repo in neogeo.zip
AES 68K BIOS
- System: snk-neogeo-aes
- Source:
NEO.emu/src/gngeo/roms.c:1270-1272,NEO.emu/src/gngeo/emu.h:34-43,NEO.emu/src/main/system.ccm:58,NEO.emu/src/main/system.ccm:74-77,NEO.emu/src/main/unzip.cc:49-50 - Read on the SYS_HOME branch, which no menu entry selects but which a stored BIOS Type of 1 reaches. No CRC is passed for it, so it is found by name alone and cannot be found at all while Strict ROM Checking is on.
sm1.sm1 optional in repo in neogeo.zip
Audio board BIOS
- System: snk-neogeo-mvs
- Size: 128.0 KB
- CRC32:
94416d67 - Source:
NEO.emu/res/romsets/irrmaze.drv,NEO.emu/src/gngeo/roms.c:1034-1039,NEO.emu/src/gngeo/roms.c:1413-1418,NEO.emu/src/gngeo/roms.c:1440-1461,NEO.emu/src/gngeo/roms.h:63 - Named in the audio BIOS region by irrmaze, neogeo, svcboot, svcplus, svcplusa and svcsplus, and reached in this archive by the parent lookup of irrmaze. The region is exempt from the fatal path and the buffer it lands in is never read by the emulation.
gngeo_data.zip required in repo game_data bundled
Romset definitions and CMC key tables
- System: snk-neogeo-mvs
- Source:
NEO.emu/src/main/Main.cc:64-67,NEO.emu/src/main/Main.cc:198-206,NEO.emu/src/main/Main.cc:217-221,NEO.emu/src/main/Main.cc:321-355,imagine/src/base/linux/ApplicationContext.cc:44-47 - Holds rom/
.drv for 240 sets plus rom/cmc42.xor and rom/cmc50.xor. A definition is read before anything else and a miss ends the load with "This game isn't recognized". On Android the members are read as assets through the asset manager; elsewhere they are read from this archive at the executable's own directory.
cmc42.xor required in repo game_data bundled in gngeo_data.zip
CMC42 graphics decryption key tables
- Path:
rom/cmc42.xor - System: snk-neogeo-mvs
- Size: 2.2 KB
- Source:
NEO.emu/src/gngeo/neocrypt.c:617-634,NEO.emu/src/main/Main.cc:357-369 - Read whole and cut into nine 256-byte tables for the CMC42 sprite descrambler.
cmc50.xor required in repo game_data bundled in gngeo_data.zip
CMC50 graphics and M1 decryption key tables
- Path:
rom/cmc50.xor - System: snk-neogeo-mvs
- Size: 2.8 KB
- Source:
NEO.emu/src/gngeo/neocrypt.c:635-655,NEO.emu/src/main/Main.cc:357-369 - Read whole and cut into eleven 256-byte tables, the last two addressing the M1 descrambler.
Generated on 2026-08-23T16:12:06Z