Snes9x EX+ - RetroBIOS¶
Technical notes
Member of the EX Emulator series by Robert Broglia, published as com.explusalpha.Snes9xPlus and built around the target s9xp (Snes9x/metadata/conf.mk:2-7, Snes9x/CMakeLists.txt:4,10). ES-DE reaches it through the SNES9X-EXPLUS find rule, which only the Android rule set carries, and offers it under satellaview, sfc, snes, snesna and sufami. Snes9x 1.63 is vendored under Snes9x/src/snes9x at upstream b33f2af, the revision the sync commit 96b2f850 names, and 114 of the 152 vendored source files are byte-identical to it. The app built from Snes9x/1.43 is a separate package, com.explusalpha.Snes9x, and carries none of what follows.
Content is any .smc, .sfc, .swc, .bs, .st, .fig or .mgd file, or an archive whose first entry with one of those extensions is used, the app leaving archives to the framework (Snes9x/src/main/AppMeta.cc:30-33, EmuFramework/src/EmuSystem.cc:392-425, EmuFramework/src/AppMeta.cc:29). It is read whole into memory and goes to LoadROMMem, except a Sufami Turbo cart, recognized by a length of 0x80000 to 0x100000 with "BANDAI SFC-ADX" at 0 and no "SFC-ADX BACKUP" at 0x10, which goes to LoadMultiCartMem with the base cartridge placed in front of it (Snes9x/src/main/Main.cc:177-181,221-273, Snes9x/src/snes9x/memmap.cpp:1575-1608). Dual Sufami Turbo carts are not loaded: slot B is always passed as null (Snes9x/src/main/Main.cc:250-260).
Two firmware images are read, and both differ from upstream in how they are found. Upstream opens BS-X.bin then BS-X.bios in its BIOS directory (bsx.cpp:1204-1236) and STBIOS.bin for a Sufami Turbo load (memmap.cpp:1663-1686); the app deletes both blocks and reads a URI the user picks instead, so no filename is compiled in (Snes9x/src/snes9x/bsx.cpp:1199-1203, Snes9x/src/snes9x/memmap.cpp:1644-1670, Snes9x/src/main/S9XApi.cc:225-253, Snes9x/src/main/Main.cc:194-219). Each picker lists directories, names ending .bin or .bios caselessly, and .7z, .rar and .zip archives, whose first member with one of those two extensions is taken (Snes9x/src/main/Main.cc:189-192, Snes9x/src/main/EmuMenuViews.cc:345-387, EmuFramework/include/emuframework/DataPathSelectView.hh:77-101, EmuFramework/src/gui/FilePicker.cc:39-48, imagine/src/fs/ArchiveFS.cc:75-78). An unset path or a failed check throws, and the loader thread turns that into a failed load with the message on screen (EmuFramework/src/EmuApp.cc:794-819). Neither image is hashed.
A BS-X cartridge image loaded as content takes the other branch of S9xInitBSX, which copies it into the BIOS area itself and asks for nothing (Snes9x/src/snes9x/bsx.cpp:1213-1233). Broadcast data is read per requested channel as BSXHHHH-D.bin under the Satellaview Files path, which defaults to the content directory; a miss only leaves the stream unloaded (Snes9x/src/snes9x/bsx.cpp:736-790, Snes9x/src/main/S9XApi.cc:203-216, Snes9x/src/main/system.ccm:108).
Every coprocessor is emulated in code with no external firmware: DSP-1 to DSP-4, ST010, ST011, ST018, Cx4, S-DD1 and SPC7110, each implemented under Snes9x/src/snes9x in dsp1.cpp through dsp4.cpp, seta010.cpp, seta011.cpp, seta018.cpp, c4emu.cpp, sdd1emu.cpp and spc7110emu.cpp. The 1.43 branch's S-DD1 data call and SPC7110 pack directory are compiled out here (Snes9x/src/main/S9XApi.cc:64,89-131).
Per content the app writes and reads back a .srm, an .rtc for the S-RTC, .frz states and a .cht cheat list under the cheats path; settings live in Snes9xP.config (Snes9x/src/main/Main.cc:78-90,153-172, Snes9x/src/snes9x/memmap.cpp:1791-1812, Snes9x/src/main/Cheats.cc:33-45, Snes9x/src/main/AppMeta.cc:19). A BS game with no save of its own falls back to BS-X.srm (Snes9x/src/snes9x/memmap.cpp:1874-1890). A .bps, .ups or .ips named after the content in the patches path is applied as the image loads, the app having dropped the search beside the content (Snes9x/src/snes9x/memmap.cpp:1327,3888-4027). MSU-1 data and tracks are read beside the content as .msu, or the content name with msu1.rom appended, and -N.pcm per track (Snes9x/src/snes9x/msu1.cpp:60-70,116-118,157-160). UNZIP_SUPPORT is not defined, so the .msu1 pack and the patch-inside-a-zip paths are not compiled (Snes9x/CMakeLists.txt:18).
8 files | 2 required, 6 optional | 8 in repo, 0 missing Categories: 2 BIOS, 6 game data
BS-X.bin required in repo
Satellaview BS-X cartridge ROM
- System: nintendo-satellaview
- Size: min 1.0 MB
- Aliases:
BS-X.bios - Validation: existence, size
- Source:
Snes9x/src/snes9x/memmap.cpp:2065,Snes9x/src/snes9x/bsx.cpp:1240-1274,Snes9x/src/snes9x/bsx.cpp:1199-1203,Snes9x/src/main/S9XApi.cc:218-253,Snes9x/src/main/EmuMenuViews.cc:345-365,Snes9x/src/main/system.ccm:110,Snes9x/src/main/options.cc:46,Snes9x/src/main/options.cc:79 - Platforms: batocera, lakka, recalbox, retroarch, retrobat, retrodeck, retropie, romm
- Config key:
CFGKEY_BSX_BIOS_PATH - Read for every BS game, the branch taken when the header at 0x7FC0 or 0xFFC0 marks the image as one. The read takes 1048576 bytes and compares the count returned, so a shorter file is rejected and a longer one has its tail ignored, then the 21 bytes at 0x7FC0 must read "Satellaview BS-X" padded with spaces. The name is the user's: the app compiles none in and only the .bin and .bios endings limit what the picker offers.
STBIOS.bin required in repo
Sufami Turbo base cartridge ROM
- System: nintendo-sufami-turbo
- Size: 256.0 KB
- Validation: existence, size
- Source:
Snes9x/src/main/Main.cc:250-260,Snes9x/src/main/Main.cc:183-187,Snes9x/src/main/Main.cc:194-219,Snes9x/src/snes9x/memmap.cpp:1018-1025,Snes9x/src/snes9x/memmap.cpp:1575-1608,Snes9x/src/main/EmuMenuViews.cc:367-387,Snes9x/src/main/system.ccm:109,Snes9x/src/main/options.cc:45,Snes9x/src/main/options.cc:78 - Platforms: batocera, lakka, recalbox, retroarch, retrobat, retrodeck, retropie, romm
- Config key:
CFGKEY_SUFAMI_BIOS_PATH - Read whenever the content is a Sufami Turbo cart, and copied to the front of the ROM area with the cart behind it. The whole file is buffered, so the length must be exactly 262144, with "BANDAI SFC-ADX" at 0 and "SFC-ADX BACKUP" at 0x10. The name is the user's, the picker accepting any .bin or .bios.
BSX0120-0.bin optional in repo game_data
Satellaview data stream for channel 0120
- System: nintendo-satellaview
- Size: 34 B
- Validation: existence
- Source:
Snes9x/src/snes9x/bsx.cpp:736-790,Snes9x/src/main/S9XApi.cc:203-216,Snes9x/src/main/system.ccm:108,Snes9x/src/main/EmuMenuViews.cc:325-343 - Config key:
CFGKEY_SATELLAVIEW_PATH - Opened by the name the emulated unit asks for, BSXHHHH-D.bin from the channel registers at 0x2188 and 0x218E, under the Satellaview Files path, which defaults to the content directory. The file is measured to size the queue and read 22 bytes at a time; a miss leaves the stream unloaded.
BSX0121-0.bin optional in repo game_data
Satellaview data stream for channel 0121
- System: nintendo-satellaview
- Size: 34 B
- Validation: existence
- Source:
Snes9x/src/snes9x/bsx.cpp:736-790,Snes9x/src/main/S9XApi.cc:203-216 - Config key:
CFGKEY_SATELLAVIEW_PATH
BSX0122-0.bin optional in repo game_data
Satellaview data stream for channel 0122
- System: nintendo-satellaview
- Size: 1.0 KB
- Validation: existence
- Source:
Snes9x/src/snes9x/bsx.cpp:736-790,Snes9x/src/main/S9XApi.cc:203-216 - Config key:
CFGKEY_SATELLAVIEW_PATH
BSX0123-0.bin optional in repo game_data
Satellaview data stream for channel 0123
- System: nintendo-satellaview
- Size: 16 B
- Validation: existence
- Source:
Snes9x/src/snes9x/bsx.cpp:736-790,Snes9x/src/main/S9XApi.cc:203-216 - Config key:
CFGKEY_SATELLAVIEW_PATH
BSX0124-0.bin optional in repo game_data
Satellaview data stream for channel 0124
- System: nintendo-satellaview
- Size: 97 B
- Validation: existence
- Source:
Snes9x/src/snes9x/bsx.cpp:736-790,Snes9x/src/main/S9XApi.cc:203-216 - Config key:
CFGKEY_SATELLAVIEW_PATH
Bio Worm.7z optional in repo game_data bundled
Bundled homebrew game, listed under Bundled Content
- System: nintendo-snes
- Size: 41.5 KB
- SHA1:
38e44c9868c0... - Aliases:
BioWorm.7z - Validation: existence
- Source:
Snes9x/src/main/AppMeta.cc:20-21,EmuFramework/src/gui/BundledGamesView.cc:41,EmuFramework/src/gui/BundledGamesView.cc:47 - Opened from the application bundle by the name the build gives it, the Linux build dropping the space, and loaded as content.
Generated on 2026-08-23T16:12:06Z