Skip to content

Nesoid - RetroBIOS

Type standalone
Classification Community forks
Source https://github.com/proninyaroslav/nesoid
Upstream https://sourceforge.net/p/nesoid/code
Version 2.5
Profiled 2026-08-12
Cores nesoid, Nesoid, NESOID
Systems nintendo-nes, nintendo-fds
Author Yongzh (androidemu.com)
Technical notes

Android package com.androidemu.nes, launched on the path of the content with android.intent.action.VIEW; the activity declares the file scheme with the application/zip and application/octet-stream types (app/src/main/AndroidManifest.xml:59-71). Two build families answer to that package id. Yongzh's own closed builds come first, and 2.3 (versionCode 56) and 2.5.0 (versionCode 62) are read here, both carrying his certificate sha256 744b1df1b3610d58e447d243521a0957cc5f4ebd50b12d2816a92396d1aa32f2 (C=CN, O=androidemu.com, freeman.yong@gmail.com). He later published the sources; the SourceForge project carried them on and Yaroslav Pronin forked that tree to GitHub, where release 2.5-4 (versionName 2.5, versionCode 61, armeabi-v7a, certificate O=Free Software CN=Yaroslav Pronin) is the build ES-DE names. The SourceForge community rebuild of the same tree (com.androidemu.nes_61.apk, certificate O=Alcatraz CN=Birdman) was read beside it. Line numbers are the fork's, native addresses are the armeabi library of Yongzh's 2.5.0, and the SourceForge tree carries general.c and fds.c byte identical to the fork.

The emulation core is neslib, FCE Ultra 0.98 reached through the GP2X port GPFCE, whose driver and blitters still sit in the tree unbuilt (app/jni/neslib/drivers/gp2x/, giz_blit.s). The Android build compiles the mapper, board and input sets with its own four file driver (app/jni/neslib/Android.mk:12-197), leaves netplay out of the library and runs it from Java instead (app/jni/neslib/fce.c:1081,1206, app/jni/neslib/drivers/android/netplay.c:1,28), and reduces FCEUD_PrintError and FCEUD_Message to empty bodies, so every message the core raises is discarded (app/jni/neslib/drivers/android/debug.c:4-11).

The activity accepts a name ending .nes, .fds or .zip caselessly and refuses anything else before the loader runs (EmulatorActivity.java:933-957, app/src/main/res/values/arrays.xml:4-8). An archive is opened by the core, which keeps the first entry ending .nes, .fds, .nsf, .unf, .nez or .unif, and a plain file also opens gzipped (app/jni/neslib/file.c:192-232,250-273). FCEUI_LoadGame then tries the iNES, NSF, FDS and UNIF loaders in that order on the bytes themselves (app/jni/neslib/fce.c:1180-1187).

The Disk System BIOS is the file the user has to supply. FDSLoad asks FCEU_MakeFName for it, opens it with a plain fopen and reads 8192 bytes into the array mapped over 0xE000 to 0xFFFF (app/jni/neslib/fds.c:76,146,160, 808-843, app/jni/neslib/drivers/android/file.c:3-6). Where that name resolves is the one place the two build families differ. Yongzh's builds carry a setOption entry fdsRom that duplicates the path the settings screen holds and return it from FCEU_MakeFName when set (libnes.so setOption 0x455a4-0x45694, setter 0x8804-0x8848, FCEUMKF_FDSROM case 0x8094-0x80ac, Nesoid 2.5.0 EmulatorActivity.java:834). The published sources carry neither the option nor that branch, so only the fallback remains: FCEUMKF_FDSROM formats disksys.rom under the base directory, and nothing on Android ever calls FCEUI_SetBaseDirectory, which leaves that buffer empty (app/jni/neslib/general.c:46,52-56,215). The settings screen still writes the fdsRom preference and still shows the chosen path, but no code reads it back (EmulatorSettingsFragment.java:96-99,150-156,195-210, app/src/main/res/xml/preferences.xml:240-251). Disk switching went the same way: the menu asks the engine for fdsTotalSides and fdsCurrentDisk, which Yongzh's builds answer and the fork's does not, the base class returning zero for any name (EmulatorActivity.java:417,969,1244-1249, app/jni/common/emuengine.h:49).

The Game Genie ROM is a second path the user picks, kept across both families. loadGameGenie passes it to the engine only while the Enable Game Genie switch is on, the setter duplicates it into FSettings.GameGenie and OpenGenie reads it once the content has loaded (EmulatorActivity.java:870-874, app/jni/neslib/drivers/android/nesengine.cpp:242-243, app/jni/neslib/svga.c:132-140, app/jni/neslib/fce.c:1201-1203). Both pickers list names ending .nes, .rom or .bin (EmulatorSettingsFragment.java:179-210, FileChooser.java:157-172).

A palette named after the content is read from the pal directory of the same unset base directory as the disk BIOS, 192 bytes taken as 64 RGB triples; a missing file leaves the built-in table in place (app/jni/neslib/palette.c:205-224, app/jni/neslib/general.c:216-221, app/jni/neslib/fce.c:1212).

Per content the emulator writes and reads back its own files, all under that same base directory: sav/.sav for battery backed cartridge RAM (app/jni/neslib/cart.c:641-700), sav/.fds for the modified disk (app/jni/neslib/fds.c:845-870,915-930), fcs/.fc states, snaps/ screenshots and movie/.fcm recordings (app/jni/neslib/general.c:134-195,222-238), and cheats/.cht, which FCEU_LoadGameCheats reads at load and FCEU_FlushGameCheats rewrites at close (app/jni/neslib/cheat.c:183-208,272-300, app/jni/neslib/fce.c:1080,1213). The application writes its own files through Java paths instead: state slots at .ss beside the content (StateSlotsActivity.java:39-45,135-140), an XML cheat list at .cht, also beside the content (Cheats.java:37-46,105-160), key profiles under its data directory (KeyProfilesActivity.java:47-60,92-100), PNG screenshots under screenshot/ on external storage (EmulatorActivity.java:1258-1281) and a netplay state exchanged through its cache directory (EmulatorActivity.java:1292-1293).

3 files | 1 required, 2 optional | 2 in repo, 1 missing Categories: 2 BIOS, 1 game data

disksys.rom required in repo
Famicom Disk System BIOS

gg.rom optional in repo
Game Genie add-on cartridge ROM

<game>.pal optional missing game_data
colour palette for one title

  • System: nintendo-nes
  • Source: app/jni/neslib/palette.c:205-224, app/jni/neslib/general.c:216-221, app/jni/neslib/fce.c:1212
  • Opened as pal/.pal under the base directory when content loads, with the name taken from the content. 192 bytes are read as 64 RGB triples and replace the built-in table, without checking how many arrived, so a shorter file leaves the remaining entries unset; a missing file changes nothing. The base directory is never set on Android, so the name resolves at the root of the filesystem.

Generated on 2026-08-23T16:12:06Z