diff --git a/config/overlays.mk b/config/overlays.mk index 5972437d7..d3add59d8 100644 --- a/config/overlays.mk +++ b/config/overlays.mk @@ -4964,7 +4964,7 @@ 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,ov_MAIN_012_jr_80131340.o,tail2.data.o,ov_MAIN_012_jr_80135A4C.o,tail3.data.o,ov_MAIN_012_jr_80135EB0.o,tail4.data.o,ov_MAIN_012_jr_801380E0.o,tail5.data.o,ov_MAIN_012_jr_8013F350.o,tail6.data.o,ov_MAIN_012_jr_801549F8.o,ov_MAIN_012_jr_801555F4.o,tail7.data.o,ov_MAIN_012_jr_801594E8.o,ov_MAIN_012_jr_80159C84.o,tail8.data.o,ov_MAIN_012_jr_8015A3C8.o,tail9.data.o,ov_MAIN_012_jr_8016AE5C.o,tail10.data.o,ov_MAIN_012_jr_80171B4C.o,tail11.data.o,ov_MAIN_012_jr_801789AC.o,tail12.data.o,ov_MAIN_012_jr_8017C3BC.o,tail13.data.o,ov_MAIN_012_jr_8017CA18.o,tail14.data.o,ov_MAIN_012_jr_8017CF3C.o,tail15.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_MAIN_012_JTBL_INTERLEAVE := --order tail.data.o,ov_MAIN_012.o,ov_MAIN_012_jr_80131340.o,tail2.data.o,ov_MAIN_012_jr_80135A4C.o,tail3.data.o,ov_MAIN_012_jr_80135EB0.o,tail4.data.o,ov_MAIN_012_jr_801380E0.o,ov_MAIN_012_o0c.o,tail5.data.o,ov_MAIN_012_jr_8013F350.o,tail6.data.o,ov_MAIN_012_jr_801549F8.o,ov_MAIN_012_jr_801555F4.o,tail7.data.o,ov_MAIN_012_jr_801594E8.o,ov_MAIN_012_jr_80159C84.o,tail8.data.o,ov_MAIN_012_jr_8015A3C8.o,tail9.data.o,ov_MAIN_012_jr_8016AE5C.o,tail10.data.o,ov_MAIN_012_jr_80171B4C.o,tail11.data.o,ov_MAIN_012_jr_801789AC.o,tail12.data.o,ov_MAIN_012_jr_8017C3BC.o,tail13.data.o,ov_MAIN_012_jr_8017CA18.o,tail14.data.o,ov_MAIN_012_jr_8017CF3C.o,tail15.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,+0x14,+0xdc build/src/ov_MAIN_012/ov_MAIN_012_jr_80131340.o: JTBL_PADS := 0,0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x14,+0x2c build/src/ov_MAIN_012/ov_MAIN_012_jr_80135A4C.o: JTBL_PADS := 0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x18 @@ -4977,6 +4977,7 @@ build/src/ov_MAIN_012/ov_MAIN_012_jr_80171B4C.o: JTBL_PADS := 0,0 # §8e pads ( build/src/ov_MAIN_012/ov_MAIN_012_jr_801789AC.o: JTBL_PADS := 0,0,0,4,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x18,+0x190,+0x220,+0x2b0 build/src/ov_MAIN_012/ov_MAIN_012_jr_8017C3BC.o: JTBL_PADS := 0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x38 build/src/ov_MAIN_012/ov_MAIN_012_jr_8017CF3C.o: JTBL_PADS := 0,4,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x28,+0x50 +build/src/ov_MAIN_012/ov_MAIN_012_o0c.o: JTBL_PADS := 0,4,4,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x38,+0xa8,+0x118 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 @@ -4998,7 +4999,7 @@ ov_SC02_037_ELF := $(ov_SC02_037_OUT).elf 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,ov_SC02_037_jr_80131340.o,tail2.data.o,ov_SC02_037_jr_80135A4C.o,tail3.data.o,ov_SC02_037_jr_80135EB0.o,tail4.data.o,ov_SC02_037_jr_801380E0.o,tail5.data.o,ov_SC02_037_o0c.o,tail6.data.o,ov_SC02_037_jr_8013F350.o,tail7.data.o,ov_SC02_037_jr_801549F8.o,ov_SC02_037_jr_801555F4.o,tail8.data.o,ov_SC02_037_jr_801594E8.o,ov_SC02_037_jr_80159C84.o,tail9.data.o,ov_SC02_037_jr_8015A3C8.o,tail10.data.o,ov_SC02_037_jr_8016AE5C.o,tail11.data.o,ov_SC02_037_jr_80171B4C.o,tail12.data.o,ov_SC02_037_jr_801789AC.o,tail13.data.o,ov_SC02_037_jr_8017AE2C.o,tail14.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC02_037_JTBL_INTERLEAVE := --order tail.data.o,ov_SC02_037.o,ov_SC02_037_jr_80131340.o,tail2.data.o,ov_SC02_037_jr_80135A4C.o,tail3.data.o,ov_SC02_037_jr_80135EB0.o,tail4.data.o,ov_SC02_037_jr_801380E0.o,ov_SC02_037_o0c.o,tail5.data.o,ov_SC02_037_jr_8013F350.o,tail6.data.o,ov_SC02_037_jr_801549F8.o,ov_SC02_037_jr_801555F4.o,tail7.data.o,ov_SC02_037_jr_801594E8.o,ov_SC02_037_jr_80159C84.o,tail8.data.o,ov_SC02_037_jr_8015A3C8.o,tail9.data.o,ov_SC02_037_jr_8016AE5C.o,tail10.data.o,ov_SC02_037_jr_80171B4C.o,tail11.data.o,ov_SC02_037_jr_801789AC.o,tail12.data.o,ov_SC02_037_jr_8017AE2C.o,tail13.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve build/src/ov_SC02_037/ov_SC02_037.o: JTBL_PADS := 0,0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x14,+0xdc build/src/ov_SC02_037/ov_SC02_037_jr_80131340.o: JTBL_PADS := 0,0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x14,+0x2c build/src/ov_SC02_037/ov_SC02_037_jr_80135A4C.o: JTBL_PADS := 0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x18 @@ -5010,7 +5011,7 @@ build/src/ov_SC02_037/ov_SC02_037_jr_8015A3C8.o: JTBL_PADS := 0,4,4,4 # §8e pa 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,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,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x14,+0x34,+0x4c,+0x64 -build/src/ov_SC02_037/ov_SC02_037_o0c.o: JTBL_PADS := 0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x70 +build/src/ov_SC02_037/ov_SC02_037_o0c.o: JTBL_PADS := 0,4,4,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x38,+0xa8,+0x118 ov_SC02_037_CHECK_SHA := config/check.ov_SC02_037.sha ov_SC02_037_SYMBOLS := config/symbols.ov_SC02_037.txt ov_SC02_037_SIG := .run/sig.ov_SC02_037.jsonl @@ -5032,7 +5033,7 @@ 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,ov_SC03_107_jr_80131340.o,tail2.data.o,ov_SC03_107_jr_80135A4C.o,tail3.data.o,ov_SC03_107_jr_80135EB0.o,tail4.data.o,ov_SC03_107_jr_801380E0.o,tail5.data.o,ov_SC03_107_jr_8013F350.o,tail6.data.o,ov_SC03_107_jr_801549F8.o,ov_SC03_107_jr_801555F4.o,tail7.data.o,ov_SC03_107_jr_801594E8.o,ov_SC03_107_jr_80159C84.o,tail8.data.o,ov_SC03_107_jr_8015A3C8.o,tail9.data.o,ov_SC03_107_jr_8016AE5C.o,tail10.data.o,ov_SC03_107_jr_80171B4C.o,tail11.data.o,ov_SC03_107_jr_801789AC.o,tail12.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_107_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_107.o,ov_SC03_107_jr_80131340.o,tail2.data.o,ov_SC03_107_jr_80135A4C.o,tail3.data.o,ov_SC03_107_jr_80135EB0.o,tail4.data.o,ov_SC03_107_jr_801380E0.o,ov_SC03_107_o0c.o,tail5.data.o,ov_SC03_107_jr_8013F350.o,tail6.data.o,ov_SC03_107_jr_801549F8.o,ov_SC03_107_jr_801555F4.o,tail7.data.o,ov_SC03_107_jr_801594E8.o,ov_SC03_107_jr_80159C84.o,tail8.data.o,ov_SC03_107_jr_8015A3C8.o,tail9.data.o,ov_SC03_107_jr_8016AE5C.o,tail10.data.o,ov_SC03_107_jr_80171B4C.o,tail11.data.o,ov_SC03_107_jr_801789AC.o,tail12.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,+0x14,+0xdc build/src/ov_SC03_107/ov_SC03_107_jr_80131340.o: JTBL_PADS := 0,0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x14,+0x2c build/src/ov_SC03_107/ov_SC03_107_jr_80135A4C.o: JTBL_PADS := 0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x18 @@ -5043,6 +5044,7 @@ build/src/ov_SC03_107/ov_SC03_107_jr_80159C84.o: JTBL_PADS := 0,4 # §8e pads ( build/src/ov_SC03_107/ov_SC03_107_jr_8015A3C8.o: JTBL_PADS := 0,4,4,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20,+0x40,+0x60 build/src/ov_SC03_107/ov_SC03_107_jr_80171B4C.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20 build/src/ov_SC03_107/ov_SC03_107_jr_801789AC.o: JTBL_PADS := 0,0,0,4,4,0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x18,+0x190,+0x220,+0x2b0,+0x2c4,+0x32c +build/src/ov_SC03_107/ov_SC03_107_o0c.o: JTBL_PADS := 0,4,4,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x38,+0xa8,+0x118 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 150a6b8ba..394cd9c76 100644 --- a/config/splat.ov_MAIN_012.yaml +++ b/config/splat.ov_MAIN_012.yaml @@ -121,7 +121,8 @@ segments: - [0x5adec, .rodata, ov_MAIN_012_jr_80135EB0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x5ae18, data, tail4] - [0x5ae24, .rodata, ov_MAIN_012_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x5ae88, data, tail5] + - [0x5ae88, .rodata, ov_MAIN_012_o0c] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x5b00c, data, tail5] - [0x5b494, .rodata, ov_MAIN_012_jr_8013F350] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x5b550, data, tail6] - [0x5b5d8, .rodata, ov_MAIN_012_jr_801549F8] # 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 a0e77bf26..3090b7963 100644 --- a/config/splat.ov_SC02_037.yaml +++ b/config/splat.ov_SC02_037.yaml @@ -119,27 +119,26 @@ segments: - [0x9f2d0, .rodata, ov_SC02_037_jr_80135EB0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x9f2fc, data, tail4] - [0x9f308, .rodata, ov_SC02_037_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9f36c, data, tail5] - - [0x9f414, .rodata, ov_SC02_037_o0c] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9f4f0, data, tail6] + - [0x9f36c, .rodata, ov_SC02_037_o0c] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x9f4f0, data, tail5] - [0x9f978, .rodata, ov_SC02_037_jr_8013F350] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9fa34, data, tail7] + - [0x9fa34, data, tail6] - [0x9fabc, .rodata, ov_SC02_037_jr_801549F8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x9fb4c, .rodata, ov_SC02_037_jr_801555F4] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9fb6c, data, tail8] + - [0x9fb6c, data, tail7] - [0x9fb94, .rodata, ov_SC02_037_jr_801594E8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x9fc14, .rodata, ov_SC02_037_jr_80159C84] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9fc48, data, tail9] + - [0x9fc48, data, tail8] - [0x9fc4c, .rodata, ov_SC02_037_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9fcc8, data, tail10] + - [0x9fcc8, data, tail9] - [0x9fd00, .rodata, ov_SC02_037_jr_8016AE5C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9fd20, data, tail11] + - [0x9fd20, data, tail10] - [0x9fd60, .rodata, ov_SC02_037_jr_80171B4C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9fd94, data, tail12] + - [0x9fd94, data, tail11] - [0x9ff24, .rodata, ov_SC02_037_jr_801789AC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa01d0, data, tail13] + - [0xa01d0, data, tail12] - [0xa01d4, .rodata, ov_SC02_037_jr_8017AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa024c, data, tail14] + - [0xa024c, data, tail13] - [0xA198C, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0xA198F] # 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 d81ad9509..2a5b7c299 100644 --- a/config/splat.ov_SC03_107.yaml +++ b/config/splat.ov_SC03_107.yaml @@ -118,7 +118,8 @@ segments: - [0x71604, .rodata, ov_SC03_107_jr_80135EB0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x71630, data, tail4] - [0x7163c, .rodata, ov_SC03_107_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x716a0, data, tail5] + - [0x716a0, .rodata, ov_SC03_107_o0c] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x71824, data, tail5] - [0x71cac, .rodata, ov_SC03_107_jr_8013F350] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x71d68, data, tail6] - [0x71df0, .rodata, ov_SC03_107_jr_801549F8] # 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 98d48b3e0..5b5056b2b 100644 --- a/src/ov_MAIN_012/ov_MAIN_012.c +++ b/src/ov_MAIN_012/ov_MAIN_012.c @@ -214,7 +214,7 @@ extern void func_800190AC(void); extern void func_8012956C(void); extern s32 func_8016E95C(); extern void func_801754A8(void); -extern void func_8013BC7C(void); +extern void func_8013BC7C(); extern void func_8013BCDC(void); extern void func_801379FC(void); extern void func_8001212C(void); diff --git a/src/ov_MAIN_012/ov_MAIN_012_jr_80131340.c b/src/ov_MAIN_012/ov_MAIN_012_jr_80131340.c index 59de3d0d9..cfd99974d 100644 --- a/src/ov_MAIN_012/ov_MAIN_012_jr_80131340.c +++ b/src/ov_MAIN_012/ov_MAIN_012_jr_80131340.c @@ -94,7 +94,7 @@ extern void func_800190AC(void); extern void func_8012956C(void); extern s32 func_8016E95C(); extern void func_801754A8(void); -extern void func_8013BC7C(void); +extern void func_8013BC7C(); extern void func_8013BCDC(void); extern void func_801379FC(void); extern void func_8001212C(void); diff --git a/src/ov_MAIN_012/ov_MAIN_012_jr_80135A4C.c b/src/ov_MAIN_012/ov_MAIN_012_jr_80135A4C.c index 360a22a58..e2832173d 100644 --- a/src/ov_MAIN_012/ov_MAIN_012_jr_80135A4C.c +++ b/src/ov_MAIN_012/ov_MAIN_012_jr_80135A4C.c @@ -94,7 +94,7 @@ extern void func_800190AC(void); extern void func_8012956C(void); extern s32 func_8016E95C(); extern void func_801754A8(void); -extern void func_8013BC7C(void); +extern void func_8013BC7C(); extern void func_8013BCDC(void); extern void func_801379FC(void); extern void func_8001212C(void); diff --git a/src/ov_MAIN_012/ov_MAIN_012_jr_80135EB0.c b/src/ov_MAIN_012/ov_MAIN_012_jr_80135EB0.c index 8fb88fe05..742440484 100644 --- a/src/ov_MAIN_012/ov_MAIN_012_jr_80135EB0.c +++ b/src/ov_MAIN_012/ov_MAIN_012_jr_80135EB0.c @@ -94,7 +94,7 @@ extern void func_800190AC(void); extern void func_8012956C(void); extern s32 func_8016E95C(); extern void func_801754A8(void); -extern void func_8013BC7C(void); +extern void func_8013BC7C(); extern void func_8013BCDC(void); extern void func_801379FC(void); extern void func_8001212C(void); diff --git a/src/ov_MAIN_012/ov_MAIN_012_jr_801380E0.c b/src/ov_MAIN_012/ov_MAIN_012_jr_801380E0.c index 1cd1b1eb8..82b905796 100644 --- a/src/ov_MAIN_012/ov_MAIN_012_jr_801380E0.c +++ b/src/ov_MAIN_012/ov_MAIN_012_jr_801380E0.c @@ -94,7 +94,7 @@ extern void func_800190AC(void); extern void func_8012956C(void); extern s32 func_8016E95C(); extern void func_801754A8(void); -extern void func_8013BC7C(void); +extern void func_8013BC7C(); extern void func_8013BCDC(void); extern void func_801379FC(void); extern void func_8001212C(void); diff --git a/src/ov_MAIN_012/ov_MAIN_012_jr_8013C98C.c b/src/ov_MAIN_012/ov_MAIN_012_jr_8013C98C.c index 24179ae54..27bf42497 100644 --- a/src/ov_MAIN_012/ov_MAIN_012_jr_8013C98C.c +++ b/src/ov_MAIN_012/ov_MAIN_012_jr_8013C98C.c @@ -94,7 +94,7 @@ extern void func_800190AC(void); extern void func_8012956C(void); extern s32 func_8016E95C(); extern void func_801754A8(void); -extern void func_8013BC7C(void); +extern void func_8013BC7C(); extern void func_8013BCDC(void); extern void func_801379FC(void); extern void func_8001212C(void); diff --git a/src/ov_MAIN_012/ov_MAIN_012_jr_8013F350.c b/src/ov_MAIN_012/ov_MAIN_012_jr_8013F350.c index 90ed5ecb3..86b7ed0c0 100644 --- a/src/ov_MAIN_012/ov_MAIN_012_jr_8013F350.c +++ b/src/ov_MAIN_012/ov_MAIN_012_jr_8013F350.c @@ -94,7 +94,7 @@ extern void func_800190AC(void); extern void func_8012956C(void); extern s32 func_8016E95C(); extern void func_801754A8(void); -extern void func_8013BC7C(void); +extern void func_8013BC7C(); extern void func_8013BCDC(void); extern void func_801379FC(void); extern void func_8001212C(void); diff --git a/src/ov_MAIN_012/ov_MAIN_012_jr_801549F8.c b/src/ov_MAIN_012/ov_MAIN_012_jr_801549F8.c index 7dfac32e7..89e6cd43e 100644 --- a/src/ov_MAIN_012/ov_MAIN_012_jr_801549F8.c +++ b/src/ov_MAIN_012/ov_MAIN_012_jr_801549F8.c @@ -94,7 +94,7 @@ extern void func_800190AC(void); extern void func_8012956C(void); extern s32 func_8016E95C(); extern void func_801754A8(void); -extern void func_8013BC7C(void); +extern void func_8013BC7C(); extern void func_8013BCDC(void); extern void func_801379FC(void); extern void func_8001212C(void); diff --git a/src/ov_MAIN_012/ov_MAIN_012_jr_801555F4.c b/src/ov_MAIN_012/ov_MAIN_012_jr_801555F4.c index c7d291634..c33115678 100644 --- a/src/ov_MAIN_012/ov_MAIN_012_jr_801555F4.c +++ b/src/ov_MAIN_012/ov_MAIN_012_jr_801555F4.c @@ -94,7 +94,7 @@ extern void func_800190AC(void); extern void func_8012956C(void); extern s32 func_8016E95C(); extern void func_801754A8(void); -extern void func_8013BC7C(void); +extern void func_8013BC7C(); extern void func_8013BCDC(void); extern void func_801379FC(void); extern void func_8001212C(void); diff --git a/src/ov_MAIN_012/ov_MAIN_012_jr_801594E8.c b/src/ov_MAIN_012/ov_MAIN_012_jr_801594E8.c index fc0b94ee8..2dca2e63c 100644 --- a/src/ov_MAIN_012/ov_MAIN_012_jr_801594E8.c +++ b/src/ov_MAIN_012/ov_MAIN_012_jr_801594E8.c @@ -94,7 +94,7 @@ extern void func_800190AC(void); extern void func_8012956C(void); extern s32 func_8016E95C(); extern void func_801754A8(void); -extern void func_8013BC7C(void); +extern void func_8013BC7C(); extern void func_8013BCDC(void); extern void func_801379FC(void); extern void func_8001212C(void); diff --git a/src/ov_MAIN_012/ov_MAIN_012_jr_80159C84.c b/src/ov_MAIN_012/ov_MAIN_012_jr_80159C84.c index 5203d7647..b0c628e02 100644 --- a/src/ov_MAIN_012/ov_MAIN_012_jr_80159C84.c +++ b/src/ov_MAIN_012/ov_MAIN_012_jr_80159C84.c @@ -94,7 +94,7 @@ extern void func_800190AC(void); extern void func_8012956C(void); extern s32 func_8016E95C(); extern void func_801754A8(void); -extern void func_8013BC7C(void); +extern void func_8013BC7C(); extern void func_8013BCDC(void); extern void func_801379FC(void); extern void func_8001212C(void); diff --git a/src/ov_MAIN_012/ov_MAIN_012_jr_8015A3C8.c b/src/ov_MAIN_012/ov_MAIN_012_jr_8015A3C8.c index d045b07d6..c1858dc28 100644 --- a/src/ov_MAIN_012/ov_MAIN_012_jr_8015A3C8.c +++ b/src/ov_MAIN_012/ov_MAIN_012_jr_8015A3C8.c @@ -94,7 +94,7 @@ extern void func_800190AC(void); extern void func_8012956C(void); extern s32 func_8016E95C(); extern void func_801754A8(void); -extern void func_8013BC7C(void); +extern void func_8013BC7C(); extern void func_8013BCDC(void); extern void func_801379FC(void); extern void func_8001212C(void); diff --git a/src/ov_MAIN_012/ov_MAIN_012_jr_8016AE5C.c b/src/ov_MAIN_012/ov_MAIN_012_jr_8016AE5C.c index a94cab2a0..35b22c6b0 100644 --- a/src/ov_MAIN_012/ov_MAIN_012_jr_8016AE5C.c +++ b/src/ov_MAIN_012/ov_MAIN_012_jr_8016AE5C.c @@ -113,7 +113,7 @@ extern void func_800190AC(void); extern void func_8012956C(void); extern s32 func_8016E95C(); extern void func_801754A8(void); -extern void func_8013BC7C(void); +extern void func_8013BC7C(); extern void func_8013BCDC(void); extern void func_801379FC(void); extern void func_8001212C(void); diff --git a/src/ov_MAIN_012/ov_MAIN_012_jr_80171B4C.c b/src/ov_MAIN_012/ov_MAIN_012_jr_80171B4C.c index 2fb05edf2..65b4a3a11 100644 --- a/src/ov_MAIN_012/ov_MAIN_012_jr_80171B4C.c +++ b/src/ov_MAIN_012/ov_MAIN_012_jr_80171B4C.c @@ -156,7 +156,7 @@ extern void func_800190AC(void); extern void func_8012956C(void); extern s32 func_8016E95C(); extern void func_801754A8(void); -extern void func_8013BC7C(void); +extern void func_8013BC7C(); extern void func_8013BCDC(void); extern void func_801379FC(void); extern void func_8001212C(void); diff --git a/src/ov_MAIN_012/ov_MAIN_012_jr_801789AC.c b/src/ov_MAIN_012/ov_MAIN_012_jr_801789AC.c index dad9bb831..b780d3b76 100644 --- a/src/ov_MAIN_012/ov_MAIN_012_jr_801789AC.c +++ b/src/ov_MAIN_012/ov_MAIN_012_jr_801789AC.c @@ -192,7 +192,7 @@ extern void func_800190AC(void); extern void func_8012956C(void); extern s32 func_8016E95C(); extern void func_801754A8(void); -extern void func_8013BC7C(void); +extern void func_8013BC7C(); extern void func_8013BCDC(void); extern void func_801379FC(void); extern void func_8001212C(void); diff --git a/src/ov_MAIN_012/ov_MAIN_012_jr_8017C3BC.c b/src/ov_MAIN_012/ov_MAIN_012_jr_8017C3BC.c index cec5ed72b..aa14527be 100644 --- a/src/ov_MAIN_012/ov_MAIN_012_jr_8017C3BC.c +++ b/src/ov_MAIN_012/ov_MAIN_012_jr_8017C3BC.c @@ -198,7 +198,7 @@ extern void func_800190AC(void); extern void func_8012956C(void); extern s32 func_8016E95C(); extern void func_801754A8(void); -extern void func_8013BC7C(void); +extern void func_8013BC7C(); extern void func_8013BCDC(void); extern void func_801379FC(void); extern void func_8001212C(void); diff --git a/src/ov_MAIN_012/ov_MAIN_012_jr_8017CA18.c b/src/ov_MAIN_012/ov_MAIN_012_jr_8017CA18.c index 8af38d099..dbce7515e 100644 --- a/src/ov_MAIN_012/ov_MAIN_012_jr_8017CA18.c +++ b/src/ov_MAIN_012/ov_MAIN_012_jr_8017CA18.c @@ -198,7 +198,7 @@ extern void func_800190AC(void); extern void func_8012956C(void); extern s32 func_8016E95C(); extern void func_801754A8(void); -extern void func_8013BC7C(void); +extern void func_8013BC7C(); extern void func_8013BCDC(void); extern void func_801379FC(void); extern void func_8001212C(void); diff --git a/src/ov_MAIN_012/ov_MAIN_012_jr_8017CF3C.c b/src/ov_MAIN_012/ov_MAIN_012_jr_8017CF3C.c index d1d3ece29..567a64511 100644 --- a/src/ov_MAIN_012/ov_MAIN_012_jr_8017CF3C.c +++ b/src/ov_MAIN_012/ov_MAIN_012_jr_8017CF3C.c @@ -198,7 +198,7 @@ extern void func_800190AC(void); extern void func_8012956C(void); extern s32 func_8016E95C(); extern void func_801754A8(void); -extern void func_8013BC7C(void); +extern void func_8013BC7C(); extern void func_8013BCDC(void); extern void func_801379FC(void); extern void func_8001212C(void); diff --git a/src/ov_MAIN_012/ov_MAIN_012_o0c.c b/src/ov_MAIN_012/ov_MAIN_012_o0c.c index 5147167f2..3405d5527 100644 --- a/src/ov_MAIN_012/ov_MAIN_012_o0c.c +++ b/src/ov_MAIN_012/ov_MAIN_012_o0c.c @@ -94,7 +94,7 @@ extern void func_800190AC(void); extern void func_8012956C(void); extern s32 func_8016E95C(); extern void func_801754A8(void); -extern void func_8013BC7C(void); +extern void func_8013BC7C(); extern void func_8013BCDC(void); extern void func_801379FC(void); extern void func_8001212C(void); @@ -757,34 +757,484 @@ extern void func_8013AF20(u32 *param_1, u16 *param_2, u16 *param_3, u8 *param_4) /* ==== end §8b carried decl layer ==== */ -INCLUDE_ASM("asm/ov_MAIN_012/nonmatchings/ov_MAIN_012_o0c", func_8013B568); +extern s32 D_8017EAD4; -INCLUDE_ASM("asm/ov_MAIN_012/nonmatchings/ov_MAIN_012_o0c", func_8013B598); +void func_8013B568(s32 arg0) { + D_8017EAD4 = arg0; +} -INCLUDE_ASM("asm/ov_MAIN_012/nonmatchings/ov_MAIN_012_o0c", func_8013B6A0); -INCLUDE_ASM("asm/ov_MAIN_012/nonmatchings/ov_MAIN_012_o0c", func_8013B7AC); + /* size 0x14 */ -INCLUDE_ASM("asm/ov_MAIN_012/nonmatchings/ov_MAIN_012_o0c", func_8013B7F4); +/* func_8013B598 (ov_SC01_077_o0, -O0): fills entry a0 of the 0x1C-stride table at + * D_80185B58 from a 3-halfword source record. + * + * -O0 CONSTANT-OFFSET FOLD (the quirk that stalled this -O0 cluster in Phase 19): + * at -O0 gcc-2.7.2 folds a constant offset into the memory operand ONLY through a + * COMPONENT_REF / a real ARRAY_REF on an array-typed DECL: + * D_80185B58[a0].f4 = ... -> lui $at,%hi(sym); addu $at,$at,idx; sh %lo(sym+4)($at) + * A CAST base defeats it (NOP_EXPR over the ADDR_EXPR), and so does pointer indexing: + * ((S *)D_80185B58)[a0].f4 -> lui;addiu;addu;sh 4(reg) (+2 ins per store) + * a1[1] -> addiu $v1,$a0,2; lhu 0($v1) (+1 ins per load) + * So the table extern must carry the FULL struct type (not the pad-only canonical + * E_3B7AC), and the source record must be read as ->field, not as a[i]. Casting the + * incoming POINTER is harmless (a NOP on a register), only the base decl's type matters. + * + * Both types are body-scoped (cookbook §100) and the extern is declared inside the body, + * matching the established -O0 sibling pattern in src/ov_SC07_010/ov_SC07_010_o0.c + * (func_8013B7AC: `extern E_3B7AC D_801A9420[];` in-body). NOTE FOR BANKING: the canonical + * sig-layer decl `extern E_3B7AC D_80185B58[];` (f0 + pad only) CANNOT be used here — it has + * no f4/f6/f8/fC members. The in-body decl below must be the one that survives; do not also + * emit a file-scope E_3B7AC decl for D_80185B58 (conflicting types). + * + * 66/66 instructions byte-identical (match_one --o0). + */ +void func_8013B598(s32 a0, u16 *a1) { + typedef struct { u16 f0; u16 f2; u16 f4; } Src_8013B598; + typedef struct { s32 f0; u16 f4; u16 f6; u16 f8; u16 fA; s32 fC; u8 pad[0xC]; } Spr_8013B598; + extern Spr_8013B598 D_80185B58[]; -INCLUDE_ASM("asm/ov_MAIN_012/nonmatchings/ov_MAIN_012_o0c", func_8013B83C); + D_80185B58[a0].f0 = 1; + D_80185B58[a0].f4 = ((Src_8013B598 *)a1)->f0; + D_80185B58[a0].f6 = ((Src_8013B598 *)a1)->f2; + D_80185B58[a0].f8 = ((Src_8013B598 *)a1)->f4; + D_80185B58[a0].fC = 0x100; +} -INCLUDE_ASM("asm/ov_MAIN_012/nonmatchings/ov_MAIN_012_o0c", func_8013BC7C); -INCLUDE_ASM("asm/ov_MAIN_012/nonmatchings/ov_MAIN_012_o0c", func_8013BCDC); + /* size 0x14 */ -INCLUDE_ASM("asm/ov_MAIN_012/nonmatchings/ov_MAIN_012_o0c", func_8013BD34); -INCLUDE_ASM("asm/ov_MAIN_012/nonmatchings/ov_MAIN_012_o0c", func_8013BD74); +void func_8013B6A0(s32 idx, u16 *src, s32 val) +{ + typedef struct { + s32 f0; + u16 f4; + u16 f6; + u16 f8; + u16 fA; + s32 fC; + u8 pad[0xC]; + } Ent_8013B6A0; + typedef struct { + u16 f0; + u16 f2; + u16 f4; + } Src_8013B6A0; + extern Ent_8013B6A0 D_80185B58[]; -INCLUDE_ASM("asm/ov_MAIN_012/nonmatchings/ov_MAIN_012_o0c", func_8013C08C); + D_80185B58[idx].f0 = 1; + D_80185B58[idx].f4 = ((Src_8013B6A0 *)src)->f0; + D_80185B58[idx].f6 = ((Src_8013B6A0 *)src)->f2; + D_80185B58[idx].f8 = ((Src_8013B6A0 *)src)->f4; + D_80185B58[idx].fC = val; +} -INCLUDE_ASM("asm/ov_MAIN_012/nonmatchings/ov_MAIN_012_o0c", func_8013C0F8); -INCLUDE_ASM("asm/ov_MAIN_012/nonmatchings/ov_MAIN_012_o0c", func_8013C360); + /* size 0x14 */ + /* sizeof 0x1C stride */ +extern E_3B7AC D_80185B58[]; +void func_8013B7AC(int a0) { D_80185B58[a0].f0 = 0; } -INCLUDE_ASM("asm/ov_MAIN_012/nonmatchings/ov_MAIN_012_o0c", func_8013C414); -INCLUDE_ASM("asm/ov_MAIN_012/nonmatchings/ov_MAIN_012_o0c", func_8013C938); +extern s32 D_80185C74; + + +void func_8013B7F4(s32 a0, s32 a1) { + func_8013B83C(a0, a1, D_80185C74); +} + + +extern s32 D_80185C10; +extern s32 D_80185C74; + /* size 0x14 */ + +void func_8013B83C(s32 a0, s32 a1, s32 a2) { + typedef struct { + s32 f0; + u16 f4; + u16 f6; + u16 f8; + u16 fA; + s32 fC; + u8 pad[8]; + s32 f18; + } Ent_8013B83C; /* sizeof 0x1C */ + extern Ent_8013B83C D_801DAA08_e[] __asm__("D_80185B58"); + extern s32 D_80185BF4; + extern s32 D_80185BF8; + extern s32 D_80185BFC; + extern s32 D_80185C20; + extern s32 D_80185C70; + extern s32 D_80185C78; + extern s16 D_800B9A0E; + extern void func_80052D90(s32 a0, void *a1); + extern void func_8013C08C(void*, void*); + s32 i; + + D_80185C10 = 0; + D_80185BFC = 0; + D_80185BF8 = 0; + D_80185BF4 = 0; + func_80052D90(0, &D_80185C20); + if (a0 == 0) { + return; + } + D_80185C70 = a2 + 500; + D_80185C74 = a2; + for (i = 0; i < 4; i++) { + D_801DAA08_e[i].f0 = 0; + D_801DAA08_e[i].f4 = D_801DAA08_e[i].f6 = D_801DAA08_e[i].f8 = 0x6000; + D_801DAA08_e[i].fC = 0x100; + D_801DAA08_e[i].f18 = 0; + } + switch (*(u8 *)a0) { + case 0x42: + if (D_800B9A0E == 0) { + func_8013BD74(&D_80185C10, a0); + } else { + func_8013BD74(&D_80185C10, a1); + } + D_80185C78 = 0; + break; + case 0x43: + ((void (*)(void *, s32))func_8013C08C)(&D_80185C10, a0); + D_80185C78 = 1; + break; + case 0x44: + ((void (*)(void *, s32))func_8013C08C)(&D_80185C10, a0); + D_80185C78 = 2; + break; + case 0x45: + ((void (*)(void *, s32))func_8013C08C)(&D_80185C10, a0); + D_80185C78 = 3; + break; + case 0x46: + ((void (*)(void *, s32))func_8013C08C)(&D_80185C10, a0); + D_80185C78 = 4; + break; + case 0x47: + ((void (*)(void *, s32))func_8013C08C)(&D_80185C10, a0); + D_80185C78 = 5; + break; + case 0x48: + ((void (*)(void *, s32))func_8013C08C)(&D_80185C10, a0); + D_80185C78 = 6; + break; + case 0x49: + ((void (*)(void *, s32))func_8013C08C)(&D_80185C10, a0); + D_80185C78 = 9; + break; + case 0x4A: + ((void (*)(void *, s32))func_8013C08C)(&D_80185C10, a0); + D_80185C78 = 0xC; + break; + case 0x4B: + ((void (*)(void *, s32))func_8013C08C)(&D_80185C10, a0); + D_80185C78 = 0xD; + break; + case 0x4C: + ((void (*)(void *, s32))func_8013C08C)(&D_80185C10, a0); + D_80185C78 = 0xE; + break; + case 0x4D: + ((void (*)(void *, s32))func_8013C08C)(&D_80185C10, a0); + D_80185C78 = 0xF; + break; + case 0x4E: + ((void (*)(void *, s32))func_8013C08C)(&D_80185C10, a0); + D_80185C78 = 0x10; + break; + } +} + + + + + + +extern void (*D_8017E338[])(void *); + +void func_8013BC7C(void *arg0) { + D_8017E338[((S_8013BC7C *)arg0)->f68](arg0); +} + + +extern s32 D_8017EAD4; + /* size 0x14 */ + +/* func_8013BCDC (ov_SC01_077_o0, -O0): guarded indirect call through D_8017EAD4. + * D_8017EAD4 is declared `extern s32` in the TU (canonical-sig layer) and holds a + * function pointer; read it as an s32, test non-null, cast to fn-ptr and call. + * Frame residual: target frame is 0x30 (saves $ra/$fp/$s0 at 0x28/0x24/0x20) — 16 + * bytes of var_size above the minimal 0x20. At -O0 (no DCE) an unused 16-byte local + * reserves exactly that var region (cookbook §42 lever 3, frame-pad induction) with + * zero body instructions. 22/22 byte-identical via rtu_match. */ +void func_8013BCDC(void) { + s32 pad[4]; + if (D_8017EAD4 != 0) { + ((void (*)(void))D_8017EAD4)(); + } +} + + +extern s32 D_80185C10; + +void func_8013BD34(s32 a0) { + func_8013BD74(&D_80185C10, a0); +} + + + +extern s16 D_80185B18; +extern s16 D_80185B1A; +extern s16 D_80185B1C; +extern s16 D_80185B1E; + +void func_8013BD74(void *a0, s32 a1) { + /* §100 draft-LOCAL types: file-scope typedefs are NOT carried by extract_unit/remap_hseq, so a + file-scope E_13BD74 banks the exemplar and then fails every sibling with `E_13BD74' + undeclared (the §94 type-carry class, measured on ov_SC01_000). Block scope travels with the + body and is byte-neutral (a type emits no code). */ + typedef struct { + u8 pad0[8]; + void *f8; + void *fC; + } E_13BD74; + typedef struct { + u8 pad0[3]; + u8 code; + s32 f4; + s32 f8; + } P_13BD74; + s32 *q; + s32 *p; + s32 i; + s32 unused0; + s32 unused1; + P_13BD74 *e; + P_13BD74 *end; + s32 unused2; + s32 base; + s32 unused3; + + D_80185B18 = -0xA0; + D_80185B1A = -0x78; + D_80185B1C = 0x140; + D_80185B1E = 0xF0; + ((E_13BD74 *)a0)->f8 = (void *)a1; + ((E_13BD74 *)a0)->fC = (void *)(a1 + 8); + base = a1 + 0x4008; + if (((u8 *)a1)[4] == 0) { + p = (s32 *)((E_13BD74 *)a0)->fC; + for (i = 0; i < 0x1000; i++) { + if (*p != 0) { + *p += (s32)((E_13BD74 *)a0)->fC; + q = (s32 *)*p; + q[0] += (s32)q; + q[5] += (s32)q; + e = (P_13BD74 *)q[5]; + q[6] = q[6] * 12 + q[5]; + end = (P_13BD74 *)q[6]; + while (e < end) { + switch (e->code) { + case 0x24: + case 0x2C: + case 0x34: + case 0x3C: + *(s32 *)e = (*(s32 *)e & 0xFFFFFF) + base; + break; + case 0x26: + case 0x2E: + case 0x36: + case 0x3E: + *(s32 *)e = (*(s32 *)e & 0xFFFFFF) + base; + break; + } + e++; + } + } + p++; + } + ((u8 *)a1)[4] = 1; + } +} + + + + +extern void func_8013C0F8(s32 a0); + +void func_8013C08C(void *a0, void *a1) { + /* SS100 DRAFT-LOCAL type: only this function uses E_13C08C, so it lives in the BODY, not at + * file scope. At file scope extract_unit's preceding-decl backscan cannot carry it: the scan + * walks back over extern/comment/blank/typedef lines, and a MULTI-LINE typedef presents its + * CLOSING line first, which matches none of those prefixes. Every templated sibling therefore + * got the body without the type and the family swept 0/137 (SS94: a family 0/N is a type-carry + * failure until proven otherwise). Declared here, it is part of the unit by construction. + * NB no brace characters in this comment on purpose - extract_unit's forward brace-scan does + * not strip comments, so a brace in a comment truncates the extracted unit. */ + typedef struct { + u8 pad0[8]; + void *f8; + void *fC; + } E_13C08C; + + void *p = a1; + + ((E_13C08C *)a0)->f8 = a1; + ((E_13C08C *)a0)->fC = (u8 *)p + 0x14; + func_8013C0F8((s32)a1); +} + + + + + /* size 0x14 */ + + /* size 0xc */ + +void func_8013C0F8(int param_1) { + int iVar1; + int iVar2; + unsigned int local_18; + unsigned int local_14; + Bar *local_10; + Foo *local_c; + + iVar1 = param_1 + 0x14; + if (*(char *)(param_1 + 4) == '\0') { + iVar2 = iVar1 + *(int *)(param_1 + 0xc); + *(int *)(param_1 + 0xc) = iVar2; + *(int *)(param_1 + 0x10) = *(int *)(param_1 + 0x10) + iVar1; + local_c = (Foo *)iVar1; + for (local_18 = 0; local_18 < *(unsigned int *)(param_1 + 8); local_18++, local_c++) { + local_c->field10 = local_c->field10 + iVar1; + local_10 = (Bar *)local_c->field10; + for (local_14 = 0; local_14 < local_c->count; local_14++, local_10++) { + switch (local_10->tag) { + case 0x24: + case 0x2c: + case 0x34: + case 0x3c: + *(unsigned int *)local_10 = (*(unsigned int *)local_10 & 0xffffff) + iVar2; + break; + case 0x26: + case 0x2e: + case 0x36: + case 0x3e: + *(unsigned int *)local_10 = (*(unsigned int *)local_10 & 0xffffff) + iVar2; + break; + } + } + } + *(unsigned char *)(param_1 + 4) = 1; + } +} + + + + +void func_8013C360(s32 a0) { + s32 *p; + u32 i; + p = (s32 *)(a0 + 0x10); + for (i = 0; i < *(u32 *)(a0 + 8); i++) { + *(s32 *)(*(s32 *)p) = *(s32 *)((s32)p + 4); + p = (s32 *)((s32)p + 0xC); + } +} + + + + /* 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; + } + } +} + + +extern s32 D_80185C10; + + +void func_8013C938(void) { + D_80185C10 = 1; +} + + +extern s32 D_80185C10; + +void func_8013C964(void) { + D_80185C10 = 0; +} -INCLUDE_ASM("asm/ov_MAIN_012/nonmatchings/ov_MAIN_012_o0c", func_8013C964); diff --git a/src/ov_SC02_037/ov_SC02_037.c b/src/ov_SC02_037/ov_SC02_037.c index a1d315712..f04ea9963 100644 --- a/src/ov_SC02_037/ov_SC02_037.c +++ b/src/ov_SC02_037/ov_SC02_037.c @@ -214,7 +214,7 @@ extern void func_800190AC(void); extern void func_8012956C(void); extern s32 func_8016E95C(); extern void func_801754A8(void); -extern void func_8013BC7C(void); +extern void func_8013BC7C(); extern void func_8013BCDC(void); extern void func_801379FC(void); extern void func_8001212C(void); diff --git a/src/ov_SC02_037/ov_SC02_037_jr_80131340.c b/src/ov_SC02_037/ov_SC02_037_jr_80131340.c index 651342f95..c46a201df 100644 --- a/src/ov_SC02_037/ov_SC02_037_jr_80131340.c +++ b/src/ov_SC02_037/ov_SC02_037_jr_80131340.c @@ -94,7 +94,7 @@ extern void func_800190AC(void); extern void func_8012956C(void); extern s32 func_8016E95C(); extern void func_801754A8(void); -extern void func_8013BC7C(void); +extern void func_8013BC7C(); extern void func_8013BCDC(void); extern void func_801379FC(void); extern void func_8001212C(void); diff --git a/src/ov_SC02_037/ov_SC02_037_jr_80135A4C.c b/src/ov_SC02_037/ov_SC02_037_jr_80135A4C.c index e1a7d0a1d..c7901dd28 100644 --- a/src/ov_SC02_037/ov_SC02_037_jr_80135A4C.c +++ b/src/ov_SC02_037/ov_SC02_037_jr_80135A4C.c @@ -94,7 +94,7 @@ extern void func_800190AC(void); extern void func_8012956C(void); extern s32 func_8016E95C(); extern void func_801754A8(void); -extern void func_8013BC7C(void); +extern void func_8013BC7C(); extern void func_8013BCDC(void); extern void func_801379FC(void); extern void func_8001212C(void); diff --git a/src/ov_SC02_037/ov_SC02_037_jr_80135EB0.c b/src/ov_SC02_037/ov_SC02_037_jr_80135EB0.c index d09713e18..02889539b 100644 --- a/src/ov_SC02_037/ov_SC02_037_jr_80135EB0.c +++ b/src/ov_SC02_037/ov_SC02_037_jr_80135EB0.c @@ -94,7 +94,7 @@ extern void func_800190AC(void); extern void func_8012956C(void); extern s32 func_8016E95C(); extern void func_801754A8(void); -extern void func_8013BC7C(void); +extern void func_8013BC7C(); extern void func_8013BCDC(void); extern void func_801379FC(void); extern void func_8001212C(void); diff --git a/src/ov_SC02_037/ov_SC02_037_jr_801380E0.c b/src/ov_SC02_037/ov_SC02_037_jr_801380E0.c index afee6fbc8..1f541f022 100644 --- a/src/ov_SC02_037/ov_SC02_037_jr_801380E0.c +++ b/src/ov_SC02_037/ov_SC02_037_jr_801380E0.c @@ -94,7 +94,7 @@ extern void func_800190AC(void); extern void func_8012956C(void); extern s32 func_8016E95C(); extern void func_801754A8(void); -extern void func_8013BC7C(void); +extern void func_8013BC7C(); extern void func_8013BCDC(void); extern void func_801379FC(void); extern void func_8001212C(void); diff --git a/src/ov_SC02_037/ov_SC02_037_jr_8013C98C.c b/src/ov_SC02_037/ov_SC02_037_jr_8013C98C.c index 551e44ef6..89592e8ea 100644 --- a/src/ov_SC02_037/ov_SC02_037_jr_8013C98C.c +++ b/src/ov_SC02_037/ov_SC02_037_jr_8013C98C.c @@ -94,7 +94,7 @@ extern void func_800190AC(void); extern void func_8012956C(void); extern s32 func_8016E95C(); extern void func_801754A8(void); -extern void func_8013BC7C(void); +extern void func_8013BC7C(); extern void func_8013BCDC(void); extern void func_801379FC(void); extern void func_8001212C(void); diff --git a/src/ov_SC02_037/ov_SC02_037_jr_8013F350.c b/src/ov_SC02_037/ov_SC02_037_jr_8013F350.c index e4f62e55c..243734a24 100644 --- a/src/ov_SC02_037/ov_SC02_037_jr_8013F350.c +++ b/src/ov_SC02_037/ov_SC02_037_jr_8013F350.c @@ -94,7 +94,7 @@ extern void func_800190AC(void); extern void func_8012956C(void); extern s32 func_8016E95C(); extern void func_801754A8(void); -extern void func_8013BC7C(void); +extern void func_8013BC7C(); extern void func_8013BCDC(void); extern void func_801379FC(void); extern void func_8001212C(void); diff --git a/src/ov_SC02_037/ov_SC02_037_jr_801549F8.c b/src/ov_SC02_037/ov_SC02_037_jr_801549F8.c index 2d699d70e..ccaabca08 100644 --- a/src/ov_SC02_037/ov_SC02_037_jr_801549F8.c +++ b/src/ov_SC02_037/ov_SC02_037_jr_801549F8.c @@ -108,7 +108,7 @@ extern void func_800190AC(void); extern void func_8012956C(void); extern s32 func_8016E95C(); extern void func_801754A8(void); -extern void func_8013BC7C(void); +extern void func_8013BC7C(); extern void func_8013BCDC(void); extern void func_801379FC(void); extern void func_8001212C(void); diff --git a/src/ov_SC02_037/ov_SC02_037_jr_801555F4.c b/src/ov_SC02_037/ov_SC02_037_jr_801555F4.c index 97de84523..97d92b189 100644 --- a/src/ov_SC02_037/ov_SC02_037_jr_801555F4.c +++ b/src/ov_SC02_037/ov_SC02_037_jr_801555F4.c @@ -108,7 +108,7 @@ extern void func_800190AC(void); extern void func_8012956C(void); extern s32 func_8016E95C(); extern void func_801754A8(void); -extern void func_8013BC7C(void); +extern void func_8013BC7C(); extern void func_8013BCDC(void); extern void func_801379FC(void); extern void func_8001212C(void); diff --git a/src/ov_SC02_037/ov_SC02_037_jr_801594E8.c b/src/ov_SC02_037/ov_SC02_037_jr_801594E8.c index e7e01aa13..d9e957ac9 100644 --- a/src/ov_SC02_037/ov_SC02_037_jr_801594E8.c +++ b/src/ov_SC02_037/ov_SC02_037_jr_801594E8.c @@ -108,7 +108,7 @@ extern void func_800190AC(void); extern void func_8012956C(void); extern s32 func_8016E95C(); extern void func_801754A8(void); -extern void func_8013BC7C(void); +extern void func_8013BC7C(); extern void func_8013BCDC(void); extern void func_801379FC(void); extern void func_8001212C(void); diff --git a/src/ov_SC02_037/ov_SC02_037_jr_80159C84.c b/src/ov_SC02_037/ov_SC02_037_jr_80159C84.c index 555bf5190..962a66fb4 100644 --- a/src/ov_SC02_037/ov_SC02_037_jr_80159C84.c +++ b/src/ov_SC02_037/ov_SC02_037_jr_80159C84.c @@ -108,7 +108,7 @@ extern void func_800190AC(void); extern void func_8012956C(void); extern s32 func_8016E95C(); extern void func_801754A8(void); -extern void func_8013BC7C(void); +extern void func_8013BC7C(); extern void func_8013BCDC(void); extern void func_801379FC(void); extern void func_8001212C(void); diff --git a/src/ov_SC02_037/ov_SC02_037_jr_8015A3C8.c b/src/ov_SC02_037/ov_SC02_037_jr_8015A3C8.c index fe313f67e..bc308b5f4 100644 --- a/src/ov_SC02_037/ov_SC02_037_jr_8015A3C8.c +++ b/src/ov_SC02_037/ov_SC02_037_jr_8015A3C8.c @@ -108,7 +108,7 @@ extern void func_800190AC(void); extern void func_8012956C(void); extern s32 func_8016E95C(); extern void func_801754A8(void); -extern void func_8013BC7C(void); +extern void func_8013BC7C(); extern void func_8013BCDC(void); extern void func_801379FC(void); extern void func_8001212C(void); diff --git a/src/ov_SC02_037/ov_SC02_037_jr_8016AE5C.c b/src/ov_SC02_037/ov_SC02_037_jr_8016AE5C.c index 1cb4d1bfc..033e4cd51 100644 --- a/src/ov_SC02_037/ov_SC02_037_jr_8016AE5C.c +++ b/src/ov_SC02_037/ov_SC02_037_jr_8016AE5C.c @@ -127,7 +127,7 @@ extern void func_800190AC(void); extern void func_8012956C(void); extern s32 func_8016E95C(); extern void func_801754A8(void); -extern void func_8013BC7C(void); +extern void func_8013BC7C(); extern void func_8013BCDC(void); extern void func_801379FC(void); extern void func_8001212C(void); diff --git a/src/ov_SC02_037/ov_SC02_037_jr_80171B4C.c b/src/ov_SC02_037/ov_SC02_037_jr_80171B4C.c index ebb40515f..36118e00c 100644 --- a/src/ov_SC02_037/ov_SC02_037_jr_80171B4C.c +++ b/src/ov_SC02_037/ov_SC02_037_jr_80171B4C.c @@ -170,7 +170,7 @@ extern void func_800190AC(void); extern void func_8012956C(void); extern s32 func_8016E95C(); extern void func_801754A8(void); -extern void func_8013BC7C(void); +extern void func_8013BC7C(); extern void func_8013BCDC(void); extern void func_801379FC(void); extern void func_8001212C(void); 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 742efa8d3..ddbc43d57 100644 --- a/src/ov_SC02_037/ov_SC02_037_jr_801789AC.c +++ b/src/ov_SC02_037/ov_SC02_037_jr_801789AC.c @@ -207,7 +207,7 @@ extern void func_800190AC(void); extern void func_8012956C(void); extern s32 func_8016E95C(); extern void func_801754A8(void); -extern void func_8013BC7C(void); +extern void func_8013BC7C(); extern void func_8013BCDC(void); extern void func_801379FC(void); extern void func_8001212C(void); diff --git a/src/ov_SC02_037/ov_SC02_037_jr_8017AE2C.c b/src/ov_SC02_037/ov_SC02_037_jr_8017AE2C.c index 82ba89828..faffc963b 100644 --- a/src/ov_SC02_037/ov_SC02_037_jr_8017AE2C.c +++ b/src/ov_SC02_037/ov_SC02_037_jr_8017AE2C.c @@ -207,7 +207,7 @@ extern void func_800190AC(void); extern void func_8012956C(void); extern s32 func_8016E95C(); extern void func_801754A8(void); -extern void func_8013BC7C(void); +extern void func_8013BC7C(); extern void func_8013BCDC(void); extern void func_801379FC(void); extern void func_8001212C(void); diff --git a/src/ov_SC02_037/ov_SC02_037_o0c.c b/src/ov_SC02_037/ov_SC02_037_o0c.c index 9d1302aed..1b8f1b34d 100644 --- a/src/ov_SC02_037/ov_SC02_037_o0c.c +++ b/src/ov_SC02_037/ov_SC02_037_o0c.c @@ -94,7 +94,7 @@ extern void func_800190AC(void); extern void func_8012956C(void); extern s32 func_8016E95C(); extern void func_801754A8(void); -extern void func_8013BC7C(void); +extern void func_8013BC7C(); extern void func_8013BCDC(void); extern void func_801379FC(void); extern void func_8001212C(void); @@ -755,19 +755,208 @@ extern void func_8013AF20(u32 *param_1, u16 *param_2, u16 *param_3, u8 *param_4) /* ==== end §8b carried decl layer ==== */ -INCLUDE_ASM("asm/ov_SC02_037/nonmatchings/ov_SC02_037_o0c", func_8013B568); +extern s32 D_80184360; -INCLUDE_ASM("asm/ov_SC02_037/nonmatchings/ov_SC02_037_o0c", func_8013B598); +void func_8013B568(s32 arg0) { + D_80184360 = arg0; +} -INCLUDE_ASM("asm/ov_SC02_037/nonmatchings/ov_SC02_037_o0c", func_8013B6A0); -INCLUDE_ASM("asm/ov_SC02_037/nonmatchings/ov_SC02_037_o0c", func_8013B7AC); + /* size 0x14 */ -INCLUDE_ASM("asm/ov_SC02_037/nonmatchings/ov_SC02_037_o0c", func_8013B7F4); +/* func_8013B598 (ov_SC01_077_o0, -O0): fills entry a0 of the 0x1C-stride table at + * D_801C99C0 from a 3-halfword source record. + * + * -O0 CONSTANT-OFFSET FOLD (the quirk that stalled this -O0 cluster in Phase 19): + * at -O0 gcc-2.7.2 folds a constant offset into the memory operand ONLY through a + * COMPONENT_REF / a real ARRAY_REF on an array-typed DECL: + * D_801C99C0[a0].f4 = ... -> lui $at,%hi(sym); addu $at,$at,idx; sh %lo(sym+4)($at) + * A CAST base defeats it (NOP_EXPR over the ADDR_EXPR), and so does pointer indexing: + * ((S *)D_801C99C0)[a0].f4 -> lui;addiu;addu;sh 4(reg) (+2 ins per store) + * a1[1] -> addiu $v1,$a0,2; lhu 0($v1) (+1 ins per load) + * So the table extern must carry the FULL struct type (not the pad-only canonical + * E_3B7AC), and the source record must be read as ->field, not as a[i]. Casting the + * incoming POINTER is harmless (a NOP on a register), only the base decl's type matters. + * + * Both types are body-scoped (cookbook §100) and the extern is declared inside the body, + * matching the established -O0 sibling pattern in src/ov_SC07_010/ov_SC07_010_o0.c + * (func_8013B7AC: `extern E_3B7AC D_801A9420[];` in-body). NOTE FOR BANKING: the canonical + * sig-layer decl `extern E_3B7AC D_801C99C0[];` (f0 + pad only) CANNOT be used here — it has + * no f4/f6/f8/fC members. The in-body decl below must be the one that survives; do not also + * emit a file-scope E_3B7AC decl for D_801C99C0 (conflicting types). + * + * 66/66 instructions byte-identical (match_one --o0). + */ +void func_8013B598(s32 a0, u16 *a1) { + typedef struct { u16 f0; u16 f2; u16 f4; } Src_8013B598; + typedef struct { s32 f0; u16 f4; u16 f6; u16 f8; u16 fA; s32 fC; u8 pad[0xC]; } Spr_8013B598; + extern Spr_8013B598 D_801C99C0[]; -INCLUDE_ASM("asm/ov_SC02_037/nonmatchings/ov_SC02_037_o0c", func_8013B83C); + D_801C99C0[a0].f0 = 1; + D_801C99C0[a0].f4 = ((Src_8013B598 *)a1)->f0; + D_801C99C0[a0].f6 = ((Src_8013B598 *)a1)->f2; + D_801C99C0[a0].f8 = ((Src_8013B598 *)a1)->f4; + D_801C99C0[a0].fC = 0x100; +} + + + /* size 0x14 */ + + +void func_8013B6A0(s32 idx, u16 *src, s32 val) +{ + typedef struct { + s32 f0; + u16 f4; + u16 f6; + u16 f8; + u16 fA; + s32 fC; + u8 pad[0xC]; + } Ent_8013B6A0; + typedef struct { + u16 f0; + u16 f2; + u16 f4; + } Src_8013B6A0; + extern Ent_8013B6A0 D_801C99C0[]; + + D_801C99C0[idx].f0 = 1; + D_801C99C0[idx].f4 = ((Src_8013B6A0 *)src)->f0; + D_801C99C0[idx].f6 = ((Src_8013B6A0 *)src)->f2; + D_801C99C0[idx].f8 = ((Src_8013B6A0 *)src)->f4; + D_801C99C0[idx].fC = val; +} + + + /* size 0x14 */ + /* sizeof 0x1C stride */ +extern E_3B7AC D_801C99C0[]; +void func_8013B7AC(int a0) { D_801C99C0[a0].f0 = 0; } + + +extern s32 D_801C9ADC; + + +void func_8013B7F4(s32 a0, s32 a1) { + func_8013B83C(a0, a1, D_801C9ADC); +} + + +extern s32 D_801C9A78; +extern s32 D_801C9ADC; + /* size 0x14 */ + +void func_8013B83C(s32 a0, s32 a1, s32 a2) { + typedef struct { + s32 f0; + u16 f4; + u16 f6; + u16 f8; + u16 fA; + s32 fC; + u8 pad[8]; + s32 f18; + } Ent_8013B83C; /* sizeof 0x1C */ + extern Ent_8013B83C D_801DAA08_e[] __asm__("D_801C99C0"); + extern s32 D_801C9A5C; + extern s32 D_801C9A60; + extern s32 D_801C9A64; + extern s32 D_801C9A88; + extern s32 D_801C9AD8; + extern s32 D_801C9AE0; + extern s16 D_800B9A0E; + extern void func_80052D90(s32 a0, void *a1); + extern void func_8013C08C(void*, void*); + s32 i; + + D_801C9A78 = 0; + D_801C9A64 = 0; + D_801C9A60 = 0; + D_801C9A5C = 0; + func_80052D90(0, &D_801C9A88); + if (a0 == 0) { + return; + } + D_801C9AD8 = a2 + 500; + D_801C9ADC = a2; + for (i = 0; i < 4; i++) { + D_801DAA08_e[i].f0 = 0; + D_801DAA08_e[i].f4 = D_801DAA08_e[i].f6 = D_801DAA08_e[i].f8 = 0x6000; + D_801DAA08_e[i].fC = 0x100; + D_801DAA08_e[i].f18 = 0; + } + switch (*(u8 *)a0) { + case 0x42: + if (D_800B9A0E == 0) { + func_8013BD74(&D_801C9A78, a0); + } else { + func_8013BD74(&D_801C9A78, a1); + } + D_801C9AE0 = 0; + break; + case 0x43: + ((void (*)(void *, s32))func_8013C08C)(&D_801C9A78, a0); + D_801C9AE0 = 1; + break; + case 0x44: + ((void (*)(void *, s32))func_8013C08C)(&D_801C9A78, a0); + D_801C9AE0 = 2; + break; + case 0x45: + ((void (*)(void *, s32))func_8013C08C)(&D_801C9A78, a0); + D_801C9AE0 = 3; + break; + case 0x46: + ((void (*)(void *, s32))func_8013C08C)(&D_801C9A78, a0); + D_801C9AE0 = 4; + break; + case 0x47: + ((void (*)(void *, s32))func_8013C08C)(&D_801C9A78, a0); + D_801C9AE0 = 5; + break; + case 0x48: + ((void (*)(void *, s32))func_8013C08C)(&D_801C9A78, a0); + D_801C9AE0 = 6; + break; + case 0x49: + ((void (*)(void *, s32))func_8013C08C)(&D_801C9A78, a0); + D_801C9AE0 = 9; + break; + case 0x4A: + ((void (*)(void *, s32))func_8013C08C)(&D_801C9A78, a0); + D_801C9AE0 = 0xC; + break; + case 0x4B: + ((void (*)(void *, s32))func_8013C08C)(&D_801C9A78, a0); + D_801C9AE0 = 0xD; + break; + case 0x4C: + ((void (*)(void *, s32))func_8013C08C)(&D_801C9A78, a0); + D_801C9AE0 = 0xE; + break; + case 0x4D: + ((void (*)(void *, s32))func_8013C08C)(&D_801C9A78, a0); + D_801C9AE0 = 0xF; + break; + case 0x4E: + ((void (*)(void *, s32))func_8013C08C)(&D_801C9A78, a0); + D_801C9AE0 = 0x10; + break; + } +} + + + + + + +extern void (*D_80183BC4[])(void *); + +void func_8013BC7C(void *arg0) { + D_80183BC4[((S_8013BC7C *)arg0)->f68](arg0); +} -INCLUDE_ASM("asm/ov_SC02_037/nonmatchings/ov_SC02_037_o0c", func_8013BC7C); extern s32 D_80184360; @@ -780,11 +969,115 @@ extern s32 D_80184360; } -INCLUDE_ASM("asm/ov_SC02_037/nonmatchings/ov_SC02_037_o0c", func_8013BD34); +extern s32 D_801C9A78; -INCLUDE_ASM("asm/ov_SC02_037/nonmatchings/ov_SC02_037_o0c", func_8013BD74); +void func_8013BD34(s32 a0) { + func_8013BD74(&D_801C9A78, a0); +} + + + +extern s16 D_801C9980; +extern s16 D_801C9982; +extern s16 D_801C9984; +extern s16 D_801C9986; + +void func_8013BD74(void *a0, s32 a1) { + /* §100 draft-LOCAL types: file-scope typedefs are NOT carried by extract_unit/remap_hseq, so a + file-scope E_13BD74 banks the exemplar and then fails every sibling with `E_13BD74' + undeclared (the §94 type-carry class, measured on ov_SC01_000). Block scope travels with the + body and is byte-neutral (a type emits no code). */ + typedef struct { + u8 pad0[8]; + void *f8; + void *fC; + } E_13BD74; + typedef struct { + u8 pad0[3]; + u8 code; + s32 f4; + s32 f8; + } P_13BD74; + s32 *q; + s32 *p; + s32 i; + s32 unused0; + s32 unused1; + P_13BD74 *e; + P_13BD74 *end; + s32 unused2; + s32 base; + s32 unused3; + + D_801C9980 = -0xA0; + D_801C9982 = -0x78; + D_801C9984 = 0x140; + D_801C9986 = 0xF0; + ((E_13BD74 *)a0)->f8 = (void *)a1; + ((E_13BD74 *)a0)->fC = (void *)(a1 + 8); + base = a1 + 0x4008; + if (((u8 *)a1)[4] == 0) { + p = (s32 *)((E_13BD74 *)a0)->fC; + for (i = 0; i < 0x1000; i++) { + if (*p != 0) { + *p += (s32)((E_13BD74 *)a0)->fC; + q = (s32 *)*p; + q[0] += (s32)q; + q[5] += (s32)q; + e = (P_13BD74 *)q[5]; + q[6] = q[6] * 12 + q[5]; + end = (P_13BD74 *)q[6]; + while (e < end) { + switch (e->code) { + case 0x24: + case 0x2C: + case 0x34: + case 0x3C: + *(s32 *)e = (*(s32 *)e & 0xFFFFFF) + base; + break; + case 0x26: + case 0x2E: + case 0x36: + case 0x3E: + *(s32 *)e = (*(s32 *)e & 0xFFFFFF) + base; + break; + } + e++; + } + } + p++; + } + ((u8 *)a1)[4] = 1; + } +} + + + + +extern void func_8013C0F8(s32 a0); + +void func_8013C08C(void *a0, void *a1) { + /* SS100 DRAFT-LOCAL type: only this function uses E_13C08C, so it lives in the BODY, not at + * file scope. At file scope extract_unit's preceding-decl backscan cannot carry it: the scan + * walks back over extern/comment/blank/typedef lines, and a MULTI-LINE typedef presents its + * CLOSING line first, which matches none of those prefixes. Every templated sibling therefore + * got the body without the type and the family swept 0/137 (SS94: a family 0/N is a type-carry + * failure until proven otherwise). Declared here, it is part of the unit by construction. + * NB no brace characters in this comment on purpose - extract_unit's forward brace-scan does + * not strip comments, so a brace in a comment truncates the extracted unit. */ + typedef struct { + u8 pad0[8]; + void *f8; + void *fC; + } E_13C08C; + + void *p = a1; + + ((E_13C08C *)a0)->f8 = a1; + ((E_13C08C *)a0)->fC = (u8 *)p + 0x14; + func_8013C0F8((s32)a1); +} -INCLUDE_ASM("asm/ov_SC02_037/nonmatchings/ov_SC02_037_o0c", func_8013C08C); @@ -922,6 +1215,17 @@ s32 param_2; } -INCLUDE_ASM("asm/ov_SC02_037/nonmatchings/ov_SC02_037_o0c", func_8013C938); +extern s32 D_801C9A78; + + +void func_8013C938(void) { + D_801C9A78 = 1; +} + + +extern s32 D_801C9A78; + +void func_8013C964(void) { + D_801C9A78 = 0; +} -INCLUDE_ASM("asm/ov_SC02_037/nonmatchings/ov_SC02_037_o0c", func_8013C964); diff --git a/src/ov_SC03_107/ov_SC03_107.c b/src/ov_SC03_107/ov_SC03_107.c index 5323769b6..4ecb372bf 100644 --- a/src/ov_SC03_107/ov_SC03_107.c +++ b/src/ov_SC03_107/ov_SC03_107.c @@ -214,7 +214,7 @@ extern void func_800190AC(void); extern void func_8012956C(void); extern s32 func_8016E95C(); extern void func_801754A8(void); -extern void func_8013BC7C(void); +extern void func_8013BC7C(); extern void func_8013BCDC(void); extern void func_801379FC(void); extern void func_8001212C(void); diff --git a/src/ov_SC03_107/ov_SC03_107_jr_80131340.c b/src/ov_SC03_107/ov_SC03_107_jr_80131340.c index 36e4889fa..15e460d94 100644 --- a/src/ov_SC03_107/ov_SC03_107_jr_80131340.c +++ b/src/ov_SC03_107/ov_SC03_107_jr_80131340.c @@ -94,7 +94,7 @@ extern void func_800190AC(void); extern void func_8012956C(void); extern s32 func_8016E95C(); extern void func_801754A8(void); -extern void func_8013BC7C(void); +extern void func_8013BC7C(); extern void func_8013BCDC(void); extern void func_801379FC(void); extern void func_8001212C(void); diff --git a/src/ov_SC03_107/ov_SC03_107_jr_80135A4C.c b/src/ov_SC03_107/ov_SC03_107_jr_80135A4C.c index 105db22ca..f864e9771 100644 --- a/src/ov_SC03_107/ov_SC03_107_jr_80135A4C.c +++ b/src/ov_SC03_107/ov_SC03_107_jr_80135A4C.c @@ -94,7 +94,7 @@ extern void func_800190AC(void); extern void func_8012956C(void); extern s32 func_8016E95C(); extern void func_801754A8(void); -extern void func_8013BC7C(void); +extern void func_8013BC7C(); extern void func_8013BCDC(void); extern void func_801379FC(void); extern void func_8001212C(void); diff --git a/src/ov_SC03_107/ov_SC03_107_jr_80135EB0.c b/src/ov_SC03_107/ov_SC03_107_jr_80135EB0.c index dffe52c87..f69285da9 100644 --- a/src/ov_SC03_107/ov_SC03_107_jr_80135EB0.c +++ b/src/ov_SC03_107/ov_SC03_107_jr_80135EB0.c @@ -94,7 +94,7 @@ extern void func_800190AC(void); extern void func_8012956C(void); extern s32 func_8016E95C(); extern void func_801754A8(void); -extern void func_8013BC7C(void); +extern void func_8013BC7C(); extern void func_8013BCDC(void); extern void func_801379FC(void); extern void func_8001212C(void); diff --git a/src/ov_SC03_107/ov_SC03_107_jr_801380E0.c b/src/ov_SC03_107/ov_SC03_107_jr_801380E0.c index 0a8963681..b51f72edf 100644 --- a/src/ov_SC03_107/ov_SC03_107_jr_801380E0.c +++ b/src/ov_SC03_107/ov_SC03_107_jr_801380E0.c @@ -94,7 +94,7 @@ extern void func_800190AC(void); extern void func_8012956C(void); extern s32 func_8016E95C(); extern void func_801754A8(void); -extern void func_8013BC7C(void); +extern void func_8013BC7C(); extern void func_8013BCDC(void); extern void func_801379FC(void); extern void func_8001212C(void); diff --git a/src/ov_SC03_107/ov_SC03_107_jr_8013C98C.c b/src/ov_SC03_107/ov_SC03_107_jr_8013C98C.c index 11f99b44f..de8fd89e3 100644 --- a/src/ov_SC03_107/ov_SC03_107_jr_8013C98C.c +++ b/src/ov_SC03_107/ov_SC03_107_jr_8013C98C.c @@ -94,7 +94,7 @@ extern void func_800190AC(void); extern void func_8012956C(void); extern s32 func_8016E95C(); extern void func_801754A8(void); -extern void func_8013BC7C(void); +extern void func_8013BC7C(); extern void func_8013BCDC(void); extern void func_801379FC(void); extern void func_8001212C(void); diff --git a/src/ov_SC03_107/ov_SC03_107_jr_8013F350.c b/src/ov_SC03_107/ov_SC03_107_jr_8013F350.c index e5305db61..0d8bc174f 100644 --- a/src/ov_SC03_107/ov_SC03_107_jr_8013F350.c +++ b/src/ov_SC03_107/ov_SC03_107_jr_8013F350.c @@ -94,7 +94,7 @@ extern void func_800190AC(void); extern void func_8012956C(void); extern s32 func_8016E95C(); extern void func_801754A8(void); -extern void func_8013BC7C(void); +extern void func_8013BC7C(); extern void func_8013BCDC(void); extern void func_801379FC(void); extern void func_8001212C(void); diff --git a/src/ov_SC03_107/ov_SC03_107_jr_801549F8.c b/src/ov_SC03_107/ov_SC03_107_jr_801549F8.c index 6ffe9476f..cee03b081 100644 --- a/src/ov_SC03_107/ov_SC03_107_jr_801549F8.c +++ b/src/ov_SC03_107/ov_SC03_107_jr_801549F8.c @@ -94,7 +94,7 @@ extern void func_800190AC(void); extern void func_8012956C(void); extern s32 func_8016E95C(); extern void func_801754A8(void); -extern void func_8013BC7C(void); +extern void func_8013BC7C(); extern void func_8013BCDC(void); extern void func_801379FC(void); extern void func_8001212C(void); diff --git a/src/ov_SC03_107/ov_SC03_107_jr_801555F4.c b/src/ov_SC03_107/ov_SC03_107_jr_801555F4.c index b989399b3..d84226cd4 100644 --- a/src/ov_SC03_107/ov_SC03_107_jr_801555F4.c +++ b/src/ov_SC03_107/ov_SC03_107_jr_801555F4.c @@ -94,7 +94,7 @@ extern void func_800190AC(void); extern void func_8012956C(void); extern s32 func_8016E95C(); extern void func_801754A8(void); -extern void func_8013BC7C(void); +extern void func_8013BC7C(); extern void func_8013BCDC(void); extern void func_801379FC(void); extern void func_8001212C(void); diff --git a/src/ov_SC03_107/ov_SC03_107_jr_801594E8.c b/src/ov_SC03_107/ov_SC03_107_jr_801594E8.c index 4c10fd579..3d75d922c 100644 --- a/src/ov_SC03_107/ov_SC03_107_jr_801594E8.c +++ b/src/ov_SC03_107/ov_SC03_107_jr_801594E8.c @@ -94,7 +94,7 @@ extern void func_800190AC(void); extern void func_8012956C(void); extern s32 func_8016E95C(); extern void func_801754A8(void); -extern void func_8013BC7C(void); +extern void func_8013BC7C(); extern void func_8013BCDC(void); extern void func_801379FC(void); extern void func_8001212C(void); diff --git a/src/ov_SC03_107/ov_SC03_107_jr_80159C84.c b/src/ov_SC03_107/ov_SC03_107_jr_80159C84.c index ca3e3261f..5ab720d3d 100644 --- a/src/ov_SC03_107/ov_SC03_107_jr_80159C84.c +++ b/src/ov_SC03_107/ov_SC03_107_jr_80159C84.c @@ -94,7 +94,7 @@ extern void func_800190AC(void); extern void func_8012956C(void); extern s32 func_8016E95C(); extern void func_801754A8(void); -extern void func_8013BC7C(void); +extern void func_8013BC7C(); extern void func_8013BCDC(void); extern void func_801379FC(void); extern void func_8001212C(void); diff --git a/src/ov_SC03_107/ov_SC03_107_jr_8015A3C8.c b/src/ov_SC03_107/ov_SC03_107_jr_8015A3C8.c index 9fefd35ae..37816c7d4 100644 --- a/src/ov_SC03_107/ov_SC03_107_jr_8015A3C8.c +++ b/src/ov_SC03_107/ov_SC03_107_jr_8015A3C8.c @@ -94,7 +94,7 @@ extern void func_800190AC(void); extern void func_8012956C(void); extern s32 func_8016E95C(); extern void func_801754A8(void); -extern void func_8013BC7C(void); +extern void func_8013BC7C(); extern void func_8013BCDC(void); extern void func_801379FC(void); extern void func_8001212C(void); diff --git a/src/ov_SC03_107/ov_SC03_107_jr_8016AE5C.c b/src/ov_SC03_107/ov_SC03_107_jr_8016AE5C.c index 7f5a7806f..e4f67babe 100644 --- a/src/ov_SC03_107/ov_SC03_107_jr_8016AE5C.c +++ b/src/ov_SC03_107/ov_SC03_107_jr_8016AE5C.c @@ -113,7 +113,7 @@ extern void func_800190AC(void); extern void func_8012956C(void); extern s32 func_8016E95C(); extern void func_801754A8(void); -extern void func_8013BC7C(void); +extern void func_8013BC7C(); extern void func_8013BCDC(void); extern void func_801379FC(void); extern void func_8001212C(void); diff --git a/src/ov_SC03_107/ov_SC03_107_jr_80171B4C.c b/src/ov_SC03_107/ov_SC03_107_jr_80171B4C.c index 4475ce3c0..89416e280 100644 --- a/src/ov_SC03_107/ov_SC03_107_jr_80171B4C.c +++ b/src/ov_SC03_107/ov_SC03_107_jr_80171B4C.c @@ -156,7 +156,7 @@ extern void func_800190AC(void); extern void func_8012956C(void); extern s32 func_8016E95C(); extern void func_801754A8(void); -extern void func_8013BC7C(void); +extern void func_8013BC7C(); extern void func_8013BCDC(void); extern void func_801379FC(void); extern void func_8001212C(void); diff --git a/src/ov_SC03_107/ov_SC03_107_jr_801789AC.c b/src/ov_SC03_107/ov_SC03_107_jr_801789AC.c index 4a8650690..0914078ec 100644 --- a/src/ov_SC03_107/ov_SC03_107_jr_801789AC.c +++ b/src/ov_SC03_107/ov_SC03_107_jr_801789AC.c @@ -192,7 +192,7 @@ extern void func_800190AC(void); extern void func_8012956C(void); extern s32 func_8016E95C(); extern void func_801754A8(void); -extern void func_8013BC7C(void); +extern void func_8013BC7C(); extern void func_8013BCDC(void); extern void func_801379FC(void); extern void func_8001212C(void); diff --git a/src/ov_SC03_107/ov_SC03_107_o0c.c b/src/ov_SC03_107/ov_SC03_107_o0c.c index 65b868787..51078fa53 100644 --- a/src/ov_SC03_107/ov_SC03_107_o0c.c +++ b/src/ov_SC03_107/ov_SC03_107_o0c.c @@ -94,7 +94,7 @@ extern void func_800190AC(void); extern void func_8012956C(void); extern s32 func_8016E95C(); extern void func_801754A8(void); -extern void func_8013BC7C(void); +extern void func_8013BC7C(); extern void func_8013BCDC(void); extern void func_801379FC(void); extern void func_8001212C(void); @@ -758,34 +758,484 @@ extern void func_8013AF20(u32 *param_1, u16 *param_2, u16 *param_3, u8 *param_4) /* ==== end §8b carried decl layer ==== */ -INCLUDE_ASM("asm/ov_SC03_107/nonmatchings/ov_SC03_107_o0c", func_8013B568); +extern s32 D_80182BFC; -INCLUDE_ASM("asm/ov_SC03_107/nonmatchings/ov_SC03_107_o0c", func_8013B598); +void func_8013B568(s32 arg0) { + D_80182BFC = arg0; +} -INCLUDE_ASM("asm/ov_SC03_107/nonmatchings/ov_SC03_107_o0c", func_8013B6A0); -INCLUDE_ASM("asm/ov_SC03_107/nonmatchings/ov_SC03_107_o0c", func_8013B7AC); + /* size 0x14 */ -INCLUDE_ASM("asm/ov_SC03_107/nonmatchings/ov_SC03_107_o0c", func_8013B7F4); +/* func_8013B598 (ov_SC01_077_o0, -O0): fills entry a0 of the 0x1C-stride table at + * D_8019BC18 from a 3-halfword source record. + * + * -O0 CONSTANT-OFFSET FOLD (the quirk that stalled this -O0 cluster in Phase 19): + * at -O0 gcc-2.7.2 folds a constant offset into the memory operand ONLY through a + * COMPONENT_REF / a real ARRAY_REF on an array-typed DECL: + * D_8019BC18[a0].f4 = ... -> lui $at,%hi(sym); addu $at,$at,idx; sh %lo(sym+4)($at) + * A CAST base defeats it (NOP_EXPR over the ADDR_EXPR), and so does pointer indexing: + * ((S *)D_8019BC18)[a0].f4 -> lui;addiu;addu;sh 4(reg) (+2 ins per store) + * a1[1] -> addiu $v1,$a0,2; lhu 0($v1) (+1 ins per load) + * So the table extern must carry the FULL struct type (not the pad-only canonical + * E_3B7AC), and the source record must be read as ->field, not as a[i]. Casting the + * incoming POINTER is harmless (a NOP on a register), only the base decl's type matters. + * + * Both types are body-scoped (cookbook §100) and the extern is declared inside the body, + * matching the established -O0 sibling pattern in src/ov_SC07_010/ov_SC07_010_o0.c + * (func_8013B7AC: `extern E_3B7AC D_801A9420[];` in-body). NOTE FOR BANKING: the canonical + * sig-layer decl `extern E_3B7AC D_8019BC18[];` (f0 + pad only) CANNOT be used here — it has + * no f4/f6/f8/fC members. The in-body decl below must be the one that survives; do not also + * emit a file-scope E_3B7AC decl for D_8019BC18 (conflicting types). + * + * 66/66 instructions byte-identical (match_one --o0). + */ +void func_8013B598(s32 a0, u16 *a1) { + typedef struct { u16 f0; u16 f2; u16 f4; } Src_8013B598; + typedef struct { s32 f0; u16 f4; u16 f6; u16 f8; u16 fA; s32 fC; u8 pad[0xC]; } Spr_8013B598; + extern Spr_8013B598 D_8019BC18[]; -INCLUDE_ASM("asm/ov_SC03_107/nonmatchings/ov_SC03_107_o0c", func_8013B83C); + D_8019BC18[a0].f0 = 1; + D_8019BC18[a0].f4 = ((Src_8013B598 *)a1)->f0; + D_8019BC18[a0].f6 = ((Src_8013B598 *)a1)->f2; + D_8019BC18[a0].f8 = ((Src_8013B598 *)a1)->f4; + D_8019BC18[a0].fC = 0x100; +} -INCLUDE_ASM("asm/ov_SC03_107/nonmatchings/ov_SC03_107_o0c", func_8013BC7C); -INCLUDE_ASM("asm/ov_SC03_107/nonmatchings/ov_SC03_107_o0c", func_8013BCDC); + /* size 0x14 */ -INCLUDE_ASM("asm/ov_SC03_107/nonmatchings/ov_SC03_107_o0c", func_8013BD34); -INCLUDE_ASM("asm/ov_SC03_107/nonmatchings/ov_SC03_107_o0c", func_8013BD74); +void func_8013B6A0(s32 idx, u16 *src, s32 val) +{ + typedef struct { + s32 f0; + u16 f4; + u16 f6; + u16 f8; + u16 fA; + s32 fC; + u8 pad[0xC]; + } Ent_8013B6A0; + typedef struct { + u16 f0; + u16 f2; + u16 f4; + } Src_8013B6A0; + extern Ent_8013B6A0 D_8019BC18[]; -INCLUDE_ASM("asm/ov_SC03_107/nonmatchings/ov_SC03_107_o0c", func_8013C08C); + D_8019BC18[idx].f0 = 1; + D_8019BC18[idx].f4 = ((Src_8013B6A0 *)src)->f0; + D_8019BC18[idx].f6 = ((Src_8013B6A0 *)src)->f2; + D_8019BC18[idx].f8 = ((Src_8013B6A0 *)src)->f4; + D_8019BC18[idx].fC = val; +} -INCLUDE_ASM("asm/ov_SC03_107/nonmatchings/ov_SC03_107_o0c", func_8013C0F8); -INCLUDE_ASM("asm/ov_SC03_107/nonmatchings/ov_SC03_107_o0c", func_8013C360); + /* size 0x14 */ + /* sizeof 0x1C stride */ +extern E_3B7AC D_8019BC18[]; +void func_8013B7AC(int a0) { D_8019BC18[a0].f0 = 0; } -INCLUDE_ASM("asm/ov_SC03_107/nonmatchings/ov_SC03_107_o0c", func_8013C414); -INCLUDE_ASM("asm/ov_SC03_107/nonmatchings/ov_SC03_107_o0c", func_8013C938); +extern s32 D_8019BD34; + + +void func_8013B7F4(s32 a0, s32 a1) { + func_8013B83C(a0, a1, D_8019BD34); +} + + +extern s32 D_8019BCD0; +extern s32 D_8019BD34; + /* size 0x14 */ + +void func_8013B83C(s32 a0, s32 a1, s32 a2) { + typedef struct { + s32 f0; + u16 f4; + u16 f6; + u16 f8; + u16 fA; + s32 fC; + u8 pad[8]; + s32 f18; + } Ent_8013B83C; /* sizeof 0x1C */ + extern Ent_8013B83C D_801DAA08_e[] __asm__("D_8019BC18"); + extern s32 D_8019BCB4; + extern s32 D_8019BCB8; + extern s32 D_8019BCBC; + extern s32 D_8019BCE0; + extern s32 D_8019BD30; + extern s32 D_8019BD38; + extern s16 D_800B9A0E; + extern void func_80052D90(s32 a0, void *a1); + extern void func_8013C08C(void*, void*); + s32 i; + + D_8019BCD0 = 0; + D_8019BCBC = 0; + D_8019BCB8 = 0; + D_8019BCB4 = 0; + func_80052D90(0, &D_8019BCE0); + if (a0 == 0) { + return; + } + D_8019BD30 = a2 + 500; + D_8019BD34 = a2; + for (i = 0; i < 4; i++) { + D_801DAA08_e[i].f0 = 0; + D_801DAA08_e[i].f4 = D_801DAA08_e[i].f6 = D_801DAA08_e[i].f8 = 0x6000; + D_801DAA08_e[i].fC = 0x100; + D_801DAA08_e[i].f18 = 0; + } + switch (*(u8 *)a0) { + case 0x42: + if (D_800B9A0E == 0) { + func_8013BD74(&D_8019BCD0, a0); + } else { + func_8013BD74(&D_8019BCD0, a1); + } + D_8019BD38 = 0; + break; + case 0x43: + ((void (*)(void *, s32))func_8013C08C)(&D_8019BCD0, a0); + D_8019BD38 = 1; + break; + case 0x44: + ((void (*)(void *, s32))func_8013C08C)(&D_8019BCD0, a0); + D_8019BD38 = 2; + break; + case 0x45: + ((void (*)(void *, s32))func_8013C08C)(&D_8019BCD0, a0); + D_8019BD38 = 3; + break; + case 0x46: + ((void (*)(void *, s32))func_8013C08C)(&D_8019BCD0, a0); + D_8019BD38 = 4; + break; + case 0x47: + ((void (*)(void *, s32))func_8013C08C)(&D_8019BCD0, a0); + D_8019BD38 = 5; + break; + case 0x48: + ((void (*)(void *, s32))func_8013C08C)(&D_8019BCD0, a0); + D_8019BD38 = 6; + break; + case 0x49: + ((void (*)(void *, s32))func_8013C08C)(&D_8019BCD0, a0); + D_8019BD38 = 9; + break; + case 0x4A: + ((void (*)(void *, s32))func_8013C08C)(&D_8019BCD0, a0); + D_8019BD38 = 0xC; + break; + case 0x4B: + ((void (*)(void *, s32))func_8013C08C)(&D_8019BCD0, a0); + D_8019BD38 = 0xD; + break; + case 0x4C: + ((void (*)(void *, s32))func_8013C08C)(&D_8019BCD0, a0); + D_8019BD38 = 0xE; + break; + case 0x4D: + ((void (*)(void *, s32))func_8013C08C)(&D_8019BCD0, a0); + D_8019BD38 = 0xF; + break; + case 0x4E: + ((void (*)(void *, s32))func_8013C08C)(&D_8019BCD0, a0); + D_8019BD38 = 0x10; + break; + } +} + + + + + + +extern void (*D_80182460[])(void *); + +void func_8013BC7C(void *arg0) { + D_80182460[((S_8013BC7C *)arg0)->f68](arg0); +} + + +extern s32 D_80182BFC; + /* size 0x14 */ + +/* func_8013BCDC (ov_SC01_077_o0, -O0): guarded indirect call through D_80182BFC. + * D_80182BFC is declared `extern s32` in the TU (canonical-sig layer) and holds a + * function pointer; read it as an s32, test non-null, cast to fn-ptr and call. + * Frame residual: target frame is 0x30 (saves $ra/$fp/$s0 at 0x28/0x24/0x20) — 16 + * bytes of var_size above the minimal 0x20. At -O0 (no DCE) an unused 16-byte local + * reserves exactly that var region (cookbook §42 lever 3, frame-pad induction) with + * zero body instructions. 22/22 byte-identical via rtu_match. */ +void func_8013BCDC(void) { + s32 pad[4]; + if (D_80182BFC != 0) { + ((void (*)(void))D_80182BFC)(); + } +} + + +extern s32 D_8019BCD0; + +void func_8013BD34(s32 a0) { + func_8013BD74(&D_8019BCD0, a0); +} + + + +extern s16 D_8019BBD8; +extern s16 D_8019BBDA; +extern s16 D_8019BBDC; +extern s16 D_8019BBDE; + +void func_8013BD74(void *a0, s32 a1) { + /* §100 draft-LOCAL types: file-scope typedefs are NOT carried by extract_unit/remap_hseq, so a + file-scope E_13BD74 banks the exemplar and then fails every sibling with `E_13BD74' + undeclared (the §94 type-carry class, measured on ov_SC01_000). Block scope travels with the + body and is byte-neutral (a type emits no code). */ + typedef struct { + u8 pad0[8]; + void *f8; + void *fC; + } E_13BD74; + typedef struct { + u8 pad0[3]; + u8 code; + s32 f4; + s32 f8; + } P_13BD74; + s32 *q; + s32 *p; + s32 i; + s32 unused0; + s32 unused1; + P_13BD74 *e; + P_13BD74 *end; + s32 unused2; + s32 base; + s32 unused3; + + D_8019BBD8 = -0xA0; + D_8019BBDA = -0x78; + D_8019BBDC = 0x140; + D_8019BBDE = 0xF0; + ((E_13BD74 *)a0)->f8 = (void *)a1; + ((E_13BD74 *)a0)->fC = (void *)(a1 + 8); + base = a1 + 0x4008; + if (((u8 *)a1)[4] == 0) { + p = (s32 *)((E_13BD74 *)a0)->fC; + for (i = 0; i < 0x1000; i++) { + if (*p != 0) { + *p += (s32)((E_13BD74 *)a0)->fC; + q = (s32 *)*p; + q[0] += (s32)q; + q[5] += (s32)q; + e = (P_13BD74 *)q[5]; + q[6] = q[6] * 12 + q[5]; + end = (P_13BD74 *)q[6]; + while (e < end) { + switch (e->code) { + case 0x24: + case 0x2C: + case 0x34: + case 0x3C: + *(s32 *)e = (*(s32 *)e & 0xFFFFFF) + base; + break; + case 0x26: + case 0x2E: + case 0x36: + case 0x3E: + *(s32 *)e = (*(s32 *)e & 0xFFFFFF) + base; + break; + } + e++; + } + } + p++; + } + ((u8 *)a1)[4] = 1; + } +} + + + + +extern void func_8013C0F8(s32 a0); + +void func_8013C08C(void *a0, void *a1) { + /* SS100 DRAFT-LOCAL type: only this function uses E_13C08C, so it lives in the BODY, not at + * file scope. At file scope extract_unit's preceding-decl backscan cannot carry it: the scan + * walks back over extern/comment/blank/typedef lines, and a MULTI-LINE typedef presents its + * CLOSING line first, which matches none of those prefixes. Every templated sibling therefore + * got the body without the type and the family swept 0/137 (SS94: a family 0/N is a type-carry + * failure until proven otherwise). Declared here, it is part of the unit by construction. + * NB no brace characters in this comment on purpose - extract_unit's forward brace-scan does + * not strip comments, so a brace in a comment truncates the extracted unit. */ + typedef struct { + u8 pad0[8]; + void *f8; + void *fC; + } E_13C08C; + + void *p = a1; + + ((E_13C08C *)a0)->f8 = a1; + ((E_13C08C *)a0)->fC = (u8 *)p + 0x14; + func_8013C0F8((s32)a1); +} + + + + + /* size 0x14 */ + + /* size 0xc */ + +void func_8013C0F8(int param_1) { + int iVar1; + int iVar2; + unsigned int local_18; + unsigned int local_14; + Bar *local_10; + Foo *local_c; + + iVar1 = param_1 + 0x14; + if (*(char *)(param_1 + 4) == '\0') { + iVar2 = iVar1 + *(int *)(param_1 + 0xc); + *(int *)(param_1 + 0xc) = iVar2; + *(int *)(param_1 + 0x10) = *(int *)(param_1 + 0x10) + iVar1; + local_c = (Foo *)iVar1; + for (local_18 = 0; local_18 < *(unsigned int *)(param_1 + 8); local_18++, local_c++) { + local_c->field10 = local_c->field10 + iVar1; + local_10 = (Bar *)local_c->field10; + for (local_14 = 0; local_14 < local_c->count; local_14++, local_10++) { + switch (local_10->tag) { + case 0x24: + case 0x2c: + case 0x34: + case 0x3c: + *(unsigned int *)local_10 = (*(unsigned int *)local_10 & 0xffffff) + iVar2; + break; + case 0x26: + case 0x2e: + case 0x36: + case 0x3e: + *(unsigned int *)local_10 = (*(unsigned int *)local_10 & 0xffffff) + iVar2; + break; + } + } + } + *(unsigned char *)(param_1 + 4) = 1; + } +} + + + + +void func_8013C360(s32 a0) { + s32 *p; + u32 i; + p = (s32 *)(a0 + 0x10); + for (i = 0; i < *(u32 *)(a0 + 8); i++) { + *(s32 *)(*(s32 *)p) = *(s32 *)((s32)p + 4); + p = (s32 *)((s32)p + 0xC); + } +} + + + + /* 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; + } + } +} + + +extern s32 D_8019BCD0; + + +void func_8013C938(void) { + D_8019BCD0 = 1; +} + + +extern s32 D_8019BCD0; + +void func_8013C964(void) { + D_8019BCD0 = 0; +} -INCLUDE_ASM("asm/ov_SC03_107/nonmatchings/ov_SC03_107_o0c", func_8013C964);