DSperate v1.11.0
DSperate v1.11.0
Full changelog: v1.10.0...v1.11.0
A BIOS/firmware set dumped from your own DS is no longer required to play; see the first highlight for what it still unlocks. None is included.
Highlights
- Games run without any dumps. With no
bios9/bios7the built-in FreeBIOS (Gilead Kutnick's clean-room SWI table, BSD-3-Clause, the same NTR images melonDS and DraStic ship) fills the BIOS regions, and with nofirmwarea generated 256 KB image carries your[user]settings (nickname, message, birthday, colour, language). Both substitutes are announced at start. A configured path that names no file now falls back the same way, so the stock handheld ini works out of the box; a file that exists but is wrong, or one BIOS half without the other, is still an error naming the file. Direct boot copies the ROM's Nintendo logo into the ARM9 BIOS region, as games check it. What the real dumps still unlock: the firmware boot (no ROM / BootMenu.nds) needs the real pair, since FreeBIOS has no boot code and the generated firmware no DS menu; the generated firmware refuses the.ovrsettings sidecar; and FreeBIOS's SWI routines are not cycle-matched to Nintendo's, so replays and frame hashes recorded against a real BIOS drift after a few dozen frames under it. Carts with a still-encrypted secure area need the real ARM7 BIOS for its KEY1 table; the usual decrypted dumps do not. - Profile-guided builds, now also from CI. The release binaries are built with a GCC profile trained on recorded scenes from seven games and committed under
pgo/with a manifest, so the public build needs no ROMs and refuses to configure if the compiler or flags no longer match the profile. On the RG DS (RK3566) it is the largest exact win of the campaign: Spirit Tracks median 16.8 → 15.6 ms and over-budget frames 285 → 158 of 570; Golden Sun 17.9 → 16.5 ms and 454 → 245; Super Mario 64 DS −9 %, Dragon Ball Origins −11 %. Frames are bit-identical. - Heavy/light frame pairs are absorbed. Spirit Tracks' intro and Golden Sun's title submit their 3D at 30 Hz, so an 18 ms frame follows a 12 ms one: on time over the pair, late on every other frame. The dmabuf scanout now keeps four buffers (two frames of run-ahead) and the wall-clock pacer keeps up to one frame of debt instead of resetting on a late frame. Delivered speed on the RG DS: Spirit Tracks intro 93-95 % → 97-98 %, Golden Sun title 93 → 97 %.
dominant_ratio = auto(the default) withdominant_threshold. The dominant screen takes the largest whole number of panel pixels per DS pixel that leaves the other screen at least a quarter of its size, and the other grows into the room left. On a 640x480 panel that is a 2x top screen over a 128x96 bottom, with the LCD grid and chunky cells exact on the screen that matters. A number still gives a fixed ratio.- LCD grid and chunky cells on small views. At exactly 2x the grid seams land on every other DS pixel boundary with a lit 3x3 cell between, instead of dimming three pixels in four into a flat darkening. A dimmed grid now applies from 1x on the PiP inset and the dominant layouts' secondary (the black grid keeps its 2x rule), and the chunky cell is chosen once, on the largest view, and matched in DS pixels on the others rather than coming out coarsest on the smallest screen.
Fixes
- A crash in the 3D rasteriser under load: the finalised polygon list was rewritten while a band worker was still starting on the previous frame's list. The sorted list is now kept per polygon bank and the renderer latches it at dispatch. The same window made exact-mode output nondeterministic from run to run on Etrian Odyssey; it is bit-stable now.
- Loading a state saved by a session with a running RTC into one without refused (an armed clock event with no handler); the clock event is now cancelled on load.
Also
- Build hardening (
_FORTIFY_SOURCE,-fstack-protector) is off by default: it put__memcpy_chkinside the 2D fetch loops, and turning it off measured Etrian Odyssey median 3.65 → 3.02 ms with no change elsewhere.DSPERATE_HARDEN=ONrestores it;DSPERATE_TUNEtakes-mcpu/-mtuneflags (all measured flat on the RK3566, so it stays empty). - Main-thread trims from the performance audit, each exact: jump-table I/O dispatch, VRAM remaps applied as chunked diffs with the raster joined only when texture views move, the recompiler's GXFIFO stores on the geometry fast path, idle SPU channels skipped before the mix.
- A thread that would block waiting for a raster band draws an unclaimed band itself instead; neutral on the RG DS, kept for hosts where the raster is the wait.
DS_FPSprints the scanout wait, the pacing time and the unaccounted remainder per window;DS_FRAME_SERIESwrites per-frame timings for the headless build;tools/ab_flags_device.shanddocs/perf-audit-2026-09-07.mddocument the device measurements behind the above.