From f0ecebd81fa0fe9d61eb29c7462b315cf72782ef Mon Sep 17 00:00:00 2001 From: Drew T <50529377+Druthulu@users.noreply.github.com> Date: Tue, 11 Aug 2026 16:08:39 -0600 Subject: [PATCH] =?UTF-8?q?feat(phase-30=20S48-0b):=20jtbl=20family=20func?= =?UTF-8?q?=5F80159A20=20=E2=80=94=203/3=20blocked-binary=20siblings=20ban?= =?UTF-8?q?ked?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/overlays.mk | 9 ++-- config/splat.ov_MAIN_012.yaml | 11 ++--- config/splat.ov_SC02_037.yaml | 13 +++-- config/splat.ov_SC03_107.yaml | 11 ++--- src/ov_MAIN_012/ov_MAIN_012_jr_801594E8.c | 59 ++++++++++++++++++++++- src/ov_SC02_037/ov_SC02_037_jr_801594E8.c | 59 ++++++++++++++++++++++- src/ov_SC03_107/ov_SC03_107_jr_801594E8.c | 59 ++++++++++++++++++++++- 7 files changed, 196 insertions(+), 25 deletions(-) diff --git a/config/overlays.mk b/config/overlays.mk index fe6c48221..993176037 100644 --- a/config/overlays.mk +++ b/config/overlays.mk @@ -4915,12 +4915,13 @@ ov_MAIN_012_ELF := $(ov_MAIN_012_OUT).elf ov_MAIN_012_MAPFILE := $(ov_MAIN_012_OUT).map ov_MAIN_012_LD_SCRIPT := $(ov_MAIN_012_OUT).ld ov_MAIN_012_SPLAT_YAML := config/splat.ov_MAIN_012.yaml -ov_MAIN_012_JTBL_INTERLEAVE := --order tail.data.o,ov_MAIN_012.o,ov_MAIN_012_jr_80131340.o,tail2.data.o,ov_MAIN_012_jr_80135A4C.o,tail3.data.o,ov_MAIN_012_jr_80135EB0.o,tail4.data.o,ov_MAIN_012_jr_801380E0.o,tail5.data.o,ov_MAIN_012_jr_8013F350.o,tail6.data.o,ov_MAIN_012_jr_801549F8.o,ov_MAIN_012_jr_801555F4.o,tail7.data.o,ov_MAIN_012_jr_801594E8.o,tail8.data.o,ov_MAIN_012_jr_80159C84.o,tail9.data.o,ov_MAIN_012_jr_8015A3C8.o,tail10.data.o,ov_MAIN_012_jr_8016AE5C.o,tail11.data.o,ov_MAIN_012_jr_80171B4C.o,tail12.data.o,ov_MAIN_012_jr_801789AC.o,tail13.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_MAIN_012_JTBL_INTERLEAVE := --order tail.data.o,ov_MAIN_012.o,ov_MAIN_012_jr_80131340.o,tail2.data.o,ov_MAIN_012_jr_80135A4C.o,tail3.data.o,ov_MAIN_012_jr_80135EB0.o,tail4.data.o,ov_MAIN_012_jr_801380E0.o,tail5.data.o,ov_MAIN_012_jr_8013F350.o,tail6.data.o,ov_MAIN_012_jr_801549F8.o,ov_MAIN_012_jr_801555F4.o,tail7.data.o,ov_MAIN_012_jr_801594E8.o,ov_MAIN_012_jr_80159C84.o,tail8.data.o,ov_MAIN_012_jr_8015A3C8.o,tail9.data.o,ov_MAIN_012_jr_8016AE5C.o,tail10.data.o,ov_MAIN_012_jr_80171B4C.o,tail11.data.o,ov_MAIN_012_jr_801789AC.o,tail12.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve build/src/ov_MAIN_012/ov_MAIN_012.o: JTBL_PADS := 0,0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x14,+0xdc build/src/ov_MAIN_012/ov_MAIN_012_jr_80131340.o: JTBL_PADS := 0,0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x14,+0x2c build/src/ov_MAIN_012/ov_MAIN_012_jr_80135A4C.o: JTBL_PADS := 0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x18 build/src/ov_MAIN_012/ov_MAIN_012_jr_8013F350.o: JTBL_PADS := 0,0,4,0,4,0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20,+0x38,+0x58,+0x70,+0x90,+0xa8 build/src/ov_MAIN_012/ov_MAIN_012_jr_801549F8.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x6c +build/src/ov_MAIN_012/ov_MAIN_012_jr_801594E8.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20 build/src/ov_MAIN_012/ov_MAIN_012_jr_80159C84.o: JTBL_PADS := 0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20 build/src/ov_MAIN_012/ov_MAIN_012_jr_801789AC.o: JTBL_PADS := 0,0,0,4,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x18,+0x190,+0x220,+0x2b0 ov_MAIN_012_CHECK_SHA := config/check.ov_MAIN_012.sha @@ -4944,12 +4945,13 @@ ov_SC02_037_ELF := $(ov_SC02_037_OUT).elf ov_SC02_037_MAPFILE := $(ov_SC02_037_OUT).map ov_SC02_037_LD_SCRIPT := $(ov_SC02_037_OUT).ld ov_SC02_037_SPLAT_YAML := config/splat.ov_SC02_037.yaml -ov_SC02_037_JTBL_INTERLEAVE := --order tail.data.o,ov_SC02_037.o,ov_SC02_037_jr_80131340.o,tail2.data.o,ov_SC02_037_jr_80135A4C.o,tail3.data.o,ov_SC02_037_jr_80135EB0.o,tail4.data.o,ov_SC02_037_jr_801380E0.o,tail5.data.o,ov_SC02_037_jr_8013F350.o,tail6.data.o,ov_SC02_037_jr_801549F8.o,ov_SC02_037_jr_801555F4.o,tail7.data.o,ov_SC02_037_jr_801594E8.o,tail8.data.o,ov_SC02_037_jr_80159C84.o,tail9.data.o,ov_SC02_037_jr_8015A3C8.o,tail10.data.o,ov_SC02_037_jr_8016AE5C.o,tail11.data.o,ov_SC02_037_jr_80171B4C.o,tail12.data.o,ov_SC02_037_jr_801789AC.o,tail13.data.o,ov_SC02_037_jr_8017AE2C.o,tail14.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC02_037_JTBL_INTERLEAVE := --order tail.data.o,ov_SC02_037.o,ov_SC02_037_jr_80131340.o,tail2.data.o,ov_SC02_037_jr_80135A4C.o,tail3.data.o,ov_SC02_037_jr_80135EB0.o,tail4.data.o,ov_SC02_037_jr_801380E0.o,tail5.data.o,ov_SC02_037_jr_8013F350.o,tail6.data.o,ov_SC02_037_jr_801549F8.o,ov_SC02_037_jr_801555F4.o,tail7.data.o,ov_SC02_037_jr_801594E8.o,ov_SC02_037_jr_80159C84.o,tail8.data.o,ov_SC02_037_jr_8015A3C8.o,tail9.data.o,ov_SC02_037_jr_8016AE5C.o,tail10.data.o,ov_SC02_037_jr_80171B4C.o,tail11.data.o,ov_SC02_037_jr_801789AC.o,tail12.data.o,ov_SC02_037_jr_8017AE2C.o,tail13.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve build/src/ov_SC02_037/ov_SC02_037.o: JTBL_PADS := 0,0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x14,+0xdc build/src/ov_SC02_037/ov_SC02_037_jr_80131340.o: JTBL_PADS := 0,0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x14,+0x2c build/src/ov_SC02_037/ov_SC02_037_jr_80135A4C.o: JTBL_PADS := 0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x18 build/src/ov_SC02_037/ov_SC02_037_jr_8013F350.o: JTBL_PADS := 0,0,4,0,4,0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20,+0x38,+0x58,+0x70,+0x90,+0xa8 build/src/ov_SC02_037/ov_SC02_037_jr_801549F8.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x6c +build/src/ov_SC02_037/ov_SC02_037_jr_801594E8.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20 build/src/ov_SC02_037/ov_SC02_037_jr_80159C84.o: JTBL_PADS := 0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20 build/src/ov_SC02_037/ov_SC02_037_jr_8015A3C8.o: JTBL_PADS := 0,4,4,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20,+0x40,+0x60 build/src/ov_SC02_037/ov_SC02_037_jr_801789AC.o: JTBL_PADS := 0,0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x18,+0x190 @@ -4975,12 +4977,13 @@ ov_SC03_107_ELF := $(ov_SC03_107_OUT).elf ov_SC03_107_MAPFILE := $(ov_SC03_107_OUT).map ov_SC03_107_LD_SCRIPT := $(ov_SC03_107_OUT).ld ov_SC03_107_SPLAT_YAML := config/splat.ov_SC03_107.yaml -ov_SC03_107_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_107.o,ov_SC03_107_jr_80131340.o,tail2.data.o,ov_SC03_107_jr_80135A4C.o,tail3.data.o,ov_SC03_107_jr_80135EB0.o,tail4.data.o,ov_SC03_107_jr_801380E0.o,tail5.data.o,ov_SC03_107_jr_8013F350.o,tail6.data.o,ov_SC03_107_jr_801549F8.o,ov_SC03_107_jr_801555F4.o,tail7.data.o,ov_SC03_107_jr_801594E8.o,tail8.data.o,ov_SC03_107_jr_80159C84.o,tail9.data.o,ov_SC03_107_jr_8015A3C8.o,tail10.data.o,ov_SC03_107_jr_8016AE5C.o,tail11.data.o,ov_SC03_107_jr_80171B4C.o,tail12.data.o,ov_SC03_107_jr_801789AC.o,tail13.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_107_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_107.o,ov_SC03_107_jr_80131340.o,tail2.data.o,ov_SC03_107_jr_80135A4C.o,tail3.data.o,ov_SC03_107_jr_80135EB0.o,tail4.data.o,ov_SC03_107_jr_801380E0.o,tail5.data.o,ov_SC03_107_jr_8013F350.o,tail6.data.o,ov_SC03_107_jr_801549F8.o,ov_SC03_107_jr_801555F4.o,tail7.data.o,ov_SC03_107_jr_801594E8.o,ov_SC03_107_jr_80159C84.o,tail8.data.o,ov_SC03_107_jr_8015A3C8.o,tail9.data.o,ov_SC03_107_jr_8016AE5C.o,tail10.data.o,ov_SC03_107_jr_80171B4C.o,tail11.data.o,ov_SC03_107_jr_801789AC.o,tail12.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve build/src/ov_SC03_107/ov_SC03_107.o: JTBL_PADS := 0,0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x14,+0xdc build/src/ov_SC03_107/ov_SC03_107_jr_80131340.o: JTBL_PADS := 0,0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x14,+0x2c build/src/ov_SC03_107/ov_SC03_107_jr_80135A4C.o: JTBL_PADS := 0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x18 build/src/ov_SC03_107/ov_SC03_107_jr_8013F350.o: JTBL_PADS := 0,0,4,0,4,0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20,+0x38,+0x58,+0x70,+0x90,+0xa8 build/src/ov_SC03_107/ov_SC03_107_jr_801549F8.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x6c +build/src/ov_SC03_107/ov_SC03_107_jr_801594E8.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20 build/src/ov_SC03_107/ov_SC03_107_jr_80159C84.o: JTBL_PADS := 0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20 build/src/ov_SC03_107/ov_SC03_107_jr_801789AC.o: JTBL_PADS := 0,0,0,4,4,0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x18,+0x190,+0x220,+0x2b0,+0x2c4,+0x32c ov_SC03_107_CHECK_SHA := config/check.ov_SC03_107.sha diff --git a/config/splat.ov_MAIN_012.yaml b/config/splat.ov_MAIN_012.yaml index 482adf2f6..e31729769 100644 --- a/config/splat.ov_MAIN_012.yaml +++ b/config/splat.ov_MAIN_012.yaml @@ -123,17 +123,16 @@ segments: - [0x5b668, .rodata, ov_MAIN_012_jr_801555F4] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x5b688, data, tail7] - [0x5b6b0, .rodata, ov_MAIN_012_jr_801594E8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x5b6d0, data, tail8] - [0x5b730, .rodata, ov_MAIN_012_jr_80159C84] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x5b764, data, tail9] + - [0x5b764, data, tail8] - [0x5b768, .rodata, ov_MAIN_012_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x5b784, data, tail10] + - [0x5b784, data, tail9] - [0x5b81c, .rodata, ov_MAIN_012_jr_8016AE5C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x5b83c, data, tail11] + - [0x5b83c, data, tail10] - [0x5b87c, .rodata, ov_MAIN_012_jr_80171B4C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x5b89c, data, tail12] + - [0x5b89c, data, tail11] - [0x5ba40, .rodata, ov_MAIN_012_jr_801789AC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x5bd04, data, tail13] + - [0x5bd04, data, tail12] - [0x5DB24, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x5DB27] # 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/config/splat.ov_SC02_037.yaml b/config/splat.ov_SC02_037.yaml index a6890fc6f..4796ffb4b 100644 --- a/config/splat.ov_SC02_037.yaml +++ b/config/splat.ov_SC02_037.yaml @@ -124,19 +124,18 @@ segments: - [0x9fb4c, .rodata, ov_SC02_037_jr_801555F4] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x9fb6c, data, tail7] - [0x9fb94, .rodata, ov_SC02_037_jr_801594E8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9fbb4, data, tail8] - [0x9fc14, .rodata, ov_SC02_037_jr_80159C84] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9fc48, data, tail9] + - [0x9fc48, data, tail8] - [0x9fc4c, .rodata, ov_SC02_037_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9fcc8, data, tail10] + - [0x9fcc8, data, tail9] - [0x9fd00, .rodata, ov_SC02_037_jr_8016AE5C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9fd20, data, tail11] + - [0x9fd20, data, tail10] - [0x9fd60, .rodata, ov_SC02_037_jr_80171B4C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9fd80, data, tail12] + - [0x9fd80, data, tail11] - [0x9ff24, .rodata, ov_SC02_037_jr_801789AC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa0140, data, tail13] + - [0xa0140, data, tail12] - [0xa01d4, .rodata, ov_SC02_037_jr_8017AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa0238, data, tail14] + - [0xa0238, data, tail13] - [0xA198C, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0xA198F] # 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/config/splat.ov_SC03_107.yaml b/config/splat.ov_SC03_107.yaml index b4b265f46..e591546bf 100644 --- a/config/splat.ov_SC03_107.yaml +++ b/config/splat.ov_SC03_107.yaml @@ -123,17 +123,16 @@ segments: - [0x71e80, .rodata, ov_SC03_107_jr_801555F4] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x71ea0, data, tail7] - [0x71ec8, .rodata, ov_SC03_107_jr_801594E8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x71ee8, data, tail8] - [0x71f48, .rodata, ov_SC03_107_jr_80159C84] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x71f7c, data, tail9] + - [0x71f7c, data, tail8] - [0x71f80, .rodata, ov_SC03_107_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x71f9c, data, tail10] + - [0x71f9c, data, tail9] - [0x72034, .rodata, ov_SC03_107_jr_8016AE5C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x72054, data, tail11] + - [0x72054, data, tail10] - [0x72094, .rodata, ov_SC03_107_jr_80171B4C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x720b4, data, tail12] + - [0x720b4, data, tail11] - [0x72258, .rodata, ov_SC03_107_jr_801789AC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x725ac, data, tail13] + - [0x725ac, data, tail12] - [0x73BE4, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x73BE7] # 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_MAIN_012/ov_MAIN_012_jr_801594E8.c b/src/ov_MAIN_012/ov_MAIN_012_jr_801594E8.c index 257b0f779..e5b6e4526 100644 --- a/src/ov_MAIN_012/ov_MAIN_012_jr_801594E8.c +++ b/src/ov_MAIN_012/ov_MAIN_012_jr_801594E8.c @@ -2342,7 +2342,64 @@ DEFINE_func_801599E0() /* dedup: shared engine-core @0x801599e0 (src/shared) */ void func_80159A18(void) { } -INCLUDE_ASM("asm/ov_MAIN_012/nonmatchings/ov_MAIN_012_jr_801594E8", func_80159A20); + +// @class: struct +// Redraft of the DECAYED backlog draft. The stored seed took `void *param_1` and then +// dereferenced it (`param_1[0xdd]`) — gcc-2.7.2 rejects that ("void value not ignored +// as it ought to be"), so the seed no longer compiles at all. Fix: retype the parameter +// as `unsigned char *`, which keeps every pointer offset byte-scaled (as void* arith did) +// while making the byte load legal. +// Structure preserved from the seed: the two return-tests are kept STRUCTURALLY +// DIFFERENT (positive `if(==) goto mask;` per branch, not `if(!=) return;`) so gcc's +// cross-jump pass cannot tail-merge them; and the outer test is inverted (`if(d != 1)`) +// so the ==4/return path is the inline fall-through and the d==1 / p[2] path becomes the +// forward beq-target block — matching the target block order. +// Typedefs are BLOCK-SCOPE so the match travels to the sibling overlays. + + +extern void func_80150B28(int param_1); +extern void func_80158638(void*); +extern void func_8015126C(unsigned short *); +extern void func_8014900C(int *a0); + +void func_80159A20(unsigned char *param_1) +{ + + extern void (*D_80180AC0[])(unsigned char *); + typedef unsigned short u16; + typedef unsigned int u32; + typedef int s32; + typedef unsigned char u8; + + ((s32 (*)(void))func_80150B28)(); + ((void (*)(unsigned char *))func_80158638)(param_1); + ((void (*)(u8 *))func_8015126C)(param_1); + ((void (*)(u8 *))func_8014900C)(param_1); + D_80180AC0[*(u16 *)param_1 & 0x7fff](param_1); + *(u32 *)(param_1 + 0x44) |= 0x8000000; + switch (*(u16 *)param_1) { + case 2: + case 3: + case 0xb: + case 0xc: + goto mask; + default: + return; + case 0x19: + if (param_1[0xdd] != 1) { + if (param_1[0xdd] == 4) { + goto mask; + } + return; + } + if (*(u16 *)(param_1 + 2) == 3) { + goto mask; + } + return; + } +mask: + *(u32 *)(param_1 + 0x44) &= 0xf7ffffff; +} DEFINE_func_80159B08() /* dedup: shared engine-core @0x80159b08 (src/shared) */ diff --git a/src/ov_SC02_037/ov_SC02_037_jr_801594E8.c b/src/ov_SC02_037/ov_SC02_037_jr_801594E8.c index 68bc54f7f..d0078c8dd 100644 --- a/src/ov_SC02_037/ov_SC02_037_jr_801594E8.c +++ b/src/ov_SC02_037/ov_SC02_037_jr_801594E8.c @@ -2363,7 +2363,64 @@ DEFINE_func_801599E0() /* dedup: shared engine-core @0x801599e0 (src/shared) */ void func_80159A18(void) { } -INCLUDE_ASM("asm/ov_SC02_037/nonmatchings/ov_SC02_037_jr_801594E8", func_80159A20); + +// @class: struct +// Redraft of the DECAYED backlog draft. The stored seed took `void *param_1` and then +// dereferenced it (`param_1[0xdd]`) — gcc-2.7.2 rejects that ("void value not ignored +// as it ought to be"), so the seed no longer compiles at all. Fix: retype the parameter +// as `unsigned char *`, which keeps every pointer offset byte-scaled (as void* arith did) +// while making the byte load legal. +// Structure preserved from the seed: the two return-tests are kept STRUCTURALLY +// DIFFERENT (positive `if(==) goto mask;` per branch, not `if(!=) return;`) so gcc's +// cross-jump pass cannot tail-merge them; and the outer test is inverted (`if(d != 1)`) +// so the ==4/return path is the inline fall-through and the d==1 / p[2] path becomes the +// forward beq-target block — matching the target block order. +// Typedefs are BLOCK-SCOPE so the match travels to the sibling overlays. + + +extern void func_80150B28(int param_1); +extern void func_80158638(void*); +extern void func_8015126C(unsigned short *); +extern void func_8014900C(int *a0); + +void func_80159A20(unsigned char *param_1) +{ + + extern void (*D_8018634C[])(unsigned char *); + typedef unsigned short u16; + typedef unsigned int u32; + typedef int s32; + typedef unsigned char u8; + + ((s32 (*)(void))func_80150B28)(); + ((void (*)(unsigned char *))func_80158638)(param_1); + ((void (*)(u8 *))func_8015126C)(param_1); + ((void (*)(u8 *))func_8014900C)(param_1); + D_8018634C[*(u16 *)param_1 & 0x7fff](param_1); + *(u32 *)(param_1 + 0x44) |= 0x8000000; + switch (*(u16 *)param_1) { + case 2: + case 3: + case 0xb: + case 0xc: + goto mask; + default: + return; + case 0x19: + if (param_1[0xdd] != 1) { + if (param_1[0xdd] == 4) { + goto mask; + } + return; + } + if (*(u16 *)(param_1 + 2) == 3) { + goto mask; + } + return; + } +mask: + *(u32 *)(param_1 + 0x44) &= 0xf7ffffff; +} DEFINE_func_80159B08() /* dedup: shared engine-core @0x80159b08 (src/shared) */ diff --git a/src/ov_SC03_107/ov_SC03_107_jr_801594E8.c b/src/ov_SC03_107/ov_SC03_107_jr_801594E8.c index 9db514f71..5c3559b30 100644 --- a/src/ov_SC03_107/ov_SC03_107_jr_801594E8.c +++ b/src/ov_SC03_107/ov_SC03_107_jr_801594E8.c @@ -2346,7 +2346,64 @@ DEFINE_func_801599E0() /* dedup: shared engine-core @0x801599e0 (src/shared) */ void func_80159A18(void) { } -INCLUDE_ASM("asm/ov_SC03_107/nonmatchings/ov_SC03_107_jr_801594E8", func_80159A20); + +// @class: struct +// Redraft of the DECAYED backlog draft. The stored seed took `void *param_1` and then +// dereferenced it (`param_1[0xdd]`) — gcc-2.7.2 rejects that ("void value not ignored +// as it ought to be"), so the seed no longer compiles at all. Fix: retype the parameter +// as `unsigned char *`, which keeps every pointer offset byte-scaled (as void* arith did) +// while making the byte load legal. +// Structure preserved from the seed: the two return-tests are kept STRUCTURALLY +// DIFFERENT (positive `if(==) goto mask;` per branch, not `if(!=) return;`) so gcc's +// cross-jump pass cannot tail-merge them; and the outer test is inverted (`if(d != 1)`) +// so the ==4/return path is the inline fall-through and the d==1 / p[2] path becomes the +// forward beq-target block — matching the target block order. +// Typedefs are BLOCK-SCOPE so the match travels to the sibling overlays. + + +extern void func_80150B28(int param_1); +extern void func_80158638(void*); +extern void func_8015126C(unsigned short *); +extern void func_8014900C(int *a0); + +void func_80159A20(unsigned char *param_1) +{ + + extern void (*D_80184BE8[])(unsigned char *); + typedef unsigned short u16; + typedef unsigned int u32; + typedef int s32; + typedef unsigned char u8; + + ((s32 (*)(void))func_80150B28)(); + ((void (*)(unsigned char *))func_80158638)(param_1); + ((void (*)(u8 *))func_8015126C)(param_1); + ((void (*)(u8 *))func_8014900C)(param_1); + D_80184BE8[*(u16 *)param_1 & 0x7fff](param_1); + *(u32 *)(param_1 + 0x44) |= 0x8000000; + switch (*(u16 *)param_1) { + case 2: + case 3: + case 0xb: + case 0xc: + goto mask; + default: + return; + case 0x19: + if (param_1[0xdd] != 1) { + if (param_1[0xdd] == 4) { + goto mask; + } + return; + } + if (*(u16 *)(param_1 + 2) == 3) { + goto mask; + } + return; + } +mask: + *(u32 *)(param_1 + 0x44) &= 0xf7ffffff; +} DEFINE_func_80159B08() /* dedup: shared engine-core @0x80159b08 (src/shared) */