diff --git a/config/overlays.mk b/config/overlays.mk index 25841fc0d..a97e8cd97 100644 --- a/config/overlays.mk +++ b/config/overlays.mk @@ -4916,6 +4916,7 @@ 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,ov_MAIN_012_jr_80131340.o,tail3.data.o,ov_MAIN_012_jr_80135A4C.o,tail4.data.o,ov_MAIN_012_jr_80135EB0.o,tail5.data.o,ov_MAIN_012_jr_801380E0.o,tail6.data.o,ov_MAIN_012_jr_8013F350.o,tail7.data.o,ov_MAIN_012_jr_801555F4.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_801789AC.o,tail11.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +build/src/ov_MAIN_012/ov_MAIN_012.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x14 build/src/ov_MAIN_012/ov_MAIN_012_jr_80131340.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x14 build/src/ov_MAIN_012/ov_MAIN_012_jr_8013F350.o: JTBL_PADS := 0,0,4,0,4,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20,+0x38,+0x58,+0x70,+0x90 build/src/ov_MAIN_012/ov_MAIN_012_jr_80159C84.o: JTBL_PADS := 0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20 @@ -4942,6 +4943,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_80131340.o,tail3.data.o,ov_SC02_037_jr_80135A4C.o,tail4.data.o,ov_SC02_037_jr_80135EB0.o,tail5.data.o,ov_SC02_037_jr_801380E0.o,tail6.data.o,ov_SC02_037_jr_8013F350.o,tail7.data.o,ov_SC02_037_jr_801555F4.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_801789AC.o,tail11.data.o,ov_SC02_037_jr_8017AE2C.o,tail12.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +build/src/ov_SC02_037/ov_SC02_037.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x14 build/src/ov_SC02_037/ov_SC02_037_jr_80131340.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x14 build/src/ov_SC02_037/ov_SC02_037_jr_8013F350.o: JTBL_PADS := 0,0,4,0,4,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20,+0x38,+0x58,+0x70,+0x90 build/src/ov_SC02_037/ov_SC02_037_jr_80159C84.o: JTBL_PADS := 0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20 @@ -4969,6 +4971,7 @@ 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,ov_SC03_107_jr_80131340.o,tail3.data.o,ov_SC03_107_jr_80135A4C.o,tail4.data.o,ov_SC03_107_jr_80135EB0.o,tail5.data.o,ov_SC03_107_jr_801380E0.o,tail6.data.o,ov_SC03_107_jr_8013F350.o,tail7.data.o,ov_SC03_107_jr_801555F4.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_801789AC.o,tail11.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +build/src/ov_SC03_107/ov_SC03_107.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x14 build/src/ov_SC03_107/ov_SC03_107_jr_80131340.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x14 build/src/ov_SC03_107/ov_SC03_107_jr_8013F350.o: JTBL_PADS := 0,0,4,0,4,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20,+0x38,+0x58,+0x70,+0x90 build/src/ov_SC03_107/ov_SC03_107_jr_80159C84.o: JTBL_PADS := 0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20 diff --git a/config/splat.ov_MAIN_012.yaml b/config/splat.ov_MAIN_012.yaml index 9fbee17a3..a6f209ccf 100644 --- a/config/splat.ov_MAIN_012.yaml +++ b/config/splat.ov_MAIN_012.yaml @@ -105,7 +105,7 @@ segments: - [0x50854, c, ov_MAIN_012_jr_801789AC] - [0x561e0, data, tail] - [0x5abd0, .rodata, ov_MAIN_012] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x5abe4, data, tail2] + - [0x5acac, data, tail2] - [0x5ad78, .rodata, ov_MAIN_012_jr_80131340] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x5ada0, data, tail3] - [0x5adbc, .rodata, ov_MAIN_012_jr_80135A4C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) diff --git a/config/splat.ov_SC02_037.yaml b/config/splat.ov_SC02_037.yaml index d568cc682..81a635564 100644 --- a/config/splat.ov_SC02_037.yaml +++ b/config/splat.ov_SC02_037.yaml @@ -106,7 +106,7 @@ segments: - [0x52cd4, c, ov_SC02_037_jr_8017AE2C] - [0x5ba68, data, tail] - [0x9f0b4, .rodata, ov_SC02_037] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9f0c8, data, tail2] + - [0x9f190, data, tail2] - [0x9f25c, .rodata, ov_SC02_037_jr_80131340] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x9f284, data, tail3] - [0x9f2a0, .rodata, ov_SC02_037_jr_80135A4C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) diff --git a/config/splat.ov_SC03_107.yaml b/config/splat.ov_SC03_107.yaml index fb50029ca..fa032d194 100644 --- a/config/splat.ov_SC03_107.yaml +++ b/config/splat.ov_SC03_107.yaml @@ -105,7 +105,7 @@ segments: - [0x50854, c, ov_SC03_107_jr_801789AC] - [0x5a304, data, tail] - [0x713e8, .rodata, ov_SC03_107] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x713fc, data, tail2] + - [0x714c4, data, tail2] - [0x71590, .rodata, ov_SC03_107_jr_80131340] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x715b8, data, tail3] - [0x715d4, .rodata, ov_SC03_107_jr_80135A4C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) diff --git a/src/ov_MAIN_012/ov_MAIN_012.c b/src/ov_MAIN_012/ov_MAIN_012.c index 67c0c5b55..c361648b9 100644 --- a/src/ov_MAIN_012/ov_MAIN_012.c +++ b/src/ov_MAIN_012/ov_MAIN_012.c @@ -911,7 +911,88 @@ DEFINE_func_8012A908() /* dedup: shared engine-core @0x8012a908 (src/shared) */ DEFINE_func_8012A988() /* dedup: shared engine-core @0x8012a988 (src/shared) */ -INCLUDE_ASM("asm/ov_MAIN_012/nonmatchings/ov_MAIN_012", func_8012AAAC); + +extern void func_8012AAAC(void *arg0); + +void func_8012AAAC(void *arg0) { + void *ptr; + s32 link; + s32 next; + s32 saved; + s32 cnt; + s32 back; + s32 head; + + M2C_FIELD(arg0, u16 *, 0x72) = (u16) (M2C_FIELD(arg0, u16 *, 0x72) & 0xBFFF); + ptr = (void *) (M2C_FIELD(arg0, s32 *, 0x90) + (M2C_FIELD(arg0, s32 *, 0x94) * 8)); + if (M2C_FIELD(ptr, s16 *, 4) < 0) { + switch (M2C_FIELD(ptr, s16 *, 4)) { + case -2: + link = M2C_FIELD(arg0, s32 *, 0x9C); + if (link == 0) { + M2C_FIELD(arg0, s16 *, 0x98) = 0; + break; + } + goto pop; + case -1: + link = M2C_FIELD(arg0, s32 *, 0x9C); + if (link != 0) { +pop: + back = M2C_FIELD(arg0, s16 *, 0x9A); + M2C_FIELD(arg0, s32 *, 0x90) = link; + M2C_FIELD(arg0, s32 *, 0x9C) = 0; + M2C_FIELD(arg0, s16 *, 0x9A) = 0; + M2C_FIELD(arg0, s32 *, 0x94) = back; + func_8012AAAC(arg0); + break; + } + M2C_FIELD(arg0, s32 *, 0x94) = 0; + func_8012AAAC(arg0); + M2C_FIELD(arg0, u16 *, 0x72) = (u16) (M2C_FIELD(arg0, u16 *, 0x72) | 0x4000); + break; + case -4: + head = M2C_FIELD(ptr, s32 *, 0); + M2C_FIELD(arg0, s32 *, 0x94) = 0; + M2C_FIELD(arg0, s32 *, 0x9C) = 0; + M2C_FIELD(arg0, s16 *, 0x9A) = 0; + M2C_FIELD(arg0, s32 *, 0x90) = head; + M2C_FIELD(arg0, u16 *, 0x72) = (u16) (M2C_FIELD(arg0, u16 *, 0x72) & 0xF9FF); + func_8012AAAC(arg0); + break; + case -3: + cnt = M2C_FIELD(arg0, s32 *, 0x94) + 1; + M2C_FIELD(arg0, s32 *, 0x94) = cnt; + if (M2C_FIELD(arg0, s32 *, 0x9C) != 0) { + func_8012AAAC(arg0); + break; + } + saved = M2C_FIELD(arg0, s32 *, 0x90); + next = M2C_FIELD(ptr, s32 *, 0); + M2C_FIELD(arg0, s32 *, 0x94) = 0; + M2C_FIELD(arg0, s32 *, 0x9C) = 0; + M2C_FIELD(arg0, s16 *, 0x9A) = 0; + M2C_FIELD(arg0, s32 *, 0x90) = next; + M2C_FIELD(arg0, u16 *, 0x72) = (u16) (M2C_FIELD(arg0, u16 *, 0x72) & 0xF9FF); + func_8012AAAC(arg0); + M2C_FIELD(arg0, s32 *, 0x9C) = saved; + M2C_FIELD(arg0, s16 *, 0x9A) = (s16) cnt; + break; + case -50: + M2C_FIELD(arg0, s32 *, 0x94) = M2C_FIELD(arg0, s32 *, 0x94) + 1; + func_8012AAAC(arg0); + M2C_FIELD(arg0, u16 *, 0x72) = (u16) (M2C_FIELD(arg0, u16 *, 0x72) | 0x2000); + break; + case -5: + M2C_FIELD(arg0, u16 *, 0x72) = (u16) (M2C_FIELD(arg0, u16 *, 0x72) | 0x400); + M2C_FIELD(arg0, s32 *, 0x94) = M2C_FIELD(arg0, s32 *, 0x94) - 1; + func_8012AAAC(arg0); + break; + } + } else { + M2C_FIELD(M2C_FIELD(arg0, void **, 0x20), s32 *, 0x20) = M2C_FIELD(ptr, s32 *, 0); + M2C_FIELD(arg0, s16 *, 0x98) = M2C_FIELD(ptr, s16 *, 4); + } +} diff --git a/src/ov_SC02_037/ov_SC02_037.c b/src/ov_SC02_037/ov_SC02_037.c index 0f214de2a..2a7ba2f34 100644 --- a/src/ov_SC02_037/ov_SC02_037.c +++ b/src/ov_SC02_037/ov_SC02_037.c @@ -894,7 +894,88 @@ DEFINE_func_8012A908() /* dedup: shared engine-core @0x8012a908 (src/shared) */ DEFINE_func_8012A988() /* dedup: shared engine-core @0x8012a988 (src/shared) */ -INCLUDE_ASM("asm/ov_SC02_037/nonmatchings/ov_SC02_037", func_8012AAAC); + +extern void func_8012AAAC(void *arg0); + +void func_8012AAAC(void *arg0) { + void *ptr; + s32 link; + s32 next; + s32 saved; + s32 cnt; + s32 back; + s32 head; + + M2C_FIELD(arg0, u16 *, 0x72) = (u16) (M2C_FIELD(arg0, u16 *, 0x72) & 0xBFFF); + ptr = (void *) (M2C_FIELD(arg0, s32 *, 0x90) + (M2C_FIELD(arg0, s32 *, 0x94) * 8)); + if (M2C_FIELD(ptr, s16 *, 4) < 0) { + switch (M2C_FIELD(ptr, s16 *, 4)) { + case -2: + link = M2C_FIELD(arg0, s32 *, 0x9C); + if (link == 0) { + M2C_FIELD(arg0, s16 *, 0x98) = 0; + break; + } + goto pop; + case -1: + link = M2C_FIELD(arg0, s32 *, 0x9C); + if (link != 0) { +pop: + back = M2C_FIELD(arg0, s16 *, 0x9A); + M2C_FIELD(arg0, s32 *, 0x90) = link; + M2C_FIELD(arg0, s32 *, 0x9C) = 0; + M2C_FIELD(arg0, s16 *, 0x9A) = 0; + M2C_FIELD(arg0, s32 *, 0x94) = back; + func_8012AAAC(arg0); + break; + } + M2C_FIELD(arg0, s32 *, 0x94) = 0; + func_8012AAAC(arg0); + M2C_FIELD(arg0, u16 *, 0x72) = (u16) (M2C_FIELD(arg0, u16 *, 0x72) | 0x4000); + break; + case -4: + head = M2C_FIELD(ptr, s32 *, 0); + M2C_FIELD(arg0, s32 *, 0x94) = 0; + M2C_FIELD(arg0, s32 *, 0x9C) = 0; + M2C_FIELD(arg0, s16 *, 0x9A) = 0; + M2C_FIELD(arg0, s32 *, 0x90) = head; + M2C_FIELD(arg0, u16 *, 0x72) = (u16) (M2C_FIELD(arg0, u16 *, 0x72) & 0xF9FF); + func_8012AAAC(arg0); + break; + case -3: + cnt = M2C_FIELD(arg0, s32 *, 0x94) + 1; + M2C_FIELD(arg0, s32 *, 0x94) = cnt; + if (M2C_FIELD(arg0, s32 *, 0x9C) != 0) { + func_8012AAAC(arg0); + break; + } + saved = M2C_FIELD(arg0, s32 *, 0x90); + next = M2C_FIELD(ptr, s32 *, 0); + M2C_FIELD(arg0, s32 *, 0x94) = 0; + M2C_FIELD(arg0, s32 *, 0x9C) = 0; + M2C_FIELD(arg0, s16 *, 0x9A) = 0; + M2C_FIELD(arg0, s32 *, 0x90) = next; + M2C_FIELD(arg0, u16 *, 0x72) = (u16) (M2C_FIELD(arg0, u16 *, 0x72) & 0xF9FF); + func_8012AAAC(arg0); + M2C_FIELD(arg0, s32 *, 0x9C) = saved; + M2C_FIELD(arg0, s16 *, 0x9A) = (s16) cnt; + break; + case -50: + M2C_FIELD(arg0, s32 *, 0x94) = M2C_FIELD(arg0, s32 *, 0x94) + 1; + func_8012AAAC(arg0); + M2C_FIELD(arg0, u16 *, 0x72) = (u16) (M2C_FIELD(arg0, u16 *, 0x72) | 0x2000); + break; + case -5: + M2C_FIELD(arg0, u16 *, 0x72) = (u16) (M2C_FIELD(arg0, u16 *, 0x72) | 0x400); + M2C_FIELD(arg0, s32 *, 0x94) = M2C_FIELD(arg0, s32 *, 0x94) - 1; + func_8012AAAC(arg0); + break; + } + } else { + M2C_FIELD(M2C_FIELD(arg0, void **, 0x20), s32 *, 0x20) = M2C_FIELD(ptr, s32 *, 0); + M2C_FIELD(arg0, s16 *, 0x98) = M2C_FIELD(ptr, s16 *, 4); + } +} diff --git a/src/ov_SC03_107/ov_SC03_107.c b/src/ov_SC03_107/ov_SC03_107.c index fee379310..b13b1d514 100644 --- a/src/ov_SC03_107/ov_SC03_107.c +++ b/src/ov_SC03_107/ov_SC03_107.c @@ -911,7 +911,88 @@ DEFINE_func_8012A908() /* dedup: shared engine-core @0x8012a908 (src/shared) */ DEFINE_func_8012A988() /* dedup: shared engine-core @0x8012a988 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_107/nonmatchings/ov_SC03_107", func_8012AAAC); + +extern void func_8012AAAC(void *arg0); + +void func_8012AAAC(void *arg0) { + void *ptr; + s32 link; + s32 next; + s32 saved; + s32 cnt; + s32 back; + s32 head; + + M2C_FIELD(arg0, u16 *, 0x72) = (u16) (M2C_FIELD(arg0, u16 *, 0x72) & 0xBFFF); + ptr = (void *) (M2C_FIELD(arg0, s32 *, 0x90) + (M2C_FIELD(arg0, s32 *, 0x94) * 8)); + if (M2C_FIELD(ptr, s16 *, 4) < 0) { + switch (M2C_FIELD(ptr, s16 *, 4)) { + case -2: + link = M2C_FIELD(arg0, s32 *, 0x9C); + if (link == 0) { + M2C_FIELD(arg0, s16 *, 0x98) = 0; + break; + } + goto pop; + case -1: + link = M2C_FIELD(arg0, s32 *, 0x9C); + if (link != 0) { +pop: + back = M2C_FIELD(arg0, s16 *, 0x9A); + M2C_FIELD(arg0, s32 *, 0x90) = link; + M2C_FIELD(arg0, s32 *, 0x9C) = 0; + M2C_FIELD(arg0, s16 *, 0x9A) = 0; + M2C_FIELD(arg0, s32 *, 0x94) = back; + func_8012AAAC(arg0); + break; + } + M2C_FIELD(arg0, s32 *, 0x94) = 0; + func_8012AAAC(arg0); + M2C_FIELD(arg0, u16 *, 0x72) = (u16) (M2C_FIELD(arg0, u16 *, 0x72) | 0x4000); + break; + case -4: + head = M2C_FIELD(ptr, s32 *, 0); + M2C_FIELD(arg0, s32 *, 0x94) = 0; + M2C_FIELD(arg0, s32 *, 0x9C) = 0; + M2C_FIELD(arg0, s16 *, 0x9A) = 0; + M2C_FIELD(arg0, s32 *, 0x90) = head; + M2C_FIELD(arg0, u16 *, 0x72) = (u16) (M2C_FIELD(arg0, u16 *, 0x72) & 0xF9FF); + func_8012AAAC(arg0); + break; + case -3: + cnt = M2C_FIELD(arg0, s32 *, 0x94) + 1; + M2C_FIELD(arg0, s32 *, 0x94) = cnt; + if (M2C_FIELD(arg0, s32 *, 0x9C) != 0) { + func_8012AAAC(arg0); + break; + } + saved = M2C_FIELD(arg0, s32 *, 0x90); + next = M2C_FIELD(ptr, s32 *, 0); + M2C_FIELD(arg0, s32 *, 0x94) = 0; + M2C_FIELD(arg0, s32 *, 0x9C) = 0; + M2C_FIELD(arg0, s16 *, 0x9A) = 0; + M2C_FIELD(arg0, s32 *, 0x90) = next; + M2C_FIELD(arg0, u16 *, 0x72) = (u16) (M2C_FIELD(arg0, u16 *, 0x72) & 0xF9FF); + func_8012AAAC(arg0); + M2C_FIELD(arg0, s32 *, 0x9C) = saved; + M2C_FIELD(arg0, s16 *, 0x9A) = (s16) cnt; + break; + case -50: + M2C_FIELD(arg0, s32 *, 0x94) = M2C_FIELD(arg0, s32 *, 0x94) + 1; + func_8012AAAC(arg0); + M2C_FIELD(arg0, u16 *, 0x72) = (u16) (M2C_FIELD(arg0, u16 *, 0x72) | 0x2000); + break; + case -5: + M2C_FIELD(arg0, u16 *, 0x72) = (u16) (M2C_FIELD(arg0, u16 *, 0x72) | 0x400); + M2C_FIELD(arg0, s32 *, 0x94) = M2C_FIELD(arg0, s32 *, 0x94) - 1; + func_8012AAAC(arg0); + break; + } + } else { + M2C_FIELD(M2C_FIELD(arg0, void **, 0x20), s32 *, 0x20) = M2C_FIELD(ptr, s32 *, 0); + M2C_FIELD(arg0, s16 *, 0x98) = M2C_FIELD(ptr, s16 *, 4); + } +}