Files
BFM-decomp/docs/difficulty.md
T
Drew T 757bd82a0f feat(phase-31): S79 #4 — scattered-.bss split at link-prepare (psyq_bss_split): SYS.o→libgpu2, VM_F.o→snd12, GS_001.o→libgs8 LINKED; libgpu_used retired
The §9.1 "scattered .bss commons" exclusion class (Phase 8 → P31) is closed 3/3. New
tools/psyq_bss_split.py (own ELF32 REL reader/writer) cuts an object's packed .bss into
per-base NOBITS pieces: bases derived from the game bytes per HI16/LO16 pair, references
walked in offset order into single-base runs, cuts snapped to symbol starts (the linker
scattered SYMBOLS), symbols moved, a LOCAL section symbol per piece inserted, relocs
retargeted with the addend rewritten in the immediates, self-diffed. It runs inside the one
prepare step shared by psyq_link.link_object / psyq_link_region.build_region /
psyq_integrate.integrate (prepare_object before classify), re-derived every build.

GS_001.o was certified "5 interleaved bases, NOT splittable" by the S77 probe, which grouped
by BASE; by RUN it is six symbol-aligned pieces. All seven cuts across the three objects are
confirmed by the other objects' by-name recoveries (_que 0x800C5510, _svm_sreg_buf
0x800B9B58, PSDBASEX/CLIP2/PSDBASEY/POSITION/GsDRAWENV). R39 negative control: 235 placed
objects across 9 curated dirs, 0 refusals, exactly 3 splits (a libcd .bss+size end pointer
refused the first build → reference problems are fatal only when a split is needed).

Wiring: yaml 800c→libgpu2, sgap_6→sgap_6+snd12, gsgap3→libgs8 (comments rewritten);
LIBGPU_ELF := .run/obj40/libgpu (curated libgpu_used retired); libgs 34 objs/8 blocks
(make_libgs.sh +GS_001); snd 63/12 (make_snd_used.py exclusions 4→3). src/800c.c and
src/gsgap3.c removed (Sony code hand-matched as REAL/verbatim), sgap_6.c keeps only
func_8003FA54; splat-emitted libgpu2.c/libgs8.c/snd12.c stubs for the no-SDK fallback.

Verified: main 143dbb89f34491258bbc27810d0a12ec8b43a8dd WITH the SDK objects and WITHOUT
them from a fresh extract; make tools-health OK; R22 fleet clean extract-all 212/212 +
check-all 213/213. Metrics: main REAL 886→839, LINKED 1,040→1,150, VERBATIM 85→29, stubs 29
(unchanged); game-code weighted 91.1% (40,895/44,870) — both terms lost the 3,667 SDK ins;
the remainder is still exactly the 3,975-ins open-stub sum. Verbatim manifest --update
200→33 rows (subtractive). Docs: cookbook §489 (+index), psyq-worklist rows + "S78 task #4",
SETUP S79 R21 table, decision-log S79 addendum, accelerators S79, CURRENT_PHASE S79 FINAL 🛑.
2026-09-04 17:19:29 -06:00

5.3 KiB

Unmatched difficulty inventory (generated by tools/difficulty.py — harvest queue)

