D093 - What the current-generation emulators implement that obSCEne does not touch

Status: analysed, and one gap closed.

scripts/gap-analysis.py surveys every emulator, and its answer is dominated by the previous generation - seven of nine target it. scripts/ps5-gap.py asks the narrower question that matters for a probe whose goal is to flex a console: what do the current-generation emulators implement, and what does obSCEne do about each?

implemented by current-generation emulators 1,177
obSCEne calls 88
obSCEne censuses but never calls 248
obSCEne does not know at all 841

The gaps are whole subsystems, not scattered functions, which is the useful shape: libKernel 192, libSceJson 50, libSceAudioPropagation 39, libSceSaveData 36, libSceRtc 34, libSceAgc 31 beyond the 87 already censused.

The 192 in libKernel matter most for a kernel-focused probe, and they are subsystems: asynchronous I/O (sceKernelAio*), asset path resolution (sceKernelApr*), AMPR events, virtual range naming, flexible memory, time conversion.

Most are not actionable and the reason is D008. The OpenOrbis headers carry no signatures for the AIO or APR families, and sceKernelConvertLocaltimeToUtc is declared there with no arguments and a void return - which is the toolchain saying it does not know either. A gap that cannot be called safely stays a gap, and the census is where it belongs.

Flexible memory was actionable, and is now covered

Full signatures, implemented by current-generation emulators, and an entire allocation path obSCEne had no coverage of. Direct memory - which 020-memory already exercises - is physical memory reserved by offset and mapped explicitly. Flexible memory is the other kind: the system finds the pages and the caller asks for a size rather than a location.

A title uses both. An emulator implementing one and not the other passed every memory check in this suite.

Two checks: how much the system will lend, and a map / write / read-back / release round trip. The read-back is what makes it positive rather than negative - an implementation returning a plausible address it has not actually mapped fails it and passes anything that only reads the return code.

Under shadPS4 both pass: 448 MB available, mapped at 0x2007ec000, and the write held.