diff --git a/config/overlays.mk b/config/overlays.mk index b07339d15..7e8a9c56c 100644 --- a/config/overlays.mk +++ b/config/overlays.mk @@ -4957,7 +4957,7 @@ build/src/ov_SC02_037/ov_SC02_037_jr_801594E8.o: JTBL_PADS := 0,0 # §8e pads ( 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_80171B4C.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20 -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 +build/src/ov_SC02_037/ov_SC02_037_jr_801789AC.o: JTBL_PADS := 0,0,0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x18,+0x190,+0x220 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 diff --git a/config/splat.ov_SC02_037.yaml b/config/splat.ov_SC02_037.yaml index 39fcaf86f..b4f7582f3 100644 --- a/config/splat.ov_SC02_037.yaml +++ b/config/splat.ov_SC02_037.yaml @@ -133,7 +133,7 @@ segments: - [0x9fd60, .rodata, ov_SC02_037_jr_80171B4C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x9fd94, data, tail11] - [0x9ff24, .rodata, ov_SC02_037_jr_801789AC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa0140, data, tail12] + - [0xa01d0, data, tail12] - [0xa01d4, .rodata, ov_SC02_037_jr_8017AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xa0238, data, tail13] - [0xA198C, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) diff --git a/src/ov_SC02_037/ov_SC02_037_jr_801789AC.c b/src/ov_SC02_037/ov_SC02_037_jr_801789AC.c index 76c84d763..61a3f575e 100644 --- a/src/ov_SC02_037/ov_SC02_037_jr_801789AC.c +++ b/src/ov_SC02_037/ov_SC02_037_jr_801789AC.c @@ -4834,7 +4834,181 @@ int func_8017A3D8(void) } -INCLUDE_ASM("asm/ov_SC02_037/nonmatchings/ov_SC02_037_jr_801789AC", func_8017A4AC); + +// func_8017A4AC (ov_SC01_077) — 536-ins command/bytecode interpreter, 35-case jtbl switch. + + + extern s16 D_801C9638; + extern s32 D_801C9680; + + +extern void func_80172310(u8*); +extern void func_80172738(void); +extern void func_80172780(void*); +extern void func_80172894(void*); +extern void func_801729B0(s32); +extern void func_80172B14(s16); +extern void func_80172C50(void*); +extern void func_80172D68(s32); +extern void func_80172E94(void); +extern void func_80172ED4(void); +extern void func_80172EFC(void); +extern void func_80172F24(void); +extern void func_80172F4C(void); +extern void func_80172F9C(void); +extern void func_80172FEC(void); +extern void func_80173174(void); +extern void func_8017329C(void); +extern void func_8017334C(void); +extern void func_801733A4(void); +extern void func_801733FC(s32, s32); +extern void func_80173460(s32, s32); +extern void func_801734BC(s32, s32); +extern void func_801736B0(s32, s32); +extern void func_801737B8(s16); +extern void func_801738DC(s16); +extern void func_80173A28(s32, s32, s32, s32, s32, s32); +extern void func_8017427C(void); +extern void func_80174438(s32); +extern void func_8017452C(void); +extern void func_80174584(void); +extern void func_801745DC(void); +extern s32 func_80174754(void); + +void func_8017A4AC(void) { + + extern s16 D_801C9640; + extern s32 D_801C965C; + extern s32 D_801C9684; + u16 sp18[4]; + u16 sp20[4]; + u16 sp28[4]; + u16 sp30[4]; + struct S126B58 *w = &(*(struct S126B58 *)&D_80126B58); + s16 cmd; + + if (D_801C9638 == D_801C963C) { + if (func_80174754() != 0) { + D_801C9640 = 0; + } else { + D_801C9640 = 1; + } + return; + } + D_801C9640 = 1; + if (func_80174754() == 0) { + return; + } + cmd = D_801C9238[D_801C9638]; + D_801C9638 = (D_801C9638 + 1) & 0x1FF; + switch (cmd) { + case 0: + func_80172738(); + return; + case 1: + sp18[0] = D_801C9238[D_801C9638]; D_801C9638 = (D_801C9638 + 1) & 0x1FF; + sp18[1] = D_801C9238[D_801C9638]; D_801C9638 = (D_801C9638 + 1) & 0x1FF; + sp18[2] = D_801C9238[D_801C9638]; D_801C9638 = (D_801C9638 + 1) & 0x1FF; + ((void (*)(u16 *))func_80172780)(sp18); + return; + case 28: + sp18[0] = D_801C9238[D_801C9638]; D_801C9638 = (D_801C9638 + 1) & 0x1FF; + sp18[1] = D_801C9238[D_801C9638]; D_801C9638 = (D_801C9638 + 1) & 0x1FF; + sp18[2] = D_801C9238[D_801C9638]; D_801C9638 = (D_801C9638 + 1) & 0x1FF; + sp18[3] = D_801C9238[D_801C9638]; D_801C9638 = (D_801C9638 + 1) & 0x1FF; + ((void (*)(u16 *))func_80172894)(sp18); + return; + case 2: + { s16 arg = D_801C9238[D_801C9638]; D_801C9638 = (D_801C9638 + 1) & 0x1FF; + ((void (*)(s16))func_801729B0)(arg); + return; } + case 3: + { s16 arg = D_801C9238[D_801C9638]; D_801C9638 = (D_801C9638 + 1) & 0x1FF; + func_80172B14(arg); + return; } + case 4: + { s16 arg = D_801C9238[D_801C9638]; D_801C9638 = (D_801C9638 + 1) & 0x1FF; + { s32 t = w->unk20->unk12 + arg; + func_80172B14(t & 0xFFF); } + return; } + case 5: + sp18[0] = D_801C9238[D_801C9638]; D_801C9638 = (D_801C9638 + 1) & 0x1FF; + sp18[1] = D_801C9238[D_801C9638]; D_801C9638 = (D_801C9638 + 1) & 0x1FF; + sp18[2] = D_801C9238[D_801C9638]; D_801C9638 = (D_801C9638 + 1) & 0x1FF; + ((void (*)(u16 *))func_80172C50)(sp18); + return; + case 6: + { s16 arg = D_801C9238[D_801C9638]; D_801C9638 = (D_801C9638 + 1) & 0x1FF; + ((void (*)(s16))func_80172D68)(arg); + return; } + case 7: func_80172E94(); return; + case 8: func_80172ED4(); return; + case 27: ((void (*)())D_801C9684)(); return; + case 9: func_80172EFC(); return; + case 10: func_80172F24(); return; + case 11: func_80173174(); return; + case 12: func_80172F4C(); return; + case 33: func_80172F9C(); return; + case 34: func_80172FEC(); return; + case 13: func_801745DC(); return; + case 14: + case 15: func_8017329C(); return; + case 16: func_8017334C(); return; + case 17: func_801733A4(); return; + case 18: + { s16 arg = D_801C9238[D_801C9638]; D_801C9638 = (D_801C9638 + 1) & 0x1FF; + func_801738DC(arg); + return; } + case 19: { + s16 a, b; + s32 ea, eb; + a = D_801C9238[D_801C9638]; D_801C9638 = (D_801C9638 + 1) & 0x1FF; ea = a; + b = D_801C9238[D_801C9638]; D_801C9638 = (D_801C9638 + 1) & 0x1FF; eb = b; + func_801736B0(ea, eb); + return; + } + case 20: + { s16 arg = D_801C9238[D_801C9638]; D_801C9638 = (D_801C9638 + 1) & 0x1FF; + ((void (*)(s16))func_801734BC)(arg); + return; } + case 23: + sp20[0] = D_801C9238[D_801C9638]; D_801C9638 = (D_801C9638 + 1) & 0x1FF; + sp20[1] = D_801C9238[D_801C9638]; D_801C9638 = (D_801C9638 + 1) & 0x1FF; + sp20[2] = D_801C9238[D_801C9638]; D_801C9638 = (D_801C9638 + 1) & 0x1FF; + { s16 arg = D_801C9238[D_801C9638]; D_801C9638 = (D_801C9638 + 1) & 0x1FF; + ((void (*)(s16, u16 *))func_80173460)(arg, sp20); + return; } + case 29: + sp28[0] = D_801C9238[D_801C9638]; D_801C9638 = (D_801C9638 + 1) & 0x1FF; + sp28[1] = D_801C9238[D_801C9638]; D_801C9638 = (D_801C9638 + 1) & 0x1FF; + sp28[2] = D_801C9238[D_801C9638]; D_801C9638 = (D_801C9638 + 1) & 0x1FF; + { s16 arg = D_801C9238[D_801C9638]; D_801C9638 = (D_801C9638 + 1) & 0x1FF; + ((void (*)(s16, u16 *))func_801733FC)(arg, sp28); + return; } + case 32: + sp30[0] = D_801C9238[D_801C9638]; D_801C9638 = (D_801C9638 + 1) & 0x1FF; + sp30[1] = D_801C9238[D_801C9638]; D_801C9638 = (D_801C9638 + 1) & 0x1FF; + sp30[2] = D_801C9238[D_801C9638]; D_801C9638 = (D_801C9638 + 1) & 0x1FF; + sp30[3] = D_801C9238[D_801C9638]; D_801C9638 = (D_801C9638 + 1) & 0x1FF; + ((void (*)(u16 *))func_80172310)(sp30); + return; + case 25: func_8017452C(); return; + case 30: func_80174584(); return; + case 26: func_8017427C(); return; + case 24: func_80174438(D_801C9680); return; + case 21: + ((void (*)(s32, s32, s32, s32, void *, s32))func_80173A28)((*(struct S734 * *)&D_801C965C)->unk0, (*(struct S734 * *)&D_801C965C)->unk4, (*(struct S734 * *)&D_801C965C)->unk8, + (*(struct S734 * *)&D_801C965C)->unkC, (*(struct S734 * *)&D_801C965C)->unk10, (*(struct S734 * *)&D_801C965C)->unk18); + return; + case 22: + (*(struct S734 * *)&D_801C965C)->unk1C((*(struct S734 * *)&D_801C965C)->unk4, (*(struct S734 * *)&D_801C965C)->unk10, (*(struct S734 * *)&D_801C965C)->unk18); + return; + case 31: + { s16 arg = D_801C9238[D_801C9638]; D_801C9638 = (D_801C9638 + 1) & 0x1FF; + func_801737B8(arg); + return; } + } +} DEFINE_func_8017AD0C() /* dedup: shared engine-core @0x8017ad0c (src/shared) */