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

This commit is contained in:
Drew T
2026-08-11 15:35:04 -06:00
parent 374791d4be
commit 30f80d8a18
11 changed files with 39314 additions and 27011 deletions
+5 -4
View File
@@ -4915,8 +4915,8 @@ 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,tail2.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve
build/src/ov_MAIN_012/ov_MAIN_012.o: JTBL_PADS := 0,0,0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x18,+0x190,+0x220
ov_MAIN_012_JTBL_INTERLEAVE := --order tail.data.o,ov_MAIN_012_jr_8015A3C8.o,tail2.data.o,ov_MAIN_012_jr_801789AC.o,tail3.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve
build/src/ov_MAIN_012/ov_MAIN_012_jr_801789AC.o: JTBL_PADS := 0,0,0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x18,+0x190,+0x220
ov_MAIN_012_CHECK_SHA := config/check.ov_MAIN_012.sha
ov_MAIN_012_SYMBOLS := config/symbols.ov_MAIN_012.txt
ov_MAIN_012_SIG := .run/sig.ov_MAIN_012.jsonl
@@ -4939,6 +4939,7 @@ 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,tail2.data.o,ov_SC02_037_jr_801789AC.o,tail3.data.o,ov_SC02_037_jr_8017AE2C.o,tail4.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve
build/src/ov_SC02_037/ov_SC02_037.o: JTBL_PADS := 0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20
build/src/ov_SC02_037/ov_SC02_037_jr_8017AE2C.o: JTBL_PADS := 0,0,0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x14,+0x34,+0x4c
ov_SC02_037_CHECK_SHA := config/check.ov_SC02_037.sha
ov_SC02_037_SYMBOLS := config/symbols.ov_SC02_037.txt
@@ -4961,8 +4962,8 @@ 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,tail2.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve
build/src/ov_SC03_107/ov_SC03_107.o: JTBL_PADS := 0,0,0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x18,+0x190,+0x220
ov_SC03_107_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_107_jr_8015A3C8.o,tail2.data.o,ov_SC03_107_jr_801789AC.o,tail3.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve
build/src/ov_SC03_107/ov_SC03_107_jr_801789AC.o: JTBL_PADS := 0,0,0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x18,+0x190,+0x220
ov_SC03_107_CHECK_SHA := config/check.ov_SC03_107.sha
ov_SC03_107_SYMBOLS := config/symbols.ov_SC03_107.txt
ov_SC03_107_SIG := .run/sig.ov_SC03_107.jsonl
+7 -3
View File
@@ -93,10 +93,14 @@ segments:
# shift the code start. Mark it `rodata` (section_order places .rodata first) so it lands at
# 0x80128158 ahead of the code, a 1-word analogue of main's rodata-island (no ld_interleave).
# - [0x0, rodata, head]
- [0x0, c, ov_MAIN_012] # code: starts at file 0x0 (overlays open with a prologue)
- [0x0, c, ov_MAIN_012]
- [0x32270, c, ov_MAIN_012_jr_8015A3C8]
- [0x50854, c, ov_MAIN_012_jr_801789AC]
- [0x561e0, data, tail]
- [0x5ba40, .rodata, ov_MAIN_012] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0x5bcec, data, tail2]
- [0x5b768, .rodata, ov_MAIN_012_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0x5b784, data, tail2]
- [0x5ba40, .rodata, ov_MAIN_012_jr_801789AC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0x5bcec, data, tail3]
- [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
+1 -1
View File
@@ -97,7 +97,7 @@ segments:
- [0x50854, c, ov_SC02_037_jr_801789AC]
- [0x52cd4, c, ov_SC02_037_jr_8017AE2C]
- [0x5ba68, data, tail]
- [0x9fc6c, .rodata, ov_SC02_037] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0x9fc4c, .rodata, ov_SC02_037] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0x9fc88, data, tail2]
- [0x9ff24, .rodata, ov_SC02_037_jr_801789AC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0x9ff3c, data, tail3]
+7 -3
View File
@@ -93,10 +93,14 @@ segments:
# shift the code start. Mark it `rodata` (section_order places .rodata first) so it lands at
# 0x80128158 ahead of the code, a 1-word analogue of main's rodata-island (no ld_interleave).
# - [0x0, rodata, head]
- [0x0, c, ov_SC03_107] # code: starts at file 0x0 (overlays open with a prologue)
- [0x0, c, ov_SC03_107]
- [0x32270, c, ov_SC03_107_jr_8015A3C8]
- [0x50854, c, ov_SC03_107_jr_801789AC]
- [0x5a304, data, tail]
- [0x72258, .rodata, ov_SC03_107] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0x72504, data, tail2]
- [0x71f80, .rodata, ov_SC03_107_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0x71f9c, data, tail2]
- [0x72258, .rodata, ov_SC03_107_jr_801789AC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0x72504, data, tail3]
- [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
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+274 -1
View File
@@ -13255,7 +13255,280 @@ LAB_8015a390:
}
INCLUDE_ASM("asm/ov_SC02_037/nonmatchings/ov_SC02_037", func_8015A3C8);
/* func_8015A3C8 (ov_SC01_077_after, 493 ins, jtbl_801D8B34) — Phase 26 crack
* Entity air/fall update: 7-case switch (0/1/2/6 shared, 3/4/5 own, no default block),
* then a big velocity-clamp tail with a nested char switch (0x41 / 0x53+0x73).
* PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe.
*/
extern s16 currentLocationId;
extern s32 func_80149D9C(s32 a0);
extern void func_80149FA8(void);
extern s32 func_80149FB0(s32 a0);
extern s32 func_80161B84(void *a0);
extern s32 func_80161B18(void *a0);
extern s32 func_8014A048(s32 a0);
extern void func_8014A218(void);
extern s32 func_80161BE0(s32*);
extern s32 func_801619A4(s32 *a0);
extern s32 func_80149AA8(s32 *a0);
extern void func_80149AD4(s32 *a0);
extern s32 func_80149B54(s32 * arg0);
extern void func_80149BAC(s32 *a0);
extern s32 func_801498E0(s32 *a0);
extern s32 func_80149954(s32 s0);
extern s32 func_80149A64(s32 *a0);
extern void func_800CCCC0(s32 a0);
extern s32 func_80149CD4(s32 a0);
extern void func_8015E880(s32 *a0);
extern s32 func_801496D4(void *a0);
extern void func_80149704(void);
extern s32 func_801488A8(u8 *a0);
extern void func_8014C010(s32 a0, s32 a1);
extern void func_80147078(s32 *a0, s16 a1);
extern void func_80159B70(void *a0);
extern s32 func_8015ABD4(s32 a0, s32 a1, s32 a2);
extern void func_8015AC48(s32 a0);
extern int func_80148AFC(void *a0);
extern void func_80154150(s32 a0, s32 a1);
extern void func_80154A74(s32 a0, s32 a1);
extern void func_80146DB8(s32 *a0, s32 *a1);
extern void func_80147AD4(s32 a0, s32 a1, s32 a2, s32 a3);
extern u16 func_801487F4(s32 *a0);
extern s32 func_8016F1C4(void);
extern s32 func_8015AB7C(s32 a0);
extern void func_801541D8(u8 *a0, s32 a1, s32 a2);
extern s32 func_80148824(void *arg0);
extern void func_80147A84(s32 a0);
extern void func_801473EC(s32 *a0);
extern void func_8014D738(void);
extern void func_8015C6E0(s32 *a0);
extern void func_8014E934(s32 _arg0);
extern void func_80155440(s32 *a0);
extern void func_801553C0(s32 a0);
extern void func_80161278(void *a0);
extern void func_80161C24(s32 a0, s32 a1);
extern s32 func_80172608(u8 *a0);
extern void func_801483E8(unsigned char*);
s32 func_8015A3C8(arg0)
s32 arg0;
{
extern void (*D_801862A8[])(void *);
extern u8 D_80078E78[];
extern u16 D_800B99DA;
extern s32 D_800D5428;
extern u8 D_8018622C[];
s32 min;
s32 grav;
s32 hi;
s32 t;
s32 lo1;
s32 lo2;
s32 sv;
u8 *p;
p = D_80078E78;
if (currentLocationId == 0x302A) {
min = -0xC0000;
grav = -0x4000;
hi = 0;
} else {
min = -0xB0000;
grav = -0x1000;
hi = 0;
}
if (func_80149D9C(arg0) != 0) {
D_801862A8[*(u16 *)arg0]((void *)arg0);
((void (*)(s32))func_80149FA8)(arg0);
return;
}
((void (*)(s32))func_80149FB0)(arg0);
if (((s32 (*)(s32))func_80161B84)(arg0) != 0) {
return;
}
if (((s32 (*)(s32))func_80161B18)(arg0) != 0) {
return;
}
if (*(s32 *)(arg0 + 0xB4) == (s32)&D_800D5428) {
if (func_8014A048(arg0) != 0) {
D_801862A8[*(u16 *)arg0]((void *)arg0);
((void (*)(s32))func_8014A218)(arg0);
return;
}
}
if (((s32 (*)(s32))func_80161BE0)(arg0) != 0) {
return;
}
switch (((s32 (*)(s32))func_801619A4)(arg0)) {
case 0:
case 1:
case 2:
case 6:
if (((s32 (*)(s32))func_80149AA8)(arg0) != 0) {
D_801862A8[*(u16 *)arg0]((void *)arg0);
((void (*)(s32))func_80149AD4)(arg0);
return;
}
if (((s32 (*)(s32))func_80149B54)(arg0) != 0) {
D_801862A8[*(u16 *)arg0]((void *)arg0);
((void (*)(s32))func_80149BAC)(arg0);
return;
}
break;
case 3:
((void (*)(s32))func_801498E0)(arg0);
break;
case 4:
((void (*)(s32))func_80149954)(arg0);
break;
case 5:
if (((s32 (*)(s32))func_80149A64)(arg0) != 0) {
D_801862A8[*(u16 *)arg0]((void *)arg0);
func_800CCCC0(arg0);
return;
}
break;
}
if (func_80149CD4(arg0) != 0) {
D_801862A8[*(u16 *)arg0]((void *)arg0);
((void (*)(s32))func_8015E880)(arg0);
return;
}
if (((s32 (*)(s32))func_801496D4)(arg0) != 0) {
D_801862A8[*(u16 *)arg0]((void *)arg0);
((void (*)(s32))func_80149704)(arg0);
return;
}
if (((s32 (*)(s32))func_801488A8)(arg0) == 0) {
sv = *(s32 *)(arg0 + 0x2C);
D_801862A8[*(u16 *)arg0]((void *)arg0);
func_8014C010(arg0, 1);
((void (*)(s32, s32))func_80147078)(arg0, 0);
((void (*)(s32))func_80159B70)(arg0);
if (func_8015ABD4(arg0, sv, min) != 0) {
func_8015AC48(arg0);
}
return;
}
((void (*)(s32))func_80148AFC)(arg0);
if (*(u32 *)(arg0 + 0x44) & 0x200) {
if (*(s32 *)(arg0 + 0x23C) == 0) {
func_80154150(arg0, 0xA);
func_80154A74(arg0, 0x1C);
}
((void (*)(s32, s32))func_80146DB8)(arg0, (s32)&(*(s32 *)&D_8018622C));
func_80147AD4(arg0, 0, 0, 0);
} else {
switch (*(u8 *)(arg0 + 0xA9)) {
case 0x41:
func_80147AD4(arg0, 0, 0, grav);
if (*(s32 *)(arg0 + 0x23C) == 0) {
if (((s32 (*)(s32))func_801487F4)(arg0) & 4) {
if (*(s32 *)(arg0 + 0x2C) < -0x40000) {
*(s32 *)(arg0 + 0x2C) = -0x40000;
}
} else if (func_8016F1C4() == 0) {
if ((*(s16 *)(p + 0x26) < 0x20) || (*(s16 *)(p + 0x2E) < 0x20)) {
if (*(s32 *)(arg0 + 0x2C) < -0x40000) {
*(s32 *)(arg0 + 0x2C) = -0x40000;
}
} else if ((*(s16 *)(p + 0x26) < 0x40) || (*(s16 *)(p + 0x2E) < 0x30)) {
if (*(s32 *)(arg0 + 0x2C) < -0x80000) {
*(s32 *)(arg0 + 0x2C) = -0x80000;
}
}
}
if (*(s32 *)(arg0 + 0x2C) < min) {
*(s32 *)(arg0 + 0x2C) = min;
}
if (*(s32 *)(arg0 + 0x2C) >= hi) {
*(s32 *)(arg0 + 0x2C) = hi;
}
lo1 = -0x94000;
t = *(s32 *)(arg0 + 0x2C);
if (t < lo1) {
func_80154150(arg0, 8);
} else if (t < -0x70000) {
((void (*)(s32, s32, s32))func_801541D8)(arg0, 7, func_8015AB7C(arg0) & 0xFFFF);
} else {
func_80154150(arg0, 6);
}
}
break;
case 0x53:
case 0x73:
*(s32 *)(arg0 + 0x2C) = (min * (((s32 (*)(s32))func_80148824)(arg0) & 0xFF)) / 127;
if (func_8016F1C4() == 0) {
if ((*(s16 *)(p + 0x26) < 0x40) || (*(s16 *)(p + 0x2E) < 0x30)) {
if (*(s32 *)(arg0 + 0x2C) < -0x80000) {
*(s32 *)(arg0 + 0x2C) = -0x80000;
}
}
if ((*(s16 *)(p + 0x26) < 0x20) || (*(s16 *)(p + 0x2E) < 0x20)) {
if (*(s32 *)(arg0 + 0x2C) < -0x40000) {
*(s32 *)(arg0 + 0x2C) = -0x40000;
}
}
}
if (*(s32 *)(arg0 + 0x2C) < min) {
*(s32 *)(arg0 + 0x2C) = min;
}
if (*(s32 *)(arg0 + 0x2C) >= hi) {
*(s32 *)(arg0 + 0x2C) = hi;
}
func_80147A84(arg0);
if (*(s32 *)(arg0 + 0x23C) == 0) {
lo2 = -0x94000;
t = *(s32 *)(arg0 + 0x2C);
if (t < lo2) {
func_80154150(arg0, 8);
} else if (t < -0x70000) {
((void (*)(s32, s32, s32))func_801541D8)(arg0, 7, func_8015AB7C(arg0) & 0xFFFF);
} else {
func_80154150(arg0, 6);
}
}
break;
}
}
((void (*)(s32))func_801473EC)(arg0);
if ((min >= *(s32 *)(arg0 + 0x2C)) && !(D_800B99DA & 7)) {
func_8014C010(arg0, 2);
}
if (((s32 (*)(s32))func_8014D738)(arg0) != 0) {
D_801862A8[*(u16 *)arg0]((void *)arg0);
((void (*)(s32))func_8015C6E0)(arg0);
return;
}
if (((s32 (*)(s32))func_8014E934)(arg0) != 0) {
((void (*)(s32))func_80155440)(arg0);
func_80154150(arg0, 0x12);
func_80154A74(arg0, 0x17);
*(s32 *)(arg0 + 0x23C) = 1;
} else {
if (*(s32 *)(arg0 + 0x23C) != 0) {
func_801553C0(arg0);
func_80154150(arg0, 6);
func_80154A74(arg0, 0x21);
}
*(s32 *)(arg0 + 0x23C) = 0;
}
if (((s32 (*)(s32))func_80161278)(arg0) == 0) {
if (*(u16 *)(arg0 + 0xB8) & 0x2000) {
func_80161C24(arg0, *(u16 *)(arg0 + 0x16E));
}
((void (*)(s32))func_80172608)(arg0);
((void (*)(s32))func_801483E8)(arg0);
}
}
DEFINE_func_8015AB7C() /* dedup: shared engine-core @0x8015ab7c (src/shared) */
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff