feat(decomp): -O0 U3 — 48 banked across the x3 carve group, zero model tokens

The 16-fn -O0 cluster (0x8013B568..0x8013C964), remapped from the ov_SC01_077 exemplars
(16/16 matched there) into all three freshly carved -O0 objects:

  ov_SC02_037  16/16      ov_MAIN_012  16/16      ov_SC03_107  16/16

All three BYTE-IDENTICAL against config/check.<ov>.sha after the batch, and corpus.stubs
reports zero of the 16 addresses still open in any of them. 48 functions for zero model
tokens — the entire cost was a partitioning fix.

R14 NOTE ON THE INSTRUMENT: sweep_parallel summarised "banked=44 notbanked=4" while the
byte gate and corpus.stubs both say 48/48. The bytes win; its counter undercounts (drafts
banked in a later chunk after a bisect appear not to be credited). Worth a look before that
number is ever quoted as a rate.

Three drafts per overlay came with a gather_externs warning — a sibling callee with no
file-scope decl in ov077 (func_8013B83C, func_8013BD74). They banked anyway: C89 implicit
declaration covers a same-TU sibling whose stub sits in the same object. The gate decided,
not the warning.

With U2's 4, this closes the -O0 U2/U3 thread: 52 functions / ~6,730 instructions banked
tonight from the stranded -O0 population without drafting a line.
This commit is contained in:
Drew T
2026-08-25 02:19:38 -06:00
parent c03cd6f3a2
commit ec8ade5692
56 changed files with 1320 additions and 113 deletions
+6 -4
View File
@@ -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
+2 -1
View File
@@ -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)
+10 -11
View File
@@ -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
+2 -1
View File
@@ -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)
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+467 -17
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+317 -13
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+467 -17
View File
@@ -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);