diff --git a/config/overlays.mk b/config/overlays.mk index 49ca062d6..8ed4274cd 100644 --- a/config/overlays.mk +++ b/config/overlays.mk @@ -247,6 +247,7 @@ build/src/ov_SC02_000/ov_SC02_000_jr_8015AE2C.o: JTBL_PADS := 0,4 # §8e pads ( build/src/ov_SC02_000/ov_SC02_000_jr_8016AB6C.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20 build/src/ov_SC02_000/ov_SC02_000_jr_80178D40.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x178 build/src/ov_SC02_000/ov_SC02_000_jr_8017EA84.o: JTBL_PADS := 0,4,0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x18,+0x38,+0x58 +build/src/ov_SC02_000/ov_SC02_000_jr_8017FCB0.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20 build/src/ov_SC02_000/ov_SC02_000_o0c.o: JTBL_PADS := 0,4,4,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x38,+0xa8,+0x118 ov_SC02_000_CHECK_SHA := config/check.ov_SC02_000.sha ov_SC02_000_SYMBOLS := config/symbols.ov_SC02_000.txt @@ -283,6 +284,7 @@ build/src/ov_SC02_003/ov_SC02_003_jr_8015AE2C.o: JTBL_PADS := 0,4 # §8e pads ( build/src/ov_SC02_003/ov_SC02_003_jr_8016AB6C.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20 build/src/ov_SC02_003/ov_SC02_003_jr_80178D40.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x178 build/src/ov_SC02_003/ov_SC02_003_jr_8017EA84.o: JTBL_PADS := 0,4,0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x18,+0x38,+0x58 +build/src/ov_SC02_003/ov_SC02_003_jr_8017FCB0.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20 build/src/ov_SC02_003/ov_SC02_003_o0c.o: JTBL_PADS := 0,4,4,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x38,+0xa8,+0x118 ov_SC02_003_CHECK_SHA := config/check.ov_SC02_003.sha ov_SC02_003_SYMBOLS := config/symbols.ov_SC02_003.txt diff --git a/config/splat.ov_SC02_000.yaml b/config/splat.ov_SC02_000.yaml index 651e5abd7..628999a44 100644 --- a/config/splat.ov_SC02_000.yaml +++ b/config/splat.ov_SC02_000.yaml @@ -170,7 +170,7 @@ segments: - [0xbe874, data, tail19] - [0xbe924, .rodata, ov_SC02_000_jr_8017FB24] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xbe944, .rodata, ov_SC02_000_jr_8017FCB0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xbe964, data, tail20] + - [0xbe984, data, tail20] - [0xbe9a4, .rodata, ov_SC02_000_jr_801808C4] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xbe9c4, data, tail21] - [0xC070C, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) diff --git a/config/splat.ov_SC02_003.yaml b/config/splat.ov_SC02_003.yaml index 14592fc82..71ca79346 100644 --- a/config/splat.ov_SC02_003.yaml +++ b/config/splat.ov_SC02_003.yaml @@ -170,7 +170,7 @@ segments: - [0xbe874, data, tail19] - [0xbe924, .rodata, ov_SC02_003_jr_8017FB24] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xbe944, .rodata, ov_SC02_003_jr_8017FCB0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xbe964, data, tail20] + - [0xbe984, data, tail20] - [0xbe9a4, .rodata, ov_SC02_003_jr_801808C4] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xbe9c4, data, tail21] - [0xC070C, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) diff --git a/docs/progress.fleet.md b/docs/progress.fleet.md index 5616b92a1..200a7fcec 100644 --- a/docs/progress.fleet.md +++ b/docs/progress.fleet.md @@ -4,16 +4,16 @@ # cross-binary collapsible-byte leverage: docs/duplicates.cross.md. # THREE progress metrics (all matter — see the labels): -FLEET fn-count byte-ident: 341210 / 353717 = 96.46% (REAL+LINKED+empties; FUNCTION-count, ×134-inflated — one crack counts per overlay) -FLEET instr-weighted : 12411107 / 13141652 = 94.4% (shipped .text across main + resident + 138 overlays; the decomp.dev-DISPLAY number) -FLEET distinct-code(uniq): 5029274 / 5634875 = 89.3% (77970/87459 unique fns; the DISTINCT-RE number) +FLEET fn-count byte-ident: 341212 / 353717 = 96.46% (REAL+LINKED+empties; FUNCTION-count, ×134-inflated — one crack counts per overlay) +FLEET instr-weighted : 12411259 / 13141652 = 94.4% (shipped .text across main + resident + 138 overlays; the decomp.dev-DISPLAY number) +FLEET distinct-code(uniq): 5029350 / 5634875 = 89.3% (77971/87459 unique fns; the DISTINCT-RE number) MAIN game-code weighted : 436 / 60201 = 0.7% (INCLUDED in the fleet numbers above since 2026-07-22 — roadmap §1 metrics contract; LINKED-excluding Ghidra sig dated 2026-06-14; caveat is R34: no independent second oracle for a PS-X EXE, NOT drift) - (fleet EXCLUDING main, for continuity with pre-2026-07-22 readings: 12410671 / 13081451 = 94.9%) + (fleet EXCLUDING main, for continuity with pre-2026-07-22 readings: 12410823 / 13081451 = 94.9%) -FLEET REAL substantive : 339355 (of which dedup-shared 241142 via 1910 groups / 241216 instances) +FLEET REAL substantive : 339357 (of which dedup-shared 241142 via 1910 groups / 241216 instances) FLEET LINKED PsyQ objs : 959 FLEET NON_MATCHING : 7 (0 in any default build — G4) -FLEET INCLUDE_ASM stubs : 12500 +FLEET INCLUDE_ASM stubs : 12498 FLEET matchable : 353717 | binary | REAL | shared | LINKED | byte-ident | matchable | byte-ident % | @@ -31,8 +31,8 @@ FLEET matchable : 353717 | ov_SC01_077 | 2551 | 1711 | 0 | 2553 | 2586 | 98.7% | | ov_SC01_080 | 2420 | 1749 | 0 | 2420 | 2512 | 96.3% | | ov_SC01_084 | 2445 | 1754 | 0 | 2450 | 2579 | 95.0% | -| ov_SC02_000 | 2513 | 1793 | 0 | 2513 | 2683 | 93.7% | -| ov_SC02_003 | 2513 | 1793 | 0 | 2513 | 2683 | 93.7% | +| ov_SC02_000 | 2514 | 1793 | 0 | 2514 | 2683 | 93.7% | +| ov_SC02_003 | 2514 | 1793 | 0 | 2514 | 2683 | 93.7% | | ov_SC02_004 | 2385 | 1749 | 0 | 2385 | 2401 | 99.3% | | ov_SC02_005 | 2535 | 1745 | 0 | 2545 | 2927 | 86.9% | | ov_SC02_011 | 2621 | 1752 | 0 | 2632 | 2893 | 91.0% | diff --git a/src/ov_SC02_000/ov_SC02_000_jr_8017FCB0.c b/src/ov_SC02_000/ov_SC02_000_jr_8017FCB0.c index 29a41408b..852be6bd5 100644 --- a/src/ov_SC02_000/ov_SC02_000_jr_8017FCB0.c +++ b/src/ov_SC02_000/ov_SC02_000_jr_8017FCB0.c @@ -2962,7 +2962,66 @@ void func_801801EC(int param_1) } -INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_8017FCB0", func_80180264); + +// @class: struct +// @stuck: none — MATCH (76 ins). jtbl forced via explicit case 4/6 (count>=5 over MIPS tablejump threshold); case-5 block placed between if-block and default via goto so the if-block emits j default w/ e2=0 in the delay slot + +extern s32 func_8012CBA4(s32); +extern int func_8012BEE8(int a0); +extern void func_8012B2CC(int a0); +extern void func_8012B23C(int a0); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012A828(int a0, void *a1); +extern void func_801803B0(void); +extern int rand(void); +extern int D_801270D4; +extern unsigned char D_8018E68C[]; +extern unsigned char D_801A648C[]; + +void func_80180264(int param_1) +{ + int iVar1; + unsigned int uVar2; + + ((void (*)(void))func_8012CBA4)(); + if ((((int)((unsigned int)*(unsigned short *)(param_1 + 0x70) << 0x10) >> 0x18 != 4) || + (D_801270D4 == 0)) && + (iVar1 = func_8012BEE8(param_1), iVar1 != 0)) { + *(char *)(param_1 + 0xc1) = 0; + *(short *)(param_1 + 2) = 1; + *(short *)(param_1 + 0x34) = 0; + uVar2 = rand(); + *(int *)(param_1 + 0x1c) = (uVar2 & 0x1f) + 0x46; + *(short *)(param_1 + 0xe0) = 0; + *(short *)(param_1 + 0xe2) = *(short *)(*(int *)(param_1 + 0x20) + 0x12); + switch ((int)((unsigned int)*(unsigned short *)(param_1 + 0x70) << 0x10) >> 0x18) { + case 0: + case 1: + case 2: + case 3: + case 7: + if ((*(unsigned short *)(param_1 + 0xfe) & 2) != 0) { + *(short *)(param_1 + 0xe2) = 0; + } + goto do_default; + case 5: + ((void (*)(int))func_801803B0)(param_1); + break; + case 4: + case 6: + default: + do_default: + *(short *)(param_1 + 0xe4) = 0x1e; + *(short *)(param_1 + 0x5e) = 0; + *(unsigned short *)(param_1 + 0x5c) = 0xaa10; + func_8012B2CC(param_1); + func_8012B23C(param_1); + ((void (*)(int, void *))func_8012B14C)(param_1, &D_8018E68C); + func_8012A828(param_1, &D_801A648C); + break; + } + } +} DEFINE_func_80180394() /* dedup: shared engine-core @0x80180394 (src/shared) */ diff --git a/src/ov_SC02_003/ov_SC02_003_jr_8017FCB0.c b/src/ov_SC02_003/ov_SC02_003_jr_8017FCB0.c index 016bca69a..02bf58b7d 100644 --- a/src/ov_SC02_003/ov_SC02_003_jr_8017FCB0.c +++ b/src/ov_SC02_003/ov_SC02_003_jr_8017FCB0.c @@ -2961,7 +2961,66 @@ void func_801801EC(int param_1) } -INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_8017FCB0", func_80180264); + +// @class: struct +// @stuck: none — MATCH (76 ins). jtbl forced via explicit case 4/6 (count>=5 over MIPS tablejump threshold); case-5 block placed between if-block and default via goto so the if-block emits j default w/ e2=0 in the delay slot + +extern s32 func_8012CBA4(s32); +extern int func_8012BEE8(int a0); +extern void func_8012B2CC(int a0); +extern void func_8012B23C(int a0); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012A828(int a0, void *a1); +extern void func_801803B0(void); +extern int rand(void); +extern int D_801270D4; +extern unsigned char D_8018E68C[]; +extern unsigned char D_801A648C[]; + +void func_80180264(int param_1) +{ + int iVar1; + unsigned int uVar2; + + ((void (*)(void))func_8012CBA4)(); + if ((((int)((unsigned int)*(unsigned short *)(param_1 + 0x70) << 0x10) >> 0x18 != 4) || + (D_801270D4 == 0)) && + (iVar1 = func_8012BEE8(param_1), iVar1 != 0)) { + *(char *)(param_1 + 0xc1) = 0; + *(short *)(param_1 + 2) = 1; + *(short *)(param_1 + 0x34) = 0; + uVar2 = rand(); + *(int *)(param_1 + 0x1c) = (uVar2 & 0x1f) + 0x46; + *(short *)(param_1 + 0xe0) = 0; + *(short *)(param_1 + 0xe2) = *(short *)(*(int *)(param_1 + 0x20) + 0x12); + switch ((int)((unsigned int)*(unsigned short *)(param_1 + 0x70) << 0x10) >> 0x18) { + case 0: + case 1: + case 2: + case 3: + case 7: + if ((*(unsigned short *)(param_1 + 0xfe) & 2) != 0) { + *(short *)(param_1 + 0xe2) = 0; + } + goto do_default; + case 5: + ((void (*)(int))func_801803B0)(param_1); + break; + case 4: + case 6: + default: + do_default: + *(short *)(param_1 + 0xe4) = 0x1e; + *(short *)(param_1 + 0x5e) = 0; + *(unsigned short *)(param_1 + 0x5c) = 0xaa10; + func_8012B2CC(param_1); + func_8012B23C(param_1); + ((void (*)(int, void *))func_8012B14C)(param_1, &D_8018E68C); + func_8012A828(param_1, &D_801A648C); + break; + } + } +} DEFINE_func_80180394() /* dedup: shared engine-core @0x80180394 (src/shared) */