SUPER3 - RetroBIOS¶
Technical notes
Sega Model 3 emulator for Android, package com.izzy2lost.super3, versionName 1.2.1 versionCode 22, arm64-v8a alone, minSdk 26 and targetSdk 36, GPL-3.0 with the tree in the open. A Kotlin front end carries the launcher, setup wizard, ini editor and save state browser over the Supermodel core, built through CMake against SDL2 with an OpenGL ES presenter of its own. The core states its own lineage: SUPERMODEL_VERSION reads "0.3a-fa1e305-arm-mm DirtBagXon (Sinden)", and the app names both sources it draws on, so the emulator is Supermodel 0.3a as carried by the arm branch of DirtBagXon/model3emu-code-sinden at fa1e305, "Add ManyMouse License" of 2025-07-28. No upstream commit is pinned because neither this repo nor that fork shares git history with trzy/Supermodel: both report themselves as independent repositories and a comparison against trzy/Supermodel has no merge base. ES-DE reaches the app through its SUPER3 find rule, on Android alone among the seven find rule sets, starting MainActivity with an intent VIEW whose data is the storage framework URI of the game. ref: android/app/build.gradle.kts:22-36, Src/Version.h:32, README.md:3-4, android/app/src/main/java/com/izzy2lost/super3/MainActivity.kt:453-463, es-de resources/systems/android/es_find_rules.xml:552-557, es-de resources/systems/android/es_systems.xml:1091
The Android build compiles a subset of the tree, which decides where a load path can be read. The CMake source list globs Src/ and then drops all of Src/OSD/ and all of Src/Graphics/ twice over, by regex and again by an explicit removal loop, adding back only a named list of Src/Graphics/New3D files. So the desktop SDL frontend is absent from this binary: Src/OSD/SDL/Main.cpp holds the command line and its own config file handling, Src/OSD/SDL/SDLInputSystem.cpp its own controller database call, and Src/Graphics/Shader.cpp the loader for external GLSL files, and none of the three is built here. The paths below are the ones this build actually runs. ref: android/app/src/main/cpp/CMakeLists.txt:32-91, 135-158
One directory holds everything the emulator reads. MainActivity hands the native side
a user data root of getExternalFilesDir(null)/super3, so
/storage/emulated/0/Android/data/com.izzy2lost.super3/files/super3, and
SetUserDataRoot creates it and changes into it, which is what makes the relative names
below resolve. AssetInstaller copies five trees out of the package assets into that
root before every launch, Assets, Config, GraphicsAnalysis, NVRAM and Saves, never
overwriting a file that is already there, so the emulator always finds its own
configuration whatever the user has done. The native entry point also probes
Model 3 boards carry no shared system BIOS and this emulator loads none. Every byte
the machine needs comes out of the per-game MAME format zip: the program ROMs, the
video ROMs, the sound program and samples, and where the board has them the drive
board program, the MPEG program and the MPEG music, all declared as regions of one
game in Games.xml. The set is identified by the basename of the zip, not by a scan,
and the ErrorLog asks for an appropriately named archive when no game answers to that
name; the individual members are then matched by name or by crc32. A child set names a
parent and the loader opens
Three files ship inside the package and are read from Config/ at runtime. Games.xml is the one the emulator cannot do without: InitLoader tests for it and returns failure when it is absent, which leaves the loading thread in its failed state and no game running. Supermodel.ini and gamecontrollerdb.txt are both skipped when they are missing, on built-in defaults in the first case and SDL's built-in controller mappings in the second. Nothing about any of the three is verified: no length is compared and no hash is computed, the only tests being that the file is there and that it parses. ref: android/app/src/main/cpp/native-lib.cpp:531-538, 568-580, 1123-1135, android/app/src/main/cpp/android_input_system.cpp:291-311, Src/Util/ConfigBuilders.cpp:60-73, 134-142
Two files that AssetInstaller lands are read by nothing in this build. Config/Music.xml declares substitute MPEG tracks for DSB1 and DSB2 games, and neither its own name nor the attributes it is written in appear anywhere in the tree, nor any handling of mp2 or mp3 files: the DSB reads its music from the mpeg_music region of the game zip and from nowhere else. Assets/p1crosshair.bmp and Assets/p2crosshair.bmp are documented by the inherited Manual for a crosshair-style option that does not exist here, and the tree holds no bitmap reader at all, Src/Util/BMPFile.h being a writer; the Crosshairs setting is a two bit mask and the presenter draws the crosshair as geometry. A build that wires either feature up would turn these into files to collect. ref: android/app/src/main/assets/Config/Music.xml, Manual.txt:99-102, Src/Model3/Model3.cpp:2932, Src/Util/BMPFile.h:391, android/app/src/main/cpp/native-lib.cpp:763-772, 909-976, android/app/src/main/cpp/gles_presenter.cpp:364-369
The rest of the tree is written, not read. NVRAM/
3 files | 1 required, 2 optional | 2 in repo, 1 missing
Games.xml required in repo bundled
Game and ROM set definitions
- Path:
Config/Games.xml - Size: 151.3 KB
- SHA1:
b41150f8cff4... - MD5:
fc26e2deaa53... - CRC32:
b2ea6948 - Source:
android/app/src/main/cpp/native-lib.cpp:568-580,android/app/src/main/cpp/native-lib.cpp:1096-1114,Src/GameLoader.cpp:492-502,Src/GameLoader.cpp:930-933,Src/Util/ConfigBuilders.cpp:60-73,android/app/src/main/java/com/izzy2lost/super3/GameXml.kt:23-24,android/app/src/main/java/com/izzy2lost/super3/MainActivity.kt:1211 - The ROM set database, 63 games, giving for each one the regions to fill and the name and crc32 of every file that fills them, the stepping, the PCI bridge, the encryption key, the drive board, net board and MPEG board the machine carries, the patches to apply and the parent set to fall back on. Handed to the GameLoader constructor, parsed as XML, and a game load is refused outright when the file is not there. The Kotlin launcher parses the same copy out of the assets for its game list and its per-game input hints. Byte identical to the copy in the repository root Config directory.
Supermodel.ini optional missing bundled
Input and per-game settings
- Path:
Config/Supermodel.ini - Size: 6.7 KB
- SHA1:
6c38cc6fba14... - MD5:
a468e45e005c... - CRC32:
2d012d14 - Source:
android/app/src/main/cpp/native-lib.cpp:531-566,android/app/src/main/cpp/native-lib.cpp:620-621,Src/Util/ConfigBuilders.cpp:134-142,android/app/src/main/java/com/izzy2lost/super3/AssetInstaller.kt:17,android/app/src/main/java/com/izzy2lost/super3/AssetInstaller.kt:43-159,android/app/src/main/java/com/izzy2lost/super3/Super3Activity.kt:880-884 - Read after the built-in defaults have been applied, the Global section first and then the section named after the loaded game, each merged over what is already set; a file that is absent or unparseable leaves the defaults standing. The hashes are those of the copy in the package assets, which is not the 13290 byte copy in the repository root Config directory: the Android build ships its own. They describe the file as shipped, since AssetInstaller rewrites it on first run, substituting the Android control defaults, and the in-app editor writes per-game keys such as LegacyReal3DTiming afterwards.
gamecontrollerdb.txt optional in repo bundled
SDL controller mapping database
- Path:
Config/gamecontrollerdb.txt - Size: 573.6 KB
- SHA1:
cb6be8206308... - MD5:
e8da2d033e90... - CRC32:
94468d79 - Source:
android/app/src/main/cpp/android_input_system.cpp:291-311,android/app/src/main/cpp/android_input_system.cpp:207-213 - Opened once, on the first pad the input system sees, and handed to SDL as mappings to add. The name is fixed unless the ini key SDLGameControllerDB carries a path of its own, and a handle that cannot be opened is passed over, leaving SDL on its built-in mappings. Byte identical to the copy in the repository root Config directory.
Generated on 2026-08-23T16:12:06Z