feat(phase-30 S48-0b): jtbl family func_80159A20 — 3/3 blocked-binary siblings banked

This commit is contained in:
Drew T
2026-08-11 16:08:39 -06:00
parent d8b84b75de
commit f0ecebd81f
7 changed files with 196 additions and 25 deletions
+6 -3
View File
@@ -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
+5 -6
View File
@@ -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
+6 -7
View File
@@ -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
+5 -6
View File
@@ -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
+58 -1
View File
@@ -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) */
+58 -1
View File
@@ -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) */
+58 -1
View File
@@ -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) */