Lynx.emu - RetroBIOS¶
Technical notes
Member of the EX Emulator series by Robert Broglia, which targets Android and Linux (README.md:3-4,12-13) and keeps iOS and Pandora build shortcuts in the tree (Lynx.emu/ios.mk, Lynx.emu/pandora.mk). Published as com.explusalpha.LynxEmu (Lynx.emu/metadata/conf.mk:2,6,7) and reached by ES-DE through its LYNX-EMU find rule. Mednafen's Lynx module, itself derived from Handy by K. Wilkins, is vendored under Lynx.emu/src/lynx (Lynx.emu/metadata/conf.mk:8, Lynx.emu/src/main/AppMeta.cc:26) and driven by the app's own video, audio and input layers. The vendored copy declares Mednafen 1.32.0-UNSTABLE (EmuFramework/include/shared/mednafen/mednafen-config.h:167); the upstream comparisons below are against the 1.32.1 release. Content is read from .lnx, .lyx and .o files (Lynx.emu/metadata/conf.mk:5, Lynx.emu/src/main/AppMeta.cc:30), and the module also takes a headerless image of 128, 256 or 512 KB, a filetype upstream rejects (Lynx.emu/src/lynx/system.cpp:90-91,112; mednafen src/lynx/system.cpp:86-93).
The boot ROM is the one file the user supplies and it carries no name of its own. The picker takes any name ending in .img and stores the chosen URI in biosPath (Lynx.emu/src/main/EmuMenuViews.cc:32-50, Lynx.emu/src/main/system.ccm:70, Lynx.emu/src/main/options.cc:33,55). MDFN_MakeFName returns that URI for MDFNMKF_FIRMWARE and drops the lynxboot.img name the module hands it, the name upstream resolves in its firmware directory (Lynx.emu/src/main/options.cc:150-154, Lynx.emu/src/lynx/system.cpp:103; mednafen src/lynx/system.cpp:101). CRom opens the file only when the path is not empty and throws unless it is exactly 512 bytes (Lynx.emu/src/lynx/rom.cpp:75-95). Upstream has neither test: it opens whatever the firmware directory yields and takes 512 bytes or more (mednafen src/lynx/rom.cpp:55-74). A path that is set but cannot be opened, or that is the wrong length, aborts the content load rather than falling back (EmuFramework/src/shared/mednafen-emuex/StreamImpl.cc:53-63, Lynx.emu/src/lynx/system.cpp:337-342).
With no path mValid stays false (Lynx.emu/src/lynx/rom.h:77) and Reset builds a stub boot ROM in place: 512 bytes of 0x88, the reset vectors, and STA $FD97 at $FE00, $FE19, $FE4A and $FF80 (Lynx.emu/src/lynx/rom.cpp:55-72, Lynx.emu/src/lynx/rom.h:50, Lynx.emu/src/lynx/system.cpp:241-263). A write to that register from inside the ROM window dispatches to the four HLE routines (Lynx.emu/src/lynx/mikie.cpp:1033-1053), which clear RAM, pull the encrypted loader blocks off the cartridge shifter, run them through lynx_decrypt and jump to $0200 (Lynx.emu/src/lynx/system.cpp:150-208, Lynx.emu/src/lynx/lynxdec.cpp:265). Neither the stub nor lynxdec.cpp exists upstream, where the constructor reaches the throw and Reset carries the homebrew branch alone (mednafen src/lynx/system.cpp:169-177).
No hash is checked. The module holds no crc32 table, and its only md5 use is the content hash that names saves and states (Lynx.emu/src/lynx/cart.cpp: 245-264, Lynx.emu/src/lynx/system.cpp:313,319). The custom palette entry survives in the module table and reaches nothing: Lynx_SetPixelFormat passes an empty span where upstream Emulate passes espec->CustomPalette (Lynx.emu/src/lynx/system.cpp:352,555,583; mednafen src/lynx/system.cpp: 267,298), the app calls MDFNGI::Load directly instead of going through the Mednafen frontend that reads .pal files (EmuFramework/src/shared/mednafen-emuex/MDFNUtils.hh:133-145, Lynx.emu/src/main/Main.cc:62-65), and the frame spec is value-initialised so CustomPalette stays null (EmuFramework/src/shared/mednafen-emuex/MDFNUtils.hh:153, EmuFramework/src/shared/mednafen/git.h:399). Cheats answer false against CheatInfo_Empty (Lynx.emu/src/main/options.cc:126-127, Lynx.emu/src/lynx/system.cpp:586), no Cheats.cc is in the build (Lynx.emu/src/CMakeLists.txt:6-21), and the app declares no bundled content, the framework definition defaulting to an empty span (EmuFramework/src/AppMeta.cc:40, EmuFramework/include/emuframework/AppMeta.hh:66-68).
MDFN_MakeFName is called once and only for the firmware, so the module asks for no save file (Lynx.emu/src/lynx/system.cpp:103). What the app writes is .mca states (Lynx.emu/src/main/system.ccm:86, Lynx.emu/src/main/Main.cc:47-54) and LynxEmu.config (Lynx.emu/src/main/AppMeta.cc:27). ui.png, gpOverlay.png and the shader sources are drawn by the framework from the application bundle (EmuFramework/include/emuframework/AssetManager.hh:61-65, EmuFramework/src/AssetManager.cc:58-65, EmuFramework/src/VideoImageEffect.cc:164-172).
1 files | 0 required, 1 optional | 1 in repo, 0 missing | 1 with HLE fallback
lynxboot.img optional in repo HLE fallback built-in fallback
Atari Lynx boot ROM
- System: atari-lynx
- Size: 512 B
- Validation: size
- Source:
Lynx.emu/src/lynx/system.cpp:103,Lynx.emu/src/main/options.cc:150-154,Lynx.emu/src/lynx/rom.cpp:75-95,Lynx.emu/src/main/EmuMenuViews.cc:32-50,Lynx.emu/src/lynx/system.cpp:241-263 - Platforms: batocera, lakka, recalbox, retroarch, retrobat, retrodeck, retropie, romm
- Picked by the user from any path, under any name ending in .img. The length is the only test and a file of another length aborts the load rather than falling back.
Generated on 2026-08-23T16:12:06Z