diff --git a/config/overlays.mk b/config/overlays.mk index 92c3a88f9..eeb198a37 100644 --- a/config/overlays.mk +++ b/config/overlays.mk @@ -21,7 +21,7 @@ ov_SC01_077_ELF := $(ov_SC01_077_OUT).elf ov_SC01_077_MAPFILE := $(ov_SC01_077_OUT).map ov_SC01_077_LD_SCRIPT := $(ov_SC01_077_OUT).ld ov_SC01_077_SPLAT_YAML := config/splat.ov_SC01_077.yaml -ov_SC01_077_JTBL_INTERLEAVE := --order tail.data.o,ov_SC01_077_jr_8012ACE0.o,tail2.data.o,ov_SC01_077_jr_801380E0.o,tail3.data.o,ov_SC01_077.o,tail4.data.o,ov_SC01_077_jr_8015444C.o,tail5.data.o,ov_SC01_077_jr_80159C84.o,tail6.data.o,ov_SC01_077_jr_8015A3C8.o,tail7.data.o,ov_SC01_077_jr_8015AE2C.o,tail8.data.o,ov_SC01_077_jr_8016AB6C.o,tail9.data.o,ov_SC01_077_jr_801734BC.o,tail10.data.o,ov_SC01_077_jr_80178D40.o,tail11.data.o,ov_SC01_077_jr_8017A4AC.o,tail12.data.o,ov_SC01_077_jr_80182268.o,tail13.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC01_077_JTBL_INTERLEAVE := --order tail.data.o,ov_SC01_077_jr_8012ACE0.o,tail2.data.o,ov_SC01_077_jr_801380E0.o,tail3.data.o,ov_SC01_077_o0.o,tail4.data.o,ov_SC01_077.o,tail5.data.o,ov_SC01_077_jr_8015444C.o,tail6.data.o,ov_SC01_077_jr_80159C84.o,tail7.data.o,ov_SC01_077_jr_8015A3C8.o,tail8.data.o,ov_SC01_077_jr_8015AE2C.o,tail9.data.o,ov_SC01_077_jr_8016AB6C.o,tail10.data.o,ov_SC01_077_jr_801734BC.o,tail11.data.o,ov_SC01_077_jr_80178D40.o,tail12.data.o,ov_SC01_077_jr_8017A4AC.o,tail13.data.o,ov_SC01_077_jr_80182268.o,tail14.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve build/src/ov_SC01_077/ov_SC01_077.o: JTBL_PADS := 0,0,4,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20,+0x38,+0x58 build/src/ov_SC01_077/ov_SC01_077_jr_8012ACE0.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0xcc build/src/ov_SC01_077/ov_SC01_077_jr_80159C84.o: JTBL_PADS := 0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20 diff --git a/config/splat.ov_SC01_077.yaml b/config/splat.ov_SC01_077.yaml index ea69178aa..e6c882d9a 100644 --- a/config/splat.ov_SC01_077.yaml +++ b/config/splat.ov_SC01_077.yaml @@ -92,26 +92,28 @@ segments: - [0xb0000, data, tail2] - [0xb0098, .rodata, ov_SC01_077_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xb00fc, data, tail3] + - [0xb0214, .rodata, ov_SC01_077_o0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0xb0280, data, tail4] - [0xb0708, .rodata, ov_SC01_077] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xb0774, data, tail4] + - [0xb0774, data, tail5] - [0xb07dc, .rodata, ov_SC01_077_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xb0848, data, tail5] + - [0xb0848, data, tail6] - [0xb09a4, .rodata, ov_SC01_077_jr_80159C84] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xb09d8, data, tail6] + - [0xb09d8, data, tail7] - [0xb09dc, .rodata, ov_SC01_077_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xb09f8, data, tail7] + - [0xb09f8, data, tail8] - [0xb09fc, .rodata, ov_SC01_077_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xb0a18, data, tail8] + - [0xb0a18, data, tail9] - [0xb0a70, .rodata, ov_SC01_077_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xb0a90, data, tail9] + - [0xb0a90, data, tail10] - [0xb0b10, .rodata, ov_SC01_077_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xb0b24, data, tail10] + - [0xb0b24, data, tail11] - [0xb0ccc, .rodata, ov_SC01_077_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xb0e44, data, tail11] + - [0xb0e44, data, tail12] - [0xb0ed4, .rodata, ov_SC01_077_jr_8017A4AC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xb0f60, data, tail12] + - [0xb0f60, data, tail13] - [0xb1148, .rodata, ov_SC01_077_jr_80182268] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xb1168, data, tail13] + - [0xb1168, data, tail14] - [0xB29D4, bin, trailing] # final 3 bytes (EOF 0xB29D7 not word-aligned; spimdisasm drops # a trailing partial word and a <4-byte `data` carve emits nothing, # so use `bin` = raw .incbin, byte-exact). Word-aligned overlays omit this. diff --git a/src/ov_SC01_077/ov_SC01_077_o0.c b/src/ov_SC01_077/ov_SC01_077_o0.c index 5223d13f4..e77d89f59 100644 --- a/src/ov_SC01_077/ov_SC01_077_o0.c +++ b/src/ov_SC01_077/ov_SC01_077_o0.c @@ -84,7 +84,93 @@ void func_8013C360(s32 a0) { } } -INCLUDE_ASM("asm/ov_SC01_077/nonmatchings/ov_SC01_077_o0", func_8013C414); +// @class: struct +// @stuck: none — MATCH +#include "common.h" + +typedef struct { + u8 b0; + u8 b1; + u8 b2; + u8 type; + u32 w1; + u32 w2; +} T3Reloc; /* 0xC */ + +void func_8013C414(s32 param_1, s32 param_2) +{ + s32 base10; /* 0x00 */ + s32 p; /* 0x04 */ + s32 q; /* 0x08 */ + s32 base4008; /* 0x0C */ + s32 lo; /* 0x10 */ + u32 i; /* 0x14 */ + s32 unused; /* 0x18 */ + s32 base8; /* 0x1C */ + T3Reloc *r; /* 0x20 */ + T3Reloc *s; /* 0x24 */ + + if (*(s32 *)(param_2 + 4) == 0) { + base10 = param_2 + 0x10; + base4008 = param_1 + 0x4008; + lo = *(s32 *)(param_2 + 0xC) + base10; + base8 = param_1 + 8; + p = base10; + for (i = 0; i < *(u32 *)(param_2 + 8); i++) { + *(s32 *)p = *(s32 *)p + base8; + if (*(s32 *)(p + 4) != 0) { + *(s32 *)(p + 4) = *(s32 *)(p + 4) + base10; + q = *(s32 *)(p + 4); + *(s32 *)q = *(s32 *)q + q; + *(s32 *)(q + 0x14) = *(s32 *)(q + 0x14) + q; + r = (T3Reloc *)*(s32 *)(q + 0x14); + *(s32 *)(q + 0x18) = *(s32 *)(q + 0x18) * 0xC + *(s32 *)(q + 0x14); + s = (T3Reloc *)*(s32 *)(q + 0x18); + while (r < s) { + switch (r->type) { + case 0x24: + case 0x2C: + case 0x34: + case 0x3C: + if ((*(u32 *)r) & 0x800000) { + (*(u32 *)r) = ((*(u32 *)r) & 0x7FFFFF) + lo; + } else { + (*(u32 *)r) = ((*(u32 *)r) & 0xFFFFFF) + base4008; + } + break; + case 0x26: + case 0x2E: + case 0x36: + case 0x3E: + if ((*(u32 *)r) & 0x800000) { + (*(u32 *)r) = ((*(u32 *)r) & 0x7FFFFF) + lo; + } else { + (*(u32 *)r) = ((*(u32 *)r) & 0xFFFFFF) + base4008; + } + break; + } + r++; + } + } + p = p + 0xC; + } + *(s32 *)(param_2 + 4) = 1; + p = param_2 + 0x10; + for (i = 0; i < *(u32 *)(param_2 + 8); i++) { + if (*(s32 *)(p + 8) == 0) { + *(s32 *)(p + 8) = *(s32 *)(*(s32 *)p); + } + p = p + 0xC; + } + } else { + p = param_2 + 0x10; + for (i = 0; i < *(u32 *)(param_2 + 8); i++) { + *(s32 *)(*(s32 *)p) = *(s32 *)(p + 8); + p = p + 0xC; + } + } +} + void func_8013C938(void) { D_801DAAC0 = 1;