diff --git a/config/overlays.mk b/config/overlays.mk index 7b202eaa7..724cd63e4 100644 --- a/config/overlays.mk +++ b/config/overlays.mk @@ -4916,7 +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,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,+0x18,+0x190 +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_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 @@ -4962,7 +4962,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,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,+0x18,+0x190 +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_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 diff --git a/config/splat.ov_MAIN_012.yaml b/config/splat.ov_MAIN_012.yaml index 6c70f1f4f..8e8233526 100644 --- a/config/splat.ov_MAIN_012.yaml +++ b/config/splat.ov_MAIN_012.yaml @@ -96,7 +96,7 @@ segments: - [0x0, c, ov_MAIN_012] # code: starts at file 0x0 (overlays open with a prologue) - [0x561e0, data, tail] - [0x5ba40, .rodata, ov_MAIN_012] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x5bc5c, data, tail2] + - [0x5bcec, data, tail2] - [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 diff --git a/config/splat.ov_SC03_107.yaml b/config/splat.ov_SC03_107.yaml index 102f89b3a..373f1fe53 100644 --- a/config/splat.ov_SC03_107.yaml +++ b/config/splat.ov_SC03_107.yaml @@ -96,7 +96,7 @@ segments: - [0x0, c, ov_SC03_107] # code: starts at file 0x0 (overlays open with a prologue) - [0x5a304, data, tail] - [0x72258, .rodata, ov_SC03_107] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x72474, data, tail2] + - [0x72504, data, tail2] - [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 diff --git a/src/ov_MAIN_012/ov_MAIN_012.c b/src/ov_MAIN_012/ov_MAIN_012.c index 9452a35f0..e94f2b559 100644 --- a/src/ov_MAIN_012/ov_MAIN_012.c +++ b/src/ov_MAIN_012/ov_MAIN_012.c @@ -24847,7 +24847,182 @@ int func_8017A3D8(void) } -INCLUDE_ASM("asm/ov_MAIN_012/nonmatchings/ov_MAIN_012", func_8017A4AC); + +// func_8017A4AC (ov_SC01_077) — 536-ins command/bytecode interpreter, 35-case jtbl switch. + + + extern s16 D_80185340; + extern s32 D_80185388; + + +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 s32 D_80126B58; + extern s16 D_80185348; + extern s32 D_80185364; + extern s32 D_8018538C; + u16 sp18[4]; + u16 sp20[4]; + u16 sp28[4]; + u16 sp30[4]; + struct S126B58 *w = &(*(struct S126B58 *)&D_80126B58); + s16 cmd; + + if (D_80185340 == D_80185344) { + if (func_80174754() != 0) { + D_80185348 = 0; + } else { + D_80185348 = 1; + } + return; + } + D_80185348 = 1; + if (func_80174754() == 0) { + return; + } + cmd = D_80184F40[D_80185340]; + D_80185340 = (D_80185340 + 1) & 0x1FF; + switch (cmd) { + case 0: + func_80172738(); + return; + case 1: + sp18[0] = D_80184F40[D_80185340]; D_80185340 = (D_80185340 + 1) & 0x1FF; + sp18[1] = D_80184F40[D_80185340]; D_80185340 = (D_80185340 + 1) & 0x1FF; + sp18[2] = D_80184F40[D_80185340]; D_80185340 = (D_80185340 + 1) & 0x1FF; + ((void (*)(u16 *))func_80172780)(sp18); + return; + case 28: + sp18[0] = D_80184F40[D_80185340]; D_80185340 = (D_80185340 + 1) & 0x1FF; + sp18[1] = D_80184F40[D_80185340]; D_80185340 = (D_80185340 + 1) & 0x1FF; + sp18[2] = D_80184F40[D_80185340]; D_80185340 = (D_80185340 + 1) & 0x1FF; + sp18[3] = D_80184F40[D_80185340]; D_80185340 = (D_80185340 + 1) & 0x1FF; + ((void (*)(u16 *))func_80172894)(sp18); + return; + case 2: + { s16 arg = D_80184F40[D_80185340]; D_80185340 = (D_80185340 + 1) & 0x1FF; + ((void (*)(s16))func_801729B0)(arg); + return; } + case 3: + { s16 arg = D_80184F40[D_80185340]; D_80185340 = (D_80185340 + 1) & 0x1FF; + func_80172B14(arg); + return; } + case 4: + { s16 arg = D_80184F40[D_80185340]; D_80185340 = (D_80185340 + 1) & 0x1FF; + { s32 t = w->unk20->unk12 + arg; + func_80172B14(t & 0xFFF); } + return; } + case 5: + sp18[0] = D_80184F40[D_80185340]; D_80185340 = (D_80185340 + 1) & 0x1FF; + sp18[1] = D_80184F40[D_80185340]; D_80185340 = (D_80185340 + 1) & 0x1FF; + sp18[2] = D_80184F40[D_80185340]; D_80185340 = (D_80185340 + 1) & 0x1FF; + ((void (*)(u16 *))func_80172C50)(sp18); + return; + case 6: + { s16 arg = D_80184F40[D_80185340]; D_80185340 = (D_80185340 + 1) & 0x1FF; + ((void (*)(s16))func_80172D68)(arg); + return; } + case 7: func_80172E94(); return; + case 8: func_80172ED4(); return; + case 27: ((void (*)())D_8018538C)(); 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_80184F40[D_80185340]; D_80185340 = (D_80185340 + 1) & 0x1FF; + func_801738DC(arg); + return; } + case 19: { + s16 a, b; + s32 ea, eb; + a = D_80184F40[D_80185340]; D_80185340 = (D_80185340 + 1) & 0x1FF; ea = a; + b = D_80184F40[D_80185340]; D_80185340 = (D_80185340 + 1) & 0x1FF; eb = b; + func_801736B0(ea, eb); + return; + } + case 20: + { s16 arg = D_80184F40[D_80185340]; D_80185340 = (D_80185340 + 1) & 0x1FF; + ((void (*)(s16))func_801734BC)(arg); + return; } + case 23: + sp20[0] = D_80184F40[D_80185340]; D_80185340 = (D_80185340 + 1) & 0x1FF; + sp20[1] = D_80184F40[D_80185340]; D_80185340 = (D_80185340 + 1) & 0x1FF; + sp20[2] = D_80184F40[D_80185340]; D_80185340 = (D_80185340 + 1) & 0x1FF; + { s16 arg = D_80184F40[D_80185340]; D_80185340 = (D_80185340 + 1) & 0x1FF; + ((void (*)(s16, u16 *))func_80173460)(arg, sp20); + return; } + case 29: + sp28[0] = D_80184F40[D_80185340]; D_80185340 = (D_80185340 + 1) & 0x1FF; + sp28[1] = D_80184F40[D_80185340]; D_80185340 = (D_80185340 + 1) & 0x1FF; + sp28[2] = D_80184F40[D_80185340]; D_80185340 = (D_80185340 + 1) & 0x1FF; + { s16 arg = D_80184F40[D_80185340]; D_80185340 = (D_80185340 + 1) & 0x1FF; + ((void (*)(s16, u16 *))func_801733FC)(arg, sp28); + return; } + case 32: + sp30[0] = D_80184F40[D_80185340]; D_80185340 = (D_80185340 + 1) & 0x1FF; + sp30[1] = D_80184F40[D_80185340]; D_80185340 = (D_80185340 + 1) & 0x1FF; + sp30[2] = D_80184F40[D_80185340]; D_80185340 = (D_80185340 + 1) & 0x1FF; + sp30[3] = D_80184F40[D_80185340]; D_80185340 = (D_80185340 + 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_80185388); return; + case 21: + ((void (*)(s32, s32, s32, s32, void *, s32))func_80173A28)((*(struct S734 * *)&D_80185364)->unk0, (*(struct S734 * *)&D_80185364)->unk4, (*(struct S734 * *)&D_80185364)->unk8, + (*(struct S734 * *)&D_80185364)->unkC, (*(struct S734 * *)&D_80185364)->unk10, (*(struct S734 * *)&D_80185364)->unk18); + return; + case 22: + (*(struct S734 * *)&D_80185364)->unk1C((*(struct S734 * *)&D_80185364)->unk4, (*(struct S734 * *)&D_80185364)->unk10, (*(struct S734 * *)&D_80185364)->unk18); + return; + case 31: + { s16 arg = D_80184F40[D_80185340]; D_80185340 = (D_80185340 + 1) & 0x1FF; + func_801737B8(arg); + return; } + } +} DEFINE_func_8017AD0C() /* dedup: shared engine-core @0x8017ad0c (src/shared) */ diff --git a/src/ov_SC03_107/ov_SC03_107.c b/src/ov_SC03_107/ov_SC03_107.c index ec88b5ce0..abf4ee017 100644 --- a/src/ov_SC03_107/ov_SC03_107.c +++ b/src/ov_SC03_107/ov_SC03_107.c @@ -24862,7 +24862,182 @@ int func_8017A3D8(void) } -INCLUDE_ASM("asm/ov_SC03_107/nonmatchings/ov_SC03_107", func_8017A4AC); + +// func_8017A4AC (ov_SC01_077) — 536-ins command/bytecode interpreter, 35-case jtbl switch. + + + extern s16 D_8019B998; + extern s32 D_8019B9E0; + + +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 s32 D_80126B58; + extern s16 D_8019B9A0; + extern s32 D_8019B9BC; + extern s32 D_8019B9E4; + u16 sp18[4]; + u16 sp20[4]; + u16 sp28[4]; + u16 sp30[4]; + struct S126B58 *w = &(*(struct S126B58 *)&D_80126B58); + s16 cmd; + + if (D_8019B998 == D_8019B99C) { + if (func_80174754() != 0) { + D_8019B9A0 = 0; + } else { + D_8019B9A0 = 1; + } + return; + } + D_8019B9A0 = 1; + if (func_80174754() == 0) { + return; + } + cmd = D_8019B598[D_8019B998]; + D_8019B998 = (D_8019B998 + 1) & 0x1FF; + switch (cmd) { + case 0: + func_80172738(); + return; + case 1: + sp18[0] = D_8019B598[D_8019B998]; D_8019B998 = (D_8019B998 + 1) & 0x1FF; + sp18[1] = D_8019B598[D_8019B998]; D_8019B998 = (D_8019B998 + 1) & 0x1FF; + sp18[2] = D_8019B598[D_8019B998]; D_8019B998 = (D_8019B998 + 1) & 0x1FF; + ((void (*)(u16 *))func_80172780)(sp18); + return; + case 28: + sp18[0] = D_8019B598[D_8019B998]; D_8019B998 = (D_8019B998 + 1) & 0x1FF; + sp18[1] = D_8019B598[D_8019B998]; D_8019B998 = (D_8019B998 + 1) & 0x1FF; + sp18[2] = D_8019B598[D_8019B998]; D_8019B998 = (D_8019B998 + 1) & 0x1FF; + sp18[3] = D_8019B598[D_8019B998]; D_8019B998 = (D_8019B998 + 1) & 0x1FF; + ((void (*)(u16 *))func_80172894)(sp18); + return; + case 2: + { s16 arg = D_8019B598[D_8019B998]; D_8019B998 = (D_8019B998 + 1) & 0x1FF; + ((void (*)(s16))func_801729B0)(arg); + return; } + case 3: + { s16 arg = D_8019B598[D_8019B998]; D_8019B998 = (D_8019B998 + 1) & 0x1FF; + func_80172B14(arg); + return; } + case 4: + { s16 arg = D_8019B598[D_8019B998]; D_8019B998 = (D_8019B998 + 1) & 0x1FF; + { s32 t = w->unk20->unk12 + arg; + func_80172B14(t & 0xFFF); } + return; } + case 5: + sp18[0] = D_8019B598[D_8019B998]; D_8019B998 = (D_8019B998 + 1) & 0x1FF; + sp18[1] = D_8019B598[D_8019B998]; D_8019B998 = (D_8019B998 + 1) & 0x1FF; + sp18[2] = D_8019B598[D_8019B998]; D_8019B998 = (D_8019B998 + 1) & 0x1FF; + ((void (*)(u16 *))func_80172C50)(sp18); + return; + case 6: + { s16 arg = D_8019B598[D_8019B998]; D_8019B998 = (D_8019B998 + 1) & 0x1FF; + ((void (*)(s16))func_80172D68)(arg); + return; } + case 7: func_80172E94(); return; + case 8: func_80172ED4(); return; + case 27: ((void (*)())D_8019B9E4)(); 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_8019B598[D_8019B998]; D_8019B998 = (D_8019B998 + 1) & 0x1FF; + func_801738DC(arg); + return; } + case 19: { + s16 a, b; + s32 ea, eb; + a = D_8019B598[D_8019B998]; D_8019B998 = (D_8019B998 + 1) & 0x1FF; ea = a; + b = D_8019B598[D_8019B998]; D_8019B998 = (D_8019B998 + 1) & 0x1FF; eb = b; + func_801736B0(ea, eb); + return; + } + case 20: + { s16 arg = D_8019B598[D_8019B998]; D_8019B998 = (D_8019B998 + 1) & 0x1FF; + ((void (*)(s16))func_801734BC)(arg); + return; } + case 23: + sp20[0] = D_8019B598[D_8019B998]; D_8019B998 = (D_8019B998 + 1) & 0x1FF; + sp20[1] = D_8019B598[D_8019B998]; D_8019B998 = (D_8019B998 + 1) & 0x1FF; + sp20[2] = D_8019B598[D_8019B998]; D_8019B998 = (D_8019B998 + 1) & 0x1FF; + { s16 arg = D_8019B598[D_8019B998]; D_8019B998 = (D_8019B998 + 1) & 0x1FF; + ((void (*)(s16, u16 *))func_80173460)(arg, sp20); + return; } + case 29: + sp28[0] = D_8019B598[D_8019B998]; D_8019B998 = (D_8019B998 + 1) & 0x1FF; + sp28[1] = D_8019B598[D_8019B998]; D_8019B998 = (D_8019B998 + 1) & 0x1FF; + sp28[2] = D_8019B598[D_8019B998]; D_8019B998 = (D_8019B998 + 1) & 0x1FF; + { s16 arg = D_8019B598[D_8019B998]; D_8019B998 = (D_8019B998 + 1) & 0x1FF; + ((void (*)(s16, u16 *))func_801733FC)(arg, sp28); + return; } + case 32: + sp30[0] = D_8019B598[D_8019B998]; D_8019B998 = (D_8019B998 + 1) & 0x1FF; + sp30[1] = D_8019B598[D_8019B998]; D_8019B998 = (D_8019B998 + 1) & 0x1FF; + sp30[2] = D_8019B598[D_8019B998]; D_8019B998 = (D_8019B998 + 1) & 0x1FF; + sp30[3] = D_8019B598[D_8019B998]; D_8019B998 = (D_8019B998 + 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_8019B9E0); return; + case 21: + ((void (*)(s32, s32, s32, s32, void *, s32))func_80173A28)((*(struct S734 * *)&D_8019B9BC)->unk0, (*(struct S734 * *)&D_8019B9BC)->unk4, (*(struct S734 * *)&D_8019B9BC)->unk8, + (*(struct S734 * *)&D_8019B9BC)->unkC, (*(struct S734 * *)&D_8019B9BC)->unk10, (*(struct S734 * *)&D_8019B9BC)->unk18); + return; + case 22: + (*(struct S734 * *)&D_8019B9BC)->unk1C((*(struct S734 * *)&D_8019B9BC)->unk4, (*(struct S734 * *)&D_8019B9BC)->unk10, (*(struct S734 * *)&D_8019B9BC)->unk18); + return; + case 31: + { s16 arg = D_8019B598[D_8019B998]; D_8019B998 = (D_8019B998 + 1) & 0x1FF; + func_801737B8(arg); + return; } + } +} DEFINE_func_8017AD0C() /* dedup: shared engine-core @0x8017ad0c (src/shared) */