From 5450f18181ca96efc1296b25f7b53de85a9b4351 Mon Sep 17 00:00:00 2001 From: Drew T <50529377+Druthulu@users.noreply.github.com> Date: Tue, 1 Sep 2026 11:08:55 -0600 Subject: [PATCH] =?UTF-8?q?revert(revert):=20restore=20ov=5FSC04=5F011/fun?= =?UTF-8?q?c=5F80182DCC=20=E2=80=94=20it=20was=20NEVER=20a=20false=20bank?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reverts commit:3475. The bank is byte-identical; MY VERIFICATION WAS BROKEN. A jtbl bank changes CARVE CONFIG (JTBL_PADS in config/overlays.mk + the splat yaml). Those are splat INPUTS: asm/ and the linker script are regenerated FROM them. I checked the binary with `make build` alone, so the build linked newly-carved C against STALE extracted state and produced a mismatched SHA. That is the R22 corollary ("a reverted config needs a make extract, not just a make check") pointed the other way — a LANDED config change needs one too. Proof, run on both binaries: make extract BINARY=ov_SC06_025 && make build -> BYTE-IDENTICAL make extract BINARY=ov_SC04_011 && make build -> BYTE-IDENTICAL So: R40 against myself. I attributed the failure to the subject (the bank) when the instrument (a build over stale extract state) was at fault — after writing "it may not even be false" into the checkpoint and reverting without testing it. The first revert also cost real work: it discarded a legitimate 96-line match. STANDING FIX: a per-binary verify after any gate that touched config/ MUST be `make extract BINARY= && make build BINARY=`. Build-only is a valid check ONLY when the gate changed nothing under config/. --- config/overlays.mk | 2 +- config/splat.ov_SC04_011.yaml | 2 +- src/ov_SC04_011/ov_SC04_011_jr_8017D494.c | 96 ++++++++++++++++++++++- 3 files changed, 97 insertions(+), 3 deletions(-) diff --git a/config/overlays.mk b/config/overlays.mk index 7e044b7b7..325b9fa7b 100644 --- a/config/overlays.mk +++ b/config/overlays.mk @@ -3357,7 +3357,7 @@ build/src/ov_SC04_011/ov_SC04_011_jr_80159C84.o: JTBL_PADS := 0,4 # §8e pads ( build/src/ov_SC04_011/ov_SC04_011_jr_8015AE2C.o: JTBL_PADS := 0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20 build/src/ov_SC04_011/ov_SC04_011_jr_8016AB6C.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20 build/src/ov_SC04_011/ov_SC04_011_jr_80178D40.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x178 -build/src/ov_SC04_011/ov_SC04_011_jr_8017D494.o: JTBL_PADS := 0,0,4,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20,+0x40,+0x58 +build/src/ov_SC04_011/ov_SC04_011_jr_8017D494.o: JTBL_PADS := 0,0,4,4,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20,+0x40,+0x58,+0x70 build/src/ov_SC04_011/ov_SC04_011_o0c.o: JTBL_PADS := 0,4,4,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x38,+0xa8,+0x118 ov_SC04_011_CHECK_SHA := config/check.ov_SC04_011.sha ov_SC04_011_SYMBOLS := config/symbols.ov_SC04_011.txt diff --git a/config/splat.ov_SC04_011.yaml b/config/splat.ov_SC04_011.yaml index 2c941bd93..db4f489a1 100644 --- a/config/splat.ov_SC04_011.yaml +++ b/config/splat.ov_SC04_011.yaml @@ -164,7 +164,7 @@ segments: - [0xc565c, .rodata, ov_SC04_011_jr_8017AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xc5670, data, tail18] - [0xc57a8, .rodata, ov_SC04_011_jr_8017D494] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc5814, data, tail19] + - [0xc5838, data, tail19] - [0xC9554, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0xC9557] # EOF marker = the 0.4.dec byte length # @TRAILING@ (above) is replaced by tools/new_overlay.sh: for a non-4-aligned overlay it becomes diff --git a/src/ov_SC04_011/ov_SC04_011_jr_8017D494.c b/src/ov_SC04_011/ov_SC04_011_jr_8017D494.c index 23de3cdd2..9745ea6dc 100644 --- a/src/ov_SC04_011/ov_SC04_011_jr_8017D494.c +++ b/src/ov_SC04_011/ov_SC04_011_jr_8017D494.c @@ -6333,7 +6333,101 @@ void func_80182D34(s32 a0) { } -INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_8017D494", func_80182DCC); +#include "common.h" + +extern void func_8018637C(s32 arg0, s32 arg1); +extern s32 func_80178B18(s32 param_1, s32 param_2); +extern int func_80178970(void); +extern s32 func_8004787C(s32 a0); +extern void func_8012BEE8(u8 *a0); +extern void func_801439C0(); +extern void func_8018B5E4(s32 a0); +extern void func_8018B1B4(s32 arg0); +extern void func_8018B744(s32 *a0); +extern void func_8018B2F8(s32 *a0, s32 a1); +extern void func_80185D04(s32 a0); +extern void func_80186D58(s32 a0); +extern s32 func_80186DCC(s32 a0); +extern s32 D_80194554; +extern s32 D_80194558; +extern s8 D_801945A4; +extern s32 D_801EFD18; + +void func_80182DCC(s32 a0) { + /* §183: the TU spells D_801EFC4C as a file-scope `s32[]` rename (aFC4C) and as a + * block-scope scalar elsewhere; keep the scalar spelling LOCAL so it cannot collide + * with the later block-scope `extern s32 D_801EFC4C[];` in this same TU. */ + extern s32 D_801EFC4C; + s32 v0; + + switch (*(u16 *)(a0 + 0x34)) { + case 0: + if (*(s16 *)(a0 + 0x98) != 0) { + break; + } + v0 = (s32)(*(s16 *)(a0 + 0xE2)) * 12; + func_8018637C(a0, *(s32 *)((s32)&D_80194554 + v0)); + *(s16 *)(a0 + 0xF2) = 0; + *(s16 *)(a0 + 0x10A) = 0; + func_80178B18(a0, (s32)&D_801945A4); + *(u16 *)(a0 + 0x34) = *(u16 *)(a0 + 0x34) + 1; + break; + case 1: + *(s16 *)(a0 + 0x6) = *(u16 *)(a0 + 0x6) + (func_8004787C(*(s16 *)(a0 + 0xF2)) >> 9); + *(u16 *)(a0 + 0xF2) = *(u16 *)(a0 + 0xF2) + 0x400; + if (*(s16 *)(a0 + 0x98) != 0) { + break; + } + v0 = (s32)(*(s16 *)(a0 + 0xE2)) * 12; + func_8018637C(a0, *(s32 *)((s32)&D_80194558 + v0)); + *(u16 *)(a0 + 0x34) = *(u16 *)(a0 + 0x34) + 1; + func_8018B5E4((s32)&D_801EFC4C); + break; + case 2: + if (*(s16 *)(a0 + 0x98) == 0) { + func_80185D04(0); + *(s32 *)(a0 + 0x1C) = 0x10; + *(u16 *)(a0 + 0x34) = *(u16 *)(a0 + 0x34) + 1; + } + func_8018B744(&D_801EFC4C); + break; + case 3: + if (((s32 (*)(s32))func_8012BEE8)(a0) != 0) { + func_8018B1B4((s32)&D_801EFC4C); + *(s32 *)(a0 + 0x1C) = 0x38; + *(u16 *)(a0 + 0x34) = *(u16 *)(a0 + 0x34) + 1; + } + func_8018B744(&D_801EFC4C); + break; + case 4: + func_8018B2F8(&D_801EFC4C, 0); + func_8018B744(&D_801EFC4C); + if (((s32 (*)(s32))func_8012BEE8)(a0) != 0) { + *(s16 *)(a0 + 0x10A) = 1; + *(u16 *)(a0 + 0x34) = *(u16 *)(a0 + 0x34) + 1; + } + break; + case 5: + if (*(s16 *)(a0 + 0x10A) == 0) { + *(u16 *)(a0 + 0x34) = *(u16 *)(a0 + 0x34) + 1; + } + break; + case 6: + func_80186D58(a0); + if (func_80186DCC(a0) != 0) { + if (D_801EFD18 != 0) { + func_801439C0(D_801EFD18); + D_801EFD18 = 0; + } + *(u16 *)(a0 + 0x34) = *(u16 *)(a0 + 0x34) + 1; + } + break; + case 7: + break; + } + ((void (*)(s32))func_80178970)(a0); +} + s32 func_80183008(void) { return 0;