unmatched functions : 1179 trivial (<=5 ins) : 238 non-jtbl leaves : 797 (best harvest targets) jump-table funcs : 36 (deferred — need the rodata-island workflow, Task 2')

Easiest 120 unmatched (score asc) — the work queue

score name nins br calls jtbl leaf
1 COR_05_OBJ_130 1 0 0 - Y
1 EXT_OBJ_A8 1 0 0 - Y
1 GS_137_OBJ_488 1 0 0 - Y
1 LIBMCRD_OBJ_1118 1 0 0 - Y
1 LIBMCRD_OBJ_330 1 0 0 - Y
1 LIBMCRD_OBJ_5BC 1 0 0 - Y
1 LIBMCRD_OBJ_990 1 0 0 - Y
1 LIBMCRD_OBJ_BA0 1 0 0 - Y
1 LIBMCRD_OBJ_E5C 1 0 0 - Y
1 MIDIREAD_OBJ_6BC 1 0 0 - Y
1 MIDIREAD_OBJ_E4 1 0 0 - Y
1 OBJT2_OBJ_614 1 0 0 - Y
1 OBJT2_OBJ_838 1 0 0 - Y
1 PRESET2_OBJ_116C 1 0 0 - Y
1 PRESET2_OBJ_4D8 1 0 0 - Y
1 PRESET2_OBJ_6C4 1 0 0 - Y
1 PRESET2_OBJ_C20 1 0 0 - Y
1 PRESET_OBJ_744 1 0 0 - Y
1 PRNT_OBJ_21C 1 0 0 - Y
1 PRNT_OBJ_2A0 1 0 0 - Y
1 PRNT_OBJ_348 1 0 0 - Y
1 PRNT_OBJ_3D0 1 0 0 - Y
1 SYS_OBJ_1C28 1 0 0 - Y
1 S_SR_OBJ_B0 1 0 0 - Y
2 INTR_DMA_OBJ_274 2 0 0 - Y
2 LIBMCRD_OBJ_1A60 2 0 0 - Y
2 LIBMCRD_OBJ_308 2 0 0 - Y
2 PRESET2_OBJ_FD8 2 0 0 - Y
2 PRIM_OBJ_200 2 0 0 - Y
2 PRIM_OBJ_228 2 0 0 - Y
2 SR_SV_OBJ_224 2 0 0 - Y
2 SR_SV_OBJ_2F4 2 0 0 - Y
2 SYS_OBJ_191C 2 0 0 - Y
2 S_ITC_OBJ_88 2 0 0 - Y
2 S_SCA_OBJ_15C 2 0 0 - Y
2 S_SCA_OBJ_94 2 0 0 - Y
2 S_SK_OBJ_1EC 2 0 0 - Y
2 VM_N2P_OBJ_1B8 2 0 0 - Y
2 VM_N2P_OBJ_BC 2 0 0 - Y
3 C_007_OBJ_AC 3 0 0 - Y
3 MIDIREAD_OBJ_6C0 3 0 0 - Y
3 PRESET2_OBJ_A88 3 0 0 - Y
3 PRNT_OBJ_380 3 0 0 - Y
3 SYS_OBJ_1B78 3 0 0 - Y
3 SetDQA 3 0 0 - Y
3 SetDQB 3 0 0 - Y
3 SetData32 3 0 0 - Y
3 SetIR0 3 0 0 - Y
3 UT_KEYV_OBJ_174 3 0 0 - Y
4 CD_set_test_parmnum 4 0 0 - Y
4 C_011_OBJ_960 4 0 0 - Y
4 CdLastCom 4 0 0 - Y
4 GEO_00_OBJ_2C 4 0 0 - Y
4 GS_108_OBJ_7C 4 0 0 - Y
4 GetGraphDebug 4 0 0 - Y
4 GetGraphType 4 0 0 - Y
4 GsGetActiveBuff 4 0 0 - Y
4 LIBMCRD_OBJ_15C 4 0 0 - Y
4 LIBMCRD_OBJ_1944 4 0 0 - Y
4 LIBMCRD_OBJ_3B8 4 0 0 - Y
4 LIBMCRD_OBJ_84C 4 0 0 - Y
4 LIBMCRD_OBJ_A5C 4 0 0 - Y
4 MIDIREAD_OBJ_6AC 4 0 0 - Y
4 SPU_OBJ_510 4 0 0 - Y
4 SPU_OBJ_AC4 4 0 0 - Y
4 SSSTART_OBJ_240 2 0 1 - -
4 SSSTART_OBJ_248 2 0 1 - -
4 SSSTART_OBJ_328 4 0 0 - Y
4 SYS_OBJ_1AF0 4 0 0 - Y
4 SYS_OBJ_2F7C 4 0 0 - Y
4 S_RRWA_OBJ_40 4 0 0 - Y
4 S_SAV_OBJ_1E8 4 0 0 - Y
4 S_SAV_OBJ_1F8 4 0 0 - Y
4 S_SCA_OBJ_384 4 0 0 - Y
4 S_SRMP_OBJ_170 4 0 0 - Y
4 S_STSA_OBJ_48 4 0 0 - Y
4 SetVertex0 4 0 0 - Y
4 SetVertex1 4 0 0 - Y
4 SetVertex2 4 0 0 - Y
4 USERFUNC_OBJ_84 4 0 0 - Y
4 UT_KEYV_OBJ_350 4 0 0 - Y
4 UT_KEYV_OBJ_3FC 4 0 0 - Y
4 VSYNC_OBJ_1D4 4 0 0 - Y
4 VS_VH_OBJ_180 4 0 0 - Y
4 func_800426D4 4 0 0 - Y
4 func_80043078 4 0 0 - Y
4 func_80043410 4 0 0 - Y
4 func_80043420 4 0 0 - Y
4 func_80043440 4 0 0 - Y
4 func_800491EC 4 0 0 - Y
4 func_8004923C 4 0 0 - Y
4 func_8005C4CC 4 0 0 - Y
4 func_80062988 4 0 0 - Y
4 gfx2D_COM0_OBJ_30 4 0 0 - Y
5 C_004_OBJ_DC 5 0 0 - Y
5 EVENT_OBJ_84 5 0 0 - Y
5 GS_123_OBJ_A8 5 0 0 - Y
5 INTR_OBJ_6D0 5 0 0 - Y
5 ISO9660_OBJ_29C 3 0 1 - -
5 LIBMCRD_OBJ_5C0 5 0 0 - Y
5 LIBMCRD_OBJ_840 3 0 1 - -
5 LIBMCRD_OBJ_A50 3 0 1 - -
5 LIBMCRD_OBJ_C90 3 0 1 - -
5 LIBMCRD_OBJ_F4C 3 0 1 - -
5 OBJT_OBJ_108 2 1 0 - Y
5 OBJT_OBJ_110 2 1 0 - Y
5 OBJT_OBJ_124 2 1 0 - Y
5 OBJT_OBJ_D0 2 1 0 - Y
5 OBJT_OBJ_E4 2 1 0 - Y
5 PRNT_OBJ_188 2 1 0 - Y
5 PRNT_OBJ_1E8 2 1 0 - Y
5 PRNT_OBJ_1F0 2 1 0 - Y
5 PRNT_OBJ_1F8 2 1 0 - Y
5 PRNT_OBJ_340 2 1 0 - Y
5 PRNT_OBJ_64C 2 1 0 - Y
5 PRNT_OBJ_C8 2 1 0 - Y
5 PRNT_OBJ_EC 2 1 0 - Y
5 PRNT_OBJ_F4 2 1 0 - Y
5 RATAN_OBJ_148 5 0 0 - Y
5 SPU_OBJ_848 5 0 0 - Y